按照应有的方式处理与 EU 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 ' );
警告
该方案不提供任何正确计算税收的承诺。您仍然有责任确保任何计算的税费对于您的用例来说都是正确的。如果您不确定某种税是否正确,最好咨询会计师。
使用 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 ' );
升级库时请参考the upgrade guide
。
要计算总价,请使用以净价和国家/地区代码作为参数的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
要接收包含给定国家/地区所有可用税率的数组,请使用getTaxRatesForCountry
方法。
VatCalculator:: getTaxRatesForCountry ( ' DE ' ); // [ "high" = > 0.19 , "low" = > 0.07 ]
在验证客户的增值税号之前,您可以使用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 ] = > 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 ...
}
英国增值税号码的格式略有不同:
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 ...
}
默认情况下,VatCalculator 预定义了所有欧盟增值税规则,因此如果特定国家/地区发生变化,可以轻松更新。
如果您需要定义其他增值税税率,可以通过发布配置并添加更多规则来实现。
警告
请务必在配置文件中设置您的企业国家/地区代码,以便在向您所在国家/地区的企业客户销售时获得正确的增值税计算。
要发布配置文件,请运行vendor:publish
命令
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
这将在您的配置目录中创建一个vat_calculator.php
。
如果由于某种原因,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 ,
];
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 ...
}
警告
当 VAT ID Check SOAP API 不可用时,验证器扩展返回false
。
笔记
目前,该软件包与 Cashier Stripe v13 或更高版本不兼容,因为它仍然依赖于旧的taxPercentage
方法,该方法已从 Cashier v13 中删除。与此同时,您仍然可以在较旧的 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 );
查看此存储库中的变更日志以了解所有最近的更改。
VatCalculator 由 Dries Vints 维护。最初由 Marcel Pociot 创建。
VatCalculator 是根据 MIT 许可证授权的开源软件。