identified 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/data/ssn/area_data.txt +58 -0
- data/data/ssn/area_data_raw.txt +66 -0
- data/data/ssn/high_groups/april_2004_raw.txt +145 -0
- data/data/ssn/high_groups/april_2005_raw.txt +138 -0
- data/data/ssn/high_groups/april_2006_raw.txt +140 -0
- data/data/ssn/high_groups/april_2007_raw.txt +141 -0
- data/data/ssn/high_groups/april_2008_raw.txt +141 -0
- data/data/ssn/high_groups/april_2009_raw.txt +140 -0
- data/data/ssn/high_groups/april_2010_raw.txt +140 -0
- data/data/ssn/high_groups/april_2011_raw.txt +141 -0
- data/data/ssn/high_groups/august_2004_raw.txt +137 -0
- data/data/ssn/high_groups/august_2005_raw.txt +139 -0
- data/data/ssn/high_groups/august_2006_raw.txt +140 -0
- data/data/ssn/high_groups/august_2007_raw.txt +141 -0
- data/data/ssn/high_groups/august_2008_raw.txt +141 -0
- data/data/ssn/high_groups/august_2009_raw.txt +140 -0
- data/data/ssn/high_groups/august_2010_raw.txt +141 -0
- data/data/ssn/high_groups/december_2003_raw.txt +138 -0
- data/data/ssn/high_groups/december_2004_raw.txt +138 -0
- data/data/ssn/high_groups/december_2005_raw.txt +140 -0
- data/data/ssn/high_groups/december_2006_raw.txt +140 -0
- data/data/ssn/high_groups/december_2007_raw.txt +141 -0
- data/data/ssn/high_groups/december_2008_raw.txt +141 -0
- data/data/ssn/high_groups/december_2009_raw.txt +140 -0
- data/data/ssn/high_groups/december_2010_raw.txt +141 -0
- data/data/ssn/high_groups/february_2004_raw.txt +137 -0
- data/data/ssn/high_groups/february_2005_raw.txt +138 -0
- data/data/ssn/high_groups/february_2006_raw.txt +140 -0
- data/data/ssn/high_groups/february_2007_raw.txt +141 -0
- data/data/ssn/high_groups/february_2008_raw.txt +141 -0
- data/data/ssn/high_groups/february_2009_raw.txt +140 -0
- data/data/ssn/high_groups/february_2010_raw.txt +140 -0
- data/data/ssn/high_groups/february_2011_raw.txt +141 -0
- data/data/ssn/high_groups/january_2004_raw.txt +137 -0
- data/data/ssn/high_groups/january_2005_raw.txt +138 -0
- data/data/ssn/high_groups/january_2006_raw.txt +140 -0
- data/data/ssn/high_groups/january_2007_raw.txt +141 -0
- data/data/ssn/high_groups/january_2008_raw.txt +141 -0
- data/data/ssn/high_groups/january_2009_raw.txt +141 -0
- data/data/ssn/high_groups/january_2010_raw.txt +140 -0
- data/data/ssn/high_groups/january_2011_raw.txt +141 -0
- data/data/ssn/high_groups/july_2004_raw.txt +137 -0
- data/data/ssn/high_groups/july_2005_raw.txt +139 -0
- data/data/ssn/high_groups/july_2006_raw.txt +140 -0
- data/data/ssn/high_groups/july_2007_raw.txt +141 -0
- data/data/ssn/high_groups/july_2008_raw.txt +141 -0
- data/data/ssn/high_groups/july_2009_raw.txt +140 -0
- data/data/ssn/high_groups/july_2010_raw.txt +141 -0
- data/data/ssn/high_groups/june_2004_raw.txt +137 -0
- data/data/ssn/high_groups/june_2005_raw.txt +139 -0
- data/data/ssn/high_groups/june_2006_raw.txt +140 -0
- data/data/ssn/high_groups/june_2007_raw.txt +141 -0
- data/data/ssn/high_groups/june_2008_raw.txt +141 -0
- data/data/ssn/high_groups/june_2009_raw.txt +140 -0
- data/data/ssn/high_groups/june_2010_raw.txt +141 -0
- data/data/ssn/high_groups/june_2011_raw.txt +141 -0
- data/data/ssn/high_groups/june_24_2011_raw.txt +141 -0
- data/data/ssn/high_groups/march_2004_raw.txt +137 -0
- data/data/ssn/high_groups/march_2005_raw.txt +138 -0
- data/data/ssn/high_groups/march_2006_raw.txt +140 -0
- data/data/ssn/high_groups/march_2007_raw.txt +141 -0
- data/data/ssn/high_groups/march_2008_raw.txt +141 -0
- data/data/ssn/high_groups/march_2009_raw.txt +140 -0
- data/data/ssn/high_groups/march_2010_raw.txt +140 -0
- data/data/ssn/high_groups/march_2011_raw.txt +141 -0
- data/data/ssn/high_groups/may_2004_raw.txt +137 -0
- data/data/ssn/high_groups/may_2005_raw.txt +139 -0
- data/data/ssn/high_groups/may_2006_raw.txt +140 -0
- data/data/ssn/high_groups/may_2007_raw.txt +141 -0
- data/data/ssn/high_groups/may_2008_raw.txt +141 -0
- data/data/ssn/high_groups/may_2009_raw.txt +140 -0
- data/data/ssn/high_groups/may_2010_raw.txt +140 -0
- data/data/ssn/high_groups/may_2011_raw.txt +141 -0
- data/data/ssn/high_groups/november_2003_raw.txt +138 -0
- data/data/ssn/high_groups/november_2004_raw.txt +137 -0
- data/data/ssn/high_groups/november_2005_raw.txt +140 -0
- data/data/ssn/high_groups/november_2006_raw.txt +140 -0
- data/data/ssn/high_groups/november_2007_raw.txt +141 -0
- data/data/ssn/high_groups/november_2008_raw.txt +141 -0
- data/data/ssn/high_groups/november_2009_raw.txt +140 -0
- data/data/ssn/high_groups/november_2010_raw.txt +142 -0
- data/data/ssn/high_groups/october_2004_raw.txt +137 -0
- data/data/ssn/high_groups/october_2005_raw.txt +139 -0
- data/data/ssn/high_groups/october_2006_raw.txt +140 -0
- data/data/ssn/high_groups/october_2007_raw.txt +141 -0
- data/data/ssn/high_groups/october_2008_raw.txt +141 -0
- data/data/ssn/high_groups/october_2009_raw.txt +140 -0
- data/data/ssn/high_groups/october_2010_raw.txt +141 -0
- data/data/ssn/high_groups/september_2004_raw.txt +137 -0
- data/data/ssn/high_groups/september_2005_raw.txt +139 -0
- data/data/ssn/high_groups/september_2006_raw.txt +140 -0
- data/data/ssn/high_groups/september_2007_raw.txt +141 -0
- data/data/ssn/high_groups/september_2008_raw.txt +141 -0
- data/data/ssn/high_groups/september_2009_raw.txt +141 -0
- data/data/ssn/high_groups/september_2010_raw.txt +141 -0
- data/lib/identified.rb +24 -0
- data/lib/identified/errors/error.rb +5 -0
- data/lib/identified/errors/ssn/malformed_ssn_error.rb +5 -0
- data/lib/identified/ssn/area_number.rb +15 -0
- data/lib/identified/ssn/group_number.rb +27 -0
- data/lib/identified/ssn/high_group_data.rb +27 -0
- data/lib/identified/ssn/high_group_list.rb +48 -0
- data/lib/identified/ssn/issuing_state_data.rb +44 -0
- data/lib/identified/ssn/sequential_group_number.rb +43 -0
- data/lib/identified/ssn/serial_number.rb +10 -0
- data/lib/identified/ssn/ssn.rb +74 -0
- 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
|
+
|
data/lib/identified.rb
ADDED
@@ -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,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
|