identified 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/data/ssn/area_data.txt +58 -0
  3. data/data/ssn/area_data_raw.txt +66 -0
  4. data/data/ssn/high_groups/april_2004_raw.txt +145 -0
  5. data/data/ssn/high_groups/april_2005_raw.txt +138 -0
  6. data/data/ssn/high_groups/april_2006_raw.txt +140 -0
  7. data/data/ssn/high_groups/april_2007_raw.txt +141 -0
  8. data/data/ssn/high_groups/april_2008_raw.txt +141 -0
  9. data/data/ssn/high_groups/april_2009_raw.txt +140 -0
  10. data/data/ssn/high_groups/april_2010_raw.txt +140 -0
  11. data/data/ssn/high_groups/april_2011_raw.txt +141 -0
  12. data/data/ssn/high_groups/august_2004_raw.txt +137 -0
  13. data/data/ssn/high_groups/august_2005_raw.txt +139 -0
  14. data/data/ssn/high_groups/august_2006_raw.txt +140 -0
  15. data/data/ssn/high_groups/august_2007_raw.txt +141 -0
  16. data/data/ssn/high_groups/august_2008_raw.txt +141 -0
  17. data/data/ssn/high_groups/august_2009_raw.txt +140 -0
  18. data/data/ssn/high_groups/august_2010_raw.txt +141 -0
  19. data/data/ssn/high_groups/december_2003_raw.txt +138 -0
  20. data/data/ssn/high_groups/december_2004_raw.txt +138 -0
  21. data/data/ssn/high_groups/december_2005_raw.txt +140 -0
  22. data/data/ssn/high_groups/december_2006_raw.txt +140 -0
  23. data/data/ssn/high_groups/december_2007_raw.txt +141 -0
  24. data/data/ssn/high_groups/december_2008_raw.txt +141 -0
  25. data/data/ssn/high_groups/december_2009_raw.txt +140 -0
  26. data/data/ssn/high_groups/december_2010_raw.txt +141 -0
  27. data/data/ssn/high_groups/february_2004_raw.txt +137 -0
  28. data/data/ssn/high_groups/february_2005_raw.txt +138 -0
  29. data/data/ssn/high_groups/february_2006_raw.txt +140 -0
  30. data/data/ssn/high_groups/february_2007_raw.txt +141 -0
  31. data/data/ssn/high_groups/february_2008_raw.txt +141 -0
  32. data/data/ssn/high_groups/february_2009_raw.txt +140 -0
  33. data/data/ssn/high_groups/february_2010_raw.txt +140 -0
  34. data/data/ssn/high_groups/february_2011_raw.txt +141 -0
  35. data/data/ssn/high_groups/january_2004_raw.txt +137 -0
  36. data/data/ssn/high_groups/january_2005_raw.txt +138 -0
  37. data/data/ssn/high_groups/january_2006_raw.txt +140 -0
  38. data/data/ssn/high_groups/january_2007_raw.txt +141 -0
  39. data/data/ssn/high_groups/january_2008_raw.txt +141 -0
  40. data/data/ssn/high_groups/january_2009_raw.txt +141 -0
  41. data/data/ssn/high_groups/january_2010_raw.txt +140 -0
  42. data/data/ssn/high_groups/january_2011_raw.txt +141 -0
  43. data/data/ssn/high_groups/july_2004_raw.txt +137 -0
  44. data/data/ssn/high_groups/july_2005_raw.txt +139 -0
  45. data/data/ssn/high_groups/july_2006_raw.txt +140 -0
  46. data/data/ssn/high_groups/july_2007_raw.txt +141 -0
  47. data/data/ssn/high_groups/july_2008_raw.txt +141 -0
  48. data/data/ssn/high_groups/july_2009_raw.txt +140 -0
  49. data/data/ssn/high_groups/july_2010_raw.txt +141 -0
  50. data/data/ssn/high_groups/june_2004_raw.txt +137 -0
  51. data/data/ssn/high_groups/june_2005_raw.txt +139 -0
  52. data/data/ssn/high_groups/june_2006_raw.txt +140 -0
  53. data/data/ssn/high_groups/june_2007_raw.txt +141 -0
  54. data/data/ssn/high_groups/june_2008_raw.txt +141 -0
  55. data/data/ssn/high_groups/june_2009_raw.txt +140 -0
  56. data/data/ssn/high_groups/june_2010_raw.txt +141 -0
  57. data/data/ssn/high_groups/june_2011_raw.txt +141 -0
  58. data/data/ssn/high_groups/june_24_2011_raw.txt +141 -0
  59. data/data/ssn/high_groups/march_2004_raw.txt +137 -0
  60. data/data/ssn/high_groups/march_2005_raw.txt +138 -0
  61. data/data/ssn/high_groups/march_2006_raw.txt +140 -0
  62. data/data/ssn/high_groups/march_2007_raw.txt +141 -0
  63. data/data/ssn/high_groups/march_2008_raw.txt +141 -0
  64. data/data/ssn/high_groups/march_2009_raw.txt +140 -0
  65. data/data/ssn/high_groups/march_2010_raw.txt +140 -0
  66. data/data/ssn/high_groups/march_2011_raw.txt +141 -0
  67. data/data/ssn/high_groups/may_2004_raw.txt +137 -0
  68. data/data/ssn/high_groups/may_2005_raw.txt +139 -0
  69. data/data/ssn/high_groups/may_2006_raw.txt +140 -0
  70. data/data/ssn/high_groups/may_2007_raw.txt +141 -0
  71. data/data/ssn/high_groups/may_2008_raw.txt +141 -0
  72. data/data/ssn/high_groups/may_2009_raw.txt +140 -0
  73. data/data/ssn/high_groups/may_2010_raw.txt +140 -0
  74. data/data/ssn/high_groups/may_2011_raw.txt +141 -0
  75. data/data/ssn/high_groups/november_2003_raw.txt +138 -0
  76. data/data/ssn/high_groups/november_2004_raw.txt +137 -0
  77. data/data/ssn/high_groups/november_2005_raw.txt +140 -0
  78. data/data/ssn/high_groups/november_2006_raw.txt +140 -0
  79. data/data/ssn/high_groups/november_2007_raw.txt +141 -0
  80. data/data/ssn/high_groups/november_2008_raw.txt +141 -0
  81. data/data/ssn/high_groups/november_2009_raw.txt +140 -0
  82. data/data/ssn/high_groups/november_2010_raw.txt +142 -0
  83. data/data/ssn/high_groups/october_2004_raw.txt +137 -0
  84. data/data/ssn/high_groups/october_2005_raw.txt +139 -0
  85. data/data/ssn/high_groups/october_2006_raw.txt +140 -0
  86. data/data/ssn/high_groups/october_2007_raw.txt +141 -0
  87. data/data/ssn/high_groups/october_2008_raw.txt +141 -0
  88. data/data/ssn/high_groups/october_2009_raw.txt +140 -0
  89. data/data/ssn/high_groups/october_2010_raw.txt +141 -0
  90. data/data/ssn/high_groups/september_2004_raw.txt +137 -0
  91. data/data/ssn/high_groups/september_2005_raw.txt +139 -0
  92. data/data/ssn/high_groups/september_2006_raw.txt +140 -0
  93. data/data/ssn/high_groups/september_2007_raw.txt +141 -0
  94. data/data/ssn/high_groups/september_2008_raw.txt +141 -0
  95. data/data/ssn/high_groups/september_2009_raw.txt +141 -0
  96. data/data/ssn/high_groups/september_2010_raw.txt +141 -0
  97. data/lib/identified.rb +24 -0
  98. data/lib/identified/errors/error.rb +5 -0
  99. data/lib/identified/errors/ssn/malformed_ssn_error.rb +5 -0
  100. data/lib/identified/ssn/area_number.rb +15 -0
  101. data/lib/identified/ssn/group_number.rb +27 -0
  102. data/lib/identified/ssn/high_group_data.rb +27 -0
  103. data/lib/identified/ssn/high_group_list.rb +48 -0
  104. data/lib/identified/ssn/issuing_state_data.rb +44 -0
  105. data/lib/identified/ssn/sequential_group_number.rb +43 -0
  106. data/lib/identified/ssn/serial_number.rb +10 -0
  107. data/lib/identified/ssn/ssn.rb +74 -0
  108. metadata +150 -0
@@ -0,0 +1,141 @@
1
+
2
+ HIGHEST GROUP ISSUED AS OF 06/24/11
3
+
4
+ Anything with an asterisk(*) is a change effective 06/24/11.
5
+ This list shows the SSN area and group numbers that are in
6
+ the process of being issued as of the date at the top of this page.
7
+
8
+ NOTE: * INDICATES GROUP CHANGE SINCE LAST MONTH.
9
+
10
+ 001 11 002 11 003 08 004 13 005 13* 006 11
11
+ 007 11 008 94 009 94* 010 94 011 94 012 94
12
+ 013 94 014 94 015 94 016 94 017 94 018 94
13
+ 019 94 020 94 021 94* 022 92 023 92 024 92
14
+ 025 92 026 92 027 92 028 92 029 92 030 92
15
+ 031 92 032 92 033 92 034 92 035 74 036 74
16
+ 037 74 038 74 039 74 040 15 041 15 042 15
17
+ 043 15 044 15 045 15 046 15 047 15 048 15
18
+ 049 15* 050 02 051 02 052 02 053 02 054 02
19
+ 055 02 056 02 057 02 058 02 059 02 060 02
20
+ 061 02 062 02 063 02 064 02 065 02 066 02
21
+ 067 02 068 02 069 02 070 02 071 02 072 02
22
+ 073 02 074 02 075 02 076 02 077 02 078 02
23
+ 079 02 080 02 081 02 082 02 083 02 084 02
24
+ 085 02 086 02 087 02 088 02 089 02 090 02
25
+ 091 02 092 02 093 02 094 02 095 02 096 02
26
+ 097 02 098 02 099 02 100 02 101 02 102 02
27
+ 103 02* 104 02* 105 02* 106 98 107 98 108 98
28
+ 109 98 110 98 111 98 112 98 113 98 114 98
29
+ 115 98 116 98 117 98 118 98 119 98 120 98
30
+ 121 98 122 98 123 98 124 98 125 98 126 98
31
+ 127 98 128 98 129 98 130 98 131 98 132 98
32
+ 133 98 134 98 135 25 136 25 137 25 138 25*
33
+ 139 23 140 23 141 23 142 23 143 23 144 23
34
+ 145 23 146 23 147 23 148 23 149 23 150 23
35
+ 151 23 152 23 153 23 154 23 155 23 156 23
36
+ 157 23 158 23 159 86 160 86 161 86 162 86
37
+ 163 86 164 86 165 86 166 86 167 86 168 86
38
+ 169 86 170 86 171 86 172 86 173 86 174 86
39
+ 175 86 176 86 177 86 178 86 179 86 180 86
40
+ 181 86 182 86 183 86 184 86 185 86 186 86
41
+ 187 86 188 86 189 86 190 86 191 86 192 86
42
+ 193 86 194 86 195 86* 196 84 197 84 198 84
43
+ 199 84 200 84 201 84 202 84 203 84 204 84
44
+ 205 84 206 84 207 84 208 84 209 84 210 84
45
+ 211 84 212 91 213 91 214 91 215 91* 216 89
46
+ 217 89 218 89 219 89 220 89 221 13 222 11
47
+ 223 99 224 99 225 99 226 99 227 99 228 99
48
+ 229 99 230 99 231 99 232 57 233 57 234 57
49
+ 235 57* 236 55 237 99 238 99 239 99 240 99
50
+ 241 99 242 99 243 99 244 99 245 99 246 99
51
+ 247 99 248 99 249 99 250 99 251 99 252 99
52
+ 253 99 254 99 255 99 256 99 257 99 258 99
53
+ 259 99 260 99 261 99 262 99 263 99 264 99
54
+ 265 99 266 99 267 99 268 17 269 17 270 17
55
+ 271 17 272 17 273 17 274 17 275 17 276 17
56
+ 277 17 278 17* 279 15 280 15 281 15 282 15
57
+ 283 15 284 15 285 15 286 15 287 15 288 15
58
+ 289 15 290 15 291 15 292 15 293 15 294 15
59
+ 295 15 296 15 297 15 298 15 299 15 300 15
60
+ 301 15 302 15 303 37 304 37 305 37 306 37
61
+ 307 37 308 37 309 37 310 37 311 35 312 35
62
+ 313 35 314 35 315 35 316 35 317 35 318 11
63
+ 319 11 320 11 321 11 322 11 323 11 324 11
64
+ 325 11 326 11 327 11 328 11 329 11 330 11
65
+ 331 11 332 11 333 11 334 11 335 11 336 11
66
+ 337 11 338 11 339 11 340 11 341 11 342 11
67
+ 343 11 344 11 345 11* 346 08 347 08 348 08
68
+ 349 08 350 08 351 08 352 08 353 08 354 08
69
+ 355 08 356 08 357 08 358 08 359 08 360 08
70
+ 361 08 362 39 363 39 364 39 365 39 366 39
71
+ 367 39 368 39 369 39* 370 37 371 37 372 37
72
+ 373 37 374 37 375 37 376 37 377 37 378 37
73
+ 379 37 380 37 381 37 382 37 383 37 384 37
74
+ 385 37 386 37 387 33 388 33 389 33 390 33
75
+ 391 33 392 33 393 33 394 33 395 33 396 33
76
+ 397 33 398 31 399 31 400 73 401 73 402 73
77
+ 403 73 404 73 405 73 406 73 407 73 408 99
78
+ 409 99 410 99 411 99 412 99 413 99 414 99
79
+ 415 99 416 67 417 67 418 67 419 67 420 67
80
+ 421 67 422 67 423 67 424 65 425 99 426 99
81
+ 427 99 428 99 429 99 430 99 431 99 432 99
82
+ 433 99 434 99 435 99 436 99 437 99 438 99
83
+ 439 99 440 29 441 29 442 29* 443 27 444 27
84
+ 445 27 446 27 447 27 448 27 449 99 450 99
85
+ 451 99 452 99 453 99 454 99 455 99 456 99
86
+ 457 99 458 99 459 99 460 99 461 99 462 99
87
+ 463 99 464 99 465 99 466 99 467 99 468 57
88
+ 469 57 470 57 471 57 472 57* 473 55 474 55
89
+ 475 55 476 55 477 55 478 43* 479 41 480 41
90
+ 481 41 482 41 483 41 484 41 485 41 486 29
91
+ 487 29 488 29 489 29 490 29 491 29 492 29
92
+ 493 29 494 29 495 29 496 29 497 29 498 29
93
+ 499 29 500 29* 501 37 502 37 503 45 504 45
94
+ 505 59 506 57 507 57 508 57 509 33 510 33
95
+ 511 33 512 33* 513 31 514 31 515 31 516 49
96
+ 517 49 518 89 519 87 520 61 521 99 522 99
97
+ 523 99 524 99 525 99 526 99 527 99 528 99
98
+ 529 99 530 99 531 71 532 71 533 71 534 71
99
+ 535 71 536 71 537 71 538 71 539 71* 540 83
100
+ 541 83* 542 81 543 81 544 81 545 99 546 99
101
+ 547 99 548 99 549 99 550 99 551 99 552 99
102
+ 553 99 554 99 555 99 556 99 557 99 558 99
103
+ 559 99 560 99 561 99 562 99 563 99 564 99
104
+ 565 99 566 99 567 99 568 99 569 99 570 99
105
+ 571 99 572 99 573 99 574 61 575 99 576 99
106
+ 577 53 578 53 579 53 580 41* 581 99 582 99
107
+ 583 99 584 99 585 99 586 67 587 99 588 09
108
+ 589 99 590 99 591 99 592 99 593 99 594 99
109
+ 595 99 596 94* 597 92 598 92 599 92 600 99
110
+ 601 99 602 87 603 87 604 87 605 87 606 87
111
+ 607 87 608 87 609 87 610 87 611 87 612 87
112
+ 613 87 614 87 615 87* 616 87* 617 87* 618 87*
113
+ 619 87* 620 85 621 85 622 85 623 85 624 85
114
+ 625 85 626 85 627 31 628 31 629 31 630 31
115
+ 631 31 632 31 633 31 634 31* 635 31* 636 31*
116
+ 637 29 638 29 639 29 640 29 641 29 642 29
117
+ 643 29 644 29 645 29 646 23 647 21 648 58
118
+ 649 56 650 62 651 62 652 62 653 60 654 38
119
+ 655 36 656 36 657 36 658 36 659 24 660 24*
120
+ 661 22 662 22 663 22 664 22 665 22 667 48
121
+ 668 48 669 48 670 48 671 48 672 48 673 48
122
+ 674 48 675 48* 676 22 677 22 678 22* 679 20
123
+ 680 31 681 24 682 24 683 24 684 24 685 24
124
+ 686 24 687 24 688 24 689 24* 690 22 691 18
125
+ 692 18* 693 16 694 16 695 16 696 16 697 16
126
+ 698 16 699 16 700 18 701 18 702 18 703 18
127
+ 704 18 705 18 706 18 707 18 708 18 709 18
128
+ 710 18 711 18 712 18 713 18 714 18 715 18
129
+ 716 18 717 18 718 18 719 18 720 18 721 18
130
+ 722 18 723 18 724 28 725 18 726 18 727 10
131
+ 728 14 729 28 730 28 731 28 732 28* 733 26
132
+ 750 20 751 18 752 09 753 07 754 07 755 07
133
+ 756 12 757 12 758 12 759 12 760 12 761 12
134
+ 762 12 763 12 764 29* 765 27 766 04* 767 02
135
+ 768 02 769 02 770 02 771 02 772 02*
136
+
137
+
138
+
139
+
140
+
141
+
@@ -0,0 +1,141 @@
1
+
2
+ HIGHEST GROUP ISSUED AS OF 09/01/10
3
+
4
+ Anything with an asterisk(*) is a change effective 09/01/10.
5
+ This list shows the SSN area and group numbers that are in
6
+ the process of being issued as of the date at the top of this page.
7
+
8
+ NOTE: * INDICATES GROUP CHANGE SINCE LAST MONTH.
9
+
10
+ 001 11 002 08 003 08 004 11 005 11 006 11
11
+ 007 11 008 94 009 92 010 94 011 94 012 94*
12
+ 013 92 014 92 015 92 016 92 017 92 018 92
13
+ 019 92 020 92 021 92 022 92 023 92 024 92
14
+ 025 92 026 92 027 92 028 92 029 92 030 92
15
+ 031 92 032 92 033 92 034 92 035 74 036 74
16
+ 037 74 038 74 039 72 040 15 041 15 042 15
17
+ 043 15 044 15 045 13 046 13 047 13 048 13
18
+ 049 13 050 02 051 02 052 02 053 02 054 02
19
+ 055 02 056 02 057 02 058 02 059 02 060 02
20
+ 061 02 062 02 063 02 064 02 065 02 066 02
21
+ 067 02 068 02* 069 02* 070 02* 071 98 072 98
22
+ 073 98 074 98 075 98 076 98 077 98 078 98
23
+ 079 98 080 98 081 98 082 98 083 98 084 98
24
+ 085 98 086 98 087 98 088 98 089 98 090 98
25
+ 091 98 092 98 093 98 094 98 095 98 096 98
26
+ 097 98 098 98 099 98 100 98 101 98 102 98
27
+ 103 98 104 98 105 98 106 98 107 98 108 98
28
+ 109 98 110 98 111 98 112 98 113 98 114 98
29
+ 115 98 116 98 117 98 118 98 119 98 120 98
30
+ 121 98 122 98 123 98 124 98 125 98 126 98
31
+ 127 98 128 98 129 98 130 98 131 98 132 98
32
+ 133 98 134 98 135 23 136 23 137 23 138 23
33
+ 139 23 140 23 141 23 142 23 143 23 144 23
34
+ 145 23 146 23 147 23 148 23* 149 21 150 21
35
+ 151 21 152 21 153 21 154 21 155 21 156 21
36
+ 157 21 158 21 159 86 160 86 161 86 162 86
37
+ 163 86 164 86 165 86 166 86 167 86 168 86
38
+ 169 86 170 86 171 86 172 86 173 86 174 86
39
+ 175 86 176 86 177 86 178 86 179 86 180 86*
40
+ 181 86* 182 84 183 84 184 84 185 84 186 84
41
+ 187 84 188 84 189 84 190 84 191 84 192 84
42
+ 193 84 194 84 195 84 196 84 197 84 198 84
43
+ 199 84 200 84 201 84 202 84 203 84 204 84
44
+ 205 84 206 84 207 84 208 84 209 84 210 84
45
+ 211 84 212 89 213 89* 214 87 215 87 216 87
46
+ 217 87 218 87 219 87 220 87 221 11 222 11
47
+ 223 99 224 99 225 99 226 99 227 99 228 99
48
+ 229 99 230 99 231 99 232 57 233 57 234 55
49
+ 235 55 236 55 237 99 238 99 239 99 240 99
50
+ 241 99 242 99 243 99 244 99 245 99 246 99
51
+ 247 99 248 99 249 99 250 99 251 99 252 99
52
+ 253 99 254 99 255 99 256 99 257 99 258 99
53
+ 259 99 260 99 261 99 262 99 263 99 264 99
54
+ 265 99 266 99 267 99 268 15 269 15 270 15
55
+ 271 15 272 15 273 15 274 15 275 15 276 15
56
+ 277 15 278 15 279 15 280 15 281 15 282 15
57
+ 283 15 284 15 285 15 286 15 287 15 288 15
58
+ 289 15 290 15 291 15 292 15 293 15 294 15
59
+ 295 15 296 15 297 15 298 15 299 15 300 15*
60
+ 301 13 302 13 303 37* 304 35 305 35 306 35
61
+ 307 35 308 35 309 35 310 35 311 35 312 35
62
+ 313 35 314 35 315 35 316 35 317 35 318 11
63
+ 319 11 320 11 321 11 322 11 323 11 324 11
64
+ 325 11 326 11 327 11 328 11* 329 11* 330 08
65
+ 331 08 332 08 333 08 334 08 335 08 336 08
66
+ 337 08 338 08 339 08 340 08 341 08 342 08
67
+ 343 08 344 08 345 08 346 08 347 08 348 08
68
+ 349 08 350 08 351 08 352 08 353 08 354 08
69
+ 355 08 356 08 357 08 358 08 359 08 360 08
70
+ 361 08 362 37 363 37 364 37 365 37 366 37
71
+ 367 37 368 37 369 37 370 37 371 37 372 37
72
+ 373 37 374 37 375 37 376 37 377 37 378 37
73
+ 379 37 380 37 381 37 382 37 383 37* 384 35
74
+ 385 35 386 35 387 33 388 33 389 33 390 33
75
+ 391 33* 392 31 393 31 394 31 395 31 396 31
76
+ 397 31 398 31 399 31 400 73 401 73 402 73*
77
+ 403 71 404 71 405 71 406 71 407 71 408 99
78
+ 409 99 410 99 411 99 412 99 413 99 414 99
79
+ 415 99 416 67 417 67 418 67 419 65 420 65
80
+ 421 65 422 65 423 65 424 65 425 99 426 99
81
+ 427 99 428 99 429 99 430 99 431 99 432 99
82
+ 433 99 434 99 435 99 436 99 437 99 438 99
83
+ 439 99 440 27 441 27 442 27 443 27 444 27
84
+ 445 27 446 27* 447 25 448 25 449 99 450 99
85
+ 451 99 452 99 453 99 454 99 455 99 456 99
86
+ 457 99 458 99 459 99 460 99 461 99 462 99
87
+ 463 99 464 99 465 99 466 99 467 99 468 55
88
+ 469 55 470 55 471 55 472 55 473 55 474 55
89
+ 475 55 476 53 477 53 478 41 479 41 480 41
90
+ 481 41 482 41 483 39 484 39 485 39 486 29
91
+ 487 29 488 29 489 29 490 29 491 29 492 29
92
+ 493 29* 494 27 495 27 496 27 497 27 498 27
93
+ 499 27 500 27 501 37 502 35 503 45 504 43
94
+ 505 57 506 57 507 55 508 55 509 31 510 31
95
+ 511 31 512 31 513 31 514 31 515 31 516 49
96
+ 517 47 518 87* 519 85 520 61 521 99 522 99
97
+ 523 99 524 99 525 99 526 99 527 99 528 99
98
+ 529 99 530 99 531 69 532 69 533 69 534 69
99
+ 535 69 536 69 537 69 538 69* 539 67 540 81
100
+ 541 81 542 79 543 79 544 79 545 99 546 99
101
+ 547 99 548 99 549 99 550 99 551 99 552 99
102
+ 553 99 554 99 555 99 556 99 557 99 558 99
103
+ 559 99 560 99 561 99 562 99 563 99 564 99
104
+ 565 99 566 99 567 99 568 99 569 99 570 99
105
+ 571 99 572 99 573 99 574 59 575 99 576 99
106
+ 577 51 578 51 579 51 580 39 581 99 582 99
107
+ 583 99 584 99 585 99 586 65 587 99 588 07
108
+ 589 99 590 99 591 99 592 99 593 99 594 99
109
+ 595 99 596 92* 597 90 598 90 599 90 600 99
110
+ 601 99 602 83 603 83 604 83 605 83 606 83
111
+ 607 83* 608 83* 609 83* 610 83* 611 83* 612 83*
112
+ 613 83* 614 81 615 81 616 81 617 81 618 81
113
+ 619 81 620 81 621 81 622 81 623 81 624 81
114
+ 625 81 626 81 627 27 628 27 629 27 630 27
115
+ 631 27 632 27* 633 27* 634 27* 635 27* 636 25
116
+ 637 25 638 25 639 25 640 25 641 25 642 25
117
+ 643 25 644 25 645 25 646 17 647 17 648 54
118
+ 649 54 650 60* 651 58 652 58 653 58 654 36*
119
+ 655 34 656 34 657 34 658 34 659 22 660 22
120
+ 661 22* 662 20 663 20 664 20 665 20 667 46
121
+ 668 46 669 46 670 46 671 46* 672 44 673 44
122
+ 674 44 675 44 676 20 677 20 678 20 679 18
123
+ 680 25* 681 22 682 22 683 22 684 22 685 22
124
+ 686 22* 687 20 688 20 689 20 690 20 691 16*
125
+ 692 14 693 14 694 14 695 14 696 14 697 14
126
+ 698 14 699 14 700 18 701 18 702 18 703 18
127
+ 704 18 705 18 706 18 707 18 708 18 709 18
128
+ 710 18 711 18 712 18 713 18 714 18 715 18
129
+ 716 18 717 18 718 18 719 18 720 18 721 18
130
+ 722 18 723 18 724 28 725 18 726 18 727 10
131
+ 728 14 729 24 730 24* 731 24* 732 22 733 22
132
+ 750 18* 751 16 752 07 753 07 754 05 755 05
133
+ 756 12* 757 10 758 10 759 10 760 10 761 10
134
+ 762 10 763 10 764 19 765 19* 766 94* 767 94*
135
+ 768 94* 769 92 770 92 771 92 772 92
136
+
137
+
138
+
139
+
140
+
141
+
@@ -0,0 +1,24 @@
1
+ require 'date'
2
+ require 'delegate'
3
+
4
+ require_relative 'identified/errors/error'
5
+ require_relative 'identified/errors/ssn/malformed_ssn_error'
6
+
7
+ require_relative 'identified/ssn/area_number'
8
+ require_relative 'identified/ssn/group_number'
9
+ require_relative 'identified/ssn/sequential_group_number'
10
+ require_relative 'identified/ssn/serial_number'
11
+ require_relative 'identified/ssn/high_group_list'
12
+ require_relative 'identified/ssn/high_group_data'
13
+ require_relative 'identified/ssn/issuing_state_data'
14
+ require_relative 'identified/ssn/ssn'
15
+
16
+ # A module for validating government document identifiers (like SSNs) with ease.
17
+ module Identified
18
+ # Config information commonly useful to all other modules & classes
19
+ module Config
20
+ def self.data_path
21
+ File.expand_path(File.join(__FILE__, '../../data/'))
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ module Identified
2
+ # Common error class for the Identified module.
3
+ class Error < StandardError
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Identified
2
+ # Raised when ssns aren't in the '123-45-6789' or '123456789' formats.
3
+ class MalformedSSNError < Error
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module Identified
2
+ # Represents the area number of an SSN.
3
+ class AreaNumber < DelegateClass(Fixnum)
4
+ # Returns whether the ssn COULD be a valid ssn area code.
5
+ def valid?
6
+ # Currently only 000, 666 & 900+ are prohibited area numbers.
7
+ # See http://www.ssa.gov/employer/randomization.html
8
+ (1..665).include?(self) || (667..899).include?(self)
9
+
10
+ # NOTE: Prior to randomization, there were more restricted ranges. This is no longer checked
11
+ # inside of AreaNumber because it is redundant due to the pre-randomization group number check
12
+ # also validating this same information (if the area is absent in the table, it is unissued).
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ module Identified
2
+ # Represents the group number of an SSN and performs group number validation.
3
+ class GroupNumber < DelegateClass(Fixnum)
4
+ # Returns whether the ssn COULD be a valid ssn group code.
5
+ def valid?(area = nil, date_issued = nil)
6
+ # When no date is provided, we assume the date issued is post randomization.
7
+ if !date_issued || date_issued >= SSN::RANDOMIZATION_DATE
8
+ (1..99).include?(self)
9
+ else
10
+ (1..99).include?(self) && valid_high_group?(area, date_issued)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ # Helper function to determine if the group number was valid in a given area on a given date.
17
+ def valid_high_group?(area, date_issued)
18
+ high_group_list = HighGroupData.latest_applicable_list(date_issued)
19
+ high_group = high_group_list.high_group(area)
20
+
21
+ # If no groups have been issued yet for this area, the group is not valid.
22
+ return false unless high_group
23
+
24
+ SequentialGroupNumber.new(self) <= SequentialGroupNumber.new(high_group)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ module Identified
2
+ # The module that provides access to set of all high group data available.
3
+ module HighGroupData
4
+ def self.all
5
+ data
6
+ end
7
+
8
+ # Fetch the earliest dated list that is on or later than the issuance date.
9
+ def self.latest_applicable_list(date_issued)
10
+ data.detect { |list| date_issued <= list.date_effective }
11
+ end
12
+
13
+ def self.data
14
+ @data ||= load_data
15
+ end
16
+ private_class_method :data
17
+
18
+ # Loads all high group lists into memory. The data is sorted in increasing order by the date the
19
+ # high group list was effective on.
20
+ def self.load_data
21
+ Dir[Config.data_path + '/ssn/high_groups/*.txt']
22
+ .map { |filename| HighGroupList.new(filename) }
23
+ .sort_by!(&:date_effective)
24
+ end
25
+ private_class_method :load_data
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ module Identified
2
+ # An in-memory representation of a textual high group list.
3
+ class HighGroupList
4
+ HIGH_GROUP_LIST_DATE_REGEX = %r(HIGHEST GROUP ISSUED AS OF (?<date>\d{1,2}/\d{2}/\d{2}))
5
+
6
+ attr_reader :date_effective, :high_groups
7
+
8
+ def initialize(filename)
9
+ raw_data = File.read(filename)
10
+
11
+ @date_effective = parse_date(raw_data)
12
+ @high_groups = parse_high_groups(raw_data)
13
+ end
14
+
15
+ def high_group(area)
16
+ high_groups[area] # Returns nil if area is not present!
17
+ end
18
+
19
+ private
20
+
21
+ # Searches the raw for the effective date.
22
+ def parse_date(raw_data)
23
+ raw_date = HIGH_GROUP_LIST_DATE_REGEX.match(raw_data)[:date]
24
+
25
+ day, month, year = extract_date_elements(raw_date)
26
+
27
+ Date.new(year, month, day)
28
+ end
29
+
30
+ # Helper function to extract the integer components from the raw date string.
31
+ def extract_date_elements(date_string)
32
+ date_parts = date_string.split('/')
33
+
34
+ year = date_parts.fetch(2).to_i + 2000
35
+ month = date_parts.fetch(0).to_i
36
+ day = date_parts.fetch(1).to_i
37
+
38
+ [day, month, year]
39
+ end
40
+
41
+ # Loads high groups into a hash table that is indexed by area.
42
+ def parse_high_groups(raw_data)
43
+ raw_data.scan(/(\d{3})\s+(\d{2})/).to_enum.with_object({}) do |(area, group), table|
44
+ table[area.to_i] = group.to_i
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,44 @@
1
+ module Identified
2
+ # Wraps the actual data file to provide convenient access to area number => issuing state info.
3
+ module IssuingStateData
4
+ ISSUING_STATE_ENTRY_REGEX = /(\d{3})-(\d{3})\s(\w{2})/
5
+ # Provides an array of potential states or protectorates the ssn was issued in. Date is required
6
+ # because this information cannot be known if it was issued after the randomizaiton date.
7
+ # Unknown area numbers return [].
8
+ def self.issuing_states(area_number, date_issued)
9
+ # When the date issued is after the randomization date, we have no information about the
10
+ # issuing area, so return [].
11
+ return [] if !date_issued || date_issued >= SSN::RANDOMIZATION_DATE
12
+
13
+ @issuing_areas_table ||= load_issuing_states_table
14
+
15
+ # Return [] if the issuing areas information doesn't cover the requested area.
16
+ @issuing_areas_table.fetch(area_number, [])
17
+ end
18
+
19
+ # Loads the lookup table for going from area # => state / province code
20
+ def self.load_issuing_states_table
21
+ # Data originally taken from http://www.socialsecurity.gov/employer/stateweb.htm. The file
22
+ # this reads was transformed slightly from the original to make it less cumbersome to parse.
23
+ raw_data = File.read(File.join(Config.data_path, 'ssn/area_data.txt'))
24
+
25
+ # issuing_states_table = parse_issuing_states(raw_data)
26
+ parse_issuing_states(raw_data)
27
+ end
28
+
29
+ # Parses the issuing areas file contents and converts the data into a lookup table.
30
+ def self.parse_issuing_states(raw_data)
31
+ lookup_table = {}
32
+
33
+ # The data is formatted as a range [start]-[end] then the two character state / province code.
34
+ raw_data.scan(ISSUING_STATE_ENTRY_REGEX) do |start_area, end_area, state_code|
35
+ (start_area.to_i).upto(end_area.to_i) do |area_number|
36
+ lookup_table[area_number] ||= []
37
+ lookup_table.fetch(area_number) << state_code
38
+ end
39
+ end
40
+
41
+ lookup_table
42
+ end
43
+ end
44
+ end