Gérez toutes les tâches difficiles liées à la réglementation européenne en matière de taxes/TVA MOSS, comme il se doit. S'intègre à Laravel et Cashier — ou dans une application PHP autonome . Créé à l'origine par Marcel Pociot.
// Easy to use !
VatCalculator:: calculate ( 24.00 , $ countryCode = ' DE ' );
VatCalculator:: calculate ( 24.00 , $ countryCode , $ postalCode );
VatCalculator:: calculate ( 71.00 , ' DE ' , ' 41352 ' , $ isCompany = true );
VatCalculator:: getTaxRateForLocation ( ' NL ' );
// Check validity of a VAT number
VatCalculator:: isValidVATNumber ( ' NL123456789B01 ' );
Avertissement
Ce package ne fournit aucune promesse de taxes correctement calculées. Vous êtes toujours tenu de vous assurer que toute taxe calculée est correcte pour votre cas d'utilisation. Si vous ne savez pas si un certain impôt est correct ou non, il est préférable d'en parler à un comptable.
Installez le package avec composer :
composer require mpociot/vat-calculator
Vous pouvez également utiliser ce package sans Laravel. Créez simplement une nouvelle instance de VatCalculator et utilisez-la. Tous les exemples de documentation utilisent le code Laravel Facade, alors assurez-vous de ne pas appeler les méthodes comme s'il s'agissait de méthodes statiques.
use Mpociot VatCalculator VatCalculator ;
$ vatCalculator = new VatCalculator ();
$ vatCalculator -> setBusinessCountryCode ( ' DE ' );
$ grossPrice = $ vatCalculator -> calculate ( 49.99 , $ countryCode = ' LU ' );
Veuillez vous référer the upgrade guide
lors de la mise à niveau de la bibliothèque.
Pour calculer le prix brut, utilisez la méthode calculate
avec un prix net et un code pays comme paramètres.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' );
Le troisième paramètre est le code postal du client.
Comme quatrième paramètre, vous pouvez passer un booléen indiquant si le client est une entreprise ou un particulier. Si le client est une entreprise, ce que vous devez vérifier en validant le numéro de TVA, le prix net vous sera restitué.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' , ' 12345 ' , $ isCompany = true );
Après avoir calculé le prix brut, vous pouvez extraire plus d'informations du VatCalculator.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' ); // 28.56
$ taxRate = VatCalculator:: getTaxRate (); // 0.19
$ netPrice = VatCalculator:: getNetPrice (); // 24.00
$ taxValue = VatCalculator:: getTaxValue (); // 4.56
Pour recevoir un tableau avec tous les taux de taxe disponibles pour un pays donné, utilisez la méthode getTaxRatesForCountry
.
VatCalculator:: getTaxRatesForCountry ( ' DE ' ); // [ "high" = > 0.19 , "low" = > 0.07 ]
Avant de valider les numéros de TVA de vos clients, vous pouvez utiliser la méthode shouldCollectVAT
pour vérifier si le code du pays vous oblige à collecter la TVA en premier lieu.
if (VatCalculator:: shouldCollectVAT ( ' DE ' )) {
// This country code requires VAT collection ...
}
Pour valider les numéros de TVA de vos clients, vous pouvez utiliser la méthode isValidVATNumber
. Le numéro de TVA doit être dans un format spécifié par le VIES. Les numéros de TVA indiqués seront tronqués et les caractères/espaces non pertinents seront automatiquement supprimés.
Ce service s'appuie sur une API SOAP tierce fournie par l'UE. Si, pour une raison quelconque, cette API n'est pas disponible, une VATCheckUnavailableException
sera levée.
try {
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Alternativement, il est également possible de valider uniquement le format du numéro de TVA spécifié par VIES. Ceci est utile si vous ne souhaitez pas attendre une réponse de l'API SOAP.
// This check will return false because no connection to VIES could be made ...
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
// This check will return true because only the format is checked ...
$ validVAT = VatCalculator:: isValidVatNumberFormat ( ' NL 123456789 B01 ' );
Pour obtenir les détails d'un numéro de TVA, vous pouvez utiliser la méthode getVATDetails
. Le numéro de TVA doit être dans un format spécifié par le VIES. Les numéros de TVA indiqués seront tronqués et les caractères/espaces non pertinents seront automatiquement supprimés.
Ce service s'appuie sur une API SOAP tierce fournie par l'UE. Si, pour une raison quelconque, cette API n'est pas disponible, une VATCheckUnavailableException
sera levée.
try {
$ vat_details = VatCalculator:: getVATDetails ( ' NL 123456789 B01 ' );
print_r ( $ vat_details );
/ * Outputs
stdClass Object
(
[ countryCode ] = > NL
[ vatNumber ] = > 123456789 B01
[ requestDate ] = > 2017 - 04 - 06 + 02 : 00
[ valid ] = > false
[ name ] = > Name of the company
[ address ] = > Address of the company
)
* /
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Les numéros de TVA britanniques sont formatés un peu différemment :
try {
$ vat_details = VatCalculator:: getVATDetails ( ' GB 553557881 ' );
print_r ( $ vat_details );
/ * Outputs
array ( 3 ) {
[ "name" ] = >
string ( 26 ) "Credite Sberger Donal Inc."
[ "vatNumber" ] = >
string ( 9 ) "553557881"
[ "address" ] = >
array ( 3 ) {
[ "line1" ] = >
string ( 18 ) "131B Barton Hamlet"
[ "postcode" ] = >
string ( 8 ) "SW97 5CK"
[ "countryCode" ] = >
string ( 2 ) "GB"
}
}
* /
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Par défaut, VatCalculator dispose de toutes les règles de TVA de l'UE prédéfinies, de sorte qu'elles puissent être facilement mises à jour si elles changent pour un pays spécifique.
Si vous devez définir d'autres taux de TVA, vous pouvez le faire en publiant la configuration et en ajoutant des règles supplémentaires.
Avertissement
Assurez-vous de définir le code pays de votre entreprise dans le fichier de configuration afin d'obtenir un calcul correct de la TVA lorsque vous vendez à des clients professionnels dans votre propre pays.
Pour publier les fichiers de configuration, exécutez la commande vendor:publish
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
Cela créera un vat_calculator.php
dans votre répertoire de configuration.
Si, pour une raison quelconque, des erreurs SOAP se produisent lorsque l'API VIES est défectueuse, ces erreurs seront traitées correctement et false
sera renvoyé. Cependant, si vous souhaitez explicitement être informé des erreurs SOAP, vous pouvez demander à VatCalculator de les lancer en tant que VATCheckUnavailableException
. La VATCheckUnavailableException
contiendra alors le message spécifique de la faute SOAP.
Définissez l'option sur true
dans votre fichier de configuration :
<?php
return [
' forward_soap_faults ' => true ,
];
Vous pouvez également définir un délai d'attente pour le client SOAP. Par défaut, SOAP abandonne la demande à VIES après 30 secondes. Si vous ne souhaitez pas attendre aussi longtemps, vous pouvez réduire le délai d'attente, par exemple à 10 secondes :
<?php
return [
' soap_timeout ' => 10 ,
];
VatCalculator est également livré avec une règle de validation ValidVatNumber
pour les numéros de TVA. Vous pouvez l'utiliser lors de la validation d'une entrée à partir d'une demande de formulaire ou d'une instance de validateur autonome :
use Mpociot VatCalculator Rules ValidVatNumber ;
$ validator = Validator:: make (Input:: all (), [
' first_name ' => ' required ' ,
' last_name ' => ' required ' ,
' company_vat ' => [ ' required ' , new ValidVatNumber ],
]);
if ( $ validator -> passes ()) {
// Input is correct ...
}
Avertissement
L'extension du validateur renvoie false
lorsque l'API SOAP de vérification du numéro de TVA n'est pas disponible.
Note
Pour le moment, ce package n'est pas compatible avec Cashier Stripe v13 ou supérieur car il repose toujours sur l'ancienne méthode taxPercentage
qui a été supprimée de Cashier v13. En attendant, vous pouvez toujours l'utiliser sur les anciennes versions de Cashier Stripe.
Si vous souhaitez utiliser ce package en combinaison avec Laravel Cashier Stripe, vous pouvez laisser votre modèle facturable utiliser le trait BillableWithinTheEU
. Étant donné que ce trait remplace la méthode taxPercentage
du trait Billable
, nous devons explicitement indiquer à notre modèle de le faire.
use Laravel Cashier Billable ;
use Mpociot VatCalculator Traits BillableWithinTheEU ;
use Laravel Cashier Contracts Billable as BillableContract ;
class User extends Model implements BillableContract
{
use Billable, BillableWithinTheEU {
BillableWithinTheEU::taxPercentage insteadof Billable;
}
protected $ dates = [ ' trial_ends_at ' , ' subscription_ends_at ' ];
}
En utilisant le trait BillableWithinTheEU
, votre modèle facturable dispose de nouvelles méthodes pour définir le taux de taxe pour le modèle facturable.
Définissez tout en une seule commande :
setTaxForCountry($countryCode, $company = false)
Ou utilisez l'approche plus lisible et chaînable :
useTaxFrom($countryCode)
— Utiliser le taux d'imposition du pays donnéasIndividual()
— Le modèle facturable n'est pas une entreprise (par défaut)asBusiness()
— Le modèle facturable est une entreprise valideAinsi, afin de définir le pourcentage de taxe correct avant d'abonner votre client, considérez le flux de travail suivant :
$ user = User:: find ( 1 );
// For individuals use :
$ user -> useTaxFrom ( ' NL ' );
// For business customers with a valid VAT ID , use :
$ user -> useTaxFrom ( ' NL ' )-> asBusiness ();
$ user -> subscription ( ' monthly ' )-> create ( $ creditCardToken );
Consultez le CHANGELOG dans ce référentiel pour toutes les modifications récentes.
VatCalculator est maintenu par Dries Vints. Créé à l'origine par Marcel Pociot.
VatCalculator est un logiciel open source sous licence MIT.