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

Commit 0e75a61

Browse files
authored
Merge pull request #1462 from aykutaras/master
Turkish identity number for tr_TR
2 parents a2ecb2f + 76dac50 commit 0e75a61

File tree

8 files changed

+255
-0
lines changed

8 files changed

+255
-0
lines changed

readme.md

+9
Original file line numberDiff line numberDiff line change
@@ -1610,6 +1610,15 @@ echo $faker->personalIdentityNumber() // '950910-0799'
16101610
//Since the numbers are different for male and female persons, optionally you can specify gender.
16111611
echo $faker->personalIdentityNumber('female') // '950910-0781'
16121612
```
1613+
### `Faker\Provider\tr_TR\Person`
1614+
1615+
```php
1616+
<?php
1617+
1618+
//Generates a valid Turkish identity number (in Turkish - T.C. Kimlik No)
1619+
echo $faker->tcNo // '55300634882'
1620+
1621+
```
16131622

16141623

16151624
### `Faker\Provider\zh_CN\Payment`

src/Faker/Calculator/TCNo.php

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace Faker\Calculator;
4+
5+
use InvalidArgumentException;
6+
7+
class TCNo
8+
{
9+
/**
10+
* Generates Turkish Identity Number Checksum
11+
* Gets first 9 digit as prefix and calcuates checksums
12+
*
13+
* https://en.wikipedia.org/wiki/Turkish_Identification_Number
14+
*
15+
* @param string $identityPrefix
16+
* @return string Checksum (two digit)
17+
*/
18+
public static function checksum($identityPrefix)
19+
{
20+
if (strlen((string)$identityPrefix) !== 9) {
21+
throw new InvalidArgumentException('Argument should be an integer and should be 9 digits.');
22+
}
23+
24+
$oddSum = 0;
25+
$evenSum = 0;
26+
27+
$identityArray = array_map('intval', str_split($identityPrefix)); // Creates array from int
28+
foreach ($identityArray as $index => $digit) {
29+
if ($index % 2 == 0) {
30+
$evenSum += $digit;
31+
} else {
32+
$oddSum += $digit;
33+
}
34+
}
35+
36+
$tenthDigit = (7 * $evenSum - $oddSum) % 10;
37+
$eleventhDigit = ($evenSum + $oddSum + $tenthDigit) % 10;
38+
39+
return $tenthDigit . $eleventhDigit;
40+
}
41+
42+
/**
43+
* Checks whether an TCNo has a valid checksum
44+
*
45+
* @param string $tcNo
46+
* @return boolean
47+
*/
48+
public static function isValid($tcNo)
49+
{
50+
return self::checksum(substr($tcNo, 0, -2)) === substr($tcNo, -2, 2);
51+
}
52+
}

src/Faker/Provider/tr_TR/Person.php

+15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Faker\Provider\tr_TR;
44

5+
use Faker\Calculator\TCNo;
6+
57
class Person extends \Faker\Provider\Person
68
{
79
/**
@@ -94,4 +96,17 @@ public static function titleFemale()
9496
{
9597
return static::titleMale();
9698
}
99+
100+
/**
101+
* National Personal Identity number (tc kimlik no)
102+
* @link https://en.wikipedia.org/wiki/Turkish_Identification_Number
103+
* @return string on format XXXXXXXXXXX
104+
*/
105+
public function tcNo()
106+
{
107+
$randomDigits = static::numerify('#########');
108+
$checksum = TCNo::checksum($randomDigits);
109+
110+
return $randomDigits . $checksum;
111+
}
97112
}

test/Faker/Calculator/TCNoTest.php

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Faker\Test\Calculator;
4+
5+
use Faker\Calculator\TCNo;
6+
use PHPUnit\Framework\TestCase;
7+
8+
class TCNoTest extends TestCase
9+
{
10+
public function checksumProvider()
11+
{
12+
return array(
13+
array('553006348', '82'),
14+
array('350630743', '78'),
15+
array('550600932', '88'),
16+
array('487932947', '70'),
17+
array('168113862', '40')
18+
);
19+
}
20+
21+
/**
22+
* @dataProvider checksumProvider
23+
* @param $tcNo
24+
* @param $checksum
25+
*/
26+
public function testChecksum($tcNo, $checksum)
27+
{
28+
$this->assertEquals($checksum, TCNo::checksum($tcNo), $tcNo);
29+
}
30+
31+
public function validatorProvider()
32+
{
33+
return array(
34+
array('22978160678', true),
35+
array('26480045324', true),
36+
array('47278360658', true),
37+
array('34285002510', true),
38+
array('19874561012', true),
39+
40+
array('11111111111', false),
41+
array('11234567899', false),
42+
);
43+
}
44+
45+
/**
46+
* @dataProvider validatorProvider
47+
* @param $tcNo
48+
* @param $isValid
49+
*/
50+
public function testIsValid($tcNo, $isValid)
51+
{
52+
$this->assertEquals($isValid, TCNo::isValid($tcNo), $tcNo);
53+
}
54+
}
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Faker\Test\Provider\tr_TR;
4+
5+
use Faker\Provider\tr_TR\Company;
6+
use Faker\Generator;
7+
8+
class CompanyTest extends \PHPUnit_Framework_TestCase
9+
{
10+
11+
/**
12+
* @var Generator
13+
*/
14+
private $faker;
15+
16+
public function setUp()
17+
{
18+
$faker = new Generator();
19+
$faker->addProvider(new Company($faker));
20+
$this->faker = $faker;
21+
}
22+
23+
public function testCompany()
24+
{
25+
$company = $this->faker->companyField;
26+
$this->assertNotNull($company);
27+
}
28+
}
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
4+
namespace Faker\Provider\tr_TR;
5+
6+
use Faker\Generator;
7+
use PHPUnit\Framework\TestCase;
8+
9+
class PaymentTest extends TestCase
10+
{
11+
/**
12+
* @var Generator
13+
*/
14+
private $faker;
15+
16+
public function setUp()
17+
{
18+
$faker = new Generator();
19+
$faker->addProvider(new Payment($faker));
20+
$this->faker = $faker;
21+
}
22+
23+
public function testBankAccountNumber()
24+
{
25+
$accNo = $this->faker->bankAccountNumber;
26+
$this->assertEquals(substr($accNo, 0, 2), 'TR');
27+
$this->assertEquals(26, strlen($accNo));
28+
}
29+
}
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Faker\Test\Provider\tr_TR;
4+
5+
use Faker\Calculator\TCNo;
6+
use Faker\Provider\tr_TR\Person;
7+
use Faker\Generator;
8+
use PHPUnit\Framework\TestCase;
9+
10+
class PersonTest extends TestCase
11+
{
12+
13+
/**
14+
* @var Generator
15+
*/
16+
private $faker;
17+
18+
public function setUp()
19+
{
20+
$faker = new Generator();
21+
$faker->addProvider(new Person($faker));
22+
$this->faker = $faker;
23+
}
24+
25+
public function testTCNo()
26+
{
27+
for ($i = 0; $i < 100; $i++) {
28+
$number = $this->faker->tcNo;
29+
30+
$this->assertEquals(11, strlen($number));
31+
$this->assertTrue(TCNo::isValid($number));
32+
}
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Faker\Test\Provider\tr_TR;
4+
5+
use Faker\Generator;
6+
use Faker\Provider\tr_TR\PhoneNumber;
7+
use PHPUnit\Framework\TestCase;
8+
9+
class PhoneNumberTest extends TestCase
10+
{
11+
12+
/**
13+
* @var Generator
14+
*/
15+
private $faker;
16+
17+
public function setUp()
18+
{
19+
$faker = new Generator();
20+
$faker->addProvider(new PhoneNumber($faker));
21+
$this->faker = $faker;
22+
}
23+
24+
public function testPhoneNumber()
25+
{
26+
for ($i = 0; $i < 100; $i++) {
27+
$number = $this->faker->phoneNumber;
28+
$baseNumber = preg_replace('/ *x.*$/', '', $number); // Remove possible extension
29+
$digits = array_values(array_filter(str_split($baseNumber), 'ctype_digit'));
30+
31+
$this->assertGreaterThan(10, count($digits));
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)