cnp.sf 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # License: GPLv3
  4. # Date: 14th November 2013
  5. # https://trizenx.blogspot.com
  6. # First argument (if defined) or default CNP
  7. var cnp = (ARGV[0] \\ '2940823432049');
  8. # Should have length() == 13
  9. cnp.len == 13 ||
  10. die "Invalid CNP: trebuie să conțină exact 13 caractere!\n";
  11. # Should not contains non-digits
  12. cnp ~~ /[^0-9]/ &&
  13. die "Invalid CNP: trebuie să conțină doar numere!\n";
  14. # Transform it into an array of numbers
  15. cnp.chars!.map!{Num(_)}
  16. var years = :(
  17. 1 => :(era => 1900),
  18. 2 => :(era => 1900),
  19. 3 => :(era => 1800),
  20. 4 => :(era => 1800),
  21. 5 => :(era => 2000),
  22. 6 => :(era => 2000),
  23. 7 => :(
  24. era => 0,
  25. cet => "Străin rezident în România",
  26. ),
  27. 8 => :(
  28. era => 0,
  29. cet => "Străin rezident în România",
  30. ),
  31. 9 => :(
  32. era => 0,
  33. cet => "Persoană străină",
  34. ),
  35. );
  36. var juds = :(
  37. '01' => 'Alba',
  38. '02' => 'Arad',
  39. '03' => 'Argeș',
  40. '04' => 'Bacău',
  41. '05' => 'Bihor',
  42. '06' => 'Bistrița-Năsăud',
  43. '07' => 'Botoșani',
  44. '08' => 'Brașov',
  45. '09' => 'Brăila',
  46. '10' => 'Buzău',
  47. '11' => 'Caraș-Severin',
  48. '12' => 'Cluj',
  49. '13' => 'Constanța',
  50. '14' => 'Covasna',
  51. '15' => 'Dâmbovița',
  52. '16' => 'Dolj',
  53. '17' => 'Galați',
  54. '18' => 'Gorj',
  55. '19' => 'Harghita',
  56. '20' => 'Hunedoara',
  57. '21' => 'Ialomița',
  58. '22' => 'Iași',
  59. '23' => 'Ilfov',
  60. '24' => 'Maramureș',
  61. '25' => 'Mehedinți',
  62. '26' => 'Mureș',
  63. '27' => 'Neamț',
  64. '28' => 'Olt',
  65. '29' => 'Prahova',
  66. '30' => 'Satu Mare',
  67. '31' => 'Sălaj',
  68. '32' => 'Sibiu',
  69. '33' => 'Suceava',
  70. '34' => 'Teleorman',
  71. '35' => 'Timiș',
  72. '36' => 'Tulcea',
  73. '37' => 'Vaslui',
  74. '38' => 'Vâlcea',
  75. '39' => 'Vrancea',
  76. '40' => 'București',
  77. '41' => 'București S.1',
  78. '42' => 'București S.2',
  79. '43' => 'București S.3',
  80. '44' => 'București S.4',
  81. '45' => 'București S.5',
  82. '46' => 'București S.6',
  83. '51' => 'Călărași',
  84. '52' => 'Giurgiu',
  85. );
  86. var months = %w(
  87. Ianuarie
  88. Februarie
  89. Martie
  90. Aprilie
  91. Mai
  92. Iunie
  93. Iulie
  94. August
  95. Septembrie
  96. Octombrie
  97. Noiembrie
  98. Decembrie
  99. );
  100. (var days = Hash()){months...} = (
  101. 31,
  102. 29,
  103. 31,
  104. 30,
  105. 31,
  106. 30,
  107. 31,
  108. 31,
  109. 30,
  110. 31,
  111. 30,
  112. 31,
  113. );
  114. var magic = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
  115. var sum = 0;
  116. magic.range.each { |i|
  117. sum += magic[i]*cnp[i];
  118. }
  119. var cc = (sum % 11);
  120. cc == 10 && (cc = 1);
  121. if (cc != cnp[-1]) {
  122. "Cifra de control e incorectă!\n".die;
  123. }
  124. var year = (cnp[1]*10 + cnp[2]);
  125. var month = (cnp[3]*10 + cnp[4]);
  126. var day = (cnp[5]*10 + cnp[6]);
  127. var jud = "%02d".sprintf(cnp[7]*10 + cnp[8]);
  128. var nationality = "Română";
  129. var era = years{cnp[0]}{:era};
  130. var current = Time.local;
  131. if (era == 0) {
  132. era = [1900, 2000][year < (current.year - 2000)];
  133. nationality = years{cnp[0]}{:cet};
  134. }
  135. var birth_year = (year + era);
  136. var month_name = months[month-1];
  137. if (day > days{month_name} || (day < 1)) {
  138. "Ziua de naștere e invalidă!\n".die;
  139. }
  140. if (!juds.exists(jud)) {
  141. "Codul județului e invalid!\n".die
  142. }
  143. if (month == 2 && (day == 29)) {
  144. if (!(birth_year % 400 == 0 || (birth_year % 4 == 0 && (birth_year % 100 != 0)))) {
  145. "Anul #{birth_year} nu a fost un an bisect!\n".die;
  146. }
  147. }
  148. var age = (current.year - birth_year);
  149. if (current.month < month || (month == current.month && (day < current.day))) {
  150. age--;
  151. }
  152. print (<<'EOT' + <<EOT + <<"EOF");
  153. ==============================
  154. EOT
  155. Data Nașterii: #{day} #{month_name} #{birth_year}
  156. Cetațenie: #{nationality}
  157. Sexul: #{cnp[0] == 9 ? "Necunoscut" : ["Feminin", "Masculin"][cnp[0] % 2]}
  158. Vârsta: #{age}
  159. Județul: #{juds{jud}}
  160. EOT
  161. ==============================
  162. EOF