From 5176ffee527229394863e23c7409db357b085103 Mon Sep 17 00:00:00 2001 From: oittaa Date: Fri, 7 Oct 2016 19:00:35 +0300 Subject: [PATCH 1/5] [fi_FI/Person.php] add personalIdentityNumber() --- src/Faker/Provider/fi_FI/Person.php | 57 +++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/Faker/Provider/fi_FI/Person.php b/src/Faker/Provider/fi_FI/Person.php index a48621d5e1..8059545278 100644 --- a/src/Faker/Provider/fi_FI/Person.php +++ b/src/Faker/Provider/fi_FI/Person.php @@ -85,4 +85,61 @@ class Person extends \Faker\Provider\Person protected static $titleMale = array('Hra.', 'Tri.'); protected static $titleFemale = array('Rva.', 'Nti.', 'Tri.'); + + /** + * National Personal Identity Number (Henkilötunnus) + * @link http://www.finlex.fi/fi/laki/ajantasa/2010/20100128 + * @param \DateTime $birthdate + * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE + * @return string on format DDMMYYCZZZQ, where DDMMYY is the date of birth, C the century sign, ZZZ the individual number and Q the control character (checksum) + */ + public function personalIdentityNumber(\DateTime $birthdate = null, $gender = null) + { + $checksumCharacters = '0123456789ABCDEFHJKLMNPRSTUVWXY'; + + if (!$birthdate) { + $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); + } + $datePart = $birthdate->format('dmy'); + + switch ((int)($birthdate->format('Y')/100)) { + case 18: + $centurySign = '+'; + break; + case 19: + $centurySign = '-'; + break; + case 20: + $centurySign = 'A'; + break; + default: + throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.'); + } + + $randomDigits = self::numberBetween(0,89); + if ($gender && $gender == static::GENDER_MALE) { + if ($randomDigits === 0) { + $randomDigits .= static::randomElement(array(3,5,7,9)); + } else { + $randomDigits .= static::randomElement(array(1,3,5,7,9)); + } + } elseif ($gender && $gender == static::GENDER_FEMALE) { + if ($randomDigits === 0) { + $randomDigits .= static::randomElement(array(2,4,6,8)); + } else { + $randomDigits .= static::randomElement(array(0,2,4,6,8)); + } + } else { + if ($randomDigits === 0) { + $randomDigits .= self::numberBetween(2,9); + } else { + $randomDigits .= (string)static::numerify('#'); + } + } + $randomDigits = str_pad($randomDigits, 3, '0', STR_PAD_LEFT); + + $checksum = $checksumCharacters[(int)($datePart . $randomDigits) % strlen($checksumCharacters)]; + + return $datePart . $centurySign . $randomDigits . $checksum; + } } From 961e57f56b1b956bb9d21512cf8bf0aab47ec99a Mon Sep 17 00:00:00 2001 From: oittaa Date: Fri, 7 Oct 2016 19:21:40 +0300 Subject: [PATCH 2/5] Create fi_FI/PersonTest.php --- test/Faker/Provider/fi_FI/PersonTest.php | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/Faker/Provider/fi_FI/PersonTest.php diff --git a/test/Faker/Provider/fi_FI/PersonTest.php b/test/Faker/Provider/fi_FI/PersonTest.php new file mode 100644 index 0000000000..a4f868a6e8 --- /dev/null +++ b/test/Faker/Provider/fi_FI/PersonTest.php @@ -0,0 +1,61 @@ +addProvider(new Person($faker)); + $this->faker = $faker; + } + + public function provideSeedAndExpectedReturn() + { + return array( + array(1, '1800-01-01', '010100+5207'), + array(2, '1930-08-08', '080830-508R'), + array(3, '1999-12-31', '311299-409D'), + array(4, '2000-01-01', '010100A039P'), + array(5, '2015-06-17', '170615A690X') + ); + } + + /** + * @dataProvider provideSeedAndExpectedReturn + */ + public function testPersonalIdentityNumberUsesBirthDateIfProvided($seed, $birthdate, $expected) + { + $faker = $this->faker; + $faker->seed($seed); + $pin = $faker->personalIdentityNumber(\DateTime::createFromFormat('Y-m-d', $birthdate)); + $this->assertEquals($expected, $pin); + } + + public function testPersonalIdentityNumberGeneratesCompliantNumbers() + { + for ($i = 0; $i < 1000; $i++) { + $pin = $this->faker->personalIdentityNumber(); + $this->assertRegExp('/^[0-9]{6}[+\-A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/', $pin); + } + } + + public function testPersonalIdentityNumberGeneratesOddValuesForMales() + { + $pin = $this->faker->personalIdentityNumber(null, 'male'); + $this->assertEquals(1, $pin{9} % 2); + } + + public function testPersonalIdentityNumberGeneratesEvenValuesForFemales() + { + $pin = $this->faker->personalIdentityNumber(null, 'female'); + $this->assertEquals(0, $pin{9} % 2); + } +} From 7aa83a350088eb57b45d003a67dc223ee6ca535f Mon Sep 17 00:00:00 2001 From: oittaa Date: Fri, 7 Oct 2016 19:33:02 +0300 Subject: [PATCH 3/5] [Person.php] space after comma in function calls --- src/Faker/Provider/fi_FI/Person.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Faker/Provider/fi_FI/Person.php b/src/Faker/Provider/fi_FI/Person.php index 8059545278..90dabd80d7 100644 --- a/src/Faker/Provider/fi_FI/Person.php +++ b/src/Faker/Provider/fi_FI/Person.php @@ -116,7 +116,7 @@ public function personalIdentityNumber(\DateTime $birthdate = null, $gender = nu throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.'); } - $randomDigits = self::numberBetween(0,89); + $randomDigits = self::numberBetween(0, 89); if ($gender && $gender == static::GENDER_MALE) { if ($randomDigits === 0) { $randomDigits .= static::randomElement(array(3,5,7,9)); @@ -131,7 +131,7 @@ public function personalIdentityNumber(\DateTime $birthdate = null, $gender = nu } } else { if ($randomDigits === 0) { - $randomDigits .= self::numberBetween(2,9); + $randomDigits .= self::numberBetween(2, 9); } else { $randomDigits .= (string)static::numerify('#'); } From c699a02838510beca3b2bfa28d19631bceba5d4a Mon Sep 17 00:00:00 2001 From: oittaa Date: Fri, 7 Oct 2016 19:51:02 +0300 Subject: [PATCH 4/5] [readme.md] add fi_FI examples --- readme.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/readme.md b/readme.md index d2cd41ff51..a1daedf640 100644 --- a/readme.md +++ b/readme.md @@ -931,6 +931,27 @@ echo $faker->dni; // '77446565E' echo $faker->vat; // "A35864370" ``` +### `Faker\Provider\fi_FI\Payment` + +```php +bankAccountNumber; // "FI8350799879879616" +``` + +### `Faker\Provider\fi_FI\Person` + +```php +personalIdentityNumber() // '170974-007J' + +//Since the numbers are different for male and female persons, optionally you can specify gender. +echo $faker->personalIdentityNumber(\DateTime::createFromFormat('Y-m-d', '2015-12-14'), 'female') // '141215A520B' +``` + ### `Faker\Provider\fr_BE\Payment` ```php From 82da717fdbbdc97afb785b36811678afa1820f38 Mon Sep 17 00:00:00 2001 From: oittaa Date: Sat, 8 Oct 2016 19:14:04 +0300 Subject: [PATCH 5/5] [fi_FI/PersonTest.php] Check centuries separately --- test/Faker/Provider/fi_FI/PersonTest.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/test/Faker/Provider/fi_FI/PersonTest.php b/test/Faker/Provider/fi_FI/PersonTest.php index a4f868a6e8..6c77097e73 100644 --- a/test/Faker/Provider/fi_FI/PersonTest.php +++ b/test/Faker/Provider/fi_FI/PersonTest.php @@ -3,6 +3,7 @@ namespace Faker\Test\Provider\fi_FI; use Faker\Generator; +use Faker\Provider\DateTime; use Faker\Provider\fi_FI\Person; class PersonTest extends \PHPUnit_Framework_TestCase @@ -13,6 +14,7 @@ class PersonTest extends \PHPUnit_Framework_TestCase public function setUp() { $faker = new Generator(); + $faker->addProvider(new DateTime($faker)); $faker->addProvider(new Person($faker)); $this->faker = $faker; } @@ -41,9 +43,20 @@ public function testPersonalIdentityNumberUsesBirthDateIfProvided($seed, $birthd public function testPersonalIdentityNumberGeneratesCompliantNumbers() { - for ($i = 0; $i < 1000; $i++) { - $pin = $this->faker->personalIdentityNumber(); - $this->assertRegExp('/^[0-9]{6}[+\-A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/', $pin); + for ($i = 0; $i < 10; $i++) { + $birthdate = $this->faker->dateTimeBetween('1800-01-01 00:00:00', '1899-12-31 23:59:59'); + $pin = $this->faker->personalIdentityNumber($birthdate); + $this->assertRegExp('/^[0-9]{6}\+[0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/', $pin); + } + for ($i = 0; $i < 10; $i++) { + $birthdate = $this->faker->dateTimeBetween('1900-01-01 00:00:00', '1999-12-31 23:59:59'); + $pin = $this->faker->personalIdentityNumber($birthdate); + $this->assertRegExp('/^[0-9]{6}-[0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/', $pin); + } + for ($i = 0; $i < 10; $i++) { + $birthdate = $this->faker->dateTimeBetween('2000-01-01 00:00:00', '2099-12-31 23:59:59'); + $pin = $this->faker->personalIdentityNumber($birthdate); + $this->assertRegExp('/^[0-9]{6}A[0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/', $pin); } }