Автор Тема: Преверка валидност ЕИК (Булстат)  (Прочетена 8727 пъти)

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Тъй като ми се наложи да правя такава проверка, споделям кода за нея:
Код
GeSHi (PHP):
  1. function isValidEIK($eik)
  2. {
  3. if (!preg_match('/^(BG)?((\d{9})(\d{4})?)$/', $eik, $matches))
  4. return false;
  5.  
  6. //1*а1+2*а2+3*а3+4*а4+5*а5+6*а6+7*а7+8*а8;
  7. $a = $matches[3];
  8. $a9 = $a[0]*1 + $a[1]*2 + $a[2]*3 + $a[3]*4 + $a[4]*5 + $a[5]*6 + $a[6]*7 + $a[7]*8;
  9. $a9 = $a9 % 11;
  10.  
  11. if ($a9 == 10)
  12. {
  13. //3*а1+4*а2+5*а3+6*а4+7*а5+8*а6+9*а7+10*а8
  14. $a9 = $a[0]*3 + $a[1]*4 + $a[2]*5 + $a[3]*6 + $a[4]*7 + $a[5]*8 + $a[6]*9 + $a[7]*10;
  15. $a9 = $a9 % 11;
  16. }
  17.  
  18. $a9 = $a9 == 10 ? 0 : $a9;
  19.  
  20. if ($a9 != $a[8])
  21. return false;
  22. if (!isset($matches[4]))
  23. return true;
  24.  
  25. //2*а9 + 7*а10 + 3*а11 +5*а12
  26. $a = $matches[4];
  27. $a13 = $a9*2 + $a[0]*7 + $a[1]*3 + $a[2]*5;
  28. $a13 = $a13 % 11;
  29.  
  30. //4*а9+9*а10+5*а11+7*а12
  31. if ($a13 == 10)
  32. {
  33. $a13 = $a9*4 + $a[0]*9 + $a[1]*5 + $a[2]*7;
  34. $a13 = $a13 % 11;
  35. }
  36.  
  37. $a13 = $a13 == 10 ? 0 : $a13;
  38.  
  39. return ($a13 == $a[3]);
  40. }

Код
GeSHi (Javascript):
  1. function isValidEIK(v)
  2. {
  3. var matches;
  4. if (!(matches = v.match(/^(BG)?((\d{9})(\d{4})?)$/)))
  5. return false;
  6.  
  7. //1*а1+2*а2+3*а3+4*а4+5*а5+6*а6+7*а7+8*а8;
  8. var a = matches[3];
  9. var a9 = a[0]*1 + a[1]*2 + a[2]*3 + a[3]*4 + a[4]*5 + a[5]*6 + a[6]*7 + a[7]*8;
  10. a9 = a9 % 11;
  11.  
  12. if (a9 == 10)
  13. {
  14. //3*а1+4*а2+5*а3+6*а4+7*а5+8*а6+9*а7+10*а8
  15. a9 = a[0]*3 + a[1]*4 + a[2]*5 + a[3]*6 + a[4]*7 + a[5]*8 + a[6]*9 + a[7]*10;
  16. a9 = a9 % 11;
  17. }
  18.  
  19. a9 = a9 == 10 ? 0 : a9;
  20.  
  21. if (a9 != a[8])
  22. return false;
  23. if (!matches[4])
  24. return true;
  25.  
  26. //2*а9 + 7*а10 + 3*а11 +5*а12
  27. a = matches[4];
  28. var a13 = a9*2 + a[0]*7 + a[1]*3 + a[2]*5;
  29. a13 = a13 % 11;
  30.  
  31. //4*а9+9*а10+5*а11+7*а12
  32. if (a13 == 10)
  33. {
  34. a13 = a9*4 + a[0]*9 + a[1]*5 + a[2]*7;
  35. a13 = a13 % 11;
  36. }
  37.  
  38. a13 = a13 == 10 ? 0 : a13;
  39.  
  40. return (a13 == a[3]);
  41. }
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Преверка валидност ЕИК (Булстат)
« Отговор #1 -: Sep 11, 2015, 18:07 »
Проверка за валидност на Гръцките VAT-ове. Функцията е тествана с поне 10 различни номера. Гръцките номера са от вида EL123456789, като към функцията трябва да се подава само числото без префикса 'EL'.
На който му се търси допълнителна информация или числа за проба да търси в Гого с   'Α.Φ.Μ format' или ΑΦΜ  (като въпросното 'ΑΦΜ' са гръцки букви)


Код
GeSHi (PHP):
  1. function EL_VAT_Check($company_number)
  2. {
  3.  
  4. // short or longer number
  5. if (!preg_match('/^\d{9}$/', $company_number)) return false;
  6.  
  7. $total = 0;
  8. $multipliers = array(256,128,64,32,16,8,4,2);
  9.  
  10. // eight character numbers should be prefixed with an 0.
  11. // if (8 == strlen($company_number)) { $company_number = '0'.$company_number; }
  12.  
  13. // Extract the next digit and multiply by the counter.
  14. for ($i = 0; $i < 8; $i++)
  15. $total += $company_number[$i] * $multipliers[$i];
  16.  
  17. // Establish check digit.
  18. $total = $total % 11;
  19. if ($total > 9) { $total = 0; }
  20.  
  21. // Compare it with the last character of the VAT number. If it's the same, then it's valid.
  22. if ($total == $company_number[8])
  23. return true;
  24. else
  25. return false;
  26.  
  27. }
  28.  
« Последна редакция: Sep 11, 2015, 18:14 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: Преверка валидност ЕИК (Булстат)
« Отговор #2 -: Sep 11, 2015, 21:32 »
Добре де, без да се обиждаш, ама тая функция е безсмислена. Вместо да питам напастите за всякакви европи истински ли са, ще проверявам само гърчолята — „възможни ли са “, а не дали ги има на истинка.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Преверка валидност ЕИК (Булстат)
« Отговор #3 -: Sep 11, 2015, 22:18 »
Смисълът на тези функции е защита от неправилно въвеждане - чисто технически,  а не дали наистина съществува фирмата. Проверката дали съществува такава фирма се прави по други начини... С разговор по телефона,  търговски регистри,  live бд на регистрираните фирми и т.н. За какво мислиш всички тези булстати, егн-та имат контролни
 цифри? Точно заради неправилно въвеждане... За безобидни технически грешки. И проверките във всичките тези функции се прави точно по контролните цифри.

Например на мен сайта на VIES за бг фирмите не ми върши работа,  защото казва че са валидни само булстатите на регистрираните по ддс фирми. Ако въведеш в VIES булстат на реална бг фирма само че не регистрирана по ддс казва че няма такава фирма.  Е как да му вярваш.

 
« Последна редакция: Sep 12, 2015, 11:01 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

backinblack

  • Напреднали
  • *****
  • Публикации: 3201
    • Профил
Re: Преверка валидност ЕИК (Булстат)
« Отговор #4 -: Sep 12, 2015, 23:11 »
Операторските грешки никога не могат да се предвидят и спасението от тях е на съвсем друго място.
Активен