1065 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1065 lines
		
	
	
		
			39 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 API\Core
 | 
						|
 */
 | 
						|
class APIInstall extends APIFactory {
 | 
						|
	protected $main_class = 'Install';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * APIInstall constructor.
 | 
						|
	 */
 | 
						|
	public function __construct() {
 | 
						|
		parent::__construct(); //Make sure parent constructor is always called.
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getLicense() {
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$retval = [];
 | 
						|
			$retval['install_mode'] = true;
 | 
						|
			$license_text = $install_obj->getLicenseText();
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'license' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			if ( $license_text != false ) {
 | 
						|
				$retval['license_text'] = $license_text;
 | 
						|
			} else {
 | 
						|
				$retval['error_message'] = TTi18n::getText( 'NO LICENSE FILE FOUND, Your installation appears to be corrupt!' );
 | 
						|
			}
 | 
						|
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param int $external_installer
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getRequirements( $external_installer = 0 ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
		$retval = [];
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
 | 
						|
			if ( DEPLOYMENT_ON_DEMAND == false ) {
 | 
						|
				$install_obj->cleanCacheDirectory();
 | 
						|
			}
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( array_merge( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'require' ], $install_obj->getFailedRequirements( false, [ 'clean_cache', 'file_permissions', 'file_checksums' ] ) ), 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			if ( $external_installer == 1 ) {
 | 
						|
				//When using the external installer, if no system_timezone is defined in the .ini file, try to set it to the detected system timezone immediately, as the user won't get a chance to change it later on.
 | 
						|
				global $config_vars;
 | 
						|
				if ( !isset( $config_vars['other']['system_timezone'] ) ) {
 | 
						|
					$install_obj->writeConfigFile( [ 'other' => [ 'system_timezone' => TTDate::detectSystemTimeZone() ] ] );
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			//Need to handle disabling any attempt to connect to the database, do this by using GET params on the URL like: db=0, then look for that in json/api.php
 | 
						|
			$check_all_requirements = $install_obj->checkAllRequirements();
 | 
						|
			if ( $external_installer == 1 && $check_all_requirements == 0 && $install_obj->checkTimeTrexVersion() == 0 ) {
 | 
						|
				//Using external installer and there is no missing requirements, automatically send to next page.
 | 
						|
//				Redirect::Page( URLBuilder::getURL( array('external_installer' => $external_installer, 'action:next' => 'next' ), $_SERVER['SCRIPT_NAME']) );
 | 
						|
				return $this->returnHandler( [ 'action' => 'next' ] );
 | 
						|
			} else {
 | 
						|
				$install_obj->setAPIMessageID( $this->getAPIMessageID() );
 | 
						|
//				Return array with the text for each requirement check.
 | 
						|
				$retval['check_all_requirements'] = $check_all_requirements;
 | 
						|
				$retval['tt_product_edition'] = $install_obj->getTTProductEdition();
 | 
						|
				$retval['php_os'] = PHP_OS;
 | 
						|
				$retval['application_name'] = APPLICATION_NAME;
 | 
						|
				$retval['config_file_loc'] = $install_obj->getConfigFile();
 | 
						|
				$retval['php_config_file'] = $install_obj->getPHPConfigFile();
 | 
						|
				$retval['php_include_path'] = $install_obj->getPHPIncludePath();
 | 
						|
				$retval['timetrex_version'] = [
 | 
						|
						'check_timetrex_version'   => $install_obj->checkTimeTrexVersion(),
 | 
						|
						'current_timetrex_version' => $install_obj->getCurrentTimeTrexVersion(),
 | 
						|
						'latest_timetrex_version'  => $install_obj->getLatestTimeTrexVersion(),
 | 
						|
				];
 | 
						|
				$retval['php_version'] = [
 | 
						|
						'php_version'       => $install_obj->getPHPVersion(),
 | 
						|
						'check_php_version' => $install_obj->checkPHPVersion(),
 | 
						|
				];
 | 
						|
				$retval['php_int_size'] = $install_obj->checkPHPINTSize();
 | 
						|
 | 
						|
				$retval['database_engine'] = $install_obj->checkDatabaseType();
 | 
						|
				$retval['bcmath'] = $install_obj->checkBCMATH();
 | 
						|
				$retval['mbstring'] = $install_obj->checkMBSTRING();
 | 
						|
				$retval['gettext'] = $install_obj->checkGETTEXT();
 | 
						|
				$retval['intl'] = $install_obj->checkINTL();
 | 
						|
				$retval['soap'] = $install_obj->checkSOAP();
 | 
						|
				$retval['gd'] = $install_obj->checkGD();
 | 
						|
				$retval['json'] = $install_obj->checkJSON();
 | 
						|
				//$retval['mcrypt'] = $install_obj->checkMCRYPT();
 | 
						|
				$retval['simplexml'] = $install_obj->checkSimpleXML();
 | 
						|
				$retval['curl'] = $install_obj->checkCURL();
 | 
						|
				$retval['zip'] = $install_obj->checkZIP();
 | 
						|
				$retval['openssl'] = $install_obj->checkOpenSSL();
 | 
						|
				$retval['mail'] = $install_obj->checkMAIL();
 | 
						|
				$retval['pear'] = $install_obj->checkPEAR();
 | 
						|
				$retval['safe_mode'] = $install_obj->checkPHPSafeMode();
 | 
						|
				$retval['disabled_functions'] = [ 'check_disabled_functions' => $install_obj->checkPHPDisabledFunctions(), 'disabled_function_list' => $install_obj->getCriticalDisabledFunctionList() ];
 | 
						|
				$retval['allow_fopen_url'] = $install_obj->checkPHPAllowURLFopen();
 | 
						|
				$retval['disk_space'] = $install_obj->checkDiskSpace();
 | 
						|
				$retval['memory_limit'] = [
 | 
						|
						'check_php_memory_limit' => $install_obj->checkPHPMemoryLimit(),
 | 
						|
						'memory_limit'           => $install_obj->getPHPINISize( 'memory_limit' ),
 | 
						|
				];
 | 
						|
				$retval['post_size'] = [
 | 
						|
						'check_php_post_size' => $install_obj->checkPHPMaxPostSize(),
 | 
						|
						'post_size'           => $install_obj->getPHPINISize( 'post_max_size' ),
 | 
						|
				];
 | 
						|
				$retval['upload_size'] = [
 | 
						|
						'check_php_upload_size' => $install_obj->checkPHPMaxUploadSize(),
 | 
						|
						'upload_size'           => $install_obj->getPHPINISize( 'upload_max_filesize' ),
 | 
						|
				];
 | 
						|
				$retval['base_url'] = [
 | 
						|
						'check_base_url'       => $install_obj->checkBaseURL(),
 | 
						|
						'recommended_base_url' => $install_obj->getRecommendedBaseURL(),
 | 
						|
				];
 | 
						|
				$retval['base_dir'] = [
 | 
						|
						'check_php_open_base_dir' => $install_obj->checkPHPOpenBaseDir(),
 | 
						|
						'php_open_base_dir'       => $install_obj->getPHPOpenBaseDir(),
 | 
						|
						'php_cli_directory'       => $install_obj->getPHPCLIDirectory(),
 | 
						|
				];
 | 
						|
				$retval['system_timezone'] = $install_obj->checkSystemTimeZone();
 | 
						|
				$retval['cli_executable'] = [
 | 
						|
						'check_php_cli_binary' => $install_obj->checkPHPCLIBinary(),
 | 
						|
						'php_cli'              => $install_obj->getPHPCLI(),
 | 
						|
				];
 | 
						|
 | 
						|
				$retval['config_file'] = $install_obj->checkWritableConfigFile();
 | 
						|
 | 
						|
				$retval['cache_dir'] = [
 | 
						|
						'check_writable_cache_directory' => $install_obj->checkWritableCacheDirectory(),
 | 
						|
						'cache_dir'                      => $install_obj->config_vars['cache']['dir'],
 | 
						|
				];
 | 
						|
				$retval['safe_cache_dir'] = [
 | 
						|
						'check_safe_cache_directory' => $install_obj->checkSafeCacheDirectory(),
 | 
						|
						'cache_dir'                  => $install_obj->config_vars['cache']['dir'],
 | 
						|
						'base_path'                  => Environment::getBasePath(),
 | 
						|
				];
 | 
						|
 | 
						|
				$retval['storage_dir'] = [
 | 
						|
						'check_writable_storage_directory' => $install_obj->checkWritableStorageDirectory(),
 | 
						|
						'storage_path'                     => $install_obj->config_vars['path']['storage'],
 | 
						|
				];
 | 
						|
				$retval['safe_storage_dir'] = [
 | 
						|
						'check_safe_storage_directory' => $install_obj->checkSafeStorageDirectory(),
 | 
						|
						'storage_path'                 => $install_obj->config_vars['path']['storage'],
 | 
						|
						'base_path'                    => Environment::getBasePath(),
 | 
						|
				];
 | 
						|
 | 
						|
				$retval['log_dir'] = [
 | 
						|
						'check_writable_log_directory' => $install_obj->checkWritableLogDirectory(),
 | 
						|
						'log_path'                     => $install_obj->config_vars['path']['log'],
 | 
						|
				];
 | 
						|
				$retval['safe_log_dir'] = [
 | 
						|
						'check_safe_log_directory' => $install_obj->checkSafeLogDirectory(),
 | 
						|
						'log_path'                 => $install_obj->config_vars['path']['log'],
 | 
						|
						'base_path'                => Environment::getBasePath(),
 | 
						|
				];
 | 
						|
				$retval['empty_cache_dir'] = [
 | 
						|
						'check_clean_cache_directory' => $install_obj->checkCleanCacheDirectory(),
 | 
						|
						'cache_dir'                   => $install_obj->config_vars['cache']['dir'],
 | 
						|
				];
 | 
						|
				$retval['file_permission'] = $install_obj->checkFilePermissions();
 | 
						|
				$retval['file_checksums'] = $install_obj->checkFileChecksums();
 | 
						|
 | 
						|
				$retval['cli_requirements']['php_cli_requirements_command'] = $install_obj->getPHPCLIRequirementsCommand();
 | 
						|
 | 
						|
				//If there are failed requirements, don't bother checking CLI requirements, as those will almost certainly fail as well since it checks the same things.
 | 
						|
				//This prevents the CLI requirements from always appearing as failed when something else unrelated (ie: Not Writable Log Dir) fails.
 | 
						|
				if ( $install_obj->checkAllRequirements( false, [ 'php_cli_requirements' ] ) == 0 ) {
 | 
						|
					$retval['cli_requirements']['check_php_cli_requirements'] = $install_obj->checkPHPCLIRequirements();
 | 
						|
				} else {
 | 
						|
					$retval['cli_requirements']['check_php_cli_requirements'] = 0;
 | 
						|
				}
 | 
						|
 | 
						|
				$extended_error_messages = $install_obj->getExtendedErrorMessage();
 | 
						|
				if ( isset( $extended_error_messages ) && is_array( $extended_error_messages ) && count( $extended_error_messages ) > 0 ) {
 | 
						|
					$retval['extended_error_messages'] = $extended_error_messages;
 | 
						|
				} else {
 | 
						|
					$retval['extended_error_messages'] = [];
 | 
						|
				}
 | 
						|
 | 
						|
				Debug::Arr( $retval, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
				return $this->returnHandler( $retval );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $data
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function testConnection( $data ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			if ( isset( $data['type'] ) ) {
 | 
						|
				$data['final_type'] = $data['type'];
 | 
						|
			} else {
 | 
						|
				$data['final_type'] = 'postgres8';
 | 
						|
			}
 | 
						|
			if ( isset( $data['host'] ) ) {
 | 
						|
				$data['final_host'] = $data['host'];
 | 
						|
			} else {
 | 
						|
				$data['final_host'] = 'localhost'; //Host not specified, just default to localhost.
 | 
						|
			}
 | 
						|
 | 
						|
			//In case load balancing is used, parse out just the first host.
 | 
						|
			$host_arr = Misc::parseDatabaseHostString( $data['final_host'] );
 | 
						|
			$host = $host_arr[0][0];
 | 
						|
 | 
						|
			//Test regular user
 | 
						|
			//This used to connect to the template1 database, but it seems newer versions of PostgreSQL
 | 
						|
			//default to disallow connect privs.
 | 
						|
			$test_connection = $install_obj->setNewDatabaseConnection( $data['final_type'], $host, $data['user'], $data['password'], $data['database_name'] );
 | 
						|
			if ( $test_connection == true ) {
 | 
						|
				$install_obj->setDatabaseDriver( $data['final_type'] );
 | 
						|
				$test_connection = $install_obj->checkDatabaseExists( $data['database_name'] );
 | 
						|
 | 
						|
				//Check database version/engine
 | 
						|
				$database_version = $install_obj->checkDatabaseVersion();
 | 
						|
			} else {
 | 
						|
				$database_version = 0; //Success
 | 
						|
			}
 | 
						|
 | 
						|
			//Test priv user.
 | 
						|
			if ( $data['priv_user'] != '' && $data['priv_password'] != '' ) {
 | 
						|
				Debug::Text( 'Testing connection as priv user', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
				$install_obj->setDatabaseDriver( $data['final_type'] );
 | 
						|
				$test_priv_connection = $install_obj->setNewDatabaseConnection( $data['final_type'], $host, $data['priv_user'], $data['priv_password'], '' );
 | 
						|
			} else {
 | 
						|
				$test_priv_connection = true;
 | 
						|
			}
 | 
						|
 | 
						|
			$database_engine = true;
 | 
						|
 | 
						|
			$data['test_connection'] = $test_connection;
 | 
						|
			$data['test_priv_connection'] = $test_priv_connection;
 | 
						|
			$data['database_engine'] = $database_engine;
 | 
						|
			$data['database_version'] = $database_version;
 | 
						|
 | 
						|
			$data['type_options'] = $install_obj->getDatabaseTypeArray();
 | 
						|
			$data['application_name'] = APPLICATION_NAME;
 | 
						|
 | 
						|
			if ( !isset( $data['priv_user'] ) ) {
 | 
						|
				$data['priv_user'] = null;
 | 
						|
			}
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'database_config', 'priv_user' => $data['priv_user'] ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			return $this->returnHandler( $data );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getDatabaseConfig() {
 | 
						|
 | 
						|
		global $config_vars;
 | 
						|
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
 | 
						|
			$database_engine = true;
 | 
						|
			$test_connection = null;
 | 
						|
			$test_priv_connection = null;
 | 
						|
 | 
						|
			$retval = [
 | 
						|
					'type'                 => $config_vars['database']['type'],
 | 
						|
					'host'                 => $config_vars['database']['host'],
 | 
						|
					'database_name'        => $config_vars['database']['database_name'],
 | 
						|
					'user'                 => $config_vars['database']['user'],
 | 
						|
					'password'             => $config_vars['database']['password'],
 | 
						|
					'test_connection'      => $test_connection,
 | 
						|
					'test_priv_connection' => $test_priv_connection,
 | 
						|
					'database_engine'      => $database_engine,
 | 
						|
			];
 | 
						|
 | 
						|
			$retval['type_options'] = $install_obj->getDatabaseTypeArray();
 | 
						|
			$retval['application_name'] = APPLICATION_NAME;
 | 
						|
 | 
						|
			if ( !isset( $retval['priv_user'] ) ) {
 | 
						|
				$retval['priv_user'] = null;
 | 
						|
			}
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'database_config', 'priv_user' => $retval['priv_user'] ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			if ( $retval != false ) {
 | 
						|
				return $this->returnHandler( $retval );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $data
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function createDatabase( $data ) {
 | 
						|
		global $config_vars;
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			if ( isset( $data['type'] ) ) {
 | 
						|
				$data['final_type'] = $data['type'];
 | 
						|
			} else {
 | 
						|
				$data['final_type'] = 'postgres8';
 | 
						|
			}
 | 
						|
			if ( isset( $data['host'] ) ) {
 | 
						|
				$data['final_host'] = $data['host'];
 | 
						|
			} else {
 | 
						|
				$data['final_host'] = 'localhost'; //Host not specified, just default to localhost.
 | 
						|
			}
 | 
						|
 | 
						|
			//In case load balancing is used, parse out just the first host.
 | 
						|
			$host_arr = Misc::parseDatabaseHostString( $data['final_host'] );
 | 
						|
			$host = $host_arr[0][0];
 | 
						|
 | 
						|
			$database_engine = true;
 | 
						|
			Debug::Text( 'Next', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
			if ( isset( $data ) && isset( $data['priv_user'] ) && isset( $data['priv_password'] )
 | 
						|
					&& $data['priv_user'] != '' && $data['priv_password'] != '' ) {
 | 
						|
				$tmp_user_name = $data['priv_user'];
 | 
						|
				$tmp_password = $data['priv_password'];
 | 
						|
			} else if ( isset( $data ) ) {
 | 
						|
				$tmp_user_name = $data['user'];
 | 
						|
				$tmp_password = $data['password'];
 | 
						|
			}
 | 
						|
 | 
						|
			$install_obj->setNewDatabaseConnection( $data['final_type'], $host, $tmp_user_name, $tmp_password, '' );
 | 
						|
			$install_obj->setDatabaseDriver( $data['final_type'] );
 | 
						|
 | 
						|
			if ( $install_obj->checkDatabaseExists( $data['database_name'] ) == false ) {
 | 
						|
				Debug::Text( 'Creating Database', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
				$install_obj->createDatabase( $data['database_name'] );
 | 
						|
			}
 | 
						|
 | 
						|
			//Check again to make sure database exists.
 | 
						|
			$install_obj->setNewDatabaseConnection( $data['final_type'], $host, $tmp_user_name, $tmp_password, $data['database_name'] );
 | 
						|
			if ( $install_obj->checkDatabaseExists( $data['database_name'] ) == true ) {
 | 
						|
				//Create SQL
 | 
						|
				Debug::Text( 'yDatabase does exist...', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
				$tmp_config_data = [];
 | 
						|
				$tmp_config_data['database']['type'] = $data['final_type'];
 | 
						|
				$tmp_config_data['database']['host'] = $data['final_host'];
 | 
						|
				$tmp_config_data['database']['database_name'] = $data['database_name'];
 | 
						|
				$tmp_config_data['database']['user'] = $data['user'];
 | 
						|
				$tmp_config_data['database']['password'] = $data['password'];
 | 
						|
 | 
						|
				$install_obj->writeConfigFile( $tmp_config_data );
 | 
						|
 | 
						|
				return $this->returnHandler( [ 'next_page' => 'databaseSchema' ] );
 | 
						|
			} else {
 | 
						|
				Debug::Text( 'zDatabase does not exist.', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
			}
 | 
						|
 | 
						|
			$test_connection = null;
 | 
						|
			$test_priv_connection = null;
 | 
						|
 | 
						|
			$data['test_connection'] = $test_connection;
 | 
						|
			$data['test_priv_connection'] = $test_priv_connection;
 | 
						|
			$data['database_engine'] = $database_engine;
 | 
						|
 | 
						|
			//Get DB settings from INI file.
 | 
						|
			$data = [
 | 
						|
					'type'                 => $config_vars['database']['type'],
 | 
						|
					'host'                 => $config_vars['database']['host'],
 | 
						|
					'database_name'        => $config_vars['database']['database_name'],
 | 
						|
					'user'                 => $config_vars['database']['user'],
 | 
						|
					'password'             => $config_vars['database']['password'],
 | 
						|
					'test_connection'      => $test_connection,
 | 
						|
					'test_priv_connection' => $test_priv_connection,
 | 
						|
					'database_engine'      => $database_engine,
 | 
						|
			];
 | 
						|
 | 
						|
			$data['type_options'] = $install_obj->getDatabaseTypeArray();
 | 
						|
			$data['application_name'] = APPLICATION_NAME;
 | 
						|
			if ( !isset( $data['priv_user'] ) ) {
 | 
						|
				$data['priv_user'] = null;
 | 
						|
			}
 | 
						|
 | 
						|
			return $this->returnHandler( $data );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getDatabaseSchema() {
 | 
						|
		global $db, $config_vars;
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$install_obj->setDatabaseConnection( $db ); //Default connection
 | 
						|
 | 
						|
			if ( $install_obj->checkDatabaseExists( $config_vars['database']['database_name'] ) == true ) {
 | 
						|
				if ( $install_obj->checkTableExists( 'company' ) == true ) {
 | 
						|
					//Table could be created, but check to make sure a company actually exists too.
 | 
						|
					$clf = TTnew( 'CompanyListFactory' ); /** @var CompanyListFactory $clf */
 | 
						|
					$clf->getAll();
 | 
						|
					if ( $clf->getRecordCount() >= 1 ) {
 | 
						|
						$install_obj->setIsUpgrade( true );
 | 
						|
					} else {
 | 
						|
						//No company exists, send them to the create company page.
 | 
						|
						$install_obj->setIsUpgrade( false );
 | 
						|
					}
 | 
						|
				} else {
 | 
						|
					$install_obj->setIsUpgrade( false );
 | 
						|
				}
 | 
						|
 | 
						|
				if ( $install_obj->getIsUpgrade() == true ) {
 | 
						|
					$retval = [ 'upgrade' => 1 ];
 | 
						|
				} else {
 | 
						|
					$retval = [ 'upgrade' => 0 ];
 | 
						|
				}
 | 
						|
 | 
						|
				return $this->returnHandler( $retval );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param int $external_installer
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function setDatabaseSchema( $external_installer = 0 ) {
 | 
						|
		ignore_user_abort( true );
 | 
						|
		ini_set( 'max_execution_time', 0 );
 | 
						|
		ini_set( 'memory_limit', '-1' ); //Just in case.
 | 
						|
 | 
						|
		//Always enable debug logging during upgrade.
 | 
						|
		Debug::setEnable( true );
 | 
						|
		Debug::setBufferOutput( true );
 | 
						|
		Debug::setEnableLog( true );
 | 
						|
		Debug::setVerbosity( 10 );
 | 
						|
 | 
						|
		global $db, $config_vars;
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
 | 
						|
			$install_obj->setAPIMessageID( $this->getAPIMessageID() );
 | 
						|
 | 
						|
			$install_obj->setDatabaseConnection( $db ); //Default connection
 | 
						|
 | 
						|
			if ( $install_obj->checkDatabaseExists( $config_vars['database']['database_name'] ) == true ) {
 | 
						|
				if ( $install_obj->checkTableExists( 'company' ) == true ) {
 | 
						|
					//Table could be created, but check to make sure a company actually exists too.
 | 
						|
					$clf = TTnew( 'CompanyListFactory' ); /** @var CompanyListFactory $clf */
 | 
						|
					$clf->getAll();
 | 
						|
					if ( $clf->getRecordCount() >= 1 ) {
 | 
						|
						$install_obj->setIsUpgrade( true );
 | 
						|
					} else {
 | 
						|
						//No company exists, send them to the create company page.
 | 
						|
						$install_obj->setIsUpgrade( false );
 | 
						|
					}
 | 
						|
				} else {
 | 
						|
					$install_obj->setIsUpgrade( false );
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $install_obj->checkDatabaseExists( $config_vars['database']['database_name'] ) == true ) {
 | 
						|
				@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'database_schema' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
				//Create SQL, always try to install every schema version, as
 | 
						|
				//installSchema() will check if its already been installed or not.
 | 
						|
				$install_obj->setDatabaseDriver( $config_vars['database']['type'] );
 | 
						|
				$install_obj->createSchemaRange( null, null ); //All schema versions
 | 
						|
 | 
						|
				//FIXME: Notify the user of any errors.
 | 
						|
				$install_obj->setVersions();
 | 
						|
			} else {
 | 
						|
				Debug::Text( 'bDatabase does not exist.', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $install_obj->getIsUpgrade() == true ) {
 | 
						|
				//Make sure when using external installer that update notifications are always enabled.
 | 
						|
				if ( $external_installer == 1 ) {
 | 
						|
					SystemSettingFactory::setSystemSetting( 'update_notify', 1 );
 | 
						|
				}
 | 
						|
				$retval = [ 'next_page' => 'postUpgrade' ];
 | 
						|
			} else {
 | 
						|
				if ( $external_installer == 1 ) {
 | 
						|
					$retval = [ 'next_page' => 'systemSettings', 'action' => 'next' ];
 | 
						|
				} else {
 | 
						|
					$retval = [ 'next_page' => 'systemSettings' ];
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			//Debug::writeToLog(); //Handled in TTShutdown now.
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function postUpgrade() {
 | 
						|
		global $cache;
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$retval = [];
 | 
						|
			$retval['application_name'] = APPLICATION_NAME;
 | 
						|
			$retval['application_version'] = APPLICATION_VERSION;
 | 
						|
 | 
						|
			//Check for updated license file.
 | 
						|
			$obj_class = "\124\124\114\x69\x63\x65\x6e\x73\x65"; $license = @new $obj_class;
 | 
						|
			$license->getLicenseFile( true ); //Download updated license file if one exists.
 | 
						|
 | 
						|
			$cache->clean(); //Clear all cache.
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'postupgrade' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $upgrade
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function installDone( $upgrade ) {
 | 
						|
		global $cache;
 | 
						|
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			//Disable installer now that we're done.
 | 
						|
			$tmp_config_data = [];
 | 
						|
			$tmp_config_data['other']['installer_enabled'] = 'FALSE';
 | 
						|
			$tmp_config_data['other']['default_interface'] = 'html5';
 | 
						|
			$install_obj->writeConfigFile( $tmp_config_data );
 | 
						|
 | 
						|
			//Reset new_version flag.
 | 
						|
			SystemSettingFactory::setSystemSetting( 'new_version', 0 );
 | 
						|
 | 
						|
			//Reset system requirement flag, as all requirements should have passed.
 | 
						|
			SystemSettingFactory::setSystemSetting( 'valid_install_requirements', 1 );
 | 
						|
 | 
						|
			//Reset auto_upgrade_failed flag, as they likely just upgraded to the latest version.
 | 
						|
			SystemSettingFactory::setSystemSetting( 'auto_upgrade_failed', 0 );
 | 
						|
 | 
						|
			$cache->clean(); //Clear all cache.
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'done' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			$retval = [];
 | 
						|
			$retval['application_name'] = APPLICATION_NAME;
 | 
						|
//			$retval['base_url'] = Environment::getBaseURL();
 | 
						|
 | 
						|
			if ( isset( $upgrade ) ) {
 | 
						|
 | 
						|
				$retval['upgrade'] = $upgrade;
 | 
						|
			}
 | 
						|
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $data
 | 
						|
	 * @param int $external_installer
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function setSystemSettings( $data, $external_installer = 0 ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			//
 | 
						|
			//InstallSchema_1000A->postInstall() now sets the registration key and UUID seed.
 | 
						|
			//
 | 
						|
 | 
						|
			//Set salt if it isn't already.
 | 
						|
			$tmp_config_data = [];
 | 
						|
			$tmp_config_data['other']['salt'] = md5( uniqid( null, true ) );
 | 
						|
 | 
						|
			if ( isset( $data['base_url'] ) && $data['base_url'] != '' ) {
 | 
						|
				$tmp_config_data['path']['base_url'] = $data['base_url'];
 | 
						|
			}
 | 
						|
			if ( isset( $data['log_dir'] ) && $data['log_dir'] != '' ) {
 | 
						|
				$tmp_config_data['path']['log'] = $data['log_dir'];
 | 
						|
			}
 | 
						|
			if ( isset( $data['storage_dir'] ) && $data['storage_dir'] != '' ) {
 | 
						|
				$tmp_config_data['path']['storage'] = $data['storage_dir'];
 | 
						|
			}
 | 
						|
			if ( isset( $data['cache_dir'] ) && $data['cache_dir'] != '' ) {
 | 
						|
				$tmp_config_data['cache']['dir'] = $data['cache_dir'];
 | 
						|
			}
 | 
						|
 | 
						|
			if ( isset( $data['time_zone'] ) && $data['time_zone'] != '' ) {
 | 
						|
				$tmp_config_data['other']['system_timezone'] = $data['time_zone'];
 | 
						|
			}
 | 
						|
 | 
						|
			$install_obj->writeConfigFile( $tmp_config_data );
 | 
						|
 | 
						|
			if ( !isset( $data['update_notify'] ) ) {
 | 
						|
				$data['update_notify'] = 1;
 | 
						|
			}
 | 
						|
 | 
						|
			if ( !isset( $data['anonymous_update_notify'] ) ) {
 | 
						|
				$data['anonymous_update_notify'] = 0;
 | 
						|
			}
 | 
						|
 | 
						|
			//Write auto_update feature to system settings.
 | 
						|
			if ( ( isset( $data['update_notify'] ) && $data['update_notify'] == 1 )
 | 
						|
					|| getTTProductEdition() >= TT_PRODUCT_PROFESSIONAL
 | 
						|
					|| $external_installer == 1 ) {
 | 
						|
				SystemSettingFactory::setSystemSetting( 'update_notify', 1 );
 | 
						|
			} else {
 | 
						|
				SystemSettingFactory::setSystemSetting( 'update_notify', 0 );
 | 
						|
			}
 | 
						|
 | 
						|
			//Write anonymous_auto_update feature to system settings.
 | 
						|
			if ( getTTProductEdition() == TT_PRODUCT_COMMUNITY && isset( $data['anonymous_update_notify'] ) && $data['anonymous_update_notify'] == 1 ) {
 | 
						|
				SystemSettingFactory::setSystemSetting( 'anonymous_update_notify', 1 );
 | 
						|
			} else {
 | 
						|
				SystemSettingFactory::setSystemSetting( 'anonymous_update_notify', 0 );
 | 
						|
			}
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'system_setting', 'update_notify' => (int)$data['update_notify'], 'anonymous_update_notify' => (int)$data['anonymous_update_notify'] ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			return $this->returnHandler( true );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getSystemSettings() {
 | 
						|
		global $config_vars;
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$retval = [
 | 
						|
					'host_name'   => $_SERVER['HTTP_HOST'],
 | 
						|
					'base_url'    => Environment::getBaseURL(),
 | 
						|
					'log_dir'     => $config_vars['path']['log'],
 | 
						|
					'storage_dir' => $config_vars['path']['storage'],
 | 
						|
					'cache_dir'   => $config_vars['cache']['dir'],
 | 
						|
			];
 | 
						|
 | 
						|
			$upf = TTNew( 'UserPreferenceFactory' ); /** @var UserPreferenceFactory $upf */
 | 
						|
 | 
						|
			$retval['time_zone'] = TTDate::detectSystemTimeZone(); //This is only used during initial install and not upgrades.
 | 
						|
			$retval['time_zone_options'] = Misc::trimSortPrefix( $upf->getOptions( 'time_zone' ) );
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'system_setting' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param string $company_id UUID
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getCompany( $company_id = null ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$cf = TTnew( 'CompanyFactory' ); /** @var CompanyFactory $cf */
 | 
						|
			$clf = TTnew( 'CompanyListFactory' ); /** @var CompanyListFactory $clf */
 | 
						|
 | 
						|
			$company_data = [];
 | 
						|
			if ( isset( $company_id ) && $company_id != '' ) {
 | 
						|
				$clf->getByCompanyId( $company_id );
 | 
						|
				if ( $clf->getRecordCount() == 1 ) {
 | 
						|
					$cf = $clf->getCurrent();
 | 
						|
					$company_data['name'] = $cf->getName();
 | 
						|
					$company_data['short_name'] = $cf->getShortName();
 | 
						|
					$company_data['industry_id'] = $cf->getIndustry();
 | 
						|
					$company_data['address1'] = $cf->getAddress1();
 | 
						|
					$company_data['address2'] = $cf->getAddress2();
 | 
						|
					$company_data['city'] = $cf->getCity();
 | 
						|
					$company_data['country'] = $cf->getCountry();
 | 
						|
					$company_data['province'] = $cf->getProvince();
 | 
						|
					$company_data['postal_code'] = $cf->getPostalCode();
 | 
						|
					$company_data['work_phone'] = $cf->getWorkPhone();
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			//Select box options;
 | 
						|
			$company_data['status_options'] = $cf->getOptions( 'status' );
 | 
						|
			$company_data['country_options'] = $cf->getOptions( 'country' );
 | 
						|
			$company_data['industry_options'] = $cf->getOptions( 'industry' );
 | 
						|
 | 
						|
			return $this->returnHandler( $company_data );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $company_data
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function setCompany( $company_data ) {
 | 
						|
		if ( !is_array( $company_data ) ) {
 | 
						|
			return $this->returnHandler( false );
 | 
						|
		}
 | 
						|
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$cf = TTnew( 'CompanyFactory' ); /** @var CompanyFactory $cf */
 | 
						|
			$clf = TTnew( 'CompanyListFactory' ); /** @var CompanyListFactory $clf */
 | 
						|
			if ( isset( $company_data['company_id'] ) && $company_data['company_id'] != '' ) {
 | 
						|
				$clf->getById( $company_data['company_id'] );
 | 
						|
				if ( $clf->getRecordCount() == 1 ) {
 | 
						|
					$cf = $clf->getCurrent();
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			$cf->setStatus( 10 );
 | 
						|
			$cf->setProductEdition( (int)getTTProductEdition() );
 | 
						|
			$cf->setName( $company_data['name'], true ); //Force change.
 | 
						|
			$cf->setShortName( $company_data['short_name'] );
 | 
						|
			$cf->setIndustry( $company_data['industry_id'] );
 | 
						|
			$cf->setAddress1( $company_data['address1'] );
 | 
						|
			$cf->setAddress2( $company_data['address2'] );
 | 
						|
			$cf->setCity( $company_data['city'] );
 | 
						|
			$cf->setCountry( $company_data['country'] );
 | 
						|
			$cf->setProvince( $company_data['province'] );
 | 
						|
			$cf->setPostalCode( $company_data['postal_code'] );
 | 
						|
			$cf->setWorkPhone( $company_data['work_phone'] );
 | 
						|
 | 
						|
			$cf->setEnableAddLegalEntity( true );
 | 
						|
			$cf->setEnableAddCurrency( true );
 | 
						|
			$cf->setEnableAddPermissionGroupPreset( true );
 | 
						|
			$cf->setEnableAddUserDefaultPreset( true );
 | 
						|
			$cf->setEnableAddStation( true );
 | 
						|
			$cf->setEnableAddPayStubEntryAccountPreset( true );
 | 
						|
			$cf->setEnableAddCompanyDeductionPreset( true );
 | 
						|
			$cf->setEnableAddRecurringHolidayPreset( true );
 | 
						|
 | 
						|
			if ( $cf->isValid() ) {
 | 
						|
				if ( $cf->Save( false ) ) {
 | 
						|
					@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'company' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
					$company_id = $cf->getId();
 | 
						|
					unset( $cf );
 | 
						|
					$install_obj->writeConfigFile( [ 'other' => [ 'primary_company_id' => (string)$company_id ] ] );
 | 
						|
 | 
						|
					return $this->returnHandler( $company_id );
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				$validator = [];
 | 
						|
				$validator[] = $cf->Validator->getErrorsArray();
 | 
						|
				$validator_stats = [ 'total_records' => 1, 'valid_records' => 1 ];
 | 
						|
 | 
						|
				return $this->returnHandler( false, 'VALIDATION', TTi18n::getText( 'INVALID DATA' ), $validator, $validator_stats );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param string $company_id UUID
 | 
						|
	 * @param string $user_id    UUID
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getUser( $company_id, $user_id ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$user_data = [];
 | 
						|
			if ( isset( $company_id ) && $company_id != '' ) {
 | 
						|
				$user_data['company_id'] = $company_id;
 | 
						|
			}
 | 
						|
 | 
						|
			if ( isset( $user_id ) && $user_id != '' ) {
 | 
						|
				$ulf = TTnew( 'UserListFactory' ); /** @var UserListFactory $ulf */
 | 
						|
				$ulf->getById( $user_id );
 | 
						|
				if ( $ulf->getRecordCount() == 1 ) {
 | 
						|
					$uf = $ulf->getCurrent();
 | 
						|
					$user_data['user_name'] = $uf->getUserName();
 | 
						|
					$user_data['first_name'] = $uf->getFirstName();
 | 
						|
					$user_data['last_name'] = $uf->getLastName();
 | 
						|
					$user_data['work_email'] = $uf->getWorkEmail();
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			$user_data['application_name'] = APPLICATION_NAME;
 | 
						|
 | 
						|
			return $this->returnHandler( $user_data );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $user_data
 | 
						|
	 * @param int $external_installer
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function setUser( $user_data, $external_installer = 0 ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
			$uf = TTnew( 'UserFactory' ); /** @var UserFactory $uf */
 | 
						|
			$ulf = TTnew( 'UserListFactory' ); /** @var UserListFactory $ulf */
 | 
						|
			if ( isset( $user_data['user_id'] ) && $user_data['user_id'] != '' ) {
 | 
						|
				$ulf->getByIdAndCompanyId( $user_data['user_id'], $user_data['company_id'] );
 | 
						|
				if ( $ulf->getRecordCount() == 1 ) {
 | 
						|
					$uf = $ulf->getCurrent();
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				$uf->setId( $uf->getNextInsertId() ); //Because password encryption requires the user_id, we need to get it first when creating a new employee.
 | 
						|
			}
 | 
						|
 | 
						|
			if ( !isset( $user_data['company_id'] ) ) {
 | 
						|
				$user_data['company_id'] = TTUUID::getZeroID();
 | 
						|
			}
 | 
						|
 | 
						|
			//Grab first legal entity associated with this company.
 | 
						|
			$lef = TTnew( 'LegalEntityListFactory' ); /** @var LegalEntityListFactory $lef */
 | 
						|
			$lef->getByCompanyId( $user_data['company_id'] );
 | 
						|
			if ( $lef->getRecordCount() > 0 ) {
 | 
						|
				$le_obj = $lef->getCurrent();
 | 
						|
 | 
						|
				$uf->StartTransaction();
 | 
						|
				$uf->setCompany( $user_data['company_id'] );
 | 
						|
				$uf->setLegalEntity( $le_obj->getId() );
 | 
						|
				$uf->setStatus( 10 );
 | 
						|
				$uf->setUserName( $user_data['user_name'] );
 | 
						|
				if ( !empty( $user_data['password'] ) && $user_data['password'] == $user_data['password2'] ) {
 | 
						|
					$uf->setPassword( $user_data['password'] );
 | 
						|
				} else {
 | 
						|
					$uf->Validator->isTrue( 'password',
 | 
						|
											false,
 | 
						|
											TTi18n::gettext( 'Passwords don\'t match' ) );
 | 
						|
				}
 | 
						|
 | 
						|
				$uf->setEmployeeNumber( 1 );
 | 
						|
				$uf->setFirstName( $user_data['first_name'] );
 | 
						|
				$uf->setLastName( $user_data['last_name'] );
 | 
						|
				$uf->setWorkEmail( $user_data['work_email'] );
 | 
						|
				$uf->setPasswordUpdatedDate( time() ); //This prevents them from needing to change their password upon first login.
 | 
						|
 | 
						|
				if ( is_object( $uf->getCompanyObject() ) ) {
 | 
						|
					$uf->setCountry( $uf->getCompanyObject()->getCountry() );
 | 
						|
					$uf->setProvince( $uf->getCompanyObject()->getProvince() );
 | 
						|
					$uf->setAddress1( $uf->getCompanyObject()->getAddress1() );
 | 
						|
					$uf->setAddress2( $uf->getCompanyObject()->getAddress2() );
 | 
						|
					$uf->setCity( $uf->getCompanyObject()->getCity() );
 | 
						|
					$uf->setPostalCode( $uf->getCompanyObject()->getPostalCode() );
 | 
						|
					$uf->setWorkPhone( $uf->getCompanyObject()->getWorkPhone() );
 | 
						|
					$uf->setHomePhone( $uf->getCompanyObject()->getWorkPhone() );
 | 
						|
 | 
						|
					//We can't use UserDefault yet, as SetupPresets needs a User object to create them first, and haven't done that yet. Since we just need a currency here, grab it directly.
 | 
						|
					$clf = TTnew( 'CurrencyListFactory' );
 | 
						|
					$clf->getByCompanyId( $uf->getCompany() );
 | 
						|
					if ( $clf->getRecordCount() > 0 ) {
 | 
						|
						$uf->setCurrency( $clf->getCurrent()->getId() );
 | 
						|
					}
 | 
						|
					unset( $clf );
 | 
						|
				}
 | 
						|
 | 
						|
				//Get Permission Control with highest level, assume its for Administrators and use it.
 | 
						|
				$pclf = TTnew( 'PermissionControlListFactory' ); /** @var PermissionControlListFactory $pclf */
 | 
						|
				$pclf->getByCompanyId( $user_data['company_id'], null, null, null, [ 'level' => 'desc' ] );
 | 
						|
				if ( $pclf->getRecordCount() > 0 ) {
 | 
						|
					$pc_obj = $pclf->getCurrent();
 | 
						|
					if ( is_object( $pc_obj ) ) {
 | 
						|
						Debug::Text( 'Adding User to Permission Control: ' . $pc_obj->getId(), __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
						$uf->setPermissionControl( $pc_obj->getId() );
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				if ( $uf->isValid() ) {
 | 
						|
					@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'user' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
					$user_id = $uf->getId();
 | 
						|
					$uf->Save( true, true );
 | 
						|
					//Assign this user as admin/support/billing contact for now.
 | 
						|
					$clf = TTnew( 'CompanyListFactory' ); /** @var CompanyListFactory $clf */
 | 
						|
					$clf->getById( $user_data['company_id'] );
 | 
						|
					if ( $clf->getRecordCount() == 1 ) {
 | 
						|
						$c_obj = $clf->getCurrent();
 | 
						|
						$c_obj->setAdminContact( $user_id );
 | 
						|
						$c_obj->setBillingContact( $user_id );
 | 
						|
						$c_obj->setSupportContact( $user_id );
 | 
						|
						if ( $c_obj->isValid() ) {
 | 
						|
							$c_obj->Save();
 | 
						|
						}
 | 
						|
						unset( $c_obj, $clf );
 | 
						|
					}
 | 
						|
 | 
						|
					$uf->CommitTransaction();
 | 
						|
 | 
						|
					if ( $external_installer == 1 ) {
 | 
						|
						return $this->returnHandler( [ 'user_id' => $user_id, 'next_page' => 'installDone' ] );
 | 
						|
					} else {
 | 
						|
						return $this->returnHandler( [ 'user_id' => $user_id, 'next_page' => 'maintenanceJobs' ] );
 | 
						|
					}
 | 
						|
				} else {
 | 
						|
					$uf->FailTransaction();
 | 
						|
 | 
						|
					$validator = [];
 | 
						|
					$validator[] = $uf->Validator->getErrorsArray();
 | 
						|
					$validator_stats = [ 'total_records' => 1, 'valid_records' => 1 ];
 | 
						|
 | 
						|
					return $this->returnHandler( false, 'VALIDATION', TTi18n::getText( 'INVALID DATA' ), $validator, $validator_stats );
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				return $this->returnHandler( false, 'VALIDATION', TTi18n::getText( 'INVALID DATA' ), [ 0 => [ 'user_name' => [ TTi18n::getText( 'Legal Entity does not exist, please go back a step and try again.' ) ] ] ], [ 'total_records' => 1, 'valid_records' => 0 ] );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $country
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getProvinceOptions( $country ) {
 | 
						|
		Debug::Arr( $country, 'aCountry: ', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		if ( !is_array( $country ) && $country == '' ) {
 | 
						|
			return $this->returnHandler( false );
 | 
						|
		}
 | 
						|
 | 
						|
		if ( !is_array( $country ) ) {
 | 
						|
			$country = [ $country ];
 | 
						|
		}
 | 
						|
 | 
						|
		Debug::Arr( $country, 'bCountry: ', __FILE__, __LINE__, __METHOD__, 10 );
 | 
						|
 | 
						|
		$cf = TTnew( 'CompanyFactory' ); /** @var CompanyFactory $cf */
 | 
						|
 | 
						|
		$province_arr = $cf->getOptions( 'province' );
 | 
						|
 | 
						|
		$retarr = [];
 | 
						|
 | 
						|
		foreach ( $country as $tmp_country ) {
 | 
						|
			if ( isset( $province_arr[strtoupper( $tmp_country )] ) ) {
 | 
						|
				//Debug::Arr($province_arr[strtoupper($tmp_country)], 'Provinces Array', __FILE__, __LINE__, __METHOD__, 10);
 | 
						|
 | 
						|
				$retarr = array_merge( $retarr, $province_arr[strtoupper( $tmp_country )] );
 | 
						|
				//$retarr = array_merge( $retarr, Misc::prependArray( array( -10 => '--' ), $province_arr[strtoupper($tmp_country)] ) );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if ( count( $retarr ) == 0 ) {
 | 
						|
			$retarr = [ '00' => '--' ];
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( $retarr );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param null $data
 | 
						|
	 * @return array|bool
 | 
						|
	 */
 | 
						|
	function getMaintenanceJobs( $data = null ) {
 | 
						|
		$install_obj = new Install();
 | 
						|
 | 
						|
		if ( $install_obj->isInstallMode() == true ) {
 | 
						|
 | 
						|
			$retval = [];
 | 
						|
			$retval['application_name'] = APPLICATION_NAME ? APPLICATION_NAME : '';
 | 
						|
 | 
						|
			if ( isset( $data['company_id'] ) ) {
 | 
						|
				$retval['company_id'] = $data['company_id'];
 | 
						|
			}
 | 
						|
 | 
						|
			$retval['php_os'] = PHP_OS;
 | 
						|
 | 
						|
			@file_get_contents( 'http://www.timetrex.com/' . URLBuilder::getURL( [ 'v' => $install_obj->getFullApplicationVersion(), 'page' => 'maintenance' ], 'pre_install.php' ), 'r' );
 | 
						|
 | 
						|
			if ( $install_obj->ScheduleMaintenanceJobs() == 0 ) { //Add scheduled maintenance jobs to cron/schtask, if it succeeds move to next step automatically.
 | 
						|
				return $this->returnHandler( true );
 | 
						|
			}
 | 
						|
 | 
						|
			if ( $install_obj->getWebServerUser() ) {
 | 
						|
				$retval['web_server_user'] = $install_obj->getWebServerUser();
 | 
						|
			} else {
 | 
						|
				$retval['web_server_user'] = '';
 | 
						|
			}
 | 
						|
 | 
						|
			$retval['schedule_maintenance_job_command'] = $install_obj->getScheduleMaintenanceJobsCommand();
 | 
						|
			$retval['cron_file'] = Environment::getBasePath() . 'maint' . DIRECTORY_SEPARATOR . 'cron.php';
 | 
						|
			$retval['php_cli'] = $install_obj->getPHPCLI();
 | 
						|
			$retval['is_sudo_installed'] = $install_obj->isSUDOInstalled();
 | 
						|
 | 
						|
			return $this->returnHandler( $retval );
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->returnHandler( false );
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
?>
 |