Решайте все сложные вопросы, связанные с правилами ЕС по налогам/НДС MOSS, так, как это должно быть. Интегрируется с Laravel и Cashier или в отдельное PHP-приложение. Первоначально создано Марселем Посьо.
// 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 ' );
Третий параметр — почтовый индекс клиента.
В качестве четвертого параметра вы можете передать логическое значение, указывающее, является ли клиент компанией или частным лицом. Если клиентом является компания, которую следует проверить, подтвердив номер плательщика НДС, возвращается чистая цена.
$ 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. Указанные номера НДС будут сокращены, а нерелевантные символы/пробелы будут автоматически удалены.
Эта служба использует сторонний API-интерфейс SOAP, предоставленный ЕС. Если по какой-либо причине этот 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. Указанные номера НДС будут сокращены, а нерелевантные символы/пробелы будут автоматически удалены.
Эта служба использует сторонний API-интерфейс SOAP, предоставленный ЕС. Если по какой-либо причине этот 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
в вашем каталоге конфигурации.
Если по какой-либо причине ошибки 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
для номеров НДС. Вы можете использовать это при проверке входных данных из запроса формы или автономного экземпляра валидатора:
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
, если 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. Первоначально создано Марселем Посьо.
VatCalculator — это программное обеспечение с открытым исходным кодом, лицензированное по лицензии MIT.