From 92eb9aeae5ce196aba8f915fd7e33e4099d7ed8c Mon Sep 17 00:00:00 2001 From: Hugo Fonseca Date: Mon, 21 Apr 2014 21:42:28 +0100 Subject: [PATCH] implemented tin (NIF) generator for pt_PT provider --- readme.md | 9 +++ src/Faker/Provider/pt_PT/Person.php | 74 ++++++++++++++++++++++++ test/Faker/Provider/pt_PT/PersonTest.php | 52 +++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/Faker/Provider/pt_PT/Person.php create mode 100644 test/Faker/Provider/pt_PT/PersonTest.php diff --git a/readme.md b/readme.md index 2d704580..84ff68e8 100644 --- a/readme.md +++ b/readme.md @@ -796,6 +796,15 @@ echo $faker->tollFreePhoneNumber; // "0800123456" echo $faker->premiumRatePhoneNumber; // "0900123456" ``` +### `Faker\Provider\pt_PT\Person` + +```php +taxpayerIdentificationNumber; // '165249277' + +``` ## License Faker is released under the MIT Licence. See the bundled LICENSE file for details. diff --git a/src/Faker/Provider/pt_PT/Person.php b/src/Faker/Provider/pt_PT/Person.php new file mode 100644 index 00000000..e3cefc39 --- /dev/null +++ b/src/Faker/Provider/pt_PT/Person.php @@ -0,0 +1,74 @@ + 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; + } +} diff --git a/test/Faker/Provider/pt_PT/PersonTest.php b/test/Faker/Provider/pt_PT/PersonTest.php new file mode 100644 index 00000000..9bfb7a2f --- /dev/null +++ b/test/Faker/Provider/pt_PT/PersonTest.php @@ -0,0 +1,52 @@ +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; + } +}