*********************************************************************** * Program : UTL900N1 * System : Utilities * Title : SSN Validator. * Generated: Nov 15,2006 * Funciton : Scan a 9 character input field for invalid SSN's. * * Change History * 11/15/2006 PMercier Initial Coding. * *********************************************************************** * The following is a list of SSN area codes followed by the state that * they are valid for. Notice the unusual assinments after area 524. * * Currently these code are not used in this program. They are here * for possible future use. Perhaps to return the state of issue to * the requestor. *********************************************************************** * 001-003 NH 004-007 ME 008-009 VT 010-034 MA 035-039 RI 040-049 CT * 050-134 NY 135-158 NJ 159-211 PA 212-220 MD 221-222 DE 223-231 VA * 232-236 WV 237-246 NC 247-251 SC 252-260 GA 261-267 FL 268-302 OH * 303-317 IN 318-361 IL 362-386 MI 387-399 WI 400-407 KY 408-415 TN * 416-424 AL 425-428 MS 429-432 AR 433-439 LA 440-448 OK 449-467 TX * 468-477 MN 478-485 IA 486-500 MO 501-502 ND 503-504 SD 505-508 NE * 509-515 KS 516-517 MT 518-519 ID 520 WY 521-524 CO * 525 Guam, American Samoa * 526-527 Philippine Islands * 528-529 Northern Mariana Islands * 530 NV 531-539 WA 540-544 OR 545-573 CA * 574 AK 575-576 HI 577-579 DC * 580 Virgin Islands * 581-584 PR Puerto Rico * 585 NM * 586 Pacific Islands * 587-588 MS 589-595 FL * 596-599 Puerto Rico * 600-601 AZ 602-626 CA 627-645 TX 646-647 UT * 648-649 NM 650-653 CO 654-658 SC 659-665 LA * 666 Skipped intentionally * 667-675 GA 676-679 AR 680 NV * 681-690 NC 691-699 VA * 700-728 RR Railroad Board * 729-733 EE Enumeration at Entry * 750-751 HI 752-755 MS 756-763 TN 764-765 AZ * 766-772 FL * 773-799 unassigned, for future use * 800-999 not valid SSNs. Some sources have claimed that numbers * above 900 were used when some state programs were converted * to federal control, but current SSA documents claim no * numbers above 799 have ever been used. * ********************************************************************** DEFINE DATA * PARAMETER USING UTL900A1 /* To pass parameters for future use * LOCAL USING CDAOBJ2 /* For Future use to pass back messages * LOCAL USING CDPDA-M /* For Future use to pass back messages LOCAL * * Miscellaneous Variables * 01 UTL980N0 02 #ET-CNTR (P9) * 02 #LOG-DATE9 (A8) For Future use * 02 REDEFINE #LOG-DATE9 * 03 #LOG-DATE9-N (N8) For Future use * 02 #LOG-TIME9 (A7) For Future use * 02 REDEFINE #LOG-TIME9 * 03 #LOG-TIME9-N (N7) For Future use * 02 #TIME (A7) For Future use 02 STDNT-ID (A9) 02 #STUDENT-ID (A9) 02 REDEFINE #STUDENT-ID 03 #STUDENT-ID-FIRST-3 (A3) 03 REDEFINE #STUDENT-ID-FIRST-3 04 #STUDENT-ID-FIRST-3N (N3) 03 #STUDENT-ID-MIDDLE-2 (A2) 03 REDEFINE #STUDENT-ID-MIDDLE-2 04 #STUDENT-ID-MIDDLE-2N(N2) 03 #STUDENT-ID-END-4 (A4) 02 #PRODUCT (N2) 02 #REMAIN (N1) 02 #GRP-STATE (A4) 02 #LOCATION (N4) 02 #POSITION (N4) 02 #TOP-GRP (N2) 02 #TOP-STATE (A4) 02 #SSN-GOOD (L) INIT * 01 #SSN-AREA-GROUP (A42/1:128) 01 #WORK-AREA-GROUP (A42) 01 REDEFINE #WORK-AREA-GROUP 02 #WORK-AREA-GROUP2 (A07/1:6) 01 #WORK-AREA-GROUP2-ENTRY (A07) 01 REDEFINE #WORK-AREA-GROUP2-ENTRY 02 #WORK-AREA-GROUP2-AREA (A03) 02 #FILLER-01 (A01) 02 #WORK-AREA-GROUP2-GROUP(N02) 02 #FILLER-02 (A01) END-DEFINE * * Load Area codes and Highest group number in the Area Group table * from data that is Updated once a month at the SSA website(see Below). * #SSN-AREA-GROUP(001) := '001 04 002 04 003 04 004 08 005 06 006 06 ' #SSN-AREA-GROUP(002) := '007 06 008 90 009 88 010 90 011 90 012 90 ' #SSN-AREA-GROUP(003) := '013 90 014 90 015 90 016 90 017 90 018 90 ' #SSN-AREA-GROUP(004) := '019 88 020 88 021 88 022 88 023 88 024 88 ' #SSN-AREA-GROUP(005) := '025 88 026 88 027 88 028 88 029 88 030 88 ' #SSN-AREA-GROUP(006) := '031 88 032 88 033 88 034 88 035 72 036 72 ' #SSN-AREA-GROUP(007) := '037 70 038 70 039 70 040 11 041 11 042 11 ' #SSN-AREA-GROUP(008) := '043 11 044 08 045 08 046 08 047 08 048 08 ' #SSN-AREA-GROUP(009) := '049 08 050 96 051 96 052 96 053 96 054 96 ' #SSN-AREA-GROUP(010) := '055 96 056 96 057 96 058 96 059 96 060 96 ' #SSN-AREA-GROUP(011) := '061 96 062 96 063 96 064 96 065 96 066 96 ' #SSN-AREA-GROUP(012) := '067 96 068 96 069 96 070 96 071 96 072 96 ' #SSN-AREA-GROUP(013) := '073 96 074 96 075 96 076 96 077 96 078 96 ' #SSN-AREA-GROUP(014) := '079 96 080 96 081 94 082 94 083 94 084 94 ' #SSN-AREA-GROUP(015) := '085 94 086 94 087 94 088 94 089 94 090 94 ' #SSN-AREA-GROUP(016) := '091 94 092 94 093 94 094 94 095 94 096 94 ' #SSN-AREA-GROUP(017) := '097 94 098 94 099 94 100 94 101 94 102 94 ' #SSN-AREA-GROUP(018) := '103 94 104 94 105 94 106 94 107 94 108 94 ' #SSN-AREA-GROUP(019) := '109 94 110 94 111 94 112 94 113 94 114 94 ' #SSN-AREA-GROUP(020) := '115 94 116 94 117 94 118 94 119 94 120 94 ' #SSN-AREA-GROUP(021) := '121 94 122 94 123 94 124 94 125 94 126 94 ' #SSN-AREA-GROUP(022) := '127 94 128 94 129 94 130 94 131 94 132 94 ' #SSN-AREA-GROUP(023) := '133 94 134 94 135 17 136 17 137 17 138 17 ' #SSN-AREA-GROUP(024) := '139 17 140 17 141 17 142 17 143 17 144 17 ' #SSN-AREA-GROUP(025) := '145 17 146 17 147 17 148 17 149 17 150 17 ' #SSN-AREA-GROUP(026) := '151 17 152 17 153 15 154 15 155 15 156 15 ' #SSN-AREA-GROUP(027) := '157 15 158 15 159 84 160 84 161 84 162 84 ' #SSN-AREA-GROUP(028) := '163 84 164 84 165 82 166 82 167 82 168 82 ' #SSN-AREA-GROUP(029) := '169 82 170 82 171 82 172 82 173 82 174 82 ' #SSN-AREA-GROUP(030) := '175 82 176 82 177 82 178 82 179 82 180 82 ' #SSN-AREA-GROUP(031) := '181 82 182 82 183 82 184 82 185 82 186 82 ' #SSN-AREA-GROUP(032) := '187 82 188 82 189 82 190 82 191 82 192 82 ' #SSN-AREA-GROUP(033) := '193 82 194 82 195 82 196 82 197 82 198 82 ' #SSN-AREA-GROUP(034) := '199 82 200 82 201 82 202 82 203 82 204 82 ' #SSN-AREA-GROUP(036) := '205 82 206 82 207 82 208 82 209 82 210 82 ' #SSN-AREA-GROUP(037) := '211 82 212 77 213 77 214 77 215 75 216 75 ' #SSN-AREA-GROUP(038) := '217 75 218 75 219 75 220 75 221 04 222 04 ' #SSN-AREA-GROUP(039) := '223 99 224 99 225 99 226 99 227 99 228 99 ' #SSN-AREA-GROUP(040) := '229 99 230 99 231 99 232 53 233 53 234 53 ' #SSN-AREA-GROUP(041) := '235 51 236 51 237 99 238 99 239 99 240 99 ' #SSN-AREA-GROUP(042) := '241 99 242 99 243 99 244 99 245 99 246 99 ' #SSN-AREA-GROUP(043) := '247 99 248 99 249 99 250 99 251 99 252 99 ' #SSN-AREA-GROUP(044) := '253 99 254 99 255 99 256 99 257 99 258 99 ' #SSN-AREA-GROUP(045) := '259 99 260 99 261 99 262 99 263 99 264 99 ' #SSN-AREA-GROUP(046) := '265 99 266 99 267 99 268 13 269 13 270 13 ' #SSN-AREA-GROUP(047) := '271 11 272 11 273 11 274 11 275 11 276 11 ' #SSN-AREA-GROUP(048) := '277 11 278 11 279 11 280 11 281 11 282 11 ' #SSN-AREA-GROUP(049) := '283 11 284 11 285 11 286 11 287 11 288 11 ' #SSN-AREA-GROUP(050) := '289 11 290 11 291 11 292 11 293 11 294 11 ' #SSN-AREA-GROUP(051) := '295 11 296 11 297 11 298 11 299 11 300 11 ' #SSN-AREA-GROUP(052) := '301 11 302 11 303 31 304 31 305 31 306 31 ' #SSN-AREA-GROUP(053) := '307 31 308 31 309 31 310 29 311 29 312 29 ' #SSN-AREA-GROUP(054) := '313 29 314 29 315 29 316 29 317 29 318 06 ' #SSN-AREA-GROUP(055) := '319 06 320 06 321 06 322 06 323 06 324 06 ' #SSN-AREA-GROUP(056) := '325 06 326 06 327 06 328 06 329 06 330 04 ' #SSN-AREA-GROUP(057) := '331 04 332 04 333 04 334 04 335 04 336 04 ' #SSN-AREA-GROUP(058) := '337 04 338 04 339 04 340 04 341 04 342 04 ' #SSN-AREA-GROUP(059) := '343 04 344 04 345 04 346 04 347 04 348 04 ' #SSN-AREA-GROUP(060) := '349 04 350 04 351 04 352 04 353 04 354 04 ' #SSN-AREA-GROUP(061) := '355 04 356 04 357 04 358 04 359 04 360 04 ' #SSN-AREA-GROUP(062) := '361 04 362 33 363 33 364 33 365 33 366 33 ' #SSN-AREA-GROUP(063) := '367 33 368 33 369 33 370 33 371 33 372 33 ' #SSN-AREA-GROUP(064) := '373 33 374 33 375 33 376 33 377 31 378 31 ' #SSN-AREA-GROUP(065) := '379 31 380 31 381 31 382 31 383 31 384 31 ' #SSN-AREA-GROUP(066) := '385 31 386 31 387 27 388 27 389 27 390 27 ' #SSN-AREA-GROUP(067) := '391 27 392 27 393 27 394 27 395 27 396 27 ' #SSN-AREA-GROUP(068) := '397 27 398 27 399 27 400 67 401 65 402 65 ' #SSN-AREA-GROUP(069) := '403 65 404 65 405 65 406 65 407 65 408 99 ' #SSN-AREA-GROUP(070) := '409 99 410 99 411 99 412 99 413 99 414 99 ' #SSN-AREA-GROUP(071) := '415 99 416 61 417 61 418 61 419 59 420 59 ' #SSN-AREA-GROUP(072) := '421 59 422 59 423 59 424 59 425 99 426 99 ' #SSN-AREA-GROUP(073) := '427 99 428 99 429 99 430 99 431 99 432 99 ' #SSN-AREA-GROUP(074) := '433 99 434 99 435 99 436 99 437 99 438 99 ' #SSN-AREA-GROUP(075) := '439 99 440 23 441 21 442 21 443 21 444 21 ' #SSN-AREA-GROUP(076) := '445 21 446 21 447 21 448 21 449 99 450 99 ' #SSN-AREA-GROUP(077) := '451 99 452 99 453 99 454 99 455 99 456 99 ' #SSN-AREA-GROUP(078) := '457 99 458 99 459 99 460 99 461 99 462 99 ' #SSN-AREA-GROUP(079) := '463 99 464 99 465 99 466 99 467 99 468 49 ' #SSN-AREA-GROUP(080) := '469 49 470 49 471 49 472 49 473 47 474 47 ' #SSN-AREA-GROUP(081) := '475 47 476 47 477 47 478 37 479 37 480 37 ' #SSN-AREA-GROUP(082) := '481 35 482 35 483 35 484 35 485 35 486 25 ' #SSN-AREA-GROUP(083) := '487 25 488 23 489 23 490 23 491 23 492 23 ' #SSN-AREA-GROUP(084) := '493 23 494 23 495 23 496 23 497 23 498 23 ' #SSN-AREA-GROUP(085) := '499 23 500 23 501 33 502 31 503 39 504 37 ' #SSN-AREA-GROUP(086) := '505 51 506 51 507 49 508 49 509 27 510 27 ' #SSN-AREA-GROUP(087) := '511 27 512 25 513 25 514 25 515 25 516 43 ' #SSN-AREA-GROUP(088) := '517 41 518 75 519 75 520 51 521 99 522 99 ' #SSN-AREA-GROUP(089) := '523 99 524 99 525 99 526 99 527 99 528 99 ' #SSN-AREA-GROUP(090) := '529 99 530 99 531 59 532 59 533 59 534 59 ' #SSN-AREA-GROUP(091) := '535 59 536 59 537 59 538 59 539 59 540 71 ' #SSN-AREA-GROUP(092) := '541 71 542 71 543 71 544 71 545 99 546 99 ' #SSN-AREA-GROUP(093) := '547 99 548 99 549 99 550 99 551 99 552 99 ' #SSN-AREA-GROUP(094) := '553 99 554 99 555 99 556 99 557 99 558 99 ' #SSN-AREA-GROUP(095) := '559 99 560 99 561 99 562 99 563 99 564 99 ' #SSN-AREA-GROUP(096) := '565 99 566 99 567 99 568 99 569 99 570 99 ' #SSN-AREA-GROUP(097) := '571 99 572 99 573 99 574 47 575 99 576 99 ' #SSN-AREA-GROUP(098) := '577 43 578 43 579 41 580 37 581 99 582 99 ' #SSN-AREA-GROUP(099) := '583 99 584 99 585 99 586 59 587 99 589 99 ' #SSN-AREA-GROUP(100) := '590 99 591 99 592 99 593 99 594 99 595 99 ' #SSN-AREA-GROUP(101) := '596 82 597 82 598 82 599 80 600 99 601 99 ' #SSN-AREA-GROUP(103) := '602 59 603 59 604 59 605 59 606 59 607 59 ' #SSN-AREA-GROUP(104) := '608 59 609 59 610 59 611 59 612 59 613 59 ' #SSN-AREA-GROUP(105) := '614 59 615 59 616 59 617 59 618 59 619 59 ' #SSN-AREA-GROUP(106) := '620 59 621 59 622 59 623 59 624 57 625 57 ' #SSN-AREA-GROUP(107) := '626 57 627 06 628 06 629 06 630 06 631 06 ' #SSN-AREA-GROUP(108) := '632 06 633 04 634 04 635 04 636 04 637 04 ' #SSN-AREA-GROUP(109) := '638 04 639 04 640 04 641 04 642 04 643 04 ' #SSN-AREA-GROUP(110) := '644 04 645 04 646 90 647 90 648 42 649 40 ' #SSN-AREA-GROUP(111) := '650 42 651 42 652 40 653 40 654 24 655 24 ' #SSN-AREA-GROUP(112) := '656 24 657 22 658 22 659 14 660 14 661 12 ' #SSN-AREA-GROUP(113) := '662 12 663 12 664 12 665 12 667 32 668 30 ' #SSN-AREA-GROUP(114) := '669 30 670 30 671 30 672 30 673 30 674 30 ' #SSN-AREA-GROUP(115) := '675 30 676 12 677 12 678 10 679 10 680 80 ' #SSN-AREA-GROUP(116) := '681 10 682 10 683 10 684 10 685 10 686 10 ' #SSN-AREA-GROUP(117) := '687 10 688 10 689 10 690 09 691 05 692 05 ' #SSN-AREA-GROUP(118) := '693 05 694 05 695 05 696 05 697 05 698 03 ' #SSN-AREA-GROUP(119) := '699 03 700 18 701 18 702 18 703 18 704 18 ' #SSN-AREA-GROUP(120) := '705 18 706 18 707 18 708 18 709 18 710 18 ' #SSN-AREA-GROUP(121) := '711 18 712 18 713 18 714 18 715 18 716 18 ' #SSN-AREA-GROUP(122) := '717 18 718 18 719 18 720 18 721 18 722 18 ' #SSN-AREA-GROUP(123) := '723 18 724 28 725 18 726 18 727 10 728 14 ' #SSN-AREA-GROUP(124) := '729 09 730 07 731 07 732 07 733 07 750 07 ' #SSN-AREA-GROUP(125) := '751 05 756 03 757 03 758 03 759 03 760 01 ' #SSN-AREA-GROUP(126) := '761 01 762 01 763 01 764 70 765 70 766 54 ' #SSN-AREA-GROUP(127) := '767 54 768 54 769 54 770 54 771 54 772 52 ' #SSN-AREA-GROUP(128) := '588 01 752 01 753 01 754 01 755 01 ' * * Tempory code to get the number... INPUT / 'Stdnt Id' STDNT-ID (AD=MT) /* #STUDENT-ID := STDNT-ID /* 1. Validate that Area is not Zeros /* 2. Validate that Group is not Zeros /* 3. Validate that Sequence is not Zeros DECIDE FOR EVERY CONDITION WHEN #STUDENT-ID-FIRST-3 EQ '000' WRITE 'number is bad' /* Replace with Error code ESCAPE ROUTINE WHEN #STUDENT-ID-MIDDLE-2 EQ '00' WRITE 'number is bad' /* Replace with Error code ESCAPE ROUTINE WHEN #STUDENT-ID-END-4 EQ '0000' WRITE 'number is bad' /* Replace with Error code ESCAPE ROUTINE WHEN NONE IGNORE END-DECIDE * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * Group Codes are assigned according to the following pattern: * * 1. For each Area Number, odd numbered Group Codes between 01 and 09 * * are assigned first. * * I.E. ... 01,03,05,07,09,10,12,14,,,98,02,04,06,08,11,13,15,,,99 * * * 2. Next, even numbers between 10 and 98 are assigned. * * * 3. When the 98 Group is used up, we drop back and use up the even * numbers between 02 and 08. * * 4. Finally, we use up all the odd numbers between 11 and 99. * As an example, for Area Number "277" (an Ohio code), the High * Group Code is currently "08". This means that all odd numbers * between 01 and 09, all numbers between 10 and 98, and all even * numbers between 02 and 06 are up. * New SSN's assigned from this area will have the format: * 277-08-xxxx. * * High Count Table as of 11/01/2006 * WWW = http://www.ssa.gov/employer/highgroup.txt * WWW = http://www.codeproject.com/useritems/ssnvalidator.asp * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * * Determine if input Group code is Odd or Even. * #GRP-STATE := 'ODD' DIVIDE 2 INTO #STUDENT-ID-MIDDLE-2N GIVING #PRODUCT REMAINDER #REMAIN IF #REMAIN = 0 #GRP-STATE := 'EVEN' END-IF * * Find row that area code is in * EXAMINE FULL #SSN-AREA-GROUP(*) FOR FULL #STUDENT-ID-FIRST-3 GIVING INDEX IN #LOCATION * IF #LOCATION < 1 WRITE 'number is bad or Area Code Table needs to be updated' ESCAPE ROUTINE END-IF * * Find area code in the row * #WORK-AREA-GROUP := #SSN-AREA-GROUP(#LOCATION) EXAMINE FULL #WORK-AREA-GROUP2(*) FOR FULL #STUDENT-ID-FIRST-3 GIVING INDEX IN #POSITION * IF #POSITION < 1 WRITE 'number is bad or Area Code Table needs to be updated' ESCAPE ROUTINE END-IF * #WORK-AREA-GROUP2-ENTRY := #WORK-AREA-GROUP2(#POSITION) * * Determine if top Group from table for the area code is Odd or Even. * #TOP-GRP := #WORK-AREA-GROUP2-GROUP #TOP-STATE := 'ODD' DIVIDE 2 INTO #TOP-GRP GIVING #PRODUCT REMAINDER #REMAIN IF #REMAIN = 0 #TOP-STATE := 'EVEN' END-IF * #SSN-GOOD := FALSE DECIDE FOR FIRST CONDITION WHEN #TOP-GRP = 01 OR = 03 OR = 05 OR = 07 OR = 09 IF (#STUDENT-ID-MIDDLE-2N LE #TOP-GRP) AND #GRP-STATE = 'ODD' #SSN-GOOD := TRUE END-IF WHEN #TOP-GRP GT 9 AND #TOP-STATE = 'EVEN' IF #GRP-STATE = 'ODD' AND #STUDENT-ID-MIDDLE-2N LT 10 #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'EVEN' AND #STUDENT-ID-MIDDLE-2N GT 9 AND #STUDENT-ID-MIDDLE-2N LT #TOP-GRP #SSN-GOOD := TRUE END-IF END-IF WHEN #TOP-GRP LT 10 AND #TOP-STATE = 'EVEN' IF #GRP-STATE = 'ODD' AND #STUDENT-ID-MIDDLE-2N LT 10 #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'EVEN' AND #STUDENT-ID-MIDDLE-2N GT 9 #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'EVEN' AND #STUDENT-ID-MIDDLE-2N LE #TOP-GRP #SSN-GOOD := TRUE END-IF END-IF END-IF WHEN #TOP-GRP GT 9 AND #TOP-STATE = 'ODD' IF #STUDENT-ID-MIDDLE-2N LT 10 #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'EVEN' AND #STUDENT-ID-MIDDLE-2N GT 9 #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'ODD' AND #STUDENT-ID-MIDDLE-2N LE #TOP-GRP #SSN-GOOD := TRUE ELSE IF #GRP-STATE = 'ODD' AND #STUDENT-ID-MIDDLE-2N LE #TOP-GRP #SSN-GOOD := TRUE END-IF END-IF END-IF WHEN NONE IGNORE END-DECIDE * * Tell requester if SSN is Valid or not * IF #SSN-GOOD = TRUE WRITE 'Number is good' ELSE WRITE 'number is bad' END-IF * END