Tangani semua hal sulit terkait peraturan pajak/PPN UE MOSS, sebagaimana mestinya. Terintegrasi dengan Laravel dan Cashier — atau dalam aplikasi PHP mandiri . Awalnya dibuat oleh 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 ' );
Peringatan
Paket ini tidak memberikan janji apapun untuk pajak yang dihitung dengan benar. Anda tetap bertanggung jawab untuk memastikan bahwa pajak yang dihitung sudah benar untuk kasus penggunaan Anda. Jika Anda tidak yakin apakah suatu pajak tertentu benar atau tidak, sebaiknya Anda berbicara dengan akuntan.
Instal paket dengan composer:
composer require mpociot/vat-calculator
Anda juga dapat menggunakan paket ini tanpa Laravel. Cukup buat instance baru dari VatCalculator dan gunakan. Semua contoh dokumentasi menggunakan kode Laravel Facade, jadi pastikan untuk tidak memanggil metode seolah-olah metode tersebut adalah metode statis.
use Mpociot VatCalculator VatCalculator ;
$ vatCalculator = new VatCalculator ();
$ vatCalculator -> setBusinessCountryCode ( ' DE ' );
$ grossPrice = $ vatCalculator -> calculate ( 49.99 , $ countryCode = ' LU ' );
Silakan merujuk ke the upgrade guide
saat meningkatkan perpustakaan.
Untuk menghitung harga kotor digunakan metode calculate
dengan harga bersih dan kode negara sebagai parameternya.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' );
Parameter ketiga adalah kode pos pelanggan.
Sebagai parameter keempat, Anda dapat memasukkan boolean yang menunjukkan apakah pelanggannya adalah perusahaan atau perorangan. Jika pelanggan adalah perusahaan, yang harus Anda periksa dengan memvalidasi nomor PPN, harga bersih akan dikembalikan.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' , ' 12345 ' , $ isCompany = true );
Setelah menghitung harga kotor, Anda dapat mengekstrak informasi lebih lanjut dari VatCalculator.
$ grossPrice = VatCalculator:: calculate ( 24.00 , ' DE ' ); // 28.56
$ taxRate = VatCalculator:: getTaxRate (); // 0.19
$ netPrice = VatCalculator:: getNetPrice (); // 24.00
$ taxValue = VatCalculator:: getTaxValue (); // 4.56
Untuk menerima array dengan semua tarif pajak yang tersedia untuk negara tertentu, gunakan metode getTaxRatesForCountry
.
VatCalculator:: getTaxRatesForCountry ( ' DE ' ); // [ "high" = > 0.19 , "low" = > 0.07 ]
Sebelum memvalidasi nomor PPN pelanggan, Anda dapat menggunakan metode shouldCollectVAT
untuk memeriksa apakah kode negara mengharuskan Anda memungut PPN terlebih dahulu.
if (VatCalculator:: shouldCollectVAT ( ' DE ' )) {
// This country code requires VAT collection ...
}
Untuk memvalidasi nomor PPN pelanggan, Anda dapat menggunakan metode isValidVATNumber
. Nomor PPN harus dalam format yang ditentukan oleh VIES. Nomor PPN yang diberikan akan terpotong dan karakter/spasi yang tidak relevan akan otomatis dihapus.
Layanan ini bergantung pada SOAP API pihak ketiga yang disediakan oleh UE. Jika, karena alasan apa pun, API ini tidak tersedia, VATCheckUnavailableException
akan ditampilkan.
try {
$ validVAT = VatCalculator:: isValidVATNumber ( ' NL 123456789 B01 ' );
} catch ( VATCheckUnavailableException $ e ) {
// The VAT check API is unavailable ...
}
Alternatifnya, dimungkinkan juga untuk memvalidasi hanya format Nomor PPN yang ditentukan oleh VIES. Ini berguna, jika Anda tidak ingin menunggu respon dari 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 ' );
Untuk mendapatkan detail nomor PPN, Anda bisa menggunakan metode getVATDetails
. Nomor PPN harus dalam format yang ditentukan oleh VIES. Nomor PPN yang diberikan akan terpotong dan karakter/spasi yang tidak relevan akan otomatis dihapus.
Layanan ini bergantung pada SOAP API pihak ketiga yang disediakan oleh UE. Jika, karena alasan apa pun, API ini tidak tersedia, VATCheckUnavailableException
akan ditampilkan.
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 ...
}
Format nomor PPN Inggris sedikit berbeda:
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 ...
}
Secara default, VatCalculator memiliki semua peraturan PPN UE yang telah ditentukan sebelumnya, sehingga dapat dengan mudah diperbarui, jika ada perubahan untuk negara tertentu.
Jika Anda perlu menentukan tarif PPN lainnya, Anda dapat melakukannya dengan memublikasikan konfigurasi dan menambahkan aturan lainnya.
Peringatan
Pastikan untuk mengatur kode negara bisnis Anda di file konfigurasi, untuk mendapatkan penghitungan PPN yang benar saat menjual ke pelanggan bisnis di negara Anda sendiri.
Untuk mempublikasikan file konfigurasi, jalankan perintah vendor:publish
php artisan vendor:publish --provider= " MpociotVatCalculatorVatCalculatorServiceProvider "
Ini akan membuat vat_calculator.php
di direktori konfigurasi Anda.
Jika karena alasan tertentu, kesalahan SOAP terjadi ketika VIES API rusak, kesalahan ini akan ditangani dengan baik dan false
akan dikembalikan. Namun, jika Anda secara eksplisit ingin mengetahui kesalahan SOAP apa pun, Anda dapat menginstruksikan VatCalculator untuk menampilkannya sebagai VATCheckUnavailableException
. VATCheckUnavailableException
kemudian akan berisi pesan spesifik tentang kesalahan SOAP.
Setel opsi ke true
di file konfigurasi Anda:
<?php
return [
' forward_soap_faults ' => true ,
];
Anda juga dapat mengatur batas waktu untuk klien SOAP. Secara default, SOAP membatalkan permintaan ke VIES setelah 30 detik. Jika tidak ingin menunggu terlalu lama, Anda dapat mengurangi batas waktu, misalnya menjadi 10 detik:
<?php
return [
' soap_timeout ' => 10 ,
];
VatCalculator juga dilengkapi dengan aturan validasi ValidVatNumber
untuk Nomor PPN. Anda dapat menggunakan ini ketika input validasi dari permintaan formulir atau contoh validator mandiri:
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 ...
}
Peringatan
Ekstensi validator mengembalikan false
ketika API SOAP Pemeriksaan ID PPN tidak tersedia.
Catatan
Saat ini paket ini tidak kompatibel dengan Cashier Stripe v13 atau lebih tinggi karena masih mengandalkan metode taxPercentage
lama yang telah dihapus dari Cashier v13. Sementara itu, Anda masih dapat menggunakannya pada versi Cashier Stripe yang lebih lama.
Jika Anda ingin menggunakan paket ini bersama dengan Laravel Cashier Stripe, Anda dapat membiarkan model yang dapat ditagih menggunakan sifat BillableWithinTheEU
. Karena sifat ini menggantikan metode taxPercentage
dari sifat Billable
, kita harus secara eksplisit memberi tahu model kita untuk melakukan hal tersebut.
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 ' ];
}
Dengan menggunakan sifat BillableWithinTheEU
, model yang dapat ditagih memiliki metode baru untuk menetapkan tarif pajak untuk model yang dapat ditagih.
Atur semuanya dalam satu perintah:
setTaxForCountry($countryCode, $company = false)
Atau gunakan pendekatan yang lebih mudah dibaca dan dirantai:
useTaxFrom($countryCode)
— Gunakan tarif pajak negara tertentuasIndividual()
— Model yang dapat ditagih bukan perusahaan (default)asBusiness()
— Model yang dapat ditagih adalah perusahaan yang validJadi untuk menetapkan persentase pajak yang benar sebelum pelanggan Anda berlangganan, pertimbangkan alur kerja berikut:
$ 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 );
Lihat CHANGELOG di repositori ini untuk mengetahui semua perubahan terkini.
Kalkulator Vat dikelola oleh Dries Vints. Awalnya dibuat oleh Marcel Pociot.
VatCalculator adalah perangkat lunak sumber terbuka yang dilisensikan di bawah lisensi MIT.