Your IP : 3.135.206.19
<?php
namespace Faker\Provider\en_GB;
class Company extends \Faker\Provider\Company
{
public const VAT_PREFIX = 'GB';
public const VAT_TYPE_DEFAULT = 'vat';
public const VAT_TYPE_BRANCH = 'branch';
public const VAT_TYPE_GOVERNMENT = 'gov';
public const VAT_TYPE_HEALTH_AUTHORITY = 'health';
/**
* UK VAT number
*
* This method produces numbers that are _reasonably_ representative
* of those issued by government
*
* @see https://en.wikipedia.org/wiki/VAT_identification_number#VAT_numbers_by_country
*/
public static function vat(string $type = null): string
{
switch ($type) {
case static::VAT_TYPE_BRANCH:
return static::generateBranchTraderVatNumber();
case static::VAT_TYPE_GOVERNMENT:
return static::generateGovernmentVatNumber();
case static::VAT_TYPE_HEALTH_AUTHORITY:
return static::generateHealthAuthorityVatNumber();
default:
return static::generateStandardVatNumber();
}
}
/**
* Standard
* 9 digits (block of 3, block of 4, block of 2)
*
* This uses the format introduced November 2009 onward where the first
* block starts from 100 and the final two digits are generated via a the
* modulus 9755 algorithm
*/
private static function generateStandardVatNumber(): string
{
$firstBlock = static::numberBetween(100, 999);
$secondBlock = static::randomNumber(4, true);
return sprintf(
'%s%d %d %d',
static::VAT_PREFIX,
$firstBlock,
$secondBlock,
static::calculateModulus97($firstBlock . $secondBlock)
);
}
/**
* Health authorities
* the letters HA then 3 digits from 500 to 999 (e.g. GBHA599)
*/
private static function generateHealthAuthorityVatNumber(): string
{
return sprintf(
'%sHA%d',
static::VAT_PREFIX,
static::numberBetween(500, 999)
);
}
/**
* Branch traders
* 12 digits (as for 9 digits, followed by a block of 3 digits)
*/
private static function generateBranchTraderVatNumber(): string
{
return sprintf(
'%s %d',
static::generateStandardVatNumber(),
static::randomNumber(3, true)
);
}
/**
* Government departments
* the letters GD then 3 digits from 000 to 499 (e.g. GBGD001)
*/
private static function generateGovernmentVatNumber(): string
{
return sprintf(
'%sGD%s',
static::VAT_PREFIX,
str_pad((string) static::numberBetween(0, 499), 3, '0', STR_PAD_LEFT)
);
}
/**
* Apply a Modulus97 algorithm to an input
*
* @see https://library.croneri.co.uk/cch_uk/bvr/43-600
*/
public static function calculateModulus97(string $input, bool $use9755 = true): string
{
$digits = str_split($input);
if (count($digits) !== 7) {
throw new \InvalidArgumentException();
}
$multiplier = 8;
$sum = 0;
foreach ($digits as $digit) {
$sum += (int) $digit * $multiplier;
--$multiplier ;
}
if ($use9755) {
$sum = $sum + 55;
}
while ($sum > 0) {
$sum -= 97;
}
$sum = $sum * -1;
return str_pad((string) $sum, 2, '0', STR_PAD_LEFT);
}
}