Lide com todas as questões difíceis relacionadas às regulamentações fiscais/IVA do MOSS da UE, da maneira que deveria ser. Integra-se com Laravel e Cashier — ou em um aplicativo PHP independente . Originalmente criado 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 ' );
Aviso
Este pacote não oferece nenhuma promessa de impostos calculados corretamente. Você ainda é responsável por garantir que qualquer imposto calculado esteja correto para seu caso de uso. Se você não tiver certeza se um determinado imposto está correto ou não, é melhor conversar com um contador.
Instale o pacote com o compositor:
composer require mpociot/vat-calculator
Você também pode usar este pacote sem o Laravel. Basta criar uma nova instância do VatCalculator e usá-la. Todos os exemplos de documentação usam o código Laravel Facade, portanto, certifique-se de não chamar os métodos como se fossem 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
ao atualizar a biblioteca.
Para calcular o preço bruto utilize o método calculate
com um preço líquido e um código de país como parâmetros.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' );
O terceiro parâmetro é o código postal do cliente.
Como quarto parâmetro, você pode passar um booleano indicando se o cliente é uma empresa ou uma pessoa física. Se o cliente for uma empresa, o que deverá verificar através da validação do número de IVA, é devolvido o preço líquido.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' , ' 12345 ' , $ isCompany = true );
Depois de calcular o preço bruto você pode extrair mais informações do 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 receber uma matriz com todas as alíquotas de impostos disponíveis para um determinado país, use o método getTaxRatesForCountry
.
VatCalculator:: getTaxRatesForCountry ( ' DE ' ); // [ "high" = > 0.19 , "low" = > 0.07 ]
Antes de validar os números de IVA dos seus clientes, você pode usar o método shouldCollectVAT
para verificar se o código do país exige que você recolha o IVA em primeiro lugar.
if (VatCalculator:: shouldCollectVAT ( ' DE ' )) {
// This country code requires VAT collection ...
}
Para validar os números de IVA dos seus clientes, você pode usar o método isValidVATNumber
. O número de IVA deve estar num formato especificado pelo VIES. Os números de IVA fornecidos serão truncados e os caracteres/espaços em branco não relevantes serão automaticamente removidos.
Este serviço depende de uma API SOAP de terceiros fornecida pela UE. Se, por qualquer motivo, esta API estiver indisponível, uma VATCheckUnavailableException
será lançada.
try {
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Alternativamente, também é possível validar apenas o formato do Número de IVA especificado pelo VIES. Isso é útil se você não quiser esperar por uma resposta da 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 obter os detalhes de um número de IVA, você pode usar o método getVATDetails
. O número de IVA deve estar num formato especificado pelo VIES. Os números de IVA fornecidos serão truncados e os caracteres/espaços em branco não relevantes serão automaticamente removidos.
Este serviço depende de uma API SOAP de terceiros fornecida pela UE. Se, por qualquer motivo, esta API estiver indisponível, uma VATCheckUnavailableException
será lançada.
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 ...
}
Os números de IVA do Reino Unido são formatados de forma um pouco 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 ...
}
Por padrão, o VatCalculator tem todas as regras de IVA da UE predefinidas, para que possa ser facilmente atualizado, caso mude para um país específico.
Caso necessite definir outras taxas de IVA, poderá fazê-lo publicando a configuração e adicionando mais regras.
Aviso
Certifique-se de definir o código do país da sua empresa no arquivo de configuração para obter o cálculo correto do IVA ao vender para clientes empresariais em seu próprio país.
Para publicar os arquivos de configuração, execute o comando vendor:publish
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
Isso criará um vat_calculator.php
em seu diretório de configuração.
Se, por algum motivo, ocorrerem falhas SOAP quando a API VIES estiver com defeito, esses erros serão tratados normalmente e false
serão retornados. No entanto, se você deseja explicitamente estar ciente de quaisquer falhas de SOAP, você pode instruir VatCalculator para lançá-las como VATCheckUnavailableException
. A VATCheckUnavailableException
conterá então a mensagem específica da falha SOAP.
Defina a opção como true
no seu arquivo de configuração:
<?php
return [
' forward_soap_faults ' => true ,
];
Você também pode definir um tempo limite para o cliente SOAP. Por padrão, o SOAP aborta a solicitação ao VIES após 30 segundos. Se não quiser esperar tanto tempo, você pode reduzir o tempo limite, por exemplo, para 10 segundos:
<?php
return [
' soap_timeout ' => 10 ,
];
VatCalculator também vem com uma regra de validação ValidVatNumber
para números de IVA. Você pode usar isso ao inserir a validação de uma solicitação de formulário ou de uma instância de validador independente:
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 ...
}
Aviso
A extensão do validador retorna false
quando a API SOAP de verificação de ID de IVA não está disponível.
Observação
No momento, este pacote não é compatível com Cashier Stripe v13 ou superior porque ainda depende do antigo método taxPercentage
que foi removido do Cashier v13. Enquanto isso, você ainda pode usá-lo em versões mais antigas do Cashier Stripe.
Se você quiser usar este pacote em combinação com o Laravel Cashier Stripe, você pode deixar seu modelo faturável usar a característica BillableWithinTheEU
. Como esse atributo substitui o método taxPercentage
do atributo Billable
, precisamos informar explicitamente ao nosso modelo para fazer isso.
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 ' ];
}
Ao usar o atributo BillableWithinTheEU
, seu modelo faturável tem novos métodos para definir a taxa de imposto para o modelo faturável.
Defina tudo em um comando:
setTaxForCountry($countryCode, $company = false)
Ou use a abordagem mais legível e encadeada:
useTaxFrom($countryCode)
— Use a taxa de imposto do país fornecidoasIndividual()
— O modelo faturável não é uma empresa (padrão)asBusiness()
— O modelo faturável é uma empresa válidaPortanto, para definir a porcentagem correta de impostos antes de inscrever seu cliente, considere o seguinte fluxo de trabalho:
$ 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 );
Confira o CHANGELOG neste repositório para todas as mudanças recentes.
VatCalculator é mantido por Dries Vints. Originalmente criado por Marcel Pociot.
VatCalculator é um software de código aberto licenciado sob a licença MIT.