spaze/vat-calculator

此包已被弃用且不再维护。作者建议使用 driesvints/vat-calculator 包。

欧洲增值税计算,应该是这样的。mpociot/vat-calculator 的独立且现代化的分支,具有一些新功能。

v4.0.4 2023-11-28 01:26 UTC

README

Software License PHP Tests

注意

EOL,请使用

警告

将不会有任何新版本发布,版本 4.0.4 是此包的最后一个版本

重要

此存储库将于 2023 年底归档。感谢大家!

以应有的方式处理与欧盟 MOSS 税/增值税规定相关的所有棘手问题。这是 mpociot/vat-calculator 的“现代化”分支,没有 Laravel/Cashier 支持,具有一些新功能,需要 PHP 7.3+。

// Easy to use!
use Spaze\VatCalculator\VatCalculator;

$vatRates = new VatRates();
$vatCalculator = new VatCalculator($vatRates);
$vatCalculator->calculate(71.00, 'DE' /* $countryCode */, '41352' /* $postalCode or null */,  true /* Whether the customer you're calculating the VAT for is a company */);
$vatCalculator->getTaxRateForLocation('NL');
// Check validity of a VAT number
$vatCalculator->isValidVatNumber('NL123456789B01');

内容

安装

要安装增值税计算器,只需运行

$ composer require spaze/vat-calculator

独立

此包旨在独立使用。只需创建增值税计算器的新实例并使用它。

示例

use Spaze\VatCalculator\VatCalculator;

$vatRates = new VatRates();
$vatCalculator = new VatCalculator($vatRates);
$vatCalculator->setBusinessCountryCode('DE');  // Where your company is based in
$price = $vatCalculator->calculate(49.99, 'LU', null, false);
$price->getPrice();
$price->getNetPrice();
$price->getTaxValue();
$price->getTaxRate();

用法

计算含税价格

要计算含税价格(含增值税的价格),请使用带有净价格、国家代码、邮政编码(未知时为 null)以及是否计算公司客户的增值税的 calculate 方法作为参数。

$grossPrice = $vatCalculator->calculate(24.00, 'DE', null, false /* [, $rateType [, $dateTime]] */);

第三个参数是客户的邮政编码,如果未知则传递 null

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

第五个可选参数定义了在特定国家定义了多个税率时使用哪个增值税率(VatRates::HIGHVatRates::LOWVatRates::GENERAL 是默认值,当只定义一个税率时)。

第六个参数是可选的,指定用于增值税率的日期。当国家更改其增值税率并希望使用之前的税率计算价格时需要此参数。传递 DateTimeDateTimeImmutable 对象。未指定时使用当前日期。

返回 VatPrice 对象

$grossPrice->getPrice();
$grossPrice->getNetPrice();
$grossPrice->getTaxValue();
$grossPrice->getTaxRate();

验证欧盟增值税号

在验证客户的增值税号之前,您可以使用 shouldCollectVat 方法检查是否需要收取该国家代码的增值税。此方法对于使用 addRateForCountry(见下文)手动添加的非欧盟国家也会返回 true

要忽略手动添加的非欧盟国家并仅对欧盟成员国返回 true,您可以使用 shouldCollectEuVat

if ($vatCalculator->shouldCollectVat('DE')) {

}

if ($vatCalculator->shouldCollectEuVat('DE')) {

}

为了验证客户的增值税号,您可以使用 isValidVatNumber 方法。增值税号应采用 VIES 指定的格式。给定的增值税号将被截断,并且非相关字符(如 -.,、空白字符)将自动删除。如果剩余任何无效字符,例如非拉丁字母,将抛出 InvalidCharsInVatNumberException

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

如果提供的增值税号来自不受支持的非欧盟国家,将抛出 UnsupportedCountryException

try {
	$validVat = $vatCalculator->isValidVatNumber('NL 123456789 B01');
} catch (VatCheckUnavailableException $e) {
	// Please handle me
}

获取欧盟增值税号详细信息

要获取增值税号的详细信息,您可以使用 getVatDetails 方法。增值税号应采用 VIES 指定的格式。给定的增值税号将被截断,并且非相关字符/空白字符将自动删除。

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

如果提供的增值税号来自不受支持的非欧盟国家,将抛出 UnsupportedCountryException

try {
	$vat_details = $vatCalculator->getVatDetails('NL 123456789 B01');
	print_r($vat_details);
	/* Outputs VatDetails object, use getters to access values
	VatDetails Object
	(
		[valid:VatDetails:private] => false
		[countryCode:VatDetails:private] => NL
		[vatNumber:VatDetails:private] => 123456789B01
		[requestId:VatDetails:private] => FOOBAR338
	)
	*/
} catch (VatCheckUnavailableException $e) {
	// Please handle me
}

获取某个国家的所有已知税率

通过以下方式获取一个国家的所有已知税率(当前、高 & 低、历史 & 未来、例外情况):

$vatRates = new VatRates();
$vatRates->getAllKnownRates('DE');

返回的税率数组未排序。此方法在您想预先填充一个选择框,例如一个国家的已知增值税率,或者您想验证用户提供的税率时非常有用。

国家

支持欧盟国家以及一些使用增值税的非欧盟国家。一些国家即使有增值税也不受支持。目前,以下国家就是这种情况:

  • 瑞士(CH)
  • 英国(GB)
  • 挪威(NO)
  • 土耳其(TR)

这些可以通过 VatRates::addRateForCountry() 手动添加。

$vatRates = new VatRates();
$vatRates->addRateForCountry('NO');
$vatCalculator = new VatCalculator($vatRates);

请注意,对于这些国家,您不能使用 isValidVatNumber() 验证增值税号,因为它使用的是欧盟增值税号验证服务 VIES,而这些国家不是欧盟成员国,因此总是会被视为无效。

许可

此库采用 MIT 许可证授权。有关更多信息,请参阅 许可文件

贡献

使用 composer test 运行 PHPUnit 测试和静态分析,请参阅 composer.json 中的 scripts。GitHub Actions 还会在每次推送时运行测试。