identified 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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