1
0
mirror of https://github.com/fzaninotto/Faker.git synced 2025-03-21 07:49:53 +01:00

implemented tin (NIF) generator for pt_PT provider

This commit is contained in:
Hugo Fonseca 2014-04-21 21:42:28 +01:00
parent cabb1cb455
commit 92eb9aeae5
3 changed files with 135 additions and 0 deletions

View File

@ -796,6 +796,15 @@ echo $faker->tollFreePhoneNumber; // "0800123456"
echo $faker->premiumRatePhoneNumber; // "0900123456"
```
### `Faker\Provider\pt_PT\Person`
```php
<?php
// Generates a random taxpayer identification number (in portuguese - Número de Identificação Fiscal NIF)
echo $faker->taxpayerIdentificationNumber; // '165249277'
```
## License
Faker is released under the MIT Licence. See the bundled LICENSE file for details.

View File

@ -0,0 +1,74 @@
<?php
namespace Faker\Provider\pt_PT;
class Person extends \Faker\Provider\Person
{
protected static $firstEightDigitsFormat = array(
'1#######',
'2#######',
'3#######',
'45######',
'5#######',
'6#######',
'70######',
'71######',
'72######',
'77######',
'79######',
'8#######' ,
'90######',
'98######',
'99######'
);
/**
* Taxpayer Identification Number (NIF in Portugal)
*
* @link http://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal
*
* @return string 9 digit number
*/
public static function taxpayerIdentificationNumber()
{
$firstEightDigits = static::numerify(static::randomElement(static::$firstEightDigitsFormat));
$lastDigit = static::dvCalcMod11($firstEightDigits);
return $firstEightDigits.$lastDigit;
}
/**
* Generate module
*
* @link http://pt.wikipedia.org/wiki/D%C3%ADgito_verificador
*
* @param string $number number
*
* @return int
*/
public static function dvCalcMod11($number)
{
$base = 9;
$sum = 0;
$factor = 2;
for ($i = strlen($number); $i > 0; $i--) {
$numbers[$i] = substr($number, $i - 1, 1);
$partial[$i] = $numbers[$i] * $factor;
$sum += $partial[$i];
if ($factor == $base) {
$factor = 1;
}
$factor++;
}
$res = $sum % 11;
if ($res == 0 || $res == 1) {
$digit = 0;
} else {
$digit = 11 - $res;
}
return $digit;
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace Faker\Test\Provider\pt_PT;
use Faker\Generator;
use Faker\Provider\pt_PT\Person;
class PersonTest extends \PHPUnit_Framework_TestCase
{
public function setUp()
{
$faker = new Generator();
$faker->addProvider(new Person($faker));
$this->faker = $faker;
}
public function testTaxpayerIdentificationNumberIsValid()
{
$tin = $this->faker->taxpayerIdentificationNumber();
$this->assertTrue($this->isValidTin($tin), $tin);
}
/**
*
* @link http://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal
*
* @param type $tin
*
* @return boolean
*/
public static function isValidTin($tin)
{
$regex = '(([1,2,3,5,6,8]{1}[0-9]{8})|((45)|(70)|(71)|(72)|(77)|(79)|(90|(98|(99))))[0-9]{7})';
if (is_null($tin) || !is_numeric($tin) || !strlen($tin) == 9 || preg_match("/$regex/", $tin) !== 1) {
return false;
}
$n = str_split($tin);
// cd - Control Digit
$cd = ($n[0] * 9 + $n[1] * 8 + $n[2] * 7 + $n[3] * 6 + $n[4] * 5 + $n[5] * 4 + $n[6] * 3 + $n[7] * 2) % 11;
if ($cd === 0 || $cd === 1) {
$cd = 0;
} else {
$cd = 11 - $cd;
}
if ($cd === intval($n[8])) {
return true;
}
return false;
}
}