จัดการเรื่องยุ่งยากทั้งหมดที่เกี่ยวข้องกับกฎระเบียบด้านภาษี/vat ของ 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 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 ' );
พารามิเตอร์ที่สามคือรหัสไปรษณีย์ของลูกค้า
สำหรับพารามิเตอร์ที่สี่ คุณสามารถส่งผ่านบูลีนเพื่อระบุว่าลูกค้าเป็นบริษัทหรือบุคคลธรรมดา หากลูกค้าเป็นบริษัทซึ่งคุณควรตรวจสอบโดยการตรวจสอบหมายเลข VAT ระบบจะคืนราคาสุทธิ
$ 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 ]
ก่อนที่จะตรวจสอบหมายเลข VAT ของลูกค้า คุณสามารถใช้วิธี shouldCollectVAT
เพื่อตรวจสอบว่ารหัสประเทศกำหนดให้คุณต้องเก็บ VAT ก่อนหรือไม่
if (VatCalculator:: shouldCollectVAT ( ' DE ' )) {
// This country code requires VAT collection ...
}
หากต้องการตรวจสอบหมายเลข VAT ของลูกค้า คุณสามารถใช้วิธี isValidVATNumber
หมายเลข VAT ควรอยู่ในรูปแบบที่กำหนดโดย VIES หมายเลข VAT ที่กำหนดจะถูกตัดทอน และอักขระ/ช่องว่างที่ไม่เกี่ยวข้องจะถูกลบออกโดยอัตโนมัติ
บริการนี้อาศัย SOAP API ของบุคคลที่สามที่จัดทำโดยสหภาพยุโรป ไม่ว่าด้วยเหตุผลใดก็ตาม หาก API นี้ไม่พร้อมใช้งาน VATCheckUnavailableException
จะถูกส่งออกไป
try {
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
หรือจะตรวจสอบเฉพาะรูปแบบของหมายเลข VAT ที่ระบุโดย 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 ' );
หากต้องการดูรายละเอียดหมายเลข VAT คุณสามารถใช้วิธี getVATDetails
หมายเลข VAT ควรอยู่ในรูปแบบที่กำหนดโดย VIES หมายเลข VAT ที่กำหนดจะถูกตัดทอน และอักขระ/ช่องว่างที่ไม่เกี่ยวข้องจะถูกลบออกโดยอัตโนมัติ
บริการนี้อาศัย 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 ...
}
หมายเลข VAT ของสหราชอาณาจักรมีรูปแบบแตกต่างออกไปเล็กน้อย:
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 จะมีกฎ EU VAT ทั้งหมดที่กำหนดไว้ล่วงหน้า เพื่อให้สามารถอัปเดตได้อย่างง่ายดาย หากมีการเปลี่ยนแปลงสำหรับประเทศใดประเทศหนึ่ง
หากคุณต้องการกำหนดอัตรา VAT อื่นๆ คุณสามารถทำได้โดยการเผยแพร่การกำหนดค่าและเพิ่มกฎเพิ่มเติม
คำเตือน
อย่าลืมตั้งรหัสประเทศของธุรกิจของคุณในไฟล์กำหนดค่า เพื่อให้สามารถคำนวณ VAT ได้อย่างถูกต้องเมื่อขายให้กับลูกค้าธุรกิจในประเทศของคุณเอง
หากต้องการเผยแพร่ไฟล์คอนฟิกูเรชัน ให้รันคำสั่ง vendor:publish
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
สิ่งนี้จะสร้าง vat_calculator.php
ในไดเร็กทอรี config ของคุณ
หากข้อผิดพลาด SOAP เกิดขึ้นเมื่อ VIES API มีข้อผิดพลาดด้วยเหตุผลบางประการ ข้อผิดพลาดเหล่านี้จะได้รับการจัดการอย่างดีและจะส่งกลับ false
อย่างไรก็ตาม หากคุณต้องการทราบถึงข้อผิดพลาดของ SOAP อย่างชัดเจน คุณอาจสั่งให้ VatCalculator ส่งข้อผิดพลาดเหล่านั้นเป็น VATCheckUnavailableException
จากนั้น VATCheckUnavailableException
จะประกอบด้วยข้อความเฉพาะของข้อบกพร่อง SOAP
ตั้งค่าตัวเลือกเป็น true
ในไฟล์ปรับแต่งของคุณ:
<?php
return [
' forward_soap_faults ' => true ,
];
คุณยังสามารถตั้งค่าการหมดเวลาสำหรับไคลเอ็นต์ SOAP ได้อีกด้วย ตามค่าเริ่มต้น SOAP จะยกเลิกการร้องขอเป็น VIES หลังจากผ่านไป 30 วินาที หากคุณไม่ต้องการรอนานขนาดนั้น คุณสามารถลดการหมดเวลาได้ เช่น 10 วินาที:
<?php
return [
' soap_timeout ' => 10 ,
];
VatCalculator ยังมาพร้อมกับกฎการตรวจสอบ ValidVatNumber
สำหรับหมายเลข VAT คุณสามารถใช้สิ่งนี้เมื่อป้อนข้อมูลการตรวจสอบจากคำขอแบบฟอร์มหรืออินสแตนซ์ตัวตรวจสอบแบบสแตนด์อโลน:
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 ...
}
คำเตือน
ส่วนขยายเครื่องมือตรวจสอบจะส่งคืน false
เมื่อ VAT ID Check SOAP API ไม่พร้อมใช้งาน
บันทึก
ในขณะนี้แพ็คเกจนี้เข้ากันไม่ได้กับ Cashier Stripe v13 หรือสูงกว่า เนื่องจากยังคงต้องใช้วิธี taxPercentage
แบบเก่าซึ่งถูกลบออกจาก Cashier v13 แล้ว ในระหว่างนี้คุณยังสามารถใช้กับ Cashier Stripe เวอร์ชันเก่าได้
หากคุณต้องการใช้แพ็คเกจนี้ร่วมกับ Laravel Cashier Stripe คุณสามารถปล่อยให้โมเดลที่เรียกเก็บเงินได้ของคุณใช้คุณลักษณะ BillableWithinTheEU
เนื่องจากลักษณะนี้แทนที่วิธี taxPercentage
ของลักษณะ Billable
เราจึงต้องบอกแบบจำลองของเราอย่างชัดเจนให้ทำเช่นนั้น
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