w2_obj ) ) { $gf = new GovernmentForms(); $this->w2_obj = $gf->getFormObject( 'w2', 'US' ); } return $this->w2_obj; } function getOptions( $name ) { $retval = null; switch ( $name ) { case 'type': $retval = [ 'government' => TTi18n::gettext( 'Government' ), 'employee' => TTi18n::gettext( 'Employee' ), ]; break; } return $retval; } //Set the type of form to display/print. Typically this would be: // government or employee. function getType() { if ( isset( $this->type ) ) { return $this->type; } return false; } function setType( $value ) { $this->type = trim( $value ); return true; } function getShowInstructionPage() { if ( isset( $this->show_instruction_page ) ) { return $this->show_instruction_page; } return false; } function setShowInstructionPage( $value ) { $this->show_instruction_page = (bool)trim( $value ); return true; } public function getTemplateSchema( $name = null ) { $template_schema = [ [ 'value' => $this->year, 'on_background' => true, 'coordinates' => [ 'x' => 325, 'y' => 130, 'h' => 6, 'w' => 19, 'halign' => 'C', 'fill_color' => [ 255, 255, 255 ], ], 'font' => [ 'size' => 7, 'type' => '', ], ], //Finish initializing page 1. 'previous_ssn' => [ 'function' => [ 'draw' => [ 'formatSSN', 'drawNormal' ] ], 'coordinates' => [ 'x' => 303, 'y' => 185, 'h' => 15, 'w' => 125, 'halign' => 'L', ], ], 'ssn' => [ 'function' => [ 'draw' => [ 'formatSSN', 'drawNormal' ] ], 'coordinates' => [ 'x' => 435, 'y' => 125, 'h' => 15, 'w' => 125, 'halign' => 'C', ], ], 'ein' => [ 'function' => [ 'prefilter' => [ 'stripNonNumeric', 'isNumeric' ], 'draw' => [ 'formatEIN', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 208, 'h' => 15, 'w' => 240, 'halign' => 'L', ], ], 'trade_name' => [ 'coordinates' => [ 'x' => 38, //Make sure there is enough spacing to fit in double windowed envelope with buffer. 'y' => 120, //Make sure there is enough spacing to fit in double windowed envelope with buffer. 'h' => 15, 'w' => 260, 'halign' => 'L', ], ], 'company_address' => [ 'function' => [ 'draw' => [ 'filterCompanyAddress', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 140, 'h' => 48, 'w' => 260, 'halign' => 'L', ], 'font' => [ 'size' => 8, 'type' => '', ], 'multicell' => true, ], 'previous_name' => [ 'function' => [ 'draw' => [ 'filterPreviousName', 'drawNormal' ] ], 'coordinates' => [ 'x' => 303, 'y' => 209, 'h' => 15, 'w' => 100, 'halign' => 'L', ], ], 'first_name' => [ 'coordinates' => [ 'x' => 303, 'y' => 231, 'h' => 15, 'w' => 100, 'halign' => 'L', ], ], 'middle_name' => [ 'function' => [ 'draw' => [ 'filterMiddleName', 'drawNormal' ] ], 'coordinates' => [ 'x' => 418, 'y' => 231, 'h' => 15, 'w' => 15, 'halign' => 'L', ], ], 'last_name' => [ 'coordinates' => [ 'x' => 435, 'y' => 231, 'h' => 15, 'w' => 100, 'halign' => 'L', ], ], 'le' => [ 'function' => [ 'draw' => [ 'filterLe', 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 545.5, 'y' => 151.5, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'address' => [ 'function' => [ 'draw' => [ 'filterAddress', 'drawNormal' ] ], 'coordinates' => [ 'x' => 303, //Make sure there is enough spacing to fit in double windowed envelope with buffer. 'y' => 248, //Make sure there is enough spacing to fit in double windowed envelope with buffer. 'h' => 32, 'w' => 250, 'halign' => 'L', ], 'font' => [ 'size' => 8, 'type' => '', ], 'multicell' => true, ], 'previous_l1' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 315, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l1' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 171, 'y' => 315, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l2' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 315, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l2' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 315, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l3' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 340, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l3' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 171, 'y' => 340, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l4' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 340, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l4' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 340, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l5' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 362, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l5' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 171, 'y' => 362, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l6' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 362, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l6' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 362, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l7' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 385, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l7' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 171, 'y' => 385, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l8' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 385, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l8' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 385, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l10' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 407, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l10' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 407, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l11' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 433, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'l11' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 171, 'y' => 433, 'h' => 10, 'w' => 115, 'halign' => 'L', ], ], 'previous_l12a_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 310, 'y' => 433, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'previous_l12a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 337, 'y' => 433, 'h' => 10, 'w' => 95, 'halign' => 'L', ], ], 'l12a_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 443, 'y' => 433, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'l12a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 470, 'y' => 433, 'h' => 10, 'w' => 88, 'halign' => 'L', ], ], 'previous_l12b_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 310, 'y' => 457, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'previous_l12b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 337, 'y' => 457, 'h' => 10, 'w' => 95, 'halign' => 'L', ], ], 'l12b_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 443, 'y' => 457, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'l12b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 470, 'y' => 457, 'h' => 10, 'w' => 88, 'halign' => 'L', ], ], 'previous_l12c_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 310, 'y' => 480, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'previous_l12c' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 337, 'y' => 480, 'h' => 10, 'w' => 95, 'halign' => 'L', ], ], 'l12c_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 443, 'y' => 480, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'l12c' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 470, 'y' => 480, 'h' => 10, 'w' => 88, 'halign' => 'L', ], ], 'previous_l12d_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 310, 'y' => 515, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'previous_l12d' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 337, 'y' => 515, 'h' => 10, 'w' => 95, 'halign' => 'L', ], ], 'l12d_code' => [ 'function' => [ 'draw' => [ 'drawNormal' ] ], 'coordinates' => [ 'x' => 443, 'y' => 515, 'h' => 10, 'w' => 25, 'halign' => 'C', ], ], 'l12d' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 470, 'y' => 515, 'h' => 10, 'w' => 88, 'halign' => 'L', ], ], 'previous_l13a' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 49, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'l13a' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 182, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'previous_l13b' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 84, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'l13b' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 217, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'previous_l13c' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 125, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'l13c' => [ 'function' => [ 'draw' => [ 'drawCheckBox' ] ], 'coordinates' => [ [ 'x' => 258, 'y' => 456, 'h' => 11, 'w' => 10, 'halign' => 'C', ] ], ], 'previous_l14a_name' => [ 'coordinates' => [ 'x' => 38, 'y' => 478, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'previous_l14a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 130, 'y' => 478, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'l14a_name' => [ 'coordinates' => [ 'x' => 170, 'y' => 478, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'l14a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 262, 'y' => 478, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'previous_l14b_name' => [ 'coordinates' => [ 'x' => 38, 'y' => 490, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'previous_l14b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 130, 'y' => 490, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'l14b_name' => [ 'coordinates' => [ 'x' => 170, 'y' => 490, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'l14b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 262, 'y' => 490, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'previous_l14c_name' => [ 'coordinates' => [ 'x' => 38, 'y' => 502, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'previous_l14c' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 130, 'y' => 502, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'l14c_name' => [ 'coordinates' => [ 'x' => 170, 'y' => 502, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'l14c' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 262, 'y' => 502, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'previous_l14d_name' => [ 'coordinates' => [ 'x' => 38, 'y' => 514, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'previous_l14d' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 130, 'y' => 514, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], 'l14d_name' => [ 'coordinates' => [ 'x' => 170, 'y' => 514, 'h' => 12, 'w' => 92, 'halign' => 'L', ], ], 'l14d' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 262, 'y' => 514, 'h' => 12, 'w' => 35, 'halign' => 'R', ], ], //State (Line 1) 'previous_l15a_state' => [ 'coordinates' => [ 'x' => 38, 'y' => 560, 'h' => 12, 'w' => 27, 'halign' => 'L', ], ], 'l15a_state' => [ 'coordinates' => [ 'x' => 170, 'y' => 560, 'h' => 12, 'w' => 27, 'halign' => 'L', ], ], 'previous_l15a_state_id' => [ 'coordinates' => [ 'x' => 38, 'y' => 583, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l15a_state_id' => [ 'coordinates' => [ 'x' => 170, 'y' => 583, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l16a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 605, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l16a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 170, 'y' => 605, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l17a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 630, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l17a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 170, 'y' => 630, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l18a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 675, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l18a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 170, 'y' => 675, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l19a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 38, 'y' => 700, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l19a' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 170, 'y' => 700, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l20a_district' => [ 'coordinates' => [ 'x' => 38, 'y' => 723, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l20a_district' => [ 'coordinates' => [ 'x' => 170, 'y' => 723, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], //State (Line 2) 'previous_l15b_state' => [ 'coordinates' => [ 'x' => 305, 'y' => 560, 'h' => 12, 'w' => 27, 'halign' => 'L', ], ], 'l15b_state' => [ 'coordinates' => [ 'x' => 438, 'y' => 560, 'h' => 12, 'w' => 27, 'halign' => 'L', ], ], 'previous_l15b_state_id' => [ 'coordinates' => [ 'x' => 305, 'y' => 583, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l15b_state_id' => [ 'coordinates' => [ 'x' => 438, 'y' => 583, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l16b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 605, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l16b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 605, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l17b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 630, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l17b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 630, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l18b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 675, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l18b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 675, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l19b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 305, 'y' => 700, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l19b' => [ 'function' => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ], 'coordinates' => [ 'x' => 438, 'y' => 700, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'previous_l20b_district' => [ 'coordinates' => [ 'x' => 305, 'y' => 723, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], 'l20b_district' => [ 'coordinates' => [ 'x' => 438, 'y' => 723, 'h' => 12, 'w' => 125, 'halign' => 'L', ], ], ]; if ( isset( $template_schema[$name] ) ) { return $name; } else { return $template_schema; } } function filterLe( $value ) { //Corrected SSN and/or name (check this box) if ( $this->previous_ssn != '' || $this->previous_first_name != '' || $this->previous_middle_name != '' || $this->previous_last_name != '' ) { Debug::Text( 'Name or SSN changed!', __FILE__, __LINE__, __METHOD__, 10 ); return true; } return false; } function filterMiddleName( $value ) { //Return just initial $value = substr( $value, 0, 1 ); return $value; } function filterCompanyAddress( $value ) { //Debug::Text('Filtering company address: '. $value, __FILE__, __LINE__, __METHOD__, 10); //Combine company address for multicell display. $retarr[] = $this->company_address1; if ( $this->company_address2 != '' ) { $retarr[] = $this->company_address2; } $retarr[] = $this->company_city . ', ' . $this->company_state . ' ' . $this->company_zip_code; return implode( "\n", $retarr ); } function filterPreviousName( $value ) { $retval = $this->previous_first_name .' '. $this->previous_middle_name .' '. $this->previous_last_name; return $retval; } function filterAddress( $value ) { //Combine company address for multicell display. $retarr[] = $this->address1; if ( $this->address2 != '' ) { $retarr[] = $this->address2; } $retarr[] = $this->city . ', ' . $this->state . ' ' . $this->zip_code; return implode( "\n", $retarr ); } function _getStateName( $state ) { return $this->getW2Object()->_getStateName( $state ); } function _getStateNumericCode( $state ) { return $this->getW2Object()->_getStateNumericCode( $state ); } function _getL12AmountByCode( $code ) { Debug::Text( 'Checking for Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 ); foreach ( range( 'a', 'z' ) as $z ) { if ( isset( $this->{'l12' . $z . '_code'} ) && $this->{'l12' . $z . '_code'} == $code ) { Debug::Text( 'Found amount for Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 ); return $this->{'l12' . $z}; } } //Debug::Text( 'No amount found, Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 ); return false; } function _compileRA() { //RA (Submitter) Record if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states. return false; } $line[] = 'RA'; //RA Record Debug::Text( 'RA Record State: ' . $this->efile_state, __FILE__, __LINE__, __METHOD__, 10 ); switch ( strtolower( $this->efile_state ) ) { case 'ny': //New York $efile_user_id = null; $is_resub = null; $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //EIN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $efile_user_id ), 8, 'AN' ); //User ID $line[] = $this->padRecord( '', 4, 'AN' ); //Software Vendor code $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( $is_resub, 1, 'AN' ); //Resub $line[] = $this->padRecord( '', 6, 'AN' ); //Blank $line[] = $this->padRecord( '', 2, 'AN' ); //Software Code $line[] = $this->padRecord( '', 57, 'AN' ); //Company Name $line[] = $this->padRecord( '', 22, 'AN' ); //Company Location Address $line[] = $this->padRecord( '', 22, 'AN' ); //Company Delivery Address $line[] = $this->padRecord( '', 22, 'AN' ); //Company City $line[] = $this->padRecord( '', 2, 'AN' ); //Company State $line[] = $this->padRecord( '', 5, 'AN' ); //Company Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //Company Zip Code Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Company Country, fill with blanks if its the US $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->trade_name ), 57, 'AN' ); //Submitter organization. $line[] = $this->padRecord( $this->stripNonAlphaNumeric( ( $this->company_address2 != '' ) ? $this->company_address2 : $this->company_address1 ), 22, 'AN' ); //Submitter Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //Submitter Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //Submitter City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //Submitter State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //Submitter Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //Submitter Zip Code Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Submitter Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Submitter Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Submitter Country, fill with blanks if its the US $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' ); //Contact Name $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' ); //Contact Phone $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' ); //Contact Phone Ext $line[] = $this->padRecord( '', 3, 'AN' ); //Blank $line[] = $this->padRecord( $this->contact_email, 40, 'AN' ); //Contact Email $line[] = $this->padRecord( '', 3, 'AN' ); //Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' ); //Contact Fax $line[] = $this->padRecord( '', 1, 'AN' ); //Blank $line[] = $this->padRecord( '', 1, 'AN' ); //PreParers Code $line[] = $this->padRecord( '', 12, 'AN' ); //Blank break; default: $is_resub = 0; $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //EIN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->efile_user_id ), 8, 'AN' ); //User ID $line[] = $this->padRecord( '', 4, 'AN' ); //Software Vendor code $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( $is_resub, 1, 'AN' ); //Resub $line[] = $this->padRecord( '', 6, 'AN' ); //Blank $line[] = $this->padRecord( '98', 2, 'AN' ); //Software Code $line[] = $this->padRecord( $this->trade_name, 57, 'AN' ); //Company Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' ); //Company Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //Company Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //Company City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //Company State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //Company Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //Company Zip Code Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Company Country, fill with blanks if its the US $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->trade_name ), 57, 'AN' ); //Submitter organization. $line[] = $this->padRecord( $this->stripNonAlphaNumeric( ( $this->company_address2 != '' ) ? $this->company_address2 : $this->company_address1 ), 22, 'AN' ); //Submitter Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //Submitter Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //Submitter City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //Submitter State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //Submitter Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //Submitter Zip Code Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Submitter Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Submitter Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Submitter Country, fill with blanks if its the US $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' ); //Contact Name $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' ); //Contact Phone $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' ); //Contact Phone Ext $line[] = $this->padRecord( '', 3, 'AN' ); //Blank $line[] = $this->padRecord( $this->contact_email, 40, 'AN' ); //Contact Email $line[] = $this->padRecord( '', 3, 'AN' ); //Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' ); //Contact Fax $line[] = $this->padRecord( '', 1, 'AN' ); //Blank $line[] = $this->padRecord( 'L', 1, 'AN' ); //PreParers Code $line[] = $this->padRecord( '', 12, 'AN' ); //Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RA Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RA Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } function _compileRE() { //RE (Employer) Record if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states. return false; } switch ( strtolower( $this->efile_state ) ) { case 'ny': //New York $line[] = 'RE'; //(1-2) RE Record $line[] = $this->padRecord( '', 4, 'AN' ); //(3-6) Tax Year $line[] = $this->padRecord( '', 1, 'AN' ); //(7) Agent Indicator $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(8-16 ) EIN $line[] = $this->padRecord( '', 9, 'AN' ); //(17-25) Agent for EIN $line[] = $this->padRecord( '', 1, 'AN' ); //(26) Terminating Business $line[] = $this->padRecord( '', 4, 'AN' ); //(27-30) Establishment Number $line[] = $this->padRecord( '', 9, 'AN' ); //(31-39) Other EIN $line[] = $this->padRecord( $this->trade_name, 57, 'AN' ); //(40-96) Company Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' ); //(97-118) Company Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //(119-140) Company Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //(141-162) Company City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //(163-164) Company State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //(165-169) Company Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //(170-173) Company Zip Code Extension $line[] = $this->padRecord( '42020', 5, 'AN' ); //(174) Kind of Employer ??????? //$line[] = $this->padRecord( '', 4, 'AN' ); //(175-178) Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(179-201) Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(202-216) Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(217-218) Country, fill with blanks if its the US $line[] = $this->padRecord( '', 1, 'AN' ); //(219) Employment Code - 941 Form $line[] = $this->padRecord( '', 1, 'AN' ); //(220) Tax Jurisdiction $line[] = $this->padRecord( '', 1, 'AN' ); //(221) Third Party Sick Pay $line[] = $this->padRecord( '', 27, 'AN' ); //(222-248) Contact Name $line[] = $this->padRecord( '', 15, 'AN' ); //(249-263) Contact Phone $line[] = $this->padRecord( '', 5, 'AN' ); //(264-268) Contact Phone Ext $line[] = $this->padRecord( '', 10, 'AN' ); //(269-278) Contact Fax $line[] = $this->padRecord( '', 40, 'AN' ); //(279-318) Contact Email $line[] = $this->padRecord( '', 194, 'AN' ); //(319-512) Blank break; default: $line[] = 'RE'; //(1-2) RE Record $line[] = $this->padRecord( $this->stripNonNumeric( $this->year ), 4, 'N' ); //(3-6) Tax Year $line[] = $this->padRecord( '', 1, 'AN' ); //(7) Agent Indicator $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(8-16 ) EIN $line[] = $this->padRecord( '', 9, 'AN' ); //(17-25) Agent for EIN $line[] = $this->padRecord( '0', 1, 'N' ); //(26) Terminating Business $line[] = $this->padRecord( '', 4, 'AN' ); //(27-30) Establishment Number $line[] = $this->padRecord( '', 9, 'AN' ); //(31-39) Other EIN $line[] = $this->padRecord( $this->trade_name, 57, 'AN' ); //(40-96) Company Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' ); //(97-118) Company Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //(119-140) Company Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //(141-162) Company City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //(163-164) Company State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //(165-169) Company Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //(170-173) Company Zip Code Extension $line[] = $this->padRecord( strtoupper( $this->kind_of_employer ), 1, 'AN' ); //(174) Kind of Employer $line[] = $this->padRecord( '', 4, 'AN' ); //(175-178) Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(179-201) Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(202-216) Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(217-218) Country, fill with blanks if its the US $line[] = $this->padRecord( 'R', 1, 'AN' ); //(219) Employment Code - 941 Form $line[] = $this->padRecord( '', 1, 'AN' ); //(220) Tax Jurisdiction $line[] = $this->padRecord( ( $this->l13c == '' ) ? 0 : 1, 1, 'N' ); //(221) Third Party Sick Pay $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' ); //(222-248) Contact Name $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' ); //(249-263) Contact Phone $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' ); //(264-268) Contact Phone Ext $line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' ); //(269-278) Contact Fax $line[] = $this->padRecord( $this->contact_email, 40, 'AN' ); //(279-318) Contact Email $line[] = $this->padRecord( '', 194, 'AN' ); //(319-512) Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RE Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RE Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } function _compileRW() { //RW (Employee) Record if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'CT', 'DE', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states. return false; } switch ( strtolower( $this->efile_state ) ) { default: $line[] = 'RW'; //RW Record $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //Zip $line[] = $this->padRecord( '', 4, 'AN' ); //Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Country, fill with blanks if its the US $line[] = $this->padRecord( $this->removeDecimal( $this->l1 ), 11, 'N' ); //(188-198) Wages, Tips and Other Compensation $line[] = $this->padRecord( $this->removeDecimal( $this->l2 ), 11, 'N' ); //(199-209) Federal Income Tax $line[] = $this->padRecord( $this->removeDecimal( $this->l3 ), 11, 'N' ); //(210-220) Social Security Wages $line[] = $this->padRecord( $this->removeDecimal( $this->l4 ), 11, 'N' ); //(221-231) Social Security Tax $line[] = $this->padRecord( $this->removeDecimal( $this->l5 ), 11, 'N' ); //(232-242) Medicare Wages and Tips $line[] = $this->padRecord( $this->removeDecimal( $this->l6 ), 11, 'N' ); //(243-253) Medicare Tax $line[] = $this->padRecord( $this->removeDecimal( $this->l7 ), 11, 'N' ); //(254-264) Social Security Tips $line[] = $this->padRecord( '', 11, 'AN' ); //(265-275) Blank $line[] = $this->padRecord( $this->removeDecimal( $this->l10 ), 11, 'N' ); //(276-286) Dependant Care Benefits $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'D' ) ), 11, 'N' ); //Deferred Compensation Contributions to 401K //Code D in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'E' ) ), 11, 'N' ); //Deferred Compensation Contributions to 403(b) //Code E in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'F' ) ), 11, 'N' ); //Deferred Compensation Contributions to 408(k)(6) //Code F in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'G' ) ), 11, 'N' ); //Deferred Compensation Contributions to 457(b) //Code G in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'H' ) ), 11, 'N' ); //(331-341) Deferred Compensation Contributions to 501(c)(18)(D) //Code H in any of the Box 12(a throug d). $line[] = $this->padRecord( '', 11, 'AN' ); //(342-352) Blank $line[] = $this->padRecord( $this->removeDecimal( $this->l11 ), 11, 'N' ); //(353-363) Non-qualified Plan Section 457 $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'W' ) ), 11, 'N' ); //(364-374) Employer Contributions to Health Savings Account //Code W in any of the Box 12(a throug d). $line[] = $this->padRecord( '', 11, 'N' ); //Non-qualified NOT Plan Section 457 $line[] = $this->padRecord( '', 11, 'N' ); //Non taxable combat pay $line[] = $this->padRecord( '', 11, 'AN' ); //Blank $line[] = $this->padRecord( '', 11, 'N' ); //Employer Cost of Premiums for Group Term Life Insurance over $50K $line[] = $this->padRecord( '', 11, 'N' ); //Income from the Exercise of Nonstatutory Stock Options $line[] = $this->padRecord( '', 11, 'N' ); //Deferrals Under a Section 409A non-qualified plan $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'AA' ) ), 11, 'N' ); //(441-451) Desiginated Roth Contributions under a section 401K //Code AA in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'BB' ) ), 11, 'N' ); //(452-462) Desiginated Roth Contributions under a section 403B //Code BB in any of the Box 12(a throug d). $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'DD' ) ), 11, 'N' ); //(463-473) Cost of Employer Sponsored Health Coverage //Code DD in any of the Box 12(a throug d). $line[] = $this->padRecord( '', 11, 'N' ); //(474-484) Blank $line[] = $this->padRecord( '', 1, 'AN' ); //(485) Blank $line[] = $this->padRecord( ( ( $this->l13a == '' ) ? 0 : 1 ), 1, 'N' ); //(486) Statutory Employee $line[] = $this->padRecord( '', 1, 'AN' ); //(487) Blank $line[] = $this->padRecord( ( ( $this->l13b == '' ) ? 0 : 1 ), 1, 'N' ); //(488) Retirement Plan Indicator $line[] = $this->padRecord( ( ( $this->l13c == '' ) ? 0 : 1 ), 1, 'N' ); //(489) 3rd Party Sick Pay Indicator $line[] = $this->padRecord( '', 23, 'AN' ); //(490-512) Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RW Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RW Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } //ID is the state identifier like: a, b, c, d,... function _compileRS( $id ) { //RS (State) Record if ( $this->efile_state == '' ) { //Federal filing does not need any RS record at all. return false; } $l15_state = 'l15' . $id . '_state'; $l15_state_id = 'l15' . $id . '_state_id'; $l15_state_control_number = 'l15' . $id . '_state_control_number'; $l16 = 'l16' . $id; $l17 = 'l17' . $id; $l18 = 'l18' . $id; $l19 = 'l19' . $id; $l20 = 'l20' . $id . '_district'; if ( !isset( $this->$l15_state ) ) { return false; } if ( strtolower( $this->efile_state ) != strtolower( $this->$l15_state ) ) { Debug::Text( ' eFile Format for State: ' . $this->efile_state . ' Employee Record State: ' . $this->$l15_state, __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RS Record State: ' . $this->efile_state, __FILE__, __LINE__, __METHOD__, 10 ); switch ( strtolower( $this->efile_state ) ) { case 'al': //Alabama //Withholding Number for State format is the State ID number. $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( '', 2, 'AN' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( '', 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( '', 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( '', 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( '', 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( '', 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'AN' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'AN' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 10, 'N' ); //(248-257)[10]: State Employer Account Number - For AL: Numbers below 700000 – right justify and zero fill. Numbers 700000 and above – R followed by nine digits. $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(258-266)[9]: FEIN $line[] = $this->padRecord( '', 7, 'AN' ); //(267-273)[7]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( $this->removeDecimal( $this->l2 ), 10, 'N' ); //(298-307)[10]: AL: Federal Income Tax Withheld $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( '', 11, 'AN' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( '', 11, 'AN' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( '', 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( 0, 11, 'N' ); //(338-348)[11]: AL: Other income (1099, W2G, etc.), columns 338-348. (Only use this field to report other income reported on 1099, W2G, etc. from which Alabama tax was withheld. Zero fill if not applicable.) $line[] = $this->padRecord( '', 44, 'AN' ); //(349-392)[44]: Supplemental Data 1 $line[] = $this->padRecord( $this->year, 4, 'N' ); //(393-396)[4]: AL: Payment Year $line[] = $this->padRecord( '', 116, 'AN' ); //(397-512)[116]: Supplemental Data 1 break; case 'ar': //Arkansas - https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/Mag_Media.pdf //Withholding Number for State format is the State ID number. $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '122020', 6, 'AN' ); //(197-202)[6]: AR: Last month and four digit year for the calendar quarter. Unemployment only, but might be required? $line[] = $this->padRecord( '', 11, 'N' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'N' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 20, 'AN' ); //(248-267)[20]: AR: FEIN $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( '', 11, 'AN' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( '', 11, 'AN' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( '', 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 75, 'AN' ); //(338-412)[75]: AR: Same as 248-267. EIN from RE Record. $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 75, 'AN' ); //(413-487)[75]: AR: 11 digit State of Arkansas ID number. Omit hypens. $line[] = $this->padRecord( '', 25, 'AN' ); //(488-512)[25]: Blank break; case 'ga': //Georgia -- Has Local Taxes // File Format Specifications: https://dor.georgia.gov/sites/dor.georgia.gov/files/related_files/document/Federal%20Format%20Specs%202015.pdf $line[] = 'RS'; //RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //State Code $line[] = $this->padRecord( '', 5, 'AN' ); //Tax Entity Code (Leave Blank) $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //Zip $line[] = $this->padRecord( '', 4, 'AN' ); //Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 20, 'AN' ); //State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //State income tax $line[] = $this->padRecord( '12/31/' . $this->year, 10, 'AN' ); //Period End Date (last day of the year) $line[] = $this->padRecord( '', 1, 'AN' ); //Tax Type Code $line[] = $this->padRecord( '', 11, 'AN' ); //Local Wages (blank) $line[] = $this->padRecord( '', 11, 'AN' ); //Local Income Tax (blank) $line[] = $this->padRecord( str_replace( [ '-', ' ' ], '', strtoupper( $this->$l15_state_id ) ), 9, 'AN' ); //Withholding Number, no hyphen and upper case alpha $line[] = $this->padRecord( $this->trade_name, 57, 'AN' ); //Company Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' ); //Company Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //Company Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' ); //Company City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' ); //Company State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' ); //Company Zip Code $line[] = $this->padRecord( '', 4, 'AN' ); //Company Zip Code Extension $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //EIN $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 25, 'AN' ); //Blank break; case 'ks': //Kansas - https://www.ksrevenue.org/pdf/K-2MT.pdf $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->$l15_state_id ), 20, 'AN' ); //(248-267)[20]: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_control_number ), 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( $this->removeDecimal( $this->getL14AmountByName( 'KPER' ) ), 11, 'N' ); //(338-348)[11]: KS: Employee Contribution to KPERS, KP & F and Judges - "KPER" or "KPERS" should appear on W2 under Box 14. - https://www.ksrevenue.org/kpers.html $line[] = $this->padRecord( '', 64, 'AN' ); //(349-412)[64]: Supplemental Data 1 $line[] = $this->padRecord( '', 75, 'AN' ); //(413-487)[75]: Supplemental Data 2 $line[] = $this->padRecord( '', 25, 'AN' ); //(488-512)[25]: Blank break; case 'ma': //Massachusetts //Withholding Number for State format is the State ID number. $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'AN' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'AN' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( '', 20, 'AN' ); //(248-267)[20]: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( '', 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( '', 75, 'AN' ); //(338-412)[75]: Supplemental Data 1 $line[] = $this->padRecord( '', 75, 'AN' ); //(413-487)[75]: Supplemental Data 2 $line[] = $this->padRecord( '', 25, 'AN' ); //(488-512)[25]: Blank break; case 'oh': //Ohio - They share with Federal SSA. This is for RITA/Local format instead. It does not include school district taxes. //File format specifications: https://www.tax.ohio.gov/Portals/0/employer_withholding/2019%20tax%20year/2018_W2_Specs_v3.pdf //Ohio Regional for City reporting. //File format specifications: https://cdn.ritaohio.com/Media/700682/2018%20W-2%20SPECS.pdf $municipality_code = false; $municipality_name = null; $tax_type = 'C'; //District/City Name must contain: [NNNA] or [NNNNA] ie: [123R] or [1234R] or [123C] -- Where R is tax based on residence location and C is tax based on work location. $municipality_match = preg_match( '/\[([0-9]{3,4})([RCDEF]{1})\]/i', $this->$l20, $matches ); if ( isset( $matches[0] ) ) { if ( isset( $matches[1] ) ) { $municipality_code = str_pad( trim( $matches[1] ), 4, '0', STR_PAD_LEFT ); } if ( isset( $matches[2] ) ) { $tax_type = trim( $matches[2] ); } } $municipality_name = strtoupper( trim( preg_replace( '/\[.*\]/', '', $this->$l20 ) ) ); //Strip off the square brackets [] if ( $municipality_code != '' && $tax_type != '' ) { //Withholding Number for State format is the State ID number. $line[] = 'RS'; //RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //State Code $line[] = $this->padRecord( 'R' . $municipality_code, 5, 'AN' ); //Tax Entity Code (Leave Blank) [5-9] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //SSN [10-18] $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //Zip $line[] = $this->padRecord( '', 4, 'AN' ); //Zip Extension [146-149] $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( '', 23, 'AN' ); //Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //Country, fill with blanks if its the US //Unemployment reporting: Starts at 194 $line[] = $this->padRecord( '', 2, 'AN' ); //Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' ); //State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //Blank //Income Tax Reporting: Starts at 273 $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //State Code [273-275] $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //State Taxable Wages [276-286] $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //State income tax [287-297] $line[] = $this->padRecord( '', 10, 'AN' ); //Other State Data [298-307] $line[] = $this->padRecord( strtoupper( $tax_type ), 1, 'AN' ); //Tax Type Code [308] //C=City, D=County, E=School District, F=Other -- For City: R=Residence C=Company/Work Location $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //Local Wages [309-319] $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //Local Income Tax [320-330] $line[] = $this->padRecord( '', 7, 'AN' ); //State Control Number if ( isset( $this->efile_agency_id ) && $this->efile_agency_id == '30:US:OH:00:0010' ) { $line[] = $this->padRecord( $municipality_name, 75, 'AN' ); //Supplemental Data 1 $line[] = $this->padRecord( strtoupper( $this->_getStateName( $this->$l15_state ) ), 75, 'AN' ); //Supplemental Data 2 } else { $line[] = $this->padRecord( '', 75, 'AN' ); //Supplemental Data 1 $line[] = $this->padRecord( '', 75, 'AN' ); //Supplemental Data 2 } $line[] = $this->padRecord( '', 25, 'AN' ); //Blank } else { Debug::Text( 'Skipping RS Record due to incorrect Municipality Code: ' . $municipality_code . ' Tax Type: ' . $tax_type, __FILE__, __LINE__, __METHOD__, 10 ); } break; case 'ok': //https://www.ok.gov/tax/documents/What%20is%20the%20purpose%20of%20the%20RS.pdf $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'AN' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'AN' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( '', 20, 'AN' ); //(248-267)[20]: UI: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( '', 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 15, 'AN' ); //(338-352)[15]: OK: Oklahoma withholding (WTH) Account Number $line[] = $this->padRecord( '', 60, 'AN' ); //(353-412)[60]: Supplemental Data 1 $line[] = $this->padRecord( '', 75, 'AN' ); //(413-487)[75]: Supplemental Data 2 $line[] = $this->padRecord( '', 25, 'AN' ); //(488-512)[25]: Blank break; case 'or': //https://www.oregon.gov/dor/programs/businesses/Documents/iWire-w2-specifications.pdf $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'AN' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'AN' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'N' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'N' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' ); //(248-267)[20]: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 50, 'AN' ); //(298-347)[50]: OR: Other State Data $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(348-358)[11]: Statewide Transit Tax Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(359-369)[11]: Statewide Transit Tax Income Tax Withheld $line[] = $this->padRecord( '', 143, 'AN' ); //(370-512)[143]: Blank break; case 'pa': //https://www.revenue.pa.gov/GeneralTaxInformation/Tax%20Types%20and%20Information/EmployerWithholding/Documents/EFW2-EFW2C_reporting_inst_and_specs.pdf $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' ); //(248-255)[8]: State Employer Account Number $line[] = $this->padRecord( '', 12, 'AN' ); //(256-267)[12]: Blank $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( '', 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( 0, 9, 'N' ); //(338-346)[9]: Employees ITIN as shown on card issued by SSA $line[] = $this->padRecord( '', 166, 'AN' ); //(347-512)[166]: Blank break; case 'in': // Indiana - Has Local Taxes - https://www.in.gov/dor/files/w-2book.pdf $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' ); //(248-267)[20]: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 10, 'N' ); //(331-340)[10]: IN: Indiana Employer Taxpayer ID (TID). Does not include the 3 digit location. $line[] = $this->padRecord( $this->stripNonNumeric( substr( $this->$l15_state_id, -3 ) ), 3, 'N' ); //(341-343)[3]: IN: Indiana Employer Taxpayer ID (TID) Location. Last 3 digits of the State ID. $line[] = $this->padRecord( '', 169, 'AN' ); //(444-512)[169]: Blank break; default: //Federal //Withholding Number for State format is the State ID number. $line[] = 'RS'; //(1-2)[2]: RS Record $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( '', 5, 'AN' ); //(5-9)[5]: Tax Entity Code [Leave Blank] $line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' ); //(10-18)[9]: SSN $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' ); //(19-33)[15]: First Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' ); //(49-68)[20]: Last Name $line[] = $this->padRecord( '', 4, 'AN' ); //(69-72)[4]: Suffix $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' ); //(73-94)[22]: Location Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' ); //(95-116)[22]: Delivery Address $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' ); //(117-138)[22]: City $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' ); //(139-140)[2]: State $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' ); //(141-145)[5]: Zip $line[] = $this->padRecord( '', 4, 'AN' ); //(146-149)[4]: Zip Extension $line[] = $this->padRecord( '', 5, 'AN' ); //(150-154)[5]: Blank $line[] = $this->padRecord( '', 23, 'AN' ); //(155-177)[23]: Foreign State/Province $line[] = $this->padRecord( '', 15, 'AN' ); //(178-192)[15]: Foreign Postal Code $line[] = $this->padRecord( '', 2, 'AN' ); //(193-194)[2]: Country, fill with blanks if its the US //Unemployment reporting $line[] = $this->padRecord( '', 2, 'AN' ); //(195-196)[2]: Optional Code $line[] = $this->padRecord( '', 6, 'AN' ); //(197-202)[6]: Reporting Period $line[] = $this->padRecord( '', 11, 'N' ); //(203-213)[11]: State Quarterly Unemployment Total $line[] = $this->padRecord( '', 11, 'N' ); //(214-224)[11]: State Quarterly Unemployment Insurance $line[] = $this->padRecord( '', 2, 'AN' ); //(225-226)[2]: Number of weeks worked $line[] = $this->padRecord( '', 8, 'AN' ); //(227-234)[8]: Date first employed $line[] = $this->padRecord( '', 8, 'AN' ); //(235-242)[8]: Date of separation $line[] = $this->padRecord( '', 5, 'AN' ); //(243-247)[5]: Blank $line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->$l15_state_id ), 20, 'AN' ); //(248-267)[20]: State Employer Account Number $line[] = $this->padRecord( '', 6, 'AN' ); //(268-273)[6]: Blank //Income Tax Reporting $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(274-275)[2]: State Code $line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' ); //(276-286)[11]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' ); //(287-297)[11]: State income tax $line[] = $this->padRecord( '', 10, 'AN' ); //(298-307)[10]: Other State Data $line[] = $this->padRecord( '', 1, 'AN' ); //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other] $line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' ); //(309-319)[11]: Local Wages $line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' ); //(320-330)[11]: Local Income Tax $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_control_number ), 7, 'AN' ); //(331-337)[7]: State Control Number $line[] = $this->padRecord( '', 75, 'AN' ); //(338-412)[75]: Supplemental Data 1 $line[] = $this->padRecord( '', 75, 'AN' ); //(413-487)[75]: Supplemental Data 2 $line[] = $this->padRecord( '', 25, 'AN' ); //(488-512)[25]: Blank break; } if ( isset( $line ) ) { $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RS Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RS Record: ' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } else { Debug::Text( 'Skipping RS Record... ', __FILE__, __LINE__, __METHOD__, 10 ); } } function _compileRO() { //RO (Employee Optional) if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'CT', 'DE', 'KS', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states. return false; } $line[] = 'RO'; //Employee Optional $line[] = $this->padRecord( '', 9, 'AN' ); //Blanks $line[] = $this->padRecord( $this->removeDecimal( $this->l8 ), 11, 'N' ); //(12-22) Allocated Tips $line[] = $this->padRecord( $this->removeDecimal( bcadd( $this->_getL12AmountByCode( 'A' ), $this->_getL12AmountByCode( 'B' ) ) ), 11, 'N' ); //(23-33) Uncollected Employee Tax on Tips (Codes A and B) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'R' ) ), 11, 'N' ); //(34-44) Medical Savings Account (Code R) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'S' ) ), 11, 'N' ); //(45-55) Simple Retirement Account (Code S) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'T' ) ), 11, 'N' ); //(56-66) Qualified Adoption Expenses (Code T) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'M' ) ), 11, 'N' ); //(67-77) Uncollected Social Security or RRTA Tax on Cost ofGroup Term Life Insurance Over $50,000 (Code M) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'N' ) ), 11, 'N' ); //(78-88) Uncollected Medicare Tax on Cost of Group TermLife Insurance Over$50,000 (Code N) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'Z' ) ), 11, 'N' ); //(89-99) Income Under a NonqualifiedDeferredCompensation PlanThat Fails to SatisfySection 409A (Code Z) $line[] = $this->padRecord( '', 11, 'AN' ); //(100-110) Blank $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'EE' ) ), 11, 'N' ); //(111-121) Designated Roth Contributions Under a Governmental Section 457(b) Plan (Code EE) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'GG' ) ), 11, 'N' ); //(122-132) Income from Qualified Equity Grants Under Section 83(i) (Code GG) $line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'HH' ) ), 11, 'N' ); //(133-143) Aggregate Deferrals Under Section 83(i) Elections as of theClose of the CalendarYear (Code HH) $line[] = $this->padRecord( '', 131, 'AN' ); //(144-274) Blank $line[] = $this->padRecord( 0, 11, 'N' ); //(275-285) Wages Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(286-296) Commissions Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(297-307) Allowances Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(308-318) Tips Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(319-329) Total Wages, Commissions, Tips and Allowances Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(330-340) Puerto Rico Tax Withheld $line[] = $this->padRecord( 0, 11, 'N' ); //(341-351) Retirement Fund Annual Contributions $line[] = $this->padRecord( '', 11, 'AN' ); //(352-362) Blank $line[] = $this->padRecord( 0, 11, 'N' ); //(363-373) Total Wages, Tips and Other Compensation Subject to Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax $line[] = $this->padRecord( 0, 11, 'N' ); //(374-384) Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax Withheld $line[] = $this->padRecord( '', 128, 'AN' ); //Blank $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RO Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RO Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } function _compileRU( $total ) { //RU (Total Optional) Record if ( in_array( strtoupper( $this->efile_state ), [ 'AL', 'CO', 'CT', 'DE', 'KS', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states. return false; } $line[] = 'RU'; //Employee Optional $line[] = $this->padRecord( $total->total, 7, 'N' ); //(3-9) Total Number of RO Records switch ( strtolower( $this->efile_state ) ) { case 'ny': $line[] = $this->padRecord( '', 503, 'AN' ); //(10-512) Blank break; default: $line[] = $this->padRecord( $this->removeDecimal( $total->l8 ), 15, 'N' ); //(10-24) Total Allocated Tips $line[] = $this->padRecord( $this->removeDecimal( bcadd( $total->l12a, $total->l12b ) ), 15, 'N' ); //(25-39) Total Uncollected Employee Tax on Tips (Codes A and B) $line[] = $this->padRecord( $this->removeDecimal( $total->l12r ), 15, 'N' ); //(40-54) Total Medica Savings Account (Code R) $line[] = $this->padRecord( $this->removeDecimal( $total->l12s ), 15, 'N' ); //(55-69) Total Simpl Retirement Account (Code S) $line[] = $this->padRecord( $this->removeDecimal( $total->l12t ), 15, 'N' ); //(70-84) Total Qualified Adoption Expenses (Code T) $line[] = $this->padRecord( $this->removeDecimal( $total->l12m ), 15, 'N' ); //(85-99) Total Uncollected Social Security or RRTA Tax on Cost of Group Term Life Insurance Over $50,000 (Code M) $line[] = $this->padRecord( $this->removeDecimal( $total->l12n ), 15, 'N' ); //(100-114) Total Uncollected Medicare Tax on Cost of Group Term Life Insurance Over $50,000 (Code N) $line[] = $this->padRecord( $this->removeDecimal( $total->l12z ), 15, 'N' ); //(115-129) Total Income Under a Nonqualified Deferred Compensation Plan That Fails to Satisfy Section 409A (Code Z) $line[] = $this->padRecord( '', 15, 'AN' ); //(130-144) Blank $line[] = $this->padRecord( $this->removeDecimal( $total->l12ee ), 15, 'N' ); //(145-159) Total Designated Roth Contributions Under a Governmental Section 457(b) Plan (Code EE) $line[] = $this->padRecord( $this->removeDecimal( $total->l12gg ), 15, 'N' ); //(160-174) Total Income from Qualified Equity Grants Under Section 83(i) (Code GG) $line[] = $this->padRecord( $this->removeDecimal( $total->l12hh ), 15, 'N' ); //(175-189) Total Aggregate Deferrals Under Section 83(i) Elections as of the Close of the Calendar Year(Code HH) $line[] = $this->padRecord( '', 165, 'AN' ); //(190-354) Blank $line[] = $this->padRecord( 0, 15, 'N' ); //(355-369) Wages Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(370-384) Commissions Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(385-399) Allowances Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(400-414) Tips Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(415-429) Total Wages, Commissions, Tips and Allowances Subject to Puerto Rico Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(430-444) Puerto Rico Tax Withheld $line[] = $this->padRecord( 0, 15, 'N' ); //(445-459) Retirement Fund Annual Contributions $line[] = $this->padRecord( 0, 15, 'N' ); //(460-474) Total Wages, Tips and Other Compensation Subject to Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax $line[] = $this->padRecord( 0, 15, 'N' ); //(475-489) Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax Withheld $line[] = $this->padRecord( '', 23, 'AN' ); //(490-512) Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RU Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RU Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } function _compileRT( $total ) { //RT (Total) Record - Total number of RW records reported since the last RE (Employer) record. if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'DE', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states. return false; } $line[] = 'RT'; //(1-2)[2]: RT Record switch ( strtolower( $this->efile_state ) ) { case 'ct': $line[] = $this->padRecord( $total->total, 7, 'N' ); //(3-9)[7]: Total RS records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //(10-24)[15]: CT: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //(25-39)[15]: CT: State Tax Withheld $line[] = $this->padRecord( '', 473, 'AN' ); //(40-512)[473]: Blank break; case 'ma': $line[] = $this->padRecord( $total->total, 7, 'N' ); //(3-9)[7]: Total RS records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //(10-24)[15]: MA: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //(25-39)[15]: MA: State Tax Withheld $line[] = $this->padRecord( '', 473, 'AN' ); //(40-512)[473]: Blank break; default: $line[] = $this->padRecord( $total->total, 7, 'N' ); //(3-9)[7]: Total RW records. $line[] = $this->padRecord( $this->removeDecimal( $total->l1 ), 15, 'N' ); //(10-24)[15]: Wages, Tips and Other Compensation $line[] = $this->padRecord( $this->removeDecimal( $total->l2 ), 15, 'N' ); //(25-39)[15]: Federal Income Tax $line[] = $this->padRecord( $this->removeDecimal( $total->l3 ), 15, 'N' ); //(40-54)[15]: Social Security Wages $line[] = $this->padRecord( $this->removeDecimal( $total->l4 ), 15, 'N' ); //(55-69)[15]: Social Security Tax $line[] = $this->padRecord( $this->removeDecimal( $total->l5 ), 15, 'N' ); //(70-84)[15]: Medicare Wages and Tips $line[] = $this->padRecord( $this->removeDecimal( $total->l6 ), 15, 'N' ); //(85-99)[15]: Medicare Tax $line[] = $this->padRecord( $this->removeDecimal( $total->l7 ), 15, 'N' ); //(100-114)[15]: Social Security Tips $line[] = $this->padRecord( '', 15, 'AN' ); //(115-129)[15]: Blank $line[] = $this->padRecord( $this->removeDecimal( $total->l10 ), 15, 'N' ); //(130-144)[15]: Dependant Care Benefits $line[] = $this->padRecord( $this->removeDecimal( $total->l12d ), 15, 'N' ); //(145-159)[15]: Deferred Compensation Contributions to 401K (Code D) $line[] = $this->padRecord( $this->removeDecimal( $total->l12e ), 15, 'N' ); //(160-174)[15]: Deferred Compensation Contributions to 403(b) (Code E) $line[] = $this->padRecord( $this->removeDecimal( $total->l12f ), 15, 'N' ); //(175-189)[15]: Deferred Compensation Contributions to 408(k)(6) (Code F) $line[] = $this->padRecord( $this->removeDecimal( $total->l12g ), 15, 'N' ); //(190-204)[15]: Deferred Compensation Contributions to 457(b) (Code G) $line[] = $this->padRecord( $this->removeDecimal( $total->l12h ), 15, 'N' ); //(205-219)[15]: Deferred Compensation Contributions to 501(c)(18)(D) (Code H) $line[] = $this->padRecord( '', 15, 'AN' ); //(220-234)[15]: Blank $line[] = $this->padRecord( $this->removeDecimal( $total->l11 ), 15, 'N' ); //(235-249)[15]: Non-qualified Plan Section 457 $line[] = $this->padRecord( $this->removeDecimal( $total->l12w ), 15, 'N' ); //(250-264)[15]: Employer Contributions to Health Savings Account (Code W) $line[] = $this->padRecord( 0, 15, 'N' ); //(265-279)[15]: Non-qualified NOT Plan Section 457 $line[] = $this->padRecord( 0, 15, 'N' ); //(280-294)[15]: Non taxable combat pay $line[] = $this->padRecord( $this->removeDecimal( $total->l12dd ), 15, 'N' ); //(295-309)[15]: Cost of Employer Sponsored Health Coverage (Code DD) $line[] = $this->padRecord( 0, 15, 'N' ); //(310-324)[15]: Employer Cost of Premiums for Group Term Life Insurance over $50K $line[] = $this->padRecord( 0, 15, 'N' ); //(325-339)[15]: 3rd party sick pay. $line[] = $this->padRecord( 0, 15, 'N' ); //(340-354)[15]: Income from the Exercise of Nonstatutory Stock Options $line[] = $this->padRecord( 0, 15, 'N' ); //(355-369)[15]: Deferrals Under a Section 409A non-qualified plan $line[] = $this->padRecord( $this->removeDecimal( $total->l12aa ), 15, 'N' ); //(370-384)[15]: Desiginated Roth Contributions under a section 401K (Code AA) $line[] = $this->padRecord( $this->removeDecimal( $total->l12bb ), 15, 'N' ); //(385-399)[15]: Desiginated Roth Contributions under a section 403B (Code BB) $line[] = $this->padRecord( 0, 15, 'N' ); //(400-414)[15]: Permitted Benefits Under a Qualified Small Employer Health Reimbursement (Code FF) $line[] = $this->padRecord( '', 98, 'AN' ); //(415-512)[98]: Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RT Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RT Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } function _compileRV( $total ) { //RV (State Total) Record - **OPTIONAL** Not processed or shared by SSA or IRS. Custom to each state. if ( $this->efile_state == '' ) { //Federal filing does not need any RS record at all. return false; } if ( $this->efile_state == '' || !in_array( strtoupper( $this->efile_state ), [ 'IL', 'MO', 'MT', 'ND', 'NE', 'OK', 'OR', 'PA' ] ) ) { //**THIS IS OPPOSITE AS OTHER FUNCTIONS** - Skip for eFiling in these states. return false; } if ( $total->total > 0 ) { $line[] = 'RV'; //RT Record switch ( strtolower( $this->efile_state ) ) { case 'mo': // https://dor.mo.gov/business/withhold/documents/MissouriAnnualW-2FilingGuidelines.pdf foreach ( range( 'a', 'z' ) as $z ) { $l15_state = 'l15' . $z . '_state'; if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) { $l15_state_id = 'l15' . $z . '_state_id'; break; } } $line[] = $this->padRecord( $this->year, 4, 'N' ); //(3-6)[4]: Tax Year $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(7-15)[9]: FEIN $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' ); //(16-23)[8]: State ID Number $line[] = $this->padRecord( $this->trade_name, 57, 'AN' ); //(24-80)[57]: Employer Name $line[] = $this->padRecord( $total->total, 6, 'N' ); //(81-86)[6]: Employer Number of W2's $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 12, 'N' ); //(87-98)[12]: Employer TOtal Tax Withheld as shown on W2s $line[] = $this->padRecord( '', 414, 'AN' ); //(99-512)[414]: Blank break; case 'ok': // https://www.ok.gov/tax/documents/What%20is%20the%20purpose%20of%20the%20RV.pdf foreach ( range( 'a', 'z' ) as $z ) { $l15_state = 'l15' . $z . '_state'; if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) { $l15_state_id = 'l15' . $z . '_state_id'; break; } } $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( $total->total, 7, 'N' ); //(5-11)[7]: Total RS records. $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(12-20)[9]: FEIN $line[] = $this->padRecord( '', 21, 'AN' ); //(21-41)[21]: Blank $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //(42-56)[15]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //(57-71)[15]: State Income Tax Withheld $line[] = $this->padRecord( $this->removeDecimal( $total->local_taxable_wages ), 15, 'N' ); //(72-86)[15]: Local Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->local_income_tax ), 15, 'N' ); //(87-101)[15]: Local Income Tax Withheld $line[] = $this->padRecord( '', 411, 'AN' ); //(102-512)[411]: Blank break; case 'or': // https://www.oregon.gov/dor/programs/businesses/Documents/iWire-w2-specifications.pdf $line[] = $this->padRecord( $total->total, 7, 'N' ); //(3-9)[2]: Total RS records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //(10-24)[15]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //(25-39)[15]: State Income Tax Withheld $line[] = $this->padRecord( $this->removeDecimal( $total->local_taxable_wages ), 15, 'N' ); //(40-54)[15]: OR: Satewide Transit Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->local_income_tax ), 15, 'N' ); //(55-69)[15]: OR: Satewide Transit Tax Withheld $line[] = $this->padRecord( '', 443, 'AN' ); //(70-512)[443]: Blank break; case 'pa': // https://www.revenue.pa.gov/GeneralTaxInformation/Tax%20Types%20and%20Information/EmployerWithholding/Documents/EFW2-EFW2C_reporting_inst_and_specs.pdf foreach ( range( 'a', 'z' ) as $z ) { $l15_state = 'l15' . $z . '_state'; if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) { $l15_state_id = 'l15' . $z . '_state_id'; break; } } $line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' ); //(3-4)[2]: State Code $line[] = $this->padRecord( $this->year, 4, 'N' ); //(5-8)[4]: Tax Year $line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' ); //(9-16)[8]: PA Employer Account ID $line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' ); //(17-25)[9]: Employer Entity ID $line[] = $this->padRecord( $total->total, 7, 'N' ); //(26-32)[7]: Total RS records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //(33-47)[15]: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //(48-62)[15]: State Income Tax Withheld $line[] = $this->padRecord( '', 450, 'AN' ); //(63-512)[450]: Blank break; default: //SSA specifications state RV records are optional and not processed or shared anyways. //$retval = false; $line[] = $this->padRecord( $total->total, 7, 'N' ); //Total RW records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //State Wages, Tips and Other Compensation $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' ); //State Income Tax $line[] = $this->padRecord( '', 473, 'AN' ); //Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RV Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RV Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } return false; } function _compileRF( $total ) { //RF (Final) Record - Total number of RW (Employee) Records reported on the entire file. if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states. return false; } $line[] = 'RF'; //RF Record switch ( strtolower( $this->efile_state ) ) { case 'ct': $line[] = $this->padRecord( $total->total, 9, 'N' ); //(3-11)[9]: Total RS records. $line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 16, 'N' ); //(12-27)[16]: CT: State Taxable Wages $line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 16, 'N' ); //(28-43)[16]: CT: State Tax Withheld $line[] = $this->padRecord( '', 469, 'AN' ); //(44-512)[469]: Blank break; case 'ny': case 'pa': $line[] = $this->padRecord( '', 510, 'AN' ); //Blank break; default: $line[] = $this->padRecord( '', 5, 'AN' ); //Blank $line[] = $this->padRecord( $total->total, 9, 'N' ); //Total RW records. $line[] = $this->padRecord( '', 496, 'AN' ); //Blank break; } $retval = implode( ( $this->debug == true ) ? ',' : '', $line ); if ( $this->debug == false && strlen( $retval ) != 512 ) { Debug::Text( 'ERROR! RF Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 ); return false; } Debug::Text( 'RF Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 ); return $retval; } //Fixed length field EFW2C format function _outputEFILE( $type = null ) { //DISABLED FOR NOW as it hasn't been implemented yet! return false; /* Submitter Record (RA) Employer Record (RE) Employee Wage Records (RW AND RO) State Wage Record (RS) Total Records (RT and RU) State Total Record (RV) - Page 64 Final Record (RF) Publication 42-007: http://www.ssa.gov/employer/EFW2&EFW2C.htm Download: AccuWage from the bottom of this website for testing: http://www.socialsecurity.gov/employer/accuwage/index.html */ $records = $this->getRecords(); //Debug::Arr($records, 'Output EFILE Records: ',__FILE__, __LINE__, __METHOD__, 10); if ( is_array( $records ) && count( $records ) > 0 ) { $retval = $this->padLine( $this->_compileRA() ); $retval .= $this->padLine( $this->_compileRE() ); $rt_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'l1', 'l2', 'l3', 'l4', 'l5', 'l6', 'l7', 'l10', 'l11', 'l12d', 'l12e', 'l12f', 'l12g', 'l12h', 'l12w', 'l12aa', 'l12bb', 'l12dd' ], 0 ); $rw_total = Misc::preSetArrayValues( new stdClass(), [ 'total' ], 0 ); $ro_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'l8', 'l12a', 'l12b', 'l12r', 'l12s', 'l12t', 'l12m', 'l12n', 'l12z', 'l12ee', 'l12gg', 'l12hh' ], 0 ); $i = 0; foreach ( $records as $w2_data ) { $this->arrayToObject( $w2_data ); //Convert record array to object $compile_rw_retval = $this->padLine( $this->_compileRW() ); if ( $compile_rw_retval != '' ) { $retval .= $compile_rw_retval; $rw_total->total += 1; } $retval .= $this->padLine( $this->_compileRO() ); $state_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'state_taxable_wages', 'state_income_tax', 'local_taxable_wages', 'local_income_tax' ], 0 ); foreach ( range( 'a', 'z' ) as $z ) { $compile_rs_retval = $this->padLine( $this->_compileRS( $z ) ); if ( $compile_rs_retval != '' ) { $retval .= $compile_rs_retval; $state_total->total += 1; $state_total->state_taxable_wages += $this->{'l16' . $z}; $state_total->state_income_tax += $this->{'l17' . $z}; $state_total->local_taxable_wages += $this->{'l18' . $z}; $state_total->local_income_tax += $this->{'l19' . $z}; } } $rt_total->total += 1; $rt_total->l1 += $this->l1; $rt_total->l2 += $this->l2; $rt_total->l3 += $this->l3; $rt_total->l4 += $this->l4; $rt_total->l5 += $this->l5; $rt_total->l6 += $this->l6; $rt_total->l7 += $this->l7; $rt_total->l10 += $this->l10; $rt_total->l11 += $this->l11; $rt_total->l12d += $this->_getL12AmountByCode( 'D' ); $rt_total->l12e += $this->_getL12AmountByCode( 'E' ); $rt_total->l12f += $this->_getL12AmountByCode( 'F' ); $rt_total->l12g += $this->_getL12AmountByCode( 'G' ); $rt_total->l12h += $this->_getL12AmountByCode( 'H' ); $rt_total->l12w += $this->_getL12AmountByCode( 'W' ); $rt_total->l12aa += $this->_getL12AmountByCode( 'AA' ); $rt_total->l12bb += $this->_getL12AmountByCode( 'BB' ); $rt_total->l12dd += $this->_getL12AmountByCode( 'DD' ); $ro_total->total += 1; $ro_total->l8 += $this->l8; $ro_total->l12a += $this->_getL12AmountByCode( 'A' ); $ro_total->l12b += $this->_getL12AmountByCode( 'B' ); $ro_total->l12r += $this->_getL12AmountByCode( 'R' ); $ro_total->l12s += $this->_getL12AmountByCode( 'S' ); $ro_total->l12t += $this->_getL12AmountByCode( 'T' ); $ro_total->l12m += $this->_getL12AmountByCode( 'M' ); $ro_total->l12n += $this->_getL12AmountByCode( 'N' ); $ro_total->l12z += $this->_getL12AmountByCode( 'Z' ); $ro_total->l12ee += $this->_getL12AmountByCode( 'EE' ); $ro_total->l12gg += $this->_getL12AmountByCode( 'GG' ); $ro_total->l12hh += $this->_getL12AmountByCode( 'HH' ); $this->revertToOriginalDataState(); $i++; } if ( in_array( $this->efile_state, [ 'CT', 'MA' ] ) ) { $retval .= $this->padLine( $this->_compileRT( $state_total ) ); //CT uses the RT record like an RV record, showing state totals. } else { $retval .= $this->padLine( $this->_compileRT( $rt_total ) ); } $retval .= $this->padLine( $this->_compileRU( $ro_total ) ); $retval .= $this->padLine( $this->_compileRV( $state_total ) ); //State Total Record if ( in_array( $this->efile_state, [ 'CT', 'MA', 'VA' ] ) ) { $retval .= $this->padLine( $this->_compileRF( $state_total ) ); } else { $retval .= $this->padLine( $this->_compileRF( $rw_total ) ); } } if ( isset( $retval ) ) { return $retval; } return false; } //Gets Line 14 amount by the name associated with that Line. function getL14AmountByName( $name ) { $name = trim( $name ); $retval = 0; if ( $name != '' ) { foreach ( range( 'a', 'd' ) as $z ) { $l14_field = 'l14' . $z; $l14_name_field = 'l14' . $z . '_name'; if ( strtolower( trim( $this->$l14_name_field ) ) == strtolower( $name ) ) { $retval = $this->$l14_field; break; } } } return $retval; } //This takes a single employee record and moves state/locality data from rows c, d, e, f, ... into rows a,b. // Because it changes the data, it can be run multiple times on the same input data. function handleThreeOrMoreStateData( $data ) { //FIXME: Add support for more than two states. return false; } //Return just array elements that *do not* match in each record. Always keep mandatory elements too though. function comparePreviousAndCorrectRecords( $previous_record, $correct_record ) { //Always keep these elements in the correct record. $mandatory_elements_to_keep = [ 'user_id', 'ssn', 'first_name', 'middle_name', 'last_name', 'address1', 'address2', 'city', 'province', 'postal_code' ]; $previous_record_elements_to_remove = [ 'ssn', 'first_name', 'middle_name', 'last_name' ]; foreach( $correct_record as $correct_record_key => $correct_record_value ) { if ( in_array( $correct_record_key, $mandatory_elements_to_keep ) ) { if ( in_array( $correct_record_key, $previous_record_elements_to_remove ) && isset( $previous_record[$correct_record_key] ) && $previous_record[$correct_record_key] == $correct_record_value ) { unset( $previous_record[$correct_record_key] ); } } else { if ( isset( $previous_record[$correct_record_key] ) && $previous_record[$correct_record_key] == $correct_record_value ) { unset( $previous_record[$correct_record_key], $correct_record[$correct_record_key] ); } } } return [ $previous_record, $correct_record ]; } function convertW2ObjectToPrevious( $previous_record ) { if ( is_array( $previous_record ) && !empty( $previous_record ) ) { $retarr = []; foreach( $previous_record as $key => $value ) { $retarr['previous_'.$key] = $value; } return $retarr; } return []; } function mergeCorrectAndPreviousW2Objects( $correct_fw2_obj, $previous_fw2_obj ) { //Loop over previos records, and find matching correct records to merge in. $this->year = $correct_fw2_obj->year; $this->ein = $correct_fw2_obj->ein; $this->name = $correct_fw2_obj->name; $this->trade_name = $correct_fw2_obj->trade_name; $this->company_address1 = $correct_fw2_obj->company_address1; $this->company_address2 = $correct_fw2_obj->company_address2; $this->company_city = $correct_fw2_obj->company_city; $this->company_state = $correct_fw2_obj->company_state; $this->company_zip_code = $correct_fw2_obj->company_zip_code; //Get array of both sets of records. $previous_records = $previous_fw2_obj->getRecords(); $correct_records = $correct_fw2_obj->getRecords(); if ( is_array( $previous_records ) && !empty( $previous_records ) ) { foreach( $previous_records as $previous_record ) { //Find matching correct record. if ( is_array( $correct_records ) && !empty( $correct_records ) ) { foreach ( $correct_records as $correct_record_key => $correct_record ) { if ( isset($previous_record['user_id']) && isset( $correct_record['user_id'] ) && $previous_record['user_id'] == $correct_record['user_id'] ) { //Find only the differences between each record. [ $previous_record, $correct_record ] = $this->comparePreviousAndCorrectRecords( $previous_record, $correct_record ); //Merge both records. $this->addRecord( array_merge( $this->convertW2ObjectToPrevious( $previous_record ), $correct_record ) ); unset( $correct_records[$correct_record_key] ); //Remove correct record from list now thats it been used. break; } } } } return true; } return false; } //This takes a single employee record that has three or more states/localities and splits them into multiple records to simplify generating the PDFs. function handleMultipleForms( $records ) { $tmp_records = []; if ( is_array( $records ) && count( $records ) > 0 ) { foreach ( $records as $employee_data ) { $tmp_records[] = $employee_data; $tmp_record = $employee_data; do { $tmp_record = $this->handleThreeOrMoreStateData( $tmp_record ); if ( is_array( $tmp_record ) ) { $tmp_records[] = $tmp_record; } } while ( is_array( $tmp_record ) ); } } $this->clearRecords(); $this->setRecords( $tmp_records ); return $this->getRecords(); } function _outputPDF( $type ) { //Initialize PDF with template. $pdf = $this->getPDFObject(); if ( $this->getShowBackground() == true ) { $pdf->setSourceFile( $this->getTemplateDirectory() . DIRECTORY_SEPARATOR . $this->pdf_template ); for ( $tp = 1; $tp <= 9; $tp++ ) { $this->template_index[$tp] = $pdf->ImportPage( $tp ); } } if ( $this->year == '' ) { $this->year = $this->getYear(); } if ( $this->getType() == 'government' ) { if ( $this->efile_state != '' ) { //When doing state filing, only include the state copy of the W2. $form_template_pages = [ 3 ]; //Template pages to use. } else { $form_template_pages = [ 2, 3, 8 ]; //Template pages to use. 2=SSA, 3=State, City, Local, 10=Employer } } else { $form_template_pages = [ 4, 5, 7 ]; //Template pages to use. 4=Employee Federal Return, 6=Employee Records, 7=Employee State, City Local } //Get location map, start looping over each variable and drawing $records = $this->handleMultipleForms( $this->getRecords() ); if ( is_array( $records ) && count( $records ) > 0 ) { $template_schema = $this->getTemplateSchema(); foreach ( $form_template_pages as $key => $form_template_page ) { //Set the template used. $template_schema[0]['template_page'] = $form_template_page; $e = 0; foreach ( $records as $employee_data ) { //Debug::Arr($employee_data, 'Employee Data: ', __FILE__, __LINE__, __METHOD__,10); $this->arrayToObject( $employee_data ); //Convert record array to object $this->setTempPageOffsets( $this->getPageOffsets( 'x' ), $this->getPageOffsets( 'y' ) ); foreach ( $template_schema as $field => $schema ) { $this->Draw( $this->$field, $schema ); } $this->resetTemplatePage(); $this->revertToOriginalDataState(); $e++; } } } return true; } } ?>