Skip to content

Commit 3300e81

Browse files
committed
Egn::is_foreigner() method: Making it more precise.
Signed-off-by:Ivan Tcholakov <[email protected]>
1 parent 1efac43 commit 3300e81

File tree

1 file changed

+53
-32
lines changed

1 file changed

+53
-32
lines changed

Egn.php

Lines changed: 53 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,34 +48,34 @@ class Egn {
4848
protected static $EGN_WEIGHTS = array(2, 4, 8, 5, 10, 9, 7, 3, 6);
4949

5050
protected static $EGN_REGIONS = array(
51-
'Благоевград' => 43, /* от 000 до 043 */
52-
'Бургас' => 93, /* от 044 до 093 */
53-
'Варна' => 139, /* от 094 до 139 */
54-
'Велико Търново' => 169, /* от 140 до 169 */
55-
'Видин' => 183, /* от 170 до 183 */
56-
'Враца' => 217, /* от 184 до 217 */
57-
'Габрово' => 233, /* от 218 до 233 */
58-
'Кърджали' => 281, /* от 234 до 281 */
59-
'Кюстендил' => 301, /* от 282 до 301 */
60-
'Ловеч' => 319, /* от 302 до 319 */
61-
'Монтана' => 341, /* от 320 до 341 */
62-
'Пазарджик' => 377, /* от 342 до 377 */
63-
'Перник' => 395, /* от 378 до 395 */
64-
'Плевен' => 435, /* от 396 до 435 */
65-
'Пловдив' => 501, /* от 436 до 501 */
66-
'Разград' => 527, /* от 502 до 527 */
67-
'Русе' => 555, /* от 528 до 555 */
68-
'Силистра' => 575, /* от 556 до 575 */
69-
'Сливен' => 601, /* от 576 до 601 */
70-
'Смолян' => 623, /* от 602 до 623 */
71-
'София - град' => 721, /* от 624 до 721 */
72-
'София - окръг' => 751, /* от 722 до 751 */
73-
'Стара Загора' => 789, /* от 752 до 789 */
74-
'Добрич (Толбухин)' => 821, /* от 790 до 821 */
75-
'Търговище' => 843, /* от 822 до 843 */
76-
'Хасково' => 871, /* от 844 до 871 */
77-
'Шумен' => 903, /* от 872 до 903 */
78-
'Ямбол' => 925, /* от 904 до 925 */
51+
'Благоевград' => 43, /* от 000 до 043 */
52+
'Бургас' => 93, /* от 044 до 093 */
53+
'Варна' => 139, /* от 094 до 139 */
54+
'Велико Търново' => 169, /* от 140 до 169 */
55+
'Видин' => 183, /* от 170 до 183 */
56+
'Враца' => 217, /* от 184 до 217 */
57+
'Габрово' => 233, /* от 218 до 233 */
58+
'Кърджали' => 281, /* от 234 до 281 */
59+
'Кюстендил' => 301, /* от 282 до 301 */
60+
'Ловеч' => 319, /* от 302 до 319 */
61+
'Монтана' => 341, /* от 320 до 341 */
62+
'Пазарджик' => 377, /* от 342 до 377 */
63+
'Перник' => 395, /* от 378 до 395 */
64+
'Плевен' => 435, /* от 396 до 435 */
65+
'Пловдив' => 501, /* от 436 до 501 */
66+
'Разград' => 527, /* от 502 до 527 */
67+
'Русе' => 555, /* от 528 до 555 */
68+
'Силистра' => 575, /* от 556 до 575 */
69+
'Сливен' => 601, /* от 576 до 601 */
70+
'Смолян' => 623, /* от 602 до 623 */
71+
'София - град' => 721, /* от 624 до 721 */
72+
'София - окръг' => 751, /* от 722 до 751 */
73+
'Стара Загора' => 789, /* от 752 до 789 */
74+
'Добрич (Толбухин)' => 821, /* от 790 до 821 */
75+
'Търговище' => 843, /* от 822 до 843 */
76+
'Хасково' => 871, /* от 844 до 871 */
77+
'Шумен' => 903, /* от 872 до 903 */
78+
'Ямбол' => 925, /* от 904 до 925 */
7979
'Друг/Неизвестен' => 999, /* от 926 до 999 - Такъв регион понякога се ползва при
8080
родени преди 1900, за родени в чужбина
8181
или ако в даден регион се родят повече
@@ -367,17 +367,38 @@ public static function get_birthday($string) {
367367

368368
/* Is it a personal number of foreigner? A simple check. */
369369
public static function is_foreigner($string) {
370-
371-
if (strlen($string) > 3) {
372370

373-
if (substr($string, 0, 2) == '10') {
371+
if (!ctype_digit($string)) {
372+
return false;
373+
}
374+
375+
if (strlen($string) == 10) {
376+
377+
$pnf_weights = array(21, 19, 17, 13, 11, 9, 7, 3, 1);
378+
379+
$checksum = substr($string, 9, 1);
380+
$pnfsum = 0;
381+
382+
for ($i = 0; $i < 9; $i++) {
383+
$pnfsum += substr($string, $i, 1) * $pnf_weights[$i];
384+
}
385+
386+
$valid_checksum = $pnfsum % 10;
387+
388+
if ($checksum == $valid_checksum) {
374389
return true;
375390
}
376391

377-
// Added by Ivan Tcholakov, 09-SEP-2011.
392+
return false;
393+
}
394+
395+
if (strlen($string) == 11) {
396+
378397
if (substr($string, 0, 3) == '229') {
379398
return true;
380399
}
400+
401+
return false;
381402
}
382403

383404
return false;

0 commit comments

Comments
 (0)