jakubjachym/vat-calculator

按照应有的方式计算欧盟增值税。这是对spaze/vat-calculator的重新分支,后者是mpociot/vat-calculator的一个独立且现代化的分支,增加了一些新功能。

v3.6.9 2024-09-02 11:36 UTC

This package is auto-updated.

Last update: 2024-10-02 11:52:18 UTC


README

Software License PHP Tests

按照应有的方式处理与欧盟MOSS税/增值税法规相关的所有困难问题。这是一个重新分支的spaze/vat-calculator,后者是mpociot/vat-calculator的“现代化”分支,不包含Laravel/Cashier支持,增加了一些新功能,需要PHP 7.3+。

// Easy to use!
use JakubJachym\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 jakubjachym/vat-calculator

独立使用

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

示例

use JakubJachym\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);

请注意,由于这些国家不使用VIES(欧盟增值税号验证服务),因此您不能使用isValidVatNumber()验证增值税号,因为这些国家不是欧盟的一部分,总是返回为无效。

许可证

此库采用MIT许可。请参阅许可文件以获取更多信息。

贡献

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

免责声明

虽然此存储库试图提供最新的增值税率,但它可能会失败。请记住,作者不对使用此存储库对您或任何人造成的任何损害负责。您有责任检查所使用的增值税率是否有效。