Skip to content
This repository has been archived by the owner on Dec 11, 2020. It is now read-only.

Commit

Permalink
Merge pull request #1053 from oittaa/patch-3
Browse files Browse the repository at this point in the history
Add personalIdentityNumber() to fi_FI/Person.php
  • Loading branch information
fzaninotto committed Dec 8, 2016
2 parents 71c5cce + 82da717 commit fc733e7
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 0 deletions.
21 changes: 21 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,27 @@ echo $faker->dni; // '77446565E'
echo $faker->vat; // "A35864370"
```

### `Faker\Provider\fi_FI\Payment`

```php
<?php

// Generates a random bank account number
echo $faker->bankAccountNumber; // "FI8350799879879616"
```

### `Faker\Provider\fi_FI\Person`

```php
<?php

//Generates a valid Finnish personal identity number (in Finnish - Henkilötunnus)
echo $faker->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
Expand Down
57 changes: 57 additions & 0 deletions src/Faker/Provider/fi_FI/Person.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
74 changes: 74 additions & 0 deletions test/Faker/Provider/fi_FI/PersonTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

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
{
/** @var Generator */
protected $faker;

public function setUp()
{
$faker = new Generator();
$faker->addProvider(new DateTime($faker));
$faker->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 < 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);
}
}

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);
}
}

0 comments on commit fc733e7

Please sign in to comment.