按照應有的方式處理與 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 授權授權的開源軟體。