From 6cd975664be8b688ba9a397d0f61a26209ad0d18 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Thu, 26 Nov 2015 20:11:58 -0400 Subject: [PATCH] PM-444 "0013316: Be able to assign users to different time zone (user's time zone)" SOLVED Issue: PM-444: 0013316: Be able to assign users to different time zone PM-3493: Agregar soporte multiple timezone a los endpoints usando formato fecha ISO 8601 Cause: New feature Solution: Added functionality for time zone --- framework/src/Maveriks/WebApplication.php | 51 +-- gulliver/bin/tasks/templates/defines.php.tpl | 11 +- rbac/engine/config/defines.php | 20 +- rbac/public_html/sysGeneric.php | 7 +- workflow/engine/PmBootstrap.php | 4 +- workflow/engine/classes/class.Installer.php | 18 +- .../engine/classes/class.ldapAdvanced.php | 1 - workflow/engine/classes/class.system.php | 35 +- .../classes/model/map/UsersMapBuilder.php | 2 + .../engine/classes/model/om/BaseUsers.php | 60 ++- .../engine/classes/model/om/BaseUsersPeer.php | 23 +- workflow/engine/config/schema.xml | 1 + workflow/engine/controllers/admin.php | 16 +- workflow/engine/controllers/installer.php | 30 +- workflow/engine/data/mysql/schema.sql | 1 + workflow/engine/methods/cases/cases_Step.php | 6 +- .../engine/methods/cases/proxyCasesList.php | 4 + .../methods/cases/proxyNewCasesList.php | 2 +- .../engine/methods/login/authentication.php | 16 + .../methods/processes/processesList.php | 10 +- workflow/engine/methods/users/usersAjax.php | 46 ++- workflow/engine/methods/users/usersEdit.php | 30 +- workflow/engine/methods/users/usersInit.php | 10 +- workflow/engine/methods/users/usersNew.php | 45 ++- workflow/engine/skinEngine/skinEngine.php | 10 +- .../ProcessMaker/BusinessModel/Process.php | 74 ++-- .../src/ProcessMaker/BusinessModel/User.php | 132 ++++--- .../ProcessMaker/BusinessModel/Validator.php | 46 +++ .../src/ProcessMaker/Services/Api/Lists.php | 34 +- .../Services/Api/Project/TimerEvent.php | 18 +- .../src/ProcessMaker/Services/Api/User.php | 10 +- .../ProcessMaker/Services/OAuth2/Server.php | 15 + .../engine/src/ProcessMaker/Util/DateTime.php | 361 ++++++++++++++++++ workflow/engine/templates/users/users.js | 40 +- workflow/public_html/bootstrap.php | 8 +- workflow/public_html/sysGeneric.php | 10 +- 36 files changed, 931 insertions(+), 276 deletions(-) create mode 100644 workflow/engine/src/ProcessMaker/Util/DateTime.php diff --git a/framework/src/Maveriks/WebApplication.php b/framework/src/Maveriks/WebApplication.php index e36fda227..696856081 100644 --- a/framework/src/Maveriks/WebApplication.php +++ b/framework/src/Maveriks/WebApplication.php @@ -343,7 +343,7 @@ class WebApplication } } - // + // // Register API Plugins classes $isPluginRequest = strpos($uri, '/plugin-') !== false ? true : false; @@ -355,7 +355,7 @@ class WebApplication $pluginName = $tmp[1]; $uri = str_replace('plugin-'.$pluginName, strtolower($pluginName), $uri); } - + // hook to get rest api classes from plugins if (class_exists('PMPluginRegistry') && file_exists(PATH_DATA_SITE . 'plugin.singleton')) { $pluginRegistry = \PMPluginRegistry::loadSingleton(PATH_DATA_SITE . 'plugin.singleton'); @@ -367,12 +367,12 @@ class WebApplication $loader = \Maveriks\Util\ClassLoader::getInstance(); $loader->add($pluginSourceDir); - + foreach ($plugin as $class) { if (class_exists($class['namespace'])) { $this->rest->addAPIClass($class['namespace'], strtolower($pluginName)); - } - } + } + } } } } @@ -447,25 +447,9 @@ class WebApplication \Bootstrap::registerSystemClasses(); + $arraySystemConfiguration = \System::getSystemConfiguration(); - $config = \System::getSystemConfiguration(); - - // Do not change any of these settings directly, use env.ini instead - ini_set( "display_errors", $config["display_errors"]); - ini_set( "error_reporting", $config["error_reporting"]); - ini_set( "short_open_tag", "On" ); // ?? - ini_set( "default_charset", "UTF-8" ); // ?? - ini_set( "memory_limit", $config["memory_limit"] ); - ini_set( "soap.wsdl_cache_enabled", $config["wsdl_cache"] ); - ini_set( "date.timezone", $config["time_zone"] ); - - define("DEBUG_SQL_LOG", $config["debug_sql"]); - define("DEBUG_TIME_LOG", $config["debug_time"]); - define("DEBUG_CALENDAR_LOG", $config["debug_calendar"]); - define("MEMCACHED_ENABLED", $config["memcached"]); - define("MEMCACHED_SERVER", $config["memcached_server"]); - define("TIME_ZONE", $config["time_zone"]); - define("SYS_SKIN", $config["default_skin"]); + ini_set('date.timezone', $arraySystemConfiguration['time_zone']); //Set Time Zone // set include path set_include_path( @@ -511,6 +495,27 @@ class WebApplication exit(0); } + $arraySystemConfiguration = \System::getSystemConfiguration('', '', SYS_SYS); + + $_SESSION['__SYSTEM_UTC_TIME_ZONE__'] = (int)($arraySystemConfiguration['system_utc_time_zone']) == 1; + + //Do not change any of these settings directly, use env.ini instead + ini_set('display_errors', $arraySystemConfiguration['display_errors']); + ini_set('error_reporting', $arraySystemConfiguration['error_reporting']); + ini_set('short_open_tag', 'On'); //?? + ini_set('default_charset', 'UTF-8'); //?? + ini_set('memory_limit', $arraySystemConfiguration['memory_limit']); + ini_set('soap.wsdl_cache_enabled', $arraySystemConfiguration['wsdl_cache']); + ini_set('date.timezone', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 'UTC' : $arraySystemConfiguration['time_zone']); //Set Time Zone + + define('DEBUG_SQL_LOG', $arraySystemConfiguration['debug_sql']); + define('DEBUG_TIME_LOG', $arraySystemConfiguration['debug_time']); + define('DEBUG_CALENDAR_LOG', $arraySystemConfiguration['debug_calendar']); + define('MEMCACHED_ENABLED', $arraySystemConfiguration['memcached']); + define('MEMCACHED_SERVER', $arraySystemConfiguration['memcached_server']); + define('TIME_ZONE', ini_get('date.timezone')); + define('SYS_SKIN', $arraySystemConfiguration['default_skin']); + require_once (PATH_DB . SYS_SYS . "/db.php"); // defining constant for workspace shared directory diff --git a/gulliver/bin/tasks/templates/defines.php.tpl b/gulliver/bin/tasks/templates/defines.php.tpl index eae726edc..8253a21e9 100755 --- a/gulliver/bin/tasks/templates/defines.php.tpl +++ b/gulliver/bin/tasks/templates/defines.php.tpl @@ -1,7 +1,7 @@ =")) { - date_default_timezone_set("America/La_Paz"); - } - else { - // you're not - } - diff --git a/rbac/engine/config/defines.php b/rbac/engine/config/defines.php index 078050434..ee2d11481 100755 --- a/rbac/engine/config/defines.php +++ b/rbac/engine/config/defines.php @@ -1,10 +1,10 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. - * + * */ //***************** URL KEY ********************************************* @@ -51,11 +51,3 @@ define ( 'G_DEV_ENV', 'DEVELOPMENT' ); define ( 'G_TEST_ENV', 'TEST' ); -///************TimeZone Set***************// - - if (version_compare(phpversion(), "5.1.0", ">=")) { - date_default_timezone_set("America/La_Paz"); - } - else { - // you're not - } diff --git a/rbac/public_html/sysGeneric.php b/rbac/public_html/sysGeneric.php index 07064836c..d8a35e5d1 100755 --- a/rbac/public_html/sysGeneric.php +++ b/rbac/public_html/sysGeneric.php @@ -1,11 +1,6 @@ =")) { - date_default_timezone_set("America/La_Paz"); - } else { - // you're not - } //***************** URL KEY ********************************************* define("URL_KEY", 'c0l0s40pt1mu59r1m3' ); @@ -80,7 +75,7 @@ $virtualURITable['/(*)'] = PATH_HTML; } //************** verify if the URI is encrypted or not ************** - G::parseURI ( getenv( "REQUEST_URI" ) ); + G::parseURI ( getenv( "REQUEST_URI" ) ); //print '-' . SYS_TEMP .'-' . SYS_LANG. '-' . SYS_SKIN.'-' . SYS_COLLECTION.'-' . SYS_TARGET.'
'; diff --git a/workflow/engine/PmBootstrap.php b/workflow/engine/PmBootstrap.php index e9ef3f36a..836fd1845 100644 --- a/workflow/engine/PmBootstrap.php +++ b/workflow/engine/PmBootstrap.php @@ -38,14 +38,14 @@ class PmBootstrap extends Bootstrap ini_set('default_charset', "UTF-8"); ini_set('memory_limit', $this->pmConfig['memory_limit']); ini_set('soap.wsdl_cache_enabled', $this->pmConfig['wsdl_cache']); - ini_set('date.timezone', $this->pmConfig['time_zone']); + ini_set('date.timezone', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 'UTC' : $this->pmConfig['time_zone']); //Set Time Zone define ('DEBUG_SQL_LOG', $this->pmConfig['debug_sql']); define ('DEBUG_TIME_LOG', $this->pmConfig['debug_time']); define ('DEBUG_CALENDAR_LOG', $this->pmConfig['debug_calendar']); define ('MEMCACHED_ENABLED', $this->pmConfig['memcached']); define ('MEMCACHED_SERVER', $this->pmConfig['memcached_server']); - define ('TIME_ZONE', $this->pmConfig['time_zone']); + define ('TIME_ZONE', ini_get('date.timezone')); // enable ERROR_SHOW_SOURCE_CODE to display the source code for any WARNING OR NOTICE define ('ERROR_SHOW_SOURCE_CODE', true); diff --git a/workflow/engine/classes/class.Installer.php b/workflow/engine/classes/class.Installer.php index 9422a27d9..02f852488 100755 --- a/workflow/engine/classes/class.Installer.php +++ b/workflow/engine/classes/class.Installer.php @@ -209,7 +209,7 @@ class Installer } $path_site = $this->options['path_data'] . "/sites/" . $this->options['name'] . "/"; - $db_file = $path_site . "db.php"; + @mkdir($path_site, 0777, true); @mkdir($path_site . "files/", 0777, true); @mkdir($path_site . "mailTemplates/", 0777, true); @@ -217,6 +217,8 @@ class Installer @mkdir($path_site . "reports/", 0777, true); @mkdir($path_site . "xmlForms", 0777, true); + //Generate the db.php file + $db_file = $path_site . 'db.php'; $db_text = "options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_NAME', '" . $wf . "' );\n" . "define ('DB_USER', '" . (($this->cc_status == 1) ? $wf : $this->options['database']['username']) . "' );\n" . "define ('DB_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n" . "define ('DB_RBAC_HOST', '" . $this->options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_RBAC_NAME', '" . $rb . "' );\n" . "define ('DB_RBAC_USER', '" . (($this->cc_status == 1) ? $rb : $this->options['database']['username']) . "' );\n" . "define ('DB_RBAC_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n" . "define ('DB_REPORT_HOST', '" . $this->options['database']['hostname'] . ":" . $myPort . "' );\n" . "define ('DB_REPORT_NAME', '" . $rp . "' );\n" . "define ('DB_REPORT_USER', '" . (($this->cc_status == 1) ? $rp : $this->options['database']['username']) . "' );\n" . "define ('DB_REPORT_PASS', '" . (($this->cc_status == 1) ? $this->options['password'] : $this->options['database']['password']) . "' );\n"; if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) { $db_text .= "define ('PARTNER_FLAG', " . ((defined('PARTNER_FLAG') && PARTNER_FLAG != '') ? PARTNER_FLAG : ((isset($_REQUEST['PARTNER_FLAG'])) ? $_REQUEST['PARTNER_FLAG']:'false')) . ");\n"; @@ -225,12 +227,24 @@ class Installer } } $db_text .="?>"; + $fp = @fopen($db_file, "w"); $this->log("Create: " . $db_file . " => " . ((!$fp) ? $fp : "OK") . "\n", $fp === false); $ff = @fputs($fp, $db_text, strlen($db_text)); $this->log("Write: " . $db_file . " => " . ((!$ff) ? $ff : "OK") . "\n", $ff === false); - fclose($fp); + + //Generate the env.ini file + $envIniFile = $path_site . 'env.ini'; + $content = 'system_utc_time_zone = 1' . "\n"; + + $fp = @fopen($envIniFile, 'w'); + $this->log('Create: ' . $envIniFile . ' => ' . ((!$fp)? $fp : 'OK') . "\n", $fp === false); + $ff = @fputs($fp, $content, strlen($content)); + $this->log('Write: ' . $envIniFile . ' => ' . ((!$ff)? $ff : 'OK') . "\n", $ff === false); + fclose($fp); + + //Set data $this->setPartner(); $this->setAdmin(); diff --git a/workflow/engine/classes/class.ldapAdvanced.php b/workflow/engine/classes/class.ldapAdvanced.php index 7546ba824..98817f0dc 100755 --- a/workflow/engine/classes/class.ldapAdvanced.php +++ b/workflow/engine/classes/class.ldapAdvanced.php @@ -2471,7 +2471,6 @@ class ldapAdvanced */ public function convertDateADtoPM($dateAD) { - //date_default_timezone_set('America/New_York'); $unixTimestamp = ($dateAD / 10000000) - 11644560000; $datePM = date('Y-m-d', mktime(0, 0, 0, date('m'), '01', date('Y') + 2));//(date('Y') + 10)."-12-01"; if ($unixTimestamp >0) { diff --git a/workflow/engine/classes/class.system.php b/workflow/engine/classes/class.system.php index 40bc59683..e422dda8d 100755 --- a/workflow/engine/classes/class.system.php +++ b/workflow/engine/classes/class.system.php @@ -70,7 +70,8 @@ class System 'ie_cookie_lifetime' => 1, 'safari_cookie_lifetime' => 1, 'error_reporting' => "", - 'display_errors' => 'On' + 'display_errors' => 'On', + 'system_utc_time_zone' => 0 ); /** @@ -184,8 +185,8 @@ class System * the distro name, such as "CentOS release 5.3 (Final)" or "Ubuntu 10.10" */ $distro = ''; - if (file_exists("/dev/")){ //Windows does not have this folder - $distro = exec( "lsb_release -d -s 2> /dev/null" ); + if (file_exists("/dev/")){ //Windows does not have this folder + $distro = exec( "lsb_release -d -s 2> /dev/null" ); } /* For distros without lsb_release, we look for *release (such as @@ -1099,33 +1100,7 @@ class System public function getAllTimeZones () { - $timezones = DateTimeZone::listAbbreviations(); - - $cities = array (); - foreach ($timezones as $key => $zones) { - foreach ($zones as $id => $zone) { - /** - * Only get timezones explicitely not part of "Others". - * - * @see http://www.php.net/manual/en/timezones.others.php - */ - if (preg_match( '/^(America|Antartica|Arctic|Asia|Atlantic|Africa|Europe|Indian|Pacific)\//', $zone['timezone_id'] ) && $zone['timezone_id']) { - $cities[$zone['timezone_id']][] = $key; - } - } - } - - // For each city, have a comma separated list of all possible timezones for that city. - foreach ($cities as $key => $value) { - $cities[$key] = join( ', ', $value ); - } - // Only keep one city (the first and also most important) for each set of possibilities. - $cities = array_unique( $cities ); - - // Sort by area/city name. - ksort( $cities ); - - return $cities; + throw new Exception(__METHOD__ . ': The method is deprecated'); } public static function getSystemConfiguration ($globalIniFile = '', $wsIniFile = '', $wsName = '') diff --git a/workflow/engine/classes/model/map/UsersMapBuilder.php b/workflow/engine/classes/model/map/UsersMapBuilder.php index ed281ea98..412300c9c 100755 --- a/workflow/engine/classes/model/map/UsersMapBuilder.php +++ b/workflow/engine/classes/model/map/UsersMapBuilder.php @@ -137,6 +137,8 @@ class UsersMapBuilder $tMap->addColumn('USR_BOOKMARK_START_CASES', 'UsrBookmarkStartCases', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addColumn('USR_TIME_ZONE', 'UsrTimeZone', 'string', CreoleTypes::VARCHAR, false, 100); + $tMap->addValidator('USR_STATUS', 'validValues', 'propel.validator.ValidValuesValidator', 'ACTIVE|INACTIVE|VACATION|CLOSED', 'Please select a valid type.'); $tMap->addValidator('USR_STATUS', 'required', 'propel.validator.RequiredValidator', '', 'Type is required.'); diff --git a/workflow/engine/classes/model/om/BaseUsers.php b/workflow/engine/classes/model/om/BaseUsers.php index 570a316ee..2c12cf034 100755 --- a/workflow/engine/classes/model/om/BaseUsers.php +++ b/workflow/engine/classes/model/om/BaseUsers.php @@ -243,6 +243,12 @@ abstract class BaseUsers extends BaseObject implements Persistent */ protected $usr_bookmark_start_cases; + /** + * The value for the usr_time_zone field. + * @var string + */ + protected $usr_time_zone = ''; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -737,6 +743,17 @@ abstract class BaseUsers extends BaseObject implements Persistent return $this->usr_bookmark_start_cases; } + /** + * Get the [usr_time_zone] column value. + * + * @return string + */ + public function getUsrTimeZone() + { + + return $this->usr_time_zone; + } + /** * Set the value of [usr_uid] column. * @@ -1551,6 +1568,28 @@ abstract class BaseUsers extends BaseObject implements Persistent } // setUsrBookmarkStartCases() + /** + * Set the value of [usr_time_zone] column. + * + * @param string $v new value + * @return void + */ + public function setUsrTimeZone($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->usr_time_zone !== $v || $v === '') { + $this->usr_time_zone = $v; + $this->modifiedColumns[] = UsersPeer::USR_TIME_ZONE; + } + + } // setUsrTimeZone() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -1640,12 +1679,14 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->usr_bookmark_start_cases = $rs->getString($startcol + 35); + $this->usr_time_zone = $rs->getString($startcol + 36); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 36; // 36 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 37; // 37 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating Users object", $e); @@ -1957,6 +1998,9 @@ abstract class BaseUsers extends BaseObject implements Persistent case 35: return $this->getUsrBookmarkStartCases(); break; + case 36: + return $this->getUsrTimeZone(); + break; default: return null; break; @@ -2013,6 +2057,7 @@ abstract class BaseUsers extends BaseObject implements Persistent $keys[33] => $this->getUsrCostByHour(), $keys[34] => $this->getUsrUnitCost(), $keys[35] => $this->getUsrBookmarkStartCases(), + $keys[36] => $this->getUsrTimeZone(), ); return $result; } @@ -2152,6 +2197,9 @@ abstract class BaseUsers extends BaseObject implements Persistent case 35: $this->setUsrBookmarkStartCases($value); break; + case 36: + $this->setUsrTimeZone($value); + break; } // switch() } @@ -2319,6 +2367,10 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->setUsrBookmarkStartCases($arr[$keys[35]]); } + if (array_key_exists($keys[36], $arr)) { + $this->setUsrTimeZone($arr[$keys[36]]); + } + } /** @@ -2474,6 +2526,10 @@ abstract class BaseUsers extends BaseObject implements Persistent $criteria->add(UsersPeer::USR_BOOKMARK_START_CASES, $this->usr_bookmark_start_cases); } + if ($this->isColumnModified(UsersPeer::USR_TIME_ZONE)) { + $criteria->add(UsersPeer::USR_TIME_ZONE, $this->usr_time_zone); + } + return $criteria; } @@ -2598,6 +2654,8 @@ abstract class BaseUsers extends BaseObject implements Persistent $copyObj->setUsrBookmarkStartCases($this->usr_bookmark_start_cases); + $copyObj->setUsrTimeZone($this->usr_time_zone); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseUsersPeer.php b/workflow/engine/classes/model/om/BaseUsersPeer.php index d0ed382c3..e3342c330 100755 --- a/workflow/engine/classes/model/om/BaseUsersPeer.php +++ b/workflow/engine/classes/model/om/BaseUsersPeer.php @@ -25,7 +25,7 @@ abstract class BaseUsersPeer const CLASS_DEFAULT = 'classes.model.Users'; /** The total number of columns. */ - const NUM_COLUMNS = 36; + const NUM_COLUMNS = 37; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -139,6 +139,9 @@ abstract class BaseUsersPeer /** the column name for the USR_BOOKMARK_START_CASES field */ const USR_BOOKMARK_START_CASES = 'USERS.USR_BOOKMARK_START_CASES'; + /** the column name for the USR_TIME_ZONE field */ + const USR_TIME_ZONE = 'USERS.USR_TIME_ZONE'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -150,10 +153,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', 'UsrBookmarkStartCases', ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, UsersPeer::USR_BOOKMARK_START_CASES, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', 'USR_BOOKMARK_START_CASES', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', 'UsrBookmarkStartCases', 'UsrTimeZone', ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, UsersPeer::USR_BOOKMARK_START_CASES, UsersPeer::USR_TIME_ZONE, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', 'USR_BOOKMARK_START_CASES', 'USR_TIME_ZONE', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ) ); /** @@ -163,10 +166,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, 'UsrBookmarkStartCases' => 35, ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, UsersPeer::USR_BOOKMARK_START_CASES => 35, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, 'USR_BOOKMARK_START_CASES' => 35, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, 'UsrBookmarkStartCases' => 35, 'UsrTimeZone' => 36, ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, UsersPeer::USR_BOOKMARK_START_CASES => 35, UsersPeer::USR_TIME_ZONE => 36, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, 'USR_BOOKMARK_START_CASES' => 35, 'USR_TIME_ZONE' => 36, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ) ); /** @@ -339,6 +342,8 @@ abstract class BaseUsersPeer $criteria->addSelectColumn(UsersPeer::USR_BOOKMARK_START_CASES); + $criteria->addSelectColumn(UsersPeer::USR_TIME_ZONE); + } const COUNT = 'COUNT(USERS.USR_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 141df163d..27d1e749d 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -1493,6 +1493,7 @@ + diff --git a/workflow/engine/controllers/admin.php b/workflow/engine/controllers/admin.php index 9f53c8a18..cae1cec9d 100644 --- a/workflow/engine/controllers/admin.php +++ b/workflow/engine/controllers/admin.php @@ -26,8 +26,6 @@ class Admin extends Controller } } $skins = array (); - $timeZonesList = System::getAllTimeZones(); - $timeZonesList = array_keys( $timeZonesList ); $mainController = new Main(); $languagesList = $mainController->getLanguagesList(); $languagesList[] = array ("", G::LoadTranslation("ID_USE_LANGUAGE_URL")); @@ -37,10 +35,6 @@ class Admin extends Controller $skins[] = array ($skin['SKIN_FOLDER_ID'],$skin['SKIN_NAME']); } - foreach ($timeZonesList as $tz) { - $timeZones[] = array ($tz,$tz); - } - $this->includeExtJS( 'admin/system' ); //G::LoadClass('configuration'); @@ -55,7 +49,7 @@ class Admin extends Controller $this->setJSVar( 'skinsList', $skins ); $this->setJSVar( 'languagesList', $languagesList ); - $this->setJSVar( 'timeZonesList', $timeZones ); + $this->setJSVar('timeZonesList', array_map(function ($value) { return [$value, $value]; }, DateTimeZone::listIdentifiers())); $this->setJSVar( 'sysConf', $sysConf ); G::RenderPage( 'publish', 'extJs' ); @@ -204,7 +198,7 @@ class Admin extends Controller $this->setView('admin/maintenance'); $this->render('extJs'); } - + function getSystemInfo () { $this->setResponseType( 'json' ); @@ -217,7 +211,7 @@ class Admin extends Controller } return $data; } - + private function _getSystemInfo () { G::LoadClass( "system" ); @@ -263,7 +257,7 @@ class Admin extends Controller } } - + if (file_exists(PATH_HTML . "lib/versions")) { $versions = json_decode(file_get_contents(PATH_HTML . "lib/versions"), true); $pmuiVer = $versions["pmui_ver"]; @@ -341,7 +335,7 @@ class Admin extends Controller return $properties; } - + private function lookup ($target) { global $ntarget; diff --git a/workflow/engine/controllers/installer.php b/workflow/engine/controllers/installer.php index fb053ae42..b91ec6706 100644 --- a/workflow/engine/controllers/installer.php +++ b/workflow/engine/controllers/installer.php @@ -315,7 +315,7 @@ class Installer extends Controller $info->success = false; } } - + G::LoadSystem('inputfilter'); $filter = new InputFilter(); $pathShared = $filter->validateInput($_REQUEST['pathShared'], 'path'); @@ -392,11 +392,11 @@ class Installer extends Controller return $false; } } - + G::LoadSystem('inputfilter'); $filter = new InputFilter(); $logFile = $filter->validateInput($logFile, 'path'); - + $fpt = fopen( $logFile, 'a' ); fwrite( $fpt, sprintf( "%s %s\n", date( 'Y:m:d H:i:s' ), trim( $text ) ) ); fclose( $fpt ); @@ -744,7 +744,7 @@ class Installer extends Controller // Generate the db.php file and folders $pathSharedSites = $pathShared; $path_site = $pathShared . "/sites/" . $workspace . "/"; - $db_file = $path_site . "db.php"; + @mkdir( $path_site, 0777, true ); @mkdir( $path_site . "files/", 0777, true ); @mkdir( $path_site . "mailTemplates/", 0777, true ); @@ -752,6 +752,7 @@ class Installer extends Controller @mkdir( $path_site . "reports/", 0777, true ); @mkdir( $path_site . "xmlForms", 0777, true ); + $db_file = $path_site . 'db.php'; $dbText = "installLog( G::LoadTranslation('ID_CREATING', SYS_LANG, Array($db_file) )); file_put_contents( $db_file, $dbText ); - // Generate the databases.php file + //Generate the env.ini file + $envIniFile = $path_site . 'env.ini'; + $content = 'system_utc_time_zone = 1' . "\n"; + + $this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, [$envIniFile])); + file_put_contents($envIniFile, $content); + + //Generate the databases.php file $databases_file = $path_site . 'databases.php'; $dbData = sprintf( "\$dbAdapter = '%s';\n", 'mysql' ); $dbData .= sprintf( "\$dbHost = '%s';\n", $db_host ); @@ -805,12 +813,12 @@ class Installer extends Controller $this->mysqlFileQuery( PATH_RBAC_HOME . 'engine/data/mysql/schema.sql' ); $this->mysqlFileQuery( PATH_RBAC_HOME . 'engine/data/mysql/insert.sql' ); - + $query = sprintf( "USE %s;", $wf_workpace ); $this->mysqlQuery( $query ); $this->mysqlFileQuery( PATH_HOME . 'engine/data/mysql/schema.sql' ); $this->mysqlFileQuery( PATH_HOME . 'engine/data/mysql/insert.sql' ); - + if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) { $this->setPartner(); @@ -1297,7 +1305,7 @@ class Installer extends Controller } $db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname; - + $link = @mysql_connect( $db_host, $db_username, $db_password ); if (! $link) { $info->message .= G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG'); @@ -1305,7 +1313,7 @@ class Installer extends Controller } $db_username = $filter->validateInput($db_username, 'nosql'); $db_hostname = $filter->validateInput($db_hostname, 'nosql'); - $query = "SELECT * FROM `information_schema`.`USER_PRIVILEGES` where (GRANTEE = \"'%s'@'%s'\" OR GRANTEE = \"'%s'@'%%'\") "; + $query = "SELECT * FROM `information_schema`.`USER_PRIVILEGES` where (GRANTEE = \"'%s'@'%s'\" OR GRANTEE = \"'%s'@'%%'\") "; $query = $filter->preventSqlInjection($query, array($db_username, $db_hostname, $db_username)); $res = @mysql_query( $query, $link ); $row = @mysql_fetch_array( $res ); @@ -1350,7 +1358,7 @@ class Installer extends Controller } $db_host = ($db_port != '' && $db_port != 1433) ? $db_hostname . ':' . $db_port : $db_hostname; - + $link = @mssql_connect( $db_host, $db_username, $db_password ); if (! $link) { $info->message .= G::LoadTranslation('ID_MYSQL_CREDENTIALS_WRONG'); @@ -1665,7 +1673,7 @@ class Installer extends Controller $wf = $filter->validateInput($wf); $db_host = ($db_port != '' && $db_port != 3306) ? $db_hostname . ':' . $db_port : $db_hostname; - + $link = @mysql_connect( $db_host, $db_username, $db_password ); @mysql_select_db($wf, $link); $res = mysql_query( "SELECT STORE_ID FROM ADDONS_MANAGER WHERE ADDON_NAME = '" . $namePlugin . "'", $link ); diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 73377fb33..5ab1dab99 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -717,6 +717,7 @@ CREATE TABLE `USERS` `USR_COST_BY_HOUR` DECIMAL(7,2) default 0, `USR_UNIT_COST` VARCHAR(50) default '', `USR_BOOKMARK_START_CASES` MEDIUMTEXT, + `USR_TIME_ZONE` VARCHAR(100) default '', PRIMARY KEY (`USR_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Users'; #----------------------------------------------------------------------------- diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 428536880..0631d02f2 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -181,7 +181,7 @@ $ieVersion = null; if(preg_match("/^.*\(.*MSIE (\d+)\..+\).*$/", $_SERVER["HTTP_USER_AGENT"], $arrayMatch) || preg_match("/^.*\(.*rv.(\d+)\..+\).*$/", $_SERVER["HTTP_USER_AGENT"], $arrayMatch)){ $ieVersion = intval($arrayMatch[1]); } - + if (isset( $_GET['breakpoint'] ) && $ieVersion != 11) { $G_PUBLISH->AddContent( 'view', 'cases/showDebugFrameLoader' ); @@ -284,11 +284,11 @@ try { $FieldsPmDynaform["STEP_MODE"] = $oStep->getStepMode(); $FieldsPmDynaform["PRO_SHOW_MESSAGE"] = $noShowTitle; $FieldsPmDynaform["TRIGGER_DEBUG"] = $_SESSION['TRIGGER_DEBUG']['ISSET']; - $a = new pmDynaform($FieldsPmDynaform); + $a = new pmDynaform(\ProcessMaker\Util\DateTime::convertUtcToTimeZone($FieldsPmDynaform)); if ($a->isResponsive()) { $a->printEdit(); } else { - $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', $Fields['APP_DATA'], 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'], '', (strtolower($oStep->getStepMode()) != 'edit' ? strtolower($oStep->getStepMode()) : '')); + $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', \ProcessMaker\Util\DateTime::convertUtcToTimeZone($Fields['APP_DATA']), 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'], '', ((strtolower($oStep->getStepMode()) != 'edit')? strtolower($oStep->getStepMode()) : '')); } break; case 'INPUT_DOCUMENT': diff --git a/workflow/engine/methods/cases/proxyCasesList.php b/workflow/engine/methods/cases/proxyCasesList.php index 74d5937b9..927a3d8b7 100755 --- a/workflow/engine/methods/cases/proxyCasesList.php +++ b/workflow/engine/methods/cases/proxyCasesList.php @@ -103,6 +103,8 @@ try { $category ); + $data['data'] = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($data['data']); + $result = G::json_encode($data); } else { G::LoadClass("applications"); @@ -126,6 +128,8 @@ try { $category ); + $data['data'] = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($data['data']); + $result = G::json_encode($data); } diff --git a/workflow/engine/methods/cases/proxyNewCasesList.php b/workflow/engine/methods/cases/proxyNewCasesList.php index 0d7cb8dd5..cdc6827bd 100644 --- a/workflow/engine/methods/cases/proxyNewCasesList.php +++ b/workflow/engine/methods/cases/proxyNewCasesList.php @@ -184,7 +184,7 @@ try { $response = $filter->xssFilterHard($response); - $response["data"] = $result; + $response['data'] = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($result); echo G::json_encode($response); } catch (Exception $e) { diff --git a/workflow/engine/methods/login/authentication.php b/workflow/engine/methods/login/authentication.php index f8cb12d3e..0054756c9 100755 --- a/workflow/engine/methods/login/authentication.php +++ b/workflow/engine/methods/login/authentication.php @@ -180,6 +180,22 @@ try { $_SESSION['USR_USERNAME'] = $usr; } + //Set User Time Zone + $user = UsersPeer::retrieveByPK($_SESSION['USER_LOGGED']); + + if (!is_null($user)) { + $userTimeZone = $user->getUsrTimeZone(); + + if (trim($userTimeZone) == '') { + $arraySystemConfiguration = System::getSystemConfiguration('', '', SYS_SYS); + + $userTimeZone = $arraySystemConfiguration['time_zone']; + } + + $_SESSION['USR_TIME_ZONE'] = $userTimeZone; + } + + //Set data $aUser = $RBAC->userObj->load($_SESSION['USER_LOGGED']); $RBAC->loadUserRolePermission($RBAC->sSystem, $_SESSION['USER_LOGGED']); //$rol = $RBAC->rolesObj->load($RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_UID']); diff --git a/workflow/engine/methods/processes/processesList.php b/workflow/engine/methods/processes/processesList.php index 354209ce9..141c64a1f 100755 --- a/workflow/engine/methods/processes/processesList.php +++ b/workflow/engine/methods/processes/processesList.php @@ -30,7 +30,7 @@ $dir = isset( $_POST['dir'] ) ? $_POST['dir'] : 'ASC'; $sort = isset( $_POST['sort'] ) ? $_POST['sort'] : ''; $oProcess = new Process(); -$oProcess->dir = $dir; +$oProcess->dir = $dir; $oProcess->sort = $sort; //$memcache = & PMmemcached::getSingleton( SYS_SYS ); @@ -55,8 +55,8 @@ if (isset( $_POST['category'] ) && $_POST['category'] !== '') { $proData = array_splice($proData, $start, $limit); $memcacheUsed = 'no'; } else { - $proData = $oProcess->orderMemcache($proData, $start, $limit); - $totalCount = $proData->totalCount; + $proData = $oProcess->orderMemcache($proData, $start, $limit); + $totalCount = $proData->totalCount; $proData = $proData->dataMemcache; } } else { @@ -65,7 +65,7 @@ if (isset( $_POST['category'] ) && $_POST['category'] !== '') { $memcacheUsed = 'yes'; if (($proData = $memcache->get( $memkey )) === false || ($totalCount = $memcache->get( $memkeyTotal )) === false) { $proData = $oProcess->getAllProcesses( $start, $limit, null, null, true, false, $_SESSION["USER_LOGGED"]); - $totalCount = count($proData); + $totalCount = count($proData); $proData = array_splice($proData, $start, $limit); $memcache->set( $memkey, $proData, PMmemcached::ONE_HOUR ); $memcache->set( $memkeyTotal, $totalCount, PMmemcached::ONE_HOUR ); @@ -80,7 +80,7 @@ if (isset( $_POST['category'] ) && $_POST['category'] !== '') { $r = new stdclass(); $r->memkey = $memkey; $r->memcache = $memcacheUsed; -$r->data = $proData; +$r->data = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($proData); $r->totalCount = $totalCount; echo G::json_encode( $r ); diff --git a/workflow/engine/methods/users/usersAjax.php b/workflow/engine/methods/users/usersAjax.php index 50f780946..7daac69fb 100755 --- a/workflow/engine/methods/users/usersAjax.php +++ b/workflow/engine/methods/users/usersAjax.php @@ -1,12 +1,12 @@ xssFilterHard($_POST); -if(isset($_SESSION['USER_LOGGED'])) { - $_SESSION['USER_LOGGED'] = $filter->xssFilterHard($_SESSION['USER_LOGGED']); -} -if(isset($_SESSION['USR_USERNAME'])) { - $_SESSION['USR_USERNAME'] = $filter->xssFilterHard($_SESSION['USR_USERNAME']); +G::LoadSystem('inputfilter'); +$filter = new InputFilter(); +$_POST = $filter->xssFilterHard($_POST); +if(isset($_SESSION['USER_LOGGED'])) { + $_SESSION['USER_LOGGED'] = $filter->xssFilterHard($_SESSION['USER_LOGGED']); +} +if(isset($_SESSION['USR_USERNAME'])) { + $_SESSION['USR_USERNAME'] = $filter->xssFilterHard($_SESSION['USR_USERNAME']); } global $RBAC; @@ -18,7 +18,7 @@ switch ($_POST['action']) { $c = new Criteria(); $c->add(IsoCountryPeer::IC_UID, null, Criteria::ISNOTNULL); $c->addAscendingOrderByColumn(IsoCountryPeer::IC_NAME); - + $countries = IsoCountryPeer::doSelect($c); foreach ($countries as $rowid => $row) { $oData[] = Array('IC_UID' => $row->getICUid(), 'IC_NAME' => $row->getICName()); @@ -92,7 +92,7 @@ switch ($_POST['action']) { $aUserInfo[] = array('USR_UID' => $aRow1['USR_UID'], 'USER_FULLNAME' => $infoUser); } print (G::json_encode($aUserInfo)); - + break; case 'availableCalendars': G::LoadClass('calendar'); @@ -163,14 +163,15 @@ switch ($_POST['action']) { $status = $form['USR_STATUS'] ? " - Status: ". $form['USR_STATUS'] : ""; } $address = $form['USR_ADDRESS'] ? " - Address: ". $form['USR_ADDRESS'] : ""; - $phone = $form['USR_PHONE'] ? " - Phone: ". $form['USR_PHONE'] : ""; - $zipCode = $form['USR_ZIP_CODE'] ? " - Zip Code: ". $form['USR_ZIP_CODE'] : ""; - $position = $form['USR_POSITION'] ? " - Position: ". $form['USR_POSITION'] : ""; + $phone = $form['USR_PHONE'] ? " - Phone: ". $form['USR_PHONE'] : ""; + $zipCode = $form['USR_ZIP_CODE'] ? " - Zip Code: ". $form['USR_ZIP_CODE'] : ""; + $position = $form['USR_POSITION'] ? " - Position: ". $form['USR_POSITION'] : ""; $role = $form['USR_ROLE'] ? " - Role: ". $form['USR_ROLE'] : ""; /*----------------------------------********---------------------------------*/ $costByHour = $form['USR_COST_BY_HOUR'] ? $form['USR_COST_BY_HOUR'] : ""; $unit = $form['USR_UNIT_COST'] ? $form['USR_UNIT_COST'] : ""; /*----------------------------------********---------------------------------*/ + $timeZone = (isset($form['USR_TIME_ZONE']))? ' - Time Zone: ' . $form['USR_TIME_ZONE'] : ''; if ($form['USR_UID'] == '') { $criteria = new Criteria(); @@ -215,12 +216,13 @@ switch ($_POST['action']) { $aData['USR_UNIT_COST'] = $form['USR_UNIT_COST']; /*----------------------------------********---------------------------------*/ $aData['USR_REPLACED_BY'] = $form['USR_REPLACED_BY']; + $aData['USR_TIME_ZONE'] = $form['USR_TIME_ZONE']; require_once 'classes/model/Users.php'; $oUser = new Users(); $oUser->create($aData); - G::auditLog("CreateUser", "User Name: ". $aData['USR_USERNAME']." - User ID: (".$aData['USR_UID'].") ".$firstName.$lastName.$email.$dueDate.$status.$address.$phone.$zipCode.$position.$role ); - + G::auditLog('CreateUser', 'User Name: ' . $aData['USR_USERNAME'] . ' - User ID: (' . $aData['USR_UID'] . ') ' . $firstName . $lastName . $email . $dueDate . $status . $address . $phone . $zipCode . $position . $role . $timeZone); + if ($_FILES['USR_PHOTO']['error'] != 1) { //print (PATH_IMAGES_ENVIRONMENT_USERS); if ($_FILES['USR_PHOTO']['tmp_name'] != '') { @@ -400,10 +402,14 @@ switch ($_POST['action']) { $aData['USR_AUTH_USER_DN'] = $form['USR_AUTH_USER_DN']; } + if (isset($form['USR_TIME_ZONE'])) { + $aData['USR_TIME_ZONE'] = $form['USR_TIME_ZONE']; + } + require_once 'classes/model/Users.php'; $oUser = new Users(); $oUser->update($aData); - G::auditLog("UpdateUser", "User Name: ". $aData['USR_USERNAME']." - User ID: (".$aData['USR_UID'].") ".$firstName.$lastName.$email.$dueDate.$status.$address.$phone.$zipCode.$position.$role ); + G::auditLog('UpdateUser', 'User Name: ' . $aData['USR_USERNAME'] . ' - User ID: (' . $aData['USR_UID'] . ') ' . $firstName . $lastName . $email . $dueDate . $status . $address . $phone . $zipCode . $position . $role . $timeZone); if ($_FILES['USR_PHOTO']['error'] != 1) { if ($_FILES['USR_PHOTO']['tmp_name'] != '') { $aAux = explode('.', $_FILES['USR_PHOTO']['name']); @@ -572,12 +578,12 @@ switch ($_POST['action']) { $aFields['USER_LOGGED_ROLE'] = $aUserLog['USR_ROLE']; $aFields['CASES_MENUSELECTED_NAME'] = $casesMenuSelected; - + require_once 'classes/model/UsersProperties.php'; $oUserProperty = new UsersProperties(); $aUserProperty = $oUserProperty->loadOrCreateIfNotExists($aFields['USR_UID'], array('USR_PASSWORD_HISTORY' => serialize(array($aFields['USR_PASSWORD'])))); $aFields['USR_LOGGED_NEXT_TIME'] = $aUserProperty['USR_LOGGED_NEXT_TIME']; - + $result->success = true; $result->user = $aFields; @@ -602,8 +608,8 @@ switch ($_POST['action']) { case 'PM_DASHBOARD': $rows[] = Array('id' => 'PM_DASHBOARD', 'name' => strtoupper(G::LoadTranslation('ID_DASHBOARD')) ); - /*----------------------------------********---------------------------------*/ - // NEW DASHBOARD MODULE + /*----------------------------------********---------------------------------*/ + // NEW DASHBOARD MODULE $licensedFeatures = & PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjBsZEJ6dnpJa3dTeWVLVT0=')) { $rows[] = Array('id' => 'PM_STRATEGIC_DASHBOARD', 'name' => strtoupper(G::LoadTranslation('ID_STRATEGIC_DASHBOARD')) diff --git a/workflow/engine/methods/users/usersEdit.php b/workflow/engine/methods/users/usersEdit.php index bbfd6b575..b928a824b 100644 --- a/workflow/engine/methods/users/usersEdit.php +++ b/workflow/engine/methods/users/usersEdit.php @@ -1 +1,29 @@ -addExtJsScript( 'users/users', true ); //adding a javascript file .js $oHeadPublisher->assign( 'USR_UID', $_GET['USR_UID'] ); $oHeadPublisher->assign( 'MODE', $_GET['MODE'] ); $oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); G::RenderPage( 'publish', 'extJs' ); \ No newline at end of file +addExtJsScript( 'users/users', true ); //adding a javascript file .js +$oHeadPublisher->assign( 'USR_UID', $_GET['USR_UID'] ); +$oHeadPublisher->assign( 'MODE', $_GET['MODE'] ); +$oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); +$oHeadPublisher->assign('SYSTEM_TIME_ZONE', $arraySystemConfiguration['time_zone']); +$oHeadPublisher->assign('TIME_ZONE_DATA', array_map(function ($value) { return [$value, $value]; }, DateTimeZone::listIdentifiers())); +$oHeadPublisher->assign('__SYSTEM_UTC_TIME_ZONE__', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 1 : 0); + +G::RenderPage( 'publish', 'extJs' ); + diff --git a/workflow/engine/methods/users/usersInit.php b/workflow/engine/methods/users/usersInit.php index 54aec877d..fe4e70d4a 100644 --- a/workflow/engine/methods/users/usersInit.php +++ b/workflow/engine/methods/users/usersInit.php @@ -23,8 +23,11 @@ $mul = substr( $UPLOAD_MAX_SIZE, - 1 ); $mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1))); $uploadMaxSize = (int) $UPLOAD_MAX_SIZE * $mul; -if ($postMaxSize < $uploadMaxSize) +if ($postMaxSize < $uploadMaxSize) { $uploadMaxSize = $postMaxSize; +} + +$arraySystemConfiguration = System::getSystemConfiguration('', '', SYS_SYS); $oHeadPublisher = & headPublisher::getSingleton(); $oHeadPublisher->addExtJsScript( 'users/users', true ); //adding a javascript file .js @@ -35,5 +38,8 @@ $oHeadPublisher->assign( 'EDITPROFILE', 1); $oHeadPublisher->assign( 'canEdit', $canEdit ); $oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); $oHeadPublisher->assign( 'MODE', '' ); -G::RenderPage( 'publish', 'extJs' ); +$oHeadPublisher->assign('SYSTEM_TIME_ZONE', $arraySystemConfiguration['time_zone']); +$oHeadPublisher->assign('TIME_ZONE_DATA', array_map(function ($value) { return [$value, $value]; }, DateTimeZone::listIdentifiers())); +$oHeadPublisher->assign('__SYSTEM_UTC_TIME_ZONE__', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 1 : 0); +G::RenderPage( 'publish', 'extJs' ); diff --git a/workflow/engine/methods/users/usersNew.php b/workflow/engine/methods/users/usersNew.php index dff07aee6..d5eb39147 100644 --- a/workflow/engine/methods/users/usersNew.php +++ b/workflow/engine/methods/users/usersNew.php @@ -1,25 +1,32 @@ -requirePermissions( 'PM_USERS' ); - + //calculating the max upload file size; -$POST_MAX_SIZE = ini_get( 'post_max_size' ); -$mul = substr( $POST_MAX_SIZE, - 1 ); -$mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1))); -$postMaxSize = (int) $POST_MAX_SIZE * $mul; - -$UPLOAD_MAX_SIZE = ini_get( 'upload_max_filesize' ); -$mul = substr( $UPLOAD_MAX_SIZE, - 1 ); -$mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1))); -$uploadMaxSize = (int) $UPLOAD_MAX_SIZE * $mul; - -if ($postMaxSize < $uploadMaxSize) - $uploadMaxSize = $postMaxSize; - -$oHeadPublisher = & headPublisher::getSingleton(); +$POST_MAX_SIZE = ini_get( 'post_max_size' ); +$mul = substr( $POST_MAX_SIZE, - 1 ); +$mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1))); +$postMaxSize = (int) $POST_MAX_SIZE * $mul; + +$UPLOAD_MAX_SIZE = ini_get( 'upload_max_filesize' ); +$mul = substr( $UPLOAD_MAX_SIZE, - 1 ); +$mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1))); +$uploadMaxSize = (int) $UPLOAD_MAX_SIZE * $mul; + +if ($postMaxSize < $uploadMaxSize) { + $uploadMaxSize = $postMaxSize; +} + +$arraySystemConfiguration = System::getSystemConfiguration('', '', SYS_SYS); + +$oHeadPublisher = & headPublisher::getSingleton(); $oHeadPublisher->addExtJsScript( 'users/users', true ); //adding a javascript file .js -$oHeadPublisher->assign( 'USR_UID', '' ); -$oHeadPublisher->assign( 'MODE', $_GET['MODE'] ); -$oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); +$oHeadPublisher->assign( 'USR_UID', '' ); +$oHeadPublisher->assign( 'MODE', $_GET['MODE'] ); +$oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); +$oHeadPublisher->assign('SYSTEM_TIME_ZONE', $arraySystemConfiguration['time_zone']); +$oHeadPublisher->assign('TIME_ZONE_DATA', array_map(function ($value) { return [$value, $value]; }, DateTimeZone::listIdentifiers())); +$oHeadPublisher->assign('__SYSTEM_UTC_TIME_ZONE__', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 1 : 0); + G::RenderPage( 'publish', 'extJs' ); diff --git a/workflow/engine/skinEngine/skinEngine.php b/workflow/engine/skinEngine/skinEngine.php index 17e05ad08..91d402859 100755 --- a/workflow/engine/skinEngine/skinEngine.php +++ b/workflow/engine/skinEngine/skinEngine.php @@ -385,7 +385,7 @@ class SkinEngine $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) $freeOfChargeText = "Supplied free of charge with no support, certification, warranty,
maintenance nor indemnity by Processmaker and its Certified Partners."; - if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; + if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { @@ -706,7 +706,7 @@ class SkinEngine $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) $freeOfChargeText = "Supplied free of charge with no support, certification, warranty, maintenance nor indemnity by ProcessMaker and its Certified Partners."; - if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; + if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { @@ -759,11 +759,11 @@ class SkinEngine $conf = new Configurations(); $conf->getFormats(); if ( defined('SYS_SYS')) { - $smarty->assign('udate', $conf->getSystemDate(date('Y-m-d H:i:s'))); + $smarty->assign('udate', $conf->getSystemDate(\ProcessMaker\Util\DateTime::convertUtcToTimeZone(date('Y-m-d H:i:s')))); } else { - $smarty->assign('udate', G::getformatedDate(date('Y-m-d H:i:s'), 'M d, yyyy', SYS_LANG)); + $smarty->assign('udate', G::getformatedDate(\ProcessMaker\Util\DateTime::convertUtcToTimeZone(date('Y-m-d H:i:s')), 'M d, yyyy', SYS_LANG)); } - $name = $conf->userNameFormat(isset($_SESSION['USR_USERNAME']) ? $_SESSION['USR_USERNAME']: '', isset($_SESSION['USR_FULLNAME']) ? htmlentities($_SESSION['USR_FULLNAME'] , ENT_QUOTES, 'UTF-8'): '', isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''); + $name = $conf->userNameFormat(isset($_SESSION['USR_USERNAME']) ? $_SESSION['USR_USERNAME']: '', isset($_SESSION['USR_FULLNAME']) ? htmlentities($_SESSION['USR_FULLNAME'] , ENT_QUOTES, 'UTF-8'): '', isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''); $smarty->assign('user',$name); } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php index 8cee2a521..5352373b9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php @@ -169,32 +169,32 @@ class Process public function throwExceptionIfDataNotMetFieldDefinition($arrayData, $arrayFieldDefinition, $arrayFieldNameForException, $flagValidateRequired = true) { try { - - \G::LoadSystem('inputfilter'); - $filter = new \InputFilter(); - if ($flagValidateRequired) { foreach ($arrayFieldDefinition as $key => $value) { $fieldName = $key; - $fieldNameAux = (isset($arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]]))? $arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]] : ""; + $fieldNameAux = (isset($arrayFieldNameForException[$arrayFieldDefinition[$fieldName]['fieldNameAux']]))? $arrayFieldNameForException[$arrayFieldDefinition[$fieldName]['fieldNameAux']] : $fieldName; if ($arrayFieldDefinition[$fieldName]["required"] && !isset($arrayData[$fieldName])) { - throw new \Exception(\G::LoadTranslation("ID_UNDEFINED_VALUE_IS_REQUIRED", array($fieldNameAux))); + throw new \Exception(\G::LoadTranslation('ID_UNDEFINED_VALUE_IS_REQUIRED', [$fieldNameAux])); } } } - $arrayType1 = array("int", "integer", "float", "real", "double", "bool", "boolean", "string", "date", "hour", "datetime"); - $arrayType2 = array("array", "object"); + $arrayType1 = [ + 'int', 'integer', 'float', 'real', 'double', + 'bool', 'boolean', + 'string', + 'date', 'hour', 'datetime' + ]; + $arrayType2 = ['array', 'object']; foreach ($arrayData as $key => $value) { $fieldName = $key; $fieldValue = $value; - if (isset($arrayFieldDefinition[$fieldName])) { - $fieldNameAux = (isset($arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]]))? $arrayFieldNameForException[$arrayFieldDefinition[$fieldName]["fieldNameAux"]] : ""; + $fieldNameAux = (isset($arrayFieldNameForException[$arrayFieldDefinition[$fieldName]['fieldNameAux']]))? $arrayFieldNameForException[$arrayFieldDefinition[$fieldName]['fieldNameAux']] : $fieldName; $arrayFieldDefinition[$fieldName]["type"] = strtolower($arrayFieldDefinition[$fieldName]["type"]); @@ -205,38 +205,43 @@ class Process switch ($optionType) { case 1: //empty - if (!$arrayFieldDefinition[$fieldName]["empty"] && trim($fieldValue) . "" == "") { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($fieldNameAux))); + if (!$arrayFieldDefinition[$fieldName]['empty'] && trim($fieldValue) == '') { + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY', [$fieldNameAux])); } //defaultValues - if (count($arrayFieldDefinition[$fieldName]["defaultValues"]) > 0 && !in_array($fieldValue, $arrayFieldDefinition[$fieldName]["defaultValues"], true)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES", array($fieldNameAux, implode("|", $arrayFieldDefinition[$fieldName]["defaultValues"])))); + if (isset($arrayFieldDefinition[$fieldName]['defaultValues']) && + !empty($arrayFieldDefinition[$fieldName]['defaultValues']) && + !in_array($fieldValue, $arrayFieldDefinition[$fieldName]['defaultValues'], true) + ) { + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES', [$fieldNameAux, implode('|', $arrayFieldDefinition[$fieldName]['defaultValues'])])); } //type - $fieldValue = (!is_array($fieldValue)) ? $fieldValue : ''; + $fieldValue = (!is_array($fieldValue))? $fieldValue : ''; + if ($arrayFieldDefinition[$fieldName]["empty"] && $fieldValue . "" == "") { // } else { - $regexpDate = "[1-9]\d{3}\-(?:0[1-9]|1[012])\-(?:[0][1-9]|[12][0-9]|3[01])"; - $regexpHour = "(?:[0-1]\d|2[0-3])\:(?:[0-5]\d)(?:\:[0-5]\d)?"; - $regexpDatetime = $regexpDate . "\s" . $regexpHour; + $regexpDate = \ProcessMaker\Util\DateTime::REGEXPDATE; + $regexpTime = \ProcessMaker\Util\DateTime::REGEXPTIME; + + $regexpDatetime = $regexpDate . '\s' . $regexpTime; switch ($arrayFieldDefinition[$fieldName]["type"]) { case "date": if (!preg_match("/^" . $regexpDate . "$/", $fieldValue)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE", array($fieldNameAux))); + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE', [$fieldNameAux])); } break; case "hour": - if (!preg_match("/^" . $regexpHour . "$/", $fieldValue)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE", array($fieldNameAux))); + if (!preg_match('/^' . $regexpTime . '$/', $fieldValue)) { + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE', [$fieldNameAux])); } break; case "datetime": if (!preg_match("/^" . $regexpDatetime . "$/", $fieldValue)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE", array($fieldNameAux))); + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE', [$fieldNameAux])); } break; } @@ -251,7 +256,7 @@ class Process //type if (!is_array($fieldValue)) { if ($fieldValue != "" && !preg_match("/^" . $regexpArray1 . ".*" . $regexpArray2 . "$/", $fieldValue)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_THIS_MUST_BE_ARRAY", array($fieldNameAux))); + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_THIS_MUST_BE_ARRAY', [$fieldNameAux])); } } @@ -263,37 +268,38 @@ class Process $arrayAux = $fieldValue; } - if (is_string($fieldValue) && trim($fieldValue) . "" != "") { + if (is_string($fieldValue) && trim($fieldValue) != '') { //eval("\$arrayAux = $fieldValue;"); if (preg_match("/^" . $regexpArray1 . "(.*)" . $regexpArray2 . "$/", $fieldValue, $arrayMatch)) { if (trim($arrayMatch[1], " ,") != "") { - $arrayAux = array(0); + $arrayAux = [0]; } } } - if (count($arrayAux) == 0) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($fieldNameAux))); + if (empty($arrayAux)) { + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY', [$fieldNameAux])); } } //defaultValues - if (count($arrayFieldDefinition[$fieldName]["defaultValues"]) > 0) { - $arrayAux = array(); + if (isset($arrayFieldDefinition[$fieldName]['defaultValues']) && + !empty($arrayFieldDefinition[$fieldName]['defaultValues']) + ) { + $arrayAux = []; if (is_array($fieldValue)) { $arrayAux = $fieldValue; } - if (is_string($fieldValue) && trim($fieldValue) . "" != "") { - $fieldValue = $filter->validateInput($fieldValue); + if (is_string($fieldValue) && trim($fieldValue) != '') { eval("\$arrayAux = $fieldValue;"); } foreach ($arrayAux as $value) { if (!in_array($value, $arrayFieldDefinition[$fieldName]["defaultValues"], true)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES", array($fieldNameAux, implode("|", $arrayFieldDefinition[$fieldName]["defaultValues"])))); + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES', [$fieldNameAux, implode('|', $arrayFieldDefinition[$fieldName]['defaultValues'])])); } } } @@ -320,10 +326,10 @@ class Process { try { foreach ($arrayData as $key => $value) { - $nameForException = (isset($arrayFieldNameForException[$key]))? $arrayFieldNameForException[$key] : ""; + $nameForException = (isset($arrayFieldNameForException[$key]))? $arrayFieldNameForException[$key] : $key; if (!is_null($value) && ($value . "" == "" || !preg_match("/^(?:\+|\-)?(?:0|[1-9]\d*)$/", $value . "") || (int)($value) < 0)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_EXPECTING_POSITIVE_INTEGER", array($nameForException))); + throw new \Exception(\G::LoadTranslation('ID_INVALID_VALUE_EXPECTING_POSITIVE_INTEGER', [$nameForException])); } } } catch (\Exception $e) { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index aaa954ed4..e56af4c71 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -32,7 +32,8 @@ class User "USR_COST_BY_HOUR" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrCostByHour"), "USR_UNIT_COST" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "usrUnitCost"), /*----------------------------------********---------------------------------*/ - "USR_LOGGED_NEXT_TIME" => array("type" => "int", "required" => false, "empty" => false, "defaultValues" => array(0, 1), "fieldNameAux" => "usrLoggedNextTime") + 'USR_LOGGED_NEXT_TIME' => ['type' => 'int', 'required' => false, 'empty' => false, 'defaultValues' => [0, 1], 'fieldNameAux' => 'usrLoggedNextTime'], + 'USR_TIME_ZONE' => ['type' => 'string', 'required' => false, 'empty' => true, 'defaultValues' => [], 'fieldNameAux' => 'usrTimeZone'] ); private $formatFieldNameInUppercase = true; @@ -295,6 +296,12 @@ class User throw new \Exception(\G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array($this->arrayFieldNameForException["depUid"], $arrayData["DEP_UID"]))); } } + + if (isset($arrayData['USR_TIME_ZONE']) && $arrayData['USR_TIME_ZONE'] != '') { + if (!in_array($arrayData['USR_TIME_ZONE'], \DateTimeZone::listIdentifiers())) { + throw new \Exception(\G::LoadTranslation('ID_TIME_ZONE_DOES_NOT_EXIST', [$this->arrayFieldNameForException['usrTimeZone'], $arrayData['USR_TIME_ZONE']])); + } + } } catch (\Exception $e) { throw $e; } @@ -343,48 +350,62 @@ class User $pathPhotoUser = PATH_HOME . "public_html" . PATH_SEP . "images" . PATH_SEP . "user.gif"; } - return array( - $this->getFieldNameByFormatFieldName("USR_UID") => $record["USR_UID"], - $this->getFieldNameByFormatFieldName("USR_USERNAME") => $record["USR_USERNAME"], - //$this->getFieldNameByFormatFieldName("USR_PASSWORD") => $record["USR_PASSWORD"], - $this->getFieldNameByFormatFieldName("USR_FIRSTNAME") => $record["USR_FIRSTNAME"], - $this->getFieldNameByFormatFieldName("USR_LASTNAME") => $record["USR_LASTNAME"], - $this->getFieldNameByFormatFieldName("USR_EMAIL") => $record["USR_EMAIL"], - $this->getFieldNameByFormatFieldName("USR_DUE_DATE") => $record["USR_DUE_DATE"], - $this->getFieldNameByFormatFieldName("USR_CREATE_DATE") => $record["USR_CREATE_DATE"], - $this->getFieldNameByFormatFieldName("USR_UPDATE_DATE") => $record["USR_UPDATE_DATE"], - $this->getFieldNameByFormatFieldName("USR_STATUS") => $record["USR_STATUS"], - $this->getFieldNameByFormatFieldName("USR_COUNTRY") => $record["USR_COUNTRY"], - $this->getFieldNameByFormatFieldName("USR_CITY") => $record["USR_CITY"], - $this->getFieldNameByFormatFieldName("USR_LOCATION") => $record["USR_LOCATION"], - $this->getFieldNameByFormatFieldName("USR_ADDRESS") => $record["USR_ADDRESS"], - $this->getFieldNameByFormatFieldName("USR_PHONE") => $record["USR_PHONE"], - $this->getFieldNameByFormatFieldName("USR_FAX") => $record["USR_FAX"], - $this->getFieldNameByFormatFieldName("USR_CELLULAR") => $record["USR_CELLULAR"], - $this->getFieldNameByFormatFieldName("USR_ZIP_CODE") => $record["USR_ZIP_CODE"], - $this->getFieldNameByFormatFieldName("DEP_UID") => $record["DEP_UID"], - $this->getFieldNameByFormatFieldName("USR_POSITION") => $record["USR_POSITION"], - $this->getFieldNameByFormatFieldName("USR_RESUME") => $record["USR_RESUME"], - $this->getFieldNameByFormatFieldName("USR_BIRTHDAY") => $record["USR_BIRTHDAY"], - $this->getFieldNameByFormatFieldName("USR_ROLE") => $record["USR_ROLE"], - $this->getFieldNameByFormatFieldName("USR_REPORTS_TO") => $record["USR_REPORTS_TO"], - $this->getFieldNameByFormatFieldName("USR_REPLACED_BY") => $record["USR_REPLACED_BY"], - $this->getFieldNameByFormatFieldName("USR_CALENDAR_UID") => $aFields["USR_CALENDAR_UID"], - $this->getFieldNameByFormatFieldName("USR_CALENDAR_NAME") => $aFields["USR_CALENDAR"], - $this->getFieldNameByFormatFieldName("USR_UX") => $record["USR_UX"], - /*----------------------------------********---------------------------------*/ - $this->getFieldNameByFormatFieldName("USR_COST_BY_HOUR") => $record["USR_COST_BY_HOUR"], - $this->getFieldNameByFormatFieldName("USR_UNIT_COST") => $record["USR_UNIT_COST"], - /*----------------------------------********---------------------------------*/ - $this->getFieldNameByFormatFieldName("USR_TOTAL_INBOX") => $record["USR_TOTAL_INBOX"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_DRAFT") => $record["USR_TOTAL_DRAFT"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_CANCELLED") => $record["USR_TOTAL_CANCELLED"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_PARTICIPATED") => $record["USR_TOTAL_PARTICIPATED"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_PAUSED") => $record["USR_TOTAL_PAUSED"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_COMPLETED") => $record["USR_TOTAL_COMPLETED"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_UNASSIGNED") => $record["USR_TOTAL_UNASSIGNED"], - $this->getFieldNameByFormatFieldName("USR_PHOTO_PATH") => $pathPhotoUser - ); + $arrayResult = []; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_UID')] = $record['USR_UID']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_USERNAME')] = $record['USR_USERNAME']; + //$arrayResult[$this->getFieldNameByFormatFieldName('USR_PASSWORD')] = $record['USR_PASSWORD']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_FIRSTNAME')] = $record['USR_FIRSTNAME']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_LASTNAME')] = $record['USR_LASTNAME']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_EMAIL')] = $record['USR_EMAIL']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_DUE_DATE')] = $record['USR_DUE_DATE']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_CREATE_DATE')] = $record['USR_CREATE_DATE']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_UPDATE_DATE')] = $record['USR_UPDATE_DATE']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_STATUS')] = $record['USR_STATUS']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_COUNTRY')] = $record['USR_COUNTRY']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_CITY')] = $record['USR_CITY']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_LOCATION')] = $record['USR_LOCATION']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_ADDRESS')] = $record['USR_ADDRESS']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_PHONE')] = $record['USR_PHONE']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_FAX')] = $record['USR_FAX']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_CELLULAR')] = $record['USR_CELLULAR']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_ZIP_CODE')] = $record['USR_ZIP_CODE']; + $arrayResult[$this->getFieldNameByFormatFieldName('DEP_UID')] = $record['DEP_UID']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_POSITION')] = $record['USR_POSITION']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_RESUME')] = $record['USR_RESUME']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_BIRTHDAY')] = $record['USR_BIRTHDAY']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_ROLE')] = $record['USR_ROLE']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_REPORTS_TO')] = $record['USR_REPORTS_TO']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_REPLACED_BY')] = $record['USR_REPLACED_BY']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_CALENDAR_UID')] = $aFields['USR_CALENDAR_UID']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_CALENDAR_NAME')] = $aFields['USR_CALENDAR']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_UX')] = $record['USR_UX']; + /*----------------------------------********---------------------------------*/ + $arrayResult[$this->getFieldNameByFormatFieldName('USR_COST_BY_HOUR')] = $record['USR_COST_BY_HOUR']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_UNIT_COST')] = $record['USR_UNIT_COST']; + /*----------------------------------********---------------------------------*/ + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_INBOX')] = $record['USR_TOTAL_INBOX']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_DRAFT')] = $record['USR_TOTAL_DRAFT']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_CANCELLED')] = $record['USR_TOTAL_CANCELLED']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_PARTICIPATED')] = $record['USR_TOTAL_PARTICIPATED']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_PAUSED')] = $record['USR_TOTAL_PAUSED']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_COMPLETED')] = $record['USR_TOTAL_COMPLETED']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TOTAL_UNASSIGNED')] = $record['USR_TOTAL_UNASSIGNED']; + $arrayResult[$this->getFieldNameByFormatFieldName('USR_PHOTO_PATH')] = $pathPhotoUser; + + if (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__']) { + $userTimeZone = $record['USR_TIME_ZONE']; + + if (trim($userTimeZone) == '') { + $arraySystemConfiguration = \System::getSystemConfiguration('', '', SYS_SYS); + + $userTimeZone = $arraySystemConfiguration['time_zone']; + } + + $arrayResult[$this->getFieldNameByFormatFieldName('USR_TIME_ZONE')] = $userTimeZone; + } + + //Return + return $arrayResult; } catch (\Exception $e) { throw $e; } @@ -437,7 +458,9 @@ class User $criteria->addSelectColumn(\UsersPeer::USR_TOTAL_PAUSED); $criteria->addSelectColumn(\UsersPeer::USR_TOTAL_COMPLETED); $criteria->addSelectColumn(\UsersPeer::USR_TOTAL_UNASSIGNED); + $criteria->addSelectColumn(\UsersPeer::USR_TIME_ZONE); + //Return return $criteria; } catch (\Exception $e) { throw $e; @@ -1250,5 +1273,28 @@ class User throw $e; } } + + /** + * Get User-Logged Time Zone + * + * @return string Return the User-Logged Time Zone; Time Zone system settings otherwise + */ + public static function getUserLoggedTimeZone() + { + try { + $timeZone = 'UTC'; + + if (isset($_SESSION['USR_TIME_ZONE'])) { + $tz = trim($_SESSION['USR_TIME_ZONE']); + + $timeZone = ($tz != '')? $tz : $timeZone; + } + + //Return + return $timeZone; + } catch (\Exception $e) { + throw $e; + } + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php b/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php index 74269b502..bb622755c 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php @@ -328,5 +328,51 @@ class Validator throw $e; } } + + /** + * Validate data by ISO 8601 format + * + * @param mixed $data Data + * @param mixed $field Fields + * + * @return void Throw exception if data has an invalid value + */ + public static function throwExceptionIfDataNotMetIso8601Format($data, $field = null) + { + try { + if (!(isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])) { + return; + } + + $regexpDate = \ProcessMaker\Util\DateTime::REGEXPDATE; + $regexpTime = \ProcessMaker\Util\DateTime::REGEXPTIME; + + $regexpIso8601 = $regexpDate . 'T' . $regexpTime . '[\+\-]\d{2}:\d{2}'; + + switch (gettype($data)) { + case 'string': + if (trim($data) != '' && !preg_match('/^' . $regexpIso8601 . '$/', $data)) { + throw new \Exception(\G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [(!is_null($field) && is_string($field))? $field : $data])); + } + break; + case 'array': + if (!is_null($field) && is_array($field)) { + foreach ($field as $value) { + $fieldName = $value; + + $fieldName = (isset($data[strtoupper($fieldName)]))? strtoupper($fieldName) : $fieldName; + $fieldName = (isset($data[strtolower($fieldName)]))? strtolower($fieldName) : $fieldName; + + if (isset($data[$fieldName]) && trim($data[$fieldName]) != '' && !preg_match('/^' . $regexpIso8601 . '$/', $data[$fieldName])) { + throw new \Exception(\G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [$fieldName])); + } + } + } + break; + } + } catch (\Exception $e) { + throw $e; + } + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Lists.php b/workflow/engine/src/ProcessMaker/Services/Api/Lists.php index 44f42508b..61125f4a7 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Lists.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Lists.php @@ -15,6 +15,16 @@ use \Luracast\Restler\RestException; */ class Lists extends Api { + private $arrayFieldIso8601 = [ + 'app_paused_date', + 'app_restart_date', + 'del_delegate_date', + 'del_init_date', + 'del_due_date', + 'del_task_due_date', + 'app_update_date' + ]; + /** * Get list Inbox * @@ -74,7 +84,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('inbox', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -179,7 +190,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('participated_last', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -283,7 +295,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('participated_history', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -389,7 +402,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('paused', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -494,7 +508,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('canceled', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -598,7 +613,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('completed', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -702,7 +718,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('completed', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -806,7 +823,8 @@ class Lists extends Api $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getList('unassigned', $dataList); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/TimerEvent.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/TimerEvent.php index ec9ab3518..b439b6c90 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/TimerEvent.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/TimerEvent.php @@ -13,6 +13,12 @@ class TimerEvent extends Api { private $timerEvent; + private $arrayFieldIso8601 = [ + 'tmrevn_next_run_date', + 'tmrevn_last_run_date', + 'tmrevn_last_execution_date' + ]; + /** * Constructor of the class * @@ -39,7 +45,7 @@ class TimerEvent extends Api try { $response = $this->timerEvent->getTimerEvents($prj_uid); - return $response; + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -56,7 +62,7 @@ class TimerEvent extends Api try { $response = $this->timerEvent->getTimerEvent($tmrevn_uid); - return $response; + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -73,7 +79,7 @@ class TimerEvent extends Api try { $response = $this->timerEvent->getTimerEventByEvent($prj_uid, $evn_uid); - return $response; + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -90,11 +96,13 @@ class TimerEvent extends Api public function doPostTimerEvent($prj_uid, array $request_data) { try { - $arrayData = $this->timerEvent->create($prj_uid, $request_data); + \ProcessMaker\BusinessModel\Validator::throwExceptionIfDataNotMetIso8601Format($request_data, $this->arrayFieldIso8601); + + $arrayData = $this->timerEvent->create($prj_uid, \ProcessMaker\Util\DateTime::convertDataToUtc($request_data, $this->arrayFieldIso8601)); $response = $arrayData; - return $response; + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/User.php b/workflow/engine/src/ProcessMaker/Services/Api/User.php index cd186dc1a..199184939 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/User.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/User.php @@ -11,6 +11,11 @@ use \Luracast\Restler\RestException; */ class User extends Api { + private $arrayFieldIso8601 = [ + 'usr_create_date', + 'usr_update_date' + ]; + /** * Constructor of the class * @@ -47,7 +52,7 @@ class User extends Api $response = $user->getUsers($arrayFilterData, null, null, $start, $limit); - return $response["data"]; + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response['data'], $this->arrayFieldIso8601); } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -65,7 +70,8 @@ class User extends Api $user->setFormatFieldNameInUppercase(false); $response = $user->getUser($usr_uid); - return $response; + + return \ProcessMaker\Util\DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } diff --git a/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php b/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php index ea918b3e6..b518418b2 100644 --- a/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php +++ b/workflow/engine/src/ProcessMaker/Services/OAuth2/Server.php @@ -357,6 +357,21 @@ class Server implements iAuthenticate setcookie($session->getSessionName(), $_COOKIE[$session->getSessionName()], time() + $lifetime, "/", null, false, true); } + + //Set User Time Zone + $user = \UsersPeer::retrieveByPK(self::$userId); + + if (!is_null($user)) { + $userTimeZone = $user->getUsrTimeZone(); + + if (trim($userTimeZone) == '') { + $arraySystemConfiguration = \System::getSystemConfiguration('', '', SYS_SYS); + + $userTimeZone = $arraySystemConfiguration['time_zone']; + } + + $_SESSION['USR_TIME_ZONE'] = $userTimeZone; + } } return $allowed; diff --git a/workflow/engine/src/ProcessMaker/Util/DateTime.php b/workflow/engine/src/ProcessMaker/Util/DateTime.php new file mode 100644 index 000000000..92ed355d0 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/DateTime.php @@ -0,0 +1,361 @@ +getOffset(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get Time Zone ID by Time Zone Offset + * + * @param int $offset Time Zone Offset + * + * @return string Return the Time Zone ID; UTC ID otherwise + */ + public function getTimeZoneIdByTimeZoneOffset($offset) + { + try { + foreach (\DateTimeZone::listIdentifiers() as $value) { + $timeZoneOffset = self::getTimeZoneOffsetByTimeZoneId($value); + + if ($timeZoneOffset !== false && $timeZoneOffset == $offset) { + //Return + return $value; + } + } + + //Return + return 'UTC'; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get Time Zone ID by UTC Offset + * + * @param string $utcOffset UTC Offset + * + * @return string Return the Time Zone ID; UTC ID otherwise + */ + public function getTimeZoneIdByUtcOffset($utcOffset) + { + try { + if (preg_match('/^([\+\-])(\d{2}):(\d{2})$/', $utcOffset, $arrayMatch)) { + $sign = $arrayMatch[1]; + $h = (int)($arrayMatch[2]); + $m = (int)($arrayMatch[3]); + } else { + //Return + return 'UTC'; + } + + $offset = (($sign == '+')? '' : '-') . (($h * 60 * 60) + ($m * 60)); //Convert UTC Offset to seconds + + //Return + return self::getTimeZoneIdByTimeZoneOffset((int)($offset)); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert date from Time Zone to Time Zone + * + * @param string $date Date + * @param string $fromTimeZone Time Zone source + * @param string $toTimeZone Time Zone to convert + * @param string $format Format to return date + * + * @return string Return date + */ + public function convertTimeZone($date, $fromTimeZone, $toTimeZone, $format = 'Y-m-d H:i:s') + { + try { + $dt = new \DateTime($date, new \DateTimeZone($fromTimeZone)); //From Time Zone + $dt->setTimeZone(new \DateTimeZone($toTimeZone)); //To Time Zone + + //Return + return $dt->format($format); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert ISO-8601 to Time Zone + * + * @param string $dateIso8601 Date + * @param string $toTimeZone Time Zone to convert + * @param string $format Format to return date + * + * @return string Return date + */ + public function convertIso8601ToTimeZone($dateIso8601, $toTimeZone, $format = 'Y-m-d H:i:s') + { + try { + $fromTimeZone = 'UTC'; + + if (preg_match('/^.+([\+\-]\d{2}:\d{2})$/', $dateIso8601, $arrayMatch)) { + $fromTimeZone = self::getTimeZoneIdByUtcOffset($arrayMatch[1]); + } + + $dt = \DateTime::createFromFormat(self::ISO8601, $dateIso8601, new \DateTimeZone($fromTimeZone)); //From ISO-8601 + $dt->setTimeZone(new \DateTimeZone($toTimeZone)); //To Time Zone + + //Return + return $dt->format($format); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert ISO-8601/datetime/array-ISO-8601-datetime-data to Time Zone + * + * @param mixed $data Data + * @param string $fromTimeZone Time Zone source + * @param string $toTimeZone Time Zone to convert + * @param array $arrayKey Keys that convert to Time Zone + * @param string $format Format to return data + * + * @return mixed Return data + */ + public function convertDataToTimeZone($data, $fromTimeZone, $toTimeZone, array $arrayKey = [], $format = 'Y-m-d H:i:s') + { + try { + $regexpDatetime = '/^' . self::REGEXPDATE . '\s' . self::REGEXPTIME . '$/'; + $regexpIso8601 = '/^' . self::REGEXPDATE . 'T' . self::REGEXPTIME . '[\+\-]\d{2}:\d{2}$/'; + + if (empty($data)) { + //Return + return $data; + } + + switch (gettype($data)) { + case 'string': + if (is_string($data) && preg_match($regexpDatetime, $data)) { + if ($fromTimeZone != $toTimeZone) { + $data = self::convertTimeZone($data, $fromTimeZone, $toTimeZone, $format); + } + } + + if (is_string($data) && preg_match($regexpIso8601, $data)) { + $data = self::convertIso8601ToTimeZone($data, $toTimeZone, $format); + } + break; + case 'array': + $regexpKey = (!empty($arrayKey))? '/^(?:' . implode('|', $arrayKey) . ')$/i': ''; + + array_walk_recursive( + $data, + function (&$value, $key, $arrayData) + { + try { + if ($arrayData['regexpKey'] == '' || preg_match($arrayData['regexpKey'], $key)) { + if (is_string($value) && preg_match($arrayData['regexpDatetime'], $value)) { + if ($arrayData['fromTimeZone'] != $arrayData['toTimeZone']) { + $value = self::convertTimeZone($value, $arrayData['fromTimeZone'], $arrayData['toTimeZone'], $arrayData['format']); + } + } + + if (is_string($value) && preg_match($arrayData['regexpIso8601'], $value)) { + $value = self::convertIso8601ToTimeZone($value, $arrayData['toTimeZone'], $arrayData['format']); + } + } + } catch (\Exception $e) { + throw $e; + } + }, + ['fromTimeZone' => $fromTimeZone, 'toTimeZone' => $toTimeZone, 'format' => $format, 'regexpDatetime' => $regexpDatetime, 'regexpIso8601' => $regexpIso8601, 'regexpKey' => $regexpKey] + ); + break; + case 'object': + $data = json_decode(json_encode($data), true); + $data = self::convertDataToTimeZone($data, $fromTimeZone, $toTimeZone, $arrayKey, $format); + $data = json_decode(json_encode($data)); + break; + } + + //Return + return $data; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert datetime/array-datetime-data to ISO-8601 + * + * @param mixed $data Data + * @param string $fromTimeZone Time Zone source + * @param string $toTimeZone Time Zone to convert + * @param array $arrayKey Keys that convert to ISO-8601 + * + * @return mixed Return data + */ + public function convertDataToIso8601($data, $fromTimeZone, $toTimeZone, array $arrayKey = []) + { + try { + $regexpDatetime = '/^' . self::REGEXPDATE . '\s' . self::REGEXPTIME . '$/'; + + if (empty($data)) { + //Return + return $data; + } + + switch (gettype($data)) { + case 'string': + if (is_string($data) && preg_match($regexpDatetime, $data)) { + if ($fromTimeZone != $toTimeZone) { + $data = self::convertTimeZone($data, $fromTimeZone, $toTimeZone); + } + + $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $data, new \DateTimeZone($toTimeZone)); + + $data = $dt->format(self::ISO8601); + } + break; + case 'array': + $regexpKey = (!empty($arrayKey))? '/^(?:' . implode('|', $arrayKey) . ')$/i': ''; + + array_walk_recursive( + $data, + function (&$value, $key, $arrayData) + { + try { + if (($arrayData['regexpKey'] == '' || preg_match($arrayData['regexpKey'], $key)) && + is_string($value) && preg_match($arrayData['regexpDatetime'], $value) + ) { + if ($arrayData['fromTimeZone'] != $arrayData['toTimeZone']) { + $value = self::convertTimeZone($value, $arrayData['fromTimeZone'], $arrayData['toTimeZone']); + } + + $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $value, new \DateTimeZone($arrayData['toTimeZone'])); + + $value = $dt->format(self::ISO8601); + } + } catch (\Exception $e) { + throw $e; + } + }, + ['fromTimeZone' => $fromTimeZone, 'toTimeZone' => $toTimeZone, 'regexpDatetime' => $regexpDatetime, 'regexpKey' => $regexpKey] + ); + break; + case 'object': + $data = json_decode(json_encode($data), true); + $data = self::convertDataToIso8601($data, $fromTimeZone, $toTimeZone, $arrayKey); + $data = json_decode(json_encode($data)); + break; + } + + //Return + return $data; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert ISO-8601/datetime/array-ISO-8601-datetime-data to UTC + * + * @param mixed $data Data + * @param array $arrayKey Keys that convert to UTC + * @param string $format Format to return data + * + * @return mixed Return data + */ + public static function convertDataToUtc($data, array $arrayKey = [], $format = 'Y-m-d H:i:s') + { + try { + if (!(isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])) { + //Return + return $data; + } + + $fromTimeZone = \ProcessMaker\BusinessModel\User::getUserLoggedTimeZone(); + $toTimeZone = 'UTC'; + + //Return + return self::convertDataToTimeZone($data, $fromTimeZone, $toTimeZone, $arrayKey, $format); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert UTC to Time Zone + * + * @param mixed $data Data + * @param array $arrayKey Keys that convert to Time Zone + * @param string $format Format to return data + * + * @return mixed Return data + */ + public static function convertUtcToTimeZone($data, array $arrayKey = [], $format = 'Y-m-d H:i:s') + { + try { + if (!(isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])) { + //Return + return $data; + } + + $fromTimeZone = 'UTC'; + $toTimeZone = \ProcessMaker\BusinessModel\User::getUserLoggedTimeZone(); + + //Return + return self::convertDataToTimeZone($data, $fromTimeZone, $toTimeZone, $arrayKey, $format); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Convert UTC to ISO-8601 + * + * @param mixed $data Data + * @param array $arrayKey Keys that convert to ISO-8601 + * + * @return mixed Return data + */ + public static function convertUtcToIso8601($data, array $arrayKey = []) + { + try { + if (!(isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])) { + //Return + return $data; + } + + $fromTimeZone = 'UTC'; + $toTimeZone = \ProcessMaker\BusinessModel\User::getUserLoggedTimeZone(); + + //Return + return self::convertDataToIso8601($data, $fromTimeZone, $toTimeZone, $arrayKey); + } catch (\Exception $e) { + throw $e; + } + } +} + diff --git a/workflow/engine/templates/users/users.js b/workflow/engine/templates/users/users.js index d1f07ec94..40fcc3e2b 100755 --- a/workflow/engine/templates/users/users.js +++ b/workflow/engine/templates/users/users.js @@ -14,6 +14,7 @@ var comboLocation; var comboReplacedBy; var comboCalendar; var comboRole; +var cboTimeZone; var comboDefaultMainMenuOption; var comboDefaultCasesMenuOption; @@ -401,6 +402,29 @@ Ext.onReady(function () { mode : 'local' }); + cboTimeZone = new Ext.form.ComboBox({ + id: "cboTimeZone", + name: "USR_TIME_ZONE", + + valueField: "id", + displayField: "value", + value: SYSTEM_TIME_ZONE, + store: new Ext.data.ArrayStore({ + idIndex: 0, + fields: ["id", "value"], + data: TIME_ZONE_DATA + }), + + fieldLabel: _("ID_TIME_ZONE"), + + triggerAction: "all", + mode: "local", + editable: false, + width: 260, + + hidden: !(__SYSTEM_UTC_TIME_ZONE__ == 1) + }); + var informationFields = new Ext.form.FieldSet({ title : _('ID_PERSONAL_INFORMATION'), items : [ @@ -510,7 +534,8 @@ Ext.onReady(function () { dateField, comboCalendar, comboStatus, - comboRole + comboRole, + cboTimeZone ] }); /*----------------------------------********---------------------------------*/ @@ -925,7 +950,15 @@ Ext.onReady(function () { fieldLabel : _('ID_ROLE'), xtype : 'label', width : 260 - } + }, + { + id: "USR_TIME_ZONE2", + fieldLabel: _("ID_TIME_ZONE"), + xtype: "label", + width: 260, + + hidden: !(__SYSTEM_UTC_TIME_ZONE__ == 1) + } ] }); /*----------------------------------********---------------------------------*/ @@ -1384,6 +1417,7 @@ function loadUserData() Ext.getCmp("USR_DUE_DATE2").setText(data.user.USR_DUE_DATE); Ext.getCmp("USR_STATUS2").setText(_('ID_' + data.user.USR_STATUS)); Ext.getCmp("USR_ROLE2").setText(data.user.USR_ROLE_NAME); + Ext.getCmp("USR_TIME_ZONE2").setText((data.user.USR_TIME_ZONE != "")? data.user.USR_TIME_ZONE : SYSTEM_TIME_ZONE); /*----------------------------------********---------------------------------*/ Ext.getCmp("USR_COST_BY_HOUR2").setText(data.user.USR_COST_BY_HOUR); Ext.getCmp("USR_UNIT_COST2").setText(data.user.USR_UNIT_COST); @@ -1426,6 +1460,8 @@ function loadUserData() comboRole.setValue(data.user.USR_ROLE); }); + cboTimeZone.setValue((data.user.USR_TIME_ZONE != "")? data.user.USR_TIME_ZONE : SYSTEM_TIME_ZONE); + if (infoMode) { comboDefaultMainMenuOption.store.on("load", function (store) { comboDefaultMainMenuOption.setValue(data.user.PREF_DEFAULT_MENUSELECTED); diff --git a/workflow/public_html/bootstrap.php b/workflow/public_html/bootstrap.php index 50a532307..53fb932ac 100755 --- a/workflow/public_html/bootstrap.php +++ b/workflow/public_html/bootstrap.php @@ -70,7 +70,7 @@ //$e_all = E_ALL & ~ E_DEPRECATED & ~ E_STRICT & ~ E_NOTICE & ~E_WARNING; G::LoadSystem('inputfilter'); - $filter = new InputFilter(); + $filter = new InputFilter(); $config['display_errors'] = $filter->validateInput($config['display_errors']); $config['error_reporting'] = $filter->validateInput($config['error_reporting']); $config['memory_limit'] = $filter->validateInput($config['memory_limit']); @@ -83,14 +83,14 @@ ini_set('default_charset', "UTF-8"); ini_set('memory_limit', $filter->validateInput($config['memory_limit']) ); ini_set('soap.wsdl_cache_enabled', $config['wsdl_cache']); - ini_set('date.timezone', $filter->validateInput($config['time_zone']) ); + ini_set('date.timezone', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 'UTC' : $config['time_zone']); //Set Time Zone define ('DEBUG_SQL_LOG', $config['debug_sql']); define ('DEBUG_TIME_LOG', $config['debug_time']); define ('DEBUG_CALENDAR_LOG', $config['debug_calendar']); define ('MEMCACHED_ENABLED', $config['memcached']); define ('MEMCACHED_SERVER', $config['memcached_server']); - define ('TIME_ZONE', $config['time_zone']); + define ('TIME_ZONE', ini_get('date.timezone')); // IIS Compatibility, SERVER_ADDR doesn't exist on that env, so we need to define it. $_SERVER['SERVER_ADDR'] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['SERVER_NAME']; @@ -276,7 +276,7 @@ //Load filter class G::LoadSystem('inputfilter'); $filter = new InputFilter(); - + // Installer, redirect to install if we don't have a valid shared data folder if ( !defined('PATH_DATA') || !file_exists(PATH_DATA)) { diff --git a/workflow/public_html/sysGeneric.php b/workflow/public_html/sysGeneric.php index bd3cdb81d..665cb7e79 100755 --- a/workflow/public_html/sysGeneric.php +++ b/workflow/public_html/sysGeneric.php @@ -303,6 +303,12 @@ if ((preg_match("/msie/i", $_SERVER ['HTTP_USER_AGENT']) != 1 || } session_start(); +$_SESSION['__SYSTEM_UTC_TIME_ZONE__'] = (int)($config['system_utc_time_zone']) == 1; + +$_GET = \ProcessMaker\Util\DateTime::convertDataToUtc($_GET); +$_POST = \ProcessMaker\Util\DateTime::convertDataToUtc($_POST); +$_REQUEST = \ProcessMaker\Util\DateTime::convertDataToUtc($_REQUEST); + //$e_all = defined( 'E_DEPRECATED' ) ? E_ALL & ~ E_DEPRECATED : E_ALL; //$e_all = defined( 'E_STRICT' ) ? $e_all & ~ E_STRICT : $e_all; //$e_all = $config['debug'] ? $e_all : $e_all & ~ E_NOTICE; @@ -323,7 +329,7 @@ ini_set( 'short_open_tag', 'On' ); ini_set( 'default_charset', "UTF-8" ); ini_set( 'memory_limit', $config['memory_limit'] ); ini_set( 'soap.wsdl_cache_enabled', $config['wsdl_cache'] ); -ini_set( 'date.timezone', $config['time_zone'] ); +ini_set('date.timezone', (isset($_SESSION['__SYSTEM_UTC_TIME_ZONE__']) && $_SESSION['__SYSTEM_UTC_TIME_ZONE__'])? 'UTC' : $config['time_zone']); //Set Time Zone define( 'DEBUG_SQL_LOG', $config['debug_sql'] ); define( 'DEBUG_SQL', $config['debug'] ); @@ -331,7 +337,7 @@ define( 'DEBUG_TIME_LOG', $config['debug_time'] ); define( 'DEBUG_CALENDAR_LOG', $config['debug_calendar'] ); define( 'MEMCACHED_ENABLED', $config['memcached'] ); define( 'MEMCACHED_SERVER', $config['memcached_server'] ); -define( 'TIME_ZONE', $config['time_zone'] ); +define('TIME_ZONE', ini_get('date.timezone')); define ('WS_IN_LOGIN', isset($config['WS_IN_LOGIN']) ? $config['WS_IN_LOGIN'] : 'serverconf');