From 9da6ee6d6196828904a26344946c6e497c5696c2 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 1/7] Wire time format into site localization --- lib/Session.php | 19 ++++++++++++++++++- lib/Site.php | 7 +++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/Session.php b/lib/Session.php index 429128868..91b7d2f46 100755 --- a/lib/Session.php +++ b/lib/Session.php @@ -74,6 +74,7 @@ class CATSSession private $_timeZone = 0; private $_defaultPhoneCountryCode = '+1'; private $_dateDMY = false; + private $_timeFormat24 = false; private $_pipelineEntriesPerPage = 15; private $_storedData = array(); private $_storedValues = array(); @@ -400,6 +401,17 @@ public function isDateDMY() return $this->_dateDMY; } + /** + * Returns true if 24-hour time format is configured for the current site, + * false otherwise (12-hour format). The database is not accessed. + * + * @return boolean Is 24-hour time format in use? + */ + public function isTimeFormat24() + { + return $this->_timeFormat24; + } + // FIXME: Document me! public function getAccessLevel($securedObjectName) { @@ -623,13 +635,14 @@ public function setDropdown($name, $value) * @param boolean Display dates in D-M-Y format? * @return void */ - public function setTimeDateLocalization($timeZone, $isDMY) + public function setTimeDateLocalization($timeZone, $isDMY, $isTimeFormat24 = false) { $timeZone = (integer) $timeZone; $this->_timeZone = $timeZone; $this->_timeZoneOffset = $timeZone - OFFSET_GMT; $this->_dateDMY = $isDMY; + $this->_timeFormat24 = (bool) $isTimeFormat24; } /** @@ -704,6 +717,7 @@ public function processLogin($username, $password, $addToHistory = true) site.time_zone AS timeZone, site.default_phone_country_code AS defaultPhoneCountryCode, site.date_format_ddmmyy AS dateFormatDMY, + site.time_format_24 AS timeFormat24, site.is_free AS isFree, site.is_hr_mode AS isHrMode, site.first_time_setup as isFirstTimeSetup, @@ -837,6 +851,7 @@ public function processLogin($username, $password, $addToHistory = true) $this->_timeZone = $rs['timeZone']; $this->_defaultPhoneCountryCode = $rs['defaultPhoneCountryCode']; $this->_dateDMY = ($rs['dateFormatDMY'] == 0 ? false : true); + $this->_timeFormat24 = ($rs['timeFormat24'] == 0 ? false : true); $this->_canSeeEEOInfo = ($rs['canSeeEEOInfo'] == 0 ? false : true); $this->_pipelineEntriesPerPage = $rs['pipelineEntriesPerPage']; $this->_loggedInScript = CATSUtility::getDirectoryName(); @@ -1001,6 +1016,7 @@ public function transparentLogin($toSiteID, $asUserID, $asSiteID) site.time_zone AS timeZone, site.default_phone_country_code AS defaultPhoneCountryCode, site.date_format_ddmmyy AS dateFormatDMY, + site.time_format_24 AS timeFormat24, site.is_free AS isFree, site.is_hr_mode AS isHrMode FROM @@ -1036,6 +1052,7 @@ public function transparentLogin($toSiteID, $asUserID, $asSiteID) $this->_timeZone = $rs['timeZone']; $this->_defaultPhoneCountryCode = $rs['defaultPhoneCountryCode']; $this->_dateDMY = ($rs['dateFormatDMY'] == 0 ? false : true); + $this->_timeFormat24 = ($rs['timeFormat24'] == 0 ? false : true); $this->_isFirstTimeSetup = true; $this->_isAgreedToLicense = true; $this->_isLocalizationConfigured = true; diff --git a/lib/Site.php b/lib/Site.php index 8fb8d5202..978f97982 100755 --- a/lib/Site.php +++ b/lib/Site.php @@ -75,20 +75,23 @@ public function setName($name) * * @param integer time zone offset * @param boolean use D-M-Y format dates + * @param boolean use 24-hour time format * @return boolean True if successful; false otherwise. */ - public function setLocalization($timeZone, $isDMY) + public function setLocalization($timeZone, $isDMY, $isTimeFormat24 = false) { $sql = sprintf( "UPDATE site SET time_zone = %s, - date_format_ddmmyy = %s + date_format_ddmmyy = %s, + time_format_24 = %s WHERE site_id = %s", $this->_db->makeQueryInteger($timeZone), ($isDMY ? 1 : 0), + ($isTimeFormat24 ? 1 : 0), $this->_siteID ); From 2975696be604bd0ded74a95c9ce861f81b3c877d Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 2/7] Add time format option to localization settings --- modules/settings/CustomizeCalendar.tpl | 68 +++++++------------------- modules/settings/Localization.tpl | 12 +++++ modules/settings/SettingsUI.php | 12 +++-- 3 files changed, 39 insertions(+), 53 deletions(-) diff --git a/modules/settings/CustomizeCalendar.tpl b/modules/settings/CustomizeCalendar.tpl index 4a16b94c3..90f049a36 100755 --- a/modules/settings/CustomizeCalendar.tpl +++ b/modules/settings/CustomizeCalendar.tpl @@ -51,32 +51,16 @@ Work day start time: - @@ -85,32 +69,16 @@ Work day stop time: - diff --git a/modules/settings/Localization.tpl b/modules/settings/Localization.tpl index bdfb08bb7..b53c91640 100755 --- a/modules/settings/Localization.tpl +++ b/modules/settings/Localization.tpl @@ -46,6 +46,18 @@ + + Please choose your preferred time format. + + + + + + + Please enter your default phone country calling code. diff --git a/modules/settings/SettingsUI.php b/modules/settings/SettingsUI.php index cdf07fd2c..8bc84fe73 100755 --- a/modules/settings/SettingsUI.php +++ b/modules/settings/SettingsUI.php @@ -2089,6 +2089,7 @@ private function customizeCalendar() $calendarSettingsRS = $calendarSettings->getAll(); $this->_template->assign('calendarSettingsRS', $calendarSettingsRS); + $this->_template->assign('isTimeFormat24', $_SESSION['CATS']->isTimeFormat24()); $this->_template->assign('active', $this); $this->_template->assign('subActive', 'Administration'); $this->_template->display('./modules/settings/CustomizeCalendar.tpl'); @@ -2435,6 +2436,7 @@ private function administration() $this->_template->assign('timeZone', $_SESSION['CATS']->getTimeZone()); $this->_template->assign('isDateDMY', $_SESSION['CATS']->isDateDMY()); + $this->_template->assign('isTimeFormat24', $_SESSION['CATS']->isTimeFormat24()); // Default phone country calling code for the localization settings page. $defaultPhoneCountryCode = $_SESSION['CATS']->getDefaultPhoneCountryCode(); @@ -2593,8 +2595,10 @@ private function onAdministration() $isDMY = true; } + $isTimeFormat24 = (isset($_POST['timeFormat']) && $_POST['timeFormat'] === '24'); + $site = new Site($this->_siteID); - $site->setLocalization($timeZone, $isDMY); + $site->setLocalization($timeZone, $isDMY, $isTimeFormat24); // Default phone country calling code (E.164) for the site. if (isset($_POST['defaultPhoneCountryCodeDigits'])) @@ -2647,11 +2651,13 @@ private function onAspLocalization() $isDMY = true; } + $isTimeFormat24 = (isset($_POST['timeFormat']) && $_POST['timeFormat'] === '24'); + $site = new Site($this->_siteID); - $site->setLocalization($timeZone, $dateFormat); + $site->setLocalization($timeZone, $isDMY, $isTimeFormat24); /* Reload the new data for the session. */ - $_SESSION['CATS']->setTimeDateLocalization($timeZone, $isDMY); + $_SESSION['CATS']->setTimeDateLocalization($timeZone, $isDMY, $isTimeFormat24); $this->_template->assign('inputType', 'conclusion'); $this->_template->assign('title', 'Localization Settings Saved!'); From dd962c5445cdc250ad9aae620649e82963a19690 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 3/7] Add time format option to localization wizard --- js/wizardIntro.js | 4 +++- modules/login/wizard/Localization.tpl | 10 ++++++++++ modules/settings/NewInstallWizard.tpl | 12 ++++++++++++ modules/settings/SettingsUI.php | 4 +++- modules/wizard/WizardUI.php | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/js/wizardIntro.js b/js/wizardIntro.js index 07afad017..69c8be03d 100755 --- a/js/wizardIntro.js +++ b/js/wizardIntro.js @@ -91,10 +91,12 @@ function extendedNext() // This is the localization page var timeZone = document.getElementById("timeZone"); var dateFormat = document.getElementById("dateFormat"); + var timeFormatEl = document.getElementById("timeFormat"); + var timeFormat = timeFormatEl ? timeFormatEl.value : "12"; failAction = "alert(\"Unable to set your localization settings! Please try again.\");"; userActionSuccess = "funcNext();"; failAction = ""; - userAction("Localization&timeZone=" + escape(timeZone.value) + "&dateFormat=" + escape(dateFormat.value)); + userAction("Localization&timeZone=" + escape(timeZone.value) + "&dateFormat=" + escape(dateFormat.value) + "&timeFormat=" + escape(timeFormat)); return false; } diff --git a/modules/login/wizard/Localization.tpl b/modules/login/wizard/Localization.tpl index 8e5875879..d8d650aab 100755 --- a/modules/login/wizard/Localization.tpl +++ b/modules/login/wizard/Localization.tpl @@ -16,6 +16,16 @@ + + + Time Format + + + +

These settings will effect how you see dates and times in OpenCATS. diff --git a/modules/settings/NewInstallWizard.tpl b/modules/settings/NewInstallWizard.tpl index 90c8f6d8f..7c71e186d 100755 --- a/modules/settings/NewInstallWizard.tpl +++ b/modules/settings/NewInstallWizard.tpl @@ -80,6 +80,18 @@ + + + Please choose your preferred time format. + + + + + +
diff --git a/modules/settings/SettingsUI.php b/modules/settings/SettingsUI.php index 8bc84fe73..e251c2cff 100755 --- a/modules/settings/SettingsUI.php +++ b/modules/settings/SettingsUI.php @@ -3091,8 +3091,10 @@ private function wizard_localization() $isDMY = true; } + $isTimeFormat24 = (isset($_GET['timeFormat']) && $_GET['timeFormat'] === '24'); + $site = new Site($this->_siteID); - $site->setLocalization($timeZone, $isDMY); + $site->setLocalization($timeZone, $isDMY, $isTimeFormat24); $site->setLocalizationConfigured(); echo 'Ok'; diff --git a/modules/wizard/WizardUI.php b/modules/wizard/WizardUI.php index babf65a92..3bd00e89c 100755 --- a/modules/wizard/WizardUI.php +++ b/modules/wizard/WizardUI.php @@ -66,6 +66,7 @@ public function __construct() $this->addPage('Localization', './modules/wizard/WizardIntroLocalization.tpl', ' $this->_template->assign(\'timeZone\', $_SESSION[\'CATS\']->getTimeZone()); $this->_template->assign(\'isDateDMY\', $_SESSION[\'CATS\']->isDateDMY()); + $this->_template->assign(\'isTimeFormat24\', $_SESSION[\'CATS\']->isTimeFormat24()); '); $this->addJsInclude('./js/wizardIntro.js'); From f1dd7a0ae7360132684bd7e5e8cc70cd710cb728 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 4/7] Add time format helpers --- lib/DateUtility.php | 131 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/lib/DateUtility.php b/lib/DateUtility.php index 7300398bf..5f98488f2 100755 --- a/lib/DateUtility.php +++ b/lib/DateUtility.php @@ -387,7 +387,136 @@ public static function getAdjustedDate($format = 'U', $date = false) return date($format, $unixTime); } - + + /** + * Returns the PHP time format string for the configured time format. + * Pass an explicit boolean to override the session value (useful in tests). + * + * @param boolean|null $isTimeFormat24 true=24h, false=12h, null=read from session + * @return string 'H:i' for 24-hour or 'g:i A' for 12-hour + */ + public static function getTimeFormat($isTimeFormat24 = null) + { + if ($isTimeFormat24 === null) + { + $isTimeFormat24 = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()); + } + + return $isTimeFormat24 ? 'H:i' : 'g:i A'; + } + + /** + * Returns a combined date + time PHP format string for the configured formats. + * + * @param string $dateFormat A PHP date format string for the date portion. + * @param boolean|null $isTimeFormat24 true=24h, false=12h, null=read from session + * @return string combined format, e.g. 'm-d-Y g:i A' or 'm-d-Y H:i' + */ + public static function getDateTimeFormat($dateFormat, $isTimeFormat24 = null) + { + return $dateFormat . ' ' . self::getTimeFormat($isTimeFormat24); + } + + /** + * Returns the MySQL DATE_FORMAT time-only format string for use inside + * a PHP sprintf() call (% signs are already doubled). + * 24-hour: '%%H:%%i' becomes MySQL %H:%i (e.g. 13:30) + * 12-hour: '%%h:%%i %%p' becomes MySQL %h:%i %p (e.g. 01:30 PM) + * + * @param boolean|null $isTimeFormat24 true=24h, false=12h, null=session + * @return string sprintf-escaped MySQL time format string + */ + public static function getMysqlTimeFormat($isTimeFormat24 = null) + { + if ($isTimeFormat24 === null) + { + $isTimeFormat24 = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()); + } + return $isTimeFormat24 ? '%%H:%%i' : '%%h:%%i %%p'; + } + + /** + * Returns the MySQL DATE_FORMAT date+time format string for use inside + * a PHP sprintf() call (% signs are already doubled). + * 24-hour: '%%m-%%d-%%y (%%H:%%i)' + * 12-hour: '%%m-%%d-%%y (%%h:%%i %%p)' + * + * @param boolean|null $isTimeFormat24 true=24h, false=12h, null=session + * @return string sprintf-escaped MySQL datetime format string + */ + public static function getMysqlDateTimeFormat($isTimeFormat24 = null) + { + if ($isTimeFormat24 === null) + { + $isTimeFormat24 = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()); + } + return $isTimeFormat24 ? '%%m-%%d-%%y (%%H:%%i)' : '%%m-%%d-%%y (%%h:%%i %%p)'; + } + + /** + * Returns the MySQL DATE_FORMAT date+time+seconds format string for use + * inside a PHP sprintf() call (% signs are already doubled). + * 24-hour: '%%m-%%d-%%y (%%H:%%i:%%s)' + * 12-hour: '%%m-%%d-%%y (%%h:%%i:%%s %%p)' + * + * @param boolean|null $isTimeFormat24 true=24h, false=12h, null=session + * @return string sprintf-escaped MySQL datetime+seconds format string + */ + public static function getMysqlDateTimeSecondsFormat($isTimeFormat24 = null) + { + if ($isTimeFormat24 === null) + { + $isTimeFormat24 = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()); + } + return $isTimeFormat24 ? '%%m-%%d-%%y (%%H:%%i:%%s)' : '%%m-%%d-%%y (%%h:%%i:%%s %%p)'; + } + + /** + * Normalizes activity form time inputs to a 'HH:MM:00' string suitable + * for storage. Returns false when inputs are out of range. + * + * In 24-hour mode $hour must be 0-23; $meridiem is ignored. + * In 12-hour mode $hour must be 1-12 and $meridiem must be 'AM' or 'PM'. + * + * @param integer $hour Hour from the form + * @param integer $minute Minute from the form (0-59) + * @param string $meridiem 'AM' or 'PM' (ignored in 24-hour mode) + * @param boolean $is24 true for 24-hour mode + * @return string|false 'HH:MM:00' on success, false on invalid input + */ + public static function normalizeActivityTime($hour, $minute, $meridiem, $is24) + { + $hour = (int) $hour; + $minute = (int) $minute; + + if ($minute < 0 || $minute > 59) + { + return false; + } + + if ($is24) + { + if ($hour < 0 || $hour > 23) + { + return false; + } + return sprintf('%02d:%02d:00', $hour, $minute); + } + + if ($hour < 1 || $hour > 12 || ($meridiem !== 'AM' && $meridiem !== 'PM')) + { + return false; + } + + $hour24 = $hour % 12; /* 12 AM becomes 0; 1-11 AM stay 1-11. */ + if ($meridiem === 'PM') + { + $hour24 += 12; /* 12 PM stays 12; 1-11 PM become 13-23. */ + } + + return sprintf('%02d:%02d:00', $hour24, $minute); + } + /** * Returns a human readable representation of a period of time in seconds. * From 4fa65ad2a3ee8206442f5a52001215ddd7f9a31a Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 5/7] Apply time format to all output --- ajax/editActivity.php | 21 ++-- js/activity.js | 105 +++++++++++------- lib/ActivityEntries.php | 10 +- lib/Attachments.php | 4 +- lib/Calendar.php | 10 +- lib/Candidates.php | 4 +- lib/Companies.php | 2 +- lib/Contacts.php | 6 +- lib/EmailTemplates.php | 5 +- lib/History.php | 2 +- lib/JobOrders.php | 4 +- lib/LoginActivity.php | 2 +- lib/Pipelines.php | 2 +- lib/Site.php | 3 +- lib/Statistics.php | 6 +- lib/TemplateUtility.php | 5 +- lib/Users.php | 14 +-- modules/activity/dataGrids.php | 4 +- modules/calendar/Calendar.tpl | 29 ++++- modules/calendar/CalendarUI.js | 57 ++++++---- modules/calendar/CalendarUI.php | 68 +++++++----- .../AddActivityScheduleEventModal.tpl | 39 +++++-- modules/candidates/CandidatesUI.php | 77 ++++++------- modules/candidates/Show.tpl | 3 +- modules/companies/Show.tpl | 4 + .../AddActivityScheduleEventModal.tpl | 39 +++++-- modules/contacts/ContactsUI.php | 73 ++++++------ modules/contacts/Show.tpl | 3 +- modules/home/dataGrids.php | 9 +- modules/import/Import.php | 2 +- 30 files changed, 360 insertions(+), 252 deletions(-) diff --git a/ajax/editActivity.php b/ajax/editActivity.php index cf27067ea..1e3645ba5 100755 --- a/ajax/editActivity.php +++ b/ajax/editActivity.php @@ -80,7 +80,6 @@ $activityDate = trim(urldecode($_POST['date'])); $activityHour = trim(urldecode($_POST['hour'])); $activityMinute = trim(urldecode($_POST['minute'])); -$activityAMPM = trim(urldecode($_POST['ampm'])); $dateFormatFlag = $_SESSION['CATS']->isDateDMY() ? DATE_FORMAT_DDMMYY @@ -99,19 +98,17 @@ $jobOrderID = -1; } -/* Convert formatted time to UNIX timestamp. */ -$time = strtotime( - sprintf('%02d:%02d %s', $activityHour, $activityMinute, $activityAMPM) -); +/* Convert time fields to a 'HH:MM:SS' string. */ +$is24 = $_SESSION['CATS']->isTimeFormat24(); +$activityAMPM = $is24 ? '' : trim(urldecode($_POST['ampm'])); +$timeStr = DateUtility::normalizeActivityTime($activityHour, $activityMinute, $activityAMPM, $is24); +if ($timeStr === false) +{ + die('Invalid time.'); +} /* Create MySQL date string w/ 24hr time (YYYY-MM-DD HH:MM:SS). */ -$date = sprintf( - '%s %s', - DateUtility::convert( - '-', $activityDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD - ), - date('H:i:00', $time) -); +$date = DateUtility::convert('-', $activityDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD) . ' ' . $timeStr; /* Save the new activity entry. */ $activityEntries = new ActivityEntries($siteID); diff --git a/js/activity.js b/js/activity.js index 40d4c99fb..39c65885c 100755 --- a/js/activity.js +++ b/js/activity.js @@ -296,31 +296,46 @@ function Activity_editEntry(activityID, dataItemID, dataItemType, sessionCookie) var userDateFormat = (typeof window.CATSUserDateFormat !== "undefined" ? window.CATSUserDateFormat : "MM-DD-YY"); dateSpan.innerHTML = DateInputForDOM("dateEditActivity" + activityID, true, userDateFormat, dateAndTime.substr(0,dateAndTime.indexOf(" ")), -1); - var timeString = dateAndTime.substr(dateAndTime.indexOf(" ")+2); - var hourString = timeString.substr(0,timeString.indexOf(":")); - var timeString = timeString.substr(timeString.indexOf(":")+1); - var minuteString = timeString.substr(0,timeString.indexOf(" ")); - var timeString = timeString.substr(timeString.indexOf(" ")+1); - var amPmString = timeString.substr(0,timeString.indexOf(")")); - - /* Time editor. */ + /* Parse time from display string: strip date prefix and the opening "(". */ + var timeSection = dateAndTime.substr(dateAndTime.indexOf("(") + 1); + var hourString, minuteString, amPmString; + if (window.CATSTimeFormat24) + { + /* 24-hour display: "(HH:MM)" */ + hourString = timeSection.substr(0, timeSection.indexOf(":")); + minuteString = timeSection.substr(timeSection.indexOf(":") + 1, 2); + amPmString = ""; + } + else + { + /* 12-hour display: "(H:MM AM)" or "(H:MM PM)" */ + hourString = timeSection.substr(0, timeSection.indexOf(":")); + var rest = timeSection.substr(timeSection.indexOf(":") + 1); + minuteString = rest.substr(0, rest.indexOf(" ")); + amPmString = rest.substr(rest.indexOf(" ") + 1, 2); + } + + /* Time editor — hour select. */ var hourSelect = document.createElement("select"); hourSelect.setAttribute("id", "hourEditActivity" + activityID); - for (var i = 1; i<= 12; ++i) + var hourMin = window.CATSTimeFormat24 ? 0 : 1; + var hourMax = window.CATSTimeFormat24 ? 23 : 12; + for (var i = hourMin; i <= hourMax; ++i) { var hourSelectOption = document.createElement("option"); hourSelectOption.value = i; - hourSelectOption.innerHTML = i; + hourSelectOption.innerHTML = window.CATSTimeFormat24 ? (i < 10 ? '0' + i : '' + i) : i; if (hourString * 1 == i) { hourSelectOption.selected = true; } hourSelect.appendChild(hourSelectOption); } - + + /* Time editor — minute select. */ var minuteSelect = document.createElement("select"); minuteSelect.setAttribute("id", "minuteEditActivity" + activityID); - for (var i = 0; i<= 59; ++i) + for (var i = 0; i <= 59; ++i) { var minuteSelectOption = document.createElement("option"); minuteSelectOption.value = i; @@ -331,37 +346,45 @@ function Activity_editEntry(activityID, dataItemID, dataItemType, sessionCookie) } minuteSelect.appendChild(minuteSelectOption); } - - var AMPMSelect = document.createElement("select"); - AMPMSelect.setAttribute("id", "ampmEditActivity" + activityID); - - var AMPMSelectOptionAM = document.createElement("option"); - AMPMSelectOptionAM.value = "AM"; - AMPMSelectOptionAM.innerHTML = "AM"; - if (amPmString == "AM") - { - AMPMSelectOptionAM.selected = true; - } - AMPMSelect.appendChild(AMPMSelectOptionAM); - - var AMPMSelectOptionPM = document.createElement("option"); - AMPMSelectOptionPM.value = "PM"; - AMPMSelectOptionPM.innerHTML = "PM"; - if (amPmString == "PM") + + /* Time editor — AM/PM select (12-hour mode only). */ + var AMPMSelect = null; + if (!window.CATSTimeFormat24) { - AMPMSelectOptionPM.selected = true; + AMPMSelect = document.createElement("select"); + AMPMSelect.setAttribute("id", "ampmEditActivity" + activityID); + + var AMPMSelectOptionAM = document.createElement("option"); + AMPMSelectOptionAM.value = "AM"; + AMPMSelectOptionAM.innerHTML = "AM"; + if (amPmString == "AM") + { + AMPMSelectOptionAM.selected = true; + } + AMPMSelect.appendChild(AMPMSelectOptionAM); + + var AMPMSelectOptionPM = document.createElement("option"); + AMPMSelectOptionPM.value = "PM"; + AMPMSelectOptionPM.innerHTML = "PM"; + if (amPmString == "PM") + { + AMPMSelectOptionPM.selected = true; + } + AMPMSelect.appendChild(AMPMSelectOptionPM); } - AMPMSelect.appendChild(AMPMSelectOptionPM); - + var dateTimeTable = document.createElement("table"); var dateTimeTableTr = document.createElement("tr"); var dateTimeTableTdLeft = document.createElement("td"); var dateTimeTableTdRight = document.createElement("td"); - - dateTimeTableTdLeft.appendChild(dateSpan); - dateTimeTableTdRight.appendChild(hourSelect); - dateTimeTableTdRight.appendChild(minuteSelect); - dateTimeTableTdRight.appendChild(AMPMSelect); + + dateTimeTableTdLeft.appendChild(dateSpan); + dateTimeTableTdRight.appendChild(hourSelect); + dateTimeTableTdRight.appendChild(minuteSelect); + if (AMPMSelect) + { + dateTimeTableTdRight.appendChild(AMPMSelect); + } dateTimeTableTr.appendChild(dateTimeTableTdLeft); dateTimeTableTr.appendChild(dateTimeTableTdRight); dateTimeTable.appendChild(dateTimeTableTr); @@ -390,7 +413,7 @@ function Activity_editEntry(activityID, dataItemID, dataItemType, sessionCookie) document.getElementById("dateEditActivity" + activityID).value, document.getElementById("hourEditActivity" + activityID).value, document.getElementById("minuteEditActivity" + activityID).value, - document.getElementById("ampmEditActivity" + activityID).value, + AMPMSelect ? AMPMSelect.value : "", oldEditRow, newEditRow, activityID, @@ -861,6 +884,10 @@ function AS_onEventAllDayChange(allDayRadioID) document.getElementById("hour").disabled = disableTime; document.getElementById("minute").disabled = disableTime; - document.getElementById("meridiem").disabled = disableTime; + var meridiem = document.getElementById("meridiem"); + if (meridiem) + { + meridiem.disabled = disableTime; + } document.getElementById("duration").disabled = disableTime; } diff --git a/lib/ActivityEntries.php b/lib/ActivityEntries.php index 3f15df09e..5eb964225 100755 --- a/lib/ActivityEntries.php +++ b/lib/ActivityEntries.php @@ -64,12 +64,16 @@ class ActivityEntries { private $_db; private $_siteID; + private $_mysqlDateTimeFormat; public function __construct($siteID) { $this->_siteID = $siteID; $this->_db = DatabaseConnection::getInstance(); + + $is24 = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()); + $this->_mysqlDateTimeFormat = DateUtility::getMysqlDateTimeFormat($is24); } @@ -430,7 +434,7 @@ public function get($activityID) activity_type.short_description AS typeDescription, activity.notes AS notes, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y (%%h:%%i %%p)' + activity.date_occurred, '" . $this->_mysqlDateTimeFormat . "' ) AS dateCreated, entered_by_user.first_name AS enteredByFirstName, entered_by_user.last_name AS enteredByLastName, @@ -478,7 +482,7 @@ public function getAllByDataItem($dataItemID, $dataItemType) activity.joborder_id AS jobOrderID, activity.notes AS notes, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y (%%h:%%i %%p)' + activity.date_occurred, '" . $this->_mysqlDateTimeFormat . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, activity.type AS type, @@ -534,7 +538,7 @@ public function getAllByCompany($companyID) activity.joborder_id AS jobOrderID, activity.notes AS notes, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y (%%h:%%i %%p)' + activity.date_occurred, '" . $this->_mysqlDateTimeFormat . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, activity.type AS type, diff --git a/lib/Attachments.php b/lib/Attachments.php index 90da43d10..6811c4391 100755 --- a/lib/Attachments.php +++ b/lib/Attachments.php @@ -526,7 +526,7 @@ public function getAll($dataItemType, $dataItemID) directory_name AS directoryName, md5_sum AS md5sum, file_size_kb AS fileSizeKB, - DATE_FORMAT(date_created, '%%m-%%d-%%y (%%h:%%i:%%s %%p)') AS dateCreated + DATE_FORMAT(date_created, '" . DateUtility::getMysqlDateTimeSecondsFormat() . "') AS dateCreated FROM attachment WHERE @@ -592,7 +592,7 @@ public function get($attachmentID, $verifySiteID = true) directory_name AS directoryName, md5_sum AS md5sum, file_size_kb AS fileSizeKB, - DATE_FORMAT(date_created, '%%m-%%d-%%y (%%h:%%i:%%s %%p)') AS dateCreated + DATE_FORMAT(date_created, '" . DateUtility::getMysqlDateTimeSecondsFormat() . "') AS dateCreated FROM attachment WHERE diff --git a/lib/Calendar.php b/lib/Calendar.php index f6adce5f2..2b50b3f1d 100755 --- a/lib/Calendar.php +++ b/lib/Calendar.php @@ -111,7 +111,7 @@ public function getEventArray($month, $year) calendar_event.date, '%%m-%%d-%%y' ) AS date, DATE_FORMAT( - calendar_event.date, '%%h:%%i %%p' + calendar_event.date, '" . DateUtility::getMysqlTimeFormat() . "' ) AS time, DATE_FORMAT( calendar_event.date, '%%H' @@ -121,7 +121,7 @@ public function getEventArray($month, $year) ) AS minute, calendar_event.date AS dateSort, DATE_FORMAT( - calendar_event.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + calendar_event.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, calendar_event_type.calendar_event_type_id AS eventType, calendar_event_type.short_description AS eventTypeDescription, @@ -626,7 +626,7 @@ public function getUpcomingEventsByDataItem($dataItemType, $dataItemID) calendar_event.description AS description, calendar_event.public AS public, DATE_FORMAT( - calendar_event.date, '%%m-%%d-%%y (%%h:%%i %%p)' + calendar_event.date, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateShow, DATE_FORMAT( calendar_event.date, '%%d' @@ -726,7 +726,7 @@ public function getUpcomingEventsHTML($limit, $flag = UPCOMING_FOR_CALENDAR) calendar_event.date, '%%m-%%d-%%y' ) AS date, DATE_FORMAT( - calendar_event.date, '%%h:%%i %%p' + calendar_event.date, '" . DateUtility::getMysqlTimeFormat() . "' ) AS time, calendar_event.date AS dateSort, entered_by_user.user_id AS userID, @@ -776,7 +776,7 @@ public function getUpcomingEventsHTML($limit, $flag = UPCOMING_FOR_CALENDAR) calendar_event.date, '%%m-%%d-%%y' ) AS date, DATE_FORMAT( - calendar_event.date, '%%h:%%i %%p' + calendar_event.date, '" . DateUtility::getMysqlTimeFormat() . "' ) AS time, calendar_event.date AS dateSort, entered_by_user.user_id AS userID, diff --git a/lib/Candidates.php b/lib/Candidates.php index 5020326aa..7aa726dc7 100755 --- a/lib/Candidates.php +++ b/lib/Candidates.php @@ -494,10 +494,10 @@ public function get($candidateID) candidate.is_hot AS isHot, candidate.is_admin_hidden AS isAdminHidden, DATE_FORMAT( - candidate.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + candidate.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, DATE_FORMAT( - candidate.date_modified, '%%m-%%d-%%y (%%h:%%i %%p)' + candidate.date_modified, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateModified, COUNT( candidate_joborder.joborder_id diff --git a/lib/Companies.php b/lib/Companies.php index 6f4c3330a..0d2f6d918 100755 --- a/lib/Companies.php +++ b/lib/Companies.php @@ -341,7 +341,7 @@ public function get($companyID) billing_contact.first_name, ' ', billing_contact.last_name ) AS billingContactFullName, DATE_FORMAT( - company.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + company.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, CONCAT( entered_by_user.first_name, ' ', entered_by_user.last_name diff --git a/lib/Contacts.php b/lib/Contacts.php index 122a58cf1..961ac75e3 100755 --- a/lib/Contacts.php +++ b/lib/Contacts.php @@ -461,10 +461,10 @@ public function get($contactID) reportsToContact.title as reportsToTitle, company_department.name AS department, DATE_FORMAT( - contact.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + contact.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, DATE_FORMAT( - contact.date_modified, '%%m-%%d-%%y (%%h:%%i %%p)' + contact.date_modified, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateModified, company.name AS companyName, company.is_hot AS isHotCompany, @@ -601,7 +601,7 @@ public function getAll($userID = -1, $companyID = -1) contact.date_created, '%%m-%%d-%%y' ) AS dateCreated, DATE_FORMAT( - contact.date_modified, '%%m-%%d-%%y (%%h:%%i %%p)' + contact.date_modified, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateModified, owner_user.first_name AS ownerFirstName, owner_user.last_name AS ownerLastName, diff --git a/lib/EmailTemplates.php b/lib/EmailTemplates.php index 338fe4458..8a9d36222 100755 --- a/lib/EmailTemplates.php +++ b/lib/EmailTemplates.php @@ -281,7 +281,7 @@ public function replaceVariables($text) if ($isLoggedIn) { $replacementStrings = array( - DateUtility::getAdjustedDate($dateFormat . ' g:i A'), + DateUtility::getAdjustedDate(DateUtility::getDateTimeFormat($dateFormat)), $siteName, $fullName, ''. $email .'' @@ -305,8 +305,9 @@ public function replaceVariables($text) $siteName = $siteRS['name']; + $is24 = !empty($siteRS['timeFormat24']); $replacementStrings = array( - DateUtility::getAdjustedDate($dateFormat . ' g:i A'), + DateUtility::getAdjustedDate(DateUtility::getDateTimeFormat($dateFormat, $is24)), $siteName, '', '' . $email . '' diff --git a/lib/History.php b/lib/History.php index a1aa86221..476fa5e10 100755 --- a/lib/History.php +++ b/lib/History.php @@ -273,7 +273,7 @@ public function getAll($dataItemType, $dataItemID) entered_by_user.first_name, ' ', entered_by_user.last_name ) AS enteredByFullName, DATE_FORMAT( - set_date, '%%m-%%d-%%y (%%h:%%i %%p)' + set_date, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateModified FROM history diff --git a/lib/JobOrders.php b/lib/JobOrders.php index 6a4b0ff93..0b5fa6dff 100755 --- a/lib/JobOrders.php +++ b/lib/JobOrders.php @@ -436,10 +436,10 @@ public function get($jobOrderID) NOW(), joborder.date_created ) AS daysOld, DATE_FORMAT( - joborder.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + joborder.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, DATE_FORMAT( - joborder.date_modified, '%%m-%%d-%%y (%%h:%%i %%p)' + joborder.date_modified, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateModified, COUNT( candidate_joborder.joborder_id diff --git a/lib/LoginActivity.php b/lib/LoginActivity.php index 1ce2867e8..f167cfafe 100755 --- a/lib/LoginActivity.php +++ b/lib/LoginActivity.php @@ -125,7 +125,7 @@ public function getPage() user_login.ip AS ip, user_login.user_agent AS shortUserAgent, DATE_FORMAT( - user_login.date, '%%m-%%d-%%y (%%h:%%i %%p)' + user_login.date, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS date, user_login.date AS dateSort, user_login.host AS hostname, diff --git a/lib/Pipelines.php b/lib/Pipelines.php index bacfb94ad..708528c3e 100755 --- a/lib/Pipelines.php +++ b/lib/Pipelines.php @@ -782,7 +782,7 @@ public function getPipelineDetails($candidateJobOrderID) candidate_joborder.rating_value AS ratingValue, entered_by_user.first_name AS enteredByFirstName, entered_by_user.last_name AS enteredByLastName, - DATE_FORMAT(activity.date_modified, '%%m-%%d-%%y (%%h:%%i:%%s %%p)') AS dateModified + DATE_FORMAT(activity.date_modified, '" . DateUtility::getMysqlDateTimeSecondsFormat() . "') AS dateModified FROM candidate_joborder LEFT JOIN candidate diff --git a/lib/Site.php b/lib/Site.php index 978f97982..2828c6616 100755 --- a/lib/Site.php +++ b/lib/Site.php @@ -164,7 +164,8 @@ public function getSiteBySiteID($siteID) user_licenses AS userLicenses, entered_by AS enteredBy, unix_name AS unixName, - date_format_ddmmyy as dateFormatDDMMYY + date_format_ddmmyy as dateFormatDDMMYY, + time_format_24 AS timeFormat24 FROM site WHERE diff --git a/lib/Statistics.php b/lib/Statistics.php index d848ee5e2..cddf42dca 100755 --- a/lib/Statistics.php +++ b/lib/Statistics.php @@ -294,7 +294,7 @@ public function getSubmissionsByJobOrder($period, $jobOrderID) owner_user.first_name, ' ', owner_user.last_name ) AS ownerFullName, DATE_FORMAT( - candidate_joborder_status_history.date, '%%m-%%d-%%y (%%h:%%i %%p)' + candidate_joborder_status_history.date, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateSubmitted FROM candidate_joborder_status_history @@ -404,7 +404,7 @@ public function getPlacementsByJobOrder($period, $jobOrderID) owner_user.first_name, ' ', owner_user.last_name ) AS ownerFullName, DATE_FORMAT( - candidate_joborder_status_history.date, '%%m-%%d-%%y (%%h:%%i %%p)' + candidate_joborder_status_history.date, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateSubmitted FROM candidate_joborder_status_history @@ -616,7 +616,7 @@ public function getJobOrderReport($jobOrderID) owner_user.first_name, ' ', owner_user.last_name ) AS ownerFullName, DATE_FORMAT( - joborder.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + joborder.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, COUNT( candidate_joborder.joborder_id diff --git a/lib/TemplateUtility.php b/lib/TemplateUtility.php index d72f857bf..c401b04fa 100755 --- a/lib/TemplateUtility.php +++ b/lib/TemplateUtility.php @@ -860,8 +860,9 @@ public static function printReportFooter() { $build = $_SESSION['CATS']->getCachedBuild(); - // FIXME: LOCAL TIME ZONE! - $date = date('l, F jS, Y \a\t h:i:s A T'); + $isTimeFormat24 = isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24(); + $timeFormat = $isTimeFormat24 ? 'H:i:s' : 'g:i:s A'; + $date = DateUtility::getAdjustedDate('l, F jS, Y \a\t ' . $timeFormat . ' T'); if ($build > 0) { diff --git a/lib/Users.php b/lib/Users.php index 9e83079c7..b681d989d 100644 --- a/lib/Users.php +++ b/lib/Users.php @@ -303,13 +303,13 @@ public function get($userID) MAX( IF(user_login.successful = 1, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS successfulDate, DATE_FORMAT( MAX( IF(user_login.successful = 0, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS unsuccessfulDate, force_logout as forceLogout FROM @@ -371,13 +371,13 @@ public function getForAdministration($userID, $aspSiteRule) MAX( IF(user_login.successful = 1, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS successfulDate, DATE_FORMAT( MAX( IF(user_login.successful = 0, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS unsuccessfulDate, force_logout as forceLogout FROM @@ -492,13 +492,13 @@ public function getAll() MAX( IF(user_login.successful = 1, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS successfulDate, DATE_FORMAT( MAX( IF(user_login.successful = 0, user_login.date, NULL) ), - '%%m-%%d-%%y (%%h:%%i %%p)' + '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS unsuccessfulDate FROM user @@ -1167,7 +1167,7 @@ public function getLoggedInUsers($limit, $siteID) user.last_name AS lastName, site.name AS siteName, DATE_FORMAT( - user_login.date_refreshed, '%%h:%%i %%p' + user_login.date_refreshed, '" . DateUtility::getMysqlTimeFormat() . "' ) AS lastRefresh, IF( user_login.date_refreshed > DATE_SUB(NOW(), INTERVAL 20 SECOND), diff --git a/modules/activity/dataGrids.php b/modules/activity/dataGrids.php index 812394f85..c86acf0a2 100644 --- a/modules/activity/dataGrids.php +++ b/modules/activity/dataGrids.php @@ -177,7 +177,7 @@ public function getSQL($selectSQL, $joinSQL, $whereSQL, $havingSQL, $orderSQL, $ activity.notes AS notes, activity_type.short_description AS typeDescription, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y (%%h:%%i %%p)' + activity.date_occurred, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, entered_by_user.first_name AS enteredByFirstName, @@ -226,7 +226,7 @@ public function getSQL($selectSQL, $joinSQL, $whereSQL, $havingSQL, $orderSQL, $ activity.notes AS notes, activity_type.short_description AS typeDescription, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y (%%h:%%i %%p)' + activity.date_occurred, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, entered_by_user.first_name AS enteredByFirstName, diff --git a/modules/calendar/Calendar.tpl b/modules/calendar/Calendar.tpl index 191a7d377..13116f292 100755 --- a/modules/calendar/Calendar.tpl +++ b/modules/calendar/Calendar.tpl @@ -4,6 +4,7 @@ active); ?>

@@ -98,9 +99,15 @@     + isTimeFormat24()): ?> +
All Day / No Specific Time
@@ -248,9 +257,15 @@     + isTimeFormat24()): ?> +
All Day / No Specific Time
diff --git a/modules/calendar/CalendarUI.js b/modules/calendar/CalendarUI.js index f32857593..e1ed6b8f6 100755 --- a/modules/calendar/CalendarUI.js +++ b/modules/calendar/CalendarUI.js @@ -199,24 +199,31 @@ function calendarEditEvent(entry) setCheckedValue(document.getElementById("editEventForm").elements["allDay"], "0"); setEditAllDayEnabled(); - if (entry.hour > 12) + if (window.CATSTimeFormat24) { - document.getElementById("hourEdit").value = entry.hour - 12; + document.getElementById("hourEdit").value = entry.hour; } else { - if (entry.hour == 0) + if (entry.hour > 12) { - document.getElementById("hourEdit").value = 12; + document.getElementById("hourEdit").value = entry.hour - 12; } else { - document.getElementById("hourEdit").value = entry.hour * 1; + if (entry.hour == 0) + { + document.getElementById("hourEdit").value = 12; + } + else + { + document.getElementById("hourEdit").value = entry.hour * 1; + } + } + if (entry.hour >= 12) + { + document.getElementById("meridiemEdit").value = "PM"; } - } - if (entry.hour >= 12) - { - document.getElementById("meridiemEdit").value = "PM"; } var string = "" + entry.minute; @@ -388,27 +395,33 @@ function addEventByDay(year, month, day, hour) document.getElementById("publicEntry").checked = defaultPublic; - if (hour > 12) + if (window.CATSTimeFormat24) { - document.getElementById("hour").value = hour - 12; + document.getElementById("hour").value = hour; } else { - if (hour == 0) + if (hour > 12) { - document.getElementById("hour").value = 12; + document.getElementById("hour").value = hour - 12; } else { - document.getElementById("hour").value = hour; + if (hour == 0) + { + document.getElementById("hour").value = 12; + } + else + { + document.getElementById("hour").value = hour; + } + } + if (hour >= 12) + { + document.getElementById("meridiem").value = "PM"; } } - if (hour >= 12) - { - document.getElementById("meridiem").value = "PM"; - } - //cleanUpUI(); document.getElementById("sendEmail").value = userEmail; @@ -514,7 +527,8 @@ function setAddAllDayEnabled() document.getElementById("hour").disabled = state; document.getElementById("minute").disabled = state; - document.getElementById("meridiem").disabled = state; + var mer = document.getElementById("meridiem"); + if (mer) { mer.disabled = state; } document.getElementById("duration").disabled = state; } @@ -529,7 +543,8 @@ function setEditAllDayEnabled() document.getElementById("hourEdit").disabled = state; document.getElementById("minuteEdit").disabled = state; - document.getElementById("meridiemEdit").disabled = state; + var merEdit = document.getElementById("meridiemEdit"); + if (merEdit) { merEdit.disabled = state; } document.getElementById("durationEdit").disabled = state; } diff --git a/modules/calendar/CalendarUI.php b/modules/calendar/CalendarUI.php index d373e03df..f442551a2 100755 --- a/modules/calendar/CalendarUI.php +++ b/modules/calendar/CalendarUI.php @@ -421,10 +421,6 @@ private function onAddEvent() $date = DateUtility::convert( '-', $trimmedDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD ); - - $hour = 12; - $minute = 0; - $meridiem = 'AM'; } else { @@ -440,21 +436,29 @@ private function onAddEvent() CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid minute.'); } - /* Bail out if we don't have a valid meridiem value. */ - if (!isset($_POST['meridiem']) || - ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + $hour = $_POST['hour']; + $minute = $_POST['minute']; + + if ($_SESSION['CATS']->isTimeFormat24()) { - CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid meridiem value.'); + $time = strtotime(sprintf('%02d:%02d', $hour, $minute)); } + else + { + /* Bail out if we don't have a valid meridiem value. */ + if (!isset($_POST['meridiem']) || + ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + { + CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid meridiem value.'); + } - $hour = $_POST['hour']; - $minute = $_POST['minute']; - $meridiem = $_POST['meridiem']; + $meridiem = $_POST['meridiem']; - /* Convert formatted time to UNIX timestamp. */ - $time = strtotime( - sprintf('%s:%s %s', $hour, $minute, $meridiem) - ); + /* Convert formatted time to UNIX timestamp. */ + $time = strtotime( + sprintf('%s:%s %s', $hour, $minute, $meridiem) + ); + } /* Create MySQL date string w/ 24hr time (YYYY-MM-DD HH:MM:SS). */ $date = sprintf( @@ -627,10 +631,6 @@ private function onEditEvent() $date = DateUtility::convert( '-', $trimmedDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD ); - - $hour = 12; - $minute = 0; - $meridiem = 'AM'; } else { @@ -646,21 +646,29 @@ private function onEditEvent() CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid minute.'); } - /* Bail out if we don't have a valid meridiem value. */ - if (!isset($_POST['meridiem']) || - ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + $hour = $_POST['hour']; + $minute = $_POST['minute']; + + if ($_SESSION['CATS']->isTimeFormat24()) { - CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid meridiem value.'); + $time = strtotime(sprintf('%02d:%02d', $hour, $minute)); } + else + { + /* Bail out if we don't have a valid meridiem value. */ + if (!isset($_POST['meridiem']) || + ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + { + CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid meridiem value.'); + } - $hour = $_POST['hour']; - $minute = $_POST['minute']; - $meridiem = $_POST['meridiem']; + $meridiem = $_POST['meridiem']; - /* Convert formatted time to UNIX timestamp. */ - $time = strtotime( - sprintf('%s:%s %s', $hour, $minute, $meridiem) - ); + /* Convert formatted time to UNIX timestamp. */ + $time = strtotime( + sprintf('%s:%s %s', $hour, $minute, $meridiem) + ); + } /* Create MySQL date string w/ 24hr time (YYYY-MM-DD HH:MM:SS). */ $date = sprintf( diff --git a/modules/candidates/AddActivityScheduleEventModal.tpl b/modules/candidates/AddActivityScheduleEventModal.tpl index 0b61e9c54..5dd788028 100644 --- a/modules/candidates/AddActivityScheduleEventModal.tpl +++ b/modules/candidates/AddActivityScheduleEventModal.tpl @@ -39,9 +39,15 @@     + isTimeFormat24()): ?> + @@ -129,9 +137,15 @@
    + isTimeFormat24()): ?> +
@@ -223,14 +239,15 @@ if (!onlyScheduleEvent ? 'true' : 'false'); ?>) { var now = new Date(); + isTimeFormat24()): ?> + document.getElementById('activityHour').value = now.getHours().toString(); + var currentHour = now.getHours() % 12; - if (currentHour == 0) - { - currentHour = 12; - } + if (currentHour == 0) { currentHour = 12; } document.getElementById('activityHour').value = currentHour.toString(); - document.getElementById('activityMinute').value = (now.getMinutes() < 10 ? '0' : '') + now.getMinutes(); document.getElementById('activityMeridiem').value = (now.getHours() >= 12 ? 'PM' : 'AM'); + + document.getElementById('activityMinute').value = (now.getMinutes() < 10 ? '0' : '') + now.getMinutes(); document.logActivityForm.activityNote.focus(); } diff --git a/modules/candidates/CandidatesUI.php b/modules/candidates/CandidatesUI.php index 1c0c7867f..8841419e3 100755 --- a/modules/candidates/CandidatesUI.php +++ b/modules/candidates/CandidatesUI.php @@ -3144,41 +3144,30 @@ private function _addActivity($isJobOrdersMode, $regardingID, $activityNote = $this->getTrimmedInput('activityNote', $_POST); $activityDateOccurred = false; + $isTimeFormat24 = $_SESSION['CATS']->isTimeFormat24(); $dateFormatFlag = $_SESSION['CATS']->isDateDMY() ? DATE_FORMAT_DDMMYY : DATE_FORMAT_MMDDYY; $activityDate = $this->getTrimmedInput('activityDate', $_POST); + $activityHourSet = isset($_POST['activityHour']) && isset($_POST['activityMinute']) && + ctype_digit((string) $_POST['activityHour']) && + ctype_digit((string) $_POST['activityMinute']); + $activityMeridiemOk = $isTimeFormat24 || + (isset($_POST['activityMeridiem']) && + ($_POST['activityMeridiem'] == 'AM' || $_POST['activityMeridiem'] == 'PM')); if (!empty($activityDate) && DateUtility::validate('-', $activityDate, $dateFormatFlag) && - isset($_POST['activityHour']) && isset($_POST['activityMinute']) && - isset($_POST['activityMeridiem']) && - ctype_digit((string) $_POST['activityHour']) && - ctype_digit((string) $_POST['activityMinute']) && - ($_POST['activityMeridiem'] == 'AM' || $_POST['activityMeridiem'] == 'PM')) + $activityHourSet && $activityMeridiemOk) { - $activityHour = (int) $_POST['activityHour']; - $activityMinute = (int) $_POST['activityMinute']; - - if ($activityHour >= 1 && $activityHour <= 12 && - $activityMinute >= 0 && $activityMinute <= 59) + $activityMeridiem = $isTimeFormat24 ? '' : (isset($_POST['activityMeridiem']) ? $_POST['activityMeridiem'] : ''); + $timeStr = DateUtility::normalizeActivityTime( + $_POST['activityHour'], $_POST['activityMinute'], $activityMeridiem, $isTimeFormat24 + ); + if ($timeStr !== false) { - $activityHour = $activityHour % 12; - if ($_POST['activityMeridiem'] == 'PM') - { - $activityHour += 12; - } - - $activityDateOccurred = sprintf( - '%s %02d:%02d:00', - DateUtility::convert( - '-', - $activityDate, - $dateFormatFlag, - DATE_FORMAT_YYYYMMDD - ), - $activityHour, - $activityMinute - ); + $activityDateOccurred = DateUtility::convert( + '-', $activityDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD + ) . ' ' . $timeStr; } } @@ -3274,23 +3263,31 @@ private function _addActivity($isJobOrdersMode, $regardingID, CommonErrors::fatalModal(COMMONERROR_MISSINGFIELDS, $this, 'Invalid minute.'); } - /* Bail out if we don't have a valid meridiem value. */ - if (!isset($_POST['meridiem']) || - ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + $hour = $_POST['hour']; + $minute = $_POST['minute']; + + if ($_SESSION['CATS']->isTimeFormat24()) { - $this->fatalModal( - 'Invalid meridiem value.', $moduleDirectory - ); + $time = strtotime(sprintf('%02d:%02d', $hour, $minute)); } + else + { + /* Bail out if we don't have a valid meridiem value. */ + if (!isset($_POST['meridiem']) || + ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + { + $this->fatalModal( + 'Invalid meridiem value.', $moduleDirectory + ); + } - $hour = $_POST['hour']; - $minute = $_POST['minute']; - $meridiem = $_POST['meridiem']; + $meridiem = $_POST['meridiem']; - /* Convert formatted time to UNIX timestamp. */ - $time = strtotime( - sprintf('%s:%s %s', $hour, $minute, $meridiem) - ); + /* Convert formatted time to UNIX timestamp. */ + $time = strtotime( + sprintf('%s:%s %s', $hour, $minute, $meridiem) + ); + } /* Create MySQL date string w/ 24hr time (YYYY-MM-DD HH:MM:SS). */ $date = sprintf( diff --git a/modules/candidates/Show.tpl b/modules/candidates/Show.tpl index 085fc2494..13c8320cc 100755 --- a/modules/candidates/Show.tpl +++ b/modules/candidates/Show.tpl @@ -15,7 +15,8 @@ use OpenCATS\UI\CandidateDuplicateQuickActionMenu;
diff --git a/modules/companies/Show.tpl b/modules/companies/Show.tpl index e0fddbde3..1b2547586 100755 --- a/modules/companies/Show.tpl +++ b/modules/companies/Show.tpl @@ -5,6 +5,10 @@ use OpenCATS\UI\QuickActionMenu; data['name'], array( 'js/activity.js', 'js/sorttable.js', 'js/attachment.js')); ?> active); ?> +
diff --git a/modules/contacts/AddActivityScheduleEventModal.tpl b/modules/contacts/AddActivityScheduleEventModal.tpl index 0e0605ae0..4bd75ffa9 100755 --- a/modules/contacts/AddActivityScheduleEventModal.tpl +++ b/modules/contacts/AddActivityScheduleEventModal.tpl @@ -33,9 +33,15 @@     + isTimeFormat24()): ?> + @@ -116,9 +124,15 @@
    + isTimeFormat24()): ?> +
@@ -189,14 +205,15 @@ if (!onlyScheduleEvent ? 'true' : 'false'); ?>) { var now = new Date(); + isTimeFormat24()): ?> + document.getElementById('activityHour').value = now.getHours().toString(); + var currentHour = now.getHours() % 12; - if (currentHour == 0) - { - currentHour = 12; - } + if (currentHour == 0) { currentHour = 12; } document.getElementById('activityHour').value = currentHour.toString(); - document.getElementById('activityMinute').value = (now.getMinutes() < 10 ? '0' : '') + now.getMinutes(); document.getElementById('activityMeridiem').value = (now.getHours() >= 12 ? 'PM' : 'AM'); + + document.getElementById('activityMinute').value = (now.getMinutes() < 10 ? '0' : '') + now.getMinutes(); document.logActivityForm.activityNote.focus(); } else diff --git a/modules/contacts/ContactsUI.php b/modules/contacts/ContactsUI.php index 929262622..ff0f183d9 100755 --- a/modules/contacts/ContactsUI.php +++ b/modules/contacts/ContactsUI.php @@ -1364,41 +1364,30 @@ private function _addActivityScheduleEvent($regardingID, $directoryOverride = '' $activityNote = $this->getTrimmedInput('activityNote', $_POST); $activityDateOccurred = false; + $isTimeFormat24 = $_SESSION['CATS']->isTimeFormat24(); $dateFormatFlag = $_SESSION['CATS']->isDateDMY() ? DATE_FORMAT_DDMMYY : DATE_FORMAT_MMDDYY; $activityDate = $this->getTrimmedInput('activityDate', $_POST); + $activityHourSet = isset($_POST['activityHour']) && isset($_POST['activityMinute']) && + ctype_digit((string) $_POST['activityHour']) && + ctype_digit((string) $_POST['activityMinute']); + $activityMeridiemOk = $isTimeFormat24 || + (isset($_POST['activityMeridiem']) && + ($_POST['activityMeridiem'] == 'AM' || $_POST['activityMeridiem'] == 'PM')); if (!empty($activityDate) && DateUtility::validate('-', $activityDate, $dateFormatFlag) && - isset($_POST['activityHour']) && isset($_POST['activityMinute']) && - isset($_POST['activityMeridiem']) && - ctype_digit((string) $_POST['activityHour']) && - ctype_digit((string) $_POST['activityMinute']) && - ($_POST['activityMeridiem'] == 'AM' || $_POST['activityMeridiem'] == 'PM')) + $activityHourSet && $activityMeridiemOk) { - $activityHour = (int) $_POST['activityHour']; - $activityMinute = (int) $_POST['activityMinute']; - - if ($activityHour >= 1 && $activityHour <= 12 && - $activityMinute >= 0 && $activityMinute <= 59) + $activityMeridiem = $isTimeFormat24 ? '' : (isset($_POST['activityMeridiem']) ? $_POST['activityMeridiem'] : ''); + $timeStr = DateUtility::normalizeActivityTime( + $_POST['activityHour'], $_POST['activityMinute'], $activityMeridiem, $isTimeFormat24 + ); + if ($timeStr !== false) { - $activityHour = $activityHour % 12; - if ($_POST['activityMeridiem'] == 'PM') - { - $activityHour += 12; - } - - $activityDateOccurred = sprintf( - '%s %02d:%02d:00', - DateUtility::convert( - '-', - $activityDate, - $dateFormatFlag, - DATE_FORMAT_YYYYMMDD - ), - $activityHour, - $activityMinute - ); + $activityDateOccurred = DateUtility::convert( + '-', $activityDate, $dateFormatFlag, DATE_FORMAT_YYYYMMDD + ) . ' ' . $timeStr; } } @@ -1495,21 +1484,29 @@ private function _addActivityScheduleEvent($regardingID, $directoryOverride = '' CommonErrors::fatalModal(COMMONERROR_MISSINGFIELDS, $this, 'Invalid minute.'); } - /* Bail out if we don't have a valid meridiem value. */ - if (!isset($_POST['meridiem']) || - ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + $hour = $_POST['hour']; + $minute = $_POST['minute']; + + if ($_SESSION['CATS']->isTimeFormat24()) { - CommonErrors::fatalModal(COMMONERROR_MISSINGFIELDS, $this, 'Invalid meridiem value.'); + $time = strtotime(sprintf('%02d:%02d', $hour, $minute)); } + else + { + /* Bail out if we don't have a valid meridiem value. */ + if (!isset($_POST['meridiem']) || + ($_POST['meridiem'] != 'AM' && $_POST['meridiem'] != 'PM')) + { + CommonErrors::fatalModal(COMMONERROR_MISSINGFIELDS, $this, 'Invalid meridiem value.'); + } - $hour = $_POST['hour']; - $minute = $_POST['minute']; - $meridiem = $_POST['meridiem']; + $meridiem = $_POST['meridiem']; - /* Convert formatted time to UNIX timestamp. */ - $time = strtotime( - sprintf('%s:%s %s', $hour, $minute, $meridiem) - ); + /* Convert formatted time to UNIX timestamp. */ + $time = strtotime( + sprintf('%s:%s %s', $hour, $minute, $meridiem) + ); + } /* Create MySQL date string w/ 24hr time (YYYY-MM-DD HH:MM:SS). */ $date = sprintf( diff --git a/modules/contacts/Show.tpl b/modules/contacts/Show.tpl index c0137ebbd..050aa5b58 100755 --- a/modules/contacts/Show.tpl +++ b/modules/contacts/Show.tpl @@ -7,7 +7,8 @@ use OpenCATS\UI\QuickActionMenu; active); ?>
diff --git a/modules/home/dataGrids.php b/modules/home/dataGrids.php index ba1d72812..ef07a1cb0 100644 --- a/modules/home/dataGrids.php +++ b/modules/home/dataGrids.php @@ -76,6 +76,9 @@ public function __construct($siteID, $parameters) $this->_assignedCriterion = ""; $this->_candidateIDColumn = 'company.company_id'; + $rawTimeFormat = (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24()) + ? '%H:%i' : '%h:%i %p'; + $this->_classColumns = array( 'First Name' => array('pagerRender' => '$ret = \'\'; if ($rsData[\'isHot\'] == 1) $className = \'jobLinkHot\'; else $className = \'jobLinkCold\'; return $ret.\' \'.htmlspecialchars($rsData[\'firstName\']).\'\';', @@ -114,7 +117,7 @@ public function __construct($siteID, $parameters) 'sortableColumn' => 'dateModifiedSort', 'pagerWidth' => 70, 'pagerOptional' => true, - 'filterHaving' => 'DATE_FORMAT(candidate_joborder.date_modified, \'%m-%d-%y (%%h:%%i %%p)\')'), + 'filterHaving' => 'DATE_FORMAT(candidate_joborder.date_modified, \'%m-%d-%y (' . $rawTimeFormat . ')\')'), ); parent::__construct("home:ImportantPipelineDashboard", $parameters); @@ -300,7 +303,7 @@ public function getSQL($selectSQL, $joinSQL, $whereSQL, $havingSQL, $orderSQL, $ activity.notes AS notes, activity_type.short_description AS typeDescription, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y %%h:%%i %%p' + activity.date_occurred, '" . (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24() ? '%%m-%%d-%%y %%H:%%i' : '%%m-%%d-%%y %%h:%%i %%p') . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, entered_by_user.first_name AS enteredByFirstName, @@ -354,7 +357,7 @@ public function getSQL($selectSQL, $joinSQL, $whereSQL, $havingSQL, $orderSQL, $ activity.notes AS notes, activity_type.short_description AS typeDescription, DATE_FORMAT( - activity.date_occurred, '%%m-%%d-%%y %%h:%%i %%p' + activity.date_occurred, '" . (isset($_SESSION['CATS']) && $_SESSION['CATS']->isTimeFormat24() ? '%%m-%%d-%%y %%H:%%i' : '%%m-%%d-%%y %%h:%%i %%p') . "' ) AS dateCreated, activity.date_occurred AS dateCreatedSort, entered_by_user.first_name AS enteredByFirstName, diff --git a/modules/import/Import.php b/modules/import/Import.php index be86656e1..5e223db04 100755 --- a/modules/import/Import.php +++ b/modules/import/Import.php @@ -178,7 +178,7 @@ public function getAll() import.site_id AS siteID, import.import_errors AS importErrors, DATE_FORMAT( - import.date_created, '%%m-%%d-%%y (%%h:%%i %%p)' + import.date_created, '" . DateUtility::getMysqlDateTimeFormat() . "' ) AS dateCreated FROM import From 2c4a68bf2114b7ff880fbc3db4b299c18a80b4e6 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:00:00 +0200 Subject: [PATCH 6/7] Add installer support for time format --- installwizard.php | 11 +++++++++++ modules/install/ajax/ui.php | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/installwizard.php b/installwizard.php index b59c6e9a7..158b1674b 100755 --- a/installwizard.php +++ b/installwizard.php @@ -488,6 +488,17 @@ + + Please choose your preferred time format. + + + + + + Please enter your default phone country calling code. diff --git a/modules/install/ajax/ui.php b/modules/install/ajax/ui.php index cc601d92f..4a3e84d7c 100755 --- a/modules/install/ajax/ui.php +++ b/modules/install/ajax/ui.php @@ -505,6 +505,7 @@ } $onClick .= '&timeZone=\' + encodeURIComponent(document.getElementById(\'timeZone\').value) + \''; $onClick .= '&dateFormat=\' + encodeURIComponent(document.getElementById(\'dateFormat\').value) + \''; + $onClick .= '&timeFormat=\' + encodeURIComponent(document.getElementById(\'timeFormat\').value) + \''; $onClick .= '&defaultPhoneCountryCodeDigits=\' + encodeURIComponent(document.getElementById(\'defaultPhoneCountryCodeDigits\').value));'; echo '