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:
parent
cabb1cb455
commit
92eb9aeae5
@ -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.
|
||||
|
74
src/Faker/Provider/pt_PT/Person.php
Normal file
74
src/Faker/Provider/pt_PT/Person.php
Normal 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;
|
||||
}
|
||||
}
|
52
test/Faker/Provider/pt_PT/PersonTest.php
Normal file
52
test/Faker/Provider/pt_PT/PersonTest.php
Normal 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;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user