From 8f038d2f9529e3d1ffbb08b0dc05931e958f28fc Mon Sep 17 00:00:00 2001 From: Anne-Catherine <57360138+accognet@users.noreply.github.com> Date: Thu, 2 Oct 2025 15:40:16 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B02683=20-=20EnhancedSLAComputation:=20use?= =?UTF-8?q?=20common=20extension=20mechanism=20(#744)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/dbobject.class.php | 2 +- core/metamodel.class.php | 26 +++ core/ormstopwatch.class.inc.php | 4 +- .../datamodel.itop-sla-computation.xml | 12 -- .../cs.dict.itop-sla-computation.php | 25 --- .../da.dict.itop-sla-computation.php | 25 --- .../de.dict.itop-sla-computation.php | 25 --- .../en.dict.itop-sla-computation.php | 26 --- .../en_gb.dict.itop-sla-computation.php | 26 --- .../es_cr.dict.itop-sla-computation.php | 12 -- .../fr.dict.itop-sla-computation.php | 25 --- .../hu.dict.itop-sla-computation.php | 25 --- .../it.dict.itop-sla-computation.php | 25 --- .../ja.dict.itop-sla-computation.php | 25 --- .../nl.dict.itop-sla-computation.php | 25 --- .../pl.dict.itop-sla-computation.php | 25 --- .../pt_br.dict.itop-sla-computation.php | 25 --- .../ru.dict.itop-sla-computation.php | 15 -- .../sk.dict.itop-sla-computation.php | 25 --- .../tr.dict.itop-sla-computation.php | 25 --- .../zh_cn.dict.itop-sla-computation.php | 25 --- .../main.itop-sla-computation.php | 159 +----------------- .../module.itop-sla-computation.php | 0 setup/compiler.class.inc.php | 5 + 24 files changed, 40 insertions(+), 572 deletions(-) delete mode 100644 datamodels/2.x/itop-sla-computation/datamodel.itop-sla-computation.xml delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/cs.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/da.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/de.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/en.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/en_gb.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/es_cr.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/fr.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/hu.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/it.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/ja.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/nl.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/pt_br.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/ru.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/sk.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/tr.dict.itop-sla-computation.php delete mode 100644 datamodels/2.x/itop-sla-computation/dictionaries/zh_cn.dict.itop-sla-computation.php mode change 100755 => 100644 datamodels/2.x/itop-sla-computation/main.itop-sla-computation.php mode change 100755 => 100644 datamodels/2.x/itop-sla-computation/module.itop-sla-computation.php diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 95c12b828..e4b8a9ff4 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -4927,7 +4927,7 @@ abstract class DBObject implements iDisplay { if (is_null($sWorkingTimeComputer)) { - $sWorkingTimeComputer = class_exists('SLAComputation') ? 'SLAComputation' : 'DefaultWorkingTimeComputer'; + $sWorkingTimeComputer = MetaModel::GetWorkingTime(get_class($this)); } $oComputer = new $sWorkingTimeComputer(); $aCallSpec = array($oComputer, 'GetOpenDuration'); diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 3b6c246d6..3375e991d 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -399,6 +399,32 @@ abstract class MetaModel return null; } + final public static function GetDefaultWorkingTime() + { + return 'DefaultWorkingTimeComputer'; + } + + /** + * @param string $sClass + * + * @return string the working time class + * @throws \CoreException + * @since 3.3.0 + */ + final public static function GetWorkingTime($sClass) + { + self::_check_subclass($sClass); + + if (array_key_exists('working_time', self::$m_aClassParams[$sClass])) { + return self::$m_aClassParams[$sClass]['working_time']; + } else { + $sParentClass = self::GetParentPersistentClass($sClass); + if (strlen($sParentClass) > 0) { + return self::GetWorkingTime($sParentClass); + } + } + return self::GetDefaultWorkingTime(); + } /** * @param string $sClass * diff --git a/core/ormstopwatch.class.inc.php b/core/ormstopwatch.class.inc.php index f8e38da0f..2f77667b3 100644 --- a/core/ormstopwatch.class.inc.php +++ b/core/ormstopwatch.class.inc.php @@ -289,7 +289,7 @@ class ormStopWatch $sWorkingTimeComputer = $oAttDef->Get('working_time_computing'); if ($sWorkingTimeComputer == '') { - $sWorkingTimeComputer = class_exists('SLAComputation') ? 'SLAComputation' : 'DefaultWorkingTimeComputer'; + $sWorkingTimeComputer = MetaModel::GetWorkingTime(get_class($oObject)); } $oComputer = new $sWorkingTimeComputer(); $aCallSpec = array($oComputer, 'GetDeadline'); @@ -318,7 +318,7 @@ class ormStopWatch $sWorkingTimeComputer = $oAttDef->Get('working_time_computing'); if ($sWorkingTimeComputer == '') { - $sWorkingTimeComputer = class_exists('SLAComputation') ? 'SLAComputation' : 'DefaultWorkingTimeComputer'; + $sWorkingTimeComputer = MetaModel::GetWorkingTime(get_class($oObject)); } $oComputer = new $sWorkingTimeComputer(); $aCallSpec = array($oComputer, 'GetOpenDuration'); diff --git a/datamodels/2.x/itop-sla-computation/datamodel.itop-sla-computation.xml b/datamodels/2.x/itop-sla-computation/datamodel.itop-sla-computation.xml deleted file mode 100644 index 8c7a4acb0..000000000 --- a/datamodels/2.x/itop-sla-computation/datamodel.itop-sla-computation.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/cs.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/cs.dict.itop-sla-computation.php deleted file mode 100644 index ef8abdc01..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/cs.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('CS CZ', 'Czech', 'Čeština', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/da.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/da.dict.itop-sla-computation.php deleted file mode 100644 index c334a1b47..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/da.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('DA DA', 'Danish', 'Dansk', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/de.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/de.dict.itop-sla-computation.php deleted file mode 100644 index 8cf9a4957..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/de.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('DE DE', 'German', 'Deutsch', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/en.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/en.dict.itop-sla-computation.php deleted file mode 100644 index 555c82307..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/en.dict.itop-sla-computation.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -Dict::Add('EN US', 'English', 'English', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/en_gb.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/en_gb.dict.itop-sla-computation.php deleted file mode 100644 index 8308d6eea..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/en_gb.dict.itop-sla-computation.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -Dict::Add('EN GB', 'British English', 'British English', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/es_cr.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/es_cr.dict.itop-sla-computation.php deleted file mode 100644 index a22194dd0..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/es_cr.dict.itop-sla-computation.php +++ /dev/null @@ -1,12 +0,0 @@ - - * @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales - */ -Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/fr.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/fr.dict.itop-sla-computation.php deleted file mode 100644 index 6aee58321..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/fr.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('FR FR', 'French', 'Français', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/hu.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/hu.dict.itop-sla-computation.php deleted file mode 100644 index 488d1cc4a..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/hu.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('HU HU', 'Hungarian', 'Magyar', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/it.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/it.dict.itop-sla-computation.php deleted file mode 100644 index 80e7164e8..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/it.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('IT IT', 'Italian', 'Italiano', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/ja.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/ja.dict.itop-sla-computation.php deleted file mode 100644 index 14d7ec5b6..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/ja.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('JA JP', 'Japanese', '日本語', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/nl.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/nl.dict.itop-sla-computation.php deleted file mode 100644 index 397cb5aa2..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/nl.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('NL NL', 'Dutch', 'Nederlands', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php deleted file mode 100644 index ada3bd825..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('PL PL', 'Polish', 'Polski', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/pt_br.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/pt_br.dict.itop-sla-computation.php deleted file mode 100644 index 260282dd4..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/pt_br.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/ru.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/ru.dict.itop-sla-computation.php deleted file mode 100644 index 8390045f5..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/ru.dict.itop-sla-computation.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - */ -Dict::Add('RU RU', 'Russian', 'Русский', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/sk.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/sk.dict.itop-sla-computation.php deleted file mode 100644 index 5fa616311..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/sk.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('SK SK', 'Slovak', 'Slovenčina', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/tr.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/tr.dict.itop-sla-computation.php deleted file mode 100644 index 4f74143f6..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/tr.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('TR TR', 'Turkish', 'Türkçe', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/zh_cn.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/zh_cn.dict.itop-sla-computation.php deleted file mode 100644 index fafe9e9fe..000000000 --- a/datamodels/2.x/itop-sla-computation/dictionaries/zh_cn.dict.itop-sla-computation.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -Dict::Add('ZH CN', 'Chinese', '简体中文', array( - // Dictionary entries go here -)); diff --git a/datamodels/2.x/itop-sla-computation/main.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/main.itop-sla-computation.php old mode 100755 new mode 100644 index ef02c08d2..0be798850 --- a/datamodels/2.x/itop-sla-computation/main.itop-sla-computation.php +++ b/datamodels/2.x/itop-sla-computation/main.itop-sla-computation.php @@ -18,177 +18,30 @@ /** - * Module itop-sla-computation: implements an extensible mechanism + * Module itop-sla-computation: deprecated * * @copyright Copyright (C) 2010-2024 Combodo SAS * @license http://opensource.org/licenses/AGPL-3.0 */ /** - * Implements the public interface for utilities - * related to the SLA computation + * @deprecated 3.3.0 This is actually a breaking change. The class has been left to ease migration to 3.3.0 (see N°2683) */ -class SLAComputation implements iWorkingTimeComputer -{ - /** - * @var \SLAComputationAddOnAPI - */ - protected static $m_oAddOn; +class SLAComputation { /** - * Generic "extensibility" method: select which extension is actually used - * - * @param string $sClassName The name of the class (derived from SLAComputationAddOnAPI) to use - * - * @return void - * @throws \CoreException - * - * @deprecated will be removed soon (see N°2683) + * @deprecated 3.3.0 This is actually a breaking change. The function has been left to ease migration to 3.3.0 (see N°2683) */ public static function SelectModule($sClassName) { - // cannot notify depreciation for now as this is still MASSIVELY used in iTop core ! - //DeprecatedCallsLog::NotifyDeprecatedPhpMethod(); - if (!class_exists($sClassName)) { - throw new CoreException("Could not select this module, '$sClassName' in not a valid class name"); - } - if (($sClassName != 'SLAComputationAddOnAPI') && !is_subclass_of($sClassName, 'SLAComputationAddOnAPI')) { - throw new CoreException("Could not select this module, the class '$sClassName' is not derived from SLAComputationAddOnAPI (parent class:".get_parent_class($sClassName)." )"); - } - self::$m_oAddOn = new $sClassName; - self::$m_oAddOn->Init(); + //DeprecatedCallsLog::NotifyDeprecatedPhpMethod('Removed Class SLAComputation'); } - /** - * Get the class of the extension actually used - * - * @return string The name of the extension class used - */ - public static function GetModuleInstance() - { - return self::$m_oAddOn; - } - - public static function GetDescription() - { - return "SLA computation (depends on the installed module)"; - } - - /** - * Get the date/time corresponding to a given delay in the future from the present - * considering only the valid (open) hours for a specified object - * - * @param Ticket $oObject The object for which to compute the deadline - * @param integer $iDuration The duration (in seconds) in the future - * @param DateTime $oStartDate The starting point for the computation - * - * @return DateTime The date/time for the deadline - * @throws \Exception - */ - public function GetDeadline($oObject, $iDuration, DateTime $oStartDate) - { - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::Trace(WorkingTimeRecorder::TRACE_DEBUG, __class__.'::'.__function__); - } - $oEndDate = self::$m_oAddOn->GetDeadline($oObject, $iDuration, $oStartDate); - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::SetValues($oStartDate->format('U'), $oEndDate->format('U'), $iDuration, WorkingTimeRecorder::COMPUTED_END); - } - - return $oEndDate; - } - - /** - * Get duration (considering only open hours) elapsed between two given DateTimes - * - * @param Ticket $oObject The object for which to compute the duration - * @param DateTime $oStartDate The starting point for the computation (default = now) - * @param DateTime $oEndDate The ending point for the computation (default = now) - * - * @return integer The duration (number of seconds) of open hours elapsed between the two dates - * @throws \Exception - */ - public function GetOpenDuration($oObject, DateTime $oStartDate, DateTime $oEndDate) - { - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::Trace(WorkingTimeRecorder::TRACE_DEBUG, __class__.'::'.__function__); - } - $iDuration = self::$m_oAddOn->GetOpenDuration($oObject, $oStartDate, $oEndDate); - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::SetValues($oStartDate->format('U'), $oEndDate->format('U'), $iDuration, - WorkingTimeRecorder::COMPUTED_DURATION); - } - - return $iDuration; - } } /** - * Base class for extensions to the SLA computation mechanism - * This class implements a default behavior, suitable for a simple - * 24x7 (no holiday) computation. To override this behavior, implement - * a derived class from this one, overloading the behavior, and call - * SLAComputation::SetExtension() - * - * @deprecated will be removed soon (see N°2683) + * @deprecated 3.3.0 This is actually a breaking change. The class has been left to ease migration to 3.3.0 (see N°2683) */ class SLAComputationAddOnAPI { - /** - * Called when the module is loaded, used for one time initialization (if needed) - */ - public function Init() - { - // cannot notify depreciation for now as this is still MASSIVELY used in iTop core ! - //DeprecatedCallsLog::NotifyDeprecatedPhpMethod(); - } - - /** - * Get the date/time corresponding to a given delay in the future from the present - * considering only the valid (open) hours for a specified ticket - * - * @param Ticket $oTicket The ticket for which to compute the deadline - * @param integer $iDuration The duration (in seconds) in the future - * @param DateTime $oStartDate The starting point for the computation - * - * @return DateTime The date/time for the deadline - */ - public static function GetDeadline($oTicket, $iDuration, DateTime $oStartDate) - { - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::Trace(WorkingTimeRecorder::TRACE_DEBUG, __class__.'::'.__function__); - } - // Default implementation: 24x7, no holidays: to compute the deadline, just add - // the specified duration to the given date/time - $oResult = clone $oStartDate; - $oResult->modify($iDuration.' seconds'); - - return $oResult; - } - - /** - * Get duration (considering only open hours) elapsed between two given DateTimes - * - * @param Ticket $oTicket The ticket for which to compute the duration - * @param DateTime $oStartDate The starting point for the computation (default = now) - * @param DateTime $oEndDate The ending point for the computation (default = now) - * - * @return integer The duration (number of seconds) of open hours elapsed between the two dates - */ - public static function GetOpenDuration($oTicket, DateTime $oStartDate, DateTime $oEndDate) - { - if (class_exists('WorkingTimeRecorder')) - { - WorkingTimeRecorder::Trace(WorkingTimeRecorder::TRACE_DEBUG, __class__.'::'.__function__); - } - - return abs($oEndDate->format('U') - $oStartDate->format('U')); - } } - -SLAComputation::SelectModule('SLAComputationAddOnAPI'); diff --git a/datamodels/2.x/itop-sla-computation/module.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/module.itop-sla-computation.php old mode 100755 new mode 100644 diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 08da04706..5a6ac60f7 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -1332,6 +1332,11 @@ EOF $aClassParams['is_link'] = 'true'; } + $oWorkingTimeClass = $oProperties->GetOptionalElement('working_time'); + if ($oWorkingTimeClass) { + $sWorkingTimeClass = $oWorkingTimeClass->GetText(); + $aClassParams['working_time'] = "'$sWorkingTimeClass'"; + } // Naming $sComplementaryNameAttCode = ""; if ($oNaming = $oProperties->GetOptionalElement('naming')) {