mpociot/vat-calculator

按照正确的方式计算欧盟增值税。

资助包维护!
driesvints
Paypal

安装次数: 2,453,051

依赖项: 14

建议者: 0

安全: 0

星标: 1,194

关注者: 16

分支: 89

公开问题: 0

3.12.0 2024-09-02 06:26 UTC

README

Tests Coding Standards Latest Stable Version Total Downloads

以正确的方式处理所有与欧盟MOSS税/增值税规定相关的困难。与 Laravel 和 Cashier 集成 — 或在 独立的 PHP 应用程序中使用。最初由 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');

警告

此包不提供关于正确计算税款的任何保证。您仍需确保任何计算的税款适用于您的用例。如果您不确定某个税款是否正确,最好与会计师交谈。

需求

  • PHP 7.3 或更高版本
  • (可选) Laravel 6.0 或更高版本

安装

使用 composer 安装此包

composer require mpociot/vat-calculator

独立使用

您还可以在不使用 Laravel 的情况下使用此包。只需创建一个 VatCalculator 的新实例并使用它即可。所有文档示例都使用 Laravel Facade 代码,所以请确保不要将方法作为静态方法调用。

use Mpociot\VatCalculator\VatCalculator;

$vatCalculator = new VatCalculator();
$vatCalculator->setBusinessCountryCode('DE');
$grossPrice = $vatCalculator->calculate(49.99, $countryCode = 'LU');

升级

在升级库时,请参阅升级指南

用法

计算含税价格

要计算含税价格,请使用带有净价格和国家代码参数的 calculate 方法。

$grossPrice = VatCalculator::calculate(24.00, 'DE');

第三个参数是客户的邮政编码。

作为第四个参数,您可以传递一个布尔值,表示客户是公司还是个人。如果是公司(您应该通过验证增值税号来检查),则返回净价格。

$grossPrice = VatCalculator::calculate(24.00, 'DE', '12345', $isCompany = true);

获取更多信息

计算含税价格后,您可以从 VatCalculator 中提取更多信息。

$grossPrice = VatCalculator::calculate(24.00, 'DE'); // 28.56
$taxRate = VatCalculator::getTaxRate(); // 0.19
$netPrice = VatCalculator::getNetPrice(); // 24.00
$taxValue = VatCalculator::getTaxValue(); // 4.56

验证欧盟增值税号

在验证客户的增值税号之前,您可以使用 shouldCollectVAT 方法检查是否需要收集增值税。

if (VatCalculator::shouldCollectVAT('DE')) {
    // This country code requires VAT collection...
}

要验证客户的增值税号,请使用 isValidVATNumber 方法。增值税号应采用VIES规定的格式。将截断提供的增值税号,并自动删除无关字符/空白。

此服务依赖于由欧盟提供的第三方 SOAP API。如果由于任何原因该 API 不可用,则将抛出 VATCheckUnavailableException

try {
    $validVAT = VatCalculator::isValidVATNumber('NL 123456789 B01');
} catch (VATCheckUnavailableException $e) {
    // The VAT check API is unavailable...
}

此外,还可以验证VIES指定的增值税号格式。如果您不想等待 SOAP API 的响应,这很有用。

// 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');

获取欧盟增值税号详情

要获取增值税号的详细信息,请使用 getVATDetails 方法。增值税号应采用VIES规定的格式。将截断提供的增值税号,并自动删除无关字符/空白。

此服务依赖于由欧盟提供的第三方 SOAP API。如果由于任何原因该 API 不可用,则将抛出 VATCheckUnavailableException

try {
    $vat_details = VatCalculator::getVATDetails('NL 123456789 B01');
    print_r($vat_details);
    /* Outputs
    stdClass Object
    (
        [countryCode] => NL
        [vatNumber] => 123456789B01
        [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...
}

英国增值税号

英国增值税号的格式略有不同

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

Laravel

配置

默认情况下,VatCalculator 预定义了所有欧盟增值税规则,以便可以轻松更新,如果某个国家的规则发生变化。

如果您需要定义其他增值税税率,可以通过发布配置并添加更多规则来实现。

警告
请确保在配置文件中设置您的业务国家代码,以便在向您本国商业客户销售时正确计算增值税。

要发布配置文件,请运行vendor:publish命令

php artisan vendor:publish --provider="Mpociot\VatCalculator\VatCalculatorServiceProvider"

这将为您配置目录创建一个vat_calculator.php文件。

处理SOAP错误

如果VIES API出现故障,某些原因导致SOAP错误发生,这些错误将得到优雅的处理,并返回false。但是,如果您明确希望了解任何可能的SOAP错误,您可以指示VatCalculator抛出它们作为VATCheckUnavailableException。然后,VATCheckUnavailableException将包含SOAP错误的特定消息。

在您的配置文件中将选项设置为true

<?php

return [
    'forward_soap_faults' => true,
];

您还可以为SOAP客户端设置超时。默认情况下,SOAP在30秒后终止对VIES的请求。如果您不想等待那么长时间,您可以减少超时时间,例如设置为10秒

<?php

return [
    'soap_timeout' => 10,
];

ValidVatNumber验证规则

VatCalculator还附带了一个用于增值税号的ValidVatNumber验证规则。您可以在验证来自表单请求或独立验证器实例的输入时使用此规则。

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

警告

当增值税ID检查SOAP API不可用时,验证器扩展返回false

收银员Stripe集成

注意

目前,此包与Cashier Stripe v13或更高版本不兼容,因为它仍然依赖于已从Cashier v13中删除的旧taxPercentage方法。您仍然可以在同时使用较旧的Cashier Stripe版本。

如果您想将此包与Laravel Cashier Stripe结合使用,可以让您的可计费模型使用BillableWithinTheEU特质。因为此特质重写了Billable特质的taxPercentage方法,我们必须明确告诉我们的模型这样做。

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'];
}

通过使用BillableWithinTheEU特质,您的可计费模型具有设置可计费模型税率的新方法。

一键设置所有内容

  • setTaxForCountry($countryCode, $company = false)

或使用更易读的链式方法

  • useTaxFrom($countryCode) - 使用给定国家的税率
  • asIndividual() - 可计费模型不是公司(默认)
  • asBusiness() - 可计费模型是有效的公司

因此,为了在订阅客户之前设置正确的税率,请考虑以下工作流程

$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);

变更日志

请查看此存储库中的CHANGELOG以获取所有最近更改。

维护者

VatCalculator由Dries Vints维护。最初由Marcel Pociot创建。

许可证

VatCalculator是开源软件,许可协议为MIT许可证