2053 lines
		
	
	
		
			78 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			2053 lines
		
	
	
		
			78 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/*********************************************************************************
 | 
						|
 *
 | 
						|
 * TimeTrex is a Workforce Management program developed by
 | 
						|
 * TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify it under
 | 
						|
 * the terms of the GNU Affero General Public License version 3 as published by
 | 
						|
 * the Free Software Foundation with the addition of the following permission
 | 
						|
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 | 
						|
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
 | 
						|
 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful, but WITHOUT
 | 
						|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 | 
						|
 * details.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU Affero General Public License along
 | 
						|
 * with this program; if not, see http://www.gnu.org/licenses or write to the Free
 | 
						|
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
 * 02110-1301 USA.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
 | 
						|
 * #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The interactive user interfaces in modified source and object code versions
 | 
						|
 * of this program must display Appropriate Legal Notices, as required under
 | 
						|
 * Section 5 of the GNU Affero General Public License version 3.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * In accordance with Section 7(b) of the GNU Affero General Public License
 | 
						|
 * version 3, these Appropriate Legal Notices must retain the display of the
 | 
						|
 * "Powered by TimeTrex" logo. If the display of the logo is not reasonably
 | 
						|
 * feasible for technical reasons, the Appropriate Legal Notices must display
 | 
						|
 * the words "Powered by TimeTrex".
 | 
						|
 *
 | 
						|
 ********************************************************************************/
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @package Modules\Payroll Agency
 | 
						|
 */
 | 
						|
class PayrollRemittanceAgencyFactory extends Factory {
 | 
						|
	protected $table = 'payroll_remittance_agency';
 | 
						|
	protected $pk_sequence_name = 'payroll_remittance_agency_id_seq'; //PK Sequence name
 | 
						|
 | 
						|
	protected $legal_entity_obj = null;
 | 
						|
	protected $contact_user_obj = null;
 | 
						|
	protected $remittance_source_account_obj = null;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var bool
 | 
						|
	 */
 | 
						|
	private $add_event_preset;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param bool $name
 | 
						|
	 * @param null $params
 | 
						|
	 * @return array|mixed|null
 | 
						|
	 */
 | 
						|
	function _getFactoryOptions( $name = false, $params = null ) {
 | 
						|
 | 
						|
		$retval = null;
 | 
						|
		switch ( $name ) {
 | 
						|
			case 'status':
 | 
						|
				$retval = [
 | 
						|
						10 => TTi18n::gettext( 'Enabled' ),
 | 
						|
						20 => TTi18n::gettext( 'Disabled' ),
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'type':
 | 
						|
				$retval = [
 | 
						|
						10 => TTi18n::gettext( 'Federal' ),
 | 
						|
						20 => TTi18n::gettext( 'Provincial/State' ),
 | 
						|
						30 => TTi18n::gettext( 'Local (City/District/County)' ),
 | 
						|
						40 => TTi18n::gettext( '3rd Party' ),
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'always_week_day':
 | 
						|
				$retval = [
 | 
						|
					//Adjust holiday to next weekday
 | 
						|
					0 => TTi18n::gettext( 'No' ),
 | 
						|
					1 => TTi18n::gettext( 'Yes - Previous Business Day' ),
 | 
						|
					2 => TTi18n::gettext( 'Yes - Next Business Day' ),
 | 
						|
					3 => TTi18n::gettext( 'Yes - Closest Business Day' ),
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'agency_id_field_labels':
 | 
						|
				if ( !isset( $params['agency_id'] ) ) {
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
 | 
						|
				$retval = [
 | 
						|
						'primary_identification'   => TTi18n::gettext( 'Primary Identification' ),
 | 
						|
						'secondary_identification' => TTi18n::gettext( 'Secondary Identification' ),
 | 
						|
						'tertiary_identification'  => TTi18n::gettext( 'Tertiary Identification' ),
 | 
						|
				];
 | 
						|
 | 
						|
				$val = $this->parseAgencyID( $params['agency_id'] );
 | 
						|
				$type_id = $val['type_id'];
 | 
						|
				$country = $val['country'];
 | 
						|
				$province = $val['province'];
 | 
						|
				$id = $val['id'];
 | 
						|
 | 
						|
				switch ( $type_id ) {
 | 
						|
					case 10: //Federal
 | 
						|
						$agency_labels = [
 | 
						|
								'10:CA:00:00:0010' => [
 | 
						|
										'primary_identification' => TTi18n::gettext( 'Business Number' ),
 | 
						|
										//'secondary_identification' => TTi18n::gettext( 'Transmitter #' ),
 | 
						|
										//'tertiary_identification' => TTi18n::gettext( 'Web Access Code' )
 | 
						|
								],
 | 
						|
								'10:CA:00:00:0020' => [], //Get the business number from CRA agency above. This needs to login to CRA
 | 
						|
								'10:US:00:00:0010' => [ 'primary_identification' => TTi18n::gettext( 'EIN' ), 'tertiary_identification' => TTi18n::gettext( 'eFile User ID' ) ],
 | 
						|
								'10:US:00:00:0020' => [ 'primary_identification' => TTi18n::gettext( 'EIN' ) ],
 | 
						|
						];
 | 
						|
 | 
						|
						break;
 | 
						|
					case 20: //Province/State
 | 
						|
						if ( $country == 'US' ) {
 | 
						|
							if ( (int)$id == 10 ) {
 | 
						|
								switch ( $province ) { // See: http://kb.drakesoftware.com/Site/Browse/W2-State-eFiling-in-CWU
 | 
						|
									case 'CA': //CA combines state income tax with UI, so this does *not* need to be defined in the "20" agency ID.
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'State Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									//case 'CO': //Does not seem to require State Control Number - https://www.colorado.gov/pacific/sites/default/files/Withholding6.pdf
 | 
						|
									//case 'KS':
 | 
						|
									//case 'VT': //Does not require State Control Number - https://tax.vermont.gov/sites/tax/files/documents/GB-1118.pdf
 | 
						|
									//	$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'State ID #' ), 'secondary_identification' => TTi18n::gettext( 'State Control Code' ) ];
 | 
						|
									//	break;
 | 
						|
									case 'IA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Withholding Permit #' ), 'secondary_identification' => TTi18n::gettext( 'Business eFile Number (BEN)' ), ];
 | 
						|
										break;
 | 
						|
									case 'IN':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Taxpayer ID (TID) (13 Digits)' ) ];
 | 
						|
										break;
 | 
						|
									case 'ME':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Withholding Account Number' ) ];
 | 
						|
										break;
 | 
						|
									case 'MN':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Tax ID Number' ) ];
 | 
						|
										break;
 | 
						|
									case 'NJ':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Taxpayer Identification Number' ) ];
 | 
						|
										break;
 | 
						|
									case 'WI':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Tax Account Number' ) ];
 | 
						|
										break;
 | 
						|
									//case 'DC':  -- Not 100% certain about these, so allow ID field to be entered still.
 | 
						|
									//case 'GA':
 | 
						|
									//case 'KY':
 | 
						|
									//case 'NE':
 | 
						|
									//case 'ND':
 | 
						|
									//case 'UT':
 | 
						|
									//	$agency_labels[$params['agency_id']] = []; //No State Employer Tax ID, uses FEIN instead most likely?
 | 
						|
									//	break;
 | 
						|
									default:
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'State ID #' ) ]; //, 'tertiary_identification' => TTi18n::gettext( 'eFile User ID' ) ];
 | 
						|
										break;
 | 
						|
								}
 | 
						|
							} else if ( (int)$id == 20 ) { //State UI
 | 
						|
								switch ( $province ) {
 | 
						|
									case 'AL':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UC Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'AK':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'AZ':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Tax Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'AR':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Workforce Services ID #' ) ];
 | 
						|
										break;
 | 
						|
									//case 'CA': //CA combines state income tax with UI, so this defined in the "10" agency ID.
 | 
						|
									//	$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'State Employer Account #' ) ];
 | 
						|
									//	break;
 | 
						|
									case 'CO':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UI Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'CT':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Registration #' ) ];
 | 
						|
										break;
 | 
						|
									case 'FL':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Reemployment Tax Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'GA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Department of Labor Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'IL':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'IN':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'SUTA Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'KY':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UI Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'LA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Tax Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MD':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Insurance Employer #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MI':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UIA Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MN':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Insurance Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MS':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MO':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'MT':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UI Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NE':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NV':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'MBT Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NH':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'NHE Employer #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NJ':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Registration' ) ];
 | 
						|
										break;
 | 
						|
									case 'NM':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Insurance Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NY':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Registration #' ) ];
 | 
						|
										break;
 | 
						|
									case 'NC':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Tax' ) ];
 | 
						|
										break;
 | 
						|
									case 'OH':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'OK':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'OR':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Business Identification #' ) ];
 | 
						|
										break;
 | 
						|
									case 'PA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UC Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'TN':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employer Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'TX':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'TWC Tax Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'UT':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'DWS Employer Registration #' ) ];
 | 
						|
										break;
 | 
						|
									case 'VA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employment Commission Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'WA':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Employment Security (ES) Reference #' ) ];
 | 
						|
										break;
 | 
						|
									case 'WV':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Unemployment Compensation Account #' ) ];
 | 
						|
										break;
 | 
						|
									case 'WI':
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'Department of Workforce Development UI Account #' ) ];
 | 
						|
										break;
 | 
						|
									default:
 | 
						|
										$agency_labels[$params['agency_id']] = [ 'primary_identification' => TTi18n::gettext( 'UI Account #' ) ];
 | 
						|
										break;
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
 | 
						|
						break;
 | 
						|
				}
 | 
						|
 | 
						|
				if ( isset( $agency_labels[$params['agency_id']] ) ) {
 | 
						|
					$retval = $agency_labels[$params['agency_id']];
 | 
						|
				}
 | 
						|
 | 
						|
				break;
 | 
						|
			case 'agency':
 | 
						|
				//All 4 params must be specified
 | 
						|
				if ( !isset( $params['type_id'] ) || !isset( $params['country'] ) || !isset( $params['province'] ) || !isset( $params['district'] ) ) {
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
 | 
						|
				if ( $params['country'] == false ) {
 | 
						|
					$params['country'] = '00';
 | 
						|
				}
 | 
						|
				if ( $params['province'] == false ) {
 | 
						|
					$params['province'] = '00';
 | 
						|
				}
 | 
						|
				if ( $params['district'] == false ) {
 | 
						|
					$params['district'] = '00';
 | 
						|
				}
 | 
						|
 | 
						|
				$params['country'] = strtoupper( $params['country'] );
 | 
						|
				$params['province'] = strtoupper( $params['province'] );
 | 
						|
				$params['district'] = strtoupper( $params['district'] );
 | 
						|
 | 
						|
				//List of agencies and important information, such as holidays and dates. https://community.intuit.com/browse/payroll-compliance-us-en
 | 
						|
				//Federal New Hire reporting law: More info: https://www.law.cornell.edu/uscode/text/42/653a, https://newhire-reporting.com/TN-Newhire/PrintForm.aspx
 | 
						|
 | 
						|
				$options = [
 | 
						|
					// Canada IDs start with 1, US with 2.
 | 
						|
					'10' => [ //Federal
 | 
						|
							  'CA' => [
 | 
						|
									  '10' => TTi18n::gettext( 'Canada Revenue Agency (CRA)' ), //[Federal/Provincial Tax/EI/CPP]
 | 
						|
									  '20' => TTi18n::gettext( 'Service Canada [ROE]' ),
 | 
						|
							  ],
 | 
						|
 | 
						|
							  'US' => [
 | 
						|
									  '10'  => TTi18n::gettext( 'Internal Revenue Service (IRS)' ), //Tax, Social Security, Form 941, 940, 1099 //[Federal Tax/Social Security/Medicare]
 | 
						|
									  '20'  => TTi18n::gettext( 'Social Security Administration (SSA)' ), //Form W2, no payments. //[FUTA/Unemployment]
 | 
						|
									  '100' => TTi18n::gettext( 'Centers for Medicare & Medical Services (CMS.gov)' ), //CMS Payroll Based Jounal (PBJ)
 | 
						|
							  ],
 | 
						|
					],
 | 
						|
					'20' => [ //Province/State
 | 
						|
							  'CA' => [
 | 
						|
									  'AB' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Program (MEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ),
 | 
						|
									  ],
 | 
						|
									  'BC' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Family Maintenance Enforcement Program (FMEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Worksafe BC' ),
 | 
						|
									  ],
 | 
						|
									  'SK' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Office' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ),
 | 
						|
									  ],
 | 
						|
									  'MB' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Program (MEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ),
 | 
						|
									  ],
 | 
						|
									  'QC' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Support-Payment Collection Progam' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ),
 | 
						|
									  ],
 | 
						|
									  'ON' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Family Responsibility Office' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workplace Safety and Insurance Board' ),
 | 
						|
									  ],
 | 
						|
									  'NL' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Support Enforcement Program' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workplace Health, Safety & Compensation Commission' ),
 | 
						|
									  ],
 | 
						|
									  'NB' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Office of Support Enforcement (OSE)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Worksafe NB' ),
 | 
						|
									  ],
 | 
						|
									  'NS' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Program (MEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ) //Paid through the CRA.
 | 
						|
									  ],
 | 
						|
									  'PE' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Program (MEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation Board' ),
 | 
						|
									  ],
 | 
						|
									  'NT' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Program (MEP)' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Safety and Compensation Commission' ),
 | 
						|
									  ],
 | 
						|
									  'YT' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Office' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation, Health and Safety Board' ),
 | 
						|
									  ],
 | 
						|
									  'NU' => [
 | 
						|
											  '40'  => TTi18n::gettext( 'Maintenance Enforcement Office' ), //ie: Child Support
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Safety and Compensation Commission' ),
 | 
						|
									  ],
 | 
						|
							  ],
 | 
						|
							  'US' => [
 | 
						|
									  'AL' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'AK' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'AZ' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'AR' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'CA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  //'20' => TTi18n::gettext('State Government [Unemployment Insurance]'), //Combined with State
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'CO' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'CT' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'DE' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'DC' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'FL' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'GA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'HI' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'ID' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'IL' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'IN' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'IA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'KS' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'KY' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'LA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'ME' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MD' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MI' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MN' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MS' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MO' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'MT' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NE' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NV' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NH' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NM' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  //'20' => TTi18n::gettext('State Government [Unemployment Insurance]'), //Combined with State Income Tax
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NJ' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NY' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  //'20' => TTi18n::gettext('State Government [Unemployment Insurance]'), //Combined with State Income Tax
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'NC' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'ND' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'State Government [Workers Compensation]' ), //Mandatory
 | 
						|
									  ],
 | 
						|
									  'OH' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'State Government [Workers Compensation]' ), //Mandatory
 | 
						|
									  ],
 | 
						|
									  'OK' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'OR' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  //'20' => TTi18n::gettext('State Government [Unemployment Insurance]'), //Combined with income tax.
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'PA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'RI' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'SC' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'SD' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'TN' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'TX' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'UT' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'VT' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'VA' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'WA' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
										  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  '100' => TTi18n::gettext( 'State Government [Workers Compensation]' ), //Mandatory
 | 
						|
									  ],
 | 
						|
									  'WV' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'WI' => [
 | 
						|
											  '10'  => TTi18n::gettext( 'State Government [State Income Tax]' ),
 | 
						|
											  '20'  => TTi18n::gettext( 'State Government [Unemployment Insurance]' ),
 | 
						|
											  '30'  => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
											  '40'  => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
											  '100' => TTi18n::gettext( 'Workers Compensation' ),
 | 
						|
									  ],
 | 
						|
									  'WY' => [
 | 
						|
										  //'10' => TTi18n::gettext('State Government [State Income Tax]'), //No state income tax.
 | 
						|
										  '20' => TTi18n::gettext( 'State Government [Unemployment Insurance/WC]' ),
 | 
						|
										  '30' => TTi18n::gettext( 'State Government [New Hires]' ),
 | 
						|
										  '40' => TTi18n::gettext( 'State Government [Child Support]' ),
 | 
						|
										  //'100' => TTi18n::gettext('State Government [Workers Compensation]'), //Mandatory (Combined with Unemployment Insurance)
 | 
						|
									  ],
 | 
						|
							  ],
 | 
						|
					],
 | 
						|
					'30' => [ //District/Local
 | 
						|
							  'CA' => [
 | 
						|
									  'AB' => [],
 | 
						|
									  'BC' => [],
 | 
						|
									  'SK' => [],
 | 
						|
									  'MB' => [],
 | 
						|
									  'QC' => [],
 | 
						|
									  'ON' => [],
 | 
						|
									  'NL' => [],
 | 
						|
									  'NB' => [],
 | 
						|
									  'NS' => [],
 | 
						|
									  'PE' => [],
 | 
						|
									  'NT' => [],
 | 
						|
									  'YT' => [],
 | 
						|
									  'NU' => [],
 | 
						|
							  ],
 | 
						|
							  'US' => [
 | 
						|
									  'AL' => [],
 | 
						|
									  'AK' => [],
 | 
						|
									  'AZ' => [],
 | 
						|
									  'AR' => [],
 | 
						|
									  'CA' => [],
 | 
						|
									  'CO' => [],
 | 
						|
									  'CT' => [],
 | 
						|
									  'DE' => [],
 | 
						|
									  'DC' => [],
 | 
						|
									  'FL' => [],
 | 
						|
									  'GA' => [],
 | 
						|
									  'HI' => [],
 | 
						|
									  'ID' => [],
 | 
						|
									  'IL' => [],
 | 
						|
									  'IN' => [],
 | 
						|
									  'IA' => [],
 | 
						|
									  'KS' => [],
 | 
						|
									  'KY' => [],
 | 
						|
									  'LA' => [],
 | 
						|
									  'ME' => [],
 | 
						|
									  'MD' => [],
 | 
						|
									  'MA' => [],
 | 
						|
									  'MI' => [],
 | 
						|
									  'MN' => [],
 | 
						|
									  'MS' => [],
 | 
						|
									  'MO' => [],
 | 
						|
									  'MT' => [],
 | 
						|
									  'NE' => [],
 | 
						|
									  'NV' => [],
 | 
						|
									  'NH' => [],
 | 
						|
									  'NM' => [],
 | 
						|
									  'NJ' => [],
 | 
						|
									  'NY' => [
 | 
						|
											  'NYC'     => [ '10' => TTi18n::gettext( 'New York City [City Income Tax]' ) ],
 | 
						|
											  'YONKERS' => [ '20' => TTi18n::gettext( 'Yonkers [City Income Tax]' ) ],
 | 
						|
									  ],
 | 
						|
									  'NC' => [],
 | 
						|
									  'ND' => [],
 | 
						|
									  'OH' => [
 | 
						|
											  '00' => [ '10' => TTi18n::gettext( 'Regional Income Tax Agency (RITA) [Local Income Tax]' ) ],
 | 
						|
									  ],
 | 
						|
									  'OK' => [],
 | 
						|
									  'OR' => [],
 | 
						|
									  'PA' => [],
 | 
						|
									  'RI' => [],
 | 
						|
									  'SC' => [],
 | 
						|
									  'SD' => [],
 | 
						|
									  'TN' => [],
 | 
						|
									  'TX' => [],
 | 
						|
									  'UT' => [],
 | 
						|
									  'VT' => [],
 | 
						|
									  'VA' => [],
 | 
						|
									  'WA' => [],
 | 
						|
									  'WV' => [],
 | 
						|
									  'WI' => [],
 | 
						|
									  'WY' => [],
 | 
						|
							  ],
 | 
						|
					],
 | 
						|
					'40' => [ //3rd Party
 | 
						|
							  'CA' => [
 | 
						|
									  '00' => [
 | 
						|
 | 
						|
											  '1010' => TTi18n::gettext( 'Blue Cross' ),
 | 
						|
											  '1020' => TTi18n::gettext( 'Standard Life' ),
 | 
						|
											  '1030' => TTi18n::gettext( 'Great West Life' ),
 | 
						|
											  '1040' => TTi18n::gettext( 'Sun Life' ),
 | 
						|
											  '1050' => TTi18n::gettext( 'Manulife' ),
 | 
						|
											  '1060' => TTi18n::gettext( 'BCAA' ),
 | 
						|
											  '8000' => TTi18n::gettext( 'Union' ),
 | 
						|
											  '9500' => TTi18n::gettext( 'Child Support' ),
 | 
						|
											  '9510' => TTi18n::gettext( 'Garnishment' ),
 | 
						|
									  ],
 | 
						|
									  'AB' => [//9999 => TTi18n::gettext('BCAA'),
 | 
						|
									  ],
 | 
						|
									  'BC' => [],
 | 
						|
									  'SK' => [],
 | 
						|
									  'MB' => [],
 | 
						|
									  'QC' => [],
 | 
						|
									  'ON' => [],
 | 
						|
									  'NL' => [],
 | 
						|
									  'NB' => [],
 | 
						|
									  'NS' => [],
 | 
						|
									  'PE' => [],
 | 
						|
									  'NT' => [],
 | 
						|
									  'YT' => [],
 | 
						|
									  'NU' => [],
 | 
						|
							  ],
 | 
						|
							  'US' => [
 | 
						|
									  '00' => [
 | 
						|
											  '1010' => 'Aetna',
 | 
						|
											  '1020' => 'AIG',
 | 
						|
											  '1030' => 'All Savers',
 | 
						|
											  '1040' => 'Allied National',
 | 
						|
											  '1050' => 'Always Care',
 | 
						|
											  '1060' => 'Ameritas',
 | 
						|
											  '1070' => 'Assurant Health',
 | 
						|
											  '1080' => 'Assurant Employee Benefits',
 | 
						|
											  '1090' => 'Avesis',
 | 
						|
											  '1110' => 'BCBS',
 | 
						|
											  '1120' => 'BEST',
 | 
						|
											  '1130' => 'Christian Church Health Care Benefit Trust',
 | 
						|
											  '1140' => 'Cigna',
 | 
						|
											  '1150' => 'Coventry',
 | 
						|
											  '1160' => 'Dearborn National',
 | 
						|
											  '1170' => 'Delta Dental',
 | 
						|
											  '1180' => 'Dental Select',
 | 
						|
											  '1190' => 'Eye Med',
 | 
						|
											  '1200' => 'First Continental',
 | 
						|
											  '1210' => 'Guardian',
 | 
						|
											  '1220' => 'Guidestone',
 | 
						|
											  '1230' => 'Humana',
 | 
						|
											  '1240' => 'Lincoln Financial',
 | 
						|
											  '1250' => 'Memorial Hermann',
 | 
						|
											  '1260' => 'Meritain Health',
 | 
						|
											  '1270' => 'MetLife',
 | 
						|
											  '1280' => 'Mutual of Omaha',
 | 
						|
											  '1290' => 'National Guardian Vision',
 | 
						|
											  '1300' => 'National Vision Administrators',
 | 
						|
											  '1310' => 'Nippon Life',
 | 
						|
											  '1320' => 'OptiMed',
 | 
						|
											  '1330' => 'PHCS MultiPlan',
 | 
						|
											  '1340' => 'Principal Financial',
 | 
						|
											  '1350' => 'Reliance Standard',
 | 
						|
											  '1360' => 'Scott & White',
 | 
						|
											  '1370' => 'Starmark',
 | 
						|
											  '1380' => 'Sun Life',
 | 
						|
											  '1390' => 'Sure Bridge',
 | 
						|
											  '1400' => 'The Standard',
 | 
						|
											  '1410' => 'Transamerica',
 | 
						|
											  '1420' => 'UHC River Valley',
 | 
						|
											  '1430' => 'UMR',
 | 
						|
											  '1440' => 'United',
 | 
						|
											  '1450' => 'United Concordia',
 | 
						|
											  '1460' => 'Unum',
 | 
						|
											  '1470' => 'VSP',
 | 
						|
											  '8000' => 'Union',
 | 
						|
											  '9500' => TTi18n::gettext( 'Child Support' ),
 | 
						|
											  '9510' => TTi18n::gettext( 'Garnishment' ),
 | 
						|
									  ],
 | 
						|
									  'AL' => [],
 | 
						|
									  'AK' => [],
 | 
						|
									  'AZ' => [],
 | 
						|
									  'AR' => [],
 | 
						|
									  'CA' => [],
 | 
						|
									  'CO' => [],
 | 
						|
									  'CT' => [],
 | 
						|
									  'DE' => [],
 | 
						|
									  'DC' => [],
 | 
						|
									  'FL' => [],
 | 
						|
									  'GA' => [],
 | 
						|
									  'HI' => [],
 | 
						|
									  'ID' => [],
 | 
						|
									  'IL' => [],
 | 
						|
									  'IN' => [],
 | 
						|
									  'IA' => [],
 | 
						|
									  'KS' => [],
 | 
						|
									  'KY' => [],
 | 
						|
									  'LA' => [],
 | 
						|
									  'ME' => [],
 | 
						|
									  'MD' => [],
 | 
						|
									  'MA' => [],
 | 
						|
									  'MI' => [],
 | 
						|
									  'MN' => [],
 | 
						|
									  'MS' => [],
 | 
						|
									  'MO' => [],
 | 
						|
									  'MT' => [],
 | 
						|
									  'NE' => [],
 | 
						|
									  'NV' => [],
 | 
						|
									  'NH' => [],
 | 
						|
									  'NM' => [],
 | 
						|
									  'NJ' => [],
 | 
						|
									  'NY' => [],
 | 
						|
									  'NC' => [],
 | 
						|
									  'ND' => [],
 | 
						|
									  'OH' => [],
 | 
						|
									  'OK' => [],
 | 
						|
									  'OR' => [],
 | 
						|
									  'PA' => [],
 | 
						|
									  'RI' => [],
 | 
						|
									  'SC' => [],
 | 
						|
									  'SD' => [],
 | 
						|
									  'TN' => [],
 | 
						|
									  'TX' => [],
 | 
						|
									  'UT' => [],
 | 
						|
									  'VT' => [],
 | 
						|
									  'VA' => [],
 | 
						|
									  'WA' => [],
 | 
						|
									  'WV' => [],
 | 
						|
									  'WI' => [],
 | 
						|
									  'WY' => [],
 | 
						|
							  ],
 | 
						|
					],
 | 
						|
				];
 | 
						|
 | 
						|
				//Return all values in the following format:
 | 
						|
				//IDs: <Type>:<Country Code>:<Province Code>:<District Code>:<ID>
 | 
						|
 | 
						|
				$prefix = $params['type_id'] . ':' . $params['country'] . ':' . ( isset( $params['province'] ) ? $params['province'] : '00' ) . ':' . ( isset( $params['district'] ) ? $params['district'] : '00' ) . ':';
 | 
						|
				if ( isset( $options[$params['type_id']] ) ) {
 | 
						|
					switch ( $params['type_id'] ) {
 | 
						|
						case 10:
 | 
						|
							if ( isset( $options[$params['type_id']][$params['country']] ) ) {
 | 
						|
								//$prefix = $params['type_id'].':'.$params['country'].':00:00:';
 | 
						|
								$tmp_retval = $options[$params['type_id']][$params['country']];
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 20:
 | 
						|
						case 40:
 | 
						|
							if ( isset( $options[$params['type_id']][$params['country']][$params['province']] ) ) {
 | 
						|
								//$prefix = $params['type_id'].':'.$params['country'].':'.$params['province'].':00:';
 | 
						|
								$tmp_retval = $options[$params['type_id']][$params['country']][$params['province']];
 | 
						|
								if ( isset( $options[$params['type_id']][$params['country']]['00'] ) ) { //Append non-province specifc items.
 | 
						|
									//Do not use array_merge here. It does not preserve the numeric key the way that the addition operator does.
 | 
						|
									$tmp_retval = ( $tmp_retval + $options[$params['type_id']][$params['country']]['00'] );
 | 
						|
								}
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 30:
 | 
						|
							if ( isset( $options[$params['type_id']][$params['country']][$params['province']][$params['district']] ) ) {
 | 
						|
								//$prefix = $params['type_id'].':'.$params['country'].':'.$params['province'].':'.$params['district'].':';
 | 
						|
								$tmp_retval = $options[$params['type_id']][$params['country']][$params['province']][$params['district']];
 | 
						|
							}
 | 
						|
							break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				//Don't add the "Other" option for Federal and provincial agencies in US or CA as we define them all explicitly.
 | 
						|
				if ( !( ( $params['type_id'] == 10 || $params['type_id'] == 20 ) && ( $params['country'] == 'CA' || $params['country'] == 'US' ) ) ) {
 | 
						|
					$tmp_retval['0000'] = '-- ' . TTi18n::gettext( 'Other' ) . ' --';
 | 
						|
				}
 | 
						|
 | 
						|
				//Add prefix to each returned item.
 | 
						|
				if ( isset( $tmp_retval ) && is_array( $tmp_retval ) ) {
 | 
						|
					$retval = [];
 | 
						|
					foreach ( $tmp_retval as $key => $value ) {
 | 
						|
						$key = str_pad( $key, 4, '0', STR_PAD_LEFT );
 | 
						|
						$retval[$prefix . $key] = $value;
 | 
						|
					}
 | 
						|
				} else {
 | 
						|
					$retval = [ 0 => TTi18n::gettext( '-- None --' ) ];
 | 
						|
				}
 | 
						|
				unset( $prefix, $tmp_retval );
 | 
						|
 | 
						|
				//Debug::Arr($retval, 'Type ID: '. $params['type_id'] .' Country: '. $params['country'] .' Province: '. $params['province'] .' District: '. $params['district'] .' Agencies: ', __FILE__, __LINE__, __METHOD__, 10);
 | 
						|
				break;
 | 
						|
			case 'columns':
 | 
						|
				$retval = [
 | 
						|
						'-1010-status'                  => TTi18n::gettext( 'Status' ),
 | 
						|
						'-1020-type'                    => TTi18n::gettext( 'Type' ),
 | 
						|
						'-1030-name'                    => TTi18n::gettext( 'Name' ),
 | 
						|
						'-1035-legal_entity_legal_name' => TTi18n::gettext( 'Legal Entity' ),
 | 
						|
						'-1140-description'             => TTi18n::gettext( 'Description' ),
 | 
						|
						'-1170-province'                => TTi18n::gettext( 'Province/State' ),
 | 
						|
						'-1180-country'                 => TTi18n::gettext( 'Country' ),
 | 
						|
 | 
						|
						'-1190-district'               => TTi18n::gettext( 'District' ),
 | 
						|
						'-1200-agency'                 => TTi18n::gettext( 'Agency' ),
 | 
						|
						'-1210-primary_identification' => TTi18n::gettext( 'Primary Identification' ),
 | 
						|
 | 
						|
						'-1300-secondary_identification'  => TTi18n::gettext( 'Secondary Identification' ),
 | 
						|
						'-1320-tertiary_identification'   => TTi18n::gettext( 'Tertiary Identification' ),
 | 
						|
						'-1330-contact_user'              => TTi18n::gettext( 'Contact' ),
 | 
						|
						'-1340-remittance_source_account' => TTi18n::gettext( 'Remittance Source Account' ),
 | 
						|
						'-1420-start_date'                => TTi18n::gettext( 'Start Date' ),
 | 
						|
						'-1450-end_date'                  => TTi18n::gettext( 'End Date' ),
 | 
						|
 | 
						|
						//'-1900-in_use' => TTi18n::gettext('In Use'), //doesn't make sense here, as several agencies are for reporting only (ie: New Hires, Social Security Administration) and will not have Tax/Deduction records assigned to them.
 | 
						|
 | 
						|
						'-2000-created_by'   => TTi18n::gettext( 'Created By' ),
 | 
						|
						'-2010-created_date' => TTi18n::gettext( 'Created Date' ),
 | 
						|
						'-2020-updated_by'   => TTi18n::gettext( 'Updated By' ),
 | 
						|
						'-2030-updated_date' => TTi18n::gettext( 'Updated Date' ),
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'list_columns':
 | 
						|
				$retval = Misc::arrayIntersectByKey( $this->getOptions( 'default_display_columns' ), Misc::trimSortPrefix( $this->getOptions( 'columns' ) ) );
 | 
						|
				break;
 | 
						|
			case 'default_display_columns': //Columns that are displayed by default.
 | 
						|
				$retval = [
 | 
						|
						'status',
 | 
						|
						'legal_entity_legal_name',
 | 
						|
						'name',
 | 
						|
						'type',
 | 
						|
						//'province',
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'unique_columns': //Columns that are unique, and disabled for mass editing.
 | 
						|
				$retval = [
 | 
						|
						'name',
 | 
						|
						'type_id',
 | 
						|
						'country',
 | 
						|
						'province',
 | 
						|
						'district',
 | 
						|
						'agency_id',
 | 
						|
				];
 | 
						|
				break;
 | 
						|
			case 'linked_columns': //Columns that are linked together, mainly for Mass Edit, if one changes, they all must.
 | 
						|
				$retval = [
 | 
						|
						'country',
 | 
						|
						'province',
 | 
						|
				];
 | 
						|
				break;
 | 
						|
		}
 | 
						|
 | 
						|
		return $retval;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $data
 | 
						|
	 * @return array
 | 
						|
	 */
 | 
						|
	function _getVariableToFunctionMap( $data ) {
 | 
						|
		$variable_function_map = [
 | 
						|
				'id'                           => 'ID',
 | 
						|
				'legal_entity_id'              => 'LegalEntity',
 | 
						|
				'legal_entity_legal_name'      => false,
 | 
						|
				'status_id'                    => 'Status',
 | 
						|
				'status'                       => false,
 | 
						|
				'type_id'                      => 'Type',
 | 
						|
				'type'                         => false,
 | 
						|
				'name'                         => 'Name',
 | 
						|
				'description'                  => 'Description',
 | 
						|
				'country'                      => 'Country',
 | 
						|
				'province'                     => 'Province',
 | 
						|
				'district'                     => 'District',
 | 
						|
				'agency_id'                    => 'Agency',
 | 
						|
				'parsed_agency_id'			   => false,
 | 
						|
				'agency'                       => false,
 | 
						|
				'primary_identification'       => 'PrimaryIdentification',
 | 
						|
				'secondary_identification'     => 'SecondaryIdentification',
 | 
						|
				'tertiary_identification'      => 'TertiaryIdentification',
 | 
						|
				'user_name'                    => 'UserName',
 | 
						|
				'password'                     => 'Password',
 | 
						|
				'contact_user_id'              => 'ContactUser',
 | 
						|
				'contact_user'                 => false,
 | 
						|
				'remittance_source_account_id' => 'RemittanceSourceAccount',
 | 
						|
				'remittance_source_account'    => false,
 | 
						|
				'always_week_day_id'           => 'AlwaysOnWeekDay',
 | 
						|
				'recurring_holiday_policy_id'  => 'RecurringHoliday',
 | 
						|
 | 
						|
				'start_date' => 'StartDate',
 | 
						|
				'end_date'   => 'EndDate',
 | 
						|
 | 
						|
				'in_use' => false,
 | 
						|
 | 
						|
				'deleted' => 'Deleted',
 | 
						|
		];
 | 
						|
 | 
						|
		return $variable_function_map;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function getCompanyObject() {
 | 
						|
		$le_obj = $this->getLegalEntityObject();
 | 
						|
		if ( is_object( $le_obj ) ) {
 | 
						|
			return $le_obj->getCompanyObject();
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return object|bool
 | 
						|
	 */
 | 
						|
	function getContactUserObject() {
 | 
						|
		return $this->getGenericObject( 'UserListFactory', $this->getContactUser(), 'contact_user_obj' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return object|bool
 | 
						|
	 */
 | 
						|
	function getLegalEntityObject() {
 | 
						|
		return $this->getGenericObject( 'LegalEntityListFactory', $this->getLegalEntity(), 'legal_entity_obj' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return object|bool
 | 
						|
	 */
 | 
						|
	function getRemittanceSourceAccountObject() {
 | 
						|
		return $this->getGenericObject( 'RemittanceSourceAccountListFactory', $this->getRemittanceSourceAccount(), 'remittance_source_account_obj' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return object|bool
 | 
						|
	 */
 | 
						|
	function getCompanyDeductionListFactory() {
 | 
						|
		$cdlf = TTnew( 'CompanyDeductionListFactory' ); /** @var CompanyDeductionListFactory $cdlf */
 | 
						|
		$cdlf->getByCompanyIdAndPayrollRemittanceAgencyId( $this->getCompanyObject()->getId(), $this->getId() );
 | 
						|
 | 
						|
		return $cdlf;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getLegalEntity() {
 | 
						|
		return $this->getGenericDataValue( 'legal_entity_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setLegalEntity( $value ) {
 | 
						|
		$value = TTUUID::castUUID( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'legal_entity_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getRemittanceSourceAccount() {
 | 
						|
		return $this->getGenericDataValue( 'remittance_source_account_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setRemittanceSourceAccount( $value ) {
 | 
						|
		$value = TTUUID::castUUID( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'remittance_source_account_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return int
 | 
						|
	 */
 | 
						|
	function getStatus() {
 | 
						|
		return $this->getGenericDataValue( 'status_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setStatus( $value ) {
 | 
						|
		$value = (int)trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'status_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return int
 | 
						|
	 */
 | 
						|
	function getType() {
 | 
						|
		return $this->getGenericDataValue( 'type_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setType( $value ) {
 | 
						|
		$value = (int)trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'type_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getAgency() {
 | 
						|
		return $this->getGenericDataValue( 'agency_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setAgency( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'agency_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getRecurringHoliday() {
 | 
						|
		$company_obj = $this->getCompanyObject();
 | 
						|
		if ( is_object( $company_obj ) ) {
 | 
						|
			return CompanyGenericMapListFactory::getArrayByCompanyIDAndObjectTypeIDAndObjectID( $company_obj->getId(), 5000, $this->getID() );
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param string $ids UUID
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setRecurringHoliday( $ids ) {
 | 
						|
		Debug::text( 'Setting Recurring Holiday IDs : ', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
		$company_obj = $this->getCompanyObject();
 | 
						|
		if ( is_object( $company_obj ) ) {
 | 
						|
			return CompanyGenericMapFactory::setMapIDs( $company_obj->getId(), 5000, $this->getID(), (array)$ids );
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|int
 | 
						|
	 */
 | 
						|
	function getAlwaysOnWeekDay() {
 | 
						|
		return $this->getGenericDataValue( 'always_week_day_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setAlwaysOnWeekDay( $value ) {
 | 
						|
		$value = (int)$value;
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'always_week_day_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param string $agency_id UUID
 | 
						|
	 * @param string $label     type_id, country, province, district, id
 | 
						|
	 * @return array|mixed
 | 
						|
	 */
 | 
						|
	function parseAgencyID( $agency_id = null, $label = null ) {
 | 
						|
		if ( $agency_id == null ) {
 | 
						|
			$agency_id = $this->getAgency();
 | 
						|
		}
 | 
						|
 | 
						|
		$split_agency_id = explode( ':', $agency_id );
 | 
						|
		//Debug::Arr( $split_agency_id, 'Split Agency: ' . $agency_id, __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		if ( is_array( $split_agency_id ) && count( $split_agency_id ) > 1 ) {
 | 
						|
			$retarr = [];
 | 
						|
			$retarr['type_id'] = (int)$split_agency_id[0];
 | 
						|
			$retarr['country'] = $split_agency_id[1];
 | 
						|
			$retarr['province'] = $split_agency_id[2];
 | 
						|
			$retarr['district'] = $split_agency_id[3];
 | 
						|
			$retarr['id'] = (int)$split_agency_id[4];
 | 
						|
 | 
						|
			if ( $label != null ) {
 | 
						|
				return $retarr[$label];
 | 
						|
			}
 | 
						|
 | 
						|
			return $retarr;
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $name
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function isUniqueName( $name ) {
 | 
						|
		$name = trim( $name );
 | 
						|
		if ( is_object( $this->getLegalEntityObject() ) ) {
 | 
						|
			$company_id = $this->getLegalEntityObject()->getCompany();
 | 
						|
			$legal_entity_id = $this->getLegalEntityObject()->getID();
 | 
						|
		} else {
 | 
						|
			$company_id = TTUUID::getZeroID();
 | 
						|
			$legal_entity_id = TTUUID::getZeroID();
 | 
						|
		}
 | 
						|
 | 
						|
		if ( $name == '' ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if ( $company_id == '' ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		//Only force names to be unique within the same legal entity.
 | 
						|
		$ph = [
 | 
						|
				'name'            => $name,
 | 
						|
				'legal_entity_id' => TTUUID::castUUID( $legal_entity_id ),
 | 
						|
				'company_id'      => TTUUID::castUUID( $company_id ),
 | 
						|
		];
 | 
						|
 | 
						|
		$lef = TTnew( 'LegalEntityFactory' ); /** @var LegalEntityFactory $lef */
 | 
						|
 | 
						|
		$query = 'SELECT a.id
 | 
						|
					FROM ' . $this->getTable() . ' as a
 | 
						|
					LEFT JOIN ' . $lef->getTable() . ' as lef ON ( a.legal_entity_id = lef.id AND lef.deleted = 0 )
 | 
						|
					WHERE a.name = ?
 | 
						|
						AND a.legal_entity_id = ?
 | 
						|
						AND lef.company_id = ?
 | 
						|
						AND a.deleted = 0';
 | 
						|
 | 
						|
		$name_id = $this->db->GetOne( $query, $ph );
 | 
						|
		Debug::Arr( $name_id, 'Unique Name: ' . $name, __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		if ( $name_id === false ) {
 | 
						|
			return true;
 | 
						|
		} else {
 | 
						|
			if ( $name_id == $this->getId() ) {
 | 
						|
				return true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getName() {
 | 
						|
		return $this->getGenericDataValue( 'name' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setName( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'name', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getProvince() {
 | 
						|
		return $this->getGenericDataValue( 'province' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setProvince( $value ) {
 | 
						|
		Debug::Text( 'Country: ' . $this->getCountry() . ' Province: ' . $value, __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'province', strtoupper( trim( $value ) ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getCountry() {
 | 
						|
		return $this->getGenericDataValue( 'country' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setCountry( $value ) {
 | 
						|
		return $this->setGenericDataValue( 'country', strtoupper( trim( $value ) ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getDescription() {
 | 
						|
		return $this->getGenericDataValue( 'description' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setDescription( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'description', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getPrimaryIdentification() {
 | 
						|
		return $this->getGenericDataValue( 'primary_identification' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setPrimaryIdentification( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'primary_identification', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getSecondaryIdentification() {
 | 
						|
		return $this->getGenericDataValue( 'secondary_identification' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setSecondaryIdentification( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'secondary_identification', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getTertiaryIdentification() {
 | 
						|
		return $this->getGenericDataValue( 'tertiary_identification' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setTertiaryIdentification( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'tertiary_identification', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getUserName() {
 | 
						|
		return $this->getGenericDataValue( 'user_anme' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setUserName( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'user_name', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getPassword() {
 | 
						|
		return $this->getGenericDataValue( 'password' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setPassword( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'password', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getContactUser() {
 | 
						|
		return $this->getGenericDataValue( 'contact_user_id' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setContactUser( $value ) {
 | 
						|
		$value = TTUUID::castUUID( $value );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'contact_user_id', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getDistrict() {
 | 
						|
		return $this->getGenericDataValue( 'district' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setDistrict( $value ) {
 | 
						|
		return $this->setGenericDataValue( 'district', strtoupper( trim( $value ) ) );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getStartDate() {
 | 
						|
		return $this->getGenericDataValue( 'start_date' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setStartDate( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
		if ( $value != '' ) {
 | 
						|
			$value = TTDate::getBeginDayEpoch( trim( $value ) );
 | 
						|
		}
 | 
						|
		Debug::Text( 'Start Date: ' . TTDate::getDate( 'DATE+TIME', $value ), __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'start_date', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool|mixed
 | 
						|
	 */
 | 
						|
	function getEndDate() {
 | 
						|
		return $this->getGenericDataValue( 'end_date' );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $value
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setEndDate( $value ) {
 | 
						|
		$value = trim( $value );
 | 
						|
		if ( $value != '' ) {
 | 
						|
			$value = TTDate::getEndDayEpoch( trim( $value ) );
 | 
						|
		}
 | 
						|
		Debug::Text( 'End Date: ' . TTDate::getDate( 'DATE+TIME', $value ), __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		return $this->setGenericDataValue( 'end_date', $value );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param bool $ignore_warning
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function Validate( $ignore_warning = true ) {
 | 
						|
		$data_diff = $this->getDataDifferences();
 | 
						|
 | 
						|
		//
 | 
						|
		// BELOW: Validation code moved from set*() functions.
 | 
						|
		//
 | 
						|
		// Legal entity
 | 
						|
		if ( $this->getLegalEntity() !== false ) {
 | 
						|
			$llf = TTnew( 'LegalEntityListFactory' ); /** @var LegalEntityListFactory $llf */
 | 
						|
			$this->Validator->isResultSetWithRows( 'legal_entity_id',
 | 
						|
												   $llf->getByID( $this->getLegalEntity() ),
 | 
						|
												   TTi18n::gettext( 'Legal entity is invalid' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		// Remittance source account
 | 
						|
		if ( $this->getRemittanceSourceAccount() != false && $this->getRemittanceSourceAccount() != TTUUID::getZeroID() ) {
 | 
						|
			$llf = TTnew( 'RemittanceSourceAccountListFactory' ); /** @var RemittanceSourceAccountListFactory $llf */
 | 
						|
			$this->Validator->isResultSetWithRows( 'remittance_source_account_id',
 | 
						|
												   $llf->getByID( $this->getRemittanceSourceAccount() ),
 | 
						|
												   TTi18n::gettext( 'Remittance source account is invalid' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		// Status
 | 
						|
		if ( $this->getStatus() != '' ) {
 | 
						|
			$this->Validator->inArrayKey( 'status',
 | 
						|
										  $this->getStatus(),
 | 
						|
										  TTi18n::gettext( 'Incorrect Status' ),
 | 
						|
										  $this->getOptions( 'status' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		if ( $this->Validator->getValidateOnly() == false ) {
 | 
						|
			// Type
 | 
						|
			$this->Validator->inArrayKey( 'type_id',
 | 
						|
										  $this->getType(),
 | 
						|
										  TTi18n::gettext( 'Incorrect Type' ),
 | 
						|
										  $this->getOptions( 'type' )
 | 
						|
			);
 | 
						|
			// Agency
 | 
						|
			$this->Validator->inArrayKey( 'agency_id',
 | 
						|
										  $this->getAgency(),
 | 
						|
										  TTi18n::gettext( 'Incorrect Agency' ),
 | 
						|
										  $this->getOptions( 'agency', [ 'type_id' => $this->getType(), 'country' => $this->getCountry(), 'province' => $this->getProvince(), 'district' => $this->getDistrict() ] )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		// Name
 | 
						|
		if ( $this->getName() !== false ) {
 | 
						|
			$this->Validator->isLength( 'name',
 | 
						|
										$this->getName(),
 | 
						|
										TTi18n::gettext( 'Name is too short or too long' ),
 | 
						|
										2,
 | 
						|
										200
 | 
						|
			);
 | 
						|
			if ( $this->Validator->isError( 'name' ) == false ) {
 | 
						|
				$this->Validator->isTrue( 'name',
 | 
						|
										  $this->isUniqueName( $this->getName() ),
 | 
						|
										  TTi18n::gettext( 'Name already exists' )
 | 
						|
				);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Province/State
 | 
						|
		$cf = TTnew( 'CompanyFactory' ); /** @var CompanyFactory $cf */
 | 
						|
 | 
						|
		if ( $this->getCountry() !== false && $this->getProvince() != '' && $this->getProvince() != '00' && $this->Validator->getValidateOnly() == false ) {
 | 
						|
			$options_arr = $cf->getOptions( 'province' );
 | 
						|
			if ( isset( $options_arr[$this->getCountry()] ) ) {
 | 
						|
				$options = $options_arr[$this->getCountry()];
 | 
						|
			} else {
 | 
						|
				$options = [];
 | 
						|
			}
 | 
						|
			//skip validation for type 3rd Party and no provinces exist for country.
 | 
						|
			if ( !( isset( $options ) && count( $options ) == 1 && isset( $options['00'] ) ) ) {
 | 
						|
				$this->Validator->inArrayKey( 'province',
 | 
						|
											  $this->getProvince(),
 | 
						|
											  TTi18n::gettext( 'Invalid Province/State' ),
 | 
						|
											  $options
 | 
						|
				);
 | 
						|
			}
 | 
						|
			unset( $options_arr, $options );
 | 
						|
		}
 | 
						|
 | 
						|
		// Country
 | 
						|
		if ( $this->getCountry() !== false && $this->Validator->getValidateOnly() == false ) {
 | 
						|
			$this->Validator->inArrayKey( 'country',
 | 
						|
										  $this->getCountry(),
 | 
						|
										  TTi18n::gettext( 'Invalid Country' ),
 | 
						|
										  $cf->getOptions( 'country' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		// District
 | 
						|
		if ( $this->getDistrict() != '' && $this->getDistrict() != '00' && $this->Validator->getValidateOnly() == false ) {
 | 
						|
			$options_arr = $cf->getOptions( 'district' );
 | 
						|
			if ( isset( $options_arr[$this->getCountry()][$this->getProvince()] ) ) {
 | 
						|
				$options = $options_arr[$this->getCountry()][$this->getProvince()];
 | 
						|
			} else {
 | 
						|
				$options = [];
 | 
						|
			}
 | 
						|
			$this->Validator->inArrayKey( 'district',
 | 
						|
										  $this->getDistrict(),
 | 
						|
										  TTi18n::gettext( 'Invalid District' ),
 | 
						|
										  $options
 | 
						|
			);
 | 
						|
			unset( $options, $options_arr );
 | 
						|
		}
 | 
						|
 | 
						|
		// Description
 | 
						|
		$this->Validator->isLength( 'description',
 | 
						|
									$this->getDescription(),
 | 
						|
									TTi18n::gettext( 'Description is invalid' ),
 | 
						|
									0, 255
 | 
						|
		);
 | 
						|
 | 
						|
		// Primary identification
 | 
						|
		if ( $this->getType() == 10 && $this->getPrimaryIdentification() != '' ) { //**IMPORTANT**: Must allow record to be created without a primary identification as that is required during SetupPresets or the Setup Wizard initially.
 | 
						|
			if ( $this->getCountry() == 'CA' && $this->parseAgencyID( null, 'id' ) == 10 ) { //Service Canada (ROE) does not need a business number as we use the CRA one instead.
 | 
						|
				$this->Validator->isRegEx( 'primary_identification',
 | 
						|
										   $this->getPrimaryIdentification(),
 | 
						|
										   TTi18n::gettext( 'Business Number is invalid, must use format: 123456789RP0001' ),
 | 
						|
										   '/^\d{9}\p{L}{2}\d{4}$/iu'
 | 
						|
				);
 | 
						|
			} else if ( $this->getCountry() == 'US' ) {
 | 
						|
				$this->Validator->isRegEx( 'primary_identification',
 | 
						|
										   $this->getPrimaryIdentification(),
 | 
						|
										   TTi18n::gettext( 'EIN is invalid, must use format: 12-3456789' ),
 | 
						|
										   '/^(0[1-6]|1[0-6]|2[0-7]|[345]\d|[68][0-8]|7[1-7]|9[0-58-9])-?\d{7}$/iu'
 | 
						|
				);
 | 
						|
			} else {
 | 
						|
				$this->Validator->isLength( 'primary_identification',
 | 
						|
											$this->getPrimaryIdentification(),
 | 
						|
											TTi18n::gettext( 'Primary identification is invalid' ),
 | 
						|
											0, 255
 | 
						|
				);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Secondary identification
 | 
						|
		$this->Validator->isLength( 'secondary_identification',
 | 
						|
									$this->getSecondaryIdentification(),
 | 
						|
									TTi18n::gettext( 'Secondary identification is invalid' ),
 | 
						|
									0, 255
 | 
						|
		);
 | 
						|
 | 
						|
		// Tertiary identification
 | 
						|
		$this->Validator->isLength( 'tertiary_identification',
 | 
						|
									$this->getTertiaryIdentification(),
 | 
						|
									TTi18n::gettext( 'Tertiary identification is invalid' ),
 | 
						|
									0, 255
 | 
						|
		);
 | 
						|
 | 
						|
		// Contact - Allow this to be NONE in cases where creating it during a fresh install when a user may not even exist yet.
 | 
						|
		if ( $this->getContactUser() != '' && $this->getContactUser() != TTUUID::getZeroId() ) {
 | 
						|
			$ulf = TTnew( 'UserListFactory' ); /** @var UserListFactory $ulf */
 | 
						|
			$this->Validator->isResultSetWithRows( 'contact_user_id',
 | 
						|
												   $ulf->getByID( $this->getContactUser() ),
 | 
						|
												   TTi18n::gettext( 'Invalid Contact' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		// start date
 | 
						|
		if ( $this->getStartDate() != '' ) {
 | 
						|
			$this->Validator->isDate( 'start_date',
 | 
						|
									  $this->getStartDate(),
 | 
						|
									  TTi18n::gettext( 'Incorrect start date' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		// End Date
 | 
						|
		if ( $this->getEndDate() != '' ) {
 | 
						|
			$this->Validator->isDate( 'end_date',
 | 
						|
									  $this->getEndDate(),
 | 
						|
									  TTi18n::gettext( 'Incorrect end date' )
 | 
						|
			);
 | 
						|
		}
 | 
						|
		//
 | 
						|
		// ABOVE: Validation code moved from set*() functions.
 | 
						|
		//
 | 
						|
 | 
						|
		//$this->setProvince( $this->getProvince() ); //Not sure why this was there, but it causes duplicate errors if the province is incorrect.
 | 
						|
		if ( $this->getDeleted() == true ) {
 | 
						|
			if ( is_object( $this->getLegalEntityObject() ) ) {
 | 
						|
				$cdlf = TTnew( 'CompanyDeductionListFactory' ); /** @var CompanyDeductionListFactory $cdlf */
 | 
						|
				$cdlf->getByCompanyIdAndPayrollRemittanceAgencyId( $this->getLegalEntityObject()->getCompany(), $this->getId(), 1 );
 | 
						|
				if ( $cdlf->getRecordCount() > 0 ) {
 | 
						|
					$this->Validator->isTRUE( 'in_use',
 | 
						|
											  false,
 | 
						|
											  TTi18n::gettext( 'This payroll remittance agency is currently in use by one or more Tax/Deductions' ) );
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		//Check to see if there are any full service events.
 | 
						|
		$praelf = TTnew( 'PayrollRemittanceAgencyEventListFactory' );
 | 
						|
		$praelf->getByLegalEntityIdAndRemittanceAgencyIdAndStatus( $this->getLegalEntity(), $this->getId(), 15 );
 | 
						|
		if ( $praelf->getRecordCount() > 0 ) {
 | 
						|
			$has_full_service_events = true;
 | 
						|
		} else {
 | 
						|
			$has_full_service_events = false;
 | 
						|
		}
 | 
						|
		Debug::Text( '  Has Full Service Events: ' . (int)$has_full_service_events . ' Total Full Service Events: ' . $praelf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
		unset( $praelf );
 | 
						|
 | 
						|
		if ( $this->getDeleted() != true && $this->Validator->getValidateOnly() == false ) { //Don't check the below when mass editing.
 | 
						|
			if ( $this->getName() == false && $this->Validator->hasError( 'name' ) == false ) {
 | 
						|
				$this->Validator->isTrue( 'name',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify a name' ) );
 | 
						|
			}
 | 
						|
 | 
						|
 | 
						|
			if ( $this->getAgency() == false && $this->Validator->hasError( 'agency_id' ) == false ) {
 | 
						|
				$this->Validator->isTrue( 'agency_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify agency' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->getStatus() == false ) {
 | 
						|
				$this->Validator->isTrue( 'status_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify status' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->getType() == false ) {
 | 
						|
				$this->Validator->isTrue( 'type_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify type' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->getLegalEntity() == false && $this->Validator->hasError( 'legal_entity_id' ) == false ) {
 | 
						|
				$this->Validator->isTrue( 'legal_entity_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify legal entity' ) );
 | 
						|
			}
 | 
						|
			if ( $this->getContactUser() == false && $this->Validator->hasError( 'contact_user_id' ) == false ) {
 | 
						|
				$this->Validator->isTrue( 'contact_user_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Please specify a contact' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			//Only if full service events exist must there be a contact person specified. Otherwise impounding won't work.
 | 
						|
			if ( $has_full_service_events == true && ( $this->getContactUser() == false || $this->getContactUser() == TTUUID::getZeroID() ) ) {
 | 
						|
				$this->Validator->isTrue( 'contact_user_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Contact person must be specified' ) );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if ( $this->isNew() == false && is_array( $data_diff ) ) {
 | 
						|
			if ( $this->isDataDifferent( 'type_id', $data_diff ) == true ) {
 | 
						|
				//Changing the type will change all the available events for that type, so don't allow it to be modified.
 | 
						|
				$this->Validator->isTrue( 'type_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Type cannot be modified on an existing record' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->isDataDifferent( 'country', $data_diff ) == true ) {
 | 
						|
				//Changing the country will change all the available events for that country, so don't allow it to be modified.
 | 
						|
				$this->Validator->isTrue( 'country',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Country cannot be modified on an existing record' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->getType() != 10 && $this->isDataDifferent( 'province', $data_diff ) == true ) { //Can't change province on Type=10 (Federal), so don't bother checking. This avoids problems with switching from null to '00' or something too.
 | 
						|
				//Changing the province/state will change all the available events for that province/state, so don't allow it to be modified.
 | 
						|
				$this->Validator->isTrue( 'province',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Province/State cannot be modified on an existing record' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $this->isDataDifferent( 'agency_id', $data_diff ) == true ) {
 | 
						|
				//Changing the agency will change all the available events for that agency, so don't allow it to be modified.
 | 
						|
				$this->Validator->isTrue( 'agency_id',
 | 
						|
										  false,
 | 
						|
										  TTi18n::gettext( 'Agency cannot be modified on an existing record' ) );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		//RemittanceSourceAccount must be optional, as we won't know it during SetupPresets.
 | 
						|
		//Change this to a warning instead perhaps?
 | 
						|
		if ( $ignore_warning == false ) {
 | 
						|
			if ( $this->getRemittanceSourceAccount() == false || $this->getRemittanceSourceAccount() == TTUUID::getZeroID() ) {
 | 
						|
				$this->Validator->Warning( 'remittance_source_account_id', TTi18n::gettext( 'It is recommended that a remittance source account be specified' ) );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $has_full_service_events == false && ( $this->getContactUser() == false || $this->getContactUser() == TTUUID::getZeroID() ) ) {
 | 
						|
				$this->Validator->Warning( 'contact_user_id', TTi18n::gettext( 'It is recommended that a contact person is always specified' ) );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function getEnableAddEventPreset() {
 | 
						|
		if ( isset( $this->add_event_preset ) ) {
 | 
						|
			return $this->add_event_preset;
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $bool
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setEnableAddEventPreset( $bool ) {
 | 
						|
		$this->add_event_preset = (bool)$bool;
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function preSave() {
 | 
						|
		if ( $this->isNew() == true ) {
 | 
						|
			$this->is_new = true;
 | 
						|
		}
 | 
						|
 | 
						|
		if ( $this->getProvince() == '' ) {
 | 
						|
			$this->setProvince( '00' );
 | 
						|
		}
 | 
						|
		if ( $this->getDistrict() == '' ) {
 | 
						|
			$this->setDistrict( '00' );
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function postSave() {
 | 
						|
		$this->removeCache( $this->getId() );
 | 
						|
 | 
						|
		if ( isset( $this->is_new ) && $this->is_new == true && $this->getEnableAddEventPreset() == true ) {
 | 
						|
			Debug::Text( '  New Agency, adding Event presets...', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
			$sp = new SetupPresets();
 | 
						|
			$sp->setCompany( $this->getLegalEntityObject()->getCompany() );
 | 
						|
			$sp->setUser( $this->getCreatedBy() );
 | 
						|
			$sp->createRemittanceAgencyEvents( $this->getId() );
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $data
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function setObjectFromArray( $data ) {
 | 
						|
		if ( is_array( $data ) ) {
 | 
						|
			$variable_function_map = $this->getVariableToFunctionMap();
 | 
						|
			foreach ( $variable_function_map as $key => $function ) {
 | 
						|
				if ( isset( $data[$key] ) ) {
 | 
						|
 | 
						|
					$function = 'set' . $function;
 | 
						|
					switch ( $key ) {
 | 
						|
						case 'start_date':
 | 
						|
						case 'end_date':
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$this->$function( TTDate::parseDateTime( $data[$key] ) );
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 'contact':
 | 
						|
							$data[$key] = Misc::getFullName( $this->getColumn( 'first_name' ), null, $this->getColumn( 'last_name' ), false, false );
 | 
						|
							break;
 | 
						|
						default:
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$this->$function( $data[$key] );
 | 
						|
							}
 | 
						|
							break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			$this->setCreatedAndUpdatedColumns( $data );
 | 
						|
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param null $include_columns
 | 
						|
	 * @return array
 | 
						|
	 */
 | 
						|
	function getObjectAsArray( $include_columns = null ) {
 | 
						|
		$data = [];
 | 
						|
		$variable_function_map = $this->getVariableToFunctionMap();
 | 
						|
		if ( is_array( $variable_function_map ) ) {
 | 
						|
			foreach ( $variable_function_map as $variable => $function_stub ) {
 | 
						|
				if ( $include_columns == null || ( isset( $include_columns[$variable] ) && $include_columns[$variable] == true ) ) {
 | 
						|
 | 
						|
					$function = 'get' . $function_stub;
 | 
						|
					switch ( $variable ) {
 | 
						|
						case 'type':
 | 
						|
						case 'status':
 | 
						|
							$function = 'get' . $variable;
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$data[$variable] = Option::getByKey( $this->$function(), $this->getOptions( $variable ) );
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 'agency':
 | 
						|
							$function = 'get' . $variable;
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$data[$variable] = Option::getByKey( $this->$function(), $this->getOptions( $variable, [ 'type_id' => $this->getType(), 'country' => $this->getCountry(), 'province' => $this->getProvince(), 'district' => $this->getDistrict() ] ) );
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 'parsed_agency_id': //Return an array of the parsed agency ID elements.
 | 
						|
							$data[$variable] = $this->parseAgencyID( null );
 | 
						|
							break;
 | 
						|
						case 'start_date':
 | 
						|
						case 'end_date':
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$data[$variable] = TTDate::getAPIDate( 'DATE', $this->$function() );
 | 
						|
							}
 | 
						|
							break;
 | 
						|
						case 'contact_user':
 | 
						|
							$data[$variable] = Misc::getFullName( $this->getColumn( 'first_name' ), null, $this->getColumn( 'last_name' ), false, false );
 | 
						|
							break;
 | 
						|
						case 'legal_entity_legal_name':
 | 
						|
						case 'remittance_source_account':
 | 
						|
						case 'in_use':
 | 
						|
							$data[$variable] = $this->getColumn( $variable );
 | 
						|
							break;
 | 
						|
						default:
 | 
						|
							if ( method_exists( $this, $function ) ) {
 | 
						|
								$data[$variable] = $this->$function();
 | 
						|
							}
 | 
						|
							break;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			$this->getCreatedAndUpdatedColumns( $data, $include_columns );
 | 
						|
		}
 | 
						|
 | 
						|
		return $data;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $log_action
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	function addLog( $log_action ) {
 | 
						|
		return TTLog::addEntry( $this->getId(), $log_action, TTi18n::getText( 'Payroll Remittance Agency' ) . ': ' . $this->getName(), null, $this->getTable(), $this );
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
?>
 |