Maneje todas las cosas difíciles relacionadas con las regulaciones de impuestos/IVA de la UE MOSS, como debe ser. Se integra con Laravel y Cashier , o en una aplicación PHP independiente . Creado originalmente por 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 ' );
Advertencia
Este paquete no ofrece ninguna promesa de impuestos calculados correctamente. Aún es responsable de asegurarse de que cualquier impuesto calculado sea correcto para su caso de uso. Si no estás seguro de si un determinado impuesto es correcto o no, lo mejor es que hables con un contador.
Instale el paquete con compositor:
composer require mpociot/vat-calculator
También puedes usar este paquete sin Laravel. Simplemente cree una nueva instancia de VatCalculator y úsela. Todos los ejemplos de documentación utilizan el código de Laravel Facade, así que asegúrese de no llamar a los métodos como si fueran métodos estáticos.
use Mpociot VatCalculator VatCalculator ;
$ vatCalculator = new VatCalculator ();
$ vatCalculator -> setBusinessCountryCode ( ' DE ' );
$ grossPrice = $ vatCalculator -> calculate ( 49.99 , $ countryCode = ' LU ' );
Consulte the upgrade guide
cuando actualice la biblioteca.
Para calcular el precio bruto utilice el método calculate
con un precio neto y un código de país como parámetros.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' );
El tercer parámetro es el código postal del cliente.
Como cuarto parámetro, puedes pasar un booleano que indique si el cliente es una empresa o un particular. Si el cliente es una empresa, lo cual debes comprobar validando el número de IVA, se devuelve el precio neto.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' , ' 12345 ' , $ isCompany = true );
Después de calcular el precio bruto, puede extraer más información de VatCalculator.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' ); // 28.56
$ taxRate = VatCalculator:: getTaxRate (); // 0.19
$ netPrice = VatCalculator:: getNetPrice (); // 24.00
$ taxValue = VatCalculator:: getTaxValue (); // 4.56
Para recibir una matriz con todas las tasas impositivas disponibles para un país determinado, utilice el método getTaxRatesForCountry
.
VatCalculator:: getTaxRatesForCountry ( ' DE ' ); // [ "high" = > 0.19 , "low" = > 0.07 ]
Antes de validar los números de IVA de sus clientes, puede utilizar el método shouldCollectVAT
para comprobar si el código de país requiere que usted recaude el IVA en primer lugar.
if (VatCalculator:: shouldCollectVAT ( ' DE ' )) {
// This country code requires VAT collection ...
}
Para validar los números de IVA de sus clientes, puede utilizar el método isValidVATNumber
. El número de IVA debe estar en un formato especificado por el VIES. Los números de IVA proporcionados se truncarán y los caracteres/espacios en blanco no relevantes se eliminarán automáticamente.
Este servicio se basa en una API SOAP de terceros proporcionada por la UE. Si, por cualquier motivo, esta API no está disponible, se generará una VATCheckUnavailableException
.
try {
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Alternativamente, también es posible validar únicamente el formato del Número de IVA especificado por VIES. Esto es útil si no desea esperar una respuesta de la 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 ' );
Para obtener los detalles de un número de IVA, puede utilizar el método getVATDetails
. El número de IVA debe estar en un formato especificado por el VIES. Los números de IVA proporcionados se truncarán y los caracteres/espacios en blanco no relevantes se eliminarán automáticamente.
Este servicio se basa en una API SOAP de terceros proporcionada por la UE. Si, por cualquier motivo, esta API no está disponible, se generará una VATCheckUnavailableException
.
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 ...
}
Los números de IVA del Reino Unido tienen un formato un poco diferente:
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 ...
}
De forma predeterminada, VatCalculator tiene todas las normas de IVA de la UE predefinidas, por lo que se puede actualizar fácilmente si cambia para un país específico.
Si necesita definir otras tasas de IVA, puede hacerlo publicando la configuración y agregando más reglas.
Advertencia
Asegúrese de configurar el código de país de su empresa en el archivo de configuración para obtener el cálculo correcto del IVA al vender a clientes comerciales en su propio país.
Para publicar los archivos de configuración, ejecute el comando vendor:publish
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
Esto creará un vat_calculator.php
en su directorio de configuración.
Si por alguna razón ocurren fallas SOAP cuando la API VIES está defectuosa, estos errores se manejarán correctamente y se devolverá false
. Sin embargo, si desea conocer explícitamente cualquier error de SOAP, puede indicarle a VatCalculator que lo genere como VATCheckUnavailableException
. La VATCheckUnavailableException
contendrá el mensaje específico del error SOAP.
Establezca la opción en true
en su archivo de configuración:
<?php
return [
' forward_soap_faults ' => true ,
];
También puede establecer un tiempo de espera para el cliente SOAP. De forma predeterminada, SOAP cancela la solicitud a VIES después de 30 segundos. Si no desea esperar tanto, puede reducir el tiempo de espera, por ejemplo a 10 segundos:
<?php
return [
' soap_timeout ' => 10 ,
];
VatCalculator también se envía con una regla de validación ValidVatNumber
para números de IVA. Puede usar esto cuando valide la entrada desde una solicitud de formulario o una instancia de validador independiente:
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 ...
}
Advertencia
La extensión del validador devuelve false
cuando la API SOAP de verificación de ID de IVA no está disponible.
Nota
Por el momento, este paquete no es compatible con Cashier Stripe v13 o superior porque todavía depende del antiguo método taxPercentage
que se eliminó de Cashier v13. Mientras tanto, aún puedes usarlo en versiones anteriores de Cashier Stripe.
Si desea utilizar este paquete en combinación con Laravel Cashier Stripe, puede dejar que su modelo facturable utilice el rasgo BillableWithinTheEU
. Debido a que este rasgo anula el método taxPercentage
del rasgo Billable
, tenemos que decirle explícitamente a nuestro modelo que lo haga.
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 ' ];
}
Al utilizar el rasgo BillableWithinTheEU
, su modelo facturable tiene nuevos métodos para establecer la tasa impositiva para el modelo facturable.
Configure todo en un solo comando:
setTaxForCountry($countryCode, $company = false)
O utilice el enfoque encadenable, más legible:
useTaxFrom($countryCode)
— Utilice la tasa impositiva del país indicadoasIndividual()
— El modelo facturable no es una empresa (predeterminado)asBusiness()
— El modelo facturable es una empresa válidaEntonces, para establecer el porcentaje de impuesto correcto antes de suscribir a su cliente, considere el siguiente flujo de trabajo:
$ 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 );
Consulte el CHANGELOG en este repositorio para conocer todos los cambios recientes.
VatCalculator es mantenido por Dries Vints. Creado originalmente por Marcel Pociot.
VatCalculator es un software de código abierto con licencia MIT.