diff --git a/README.md b/README.md index 588c466af..37efef034 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Informations - Numéro du module : 436302 -- Dernière mise à jour : 23/04/2024 +- Dernière mise à jour : 17/05/2024 - Éditeur : [Evarisk](https://evarisk.com) - Thème : Eldy Menu - Licence : GPLv3 @@ -11,10 +11,10 @@ ### Version -- Version : 10.0.0 +- Version : 10.1.0 - PHP : 7.4.33 -- Compatibilité : Dolibarr 16.0.0 - 19.0.1 -- Saturne Framework : 1.3.0 +- Compatibilité : Dolibarr 16.0.0 - 19.0.2 +- Saturne Framework : 1.4.0 ## Liens diff --git a/admin/config/digiriskelement.php b/admin/config/digiriskelement.php index 7c59cecb2..c16e2004f 100644 --- a/admin/config/digiriskelement.php +++ b/admin/config/digiriskelement.php @@ -61,6 +61,17 @@ // Actions set_mod, update_mask require_once __DIR__ . '/../../../saturne/core/tpl/actions/admin_conf_actions.tpl.php'; +if ($action == 'update') { + $digiriskElementDepthGraph = GETPOST('DigiriskElementDepthGraph', 'int'); + if ($digiriskElementDepthGraph > -1) { + dolibarr_set_const($db, 'DIGIRISKDOLIBARR_DIGIRISKELEMENT_DEPTH_GRAPH', $digiriskElementDepthGraph, 'integer', 0, '', $conf->entity); + } + + setEventMessage($langs->trans('SavedConfig')); + header('Location: ' . $_SERVER['PHP_SELF']); + exit; +} + /* * View */ @@ -97,9 +108,31 @@ $object = new WorkUnit($db); print load_fiche_titre($pictos['workunit'] . $langs->trans('WorkUnitManagement'), '', ''); -print '
'; require __DIR__ . '/../../../saturne/core/tpl/admin/object/object_numbering_module_view.tpl.php'; +print '
'; + +print load_fiche_titre($langs->trans('Config'), '', ''); + +print '
'; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +print ''; +print ''; +print ''; +print ''; + +print '
' . $langs->trans('Name') . '' . $langs->trans('Description') . '' . $langs->trans('Value') . '' . $langs->trans('Action') . '
' . $langs->trans("DigiriskElementDepthGraphDescription") . ''; +print '
'; +print '
'; /* * Deleted elements diff --git a/class/accidentinvestigation.class.php b/class/accidentinvestigation.class.php index b915e3cf9..0f8966f60 100644 --- a/class/accidentinvestigation.class.php +++ b/class/accidentinvestigation.class.php @@ -325,14 +325,14 @@ public function getTriggerDescription(SaturneObject $object): string } $ret = parent::getTriggerDescription($object); - $ret .= $langs->transnoentities('Accident') . ' : ' . $accident->ref . ' - ' . $accident->label . '
'; - $ret .= ($object->fk_task > 0 ? $langs->transnoentities('Task') . ' : ' . $task->ref . ' - ' . $task->label . '
': ''); - $ret .= (dol_strlen($object->seniority_in_position) > 0 ? $langs->transnoentities('SeniorityInPosition') . ' : ' . $object->seniority_in_position . '
' : ''); - $ret .= (dol_strlen($object->victim_skills) > 0 ? $langs->transnoentities('VictimSkills') . ' : ' . $object->victim_skills . '
' : ''); - $ret .= (dol_strlen($object->collective_equipment) > 0 ? $langs->transnoentities('CollectiveEquipment') . ' : ' . $object->collective_equipment . '
' : ''); - $ret .= (dol_strlen($object->individual_equipment) > 0 ? $langs->transnoentities('IndividualEquipment') . ' : ' . $object->individual_equipment . '
' : ''); - $ret .= (dol_strlen($object->circumstances) > 0 ? $langs->transnoentities('Circumstances') . ' : ' . $object->circumstances . '
' : ''); - $ret .= (dol_strlen($object->causality_tree) > 0 ? $langs->transnoentities('CausalityTree') . ' : ' . $object->causality_tree . '
' : ''); + $ret .= $langs->transnoentities('Accident') . ' : ' . $accident->ref . ' - ' . $accident->label . '
'; + $ret .= ($object->fk_task > 0 ? $langs->transnoentities('Task') . ' : ' . $task->ref . ' - ' . $task->label . '
': ''); + $ret .= (dol_strlen($object->seniority_in_position) > 0 ? $langs->transnoentities('SeniorityInPosition') . ' : ' . $object->seniority_in_position . '
' : ''); + $ret .= (dol_strlen($object->victim_skills) > 0 ? $langs->transnoentities('VictimSkills') . ' : ' . $object->victim_skills . '
' : ''); + $ret .= (dol_strlen($object->collective_equipment) > 0 ? $langs->transnoentities('CollectiveEquipment') . ' : ' . $object->collective_equipment . '
' : ''); + $ret .= (dol_strlen($object->individual_equipment) > 0 ? $langs->transnoentities('IndividualEquipment') . ' : ' . $object->individual_equipment . '
' : ''); + $ret .= (dol_strlen($object->circumstances) > 0 ? $langs->transnoentities('Circumstances') . ' : ' . $object->circumstances . '
' : ''); + $ret .= (dol_strlen($object->causality_tree) > 0 ? $langs->transnoentities('CausalityTree') . ' : ' . $object->causality_tree . '
' : ''); return $ret; } diff --git a/class/actions_digiriskdolibarr.class.php b/class/actions_digiriskdolibarr.class.php index 747eae69b..ad5f1addb 100644 --- a/class/actions_digiriskdolibarr.class.php +++ b/class/actions_digiriskdolibarr.class.php @@ -229,7 +229,7 @@ public function printCommonFooter($parameters) $linkedAccidentList = ''; if (is_array($linkedAccidents) && !empty($linkedAccidents)) { foreach ($linkedAccidents as $linkedAccident) { - $linkedAccidentList .= $linkedAccident->getNomUrl(1) . '
'; + $linkedAccidentList .= $linkedAccident->getNomUrl(1) . '
'; } } @@ -1098,6 +1098,36 @@ public function saturneBannerTabCustomSubdir(array $parameters, object $object): return 0; // or return 1 to replace standard code. } + /** + * Overloading the extendSheetLinkableObjectsList function : replacing the parent's function with the one below + * + * @param array $linkableObjectTypes Array of linkable objects + * @return int 0 < on error, 0 on success, 1 to replace standard code + */ + public function extendSheetLinkableObjectsList(array $linkableObjectTypes): int + { + require_once __DIR__ . '/firepermit.class.php'; + require_once __DIR__ . '/../lib/digiriskdolibarr_firepermit.lib.php'; + + $linkableObjectTypes['digiriskdolibarr_firepermit'] = [ + 'langs' => 'Firepermit', + 'langfile' => 'digiriskdolibarr@digiriskdolibarr', + 'picto' => 'fontawesome_fa-fire-alt_fas_#d35968', + 'className' => 'FirePermit', + 'name_field' => 'ref', + 'post_name' => 'fk_firepermit', + 'link_name' => 'digiriskdolibarr_firepermit', + 'tab_type' => 'firepermit', + 'hook_name_list' => 'firepermitlist', + 'hook_name_card' => 'firepermitcard', + 'create_url' => 'custom/digiriskdolibarr/view/firepermit/firepermit_card.php?action=create', + 'class_path' => 'custom/digiriskdolibarr/class/firepermit.class.php' + ]; + $this->results = $linkableObjectTypes; + + return 1; + } + /** * Add new actions buttons on CommonObject * diff --git a/class/digiriskdocuments.class.php b/class/digiriskdocuments.class.php index 9652d3c64..624eb0cd7 100644 --- a/class/digiriskdocuments.class.php +++ b/class/digiriskdocuments.class.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,12 +32,12 @@ class DigiriskDocuments extends SaturneDocuments { /** - * @var string Module name. + * @var string Module name */ public $module = 'digiriskdolibarr'; /** - * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management. + * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management */ public $table_element = 'saturne_object_documents'; @@ -165,16 +165,15 @@ public function fillRiskData(Odf $odfHandler, $object, Translate $outputLangs, $ { global $action, $conf, $hookmanager, $langs; - $usertmp = new User($this->db); - $project = new Project($this->db); - $DUProject = new Project($this->db); - $risk = new Risk($this->db); + $usertmp = new User($this->db); + $project = new Project($this->db); + $DUProject = new Project($this->db); + $risk = new Risk($this->db); $digiriskelementobject = new DigiriskElement($this->db); $DUProject->fetch($conf->global->DIGIRISKDOLIBARR_DU_PROJECT); - $activeDigiriskElements = $digiriskelementobject->getActiveDigiriskElements($allEntities ? 1 : 0); - $tasksSortedByRisk = $risk->getTasksWithFkRisk(); + $tasksSortedByRisk = $risk->getTasksWithFkRisk(); for ($i = 4; $i >= 1; $i--) { $foundTagForLines = 1; @@ -462,8 +461,8 @@ public function getTriggerDescription(SaturneObject $object): string $ret = parent::getTriggerDescription($object); - $ret .= $langs->transnoentities('ElementType') . ' : ' . $object->parent_type . '
'; - $ret .= $langs->transnoentities('ParentElement') . ' : ' . $parentElement->ref . ' ' . $parentElement->label . '
'; + $ret .= $langs->transnoentities('ElementType') . ' : ' . $object->parent_type . '
'; + $ret .= $langs->transnoentities('ParentElement') . ' : ' . $parentElement->ref . ' ' . $parentElement->label . '
'; $ret .= $langs->transnoentities('LastMainDoc') . ' : ' . $object->last_main_doc . '
'; return $ret; diff --git a/class/digiriskdolibarrdashboard.class.php b/class/digiriskdolibarrdashboard.class.php index 556559e81..f399880b9 100644 --- a/class/digiriskdolibarrdashboard.class.php +++ b/class/digiriskdolibarrdashboard.class.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,17 +18,9 @@ /** * \file class/digiriskdolibarrdashboard.class.php * \ingroup digiriskdolibarr - * \brief Class file for manage DigiriskDolibarrDashboard. + * \brief Class file for manage DigiriskDolibarrDashboard */ -// Load DigiriskDolibarr libraries -require_once __DIR__ . '/digiriskdolibarrdocuments/riskassessmentdocument.class.php'; -require_once __DIR__ . '/accident.class.php'; -require_once __DIR__ . '/evaluator.class.php'; -require_once __DIR__ . '/digiriskresources.class.php'; -require_once __DIR__ . '/riskanalysis/risk.class.php'; -require_once __DIR__ . '/../../saturne/class/task/saturnetask.class.php'; - /** * Class for DigiriskDolibarrDashboard */ @@ -50,38 +42,154 @@ public function __construct(DoliDB $db) } /** - * Load dashboard info - * - * @param array $moreParams Parameters for load dashboard info + * Load dashboard info for all digirisk dolibarr object * + * @param array $moreParams Parameters for load dashboard info * @return array $dashboardData Return all dashboardData after load info * @throws Exception */ public function load_dashboard(array $moreParams = []): array { - global $conf; - - $loadRiskAssessmentDocument = array_key_exists('loadRiskAssessmentDocument', $moreParams) ? $moreParams['loadRiskAssessmentDocument'] : 1; - $loadAccident = array_key_exists('loadAccident', $moreParams) ? $moreParams['loadAccident'] : 1; - $loadEvaluator = array_key_exists('loadEvaluator', $moreParams) ? $moreParams['loadEvaluator'] : 1; - $loadDigiriskResources = array_key_exists('loadDigiriskResources', $moreParams) ? $moreParams['loadDigiriskResources'] : 1; - $loadRisk = array_key_exists('loadRisk', $moreParams) ? $moreParams['loadRisk'] : 1; - $loadTask = array_key_exists('loadTask', $moreParams) ? $moreParams['loadTask'] : 1; - - $riskAssessmentDocument = new RiskAssessmentDocument($this->db); - $accident = new Accident($this->db); - $evaluator = new Evaluator($this->db); - $digiriskResources = new DigiriskResources($this->db); - $risk = new Risk($this->db); - $digiriskTask = new SaturneTask($this->db); - - $dashboardData['riskassessmentdocument'] = ($loadRiskAssessmentDocument) ? $riskAssessmentDocument->load_dashboard() : []; - $dashboardData['accident'] = ($loadAccident) ? $accident->load_dashboard() : []; - $dashboardData['evaluator'] = ($loadEvaluator) ? $evaluator->load_dashboard() : []; - $dashboardData['digiriskresources'] = ($loadDigiriskResources) ? $digiriskResources->load_dashboard() : []; - $dashboardData['risk'] = ($loadRisk) ? $risk->load_dashboard() : []; - $dashboardData['task'] = ($loadTask) ? $digiriskTask->load_dashboard($conf->global->DIGIRISKDOLIBARR_DU_PROJECT) : []; - - return $dashboardData; + $dashboardDatas = [ + ['type' => 'RiskAssessmentDocument', 'classPath' => '/digiriskdolibarrdocuments/riskassessmentdocument.class.php'], + ['type' => 'Accident', 'classPath' => '/accident.class.php'], + ['type' => 'Evaluator', 'classPath' => '/evaluator.class.php'], + ['type' => 'DigiriskResources', 'classPath' => '/digiriskresources.class.php'], + ['type' => 'DigiriskElement', 'classPath' => '/digiriskelement.class.php'], + ['type' => 'SaturneTask', 'classPath' => '/../../saturne/class/task/saturnetask.class.php'], + ['type' => 'Risk', 'classPath' => '/riskanalysis/risk.class.php'], + ['type' => 'TicketDashboard', 'classPath' => '/ticketdashboard.class.php'] + ]; + foreach ($dashboardDatas as $dashboardData) { + require_once __DIR__ . $dashboardData['classPath']; + if ($dashboardData['type'] != 'TicketDashboard') { + $className = new $dashboardData['type']($this->db); + } else { + $className = new TicketDashboard($this->db, $moreParams['join'], $moreParams['where']); + } + if ($dashboardData['type'] != 'SaturneTask') { + $array[$dashboardData['type']] = array_key_exists('Load' . $dashboardData['type'], $moreParams) ? $className->load_dashboard() : []; + } else { + $array[$dashboardData['type']] = array_key_exists('Load' . $dashboardData['type'], $moreParams) ? $className->load_dashboard(getDolGlobalInt('DIGIRISKDOLIBARR_DU_PROJECT')) : []; + } + } + + return $array; + } + + /** + * Return nb of elements by month for several years + * + * @param int $endYear Start year + * @param int $startYear End year + * @param int $startMonth month of the fiscal year start min 1 max 12 ; if 1 = january + * @return array Array of values + */ + public function getNbByMonthWithPrevYear(int $startYear, int $endYear, int $startMonth = 1) + { + if ($startYear > $endYear) { + return -1; + } + + $datay = []; + $year = $startYear; + $sm = $startMonth - 1; + if ($sm != 0) { + $year = $year - 1; + } + while ($year <= $endYear) { + $datay[$year] = $this->getNbByMonth($year); + $year++; + } + + $data = []; + for ($i = 0; $i < 12; $i++) { + $data[$i][] = $datay[$endYear][($i + $sm) % 12][0]; + $year = $startYear; + while ($year <= $endYear) { + $data[$i][] = $datay[$year][($i + $sm) % 12][1]; + $year++; + } + } + + return $data; + } + + //@todo a bouger dans Saturne + /** + * Return nb of elements, total amount and avg amount each year + * + * @param string $sql SQL request + * @return array $result Array with nb, average for each year + * @throws Exception + */ + protected function _getAllByYear(string $sql): array + { + dol_syslog(get_class($this) . '::' . __FUNCTION__, LOG_DEBUG); + + $result = []; + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < $num) { + $row = $this->db->fetch_object($resql); + $result[$i]['year'] = $row->year; + $result[$i]['nb'] = $row->nb; + if ($i > 0 && $row->nb > 0) { + $result[$i - 1]['avg'] = ($result[$i - 1]['nb']) / $row->nb * 100; + } + $i++; + } + $this->db->free($resql); + } else { + dol_print_error($this->db); + } + + return $result; + } + + //@todo a bouger dans Saturne + /** + * Return number of elements per month + * + * @param string $sql SQL request + * @return array $data Array of nb each month + * @throws Exception + */ + protected function _getNbByMonth(string $sql): array + { + global $langs; + + dol_syslog(get_class($this) . '::' . __FUNCTION__, LOG_DEBUG); + + $result = []; + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < $num) { + $row = $this->db->fetch_row($resql); + $j = $row[0] * 1; + $result[$j] = $row[1]; + $i++; + } + $this->db->free($resql); + } else { + dol_print_error($this->db); + } + + $res = []; + for ($i = 1; $i < 13; $i++) { + $res[$i] = ($result[$i] ?? 0); + } + + $data = []; + for ($i = 1; $i < 13; $i++) { + $month = $langs->transnoentitiesnoconv('MonthShort' . sprintf('%02d', $i)); + $data[$i - 1] = array($month, $res[$i]); + } + + return $data; } } diff --git a/class/digiriskelement.class.php b/class/digiriskelement.class.php index 339a1d063..7ea48ddd7 100644 --- a/class/digiriskelement.class.php +++ b/class/digiriskelement.class.php @@ -28,6 +28,7 @@ require_once __DIR__ . '/../../saturne/class/saturneobject.class.php'; require_once __DIR__ . '/../lib/digiriskdolibarr_function.lib.php'; +require_once __DIR__ . '/riskanalysis/risk.class.php'; /** * Class for DigiriskElement. @@ -529,4 +530,131 @@ public function getTriggerDescription(SaturneObject $object): string return $ret; } + + /** + * Load dashboard info digirisk element + * + * @return array + * @throws Exception + */ + public function load_dashboard(): array + { + $getDigiriskElementListsByDepth = $this->getDigiriskElementListsByDepth(); + $getRisksByDigiriskElement = $this->getRisksByDigiriskElement(); + + $array['graphs'] = [$getDigiriskElementListsByDepth, $getRisksByDigiriskElement]; + + return $array; + } + + /** + * Get list of risk by digirisk element + * + * @param string $riskType Risk type (risk, riskenvironmental or ...) + * + * @return array + * @throws Exception + */ + public function getRisksByDigiriskElement(string $riskType = 'risk'): array + { + global $conf, $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('RisksRepartitionByDigiriskElement'); + $array['picto'] = $this->picto; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 400; + $array['type'] = 'pie'; + $array['showlegend'] = $conf->browser->layout == 'phone' ? 1 : 2; + $array['dataset'] = 1; + + $digiriskElements = $this->fetchDigiriskElementFlat(GETPOSTISSET('id') ? GETPOST('id') : 0); + + // Get current digirisk element and add data in $digiriskElements array + if (GETPOSTISSET('id')) { + $currentDigiriskElement = $this->fetchAll('', '', 0, 0, ['customsql' => 't.rowid = ' . GETPOST('id')]); + if (is_array($currentDigiriskElement) && !empty($currentDigiriskElement)) { + $currentDigiriskElement = array_shift($currentDigiriskElement); + + $array['title'] = $langs->transnoentities('RisksRepartitionByDigiriskElement', ': ' . $currentDigiriskElement->ref . ' - ' . $currentDigiriskElement->label); + + $digiriskElement[$currentDigiriskElement->id]['object'] = $currentDigiriskElement; + $digiriskElements = array_merge($digiriskElement, $digiriskElements); + } + } + + if (!empty($digiriskElements)) { + foreach ($digiriskElements as $digiriskElement) { + $risks = saturne_fetch_all_object_type('Risk', '', '', 0, 0, ['customsql' => 't.status = ' . Risk::STATUS_VALIDATED . ' AND t.entity = ' . $conf->entity . ' AND t.type = "' . $riskType . '" AND t.fk_element = ' . $digiriskElement['object']->id]); + if (is_array($risks) && !empty($risks)) { + $array['labels'][$digiriskElement['object']->id] = [ + 'label' => $digiriskElement['object']->ref . ' - ' . $digiriskElement['object']->label, + 'color' => SaturneDashboard::getColorRange($digiriskElement['object']->id) + ]; + $array['data'][$digiriskElement['object']->id] = count($risks); + } + } + } + + return $array; + } + + /** + * Get list of digirisk elements by depth + * + * @return array + * @throws Exception + */ + public function getDigiriskElementListsByDepth(): array + { + global $conf, $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('DigiriskElementsRepartitionByDepth', getDolGlobalInt('DIGIRISKDOLIBARR_DIGIRISKELEMENT_DEPTH_GRAPH')); + $array['picto'] = $this->picto; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 400; + $array['type'] = 'pie'; + $array['showlegend'] = $conf->browser->layout == 'phone' ? 1 : 2; + $array['dataset'] = 1; + + $children = []; + $digiriskElements = $this->fetchDigiriskElementFlat(GETPOSTISSET('id') ? GETPOST('id') : 0); + + // Get current digirisk element and add data in $digiriskElements array + if (GETPOSTISSET('id')) { + $currentDigiriskElement = $this->fetchAll('', '', 0, 0, ['customsql' => 't.rowid = ' . GETPOST('id')]); + if (is_array($currentDigiriskElement) && !empty($currentDigiriskElement)) { + $currentDigiriskElement = array_shift($currentDigiriskElement); + + $array['title'] = $langs->transnoentities('DigiriskElementsRepartitionByDepth', ': ' . $currentDigiriskElement->ref . ' - ' . $currentDigiriskElement->label); + + $array['labels'][$currentDigiriskElement->id] = [ + 'label' => $currentDigiriskElement->ref . ' - ' . $currentDigiriskElement->label, + 'color' => SaturneDashboard::getColorRange($currentDigiriskElement->id) + ]; + } + } + + if (!empty($digiriskElements)) { + foreach ($digiriskElements as $digiriskElement) { + if ($digiriskElement['depth'] <= getDolGlobalInt('DIGIRISKDOLIBARR_DIGIRISKELEMENT_DEPTH_GRAPH') && $digiriskElement['object']->element_type == 'groupment') { + $array['labels'][$digiriskElement['object']->id] = [ + 'label' => $digiriskElement['object']->ref . ' - ' . $digiriskElement['object']->label, + 'color' => SaturneDashboard::getColorRange($digiriskElement['object']->id) + ]; + } + if ($digiriskElement['depth'] <= getDolGlobalInt('DIGIRISKDOLIBARR_DIGIRISKELEMENT_DEPTH_GRAPH') + 1 && $digiriskElement['object']->fk_parent > 0) { + $children[] = $digiriskElement['object']->fk_parent; + } + } + $array['data'] = array_count_values($children); + } + + return $array; + } } diff --git a/class/digiriskstats.php b/class/digiriskstats.php deleted file mode 100644 index ef6492d30..000000000 --- a/class/digiriskstats.php +++ /dev/null @@ -1,593 +0,0 @@ - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file class/digiriskstats.class.php - * \ingroup digiriskdolibarr - * \brief Common class to manage statistics reports - */ - -/** - * Parent class of statistics class - */ -abstract class DigiriskStats -{ - protected $db; - protected $lastfetchdate = array(); // Dates of cache file read by methods - public $cachefilesuffix = ''; // Suffix to add to name of cache file (to avoid file name conflicts) - - /** - * Return nb of elements by month for several years - * - * @param int $endyear Start year - * @param int $startyear End year - * @param int $cachedelay Delay we accept for cache file (0=No read, no save of cache, -1=No read but save) - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @param int $startmonth month of the fiscal year start min 1 max 12 ; if 1 = january - * @return array Array of values - */ - public function getNbByMonthWithPrevYear($endyear, $startyear, $cachedelay = 0, $format = 0, $startmonth = 1) - { - global $conf, $user, $langs; - - if ($startyear > $endyear) { - return -1; - } - - $datay = array(); - - // Search into cache - if (!empty($cachedelay)) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - include_once DOL_DOCUMENT_ROOT.'/core/lib/json.lib.php'; - } - - $newpathofdestfile = $conf->user->dir_temp.'/'.get_class($this).'_'.__FUNCTION__.'_'.(empty($this->cachefilesuffix) ? '' : $this->cachefilesuffix.'_').$langs->defaultlang.'_entity.'.$conf->entity.'_user'.$user->id.'.cache'; - $newmask = '0644'; - - $nowgmt = dol_now(); - - $foundintocache = 0; - if ($cachedelay > 0) { - $filedate = dol_filemtime($newpathofdestfile); - if ($filedate >= ($nowgmt - $cachedelay)) { - $foundintocache = 1; - - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $filedate; - } else { - dol_syslog(get_class($this).'::'.__FUNCTION__." cache file ".$newpathofdestfile." is not found or older than now - cachedelay (".$nowgmt." - ".$cachedelay.") so we can't use it."); - } - } - // Load file into $data - if ($foundintocache) { // Cache file found and is not too old - dol_syslog(get_class($this).'::'.__FUNCTION__." read data from cache file ".$newpathofdestfile." ".$filedate."."); - $data = json_decode(file_get_contents($newpathofdestfile), true); - } else { - $year = $startyear; - $sm = $startmonth - 1; - if ($sm != 0) { - $year = $year - 1; - } - while ($year <= $endyear) { - $datay[$year] = $this->getNbByMonth($year, $format); - $year++; - } - - $data = array(); - - for ($i = 0; $i < 12; $i++) { - $data[$i][] = $datay[$endyear][($i + $sm) % 12][0]; - $year = $startyear; - while ($year <= $endyear) { - $data[$i][] = $datay[$year][($i + $sm) % 12][1]; - $year++; - } - } - - } - - // Save cache file - if (empty($foundintocache) && ($cachedelay > 0 || $cachedelay == -1)) { - dol_syslog(get_class($this).'::'.__FUNCTION__." save cache file ".$newpathofdestfile." onto disk."); - if (!dol_is_dir($conf->user->dir_temp)) { - dol_mkdir($conf->user->dir_temp); - } - $fp = fopen($newpathofdestfile, 'w'); - fwrite($fp, json_encode($data)); - fclose($fp); - if (!empty($conf->global->MAIN_UMASK)) { - $newmask = $conf->global->MAIN_UMASK; - } - @chmod($newpathofdestfile, octdec($newmask)); - - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $nowgmt; - } - - // return array(array('Month',val1,val2,val3),...) - return $data; - } - - /** - * Return amount of elements by month for several years. - * Criterias used to build request are defined into the constructor of parent class into xxx/class/xxxstats.class.php - * The caller of class can add more filters into sql request by adding criteris into the $stats->where property just after - * calling constructor. - * - * @param int $endyear Start year - * @param int $startyear End year - * @param int $cachedelay Delay we accept for cache file (0=No read, no save of cache, -1=No read but save) - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @param int $startmonth month of the fiscal year start min 1 max 12 ; if 1 = january - * @return array Array of values - */ - public function getAmountByMonthWithPrevYear($endyear, $startyear, $cachedelay = 0, $format = 0, $startmonth = 1) - { - global $conf, $user, $langs; - - if ($startyear > $endyear) { - return -1; - } - - $datay = array(); - - // Search into cache - if (!empty($cachedelay)) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - include_once DOL_DOCUMENT_ROOT.'/core/lib/json.lib.php'; - } - - $newpathofdestfile = $conf->user->dir_temp.'/'.get_class($this).'_'.__FUNCTION__.'_'.(empty($this->cachefilesuffix) ? '' : $this->cachefilesuffix.'_').$langs->defaultlang.'_entity.'.$conf->entity.'_user'.$user->id.'.cache'; - $newmask = '0644'; - - $nowgmt = dol_now(); - - $foundintocache = 0; - if ($cachedelay > 0) { - $filedate = dol_filemtime($newpathofdestfile); - if ($filedate >= ($nowgmt - $cachedelay)) { - $foundintocache = 1; - - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $filedate; - } else { - dol_syslog(get_class($this).'::'.__FUNCTION__." cache file ".$newpathofdestfile." is not found or older than now - cachedelay (".$nowgmt." - ".$cachedelay.") so we can't use it."); - } - } - - // Load file into $data - if ($foundintocache) { // Cache file found and is not too old - dol_syslog(get_class($this).'::'.__FUNCTION__." read data from cache file ".$newpathofdestfile." ".$filedate."."); - $data = json_decode(file_get_contents($newpathofdestfile), true); - } else { - $year = $startyear; - $sm = $startmonth - 1; - if ($sm != 0) { - $year = $year - 1; - } - while ($year <= $endyear) { - $datay[$year] = $this->getAmountByMonth($year, $format); - $year++; - } - - $data = array(); - // $data = array('xval'=>array(0=>xlabel,1=>yval1,2=>yval2...),...) - for ($i = 0; $i < 12; $i++) { - $data[$i][] = isset($datay[$endyear][($i + $sm) % 12]['label']) ? $datay[$endyear][($i + $sm) % 12]['label'] : $datay[$endyear][($i + $sm) % 12][0]; // set label - $year = $startyear; - while ($year <= $endyear) { - $data[$i][] = $datay[$year][($i + $sm) % 12][1]; // set yval for x=i - $year++; - } - } - } - - // Save cache file - if (empty($foundintocache) && ($cachedelay > 0 || $cachedelay == -1)) { - dol_syslog(get_class($this).'::'.__FUNCTION__." save cache file ".$newpathofdestfile." onto disk."); - if (!dol_is_dir($conf->user->dir_temp)) { - dol_mkdir($conf->user->dir_temp); - } - $fp = fopen($newpathofdestfile, 'w'); - if ($fp) { - fwrite($fp, json_encode($data)); - fclose($fp); - if (!empty($conf->global->MAIN_UMASK)) { - $newmask = $conf->global->MAIN_UMASK; - } - @chmod($newpathofdestfile, octdec($newmask)); - } else { - dol_syslog("Failed to write cache file", LOG_ERR); - } - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $nowgmt; - } - - return $data; - } - - /** - * Return average of entity by month for several years - * - * @param int $endyear Start year - * @param int $startyear End year - * @param int $cachedelay Delay we accept for cache file (0=No read, no save of cache, -1=No read but save) - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @param int $startmonth month of the fiscal year start min 1 max 12 ; if 1 = january - * @return array Array of values - */ - public function getAverageByMonthWithPrevYear($endyear, $startyear, $cachedelay = 0, $format = 0, $startmonth = 1) - { - global $conf, $user, $langs; - - if ($startyear > $endyear) { - return -1; - } - - $datay = array(); - - // Search into cache - if (!empty($cachedelay)) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - include_once DOL_DOCUMENT_ROOT.'/core/lib/json.lib.php'; - } - - $newpathofdestfile = $conf->user->dir_temp.'/'.get_class($this).'_'.__FUNCTION__.'_'.(empty($this->cachefilesuffix) ? '' : $this->cachefilesuffix.'_').$langs->defaultlang.'_entity.'.$conf->entity.'_user'.$user->id.'.cache'; - $newmask = '0644'; - - $nowgmt = dol_now(); - - $foundintocache = 0; - if ($cachedelay > 0) { - $filedate = dol_filemtime($newpathofdestfile); - if ($filedate >= ($nowgmt - $cachedelay)) { - $foundintocache = 1; - - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $filedate; - } else { - dol_syslog(get_class($this).'::'.__FUNCTION__." cache file ".$newpathofdestfile." is not found or older than now - cachedelay (".$nowgmt." - ".$cachedelay.") so we can't use it."); - } - } - - // Load file into $data - if ($foundintocache) { // Cache file found and is not too old - dol_syslog(get_class($this).'::'.__FUNCTION__." read data from cache file ".$newpathofdestfile." ".$filedate."."); - $data = json_decode(file_get_contents($newpathofdestfile), true); - } else { - $year = $startyear; - $sm = $startmonth - 1; - if ($sm != 0) { - $year = $year - 1; - } - while ($year <= $endyear) { - $datay[$year] = $this->getAverageByMonth($year); - $year++; - } - - $data = array(); - - for ($i = 0; $i < 12; $i++) { - $data[$i][] = $datay[$endyear][($i + $sm) % 12][0]; - $year = $startyear; - while ($year <= $endyear) { - $data[$i][] = $datay[$year][($i + $sm) % 12][1]; - $year++; - } - } - } - - // Save cache file - if (empty($foundintocache) && ($cachedelay > 0 || $cachedelay == -1)) { - dol_syslog(get_class($this).'::'.__FUNCTION__." save cache file ".$newpathofdestfile." onto disk."); - if (!dol_is_dir($conf->user->dir_temp)) { - dol_mkdir($conf->user->dir_temp); - } - $fp = fopen($newpathofdestfile, 'w'); - if ($fp) { - fwrite($fp, json_encode($data)); - fclose($fp); - if (!empty($conf->global->MAIN_UMASK)) { - $newmask = $conf->global->MAIN_UMASK; - } - @chmod($newpathofdestfile, octdec($newmask)); - } else { - dol_syslog("Failed to write cache file", LOG_ERR); - } - $this->lastfetchdate[get_class($this).'_'.__FUNCTION__] = $nowgmt; - } - - return $data; - } - - // Here we have low level of shared code called by XxxStats.class.php - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Return nb of elements by year - * - * @param string $sql SQL request - * @return array - */ - protected function _getNbByYear($sql) - { - // phpcs:enable - $result = array(); - - dol_syslog(get_class($this).'::'.__FUNCTION__."", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < $num) { - $row = $this->db->fetch_row($resql); - $result[$i] = $row; - $i++; - } - $this->db->free($resql); - } else { - dol_print_error($this->db); - } - return $result; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Return nb of elements, total amount and avg amount each year - * - * @param string $sql SQL request - * @return array Array with nb, total amount, average for each year - */ - protected function _getAllByYear($sql) - { - // phpcs:enable - $result = array(); - - dol_syslog(get_class($this).'::'.__FUNCTION__."", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < $num) { - $row = $this->db->fetch_object($resql); - $result[$i]['year'] = $row->year; - $result[$i]['nb'] = $row->nb; - if ($i > 0 && $row->nb > 0) { - $result[$i - 1]['nb_diff'] = ($result[$i - 1]['nb'] - $row->nb) / $row->nb * 100; - } - $result[$i]['total'] = $row->total; - if ($i > 0 && $row->total > 0) { - $result[$i - 1]['total_diff'] = ($result[$i - 1]['total'] - $row->total) / $row->total * 100; - } - $result[$i]['avg'] = $row->avg; - if ($i > 0 && $row->avg > 0) { - $result[$i - 1]['avg_diff'] = ($result[$i - 1]['avg'] - $row->avg) / $row->avg * 100; - } - // For some $sql only - if (isset($row->weighted)) { - $result[$i]['weighted'] = $row->weighted; - if ($i > 0 && $row->weighted > 0) { - $result[$i - 1]['avg_weighted'] = ($result[$i - 1]['weighted'] - $row->weighted) / $row->weighted * 100; - } - } - $i++; - } - $this->db->free($resql); - } else { - dol_print_error($this->db); - } - return $result; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Renvoie le nombre de documents par mois pour une annee donnee - * Return number of documents per month for a given year - * - * @param int $year Year - * @param string $sql SQL - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @return array Array of nb each month - */ - protected function _getNbByMonth($year, $sql, $format = 0) - { - // phpcs:enable - global $langs; - - $result = array(); - $res = array(); - - dol_syslog(get_class($this).'::'.__FUNCTION__."", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - $j = 0; - while ($i < $num) { - $row = $this->db->fetch_row($resql); - $j = $row[0] * 1; - $result[$j] = $row[1]; - $i++; - } - $this->db->free($resql); - } else { - dol_print_error($this->db); - } - - for ($i = 1; $i < 13; $i++) { - $res[$i] = (isset($result[$i]) ? $result[$i] : 0); - } - - $data = array(); - - for ($i = 1; $i < 13; $i++) { - $month = 'unknown'; - if ($format == 0) { - $month = $langs->transnoentitiesnoconv('MonthShort'.sprintf("%02d", $i)); - } elseif ($format == 1) { - $month = $i; - } elseif ($format == 2) { - $month = $langs->transnoentitiesnoconv('MonthVeryShort'.sprintf("%02d", $i)); - } - //$month=dol_print_date(dol_mktime(12,0,0,$i,1,$year),($format?"%m":"%b")); - //$month=dol_substr($month,0,3); - $data[$i - 1] = array($month, $res[$i]); - } - - return $data; - } - - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Return the amount per month for a given year - * - * @param int $year Year - * @param string $sql SQL - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @return array - */ - protected function _getAmountByMonth($year, $sql, $format = 0) - { - // phpcs:enable - global $langs; - - $result = array(); - $res = array(); - - dol_syslog(get_class($this).'::'.__FUNCTION__."", LOG_DEBUG); - - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < $num) { - $row = $this->db->fetch_row($resql); - $j = $row[0] * 1; - $result[$j] = $row[1]; - $i++; - } - $this->db->free($resql); - } else { - dol_print_error($this->db); - } - - for ($i = 1; $i < 13; $i++) { - $res[$i] = (int) round((isset($result[$i]) ? $result[$i] : 0)); - } - - $data = array(); - - for ($i = 1; $i < 13; $i++) { - $month = 'unknown'; - if ($format == 0) { - $month = $langs->transnoentitiesnoconv('MonthShort'.sprintf("%02d", $i)); - } elseif ($format == 1) { - $month = $i; - } elseif ($format == 2) { - $month = $langs->transnoentitiesnoconv('MonthVeryShort'.sprintf("%02d", $i)); - } - //$month=dol_print_date(dol_mktime(12,0,0,$i,1,$year),($format?"%m":"%b")); - //$month=dol_substr($month,0,3); - $data[$i - 1] = array($month, $res[$i]); - } - - return $data; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Renvoie le montant moyen par mois pour une annee donnee - * Return the amount average par month for a given year - * - * @param int $year Year - * @param string $sql SQL - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @return array - */ - protected function _getAverageByMonth($year, $sql, $format = 0) - { - // phpcs:enable - global $langs; - - $result = array(); - $res = array(); - - dol_syslog(get_class($this).'::'.__FUNCTION__."", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - $j = 0; - while ($i < $num) { - $row = $this->db->fetch_row($resql); - $j = $row[0] * 1; - $result[$j] = $row[1]; - $i++; - } - $this->db->free($resql); - } else { - dol_print_error($this->db); - } - - for ($i = 1; $i < 13; $i++) { - $res[$i] = (isset($result[$i]) ? $result[$i] : 0); - } - - $data = array(); - - for ($i = 1; $i < 13; $i++) { - $month = 'unknown'; - if ($format == 0) { - $month = $langs->transnoentitiesnoconv('MonthShort'.sprintf("%02d", $i)); - } elseif ($format == 1) { - $month = $i; - } elseif ($format == 2) { - $month = $langs->transnoentitiesnoconv('MonthVeryShort'.sprintf("%02d", $i)); - } - //$month=dol_print_date(dol_mktime(12,0,0,$i,1,$year),($format?"%m":"%b")); - //$month=dol_substr($month,0,3); - $data[$i - 1] = array($month, $res[$i]); - } - - return $data; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Returns the summed amounts per year for a given number of past years ending now - * @param string $sql SQL - * @return array - */ - protected function _getAmountByYear($sql) - { - $result = array(); - $resql = $this->db->query($sql); - if ($resql) { - $num = $this->db->num_rows($resql); - $i = 0; - while ($i < $num) { - $row = $this->db->fetch_row($resql); - $j = (int) $row[0]; - $result[] = [ - 0 => (int) $row[0], - 1 => (int) $row[1], - ]; - $i++; - } - $this->db->free($resql); - } - return $result; - } -} - diff --git a/class/preventionplan.class.php b/class/preventionplan.class.php index ed2c29d99..5a45848f0 100644 --- a/class/preventionplan.class.php +++ b/class/preventionplan.class.php @@ -401,7 +401,7 @@ public function getTriggerDescription(SaturneObject $object): string $ret .= $langs->transnoentities('CSSCTIntervention') . ' : ' . ($object->cssct_intervention ? $langs->transnoentities("Yes") : $langs->transnoentities("No")) . '
'; $ret .= $langs->transnoentities('PriorVisit') . ' : ' . ($object->prior_visit_bool ? $langs->transnoentities("Yes") : $langs->transnoentities("No")) . '
'; if ($object->prior_visit_bool) { - $ret .= $langs->transnoentities('PriorVisitText') . ' : ' . (!empty($object->prior_visit_text) ? $object->prior_visit_text : 'N/A') . '
'; + $ret .= $langs->transnoentities('PriorVisitText') . ' : ' . (!empty($object->prior_visit_text) ? $object->prior_visit_text : 'N/A') . '
'; $ret .= (dol_strlen($object->prior_visit_date) > 0 ? $langs->transnoentities('PriorVisitDate') . ' : ' . dol_print_date($object->prior_visit_date, 'dayhoursec') . '
' : ''); } diff --git a/class/riskanalysis/risk.class.php b/class/riskanalysis/risk.class.php index 4d28d209b..f00ac2c11 100644 --- a/class/riskanalysis/risk.class.php +++ b/class/riskanalysis/risk.class.php @@ -28,7 +28,7 @@ require_once __DIR__ . '/../../../saturne/class/task/saturnetask.class.php'; require_once __DIR__ . '/riskassessment.class.php'; -// Load Saturne libraries. +// Load Saturne libraries require_once __DIR__ . '/../../../saturne/class/saturneobject.class.php'; /** @@ -37,28 +37,28 @@ class Risk extends SaturneObject { /** - * @var string Module name. + * @var string Module name */ public $module = 'digiriskdolibarr'; /** - * @var string Element type of object. + * @var string Element type of object */ public $element = 'risk'; /** - * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management. + * @var string Name of table without prefix where object is stored. This is also the key used for extrafields management */ public $table_element = 'digiriskdolibarr_risk'; /** * @var int Does this object support multicompany module ? - * 0 = No test on entity, 1 = Test with field entity, 'field@table' = Test with link by field@table. + * 0 = No test on entity, 1 = Test with field entity, 'field@table' = Test with link by field@table */ public $ismultientitymanaged = 1; /** - * @var int Does object support extrafields ? 0 = No, 1 = Yes. + * @var int Does object support extrafields ? 0 = No, 1 = Yes */ public int $isextrafieldmanaged = 1; @@ -74,25 +74,25 @@ class Risk extends SaturneObject public $picto = 'fontawesome_fa-exclamation-triangle_fas_#d35968'; /** - * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor. + * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor */ - public $fields = array( - 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => '1', 'position' => 10, 'notnull' => 1, 'visible' => 0, 'noteditable' => '1', 'index' => 1, 'comment' => "Id"), - 'fk_element' => array('type' => 'integer', 'label' => 'ParentElement', 'enabled' => '1', 'position' => 9, 'notnull' => 1, 'visible' => 1, 'csslist' => 'minwidth200 maxwidth300 widthcentpercentminusxx'), - 'ref' => array('type' => 'varchar(128)', 'label' => 'Ref', 'enabled' => '1', 'position' => 20, 'notnull' => 1, 'visible' => 4, 'noteditable' => '1', 'index' => 1, 'searchall' => 1, 'showoncombobox' => '1', 'comment' => "Reference of object"), - 'ref_ext' => array('type' => 'varchar(128)', 'label' => 'RefExt', 'enabled' => '1', 'position' => 30, 'notnull' => 0, 'visible' => 0,), - 'entity' => array('type' => 'integer', 'label' => 'Entity', 'enabled' => '1', 'position' => 8, 'notnull' => 1, 'visible' => 0,), - 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => '1', 'position' => 50, 'notnull' => 1, 'visible' => 0,), - 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => '1', 'position' => 60, 'notnull' => 0, 'visible' => 0,), - 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => '1', 'position' => 70, 'notnull' => -1, 'visible' => 0,), - 'status' => array('type' => 'smallint', 'label' => 'Status', 'enabled' => '1', 'position' => 80, 'notnull' => 0, 'visible' => 0,), - 'category' => array('type' => 'varchar(255)', 'label' => 'RiskCategory', 'enabled' => '1', 'position' => 21, 'notnull' => 0, 'visible' => 1,), - 'description' => array('type' => 'text', 'label' => 'Description', 'enabled' => '1', 'position' => 23, 'notnull' => 0, 'visible' => -1,), - 'type' => array('type' => 'varchar(255)', 'label' => 'Type', 'enabled' => '1', 'position' => 24, 'notnull' => 1, 'visible' => 0, 'default' => '(PROV)'), - 'fk_user_creat' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserAuthor', 'enabled' => '1', 'position' => 110, 'notnull' => 1, 'visible' => 0, 'foreignkey' => 'user.rowid',), - 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => '1', 'position' => 120, 'notnull' => -1, 'visible' => 0,), - 'fk_projet' => array('type' => 'integer:Project:projet/class/project.class.php', 'label' => 'Projet', 'enabled' => '1', 'position' => 140, 'notnull' => 1, 'visible' => 0,), - ); + public $fields = [ + 'rowid' => ['type' => 'integer', 'label' => 'TechnicalID', 'enabled' => '1', 'position' => 10, 'notnull' => 1, 'visible' => 0, 'noteditable' => '1', 'index' => 1, 'comment' => "Id"], + 'fk_element' => ['type' => 'integer', 'label' => 'ParentElement', 'enabled' => '1', 'position' => 9, 'notnull' => 1, 'visible' => 1, 'csslist' => 'minwidth200 maxwidth300 widthcentpercentminusxx'], + 'ref' => ['type' => 'varchar(128)', 'label' => 'Ref', 'enabled' => '1', 'position' => 20, 'notnull' => 1, 'visible' => 4, 'noteditable' => '1', 'index' => 1, 'searchall' => 1, 'showoncombobox' => '1', 'comment' => "Reference of object"], + 'ref_ext' => ['type' => 'varchar(128)', 'label' => 'RefExt', 'enabled' => '1', 'position' => 30, 'notnull' => 0, 'visible' => 0], + 'entity' => ['type' => 'integer', 'label' => 'Entity', 'enabled' => '1', 'position' => 8, 'notnull' => 1, 'visible' => 0], + 'date_creation' => ['type' => 'datetime', 'label' => 'DateCreation', 'enabled' => '1', 'position' => 50, 'notnull' => 1, 'visible' => 0], + 'tms' => ['type' => 'timestamp', 'label' => 'DateModification', 'enabled' => '1', 'position' => 60, 'notnull' => 0, 'visible' => 0], + 'import_key' => ['type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => '1', 'position' => 70, 'notnull' => -1, 'visible' => 0], + 'status' => ['type' => 'smallint', 'label' => 'Status', 'enabled' => '1', 'position' => 80, 'notnull' => 0, 'visible' => 0], + 'category' => ['type' => 'varchar(255)', 'label' => 'RiskCategory', 'enabled' => '1', 'position' => 21, 'notnull' => 0, 'visible' => 1], + 'description' => ['type' => 'text', 'label' => 'Description', 'enabled' => '1', 'position' => 23, 'notnull' => 0, 'visible' => -1], + 'type' => ['type' => 'varchar(255)', 'label' => 'Type', 'enabled' => '1', 'position' => 24, 'notnull' => 1, 'visible' => 0, 'default' => '(PROV)'], + 'fk_user_creat' => ['type' => 'integer:User:user/class/user.class.php', 'label' => 'UserAuthor', 'enabled' => '1', 'position' => 110, 'notnull' => 1, 'visible' => 0, 'foreignkey' => 'user.rowid'], + 'fk_user_modif' => ['type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => '1', 'position' => 120, 'notnull' => -1, 'visible' => 0], + 'fk_projet' => ['type' => 'integer:Project:projet/class/project.class.php', 'label' => 'Projet', 'enabled' => '1', 'position' => 140, 'notnull' => 1, 'visible' => 0] + ]; public $rowid; public $ref; @@ -112,18 +112,50 @@ class Risk extends SaturneObject public $lastEvaluation; public $appliedOn; + private $cotations = []; + /** - * Constructor. + * Constructor * - * @param DoliDb $db Database handler. + * @param DoliDb $db Database handler */ public function __construct(DoliDB $db) { + global $langs; + + $this->cotations = [ + 1 => [ + 'label' => $langs->transnoentities('GreyRisk'), + 'color' => '#ececec', + 'start' => 0, + 'end' => 47 + ], + 2 => [ + 'label' => $langs->transnoentities('OrangeRisk'), + 'color' => '#e9ad4f', + 'start' => 48, + 'end' => 50 + ], + 3 => [ + 'label' => $langs->transnoentities('RedRisk'), + 'color' => '#e05353', + 'start' => 51, + 'end' => 80 + ], + 4 => [ + 'label' => $langs->transnoentities('BlackRisk'), + 'color' => '#2b2b2b', + 'start' => 81, + 'end' => 100 + ] + ]; + $riskType = GETPOST('type'); if ($riskType == 'riskenvironmental') { $this->type = 'riskenvironmental'; $this->picto = 'fontawesome_fa-leaf_fas_#d35968'; } + parent::__construct($db, $this->module, $this->element); } @@ -153,14 +185,18 @@ public function fetchFromParent(int $parent_id) */ public function fetchRisksOrderedByCotation($parent_id, $get_children_data = false, $get_parents_data = false, $get_shared_data = false, $moreParams = []) { - $object = new DigiriskElement($this->db); - $objects = $object->getActiveDigiriskElements(); + $object = new DigiriskElement($this->db); + $risk = new Risk($this->db); + $riskAssessment = new RiskAssessment($this->db); - $risk = new Risk($this->db); - $riskList = $risk->fetchAll('', '', 0, 0, ['customsql' => 'status = ' . self::STATUS_VALIDATED . $moreParams['filterRisk']], 'AND', $get_shared_data ? 1 : 0); + $objects = $object->getActiveDigiriskElements(); - $riskAssessment = new RiskAssessment($this->db); - $riskAssessmentList = $riskAssessment->fetchAll('', '', 0, 0, ['customsql' => 'status = ' . RiskAssessment::STATUS_VALIDATED . $moreParams['filterRiskAssessment']], 'AND', $get_shared_data ? 1 : 0); + if ($get_shared_data) { + $risk->ismultientitymanaged = 0; + $riskAssessment->ismultientitymanaged = 0; + } + $riskList = $risk->fetchAll('', '', 0, 0, ['customsql' => 'status = ' . self::STATUS_VALIDATED . $moreParams['filterRisk']]); + $riskAssessmentList = $riskAssessment->fetchAll('', '', 0, 0, ['customsql' => 'status = ' . RiskAssessment::STATUS_VALIDATED . $moreParams['filterRiskAssessment']]); if (is_array($riskAssessmentList) && !empty($riskAssessmentList)) { foreach ($riskAssessmentList as $riskAssessmentSingle) { @@ -170,12 +206,11 @@ public function fetchRisksOrderedByCotation($parent_id, $get_children_data = fal if (is_array($riskList) && !empty($riskList)) { foreach ($riskList as $riskSingle) { - $riskSingle->lastEvaluation = $riskAssessmentsOrderedByRisk[$riskSingle->id]; - $riskSingle->appliedOn = $riskSingle->fk_element; + $riskSingle->lastEvaluation = $riskAssessmentsOrderedByRisk[$riskSingle->id]; + $riskSingle->appliedOn = $riskSingle->fk_element; $risksOrderedByDigiriskElement[$riskSingle->fk_element][] = $riskSingle; } } - $risks = []; //For groupment & workunit documents with given id @@ -532,9 +567,15 @@ public function getTasksWithFkRisk() */ public function load_dashboard(): array { - $arrayRisksByCotation = $this->getRisksByCotation(); + $dangerCategories = $this->getDangerCategories(); + + $getRisksByCotation = $this->getRisksByCotation(); + $getRisksByDangerCategoriesAndCriticality = $this->getRisksByDangerCategoriesAndCriticality($dangerCategories); + $getRisksByDangerCategories = $this->getRisksByDangerCategories($dangerCategories); + $getRiskListsByDangerCategories = $this->getRiskListsByDangerCategories($dangerCategories); - $array['graphs'] = [$arrayRisksByCotation]; + $array['graphs'] = [$getRisksByCotation, $getRisksByDangerCategoriesAndCriticality, $getRisksByDangerCategories]; + $array['lists'] = [$getRiskListsByDangerCategories]; return $array; } @@ -561,31 +602,152 @@ public function getRisksByCotation(): array $array['type'] = 'pie'; $array['showlegend'] = $conf->browser->layout == 'phone' ? 1 : 2; $array['dataset'] = 1; + $array['labels'] = $this->cotations; + + $riskAssessmentList = $riskAssessment->fetchAll('', '', 0, 0, ['customsql' => 'status = 1']); + $array['data'] = $riskAssessment->getRiskAssessmentCategoriesNumber($riskAssessmentList); + + return $array; + } + + /** + * Get risks by danger categories and criticality + * + * @param array $dangerCategories Danger categories datas + * @param string $type Risk type (risk, riskenvironmental or ...) + * + * @return array + * @throws Exception + */ + public function getRisksByDangerCategoriesAndCriticality(array $dangerCategories, string $type = 'risk'): array + { + global $conf, $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('RisksRepartitionByDangerCategoriesAndCriticality'); + $array['picto'] = $this->picto; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 600; + $array['type'] = 'bar'; + $array['showlegend'] = 1; + $array['dataset'] = 4; + $array['moreCSS'] = 'grid-2'; + $array['labels'] = $this->cotations; + + $join = ' LEFT JOIN ' . MAIN_DB_PREFIX . $this->table_element . ' as r ON r.rowid = t.fk_risk'; + foreach ($dangerCategories as $dangerCategory) { + $array['data'][$dangerCategory['position']][0] = $dangerCategory['name']; + + $risks = $this->fetchAll('', '', 0, 0, ['customsql' => 't.status = ' . self::STATUS_VALIDATED . ' AND t.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND t.fk_element = ' . GETPOST('id') : '') . ' AND t.type = "' . $type . '" AND t.category = ' . $dangerCategory['position']]); + for ($i = 1; $i <= 4; $i++) { + $riskAssessments = saturne_fetch_all_object_type('RiskAssessment', '', '', 0, 0, ['customsql' => 't.status = ' . RiskAssessment::STATUS_VALIDATED . ' AND r.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND r.fk_element = ' . GETPOST('id') : '') . ' AND r.type = "' . $type . '" AND r.category = ' . $dangerCategory['position'] . ' AND t.cotation >= ' . $this->cotations[$i]['start'] . ' AND t.cotation <= ' . $this->cotations[$i]['end']], 'AND', false, true, false, $join); + $array['data'][$dangerCategory['position']]['y_combined_' . $array['labels'][$i]['label']] = ((is_array($risks) && !empty($risks) && is_array($riskAssessments) && !empty($riskAssessments)) ? count($riskAssessments) / count($risks) : 0); + } + } + + return $array; + } + + /** + * Get risks by danger categories + * + * @param array $dangerCategories Danger categories datas + * @param string $type Risk type (risk, riskenvironmental or ...) + * + * @return array + * @throws Exception + */ + public function getRisksByDangerCategories(array $dangerCategories, string $type = 'risk'): array + { + global $conf, $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('RisksRepartitionByDangerCategories'); + $array['picto'] = $this->picto; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 600; + $array['type'] = 'bar'; + $array['showlegend'] = 1; + $array['dataset'] = 2; + $array['moreCSS'] = 'grid-2'; $array['labels'] = [ - 1 => [ - 'label' => $langs->transnoentities('GreyRisk'), - 'color' => '#ececec' - ], - 2 => [ - 'label' => $langs->transnoentities('OrangeRisk'), - 'color' => '#e9ad4f' - ], - 3 => [ - 'label' => $langs->transnoentities('RedRisk'), - 'color' => 'e05353' - ], - 4 => [ - 'label' => $langs->transnoentities('BlackRisk'), - 'color' => '#2b2b2b' + 0 => [ + 'label' => $langs->transnoentities('NumberOfRisks'), + 'color' => '#A1467E' ] ]; - $riskAssessmentList = $riskAssessment->fetchAll('', '', 0, 0, ['customsql' => 'status = 1']); - $array['data'] = $riskAssessment->getRiskAssessmentCategoriesNumber($riskAssessmentList); + foreach ($dangerCategories as $dangerCategory) { + $risks = $this->fetchAll('', '', 0, 0, ['customsql' => 't.status = ' . self::STATUS_VALIDATED . ' AND t.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND t.fk_element = ' . GETPOST('id') : '') . ' AND t.type = "' . $type . '" AND t.category = ' . $dangerCategory['position']]); + + $array['data'][$dangerCategory['position']][] = $dangerCategory['name']; + $array['data'][$dangerCategory['position']][] = (is_array($risks) && !empty($risks) ? count($risks) : 0); + } return $array; - } + } + + /** + * Get list of risks by danger categories + * + * @param array $dangerCategories Danger categories datas + * @param string $type Risk type (risk, riskenvironmental or ...) + * + * @return array + * @throws Exception + */ + public function getRiskListsByDangerCategories(array $dangerCategories, string $type = 'risk') : array + { + global $conf, $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('RiskListsByDangerCategories'); + $array['picto'] = $this->picto; + + // Graph parameters + $array['width'] = '100%'; + $array['type'] = 'list'; + + $totalRisks = $this->fetchAll('', '', 0, 0, ['customsql' => 't.status = ' . self::STATUS_VALIDATED . ' AND t.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND t.fk_element = ' . GETPOST('id') : '') . ' AND t.type = "' . $type . '"']); + + $array['labels']['Ref'] = $langs->transnoentities('DangerCategories'); + $array['labels']['numberOfRisks'] = $langs->transnoentities('NumberOfRisks') . ' : ' . '' . (is_array($totalRisks) && !empty($totalRisks) ? count($totalRisks) : 0) . ''; + $array['labels']['percentage'] = $langs->transnoentities('Percentage'); + + $arrayRiskLists = []; + $join = ' LEFT JOIN ' . MAIN_DB_PREFIX . $this->table_element . ' as r ON r.rowid = t.fk_risk'; + if (is_array($totalRisks) && !empty($totalRisks)) { + foreach ($dangerCategories as $dangerCategory) { + $arrayRiskLists[$dangerCategory['position']]['Ref']['value'] = $dangerCategory['name']; + + $risks = $this->fetchAll('', '', 0, 0, ['customsql' => 't.status = ' . self::STATUS_VALIDATED . ' AND t.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND t.fk_element = ' . GETPOST('id') : '') . ' AND t.type = "' . $type . '" AND t.category = ' . $dangerCategory['position']]); + + $arrayRiskLists[$dangerCategory['position']]['numberOfRisks']['value'] = is_array($risks) && !empty($risks) ? count($risks) : 0; + $arrayRiskLists[$dangerCategory['position']]['numberOfRisks']['morecss'] = 'risk-evaluation-cotation'; + $arrayRiskLists[$dangerCategory['position']]['numberOfRisks']['moreAttr'] = 'style="line-height: 0; border-radius: 0; background-color: #A1467EAA; color: #FFF;"'; + $arrayRiskLists[$dangerCategory['position']]['percentage']['value'] = is_array($risks) && !empty($risks) ? price2num((count($risks) / count($totalRisks)) * 100, 2) . ' %' : 0; + + for ($i = 1; $i <= 4; $i++) { + $array['labels'][$i] = $this->cotations[$i]['label']; + + $riskAssessments = saturne_fetch_all_object_type('RiskAssessment', '', '', 0, 0, ['customsql' => 't.status = ' . RiskAssessment::STATUS_VALIDATED . ' AND r.entity = ' . $conf->entity . (GETPOSTISSET('id') ? ' AND r.fk_element = ' . GETPOST('id') : '') . ' AND r.type = "' . $type . '" AND r.category = ' . $dangerCategory['position'] . ' AND t.cotation >= ' . $this->cotations[$i]['start'] . ' AND t.cotation <= ' . $this->cotations[$i]['end']], 'AND', false, true, false, $join); + + $arrayRiskLists[$dangerCategory['position']][$i]['value'] = is_array($riskAssessments) && !empty($riskAssessments) ? count($riskAssessments) : 0; + $arrayRiskLists[$dangerCategory['position']][$i]['morecss'] = 'risk-evaluation-cotation'; + $arrayRiskLists[$dangerCategory['position']][$i]['moreAttr'] = 'data-scale = ' . $i . ' style="line-height: 0; border-radius: 0;"'; + } + } + } + + $array['data'] = $arrayRiskLists; + + return $array; + } /** * Write information of trigger description diff --git a/class/riskanalysis/riskassessment.class.php b/class/riskanalysis/riskassessment.class.php index cc39ad847..9271fe89b 100644 --- a/class/riskanalysis/riskassessment.class.php +++ b/class/riskanalysis/riskassessment.class.php @@ -121,6 +121,8 @@ class RiskAssessment extends SaturneObject public $fk_user_modif; public $fk_risk; + public $advancedCotation = []; + /** * Constructor. * @@ -128,6 +130,7 @@ class RiskAssessment extends SaturneObject */ public function __construct(DoliDB $db) { + $this->advancedCotation = [1 => 'gravite', 2 => 'exposition', 3 => 'occurrence', 4 => 'formation', 5 => 'protection']; parent::__construct($db, $this->module, $this->element); } diff --git a/class/riskanalysis/risksign.class.php b/class/riskanalysis/risksign.class.php index 77b0a3c6c..a0611c93e 100644 --- a/class/riskanalysis/risksign.class.php +++ b/class/riskanalysis/risksign.class.php @@ -238,7 +238,6 @@ public function getRiskSignCategoryNameByPosition($position) */ public function fetchRiskSign($parent_id, $get_parents_data = false, $get_shared_data = false, $moreParams = []) { - global $conf; $object = new DigiriskElement($this->db); $objects = $object->fetchAll('', '', 0, 0, array('customsql' => 'status > 0' )); $risksign = new RiskSign($this->db); diff --git a/class/ticketdashboard.class.php b/class/ticketdashboard.class.php new file mode 100644 index 000000000..e16723195 --- /dev/null +++ b/class/ticketdashboard.class.php @@ -0,0 +1,472 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file class/ticketdashboard.class.php + * \ingroup digiriskdolibarr + * \brief Class file for manage TicketDashboard + */ + +// load Dolibarr librairies +require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticket.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + +// load DigiriskDolibarr librairies +require_once __DIR__ . '/digiriskelement.class.php'; +require_once __DIR__ . '/accident.class.php'; + +/** + * Class to manage stats for tickets + */ +class TicketDashboard extends DigiriskDolibarrDashboard +{ + /** + * @var DoliDB Database handler + */ + public DoliDB $db; + + /** + * @var string SQL FROM + */ + public string $from = ''; + + /** + * @var string|null SQL JOIN + */ + public ?string $join = ''; + + /** + * @var string|null SQL WHERE + */ + public ?string $where = ''; + + /** + * Constructor + * + * @param DoliDB $db Database handler + * @param string|null $moreJoin More SQL JOIN + * @param string|null $moreWhere More SQL filters (' AND ...') + */ + public function __construct(DoliDB $db, ?string $moreJoin = '', ?string $moreWhere = '') + { + $this->db = $db; + + $this->from = MAIN_DB_PREFIX . 'ticket as t'; + if (dol_strlen($moreJoin) > 0) { + $this->join .= $moreJoin; + } + $this->where = 't.fk_statut >= 0'; + $this->where .= ' AND t.entity IN (' . getEntity('ticket') . ')'; + if (dol_strlen($moreWhere) > 0) { + $this->where .= $moreWhere; + } + } + + /** + * Return ticket number by month for a year + * + * @param int $year Year + * @return array Array of values + * @throws Exception + */ + public function getNbByMonth(int $year): array + { + $sql = "SELECT date_format(t.datec,'%m') as dc, COUNT(*) as nb"; + $sql .= ' FROM ' . $this->from; + $sql .= $this->join; + $sql .= " WHERE t.datec BETWEEN '" . $this->db->idate(dol_get_first_day($year)) . "' AND '" . $this->db->idate(dol_get_last_day($year)) . "'"; + $sql .= ' AND ' . $this->where; + $sql .= ' GROUP BY dc'; + $sql .= $this->db->order('dc', 'DESC'); + + return $this->_getNbByMonth($sql); + } + + /** + * Return nb, total and average + * + * @return array Array of values + * @throws Exception + */ + public function getAllByYear() + { + $sql = "SELECT date_format(t.datec,'%Y') as year, COUNT(*) as nb"; + $sql .= ' FROM ' . $this->from; + $sql .= $this->join; + $sql .= ' WHERE ' . $this->where; + $sql .= ' GROUP BY year'; + $sql .= $this->db->order('year', 'DESC'); + + return $this->_getAllByYear($sql); + } + + /** + * Return nb ticket by GP/UT and Ticket tags + * + * @param int $date_start Timestamp date start + * @param int $dateEnd Timestamp date end + * @return array Array of values + * @throws Exception + */ + public function getNbTicketByDigiriskElementAndTicketTags(int $dateStart, int $dateEnd): array + { + global $conf, $langs; + + $digiriskElement = new DigiriskElement($this->db); + $categorie = new Categorie($this->db); + $accident = new Accident($this->db); + $accidentWorkStop = new AccidentWorkStop($this->db); + $ticket = new Ticket($this->db); + + $filter = " AND o.datec BETWEEN '" . $this->db->idate($dateStart) . "' AND '" . $this->db->idate($dateEnd) . "'"; + $digiriskElementFlats = $digiriskElement->fetchDigiriskElementFlat(0); + if (is_array($digiriskElementFlats) && !empty($digiriskElementFlats)) { + foreach ($digiriskElementFlats as $digiriskElement) { + $digiriskElements[$digiriskElement['object']->id] = $digiriskElement['object']; + } + } + + $digiriskElements = dol_sort_array($digiriskElements, 'ranks'); + $mainCategoryObject = $categorie->rechercher(getDolGlobalInt('DIGIRISKDOLIBARR_TICKET_MAIN_CATEGORY'), '', 'ticket', true); + $categories = $mainCategoryObject[0]->get_filles(); + + $arrayReturn = []; + $ticketCategoriesCounter = []; + + //Creating columns labels + if (is_array($categories) && !empty($categories)) { + // Main categories + foreach($categories as $category) { + $labelsArray['labels'][$category->id] = $category->label; + + $categorie->fetch($category->id); + $tickets[$category->id] = getObjectsInCategDigirisk($categorie, 'ticket', 0, 0, 0, '', 'ASC', $filter); + + if (is_array($tickets[$category->id]) && !empty($tickets[$category->id])) { + $ticketCategoriesCounter[$langs->trans('Register') . ' ' . $category->label] = count($tickets[$category->id]); + } + + $mainCategoriesIds[$category->id] = $category->id; + $childrenCategories = $category->get_filles(); + + // Children categories + if (is_array($childrenCategories) && !empty($childrenCategories)) { + foreach($childrenCategories as $childCategory) { + $labelsArray['labels'][$childCategory->id] = $childCategory->label; + + $categorie->fetch($childCategory->id); + $tickets[$childCategory->id] = getObjectsInCategDigirisk($categorie, 'ticket', 0, 0, 0, '', 'ASC', $filter); + + // Categories sub ranges + if ($childCategory->label == $langs->trans('AccidentWithDIAT')) { + $accidentWorkStopTimeRangesJson = $conf->global->DIGIRISKDOLIBARR_TICKET_STATISTICS_ACCIDENT_TIME_RANGE; + $accidentWorkStopTimeRanges = json_decode($accidentWorkStopTimeRangesJson, true); + if (is_array($accidentWorkStopTimeRanges) && !empty($accidentWorkStopTimeRanges)) { + foreach($accidentWorkStopTimeRanges as $accidentWorkStopTimeRangeLabel => $accidentWorkStopTimeRange) { + $labelsArray['labels'][$accidentWorkStopTimeRangeLabel] = $accidentWorkStopTimeRange; + } + } + } + } + } + } + $labelsArray['labels']['Total'] = $langs->trans('Total'); + } + + $allAccidentsWithFkTicket = $accident->fetchAll('', '', 0, 0, ['customsql' => 'fk_ticket > 0']); + + if (is_array($digiriskElements) && !empty($digiriskElements)) { + foreach($digiriskElements as $digiriskElement) { + $arrayKey = $digiriskElement->ref . ' - ' . $digiriskElement->label; + if (is_array($labelsArray['labels']) && !empty($labelsArray['labels'])) { + foreach($labelsArray['labels'] as $categoryId => $categoryLabel) { + $arrayReturn[$arrayKey][$categoryId] = 0; + + if (is_int($categoryId)) { + if (is_array($tickets[$categoryId]) && !empty($tickets[$categoryId])) { + foreach($tickets[$categoryId] as $ticketsWithThisCategory) { + if ($ticketsWithThisCategory->array_options['options_digiriskdolibarr_ticket_service'] == $digiriskElement->id) { + $arrayReturn[$arrayKey][$categoryId] += 1; + } + } + } + } else if (strstr($categoryLabel, ':')) { + $accidentWorkStopTimeRangeDetails = explode(':', $categoryLabel); + $constraintMultiplicator = $accidentWorkStopTimeRangeDetails[2] == 'days' ? 1 : ($accidentWorkStopTimeRangeDetails[2] == 'years' ? 365 : 21); + $constraintInDays = $accidentWorkStopTimeRangeDetails[1]; + $constraintComparator = $accidentWorkStopTimeRangeDetails[0] == 'less' ? '<' : '>'; + + // Find accidents with filter and add it to counter + if (is_array($allAccidentsWithFkTicket) && !empty($allAccidentsWithFkTicket)) { + foreach($allAccidentsWithFkTicket as $accidentWithFkTicket) { + $ticket->fetch($accidentWithFkTicket->fk_ticket); + if ($ticket->array_options['options_digiriskdolibarr_ticket_service'] == $digiriskElement->id) { + $accidentWorkStopList = $accidentWorkStop->fetchFromParent($accidentWithFkTicket->id); + $accidentWorkStopDaysCounter = 0; + if (is_array($accidentWorkStopList) && !empty($accidentWorkStopList)) { + foreach ($accidentWorkStopList as $accidentWorkStop) { + $accidentWorkStopDaysCounter += $accidentWorkStop->workstop_days; + } + } + + // Turn constraint assertion (less:2:days) into executable logical condition + $condition = "\$result = \$accidentWorkStopDaysCounter $constraintComparator \$constraintInDays*$constraintMultiplicator;"; + eval($condition); + + if ($result) { + $arrayReturn[$arrayKey][$categoryId] += 1; + } + } + } + } + } + } + } + // Total for given digirisk element + foreach($arrayReturn[$arrayKey] as $digiriskElementCategoryId => $digiriskElementCategoriesCounter) { + if (in_array($digiriskElementCategoryId, $mainCategoriesIds)) { + $arrayReturn[$arrayKey]['Total'] += $digiriskElementCategoriesCounter; + } + } + } + } + + foreach($arrayReturn as $data) { + foreach($data as $categoryId => $categoryCounter) { + $totalArray['Total'][$categoryId] += $categoryCounter; + } + } + + // Array replace instead of array merge to avoid losing keys + $arrayReturn = array_replace($labelsArray, $arrayReturn, $totalArray); + + return [$arrayReturn, $ticketCategoriesCounter]; + } + + /** + * Load dashboard info ticket + * + * @param array $moreParams Parameters for load dashboard info + * @return array + * @throws Exception + */ + public function load_dashboard(array $moreParams = []): array + { + $getTicketsByMonth = $this->getTicketsByMonth(); + + $category = new Categorie($this->db); + $category->fetch(getDolGlobalInt('DIGIRISKDOLIBARR_TICKET_MAIN_CATEGORY')); + $mainCategories = $category->get_filles(); + + $getTicketsByMainTagAndByDigiriskElement = $this->getTicketsByMainTagAndByDigiriskElement($mainCategories); + $getTicketsByMainSubTagAndByDigiriskElement = $this->getTicketsByMainSubTagAndByDigiriskElement($mainCategories); + + $getTicketsByYear = $this->getTicketsByYear(); + + $array['graphs'] = [$getTicketsByMonth, $getTicketsByMainTagAndByDigiriskElement, $getTicketsByMainSubTagAndByDigiriskElement]; + $array['lists'] = [$getTicketsByYear]; + + return $array; + } + + /** + * Get tickets by month + * + * @return array $array Graph datas (label/color/type/title/data etc..) + */ + public function getTicketsByMonth(): array + { + global $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('NumberOfTicketsByMonth'); + $array['picto'] = 'fontawesome_fa-ticket-alt_fas_#3bbfa8'; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 300; + $array['type'] = 'bar'; + $array['showlegend'] = 1; + $array['dataset'] = 2; + $array['moreCSS'] = 'grid-2'; + + $dateStart = dol_mktime(0, 0, 0, GETPOST('dateStartmonth', 'int'), GETPOST('dateStartday', 'int'), GETPOST('dateStartyear', 'int')); + $dateEnd = dol_mktime(23, 59, 59, GETPOST('dateEndmonth', 'int'), GETPOST('dateEndday', 'int'), GETPOST('dateEndyear', 'int')); + $startYear = !empty($dateStart) ? strftime('%Y', $dateStart) : strftime('%Y', dol_now()) - (!getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS')))); + $endYear = strftime('%Y', !empty($dateEnd) ? $dateEnd : dol_now()); + + $labels = []; + for ($i = $startYear; $i <= $endYear; $i++) { + $labels[] = $i; + } + foreach ($labels as $label) { + $array['labels'][] = ['label' => $label]; + } + + $tickets = $this->getNbByMonthWithPrevYear($startYear, $endYear, getDolGlobalInt('SOCIETE_FISCAL_MONTH_START')); + if (is_array($tickets) && !empty($tickets)) { + if (!empty($dateStart) && !empty($dateEnd) && $startYear == $endYear) { + // Extract month values from POST parameters, assuming zero-based indexing + $startMonth = intval(GETPOST('dateStartmonth', 'int')) - 1; + $endMonth = intval(GETPOST('dateEndmonth', 'int')) - 1; + + // Iterate through $tickets and filter based on month range + foreach ($tickets as $key => $ticket) { + if ($key >= $startMonth && $key <= $endMonth) { + $array['data'][] = $ticket; + } + } + } else { + $array['data'] = $tickets; + } + } + + return $array; + } + + /** + * Get tickets by main tag and digirisk element + * + * @param array|int $mainCategories Int <0 if KO, array of main categories if OK + * @return array $array Graph datas (label/color/type/title/data etc..) + * @throws Exception + */ + public function getTicketsByMainTagAndByDigiriskElement($mainCategories): array + { + global $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('NumberOfTicketsByMainTagAndByDigiriskElement'); + $array['picto'] = 'fontawesome_fa-ticket-alt_fas_#3bbfa8'; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 400; + $array['type'] = 'bar'; + $array['showlegend'] = 1; + $array['dataset'] = 2; + $array['moreCSS'] = 'grid-2'; + + $digiriskElement = new DigiriskElement($this->db); + + if (is_array($mainCategories) && !empty($mainCategories)) { + foreach ($mainCategories as $mainCategory) { + $array['labels'][$mainCategory->id] = [ + 'label' => $mainCategory->label, + 'color' => '#' . $mainCategory->color + ]; + $moreParams['filter'] = ' AND t.element_type = "groupment"'; + $digiriskElements = $digiriskElement->getActiveDigiriskElements(0, $moreParams); + if (is_array($digiriskElements) && !empty($digiriskElements)) { + foreach ($digiriskElements as $digiriskElement) { + $tickets = saturne_fetch_all_object_type('Ticket', '', '', 0, 0, ['customsql' => 'cp.fk_categorie = ' . $mainCategory->id . ' AND eft.digiriskdolibarr_ticket_service = ' . $digiriskElement->id . ' AND ' . $this->where], 'AND', true, true, true, $this->join); + $array['data'][$digiriskElement->id][0] = $digiriskElement->ref . ' - ' . $digiriskElement->label; + $array['data'][$digiriskElement->id][] = is_array($tickets) && !empty($tickets) ? count($tickets) : 0; + } + } + } + } + + return $array; + } + + /** + * Get tickets by main sub tag and digirisk element + * + * @param array|int $mainCategories Int <0 if KO, array of main categories if OK + * @return array $array Graph datas (label/color/type/title/data etc..) + * @throws Exception + */ + public function getTicketsByMainSubTagAndByDigiriskElement($mainCategories): array + { + global $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('NumberOfTicketsByMainSubTagAndByDigiriskElement'); + $array['picto'] = 'fontawesome_fa-ticket-alt_fas_#3bbfa8'; + + // Graph parameters + $array['width'] = '100%'; + $array['height'] = 400; + $array['type'] = 'bar'; + $array['showlegend'] = 1; + $array['dataset'] = 2; + $array['moreCSS'] = 'grid-2'; + + $category = new Categorie($this->db); + $digiriskElement = new DigiriskElement($this->db); + + if (is_array($mainCategories) && !empty($mainCategories)) { + foreach ($mainCategories as $mainCategory) { + $category->fetch($mainCategory->id); + $mainSubCategories = $category->get_filles(); + if (is_array($mainSubCategories) && !empty($mainSubCategories)) { + foreach ($mainSubCategories as $mainSubCategory) { + $array['labels'][$mainSubCategory->id] = [ + 'label' => $mainSubCategory->label, + 'color' => dol_strlen($mainSubCategory->color) > 0 ? '#' . $mainSubCategory->color : '', + ]; + $moreParams['filter'] = ' AND t.element_type = "groupment"'; + $digiriskElements = $digiriskElement->getActiveDigiriskElements(0, $moreParams); + if (is_array($digiriskElements) && !empty($digiriskElements)) { + foreach ($digiriskElements as $digiriskElement) { + $tickets = saturne_fetch_all_object_type('Ticket', '', '', 0, 0, ['customsql' => 'cp.fk_categorie = ' . $mainSubCategory->id . ' AND eft.digiriskdolibarr_ticket_service = ' . $digiriskElement->id . ' AND ' . $this->where], 'AND', true, true, true, $this->join); + $array['data'][$digiriskElement->id][0] = $digiriskElement->ref . ' - ' . $digiriskElement->label; + $array['data'][$digiriskElement->id][] = is_array($tickets) && !empty($tickets) ? count($tickets) : 0; + } + } + } + } + } + } + + return $array; + } + + /** + * Get tickets by year + * + * @return array $array Graph datas (label/color/type/title/data etc..) + */ + public function getTicketsByYear(): array + { + global $langs; + + // Graph Title parameters + $array['title'] = $langs->transnoentities('NumberOfTicketsByYear'); + $array['picto'] = 'fontawesome_fa-ticket-alt_fas_#3bbfa8'; + + // Graph parameters + $array['type'] = 'list'; + $array['labels'] = ['Year', 'Tickets', 'Percentage']; + + $arrayTicketByYear = []; + $tickets = $this->getAllByYear(); + if (is_array($tickets) && !empty($tickets)) { + foreach ($tickets as $key => $ticket) { + $arrayTicketByYear[$key]['Ref']['value'] = $ticket['year']; + $arrayTicketByYear[$key]['Tickets']['value'] = $ticket['nb']; + $arrayTicketByYear[$key]['Percentage']['value'] = price2num($ticket['avg'] ?: 0, 2) . ' %'; + } + } + + $array['data'] = $arrayTicketByYear; + + return $array; + } +} diff --git a/class/ticketdigiriskstats.class.php b/class/ticketdigiriskstats.class.php deleted file mode 100644 index ce901df07..000000000 --- a/class/ticketdigiriskstats.class.php +++ /dev/null @@ -1,299 +0,0 @@ - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file class/ticketdigiriskstats.class.php - * \ingroup digiriskdolibarr - * \brief Fichier de la classe de gestion des stats des tickets - */ - -include_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php'; -include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; - -require_once __DIR__ . '/digiriskstats.php'; -require_once __DIR__ . '/digiriskelement.class.php'; -require_once __DIR__ . '/accident.class.php'; - -/** - * Class to manage stats for tickets - */ -class TicketDigiriskStats extends DigiriskStats -{ - /** - * @var string Name of table without prefix where object is stored - */ - public $table_element; - - public $socid; - public $userid; - - public $from; - public $field; - public $where; - public $join; - - /** - * Constructor - * - * @param DoliDB $db Database handler - * @param int $socid ID third party for filter. This value must be forced during the new to external user company if user is an external user. - * @param int $userid ID user for filter (creation user) - * @param int $userassignid ID user for filter (user assign) - * @param int $digiriskelementid ID digiriskelement for filter - * @param int $categticketid ID category of ticket for filter - */ - public function __construct($db, $socid = 0, $userid = 0, $userassignid = 0, $digiriskelementid = 0, $categticketid = 0) - { - $this->db = $db; - $this->socid = ($socid > 0 ? $socid : 0); - $this->userid = $userid; - $this->join = ''; - - $object = new Ticket($this->db); - $this->from = MAIN_DB_PREFIX.$object->table_element." as tk"; - $this->where = "tk.fk_statut >= 0"; - $this->where .= " AND tk.entity IN (".getEntity('ticket').")"; - if ($this->socid) { - $this->where .= " AND tk.fk_soc = ".((int) $this->socid); - } - - if (is_array($this->userid) && count($this->userid) > 0) { - $this->where .= ' AND tk.fk_user_create IN ('.$this->db->sanitize(join(',', $this->userid)).')'; - } elseif ($this->userid > 0) { - $this->where .= " AND tk.fk_user_create = ".((int) $this->userid); - } - - if ($userassignid) { - $this->where .= " AND tk.fk_user_assign = ".((int) $userassignid); - } - - if ($digiriskelementid) { - $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'ticket_extrafields as tkextra ON tk.rowid = tkextra.fk_object'; - $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'digiriskdolibarr_digiriskelement as e ON tkextra.digiriskdolibarr_ticket_service = e.rowid'; - $this->where .= ' AND e.rowid = '.((int) $digiriskelementid); - } - - if ($categticketid) { - $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_ticket as ctk ON ctk.fk_ticket = tk.rowid'; - $this->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie as c ON c.rowid = ctk.fk_categorie'; - $this->where .= ' AND c.rowid = '.((int) $categticketid); - } - } - - /** - * Return ticket number by month for a year - * - * @param int $year Year to scan - * @param int $format 0=Label of abscissa is a translated text, 1=Label of abscissa is month number, 2=Label of abscissa is first letter of month - * @return array Array of values - */ - public function getNbByMonth($year, $format = 0) - { - $sql = "SELECT date_format(tk.datec,'%m') as dc, COUNT(*) as nb"; - $sql .= " FROM ".$this->from; - $sql .= $this->join; - $sql .= " WHERE tk.datec BETWEEN '".$this->db->idate(dol_get_first_day($year))."' AND '".$this->db->idate(dol_get_last_day($year))."'"; - $sql .= " AND ".$this->where; - $sql .= " GROUP BY dc"; - $sql .= $this->db->order('dc', 'DESC'); - - $res = $this->_getNbByMonth($year, $sql, $format); - - return $res; - } - - - /** - * Return ticket number per year - * - * @return array Array with number by year - */ - public function getNbByYear() - { - $sql = "SELECT date_format(tk.datec,'%Y') as dc, COUNT(*), SUM(c.".$this->field.")"; - $sql .= " FROM ".$this->from; - $sql .= $this->join; - $sql .= " WHERE ".$this->where; - $sql .= " GROUP BY dc"; - $sql .= $this->db->order('dc', 'DESC'); - - return $this->_getNbByYear($sql); - } - - /** - * Return nb, total and average - * - * @return array Array of values - */ - public function getAllByYear() - { - $sql = "SELECT date_format(tk.datec,'%Y') as year, COUNT(*) as nb"; - $sql .= " FROM ".$this->from; - $sql .= $this->join; - $sql .= " WHERE ".$this->where; - $sql .= " GROUP BY year"; - $sql .= $this->db->order('year', 'DESC'); - - return $this->_getAllByYear($sql); - } - - /** - * Return nb ticket by GP/UT and Ticket tags - * - * @param int $date_start Timestamp date start - * @param int $date_end Timestamp date end - * - * @return array Array of values - * @throws Exception - */ - public function getNbTicketByDigiriskElementAndTicketTags($date_start = 0, $date_end = 0) { - global $conf, $langs; - - $digiriskelement = new DigiriskElement($this->db); - $categorie = new Categorie($this->db); - $accident = new Accident($this->db); - $accidentWorkStop = new AccidentWorkStop($this->db); - $ticket = new Ticket($this->db); - - $digiriskelement_flatlist = $digiriskelement->fetchDigiriskElementFlat(0); - if (is_array($digiriskelement_flatlist) && !empty($digiriskelement_flatlist)) { - foreach ($digiriskelement_flatlist as $digiriskelementobject) { - $digiriskelementlist[$digiriskelementobject['object']->id] = $digiriskelementobject['object']; - } - } - - $digiriskelementlist = dol_sort_array($digiriskelementlist, 'ranks'); - $mainCategoryObject = $categorie->rechercher($conf->global->DIGIRISKDOLIBARR_TICKET_MAIN_CATEGORY, '', 'ticket', true); - $allCategories = $mainCategoryObject[0]->get_filles(); - - $arrayReturn = []; - $ticketCategoriesCounter = []; - - //Creating columns labels - if (is_array($allCategories) && !empty($allCategories)) { - // Main categories - foreach($allCategories as $category) { - $labelsArray['labels'][$category->id] = $category->label; - - $categorie->fetch($category->id); - $alltickets[$category->id] = getObjectsInCategDigirisk($categorie, 'ticket', 0, 0, 0, '', 'ASC', $filter); - - if (is_array($alltickets[$category->id]) && !empty($alltickets[$category->id])) { - $ticketCategoriesCounter[$langs->trans('Register') . ' ' . $category->label] = count($alltickets[$category->id]); - } - - - $mainCategoriesIds[$category->id] = $category->id; - $childrenCategories = $category->get_filles(); - - - // Children categories - if (is_array($childrenCategories) && !empty($childrenCategories)) { - foreach($childrenCategories as $childCategory) { - $labelsArray['labels'][$childCategory->id] = $childCategory->label; - - $categorie->fetch($childCategory->id); - $alltickets[$childCategory->id] = getObjectsInCategDigirisk($categorie, 'ticket', 0, 0, 0, '', 'ASC', $filter); - - // Categories sub ranges - if ($childCategory->label == $langs->trans('AccidentWithDIAT')) { - $accidentWorkStopTimeRangesJson = $conf->global->DIGIRISKDOLIBARR_TICKET_STATISTICS_ACCIDENT_TIME_RANGE; - $accidentWorkStopTimeRanges = json_decode($accidentWorkStopTimeRangesJson, true); - if (is_array($accidentWorkStopTimeRanges) && !empty($accidentWorkStopTimeRanges)) { - foreach($accidentWorkStopTimeRanges as $accidentWorkStopTimeRangeLabel => $accidentWorkStopTimeRange) { - $labelsArray['labels'][$accidentWorkStopTimeRangeLabel] = $accidentWorkStopTimeRange; - } - } - } - } - } - } - $labelsArray['labels']['Total'] = $langs->trans('Total'); - } - - $allAccidentsWithFkTicket = $accident->fetchAll('', '', 0, 0, ['customsql' => 'fk_ticket > 0']); - - if (is_array($digiriskelementlist) && !empty($digiriskelementlist)) { - foreach($digiriskelementlist as $digiriskelement) { - $arrayKey = $digiriskelement->ref . ' - ' . $digiriskelement->label; - if (is_array($labelsArray['labels']) && !empty($labelsArray['labels'])) { - foreach($labelsArray['labels'] as $categoryId => $categoryLabel) { - $arrayReturn[$arrayKey][$categoryId] = 0; - - if (is_int($categoryId)) { - if (is_array($alltickets[$categoryId]) && !empty($alltickets[$categoryId])) { - foreach($alltickets[$categoryId] as $ticketsWithThisCategory) { - if ($ticketsWithThisCategory->array_options['options_digiriskdolibarr_ticket_service'] == $digiriskelement->id) { - $arrayReturn[$arrayKey][$categoryId] += 1; - } - } - } - } else if (strstr($categoryLabel, ':')) { - $accidentWorkStopTimeRangeDetails = explode(':', $categoryLabel); - $constraintMultiplicator = $accidentWorkStopTimeRangeDetails[2] == 'days' ? 1 : ($accidentWorkStopTimeRangeDetails[2] == 'years' ? 365 : 21); - $constraintInDays = $accidentWorkStopTimeRangeDetails[1]; - $constraintComparator = $accidentWorkStopTimeRangeDetails[0] == 'less' ? '<' : '>'; - - // Find accidents with filter and add it to counter - if (is_array($allAccidentsWithFkTicket) && !empty($allAccidentsWithFkTicket)) { - foreach($allAccidentsWithFkTicket as $accidentWithFkTicket) { - $ticket->fetch($accidentWithFkTicket->fk_ticket); - if ($ticket->array_options['options_digiriskdolibarr_ticket_service'] == $digiriskelement->id) { - $accidentWorkStopList = $accidentWorkStop->fetchFromParent($accidentWithFkTicket->id); - $accidentWorkStopDaysCounter = 0; - if (is_array($accidentWorkStopList) && !empty($accidentWorkStopList)) { - foreach ($accidentWorkStopList as $accidentWorkStop) { - $accidentWorkStopDaysCounter += $accidentWorkStop->workstop_days; - } - } - - // Turn constraint assertion (less:2:days) into executable logical condition - $condition = "\$result = \$accidentWorkStopDaysCounter $constraintComparator \$constraintInDays*$constraintMultiplicator;"; - eval($condition); - - if ($result) { - $arrayReturn[$arrayKey][$categoryId] += 1; - } - } - } - } - } - } - } - // Total for given digirisk element - foreach($arrayReturn[$arrayKey] as $digiriskElementCategoryId => $digiriskElementCategoriesCounter) { - if (in_array($digiriskElementCategoryId, $mainCategoriesIds)) { - $arrayReturn[$arrayKey]['Total'] += $digiriskElementCategoriesCounter; - } - } - } - } - - foreach($arrayReturn as $data) { - foreach($data as $categoryId => $categoryCounter) { - $totalArray['Total'][$categoryId] += $categoryCounter; - } - } - - // Array replace instead of array merge to avoid losing keys - $arrayReturn = array_replace($labelsArray, $arrayReturn, $totalArray); - - return [$arrayReturn, $ticketCategoriesCounter]; - } -} - diff --git a/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/auditreportdocument/doc_auditreportdocument_odt.modules.php b/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/auditreportdocument/doc_auditreportdocument_odt.modules.php index 4df3fca23..b25e09526 100644 --- a/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/auditreportdocument/doc_auditreportdocument_odt.modules.php +++ b/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/auditreportdocument/doc_auditreportdocument_odt.modules.php @@ -125,6 +125,8 @@ public function write_file(SaturneDocuments $objectDocument, Translate $outputLa $filter = " AND (t.date_creation BETWEEN '$startDate' AND '$endDate' OR t.tms BETWEEN '$startDate' AND '$endDate')"; $specificFilter = " AND (t.datec BETWEEN '$startDate' AND '$endDate' OR t.tms BETWEEN '$startDate' AND '$endDate')"; + $tmpArray['dateAudit'] = dol_print_date($moreParam['dateStart'], 'day') . ' - ' . dol_print_date($moreParam['dateEnd'], 'day'); + $moreParam['filter'] = $filter; $moreParam['filterRisk'] = $filter . ' AND t.type = "risk"'; $moreParam['filterRiskAssessment'] = $filter; diff --git a/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/ticketdocument/doc_ticketdocument_odt.modules.php b/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/ticketdocument/doc_ticketdocument_odt.modules.php index e386a663a..10a865cd2 100644 --- a/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/ticketdocument/doc_ticketdocument_odt.modules.php +++ b/core/modules/digiriskdolibarr/digiriskdolibarrdocuments/ticketdocument/doc_ticketdocument_odt.modules.php @@ -107,7 +107,7 @@ public function fillTagsLines(Odf $odfHandler, Translate $outputLangs, array $mo $tmpArray['user'] = dol_strtoupper($userTmp->lastname) . ' ' . ucfirst($userTmp->firstname); $tmpArray['type'] = $outputLangs->transnoentities('Action' . $actionComm->type_code); $tmpArray['title'] = $actionComm->label; - $tmpArray['event_content'] = dol_htmlentitiesbr_decode(strip_tags($actionComm->note, '
')); + $tmpArray['event_content'] = dol_htmlentitiesbr_decode($actionComm->note); $tmpArray['date'] = dol_print_date($actionComm->datec, 'dayreduceformat'); $this->setTmpArrayVars($tmpArray, $listLines, $outputLangs); diff --git a/core/modules/modDigiriskDolibarr.class.php b/core/modules/modDigiriskDolibarr.class.php index 4f705c17e..a3f8c137b 100644 --- a/core/modules/modDigiriskDolibarr.class.php +++ b/core/modules/modDigiriskDolibarr.class.php @@ -380,7 +380,7 @@ public function __construct($db) $this->descriptionlong = "Digirisk"; $this->editor_name = 'Evarisk'; $this->editor_url = 'https://evarisk.com'; - $this->version = '10.0.0'; + $this->version = '10.1.0'; $this->const_name = 'MAIN_MODULE_' . strtoupper($this->name); $this->picto = 'digiriskdolibarr_color@digiriskdolibarr'; @@ -647,6 +647,7 @@ public function __construct($db) $i++ => ['DIGIRISKDOLIBARR_DIGIRISKELEMENT_TRASH', 'integer', 0, '', 0, 'current'], $i++ => ['DIGIRISKDOLIBARR_DIGIRISKELEMENT_TRASH_UPDATED', 'integer', 0, '', 0, 'current'], $i++ => ['DIGIRISKDOLIBARR_SHOW_HIDDEN_DIGIRISKELEMENT', 'integer', 0, '', 0, 'current'], + $i++ => ['DIGIRISKDOLIBARR_DIGIRISKELEMENT_DEPTH_GRAPH', 'integer', 1, '', 0, 'current'], $i++ => ['DIGIRISKDOLIBARR_MAIN_AGENDA_ACTIONAUTO_DIGIRISKELEMENT_CREATE', 'integer', 1, '', 0, 'current'], $i++ => ['DIGIRISKDOLIBARR_MAIN_AGENDA_ACTIONAUTO_DIGIRISKELEMENT_MODIFY', 'integer', 1, '', 0, 'current'], $i++ => ['DIGIRISKDOLIBARR_MAIN_AGENDA_ACTIONAUTO_DIGIRISKELEMENT_DELETE', 'integer', 1, '', 0, 'current'], diff --git a/core/tpl/riskanalysis/risk/digiriskdolibarr_risklist_view.tpl.php b/core/tpl/riskanalysis/risk/digiriskdolibarr_risklist_view.tpl.php index e3ad7f691..8944a0b4e 100644 --- a/core/tpl/riskanalysis/risk/digiriskdolibarr_risklist_view.tpl.php +++ b/core/tpl/riskanalysis/risk/digiriskdolibarr_risklist_view.tpl.php @@ -1223,7 +1223,7 @@ class="risk-evaluation-cotation cotation"> $digiriskElementIds = array_reverse($digiriskElementIds); foreach ($digiriskElementIds as $key => $digiriskElementId) { - print str_repeat('  ', $key + 1) . '↳' . $activeDigiriskElementList[$digiriskElementId]->getNomUrl(1, 'blank', 0, '', -1, 1) . '
'; + print str_repeat('  ', $key + 1) . '↳' . $activeDigiriskElementList[$digiriskElementId]->getNomUrl(1, 'blank', 0, '', -1, 1) . '
'; } } } diff --git a/core/tpl/riskanalysis/risk/digiriskdolibarr_sharedrisklist_view.tpl.php b/core/tpl/riskanalysis/risk/digiriskdolibarr_sharedrisklist_view.tpl.php index a5730691c..916f73bad 100644 --- a/core/tpl/riskanalysis/risk/digiriskdolibarr_sharedrisklist_view.tpl.php +++ b/core/tpl/riskanalysis/risk/digiriskdolibarr_sharedrisklist_view.tpl.php @@ -556,7 +556,7 @@ $digiriskElementIds = array_reverse($digiriskElementIds); foreach ($digiriskElementIds as $key => $digiriskElementId) { - print str_repeat('  ', $key + 1) . '↳' . $alldigiriskelement[$digiriskElementId]->getNomUrl(1, 'blank', 0, '', -1, 1) . '
'; + print str_repeat('  ', $key + 1) . '↳' . $alldigiriskelement[$digiriskElementId]->getNomUrl(1, 'blank', 0, '', -1, 1) . '
'; } } } diff --git a/core/tpl/riskanalysis/riskassessment/digiriskdolibarr_riskassessment_view_edit_modal.tpl.php b/core/tpl/riskanalysis/riskassessment/digiriskdolibarr_riskassessment_view_edit_modal.tpl.php index 34c1f808c..41b7740c9 100644 --- a/core/tpl/riskanalysis/riskassessment/digiriskdolibarr_riskassessment_view_edit_modal.tpl.php +++ b/core/tpl/riskanalysis/riskassessment/digiriskdolibarr_riskassessment_view_edit_modal.tpl.php @@ -96,13 +96,14 @@ class="risk-evaluation-cotation cotationcotation == + $name = strtolower($critere['name']); + $key = $lastEvaluation->advancedCotation[$critere['key']] ?>
$key ? " active" : "" ; } ?>" data-type="" data-id="id ? $risk->id : 0 ; ?>" diff --git a/core/triggers/interface_99_modDigiriskdolibarr_DigiriskdolibarrTriggers.class.php b/core/triggers/interface_99_modDigiriskdolibarr_DigiriskdolibarrTriggers.class.php index dd0f897fa..2a6237821 100644 --- a/core/triggers/interface_99_modDigiriskdolibarr_DigiriskdolibarrTriggers.class.php +++ b/core/triggers/interface_99_modDigiriskdolibarr_DigiriskdolibarrTriggers.class.php @@ -72,7 +72,7 @@ public function __construct($db) $this->name = preg_replace('/^Interface/i', '', get_class($this)); $this->family = "demo"; $this->description = "Digiriskdolibarr triggers."; - $this->version = '10.0.0'; + $this->version = '10.1.0'; $this->picto = 'digiriskdolibarr@digiriskdolibarr'; } diff --git a/digiriskdolibarrindex.php b/digiriskdolibarrindex.php index fdc645da1..be21c0ef6 100644 --- a/digiriskdolibarrindex.php +++ b/digiriskdolibarrindex.php @@ -34,4 +34,15 @@ $moreParams['specialModuleNameLowerCase'] = 'digirisk'; +$moreParams = [ + 'LoadRiskAssessmentDocument' => 1, + 'LoadAccident' => 1, + 'LoadEvaluator' => 1, + 'LoadDigiriskResources' => 1, + 'LoadDigiriskElement' => 1, + 'LoadSaturneTask' => 1, + 'LoadRisk' => 1, + 'LoadTicketDashboard' => 1 +]; + require_once __DIR__ . '/../saturne/core/tpl/index/index_view.tpl.php'; diff --git a/documents/doctemplates/groupmentdocument/template_groupmentdocument.odt b/documents/doctemplates/groupmentdocument/template_groupmentdocument.odt index bfbdbbb26..058715624 100644 Binary files a/documents/doctemplates/groupmentdocument/template_groupmentdocument.odt and b/documents/doctemplates/groupmentdocument/template_groupmentdocument.odt differ diff --git a/documents/doctemplates/workunitdocument/template_workunitdocument.odt b/documents/doctemplates/workunitdocument/template_workunitdocument.odt index c893b708e..469955099 100644 Binary files a/documents/doctemplates/workunitdocument/template_workunitdocument.odt and b/documents/doctemplates/workunitdocument/template_workunitdocument.odt differ diff --git a/js/digiriskdolibarr.min.js b/js/digiriskdolibarr.min.js index a44dea06a..bdd4f007f 100644 --- a/js/digiriskdolibarr.min.js +++ b/js/digiriskdolibarr.min.js @@ -1 +1 @@ -"use strict";window.digiriskdolibarr||(window.digiriskdolibarr={},window.digiriskdolibarr.scriptsLoaded=!1),window.digiriskdolibarr.scriptsLoaded||(window.digiriskdolibarr.init=function(){window.digiriskdolibarr.load_list_script()},window.digiriskdolibarr.load_list_script=function(){if(!window.digiriskdolibarr.scriptsLoaded){var i=void 0,e=void 0;for(i in window.digiriskdolibarr)for(e in window.digiriskdolibarr[i].init&&window.digiriskdolibarr[i].init(),window.digiriskdolibarr[i])window.digiriskdolibarr[i]&&window.digiriskdolibarr[i][e]&&window.digiriskdolibarr[i][e].init&&window.digiriskdolibarr[i][e].init();window.digiriskdolibarr.scriptsLoaded=!0}},window.digiriskdolibarr.refresh=function(){var i=void 0,e=void 0;for(i in window.digiriskdolibarr)for(e in window.digiriskdolibarr[i].refresh&&window.digiriskdolibarr[i].refresh(),window.digiriskdolibarr[i])window.digiriskdolibarr[i]&&window.digiriskdolibarr[i][e]&&window.digiriskdolibarr[i][e].refresh&&window.digiriskdolibarr[i][e].refresh()},$(document).ready(window.digiriskdolibarr.init)),window.digiriskdolibarr.accident={},window.digiriskdolibarr.accident.init=function(){window.digiriskdolibarr.accident.event()},window.digiriskdolibarr.accident.event=function(){$(document).on("submit",".sendfile",window.digiriskdolibarr.accident.tmpStockFile),$(document).on("click",".linked-file-delete-workstop",window.digiriskdolibarr.accident.removeFile),$(document).on("change","#external_accident",window.digiriskdolibarr.accident.showExternalAccidentLocation)},window.digiriskdolibarr.accident.tmpStockFile=function(e,i=""){var s=$("#sendfile").prop("files"),t=new FormData;for(let i=0;ii.json()).then(i=>{i=i[0].option.matrix[e];t.find(".risk-evaluation-calculated-cotation").find(".risk-evaluation-cotation").attr("data-scale",window.digiriskdolibarr.evaluation.getDynamicScale(i)),t.find(".risk-evaluation-calculated-cotation").find(".risk-evaluation-cotation span").text(i),t.find(".risk-evaluation-content").find(".risk-evaluation-seuil").val(i),window.digiriskdolibarr.risk.haveDataInInput(t)})}},window.digiriskdolibarr.evaluator={},window.digiriskdolibarr.evaluator.init=function(){window.digiriskdolibarr.evaluator.event()},window.digiriskdolibarr.evaluator.event=function(){$(document).on("click",".evaluator-create",window.digiriskdolibarr.evaluator.createEvaluator),$(document).on("change","#fk_user_employer",window.digiriskdolibarr.evaluator.selectUser)},window.digiriskdolibarr.evaluator.selectUser=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".modal-container"),t=s.find("#fk_user_employer").val();window.saturne.loader.display(s.find('input[name="evaluatorJob"]')),$.ajax({url:document.URL+"&action=getEvaluatorJob&token="+e,type:"POST",processData:!1,data:JSON.stringify({userID:t}),contentType:!1,success:function(i){s.find('input[name="evaluatorJob"]').val($(i).find('input[name="evaluatorJob"]').val()),s.find('input[name="evaluatorJob"]').removeClass("wpeo-loader")},error:function(i){}}),window.digiriskdolibarr.evaluator.haveDataInInput(s)},window.digiriskdolibarr.evaluator.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("evaluator-add-modal")&&(0 div:nth-child(1)").text();var l=[];$(this).closest(".modal-container").find(".risk-categories").find(":selected").each(function(){l.push($(this).val())}),$.ajax({url:document.URL+"&action=saveRisk&token="+e,type:"POST",processData:!1,data:JSON.stringify({riskID:t,category:s,comment:r,newParent:o,categories:l}),contentType:!1,success:function(i){$(".wpeo-loader").removeClass("wpeo-loader");var e=$(".messageSuccessRiskEdit"),s=(o==a||n?($(".modal-active").removeClass("modal-active"),$(".risk-description-"+t).html($(i).find(".risk-description-"+t)),$(".risk-row-content-"+t).find(".risk-category .cell-risk").html($(i).find(".risk-row-content-"+t).find(".risk-category .cell-risk").children()),$(".risk-row-content-"+t).find(".risk-category").fadeOut(800),$(".risk-row-content-"+t).find(".risk-category").fadeIn(800),$(".risk-row-content-"+t).find(".risk-description-"+t).fadeOut(800),$(".risk-row-content-"+t).find(".risk-description-"+t).fadeIn(800)):$(".risk-row-content-"+t).fadeOut(800,function(){$(".fichecenter .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormListRisks .opacitymedium.colorblack.paddingleft"))}),""),s=(s=(s+=e.find(".valueForEditRisk1").val())+d)+e.find(".valueForEditRisk2").val();e.find("a").attr("href","#risk_row_"+t),e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskEdit"),s="",s=(s=(s+=e.find(".valueForEditRisk1").val())+d)+e.find(".valueForEditRisk2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.risk.unlinkSharedRisk=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value"),t=(window.saturne.loader.display($(this)),$(".risk_row_"+s).find(".risk-container > div:nth-child(1)").text());var a=document.URL.split(/#/);$.ajax({url:a[0]+"&action=unlinkSharedRisk&token="+e,type:"POST",processData:!1,data:JSON.stringify({riskID:s}),contentType:!1,success:function(i){$(".confirmquestions").html($(i).find(".confirmquestions").children()),$(".fichecenter.sharedrisklist .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormSharedListRisks .opacitymedium.colorblack.paddingleft"));var i=$(".messageSuccessRiskUnlinkShared"),e=($("#risk_row_"+s).fadeOut(800),""),e=(e=(e+=i.find(".valueForUnlinkSharedRisk1").val())+t)+i.find(".valueForUnlinkSharedRisk2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskUnlinkShared"),s="",s=(s=(s+=e.find(".valueForUnlinkSharedRisk1").val())+t)+e.find(".valueForUnlinkSharedRisk2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.risk.sharedRiskBoxLoader=function(i){"Oui"==$(this).text()&&window.saturne.loader.display($("#searchFormSharedListRisks"))},window.digiriskdolibarr.evaluation={},window.digiriskdolibarr.evaluation.init=function(){window.digiriskdolibarr.evaluation.event()},window.digiriskdolibarr.evaluation.event=function(){$(document).on("click",".select-evaluation-method",window.digiriskdolibarr.evaluation.selectEvaluationMethod),$(document).on("click",".cotation-container .risk-evaluation-cotation.cotation",window.digiriskdolibarr.evaluation.selectSeuil),$(document).on("click",".risk-evaluation-create",window.digiriskdolibarr.evaluation.createEvaluation),$(document).on("click",".risk-evaluation-save",window.digiriskdolibarr.evaluation.saveEvaluation),$(document).on("click",".risk-evaluation-delete",window.digiriskdolibarr.evaluation.deleteEvaluation)},window.digiriskdolibarr.evaluation.selectEvaluationMethod=function(i){var e=$(this).closest(".modal-container");0"+e.split(/\(/)[0]+"("+(+s-1)+")"),s-1<1&&$(".fichecenter.risklist").html($(i).find("#searchFormListRisks")),t.removeClass("wpeo-loader"),""),e=(e=(e+=r.find(".valueForDeleteEvaluation1").val())+n)+r.find(".valueForDeleteEvaluation2").val();r.find(".notice-subtitle .text").text(e),r.removeClass("hidden")},error:function(i){var e="",e=(e=(e+=o.find(".valueForDeleteEvaluation1").val())+n)+o.find(".valueForDeleteEvaluation2").val();o.find(".notice-subtitle .text").text(e),o.removeClass("hidden")}})}},window.digiriskdolibarr.evaluation.saveEvaluation=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).closest(".risk-evaluation-edit-modal"),t=s.attr("value");var a=s.find(".risk-evaluation-comment textarea").val();let n=$(this).closest(".risk-row").find(".risk-evaluations-list-content").attr("value"),r=$(".risk-evaluation-ref-"+t).attr("value"),o=$(".risk-evaluation-list-modal-"+n),d=$("#risk_evaluation_list"+n).hasClass("modal-active");var a=window.digiriskdolibarr.risk.sanitizeBeforeRequest(a),l=s.find(".risk-evaluation-method").val(),c=s.find(".risk-evaluation-seuil").val(),k=s.find("#RiskAssessmentDateEdit"+t).val(),u=s.find(".risk-evaluation-photo .filename").val();let m=[];Object.values($(".table-cell.active.cell-"+t)).forEach(function(i){-1<$(i).data("seuil")&&(m[$(i).data("type")]=$(i).data("seuil"))}),window.saturne.loader.display($(this)),$.ajax({url:document.URL+"&action=saveEvaluation&token="+e,type:"POST",processData:!1,data:JSON.stringify({cotation:c,comment:a,method:l,photo:u,date:k,evaluationID:t,criteres:{gravite:m.gravite||0,occurrence:m.occurrence||0,protection:m.protection||0,formation:m.formation||0,exposition:m.exposition||0}}),contentType:!1,success:function(i){$("#risk_evaluation_edit"+t).removeClass("modal-active"),0<$(i).find(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)").length?((d?($(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)")):($(".risk-evaluation-container-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-container-"+t+":not(.last-risk-assessment)"))).fadeIn(800),o.find(".risk-evaluation-ref-"+t).replaceWith($(i).find(".risk-evaluation-ref-"+t)),$(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)").replaceWith($(i).find(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)")),$("#risk_evaluation_add"+n).html($(i).find("#risk_evaluation_add"+n).children())):($(".div-table-responsive").html($(i).find(".div-table-responsive").children()),(d?($(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)")):($(".risk-evaluation-container-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-container-"+t+":not(.last-risk-assessment)"))).fadeIn(800)),$(".wpeo-loader").removeClass("wpeo-loader");var i=$(".messageSuccessEvaluationEdit"),e=(s.find("#risk_evaluation_edit"+t).removeClass("modal-active"),""),e=(e=(e+=i.find(".valueForEditEvaluation1").val())+r)+i.find(".valueForEditEvaluation2").val();i.find("a").attr("href","#risk_row_"+n),i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(){var i=$(".messageErrorEvaluationEdit"),e="",e=(e=(e+=i.find(".valueForEditEvaluation1").val())+r)+i.find(".valueForEditEvaluation2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")}})},window.digiriskdolibarr.risksign={},window.digiriskdolibarr.risksign.init=function(){window.digiriskdolibarr.risksign.event()},window.digiriskdolibarr.risksign.event=function(){$(document).on("click",".risksign-category-danger .item, .wpeo-table .risksign-category-danger .item",window.digiriskdolibarr.risksign.selectRiskSign),$(document).on("click",".risksign-create:not(.button-disable)",window.digiriskdolibarr.risksign.createRiskSign),$(document).on("click",".risksign-save",window.digiriskdolibarr.risksign.saveRiskSign),$(document).on("click",".risksign-unlink-shared",window.digiriskdolibarr.risksign.unlinkSharedRiskSign)},window.digiriskdolibarr.risksign.selectRiskSign=function(i){var e=$(this),e=(e.closest(".content").removeClass("active"),e.closest(".wpeo-dropdown").find(".dropdown-toggle span").hide(),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").show(),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").attr("src",e.find("img").attr("src")),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").attr("aria-label",e.closest(".wpeo-tooltip-event").attr("aria-label")),e.closest(".fichecenter").find(".input-hidden-danger").val(e.data("id")),$(this).closest(".modal-container"));window.digiriskdolibarr.risksign.haveDataInInput(e)},window.digiriskdolibarr.risksign.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("risksign-add-modal")&&0<=i.find('input[name="risksign_category_id"]').val()&&i.find(".button-disable").removeClass("button-disable")},window.digiriskdolibarr.risksign.createRiskSign=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".fichecenter").find(".risksign-content"),t=s.find(".risksign-category input").val(),s=s.find(".risksign-description textarea").val();window.saturne.loader.display($(".fichecenter.risksignlist")),$.ajax({url:document.URL+"&action=add&token="+e,type:"POST",data:JSON.stringify({riskSignCategory:t,riskSignDescription:s}),processData:!1,contentType:!1,success:function(i){$(".fichecenter.risksignlist").html($(i).find("#searchFormListRiskSigns"));var e=$(".messageSuccessRiskSignCreate");$(".fichecenter.risksignlist").removeClass("wpeo-loader"),e.html($(i).find(".risksign-create-success-notice")),e.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskCreate");e.html($(i).find(".risksign-create-error-notice")),e.removeClass("hidden")}})},window.digiriskdolibarr.risksign.saveRiskSign=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).attr("value");let t=$(this).closest(".risksign-container").find(".risksign-content"),a="";var n=t.find(".risksign-category input").val(),r=t.find(".risksign-description textarea").val();let o=$(".risksign_row_"+s).find(".risksign-container > div:nth-child(1)").text();window.saturne.loader.display(t),$.ajax({url:document.URL+"&action=saveRiskSign&token="+e,data:JSON.stringify({riskSignID:s,riskSignCategory:n,riskSignDescription:r}),type:"POST",processData:!1,contentType:!1,success:function(i){$(".fichecenter.risksignlist").html($(i).find("#searchFormListRiskSigns"));i=$(".messageSuccessRiskSignEdit");t.removeClass("wpeo-loader"),a=(a=(a+=i.find(".valueForEditRiskSign1").val())+o)+i.find(".valueForEditRiskSign2").val(),i.find(".notice-subtitle .text").text(a),i.removeClass("hidden")},error:function(){var i=$(".messageErrorRiskSignEdit");t.removeClass("wpeo-loader"),a=(a=(a+=i.find(".valueForEditRiskSign1").val())+o)+i.find(".valueForEditRiskSign2").val(),i.find(".notice-subtitle .text").text(a),i.removeClass("hidden")}})},window.digiriskdolibarr.risksign.unlinkSharedRiskSign=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value"),t=(window.saturne.loader.display($(this)),$(".risksign_row_"+s).find(".risksign-container > div:nth-child(1)").text());var a=document.URL.split(/#/);$.ajax({url:a[0]+"&action=unlinkSharedRiskSign&token="+e,type:"POST",processData:!1,data:JSON.stringify({risksignID:s}),contentType:!1,success:function(i){$(".fichecenter.sharedrisksignlist .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormSharedListRiskSigns .opacitymedium.colorblack.paddingleft"));var i=$(".messageSuccessRiskSignUnlinkShared"),e=($("#risksign_row_"+s).fadeOut(800),""),e=(e=(e+=i.find(".valueForUnlinkSharedRiskSign1").val())+t)+i.find(".valueForUnlinkSharedRiskSign2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskSignUnlinkShared"),s="",s=(s=(s+=e.find(".valueForUnlinkSharedRiskSign1").val())+t)+e.find(".valueForUnlinkSharedRiskSign2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask={},window.digiriskdolibarr.riskassessmenttask.init=function(){window.digiriskdolibarr.riskassessmenttask.event()},window.digiriskdolibarr.riskassessmenttask.event=function(){$(document).on("input",".riskassessment-task-label",window.digiriskdolibarr.riskassessmenttask.fillRiskAssessmentTaskLabel),$(document).on("click",".riskassessment-task-create",window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTask),$(document).on("click",".riskassessment-task-save",window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTask),$(document).on("click",".riskassessment-task-delete",window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTask),$(document).on("click",".riskassessment-task-timespent-create",window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-timespent-save",window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-timespent-delete",window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-progress-checkbox:not(.riskassessment-task-progress-checkbox-readonly)",window.digiriskdolibarr.riskassessmenttask.checkTaskProgress),$(document).on("change","#RiskassessmentTaskTimespentDatehour",window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateHour),$(document).on("change","#RiskassessmentTaskTimespentDatemin",window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateMin),$(document).on("keyup",".riskassessment-task-label",window.digiriskdolibarr.riskassessmenttask.checkRiskassessmentTaskLabelLength),$(document).on("click",".listingHeaderTaskTooltip",window.digiriskdolibarr.riskassessmenttask.redirectOnSharedTaskConfig)},window.digiriskdolibarr.riskassessmenttask.fillRiskAssessmentTaskLabel=function(i){var e=$(this).closest(".modal-container");window.digiriskdolibarr.riskassessmenttask.haveDataInInput(e)},window.digiriskdolibarr.riskassessmenttask.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("riskassessment-task-add-modal")&&i.find('input[name="label"]').val().length&&i.find(".button-disable").removeClass("button-disable")},window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".riskassessment-task-add-modal"),t=s.find(".modal-risk").attr("value"),s=s.find(".riskassessment-task-container"),a=s.find(".riskassessment-task-label").val(),a=window.digiriskdolibarr.risk.sanitizeBeforeRequest(a),n=s.find("#RiskassessmentTaskDateStart"+t).val(),r=s.find("#RiskassessmentTaskDateStart"+t+"hour").val(),o=s.find("#RiskassessmentTaskDateStart"+t+"min").val(),d=s.find("#RiskassessmentTaskDateEnd"+t).val(),l=s.find("#RiskassessmentTaskDateEnd"+t+"hour").val(),c=s.find("#RiskassessmentTaskDateEnd"+t+"min").val(),s=s.find(".riskassessment-task-budget").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-tasks"+t)),$.ajax({url:document.URL+"&action=addRiskAssessmentTask&token="+e,type:"POST",data:JSON.stringify({tasktitle:a,dateStart:n,hourStart:r,minStart:o,dateEnd:d,hourEnd:l,minEnd:c,budget:s,riskToAssign:t}),processData:!1,contentType:!1,success:function(i){$(".tasks-list-container-"+t).replaceWith($(i).find(".tasks-list-container-"+t));var e=$(".messageSuccessTaskCreate");$(".riskassessment-tasks"+t).fadeOut(800),$(".riskassessment-tasks"+t).fadeIn(800),e.find("a").attr("href","#risk_row_"+t),e.html($(i).find(".task-create-success-notice")),e.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e=$(".messageErrorTaskCreate"),s=($("#risk_assessment_task_add"+t).removeClass("modal-active"),""),s=(s=(s+=e.find(".valueForCreateTask1").val())+e.find(".valueForCreateTask2").val())+" : "+i.message;e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken(),t=$(this).closest(".wpeo-table.riskassessment-tasks").attr("value"),a=$(this).closest(".riskassessment-task-single-content").attr("value"),s=$(this).closest(".riskassessment-task-container-"+a).find(".labelForDelete").val();let n=$(".messageSuccessTaskDelete"),r=$(".messageErrorTaskDelete");if(1!=confirm(s))return!1;{let s=$(".riskassessment-task-container-"+a).attr("value");window.saturne.loader.display($(".riskassessment-task-container-"+a)),$.ajax({url:document.URL+"&action=deleteRiskAssessmentTask&deletedRiskAssessmentTaskId="+a+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(i){console.log($(".riskassessment-task-listing-wrapper-"+t)),console.log(t),$(".riskassessment-task-listing-wrapper-"+t).replaceWith($(i).find(".riskassessment-task-listing-wrapper-"+t)),$(".riskassessment-tasks"+t).fadeOut(800),$(".riskassessment-tasks"+t).fadeIn(800);i="",i=(i=(i+=n.find(".valueForDeleteTask1").val())+s)+n.find(".valueForDeleteTask2").val();n.find("a").attr("href","#risk_row_"+t),n.find(".notice-subtitle .text").text(i),n.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e="",e=(e=(e=(e+=r.find(".valueForDeleteTask1").val())+s)+r.find(".valueForDeleteTask2").val())+" : "+i.message;r.find(".notice-subtitle .text").text(e),r.removeClass("hidden")}})}},window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value");var t=$(this).closest(".modal-container"),a=$(this).closest(".modal-risk").attr("value");let n="";var r=t.find(".riskassessment-task-label"+s).val(),r=window.digiriskdolibarr.risk.sanitizeBeforeRequest(r);let o=$(".riskassessment-task-single-"+s+" .riskassessment-task-reference").attr("value"),d=0;t.find(".riskassessment-task-progress-checkbox"+s).is(":checked")&&(d=1);var l=t.find("#RiskassessmentTaskDateStartEdit"+s).val(),c=t.find("#RiskassessmentTaskDateStartEdit"+s+"hour").val(),k=t.find("#RiskassessmentTaskDateStartEdit"+s+"min").val(),u=t.find("#RiskassessmentTaskDateEndEdit"+s).val(),m=t.find("#RiskassessmentTaskDateEndEdit"+s+"hour").val(),v=t.find("#RiskassessmentTaskDateEndEdit"+s+"min").val(),t=t.find(".riskassessment-task-budget"+s).val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+s)),$.ajax({url:document.URL+"&action=saveRiskAssessmentTask&token="+e,data:JSON.stringify({riskAssessmentTaskID:s,tasktitle:r,dateStart:l,hourStart:c,minStart:k,dateEnd:u,hourEnd:m,minEnd:v,budget:t,taskProgress:d}),type:"POST",processData:!1,contentType:!1,success:function(i){$("#risk_assessment_task_edit"+s).removeClass("modal-active"),$(".riskassessment-task-container-"+s).replaceWith($(i).find(".riskassessment-task-container-"+s).first());i=$(".messageSuccessTaskEdit");$(".riskassessment-tasks"+a).fadeOut(800),$(".riskassessment-tasks"+a).fadeIn(800),n=(n=(n+=i.find(".valueForEditTask1").val())+o)+i.find(".valueForEditTask2").val(),$(".wpeo-loader").removeClass("wpeo-loader"),$(".loader-spin").remove(),i.find("a").attr("href","#risk_row_"+a),i.find(".notice-subtitle .text").text(n),i.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e=$(".messageErrorTaskEdit");$("#risk_assessment_task_edit"+s).removeClass("modal-active"),$(".wpeo-loader").removeClass("wpeo-loader"),n=(n=(n=(n+=e.find(".valueForEditTask1").val())+o)+e.find(".valueForEditTask2").val()+" : ")+i.message,e.find(".notice-subtitle .text").text(n),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value");var t=$(this).closest(".riskassessment-task-edit-modal"),a=t.find(".riskassessment-task-timespent-container");let n=t.find("riskassessment-task-single").attr("value"),r="",o=t.find(".riskassessment-task-reference").attr("value"),d=$(".id-container").find(".riskassessment-total-task-timespent-"+s);var t=a.find("#RiskassessmentTaskTimespentDate"+s).val(),l=a.find("#RiskassessmentTaskTimespentDate"+s+"hour").val(),c=a.find("#RiskassessmentTaskTimespentDate"+s+"min").val(),k=a.find(".riskassessment-task-timespent-comment").val(),k=window.digiriskdolibarr.risk.sanitizeBeforeRequest(k),a=a.find(".riskassessment-task-timespent-duration").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+s)),$.ajax({url:document.URL+"&action=addRiskAssessmentTaskTimeSpent&token="+e,type:"POST",data:JSON.stringify({taskID:s,date:t,hour:l,min:c,comment:k,duration:a}),processData:!1,contentType:!1,success:function(i){var e=$(".messageSuccessTaskTimeSpentCreate"+s);$(".riskassessment-tasks"+n).fadeOut(800),$(".riskassessment-tasks"+n).fadeIn(800),r=(r=(r+=e.find(".valueForCreateTaskTimeSpent1").val())+o)+e.find(".valueForCreateTaskTimeSpent2").val(),$(".riskassessment-task-timespent-container").find(".riskassessment-task-timespent-list-"+s).replaceWith($(i).find(".riskassessment-task-timespent-container").find(".riskassessment-task-timespent-list-"+s)),$(".riskassessment-task-container-"+s).closest(".riskassessment-tasks").replaceWith($(i).find(".riskassessment-task-container-"+s).closest(".riskassessment-tasks")),$(".loader-spin").remove(),$(".wpeo-loader").removeClass("wpeo-loader"),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden"),d.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+s).first())},error:function(i){$(this).closest(".risk-row-content-"+n).removeClass("wpeo-loader");var e=$(".messageErrorTaskTimeSpentCreate"+s);e.html($(i).find(".task-timespent-create-error-notice")),e.removeClass("hidden")},complete:function(){$("#risk_assessment_task_edit"+s+".wpeo-modal").addClass("modal-active")}})},window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let a=$(this).closest(".riskassessment-task-timespent-list").attr("value"),n=$(this).attr("value");var s=$(this).attr("value"),t=$(this).closest(".riskassessment-task-timespent-"+n).find(".labelForDelete").val();let r=$(".id-container").first().find(".riskassessment-total-task-timespent-"+a);if(1!=confirm(t))return!1;{let t=$(".riskassessment-task-container-"+a).attr("value");window.saturne.loader.display($(this)),$.ajax({url:document.URL+"&action=deleteRiskAssessmentTaskTimeSpent&deletedRiskAssessmentTaskTimeSpentId="+s+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(i){var e=$(".messageSuccessTaskTimeSpentDelete"+a),s=($(".riskassessment-task-timespent-"+n).fadeOut(800),""),s=(s=(s+=e.find(".valueForDeleteTaskTimeSpent1").val())+t)+e.find(".valueForDeleteTaskTimeSpent2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden"),r.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+a).first())},error:function(i){var e=$(".messageErrorTaskDeleteTimeSpent"+a),s="",s=(s=(s+=e.find(".valueForDeleteTaskTimeSpent1").val())+t)+e.find(".valueForDeleteTaskTimeSpent2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})}},window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let s=$(this);var t=$(this).attr("value"),a=$(this).closest(".riskassessment-task-timespent-edit-modal").find(".riskassessment-task-timespent-container");let n=a.attr("value"),r="",o=$(".riskassessment-task-container-"+n).attr("value"),d=$(".id-container").first().find(".riskassessment-total-task-timespent-"+n);var l=a.find("#RiskassessmentTaskTimespentDateEdit"+t).val(),c=a.find("#RiskassessmentTaskTimespentDateEdit"+t+"hour").val(),k=a.find("#RiskassessmentTaskTimespentDateEdit"+t+"min").val(),u=a.find(".riskassessment-task-timespent-comment").val(),u=window.digiriskdolibarr.risk.sanitizeBeforeRequest(u),a=a.find(".riskassessment-task-timespent-duration").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+n)),$.ajax({url:document.URL+"&action=saveRiskAssessmentTaskTimeSpent&token="+e,data:JSON.stringify({riskAssessmentTaskTimeSpentID:t,taskID:n,date:l,hour:c,min:k,comment:u,duration:a}),type:"POST",processData:!1,contentType:!1,success:function(i){s.closest(".modal-active").removeClass("modal-active");var e=$(".messageSuccessTaskTimeSpentEdit"+n);$(".wpeo-loader").removeClass("wpeo-loader"),r=(r=(r+=e.find(".valueForEditTaskTimeSpent1").val())+o)+e.find(".valueForEditTaskTimeSpent2").val(),d.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+n).first()),$(".riskassessment-task-timespent-list-"+n).html($(i).find(".riskassessment-task-timespent-list-"+n).children()),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden")},error:function(i){var e=$(".messageSuccessTaskTimeSpentEdit"+n);r=(r=(r+=e.find(".valueForEditTaskTimeSpent1").val())+o)+e.find(".valueForEditTaskTimeSpent2").val(),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.checkTaskProgress=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".risk-row").find(".riskassessment-task-container"),t=$(this).closest(".riskassessment-task-single-content").attr("value");let a=$(this).closest(".riskassessment-tasks").attr("value"),n="",r=s.attr("value"),o="";s.find(".riskassessment-task-progress-checkbox"+t).hasClass("progress-checkbox-check")?(o=0,s.find(".riskassessment-task-progress-checkbox"+t).toggleClass("progress-checkbox-check").toggleClass("progress-checkbox-uncheck")):s.find(".riskassessment-task-progress-checkbox"+t).hasClass("progress-checkbox-uncheck")&&(o=1,s.find(".riskassessment-task-progress-checkbox"+t).toggleClass("progress-checkbox-uncheck").toggleClass("progress-checkbox-check")),window.saturne.loader.display($(".riskassessment-task-single-"+t));s=window.location.href.replace(/#.*/,"");$.ajax({url:s+"&action=checkTaskProgress&token="+e,data:JSON.stringify({riskAssessmentTaskID:t,taskProgress:o}),type:"POST",processData:!1,contentType:!1,success:function(i){$(".fichecenter.risklist").html($(i).find("#searchFormListRisks"));i=$(".messageSuccessTaskEdit");$(".riskassessment-tasks"+a).fadeOut(800),$(".riskassessment-tasks"+a).fadeIn(800),n=(n=(n+=i.find(".valueForEditTask1").val())+r)+i.find(".valueForEditTask2").val(),i.find(".notice-subtitle .text").text(n),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorTaskEdit");n=(n=(n+=e.find(".valueForEditTask1").val())+r)+e.find(".valueForEditTask2").val(),e.find(".notice-subtitle .text").text(n),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateHour=function(i){$(this).closest(".nowraponall").find(".select-riskassessmenttask-timespent-datehour").remove(),$(this).before('{$("#sendFileForm").load(document.URL+n+"ticket_id="+a+" #fileLinkedTable")})},window.digiriskdolibarr.ticket.removeFile=function(i){let e=$(this).attr("value");e=e.replace("_mini","");var s=$("#ticket_id").val(),t=window.saturne.toolbox.getQuerySeparator(document.URL);fetch(document.URL+t+"action=removefile&filetodelete="+e+"&ticket_id="+s,{method:"POST"}).then(i=>{$(this).parent().parent().hide()})},window.digiriskdolibarr.ticket.addDashBoardTicketInfo=function(){var i=window.saturne.toolbox.getToken(),e=$("#select2-boxcombo-container").attr("title"),s=e.split(" : ")[0],e=e.split(" : ")[2],t=window.saturne.toolbox.getQuerySeparator(document.URL);$.ajax({url:document.URL+t+"action=adddashboardinfo&token="+i,type:"POST",processData:!1,data:JSON.stringify({digiriskelementID:s,catID:e}),contentType:!1,success:function(i){window.location.reload()},error:function(){}})},window.digiriskdolibarr.ticket.closeDashBoardTicketInfo=function(){var i=window.saturne.toolbox.getToken();let e=$(this);var s=e.attr("data-digiriskelementid"),t=e.attr("data-catid"),a=window.saturne.toolbox.getQuerySeparator(document.URL);$.ajax({url:document.URL+a+"action=closedashboardinfo&token="+i,type:"POST",processData:!1,data:JSON.stringify({digiriskelementID:s,catID:t}),contentType:!1,success:function(i){e.closest(".box-flex-item").fadeOut(400),$(".add-widget-box").attr("style",""),$(".add-widget-box").html($(i).find(".add-widget-box").children())},error:function(){}})},window.digiriskdolibarr.ticket.checkValidEmail=function(){0==/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(this.value)?$(this).css("border","3px solid red"):$(this).css("border","3px solid green")},window.digiriskdolibarr.ticket.checkValidPhone=function(){0==/^(?:(?:(?:\+|00)\d{2}[\s]?(?:\(0\)[\s]?)?)|0){1}[1-9]{1}([\s.-]?)(?:\d{2}\1?){3}\d{2}$/.test(this.value)?$(this).css("border","3px solid red"):$(this).css("border","3px solid green")},window.digiriskdolibarr.digiriskusers={},window.digiriskdolibarr.digiriskusers.init=function(){window.digiriskdolibarr.digiriskusers.event()},window.digiriskdolibarr.digiriskusers.event=function(){$(document).on("input",".digirisk-users #firstname",window.digiriskdolibarr.digiriskusers.fillEmail),$(document).on("input",".digirisk-users #lastname",window.digiriskdolibarr.digiriskusers.fillEmail)},window.digiriskdolibarr.digiriskusers.fillEmail=function(i){var e=$(".digirisk-users #firstname").val(),s=$(".digirisk-users #lastname").val(),t=$(".input-domain-mail").val(),e=window.digiriskdolibarr.digiriskusers.removeDiacritics(e+"."+s+"@"+t).toLowerCase();$(".digirisk-users #email").val(e)},window.digiriskdolibarr.digiriskusers.removeDiacritics=function(i){for(var e="",s=i.normalize("NFD"),t=0,a=0;ti.json()).then(i=>{i=i[0].option.matrix[e];t.find(".risk-evaluation-calculated-cotation").find(".risk-evaluation-cotation").attr("data-scale",window.digiriskdolibarr.evaluation.getDynamicScale(i)),t.find(".risk-evaluation-calculated-cotation").find(".risk-evaluation-cotation span").text(i),t.find(".risk-evaluation-content").find(".risk-evaluation-seuil").val(i),window.digiriskdolibarr.risk.haveDataInInput(t)})}},window.digiriskdolibarr.evaluator={},window.digiriskdolibarr.evaluator.init=function(){window.digiriskdolibarr.evaluator.event()},window.digiriskdolibarr.evaluator.event=function(){$(document).on("click",".evaluator-create",window.digiriskdolibarr.evaluator.createEvaluator),$(document).on("change","#fk_user_employer",window.digiriskdolibarr.evaluator.selectUser)},window.digiriskdolibarr.evaluator.selectUser=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".modal-container"),t=s.find("#fk_user_employer").val();window.saturne.loader.display(s.find('input[name="evaluatorJob"]')),$.ajax({url:document.URL+"&action=getEvaluatorJob&token="+e,type:"POST",processData:!1,data:JSON.stringify({userID:t}),contentType:!1,success:function(i){s.find('input[name="evaluatorJob"]').val($(i).find('input[name="evaluatorJob"]').val()),s.find('input[name="evaluatorJob"]').removeClass("wpeo-loader")},error:function(i){}}),window.digiriskdolibarr.evaluator.haveDataInInput(s)},window.digiriskdolibarr.evaluator.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("evaluator-add-modal")&&(0 div:nth-child(1)").text();var l=[];$(this).closest(".modal-container").find(".risk-categories").find(":selected").each(function(){l.push($(this).val())}),$.ajax({url:document.URL+"&action=saveRisk&token="+e,type:"POST",processData:!1,data:JSON.stringify({riskID:t,category:s,comment:r,newParent:o,categories:l}),contentType:!1,success:function(i){$(".wpeo-loader").removeClass("wpeo-loader");var e=$(".messageSuccessRiskEdit"),s=(o==a||n?($(".modal-active").removeClass("modal-active"),$(".risk-description-"+t).html($(i).find(".risk-description-"+t)),$(".risk-row-content-"+t).find(".risk-category .cell-risk").html($(i).find(".risk-row-content-"+t).find(".risk-category .cell-risk").children()),$(".risk-row-content-"+t).find(".risk-category").fadeOut(800),$(".risk-row-content-"+t).find(".risk-category").fadeIn(800),$(".risk-row-content-"+t).find(".risk-description-"+t).fadeOut(800),$(".risk-row-content-"+t).find(".risk-description-"+t).fadeIn(800)):$(".risk-row-content-"+t).fadeOut(800,function(){$(".fichecenter .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormListRisks .opacitymedium.colorblack.paddingleft"))}),""),s=(s=(s+=e.find(".valueForEditRisk1").val())+d)+e.find(".valueForEditRisk2").val();e.find("a").attr("href","#risk_row_"+t),e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskEdit"),s="",s=(s=(s+=e.find(".valueForEditRisk1").val())+d)+e.find(".valueForEditRisk2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.risk.unlinkSharedRisk=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value"),t=(window.saturne.loader.display($(this)),$(".risk_row_"+s).find(".risk-container > div:nth-child(1)").text());var a=document.URL.split(/#/);$.ajax({url:a[0]+"&action=unlinkSharedRisk&token="+e,type:"POST",processData:!1,data:JSON.stringify({riskID:s}),contentType:!1,success:function(i){$(".confirmquestions").html($(i).find(".confirmquestions").children()),$(".fichecenter.sharedrisklist .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormSharedListRisks .opacitymedium.colorblack.paddingleft"));var i=$(".messageSuccessRiskUnlinkShared"),e=($("#risk_row_"+s).fadeOut(800),""),e=(e=(e+=i.find(".valueForUnlinkSharedRisk1").val())+t)+i.find(".valueForUnlinkSharedRisk2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskUnlinkShared"),s="",s=(s=(s+=e.find(".valueForUnlinkSharedRisk1").val())+t)+e.find(".valueForUnlinkSharedRisk2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.risk.sharedRiskBoxLoader=function(i){"Oui"==$(this).text()&&window.saturne.loader.display($("#searchFormSharedListRisks"))},window.digiriskdolibarr.evaluation={},window.digiriskdolibarr.evaluation.init=function(){window.digiriskdolibarr.evaluation.event()},window.digiriskdolibarr.evaluation.event=function(){$(document).on("click",".select-evaluation-method",window.digiriskdolibarr.evaluation.selectEvaluationMethod),$(document).on("click",".cotation-container .risk-evaluation-cotation.cotation",window.digiriskdolibarr.evaluation.selectSeuil),$(document).on("click",".risk-evaluation-create",window.digiriskdolibarr.evaluation.createEvaluation),$(document).on("click",".risk-evaluation-save",window.digiriskdolibarr.evaluation.saveEvaluation),$(document).on("click",".risk-evaluation-delete",window.digiriskdolibarr.evaluation.deleteEvaluation)},window.digiriskdolibarr.evaluation.selectEvaluationMethod=function(i){var e=$(this).closest(".modal-container");0"+e.split(/\(/)[0]+"("+(+s-1)+")"),s-1<1&&$(".fichecenter.risklist").html($(i).find("#searchFormListRisks")),t.removeClass("wpeo-loader"),""),e=(e=(e+=r.find(".valueForDeleteEvaluation1").val())+n)+r.find(".valueForDeleteEvaluation2").val();r.find(".notice-subtitle .text").text(e),r.removeClass("hidden")},error:function(i){var e="",e=(e=(e+=o.find(".valueForDeleteEvaluation1").val())+n)+o.find(".valueForDeleteEvaluation2").val();o.find(".notice-subtitle .text").text(e),o.removeClass("hidden")}})}},window.digiriskdolibarr.evaluation.saveEvaluation=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).closest(".risk-evaluation-edit-modal"),t=s.attr("value");var a=s.find(".risk-evaluation-comment textarea").val();let n=$(this).closest(".risk-row").find(".risk-evaluations-list-content").attr("value"),r=$(".risk-evaluation-ref-"+t).attr("value"),o=$(".risk-evaluation-list-modal-"+n),d=$("#risk_evaluation_list"+n).hasClass("modal-active");var a=window.digiriskdolibarr.risk.sanitizeBeforeRequest(a),l=s.find(".risk-evaluation-method").val(),c=s.find(".risk-evaluation-seuil").val(),k=s.find("#RiskAssessmentDateEdit"+t).val(),u=s.find(".risk-evaluation-photo .filename").val();let m=[];Object.values($(".table-cell.active.cell-"+t)).forEach(function(i){-1<$(i).data("seuil")&&(m[$(i).data("type")]=$(i).data("seuil"))}),window.saturne.loader.display($(this)),$.ajax({url:document.URL+"&action=saveEvaluation&token="+e,type:"POST",processData:!1,data:JSON.stringify({cotation:c,comment:a,method:l,photo:u,date:k,evaluationID:t,criteres:{gravite:m.gravite||0,occurrence:m.occurrence||m.historique||0,protection:m.protection||m.milieu||0,formation:m.formation||m.maitrise||0,exposition:m.exposition||m.frequence||0}}),contentType:!1,success:function(i){$("#risk_evaluation_edit"+t).removeClass("modal-active"),0<$(i).find(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)").length?((d?($(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)")):($(".risk-evaluation-container-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-container-"+t+":not(.last-risk-assessment)"))).fadeIn(800),o.find(".risk-evaluation-ref-"+t).replaceWith($(i).find(".risk-evaluation-ref-"+t)),$(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)").replaceWith($(i).find(".risk-evaluation-container.risk-evaluation-container-"+t+":not(.last-risk-assessment)")),$("#risk_evaluation_add"+n).html($(i).find("#risk_evaluation_add"+n).children())):($(".div-table-responsive").html($(i).find(".div-table-responsive").children()),(d?($(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-ref-"+t+":not(.last-risk-assessment)")):($(".risk-evaluation-container-"+t+":not(.last-risk-assessment)").fadeOut(800),$(".risk-evaluation-container-"+t+":not(.last-risk-assessment)"))).fadeIn(800)),$(".wpeo-loader").removeClass("wpeo-loader");var i=$(".messageSuccessEvaluationEdit"),e=(s.find("#risk_evaluation_edit"+t).removeClass("modal-active"),""),e=(e=(e+=i.find(".valueForEditEvaluation1").val())+r)+i.find(".valueForEditEvaluation2").val();i.find("a").attr("href","#risk_row_"+n),i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(){var i=$(".messageErrorEvaluationEdit"),e="",e=(e=(e+=i.find(".valueForEditEvaluation1").val())+r)+i.find(".valueForEditEvaluation2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")}})},window.digiriskdolibarr.risksign={},window.digiriskdolibarr.risksign.init=function(){window.digiriskdolibarr.risksign.event()},window.digiriskdolibarr.risksign.event=function(){$(document).on("click",".risksign-category-danger .item, .wpeo-table .risksign-category-danger .item",window.digiriskdolibarr.risksign.selectRiskSign),$(document).on("click",".risksign-create:not(.button-disable)",window.digiriskdolibarr.risksign.createRiskSign),$(document).on("click",".risksign-save",window.digiriskdolibarr.risksign.saveRiskSign),$(document).on("click",".risksign-unlink-shared",window.digiriskdolibarr.risksign.unlinkSharedRiskSign)},window.digiriskdolibarr.risksign.selectRiskSign=function(i){var e=$(this),e=(e.closest(".content").removeClass("active"),e.closest(".wpeo-dropdown").find(".dropdown-toggle span").hide(),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").show(),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").attr("src",e.find("img").attr("src")),e.closest(".wpeo-dropdown").find(".dropdown-toggle img").attr("aria-label",e.closest(".wpeo-tooltip-event").attr("aria-label")),e.closest(".fichecenter").find(".input-hidden-danger").val(e.data("id")),$(this).closest(".modal-container"));window.digiriskdolibarr.risksign.haveDataInInput(e)},window.digiriskdolibarr.risksign.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("risksign-add-modal")&&0<=i.find('input[name="risksign_category_id"]').val()&&i.find(".button-disable").removeClass("button-disable")},window.digiriskdolibarr.risksign.createRiskSign=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".fichecenter").find(".risksign-content"),t=s.find(".risksign-category input").val(),s=s.find(".risksign-description textarea").val();window.saturne.loader.display($(".fichecenter.risksignlist")),$.ajax({url:document.URL+"&action=add&token="+e,type:"POST",data:JSON.stringify({riskSignCategory:t,riskSignDescription:s}),processData:!1,contentType:!1,success:function(i){$(".fichecenter.risksignlist").html($(i).find("#searchFormListRiskSigns"));var e=$(".messageSuccessRiskSignCreate");$(".fichecenter.risksignlist").removeClass("wpeo-loader"),e.html($(i).find(".risksign-create-success-notice")),e.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskCreate");e.html($(i).find(".risksign-create-error-notice")),e.removeClass("hidden")}})},window.digiriskdolibarr.risksign.saveRiskSign=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).attr("value");let t=$(this).closest(".risksign-container").find(".risksign-content"),a="";var n=t.find(".risksign-category input").val(),r=t.find(".risksign-description textarea").val();let o=$(".risksign_row_"+s).find(".risksign-container > div:nth-child(1)").text();window.saturne.loader.display(t),$.ajax({url:document.URL+"&action=saveRiskSign&token="+e,data:JSON.stringify({riskSignID:s,riskSignCategory:n,riskSignDescription:r}),type:"POST",processData:!1,contentType:!1,success:function(i){$(".fichecenter.risksignlist").html($(i).find("#searchFormListRiskSigns"));i=$(".messageSuccessRiskSignEdit");t.removeClass("wpeo-loader"),a=(a=(a+=i.find(".valueForEditRiskSign1").val())+o)+i.find(".valueForEditRiskSign2").val(),i.find(".notice-subtitle .text").text(a),i.removeClass("hidden")},error:function(){var i=$(".messageErrorRiskSignEdit");t.removeClass("wpeo-loader"),a=(a=(a+=i.find(".valueForEditRiskSign1").val())+o)+i.find(".valueForEditRiskSign2").val(),i.find(".notice-subtitle .text").text(a),i.removeClass("hidden")}})},window.digiriskdolibarr.risksign.unlinkSharedRiskSign=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value"),t=(window.saturne.loader.display($(this)),$(".risksign_row_"+s).find(".risksign-container > div:nth-child(1)").text());var a=document.URL.split(/#/);$.ajax({url:a[0]+"&action=unlinkSharedRiskSign&token="+e,type:"POST",processData:!1,data:JSON.stringify({risksignID:s}),contentType:!1,success:function(i){$(".fichecenter.sharedrisksignlist .opacitymedium.colorblack.paddingleft").html($(i).find("#searchFormSharedListRiskSigns .opacitymedium.colorblack.paddingleft"));var i=$(".messageSuccessRiskSignUnlinkShared"),e=($("#risksign_row_"+s).fadeOut(800),""),e=(e=(e+=i.find(".valueForUnlinkSharedRiskSign1").val())+t)+i.find(".valueForUnlinkSharedRiskSign2").val();i.find(".notice-subtitle .text").text(e),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorRiskSignUnlinkShared"),s="",s=(s=(s+=e.find(".valueForUnlinkSharedRiskSign1").val())+t)+e.find(".valueForUnlinkSharedRiskSign2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask={},window.digiriskdolibarr.riskassessmenttask.init=function(){window.digiriskdolibarr.riskassessmenttask.event()},window.digiriskdolibarr.riskassessmenttask.event=function(){$(document).on("input",".riskassessment-task-label",window.digiriskdolibarr.riskassessmenttask.fillRiskAssessmentTaskLabel),$(document).on("click",".riskassessment-task-create",window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTask),$(document).on("click",".riskassessment-task-save",window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTask),$(document).on("click",".riskassessment-task-delete",window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTask),$(document).on("click",".riskassessment-task-timespent-create",window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-timespent-save",window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-timespent-delete",window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTaskTimeSpent),$(document).on("click",".riskassessment-task-progress-checkbox:not(.riskassessment-task-progress-checkbox-readonly)",window.digiriskdolibarr.riskassessmenttask.checkTaskProgress),$(document).on("change","#RiskassessmentTaskTimespentDatehour",window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateHour),$(document).on("change","#RiskassessmentTaskTimespentDatemin",window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateMin),$(document).on("keyup",".riskassessment-task-label",window.digiriskdolibarr.riskassessmenttask.checkRiskassessmentTaskLabelLength),$(document).on("click",".listingHeaderTaskTooltip",window.digiriskdolibarr.riskassessmenttask.redirectOnSharedTaskConfig)},window.digiriskdolibarr.riskassessmenttask.fillRiskAssessmentTaskLabel=function(i){var e=$(this).closest(".modal-container");window.digiriskdolibarr.riskassessmenttask.haveDataInInput(e)},window.digiriskdolibarr.riskassessmenttask.haveDataInInput=function(i){i=i.parent().parent();i.hasClass("riskassessment-task-add-modal")&&i.find('input[name="label"]').val().length&&i.find(".button-disable").removeClass("button-disable")},window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".riskassessment-task-add-modal"),t=s.find(".modal-risk").attr("value"),s=s.find(".riskassessment-task-container"),a=s.find(".riskassessment-task-label").val(),a=window.digiriskdolibarr.risk.sanitizeBeforeRequest(a),n=s.find("#RiskassessmentTaskDateStart"+t).val(),r=s.find("#RiskassessmentTaskDateStart"+t+"hour").val(),o=s.find("#RiskassessmentTaskDateStart"+t+"min").val(),d=s.find("#RiskassessmentTaskDateEnd"+t).val(),l=s.find("#RiskassessmentTaskDateEnd"+t+"hour").val(),c=s.find("#RiskassessmentTaskDateEnd"+t+"min").val(),s=s.find(".riskassessment-task-budget").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-tasks"+t)),$.ajax({url:document.URL+"&action=addRiskAssessmentTask&token="+e,type:"POST",data:JSON.stringify({tasktitle:a,dateStart:n,hourStart:r,minStart:o,dateEnd:d,hourEnd:l,minEnd:c,budget:s,riskToAssign:t}),processData:!1,contentType:!1,success:function(i){$(".tasks-list-container-"+t).replaceWith($(i).find(".tasks-list-container-"+t));var e=$(".messageSuccessTaskCreate");$(".riskassessment-tasks"+t).fadeOut(800),$(".riskassessment-tasks"+t).fadeIn(800),e.find("a").attr("href","#risk_row_"+t),e.html($(i).find(".task-create-success-notice")),e.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e=$(".messageErrorTaskCreate"),s=($("#risk_assessment_task_add"+t).removeClass("modal-active"),""),s=(s=(s+=e.find(".valueForCreateTask1").val())+e.find(".valueForCreateTask2").val())+" : "+i.message;e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken(),t=$(this).closest(".wpeo-table.riskassessment-tasks").attr("value"),a=$(this).closest(".riskassessment-task-single-content").attr("value"),s=$(this).closest(".riskassessment-task-container-"+a).find(".labelForDelete").val();let n=$(".messageSuccessTaskDelete"),r=$(".messageErrorTaskDelete");if(1!=confirm(s))return!1;{let s=$(".riskassessment-task-container-"+a).attr("value");window.saturne.loader.display($(".riskassessment-task-container-"+a)),$.ajax({url:document.URL+"&action=deleteRiskAssessmentTask&deletedRiskAssessmentTaskId="+a+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(i){console.log($(".riskassessment-task-listing-wrapper-"+t)),console.log(t),$(".riskassessment-task-listing-wrapper-"+t).replaceWith($(i).find(".riskassessment-task-listing-wrapper-"+t)),$(".riskassessment-tasks"+t).fadeOut(800),$(".riskassessment-tasks"+t).fadeIn(800);i="",i=(i=(i+=n.find(".valueForDeleteTask1").val())+s)+n.find(".valueForDeleteTask2").val();n.find("a").attr("href","#risk_row_"+t),n.find(".notice-subtitle .text").text(i),n.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e="",e=(e=(e=(e+=r.find(".valueForDeleteTask1").val())+s)+r.find(".valueForDeleteTask2").val())+" : "+i.message;r.find(".notice-subtitle .text").text(e),r.removeClass("hidden")}})}},window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTask=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value");var t=$(this).closest(".modal-container"),a=$(this).closest(".modal-risk").attr("value");let n="";var r=t.find(".riskassessment-task-label"+s).val(),r=window.digiriskdolibarr.risk.sanitizeBeforeRequest(r);let o=$(".riskassessment-task-single-"+s+" .riskassessment-task-reference").attr("value"),d=0;t.find(".riskassessment-task-progress-checkbox"+s).is(":checked")&&(d=1);var l=t.find("#RiskassessmentTaskDateStartEdit"+s).val(),c=t.find("#RiskassessmentTaskDateStartEdit"+s+"hour").val(),k=t.find("#RiskassessmentTaskDateStartEdit"+s+"min").val(),u=t.find("#RiskassessmentTaskDateEndEdit"+s).val(),m=t.find("#RiskassessmentTaskDateEndEdit"+s+"hour").val(),v=t.find("#RiskassessmentTaskDateEndEdit"+s+"min").val(),t=t.find(".riskassessment-task-budget"+s).val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+s)),$.ajax({url:document.URL+"&action=saveRiskAssessmentTask&token="+e,data:JSON.stringify({riskAssessmentTaskID:s,tasktitle:r,dateStart:l,hourStart:c,minStart:k,dateEnd:u,hourEnd:m,minEnd:v,budget:t,taskProgress:d}),type:"POST",processData:!1,contentType:!1,success:function(i){$("#risk_assessment_task_edit"+s).removeClass("modal-active"),$(".riskassessment-task-container-"+s).replaceWith($(i).find(".riskassessment-task-container-"+s).first());i=$(".messageSuccessTaskEdit");$(".riskassessment-tasks"+a).fadeOut(800),$(".riskassessment-tasks"+a).fadeIn(800),n=(n=(n+=i.find(".valueForEditTask1").val())+o)+i.find(".valueForEditTask2").val(),$(".wpeo-loader").removeClass("wpeo-loader"),$(".loader-spin").remove(),i.find("a").attr("href","#risk_row_"+a),i.find(".notice-subtitle .text").text(n),i.removeClass("hidden")},error:function(i){$(".wpeo-loader").removeClass("wpeo-loader"),window.scrollTo(0,0);var i=JSON.parse(i.responseText),e=$(".messageErrorTaskEdit");$("#risk_assessment_task_edit"+s).removeClass("modal-active"),$(".wpeo-loader").removeClass("wpeo-loader"),n=(n=(n=(n+=e.find(".valueForEditTask1").val())+o)+e.find(".valueForEditTask2").val()+" : ")+i.message,e.find(".notice-subtitle .text").text(n),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.createRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let s=$(this).attr("value");var t=$(this).closest(".riskassessment-task-edit-modal"),a=t.find(".riskassessment-task-timespent-container");let n=t.find("riskassessment-task-single").attr("value"),r="",o=t.find(".riskassessment-task-reference").attr("value"),d=$(".id-container").find(".riskassessment-total-task-timespent-"+s);var t=a.find("#RiskassessmentTaskTimespentDate"+s).val(),l=a.find("#RiskassessmentTaskTimespentDate"+s+"hour").val(),c=a.find("#RiskassessmentTaskTimespentDate"+s+"min").val(),k=a.find(".riskassessment-task-timespent-comment").val(),k=window.digiriskdolibarr.risk.sanitizeBeforeRequest(k),a=a.find(".riskassessment-task-timespent-duration").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+s)),$.ajax({url:document.URL+"&action=addRiskAssessmentTaskTimeSpent&token="+e,type:"POST",data:JSON.stringify({taskID:s,date:t,hour:l,min:c,comment:k,duration:a}),processData:!1,contentType:!1,success:function(i){var e=$(".messageSuccessTaskTimeSpentCreate"+s);$(".riskassessment-tasks"+n).fadeOut(800),$(".riskassessment-tasks"+n).fadeIn(800),r=(r=(r+=e.find(".valueForCreateTaskTimeSpent1").val())+o)+e.find(".valueForCreateTaskTimeSpent2").val(),$(".riskassessment-task-timespent-container").find(".riskassessment-task-timespent-list-"+s).replaceWith($(i).find(".riskassessment-task-timespent-container").find(".riskassessment-task-timespent-list-"+s)),$(".riskassessment-task-container-"+s).closest(".riskassessment-tasks").replaceWith($(i).find(".riskassessment-task-container-"+s).closest(".riskassessment-tasks")),$(".loader-spin").remove(),$(".wpeo-loader").removeClass("wpeo-loader"),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden"),d.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+s).first())},error:function(i){$(this).closest(".risk-row-content-"+n).removeClass("wpeo-loader");var e=$(".messageErrorTaskTimeSpentCreate"+s);e.html($(i).find(".task-timespent-create-error-notice")),e.removeClass("hidden")},complete:function(){$("#risk_assessment_task_edit"+s+".wpeo-modal").addClass("modal-active")}})},window.digiriskdolibarr.riskassessmenttask.deleteRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let a=$(this).closest(".riskassessment-task-timespent-list").attr("value"),n=$(this).attr("value");var s=$(this).attr("value"),t=$(this).closest(".riskassessment-task-timespent-"+n).find(".labelForDelete").val();let r=$(".id-container").first().find(".riskassessment-total-task-timespent-"+a);if(1!=confirm(t))return!1;{let t=$(".riskassessment-task-container-"+a).attr("value");window.saturne.loader.display($(this)),$.ajax({url:document.URL+"&action=deleteRiskAssessmentTaskTimeSpent&deletedRiskAssessmentTaskTimeSpentId="+s+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(i){var e=$(".messageSuccessTaskTimeSpentDelete"+a),s=($(".riskassessment-task-timespent-"+n).fadeOut(800),""),s=(s=(s+=e.find(".valueForDeleteTaskTimeSpent1").val())+t)+e.find(".valueForDeleteTaskTimeSpent2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden"),r.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+a).first())},error:function(i){var e=$(".messageErrorTaskDeleteTimeSpent"+a),s="",s=(s=(s+=e.find(".valueForDeleteTaskTimeSpent1").val())+t)+e.find(".valueForDeleteTaskTimeSpent2").val();e.find(".notice-subtitle .text").text(s),e.removeClass("hidden")}})}},window.digiriskdolibarr.riskassessmenttask.saveRiskAssessmentTaskTimeSpent=function(i){var e=window.saturne.toolbox.getToken();let s=$(this);var t=$(this).attr("value"),a=$(this).closest(".riskassessment-task-timespent-edit-modal").find(".riskassessment-task-timespent-container");let n=a.attr("value"),r="",o=$(".riskassessment-task-container-"+n).attr("value"),d=$(".id-container").first().find(".riskassessment-total-task-timespent-"+n);var l=a.find("#RiskassessmentTaskTimespentDateEdit"+t).val(),c=a.find("#RiskassessmentTaskTimespentDateEdit"+t+"hour").val(),k=a.find("#RiskassessmentTaskTimespentDateEdit"+t+"min").val(),u=a.find(".riskassessment-task-timespent-comment").val(),u=window.digiriskdolibarr.risk.sanitizeBeforeRequest(u),a=a.find(".riskassessment-task-timespent-duration").val();window.saturne.loader.display($(this)),window.saturne.loader.display($(".riskassessment-task-single-"+n)),$.ajax({url:document.URL+"&action=saveRiskAssessmentTaskTimeSpent&token="+e,data:JSON.stringify({riskAssessmentTaskTimeSpentID:t,taskID:n,date:l,hour:c,min:k,comment:u,duration:a}),type:"POST",processData:!1,contentType:!1,success:function(i){s.closest(".modal-active").removeClass("modal-active");var e=$(".messageSuccessTaskTimeSpentEdit"+n);$(".wpeo-loader").removeClass("wpeo-loader"),r=(r=(r+=e.find(".valueForEditTaskTimeSpent1").val())+o)+e.find(".valueForEditTaskTimeSpent2").val(),d.html($(i).find(".modal-content").find(".riskassessment-total-task-timespent-"+n).first()),$(".riskassessment-task-timespent-list-"+n).html($(i).find(".riskassessment-task-timespent-list-"+n).children()),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden")},error:function(i){var e=$(".messageSuccessTaskTimeSpentEdit"+n);r=(r=(r+=e.find(".valueForEditTaskTimeSpent1").val())+o)+e.find(".valueForEditTaskTimeSpent2").val(),e.find(".notice-subtitle .text").text(r),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.checkTaskProgress=function(i){var e=window.saturne.toolbox.getToken(),s=$(this).closest(".risk-row").find(".riskassessment-task-container"),t=$(this).closest(".riskassessment-task-single-content").attr("value");let a=$(this).closest(".riskassessment-tasks").attr("value"),n="",r=s.attr("value"),o="";s.find(".riskassessment-task-progress-checkbox"+t).hasClass("progress-checkbox-check")?(o=0,s.find(".riskassessment-task-progress-checkbox"+t).toggleClass("progress-checkbox-check").toggleClass("progress-checkbox-uncheck")):s.find(".riskassessment-task-progress-checkbox"+t).hasClass("progress-checkbox-uncheck")&&(o=1,s.find(".riskassessment-task-progress-checkbox"+t).toggleClass("progress-checkbox-uncheck").toggleClass("progress-checkbox-check")),window.saturne.loader.display($(".riskassessment-task-single-"+t));s=window.location.href.replace(/#.*/,"");$.ajax({url:s+"&action=checkTaskProgress&token="+e,data:JSON.stringify({riskAssessmentTaskID:t,taskProgress:o}),type:"POST",processData:!1,contentType:!1,success:function(i){$(".fichecenter.risklist").html($(i).find("#searchFormListRisks"));i=$(".messageSuccessTaskEdit");$(".riskassessment-tasks"+a).fadeOut(800),$(".riskassessment-tasks"+a).fadeIn(800),n=(n=(n+=i.find(".valueForEditTask1").val())+r)+i.find(".valueForEditTask2").val(),i.find(".notice-subtitle .text").text(n),i.removeClass("hidden")},error:function(i){var e=$(".messageErrorTaskEdit");n=(n=(n+=e.find(".valueForEditTask1").val())+r)+e.find(".valueForEditTask2").val(),e.find(".notice-subtitle .text").text(n),e.removeClass("hidden")}})},window.digiriskdolibarr.riskassessmenttask.selectRiskassessmentTaskTimespentDateHour=function(i){$(this).closest(".nowraponall").find(".select-riskassessmenttask-timespent-datehour").remove(),$(this).before('{$("#sendFileForm").load(document.URL+n+"ticket_id="+a+" #fileLinkedTable")})},window.digiriskdolibarr.ticket.removeFile=function(i){let e=$(this).attr("value");e=e.replace("_mini","");var s=$("#ticket_id").val(),t=window.saturne.toolbox.getQuerySeparator(document.URL);fetch(document.URL+t+"action=removefile&filetodelete="+e+"&ticket_id="+s,{method:"POST"}).then(i=>{$(this).parent().parent().hide()})},window.digiriskdolibarr.ticket.addDashBoardTicketInfo=function(){var i=window.saturne.toolbox.getToken(),e=$("#select2-boxcombo-container").attr("title"),s=e.split(" : ")[0],e=e.split(" : ")[2],t=window.saturne.toolbox.getQuerySeparator(document.URL);$.ajax({url:document.URL+t+"action=adddashboardinfo&token="+i,type:"POST",processData:!1,data:JSON.stringify({digiriskelementID:s,catID:e}),contentType:!1,success:function(i){window.location.reload()},error:function(){}})},window.digiriskdolibarr.ticket.closeDashBoardTicketInfo=function(){var i=window.saturne.toolbox.getToken();let e=$(this);var s=e.attr("data-digiriskelementid"),t=e.attr("data-catid"),a=window.saturne.toolbox.getQuerySeparator(document.URL);$.ajax({url:document.URL+a+"action=closedashboardinfo&token="+i,type:"POST",processData:!1,data:JSON.stringify({digiriskelementID:s,catID:t}),contentType:!1,success:function(i){e.closest(".box-flex-item").fadeOut(400),$(".add-widget-box").attr("style",""),$(".add-widget-box").html($(i).find(".add-widget-box").children())},error:function(){}})},window.digiriskdolibarr.ticket.checkValidEmail=function(){0==/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(this.value)?$(this).css("border","3px solid red"):$(this).css("border","3px solid green")},window.digiriskdolibarr.ticket.checkValidPhone=function(){0==/^(?:(?:(?:\+|00)\d{2}[\s]?(?:\(0\)[\s]?)?)|0){1}[1-9]{1}([\s.-]?)(?:\d{2}\1?){3}\d{2}$/.test(this.value)?$(this).css("border","3px solid red"):$(this).css("border","3px solid green")},window.digiriskdolibarr.digiriskusers={},window.digiriskdolibarr.digiriskusers.init=function(){window.digiriskdolibarr.digiriskusers.event()},window.digiriskdolibarr.digiriskusers.event=function(){$(document).on("input",".digirisk-users #firstname",window.digiriskdolibarr.digiriskusers.fillEmail),$(document).on("input",".digirisk-users #lastname",window.digiriskdolibarr.digiriskusers.fillEmail)},window.digiriskdolibarr.digiriskusers.fillEmail=function(i){var e=$(".digirisk-users #firstname").val(),s=$(".digirisk-users #lastname").val(),t=$(".input-domain-mail").val(),e=window.digiriskdolibarr.digiriskusers.removeDiacritics(e+"."+s+"@"+t).toLowerCase();$(".digirisk-users #email").val(e)},window.digiriskdolibarr.digiriskusers.removeDiacritics=function(i){for(var e="",s=i.normalize("NFD"),t=0,a=0;t Défaut : Niveau 1 + + # # DigiriskDolibarr @@ -373,6 +378,8 @@ ErrorContactHasAtLeastOneChildOfTypeFirePermit = Le contact est lié à au mo ConfirmDeleteFirePermit = Êtes-vous sûr de vouloir supprimer ce permis de feu ? FirePermitRole = Les rôles du permis de feu FirepermitSchedules = Horaires du permis de feu +LinkDigiriskdolibarr_firepermit = Activer le lien avec les permis de feu +LinkDigiriskdolibarr_firepermitDescription = Permet la liaison entre les permis de feu et les modèles # Email - Mail FirePermitLabel = Récapitulatif du permis de feu @@ -908,6 +915,7 @@ RiskWellCreated = Risque créé RiskNotCreated = Erreur lors de la création du risque RiskWellEdited = Risque édité RiskNotEdited = Erreur lors de l'édition du risque +RiskList = Listing de risques AddRiskTitle = Ajout du risque AddRiskButton = Ajouter le risque EditRisk = Édition du risque @@ -916,6 +924,7 @@ RiskCategoryEdit = Catégorie de risque RiskCategoryEditDescription = Activer la modification de la catégorie d'un risque existant HowToEditRiskCategory = Pour modifier la catégorie du risque, cliquez sur le picto de la catégorie DigiriskElementRisksList = Liste des risques +DigiriskElementRisk = Risques RiskDescriptionNotEnabled = Le champ description du risque n'est pas activé HowToEnableRiskDescription = Pour activer le champ description du risque, allez dans "Configuration du module -> Document Unique" HowToEnableRiskCategoryEdit = Pour activer la modification de la catégorie de risque, allez dans "Configuration du module -> Document Unique" @@ -975,10 +984,17 @@ CategoryOnRiskDescription = Permet d'attribuer des tags/catégori # Stats - Statistiques -GreyRisk = Risque faible -OrangeRisk = Risque à planifier -RedRisk = Risque à traiter -BlackRisk = Risque inacceptable +GreyRisk = Risque faible +OrangeRisk = Risque à planifier +RedRisk = Risque à traiter +BlackRisk = Risque inacceptable +RisksRepartitionByDangerCategories = Répartition des risques par catégorie de danger +RiskListsByDangerCategories = Liste des risques par catégorie de danger +DigiriskElementsRepartitionByDepth = Répartition de l'arborescence des groupements de niveau %s +RisksRepartitionByDangerCategoriesAndCriticality = Répartition des risques par catégorie de danger et criticité +NumberOfRisks = Nombre de risques +DangerCategories = Catégories de danger +RisksRepartitionByDigiriskElement = Répartition des risques par groupement / unité de travail %s @@ -1146,6 +1162,7 @@ TaskNotDeleted = Erreur lors de la suppression de la t TasksManagement = Gestion des tâches SelectProject = Choix du projet DUProject = Projet lié aux tâches des risques +EnvironmentProject = Projet lié aux tâches des risques environnementaux NoTaskLinked = Pas de tâche en cours TaskList = Liste des tâches du risque TaskCreate = Ajout de la tâche @@ -1214,7 +1231,6 @@ TaskHideBudgetInDocumentDescription = Masquer le budget de la tâche dans l Register = Registre Send = Envoyer TicketSent = Ticket envoyé -CreateTicket = Ticket FilesLinked = Photos / Pièces jointes AddDocument = Ajouter document LastnamePlaceholder = Exemple : Dupont @@ -1333,7 +1349,8 @@ TicketDateVisible = Afficher le champ Date pour créer un TicketDateVisibleHelp = Activer cette option pour afficher le champ Date dans l'interface publique et le rendre obligatoire si nécessaire QRCodeGenerated = QRCode généré FkTicket = Ticket lié - +PublicTicket = Interface publique des tickets +TicketPublicInterfaceForbidden = Accès interdit à l'interface publique des tickets # Stats - Statistiques TicketStatistics = Statistiques des tickets @@ -1360,6 +1377,10 @@ Superior = Supérieur à TimeRangeAdded = Contrainte ajoutée TimeRangeDeleted = Contrainte supprimée +NumberOfTicketsByMainTagAndByDigiriskElement = Nombre de registres par catégorie et par GP +NumberOfTicketsByMainSubTagAndByDigiriskElement = Nombre de registres par sous-catégorie et par GP +NumberOfTicketsByYear = Nombre de tickets par année + # Email - Email The = Le @@ -1433,7 +1454,7 @@ AT = au LabourInspectorName = DREETS UrlLabourInspector = https://travail-emploi.gouv.fr/ministere/organisation/article/dreets-directions-regionales-de-l-economie-de-l-emploi-du-travail-et-des -IDCCTooltip = Ce champ provient du module Digirisk pour Dolibarr
La nomenclature des conventions collectives provient de travail-emploi.gouv.fr +IDCCTooltip = Ce champ provient du module Digirisk pour Dolibarr
La nomenclature des conventions collectives provient de travail-emploi.gouv.fr NoEmailContact = Pas d'email sur ce contact AddMedia = Ajouter un média NoMediaLinked = Pas de média lié diff --git a/lib/digiriskdolibarr_digiriskelement.lib.php b/lib/digiriskdolibarr_digiriskelement.lib.php index 82fe93208..ae9bd0f28 100644 --- a/lib/digiriskdolibarr_digiriskelement.lib.php +++ b/lib/digiriskdolibarr_digiriskelement.lib.php @@ -41,6 +41,13 @@ function digiriskelement_prepare_head(DigiriskElement $object) $head = []; if ($object->id > 0) { + if ($user->rights->digiriskdolibarr->digiriskelement->read) { + $head[$h][0] = dol_buildpath('/digiriskdolibarr/view/digiriskelement/digiriskelement_informations.php', 1) . '?id=' . $object->id; + $head[$h][1] = $conf->browser->layout != 'phone' ? '' . $langs->trans('Informations') : ''; + $head[$h][2] = 'elementInformations'; + $h++; + } + if ($user->rights->digiriskdolibarr->risk->read) { $head[$h][0] = dol_buildpath('/digiriskdolibarr/view/digiriskelement/digiriskelement_risk.php', 1) . '?id=' . $object->id . '&type=risk'; $head[$h][1] = $conf->browser->layout != 'phone' ? '' . $langs->trans('Risks') : ''; diff --git a/public/ticket/create_ticket.php b/public/ticket/create_ticket.php index 0229f4b86..c611390f3 100644 --- a/public/ticket/create_ticket.php +++ b/public/ticket/create_ticket.php @@ -537,7 +537,7 @@ } if ($entity > 0 && dolibarr_get_const($db, 'DIGIRISKDOLIBARR_TICKET_EXTRAFIELDS', 0) == 1) { if ($conf->global->DIGIRISKDOLIBARR_TICKET_DIGIRISKELEMENT_VISIBLE) { - $selectDigiriskElement = '
global->DIGIRISKDOLIBARR_TICKET_DIGIRISKELEMENT_REQUIRED) ? 'style="font-weight:600"' : '') . '>' . $langs->trans('Service') . (($conf->global->DIGIRISKDOLIBARR_TICKET_DIGIRISKELEMENT_REQUIRED) ? ' *' : '') . ''; + $selectDigiriskElement = '
global->DIGIRISKDOLIBARR_TICKET_DIGIRISKELEMENT_REQUIRED) ? 'style="font-weight:600"' : '') . '>' . $langs->trans('Service') . (($conf->global->DIGIRISKDOLIBARR_TICKET_DIGIRISKELEMENT_REQUIRED) ? ' *' : '') . ''; $deletedElements = $digiriskelement->getMultiEntityTrashList(); if (empty($deletedElements)) { diff --git a/public/ticket/ticket_success.php b/public/ticket/ticket_success.php index 6a278f2c8..e56a2bd64 100644 --- a/public/ticket/ticket_success.php +++ b/public/ticket/ticket_success.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,81 +16,98 @@ */ /** - * \file public/ticket/ticket_success.php - * \ingroup digiriskdolibarr - * \brief Public page to view success on ticket + * \file public/ticket/ticket_success.php + * \ingroup digiriskdolibarr + * \brief Public page to view success on ticket */ -if ( ! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); -if ( ! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); -if ( ! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); -if ( ! defined('NOLOGIN')) define("NOLOGIN", 1); // This means this output page does not require to be logged. -if ( ! defined('NOCSRFCHECK')) define("NOCSRFCHECK", 1); // We accept to go on this page from external web site. -if ( ! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip -if ( ! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); - -// Load Dolibarr environment -$res = 0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if ( ! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"] . "/main.inc.php"; -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; -while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } -if ( ! $res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1)) . "/main.inc.php")) $res = @include substr($tmp, 0, ($i + 1)) . "/main.inc.php"; -if ( ! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1))) . "/main.inc.php")) $res = @include dirname(substr($tmp, 0, ($i + 1))) . "/main.inc.php"; -// Try main.inc.php using relative path -if ( ! $res && file_exists("../../main.inc.php")) $res = @include "../../main.inc.php"; -if ( ! $res && file_exists("../../../main.inc.php")) $res = @include "../../../main.inc.php"; -if ( ! $res && file_exists("../../../../main.inc.php")) $res = @include "../../../../main.inc.php"; -if ( ! $res) die("Include of main fails"); - -// Libraries +if (!defined('NOTOKENRENEWAL')) { + define('NOTOKENRENEWAL', 1); +} +if (!defined('NOREQUIREMENU')) { + define('NOREQUIREMENU', 1); +} +if (!defined('NOREQUIREHTML')) { + define('NOREQUIREHTML', 1); +} +if (!defined('NOLOGIN')) { // This means this output page does not require to be logged + define('NOLOGIN', 1); +} +if (!defined('NOCSRFCHECK')) { // We accept to go on this page from external website + define('NOCSRFCHECK', 1); +} +if (!defined('NOIPCHECK')) { // Do not check IP defined into conf $dolibarr_main_restrict_ip + define('NOIPCHECK', 1); +} +if (!defined('NOBROWSERNOTIF')) { + define('NOBROWSERNOTIF', 1); +} + +// Load DigiriskDolibarr environment +if (file_exists('../../digiriskdolibarr.main.inc.php')) { + require_once __DIR__ . '/../../digiriskdolibarr.main.inc.php'; +} elseif (file_exists('../../../digiriskdolibarr.main.inc.php')) { + require_once __DIR__ . '/../../../digiriskdolibarr.main.inc.php'; +} else { + die('Include of digiriskdolibarr main fails'); +} + +// Load Dolibarr libraries require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticket.class.php'; -require_once '../../lib/digiriskdolibarr_function.lib.php'; -global $db, $langs, $mysoc; +// Global variables definitions +global $conf, $db, $hookmanager, $langs; // Load translation files required by the page -$langs->loadLangs(array("digiriskdolibarr@digiriskdolibarr", "other", "errors")); +saturne_load_langs(); + +// Get parameters +$trackID = GETPOST('track_id', 'alpha'); // Initialize technical objects $object = new Ticket($db); -// Get parameters -$track_id = GETPOST('track_id'); +$hookmanager->initHooks(['publicticket', 'saturnepublicinterface']); // Note that conf->hooks_modules contains array + +// Load object +$object->fetch(0, '', $trackID); /* * View */ -if (empty($conf->global->DIGIRISKDOLIBARR_TICKET_ENABLE_PUBLIC_INTERFACE)) { - print $langs->trans('TicketPublicInterfaceForbidden'); - exit; -} +$title = $langs->trans('PublicTicket'); -$morejs = array("/digiriskdolibarr/js/ticket-pad.min.js", "/digiriskdolibarr/js/digiriskdolibarr.js"); -$morecss = array("/digiriskdolibarr/css/digiriskdolibarr.css"); +$conf->dol_hide_topmenu = 1; +$conf->dol_hide_leftmenu = 1; -digiriskdolibarr_ticket_header($langs->trans("CreateTicket"), "", 0, 0, $morejs, $morecss); +saturne_header(0,'', $title, '', '', 0, 0, [], [], '', 'page-public-card'); -$object->fetch('', '', $track_id); +if (!getDolGlobalInt('DIGIRISKDOLIBARR_TICKET_ENABLE_PUBLIC_INTERFACE')) { + print $langs->transnoentities('TicketPublicInterfaceForbidden'); + exit; +} -$substitutionarray = getCommonSubstitutionArray($langs, 0, null, $object); -complete_substitutions_array($substitutionarray, $langs, $object); -$ticketsuccessmessage = make_substitutions($langs->transnoentities($conf->global->DIGIRISKDOLIBARR_TICKET_SUCCESS_MESSAGE), $substitutionarray); +$substitutionArray = getCommonSubstitutionArray($langs, 0, null, $object); +complete_substitutions_array($substitutionArray, $langs, $object); +$ticketSuccessMessage = make_substitutions($langs->transnoentities(getDolGlobalString('DIGIRISKDOLIBARR_TICKET_SUCCESS_MESSAGE')), $substitutionArray); ?> -
-

trans("TicketSuccess") . ' ' ?>

- - - transnoentities($ticketsuccessmessage) ?: $langs->transnoentities('YouMustNotifyYourHierarchy'); ?> - - +
+
+
+ +
trans('TicketSuccess') . ' ' . $object->ref . ''; ?>
+ + + transnoentities($ticketSuccessMessage) ?: $langs->transnoentities('YouMustNotifyYourHierarchy'); ?> + + +
+
close(); - diff --git a/sql/update.sql b/sql/update.sql index 35397d1da..4d0e70984 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -252,3 +252,6 @@ DELETE t1 FROM llx_c_digiriskdolibarr_action_trigger t1 JOIN llx_c_digiriskdolib -- 10.0.0 ALTER TABLE `llx_digiriskdolibarr_risk` ADD `type` VARCHAR(255) NOT NULL DEFAULT 'risk' AFTER `description`; + +-- 10.1.1 +UPDATE llx_element_element SET targettype = 'digiriskdolibarr_digiriskelement' WHERE targettype = 'digiriskdolibarr_digiriskdolibar' AND sourcetype = 'digiriskdolibarr_risksign'; diff --git a/view/accident/accident_card.php b/view/accident/accident_card.php index 9f13fa9a7..57a9d8b14 100644 --- a/view/accident/accident_card.php +++ b/view/accident/accident_card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -66,6 +66,8 @@ $external_accident = GETPOST('external_accident'); $accident_location = GETPOST('accident_location'); $fk_soc = GETPOST('fk_soc'); +$fkTicket = GETPOSTISSET('fk_ticket') ? GETPOST('fk_ticket', 'int') : 0; + // Initialize technical objects $object = new Accident($db); $signatory = new SaturneSignature($db, $object->module, $object->element); @@ -161,7 +163,6 @@ $external_accident = GETPOST('external_accident'); $accident_location = GETPOST('accident_location'); $extSocietyId = GETPOST('fk_soc'); - $fkTicket = GETPOST('fk_ticket'); // Initialize object accident $now = dol_now(); @@ -260,7 +261,6 @@ $external_accident = GETPOST('external_accident'); $accident_location = GETPOST('accident_location'); $extSocietyId = GETPOST('fk_soc'); - $fkTicket = GETPOST('fk_ticket'); // Initialize object accident $now = dol_now(); @@ -699,7 +699,7 @@ //Fk Ticket -- Fk Ticket print ''; - print img_picto('', 'ticket', 'class="pictofixedwidth"') . $form->selectarray('fk_ticket', $ticketsArray, 0, 1, 0, 0, 0, '', 0, 0, 0, 'minwidth300'); + print img_picto('', 'ticket', 'class="pictofixedwidth"') . $form->selectarray('fk_ticket', $ticketsArray, $fkTicket, 1, 0, 0, 0, '', 0, 0, 0, 'minwidth300'); print ''; // Categories diff --git a/view/accidentinvestigation/accidentinvestigation_card.php b/view/accidentinvestigation/accidentinvestigation_card.php index 10b5e544c..2fcee6c3f 100644 --- a/view/accidentinvestigation/accidentinvestigation_card.php +++ b/view/accidentinvestigation/accidentinvestigation_card.php @@ -168,7 +168,7 @@ if ($resOne > 0 && $resTwo > 0) { setEventMessages('AccidentInvestigationTaskCreated', []); $task->fetch($result); - $description = $getNomResOne . '
' . $getNomResTwo; + $description = $getNomResOne . '
' . $getNomResTwo; $task->setValueFrom('description', $description); } else { setEventMessages($task->error, [], 'errors'); @@ -243,7 +243,7 @@ // Common attributes include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php'; - print '
'; + print '
'; print dol_get_fiche_end(); @@ -270,7 +270,7 @@ // Common attributes include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_edit.tpl.php'; - print '
'; + print '
'; print dol_get_fiche_end(); diff --git a/view/digiriskelement/digiriskelement_informations.php b/view/digiriskelement/digiriskelement_informations.php new file mode 100644 index 000000000..e30bb3bc7 --- /dev/null +++ b/view/digiriskelement/digiriskelement_informations.php @@ -0,0 +1,109 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file view/digiriskelement/digiriskelement_informations.php + * \ingroup digiriskdolibarr + * \brief Page to view digiriskelement informations and dashboard + */ + +// Load DigiriskDolibarr environment +if (file_exists('../digiriskdolibarr.main.inc.php')) { + require_once __DIR__ . '/../digiriskdolibarr.main.inc.php'; +} elseif (file_exists('../../digiriskdolibarr.main.inc.php')) { + require_once __DIR__ . '/../../digiriskdolibarr.main.inc.php'; +} else { + die('Include of digiriskdolibarr main fails'); +} + +// Load Saturne libraries +require_once __DIR__ . '/../../../saturne/class/saturnedashboard.class.php'; + +// Load Digirisk libraries +require_once __DIR__ . '/../../class/digiriskelement.class.php'; +require_once __DIR__ . '/../../lib/digiriskdolibarr_digiriskelement.lib.php'; + +// Global variables definitions +global $conf, $db, $hookmanager, $langs, $moduleName, $moduleNameLowerCase, $moduleNameUpperCase, $user; + +// Load translation files required by the page +saturne_load_langs(); + +// Get parameters +$id = GETPOST('id', 'int'); +$action = GETPOST('action', 'aZ09'); + +// Initialize technical objects +$object = new DigiriskElement($db); +$dashboard = new SaturneDashboard($db, $moduleNameLowerCase); + +$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity ?? 1]; + +$hookmanager->initHooks(['digiriskelementinformations', 'digiriskelementview', 'globalcard']); // Note that conf->hooks_modules contains array + +// Load object +require_once DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be included, not include_once + +// Security check +$permissionToRead = $user->rights->digiriskdolibarr->digiriskelement->read; +saturne_check_access($permissionToRead, $object); + +/* + * Actions + */ + +$parameters = []; +$resHook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($resHook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} + +if (empty($resHook)) { + // Actions adddashboardinfo, closedashboardinfo, generate_csv + require_once __DIR__ . '/../../../saturne/core/tpl/actions/dashboard_actions.tpl.php'; +} + +/* + * View + */ + +$title = $langs->trans('Informations'); +$helpUrl = 'FR:Module_Digirisk'; + +digirisk_header($title, $helpUrl); + +// Part to show record +saturne_get_fiche_head($object, 'elementInformations', $title); + +// Object card +// ------------------------------------------------------------ +list($morehtmlref, $moreParams) = $object->getBannerTabContent(); + +saturne_banner_tab($object,'ref','none', 0, 'ref', 'ref', $morehtmlref, true, $moreParams); + +print '

'; + +$moreParams = ['LoadDigiriskElement' => 1]; +$dashboard->show_dashboard($moreParams); + +print '
'; + +print dol_get_fiche_end(); + +// End of page +llxFooter(); +$db->close(); diff --git a/view/digiriskelement/digiriskelement_listingrisksdocument.php b/view/digiriskelement/digiriskelement_listingrisksdocument.php index bf894dc8b..ec55b91c7 100644 --- a/view/digiriskelement/digiriskelement_listingrisksdocument.php +++ b/view/digiriskelement/digiriskelement_listingrisksdocument.php @@ -103,7 +103,7 @@ * View */ -$title = $langs->trans('ListingRisksDocuments'); +$title = $langs->trans('ListingRisksDocument'); $helpUrl = 'FR:Module_Digirisk#Impression_des_listings_de_risques'; digirisk_header($title, $helpUrl); diff --git a/view/digiriskelement/digiriskelement_risksign.php b/view/digiriskelement/digiriskelement_risksign.php index fdb37583d..4b53ffbf0 100644 --- a/view/digiriskelement/digiriskelement_risksign.php +++ b/view/digiriskelement/digiriskelement_risksign.php @@ -262,7 +262,7 @@ if ($options['import_shared_risksigns'][$risksigns->id] == 'on') { if ($object->id > 0) { - $object->element = 'digiriskdolibarr_' . $digiriskelementtmp->element; + $object->element = $digiriskelementtmp->element; $result = $object->add_object_linked('digiriskdolibarr_' . $risksign->element, $risksigns->id); if ($result > 0) { $risksigns->applied_on = $object->id; diff --git a/view/digiriskstandard/digiriskstandard_auditreportdocument.php b/view/digiriskstandard/digiriskstandard_auditreportdocument.php index 6ebaae85f..3a12e1dc7 100644 --- a/view/digiriskstandard/digiriskstandard_auditreportdocument.php +++ b/view/digiriskstandard/digiriskstandard_auditreportdocument.php @@ -36,6 +36,7 @@ // Load DigiriskDolibarr libraries require_once __DIR__ . '/../../class/digiriskstandard.class.php'; require_once __DIR__ . '/../../class/digiriskdolibarrdocuments/auditreportdocument.class.php'; +require_once __DIR__ . '/../../class/digiriskdolibarrdocuments/riskassessmentdocument.class.php'; require_once __DIR__ . '/../../lib/digiriskdolibarr_digiriskstandard.lib.php'; require_once __DIR__ . '/../../lib/digiriskdolibarr_function.lib.php'; diff --git a/view/digiriskstandard/digiriskstandard_card.php b/view/digiriskstandard/digiriskstandard_card.php index bef9d95db..8669db9d7 100644 --- a/view/digiriskstandard/digiriskstandard_card.php +++ b/view/digiriskstandard/digiriskstandard_card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,34 +16,34 @@ */ /** - * \file view/digiriskstandard/digiriskstandard_card.php - * \ingroup digiriskdolibarr - * \brief Page to create/edit/view digiriskstandard + * \file view/digiriskstandard/digiriskstandard_card.php + * \ingroup digiriskdolibarr + * \brief Page to digiriskstandard informations and dashboard */ // Load DigiriskDolibarr environment if (file_exists('../digiriskdolibarr.main.inc.php')) { - require_once __DIR__ . '/../digiriskdolibarr.main.inc.php'; + require_once __DIR__ . '/../digiriskdolibarr.main.inc.php'; } elseif (file_exists('../../digiriskdolibarr.main.inc.php')) { - require_once __DIR__ . '/../../digiriskdolibarr.main.inc.php'; + require_once __DIR__ . '/../../digiriskdolibarr.main.inc.php'; } else { - die('Include of digiriskdolibarr main fails'); + die('Include of digiriskdolibarr main fails'); } -require_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php'; +// Load Dolibarr libraries require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; // Load Saturne libraries require_once __DIR__ . '/../../../saturne/class/saturnedashboard.class.php'; +// Load Digirisk libraries require_once __DIR__ . '/../../class/digiriskstandard.class.php'; -require_once __DIR__ . '/../../class/digiriskdolibarrdashboard.class.php'; require_once __DIR__ . '/../../lib/digiriskdolibarr_digiriskstandard.lib.php'; require_once __DIR__ . '/../../lib/digiriskdolibarr_function.lib.php'; // Global variables definitions -global $conf, $db, $hookmanager, $moduleNameLowerCase, $moduleNameUpperCase, $langs, $user; +global $conf, $db, $hookmanager, $langs, $moduleName, $moduleNameLowerCase, $moduleNameUpperCase, $user; // Load translation files required by the page saturne_load_langs(); @@ -57,78 +57,63 @@ $project = new Project($db); $dashboard = new SaturneDashboard($db, $moduleNameLowerCase); -$object->fetch($conf->global->DIGIRISKDOLIBARR_ACTIVE_STANDARD); +$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity ?? 1]; -$hookmanager->initHooks(array('digiriskelementcard', 'digiriskstandardview', 'globalcard')); // Note that conf->hooks_modules contains array +$hookmanager->initHooks(['digiriskstandardcard', 'digiriskstandardview', 'globalcard']); // Note that conf->hooks_modules contains array -// Security check - Protection if external user -$permissiontoread = $user->rights->digiriskdolibarr->digiriskstandard->read && $user->rights->digiriskdolibarr->riskassessmentdocument->read; +// Load object +$object->fetch(getDolGlobalInt('DIGIRISKDOLIBARR_ACTIVE_STANDARD')); + +// Security check +$permissiontoread = $user->rights->digiriskdolibarr->digiriskstandard->read; saturne_check_access($permissiontoread); /* - * Actions -*/ - -if ($action == 'adddashboardinfo' || $action == 'closedashboardinfo') { - $data = json_decode(file_get_contents('php://input'), true); - $dashboardWidgetName = $data['dashboardWidgetName']; - $confName = $moduleNameUpperCase . '_DISABLED_DASHBOARD_INFO'; - $visible = json_decode($user->conf->$confName); - - if ($action == 'adddashboardinfo') { - unset($visible->$dashboardWidgetName); - } else { - $visible->$dashboardWidgetName = 0; - } + * Actions + */ - $tabParam[$confName] = json_encode($visible); +$parameters = []; +$resHook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($resHook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} - dol_set_user_param($db, $conf, $user, $tabParam); - $action = ''; +if (empty($resHook)) { + // Actions adddashboardinfo, closedashboardinfo, generate_csv + require_once __DIR__ . '/../../../saturne/core/tpl/actions/dashboard_actions.tpl.php'; } /* * View */ -$emptyobject = new stdClass(); +$title = $langs->trans('Informations'); +$helpUrl = 'FR:Module_Digirisk'; -$title = $langs->trans("DigiriskStandardInformation"); -$helpUrl = 'FR:Module_Digirisk#DigiRisk_-_Document_Unique'; +digirisk_header($title, $helpUrl); -digirisk_header($title, $helpUrl); ?> +// Part to show record +saturne_get_fiche_head($object, 'standardCard', $title); -
+// Object card +// Project +$moreHtmlRef = '
'; +$project->fetch(getDolGlobalInt('DIGIRISKDOLIBARR_DU_PROJECT')); +$moreHtmlRef .= $langs->trans('Project') . ' : ' . getNomUrlProject($project, 1, 'blank', 1); +$moreHtmlRef .= '
'; -'; - $project->fetch($conf->global->DIGIRISKDOLIBARR_DU_PROJECT); - $morehtmlref .= $langs->trans('Project') . ' : ' . getNomUrlProject($project, 1, 'blank', 1); - $morehtmlref .= '
'; +print '

'; - $moduleNameLowerCase = 'mycompany'; - saturne_banner_tab($object,'ref','none', 0, 'ref', 'ref', $morehtmlref, true); - $moduleNameLowerCase = 'digiriskdolibarr'; +$moreParams = ['LoadRiskAssessmentDocument' => 1]; +$dashboard->show_dashboard($moreParams); - print '
'; - print '
'; - - $moreParams = [ - 'loadAccident' => 0 - ]; - - $dashboard->show_dashboard($moreParams); - - print '
'; - - print dol_get_fiche_end(); -} +print '
'; +print dol_get_fiche_end(); // End of page llxFooter(); diff --git a/view/ticket/ticketstats.php b/view/ticket/ticketstats.php index 81ae027dc..d1d95eee3 100644 --- a/view/ticket/ticketstats.php +++ b/view/ticket/ticketstats.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,9 +16,9 @@ */ /** - * \file view/ticket/ticketstats.php - * \ingroup digiriskdolibarr - * \brief Page with tickets statistics + * \file view/ticket/ticketstats.php + * \ingroup digiriskdolibarr + * \brief Page with tickets statistics */ // Load DigiriskDolibarr environment @@ -30,369 +30,217 @@ die('Include of digiriskdolibarr main fails'); } -// Global variables definitions -global $conf, $db, $langs, $user; - -// Libraries -require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; -if (!empty($conf->category->enabled)) { - require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +// Load Dolibarr libraries +require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticket.class.php'; +if (isModEnabled('category')) { + require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; } +// Load Saturne libraries +require_once __DIR__ . '/../../../saturne/class/saturnedashboard.class.php'; + +// Load DigiriskDolibarr librairies require_once __DIR__ . '/../../lib/digiriskdolibarr_ticket.lib.php'; -require_once __DIR__ . '/../../class/ticketdigiriskstats.class.php'; require_once __DIR__ . '/../../class/digiriskelement.class.php'; -$WIDTH = DolGraph::getDefaultGraphSizeForStats('width'); -$HEIGHT = DolGraph::getDefaultGraphSizeForStats('height'); +// Global variables definitions +global $conf, $db, $hookmanager, $langs, $moduleName, $moduleNameLowerCase, $user; // Load translation files required by the page -saturne_load_langs(['orders', 'companies', 'other', 'tickets', 'categories']); - -$action = GETPOST('action', 'aZ09'); -$object_status = GETPOST('object_status', 'array'); -$userid = GETPOST('userid', 'int'); -$userassignid = GETPOST('userassignid', 'int'); -$socid = GETPOST('socid', 'int'); -$digiriskelementid = GETPOST('digiriskelementid', 'int'); -$categticketid = GETPOST('categticketid', 'int'); -$ticketcats = GETPOST('ticketcats', 'array'); -$digiriskelementlist = GETPOST('digiriskelementlist', 'array'); +saturne_load_langs(); + +// Get parameters +$socid = GETPOST('socid', 'int'); +$digiriskElements = GETPOST('digiriskElements', 'array'); +$categories = GETPOST('categories', 'array'); +$userID = GETPOST('userID', 'int'); +$userAssignID = GETPOST('userAssignID', 'int'); +$status = GETPOST('status', 'array'); // Initialize technical objects $object = new Ticket($db); -$digiriskelement = new DigiriskElement($db); +$dashboard = new SaturneDashboard($db, 'digiriskdolibarr'); +$digiriskElement = new DigiriskElement($db); -$deletedElements = $digiriskelement->getMultiEntityTrashList(); -if (empty($deletedElements)) { - $deletedElements = [0]; -} +// Initialize view objects +$form = new Form($db); -$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity]; -$upload_dir = $upload_dir . '/ticketstats/'; -dol_mkdir($upload_dir); +// Get date parameters +$dateStart = dol_mktime(0, 0, 0, GETPOST('dateStartmonth', 'int'), GETPOST('dateStartday', 'int'), GETPOST('dateStartyear', 'int')); +$dateEnd = dol_mktime(23, 59, 59, GETPOST('dateEndmonth', 'int'), GETPOST('dateEndday', 'int'), GETPOST('dateEndyear', 'int')); -$nowyear = strftime("%Y", dol_now()); -$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear; -//$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS))); -$date_start = dol_mktime(0, 0, 0, GETPOST('datestartmonth', 'int'), GETPOST('datestartday', 'int'), GETPOST('datestartyear', 'int')); -$date_end = dol_mktime(0, 0, 0, GETPOST('dateendmonth', 'int'), GETPOST('dateendday', 'int'), GETPOST('dateendyear', 'int')); -$startyear = strftime("%Y", !empty($date_start) ? $date_start : dol_now()); -$endyear = strftime("%Y", !empty($date_end) ? $date_end : dol_now() + 1); -$datestart = dol_print_date((!empty($date_start) ? $date_start : dol_now()), 'dayxcard'); -$dateend = dol_print_date((!empty($date_end) ? $date_end : dol_now()), 'dayxcard'); +$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity ?? 1]; -//Security check -$permissiontoread = $user->rights->ticket->read; +$hookmanager->initHooks(['ticketstats', 'globalcard']); // Note that conf->hooks_modules contains array -saturne_check_access($permissiontoread); +// Security check +$permissionToRead = $user->rights->ticket->read; +saturne_check_access($permissionToRead); /* - * Action + * Actions */ -if ($action == 'savegraph') { - $data = json_decode(file_get_contents('php://input'), true); - - $data = $data['image']; +$parameters = []; +$resHook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($resHook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} - list($type, $data) = explode(';', $data); - list(, $data) = explode(',', $data); - $data = base64_decode($data); - $filenamenb = $upload_dir.'/ticketdigiriskstats.png'; - file_put_contents($filenamenb, $data); +if (empty($resHook)) { + // Actions adddashboardinfo, closedashboardinfo, generate_csv + require_once __DIR__ . '/../../../saturne/core/tpl/actions/dashboard_actions.tpl.php'; } /* * View */ -$form = new Form($db); - -$title = $langs->trans("TicketStatistics"); +$title = $langs->trans('TicketStatistics'); $help_url = 'FR:Module_Digirisk#Statistiques_des_tickets'; -llxHeader('', $title, $help_url); +saturne_header(0, '', $title, $help_url); print load_fiche_titre($title, '', 'ticket'); $head = ticketstats_prepare_head(); -print dol_get_fiche_head($head, 'byyear', $langs->trans("TicketStatistics"), -1); - -$stats = new TicketDigiriskStats($db, $socid, ($userid > 0 ? $userid: 0), ($userassignid > 0 ? $userassignid: 0), ($digiriskelementid > 0 ? $digiriskelementid : 0), ($categticketid > 0 ? $categticketid: 0)); -if (is_array($object_status)) { - if (in_array($langs->trans('All'), $object_status)) { - unset($object_status[array_search($langs->trans('All'), $object_status)]); - } else { - if (!empty($object_status)) { - $stats->where .= ' AND tk.fk_statut IN ('.$db->sanitize(implode(',', $object_status)).')'; - } else if (!empty(GETPOST('refresh', 'int'))) { - $stats->where .= ' AND tk.fk_statut IS NULL'; - } - } -} -if (is_array($ticketcats)) { - if (in_array($langs->trans('All'), $ticketcats)) { - unset($ticketcats[array_search($langs->trans('All'), $ticketcats)]); - } else { - if (!empty($ticketcats)) { - $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_ticket as cattk ON (tk.rowid = cattk.fk_ticket)'; - $stats->where .= ' AND cattk.fk_categorie IN ('.$db->sanitize(implode(',', $ticketcats)).')'; - } else if (!empty(GETPOST('refresh', 'int'))) { - $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_ticket as cattk ON (tk.rowid = cattk.fk_ticket)'; - $stats->where .= ' AND cattk.fk_categorie IS NULL'; - } - } +print dol_get_fiche_head($head, 'byyear', $title, -1); + +$moreJoin = ''; +$moreWhere = ''; + +if ($socid > 0) { + $moreWhere .= ' AND t.fk_soc = ' . $socid; } -if (is_array($digiriskelementlist)) { - if (in_array($langs->trans('All'), $digiriskelementlist)) { - unset($digiriskelementlist[array_search($langs->trans('All'), $digiriskelementlist)]); - } else { - if (!empty($digiriskelementlist)) { - $stats->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'ticket_extrafields as tkextra ON tk.rowid = tkextra.fk_object'; - $stats->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'digiriskdolibarr_digiriskelement as e ON tkextra.digiriskdolibarr_ticket_service = e.rowid'; - $stats->where .= ' AND e.rowid IN ('.$db->sanitize(implode(',', $digiriskelementlist)).')'; - } else if (!empty(GETPOST('refresh', 'int'))) { - $stats->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'ticket_extrafields as tkextra ON tk.rowid = tkextra.fk_object'; - $stats->join .= ' LEFT JOIN '.MAIN_DB_PREFIX.'digiriskdolibarr_digiriskelement as e ON tkextra.digiriskdolibarr_ticket_service = e.rowid'; - $stats->where .= ' AND e.rowid IS NULL'; - } - } + +if (is_array($digiriskElements)) { + if (in_array($langs->trans('All'), $digiriskElements)) { + unset($digiriskElements[array_search($langs->trans('All'), $digiriskElements)]); + } else if (in_array('IS NULL', $digiriskElements)) { + unset($digiriskElements[array_search($langs->trans('None'), $digiriskElements)]); + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'ticket_extrafields as tkextra ON t.rowid = tkextra.fk_object'; + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'digiriskdolibarr_digiriskelement as e ON tkextra.digiriskdolibarr_ticket_service = e.rowid'; + $moreWhere .= ' AND e.rowid IS NULL'; + } else if (!empty($digiriskElements)) { + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'ticket_extrafields as tkextra ON t.rowid = tkextra.fk_object'; + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'digiriskdolibarr_digiriskelement as e ON tkextra.digiriskdolibarr_ticket_service = e.rowid'; + $moreWhere .= ' AND e.rowid IN (' . $db->sanitize(implode(',', $digiriskElements)) . ')'; + } } -// Build graphic number of object -$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear, 0, 0, $conf->global->SOCIETE_FISCAL_MONTH_START); +if (is_array($categories)) { + if (in_array($langs->trans('All'), $categories)) { + unset($categories[array_search($langs->trans('All'), $categories)]); + } else if (in_array('IS NULL', $categories)) { + unset($categories[array_search($langs->trans('None'), $categories)]); + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'categorie_ticket as cattk ON (t.rowid = cattk.fk_ticket)'; + $moreWhere .= ' AND cattk.fk_categorie IS NULL'; + } else if (!empty($categories)) { + $moreJoin .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'categorie_ticket as cattk ON (t.rowid = cattk.fk_ticket)'; + $moreWhere .= ' AND cattk.fk_categorie IN (' . $db->sanitize(implode(',', $categories)) . ')'; + } +} -if (empty($user->rights->societe->client->voir) || $user->socid) { - $filenamenb = $upload_dir.'/ticketdigiriskstats-'.$user->id.'_'.$datestart.'_'.$dateend.'.png'; - $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketdigiriskstats&file=ticketdigiriskstats-'.$user->id.'_'.$datestart.'_'.$dateend.'.png'; -} else { - $filenamenb = $upload_dir.'/ticketdigiriskstats_'.$datestart.'_'.$dateend.'.png'; - $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketdigiriskstats&file=ticketdigiriskstats_'.$datestart.'_'.$dateend.'.png'; +if ($userID > 0) { + $moreWhere .= ' AND t.fk_user_create = ' . $userID; } -$px1 = new DolGraph(); -$mesg = $px1->isGraphKo(); -if (!$mesg) { - $px1->SetData($data); - $i = $startyear; $legend = array(); - while ($i <= $endyear) { - $legend[] = $i; - $i++; - } - $px1->SetLegend($legend); - $px1->SetMaxValue($px1->GetCeilMaxValue()); - $px1->SetMinValue(min(0, $px1->GetFloorMinValue())); - $px1->SetWidth($WIDTH); - $px1->SetHeight($HEIGHT); - $px1->SetYLabel($langs->trans("NbOfTicket")); - $px1->SetShading(3); - $px1->SetHorizTickIncrement(1); - $px1->mode = 'depth'; - $px1->SetTitle($langs->trans("NumberOfTicketsByMonth")); - - $px1->draw($filenamenb, $fileurlnb); -} ?> - - +if ($userAssignID > 0) { + $moreWhere .= ' AND t.fk_user_assign = ' . $userAssignID; +} -getAllByYear(); -$arrayyears = array(); -foreach ($data as $val) { - if (!empty($val['year'])) { - $arrayyears[$val['year']] = $val['year']; - } +if (is_array($status)) { + if (in_array($langs->trans('All'), $status)) { + unset($status[array_search($langs->trans('All'), $status)]); + } else if (in_array('IS NULL', $status)) { + unset($status[array_search($langs->trans('None'), $status)]); + $moreWhere .= ' AND t.fk_statut IS NULL'; + } else if (!empty($status)) { + $moreWhere .= ' AND t.fk_statut IN (' . $db->sanitize(implode(',', $status)) . ')'; + } } -if (!count($arrayyears)) { - $arrayyears[$nowyear] = $nowyear; + +if (!empty($dateStart) && !empty($dateEnd)) { + $moreWhere .= " AND t.datec BETWEEN '" . $db->idate($dateStart) . "' AND '" . $db->idate($dateEnd) . "'"; } -print '
'; +print '
'; // Show filter box -print '
'; -print ''; +print ''; +print ''; -$all = array($langs->trans('All') => $langs->trans('All')); +$all = [$langs->trans('All') => $langs->trans('All')]; +$none = ['IS NULL' => $langs->trans('None')]; print ''; -print ''; +print ''; + // Company -print ''; + // DigiriskElement -print ''; + // Category -if (!empty($conf->category->enabled)) { - $cat_type = Categorie::TYPE_TICKET; - $cat_label = $langs->trans("Category") . ' ' .lcfirst($langs->trans("Ticket")); - print ''; +if (isModEnabled('categorie')) { + print ''; } + // User -print ''; -//DateRange -- Plage de date -if (!empty($conf->global->SOCIETE_FISCAL_MONTH_START)) { - $startday = dol_mktime(0, 0, 0, $conf->global->SOCIETE_FISCAL_MONTH_START, 1, strftime("%Y", dol_now())); -} else { - $startday = dol_now(); -} -print ''; -print ''; -print '
'.$langs->trans("Filter").'
' . $langs->trans('Filter') . '
'.$form->textwithpicto($langs->trans("ThirdParty"), $langs->trans("ThirdPartyHelp")).''; +print '
' . $form->textwithpicto($langs->trans('ThirdParty'), $langs->trans('ThirdPartyHelp')) . ''; print img_picto('', 'company', 'class="pictofixedwidth"'); -print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300'); +print $form->select_company($socid, 'socid', '', 1, 0, 0, [], 0, 'widthcentpercentminusx maxwidth300'); print '
'.$form->textwithpicto($langs->trans("GP/UT"), $langs->trans("GP/UTHelp")).''; -$objectList = saturne_fetch_all_object_type('digiriskelement', '', '', 0, 0, ['customsql' => 'rowid NOT IN (' . implode(',', $deletedElements) . ')']); -$digiriskElementsData = []; -if (is_array($objectList) && !empty($objectList)) { - foreach ($objectList as $digiriskElement) { - $digiriskElementsData[$digiriskElement->id] = $digiriskElement->ref . ' - ' . $digiriskElement->label; - } -} -$digiriskElementsData = $all + $digiriskElementsData; -print $form->multiselectarray('digiriskelementlist', $digiriskElementsData, ((!empty(GETPOST('refresh', 'int'))) ? GETPOST('digiriskelementlist', 'array') : $digiriskelementlist), 0, 0, 'widthcentpercentminusx maxwidth300'); +print '
' . $form->textwithpicto($langs->trans('GP/UT'), $langs->trans('GP/UTHelp')) . ''; +$digiriskElementsArray = $none; +$activeDigiriskElements = $digiriskElement->getActiveDigiriskElements(); +if (is_array($activeDigiriskElements) && !empty($activeDigiriskElements)) { + foreach ($activeDigiriskElements as $digiriskElement) { + $digiriskElementsArray[$digiriskElement->id] = $digiriskElement->ref . ' - ' . $digiriskElement->label; + } +} +print $form->multiselectarray('digiriskElements', $all + $digiriskElementsArray, (!empty(GETPOST('refresh', 'int')) ? GETPOST('digiriskElements', 'array') : $all + $digiriskElementsArray), 0, 0, 'minwidth100imp widthcentpercentminusx maxwidth300'); print '
'.$form->textwithpicto($cat_label, $langs->trans("CategoryTicketHelp")).''; - $cate_arbo = $form->select_all_categories($cat_type, null, 'parent', null, null, 1); - print img_picto('', 'category', 'class="pictofixedwidth"'); - $cate_arbo = $all + $cate_arbo; - print $form->multiselectarray('ticketcats', $cate_arbo, ((!empty(GETPOST('refresh', 'int'))) ? GETPOST('ticketcats', 'array') : $cate_arbo), 0, 0, 'widthcentpercentminusx maxwidth300'); - print '
' . $form->textwithpicto($langs->trans('Category') . ' ' . lcfirst($langs->trans('Ticket')), $langs->trans('CategoryTicketHelp')) . ''; + $cateArbo = $form->select_all_categories(Categorie::TYPE_TICKET, null, 'parent', null, null, 1); + print img_picto('', 'category', 'class="pictofixedwidth"'); + print $form->multiselectarray('categories', $all + $none + $cateArbo, (!empty(GETPOST('refresh', 'int')) ? GETPOST('categories', 'array') : $all + $none + $cateArbo), 0, 0, 'minwidth100imp widthcentpercentminusx maxwidth300'); + print '
'.$form->textwithpicto($langs->trans("CreatedBy"), $langs->trans("CreatedByHelp")) .''; +print '
' . $form->textwithpicto($langs->trans('CreatedBy'), $langs->trans('CreatedByHelp')) . ''; print img_picto('', 'user', 'class="pictofixedwidth"'); -print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', $conf->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300'); +print $form->select_dolusers($userID, 'userID', 1, '', 0, '', '', $conf->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300'); + // Assign at user -print '
'.$form->textwithpicto($langs->trans("AssignedTo"), $langs->trans("AssignedToHelp")).''; +print '
' . $form->textwithpicto($langs->trans('AssignedTo'), $langs->trans('AssignedToHelp')) . ''; print img_picto('', 'user', 'class="pictofixedwidth"'); -print $form->select_dolusers($userassignid, 'userassignid', 1, '', 0, '', '', $conf->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300'); +print $form->select_dolusers($userAssignID, 'userAssignID', 1, '', 0, '', '', $conf->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300'); + // Status -print '
'.$form->textwithpicto($langs->trans("Status"), $langs->trans("StatusHelp")).''; -$liststatus = $object->statuts_short; -$liststatus = $all + $liststatus; -print $form->multiselectarray('object_status', $liststatus, ((!empty(GETPOST('refresh', 'int'))) ? GETPOST('object_status', 'array') : $liststatus), 0, 0, 'widthcentpercentminusx maxwidth300', 1); -print '
' . $langs->trans("DateRange") . ''; -print $langs->trans('From') . $form->selectDate((!empty($date_start) ? $date_start : $startday), 'datestart', 0, 0, 0, '', 1); -print $langs->trans('At') . $form->selectDate((!empty($date_end) ? $date_end : dol_time_plus_duree($startday, 1, 'y')), 'dateend', 0, 0, 0, '', 1); +print '
' . $form->textwithpicto($langs->trans('Status'), $langs->trans('StatusHelp')) . ''; +print $form->multiselectarray('status', $all + $none + $object->statuts_short, (!empty(GETPOST('refresh', 'int')) ? GETPOST('status', 'array') : $all + $none + $object->statuts_short), 0, 0, 'minwidth100imp widthcentpercentminusx maxwidth300', 1); print '
'; -print '
'; -print '

'; +// DateRange +$startYear = strftime('%Y', dol_now()) - (!getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS')))); +$startDay = dol_mktime(0, 0, 0, getDolGlobalInt('SOCIETE_FISCAL_MONTH_START'), 1, $startYear); +print '' . $langs->trans('DateRange') . ''; +print $langs->trans('From') . $form->selectDate((!empty($dateStart) ? $dateStart : $startDay), 'dateStart'); +print $langs->trans('At') . $form->selectDate((!empty($dateEnd) ? $dateEnd : dol_now()), 'dateEnd'); +print ''; -print '
'; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; - -$oldyear = 0; -foreach ($data as $val) { - $year = $val['year']; - while (!empty($year) && $oldyear > $year + 1) { // If we have empty year - $oldyear--; - - print ''; - print ''; - print ''; - print ''; - print ''; - } - - print ''; - print ''; - print ''; - print ''; - print ''; - $oldyear = $year; -} +print ''; print '
'.$langs->trans("Year").''.$langs->trans("NbOfTickets").'%
0 ? '&userid='.$userid : '').'">'.$oldyear.'0
0 ? '&userid='.$userid : '').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).'
'; -print '
'; +print ''; -// Get list of files -if ( ! empty($upload_dir)) { - $file_list = dol_dir_list($upload_dir, 'files', 0, '(\.png)', '', 'date', SORT_DESC, 1); -} +$moreParams = [ + 'LoadTicketDashboard' => 1, + 'join' => $moreJoin, + 'where' => $moreWhere +]; -print load_fiche_titre($langs->trans("Documents"), '', 'digiriskdolibarr@digiriskdolibarr'); - -// Show table -print '
'; -print ''; -print ''; -print ''; -print ''; - -// Get list of files -if ( ! empty($upload_dir)) { - // Loop on each file found - if (is_array($file_list)) { - foreach ($file_list as $file) { - // Show file name with link to download - print ''; - print ''; - - // Show file size - $size = (!empty($file['size']) ? $file['size'] : dol_filesize($upload_dir . "/" . $file["name"])); - print ''; - - // Show file date - $date = (!empty($file['date']) ? $file['date'] : dol_filemtime($upload_dir . "/" . $file["name"])); - print ''; - print ''; - } - } -} +$dashboard->show_dashboard($moreParams); -print '
'; - print ''; - print img_mime($file["name"], $langs->trans("File") . ': ' . $file["name"]); - print dol_trunc($file["name"], 150); - print ''; - print '' . dol_print_size($size, 1, 1) . '' . dol_print_date($date, 'dayhour', 'tzuser') . '
'; print '
'; -print '
'; - -// Show graphs -print '
'; -if ($mesg) { - print $mesg; -} else { - print $px1->show(); -} -print '
'; - -print '
'; -print '
'; - print dol_get_fiche_end(); // End of page diff --git a/view/ticket/ticketstatscsv.php b/view/ticket/ticketstatscsv.php index efc08c3af..6373a2997 100644 --- a/view/ticket/ticketstatscsv.php +++ b/view/ticket/ticketstatscsv.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2021-2024 EVARISK * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,9 +16,9 @@ */ /** - * \file view/ticket/ticketstatscsv.php - * \ingroup digiriskdolibarr - * \brief Page with tickets statistics CSV + * \file view/ticket/ticketstatscsv.php + * \ingroup digiriskdolibarr + * \brief Page with tickets statistics CSV */ // Load DigiriskDolibarr environment @@ -30,192 +30,178 @@ die('Include of digiriskdolibarr main fails'); } -// Global variables definitions -global $conf, $db, $langs, $user; - -// Libraries -include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; - +// Load DigiriskDolibarr librairies require_once __DIR__ . '/../../lib/digiriskdolibarr_ticket.lib.php'; -require_once __DIR__ . '/../../class/ticketdigiriskstats.class.php'; +require_once __DIR__ . '/../../class/ticketdashboard.class.php'; + +// Global variables definitions +global $conf, $db, $hookmanager, $langs, $user; // Load translation files required by the page saturne_load_langs(); // Get parameters -$action = GETPOST('action', 'aZ09'); +$action = GETPOST('action', 'aZ09'); +$dateStart = dol_mktime(0, 0, 0, GETPOST('dateStartmonth', 'int'), GETPOST('dateStartday', 'int'), GETPOST('dateStartyear', 'int')); +$dateEnd = dol_mktime(23, 59, 59, GETPOST('dateEndmonth', 'int'), GETPOST('dateEndday', 'int'), GETPOST('dateEndyear', 'int')); +$dateRange = GETPOST('daterange'); // Initialize technical objects -$stats = new TicketDigiriskStats($db); +$dashboard = new ticketDashboard($db); +$category = new Categorie($db); -// Security check -$permissiontoread = $user->rights->ticket->read; +// Initialize view objects +$form = new Form($db); -$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity]; -$upload_dir = $upload_dir . '/ticketstats/'; +$upload_dir = $conf->digiriskdolibarr->multidir_output[$conf->entity] . '/ticketstats/'; dol_mkdir($upload_dir); +// Security check +$permissiontoread = $user->rights->ticket->read; +$permissionToAdd = $user->rights->ticket->write; saturne_check_access($permissiontoread); /* * Action */ -if ($action == 'generate_csv') { - $categorie = new Categorie($db); - // Open a file in write mode ('w') - $now = dol_now(); - $filename = dol_print_date($now, 'dayxcard') . '_ticketstats.csv'; - - $date_start = dol_mktime(0, 0, 0, GETPOST('datestartmonth', 'int'), GETPOST('datestartday', 'int'), GETPOST('datestartyear', 'int')); - $date_end = dol_mktime(0, 0, 0, GETPOST('dateendmonth', 'int'), GETPOST('dateendday', 'int'), GETPOST('dateendyear', 'int')); - $daterange = GETPOST('daterange'); - - $fp = fopen($upload_dir . $filename, 'w'); +$parameters = []; +$resHook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($resHook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} - list($data, $ticketCategoriesCounter) = $stats->getNbTicketByDigiriskElementAndTicketTags((!empty($daterange) ? $date_start : 0), (!empty($daterange) ? $date_end : 0)); +if (empty($resHook)) { + if ($action == 'generate_csv' && $permissionToAdd) { + // Open a file in write mode ('w') + $fileName = dol_print_date(dol_now(), 'dayxcard') . '_ticketstats.csv'; + $fp = fopen($upload_dir . $fileName, 'w'); - fputcsv($fp, [$langs->transnoentities('ConcernedTimePeriod') . ' : ' . dol_print_date($date_start) . ' ' . $langs->trans('To') . ' ' . dol_print_date($date_end)]); + fputcsv($fp, [$langs->transnoentities('ConcernedTimePeriod') . ' : ' . dol_print_date($dateStart) . ' ' . $langs->trans('To') . ' ' . dol_print_date($dateEnd)]); - fputcsv($fp, []); - fputcsv($fp, []); - fputcsv($fp, []); + fputcsv($fp, []); + fputcsv($fp, []); + fputcsv($fp, []); - if (is_array($ticketCategoriesCounter) && !empty($ticketCategoriesCounter)) { - foreach($ticketCategoriesCounter as $ticketCategoryName => $ticketCategoryCounter) { - fputcsv($fp, [$ticketCategoryName => $ticketCategoryName . ' : ' . $ticketCategoryCounter]); + list($data, $ticketCategoriesCounter) = $dashboard->getNbTicketByDigiriskElementAndTicketTags((!empty($dateRange) ? $dateStart : 0), (!empty($dateRange) ? $dateEnd : 0)); + if (is_array($ticketCategoriesCounter) && !empty($ticketCategoriesCounter)) { + foreach($ticketCategoriesCounter as $ticketCategoryName => $ticketCategoryCounter) { + fputcsv($fp, [$ticketCategoryName => $ticketCategoryName . ' : ' . $ticketCategoryCounter]); + } } - } - fputcsv($fp, []); - fputcsv($fp, []); - fputcsv($fp, []); - - if (is_array($data) && !empty($data)) { + fputcsv($fp, []); + fputcsv($fp, []); + fputcsv($fp, []); + + if (is_array($data) && !empty($data)) { + // Loop through file pointer and a line + $arrayCat = array_keys($data['labels']); + foreach($arrayCat as $categoryId) { + if (is_int($categoryId)) { + $category->fetch($categoryId); + $arrayCatWithLabels[$categoryId] = $category->label; + } else { + $arrayCatWithLabels[$categoryId] = $categoryId; + } + } - // Loop through file pointer and a line - $arrayCat = array_keys($data['labels']); + unset($data['labels']); - foreach($arrayCat as $categoryId) { - if (is_int($categoryId)) { - $categorie->fetch($categoryId); - $arrayCatWithLabels[$categoryId] = $categorie->label; - } else { - $arrayCatWithLabels[$categoryId] = $categoryId; + array_unshift($arrayCatWithLabels, $langs->trans('GP/UT')); + fputcsv($fp, $arrayCatWithLabels); + foreach ($data as $key => $row) { + array_unshift($row, $key); + fputcsv($fp, $row); } - } - unset($data['labels']); - - array_unshift($arrayCatWithLabels, $langs->trans('GP/UT')); - fputcsv($fp, $arrayCatWithLabels); - $i = 0; - foreach ($data as $row) { - array_unshift($row, array_keys($data)[$i]); - fputcsv($fp, $row); - $i++; - } - - fclose($fp); - setEventMessages($langs->trans('SuccessGenerateCSV', $filename), null); - } else { - setEventMessages($langs->trans('ErrorMissingData'), null, 'errors'); - } - $action = ''; + fclose($fp); + setEventMessages($langs->trans('SuccessGenerateCSV', $fileName), []); + } else { + setEventMessages($langs->trans('ErrorMissingData'), [], 'errors'); + } + $action = ''; + } } /* * View */ -$form = new Form($db); - -$title = $langs->trans("TicketStatistics"); +$title = $langs->trans('TicketStatistics'); $help_url = 'FR:Module_Digirisk#Statistiques_des_tickets'; -$morejs = array("/digiriskdolibarr/js/digiriskdolibarr.js"); -$morecss = array("/digiriskdolibarr/css/digiriskdolibarr.css"); -llxHeader('', $title, $help_url, '', '', '', $morejs, $morecss); +saturne_header(0, '', $title, $help_url); print load_fiche_titre($title, '', 'ticket'); $head = ticketstats_prepare_head(); -print dol_get_fiche_head($head, 'exportcsv', $langs->trans("ExportCSV"), -1); - -print '
'; +print dol_get_fiche_head($head, 'exportcsv', $langs->trans('ExportCSV'), -1); -// Get list of files -if ( ! empty($upload_dir)) { - $file_list = dol_dir_list($upload_dir, 'files', 0, '(\.csv)', '', 'date', SORT_DESC, 1); -} +print load_fiche_titre($langs->trans('CSVFileExport'), '', 'digiriskdolibarr@digiriskdolibarr'); -print load_fiche_titre($langs->trans("CSVFileExport"), '', 'digiriskdolibarr@digiriskdolibarr'); +print '
'; // Show table -print '
'; +print ''; print ''; print ''; -print '
'; -print ''; +print '
'; +print ''; +print ''; +print ''; +print ''; -//DateRange -- Plage de date -if (!empty($conf->global->SOCIETE_FISCAL_MONTH_START)) { - $startday = dol_mktime(0, 0, 0, $conf->global->SOCIETE_FISCAL_MONTH_START, 1, strftime("%Y", dol_now())); -} else { - $startday = dol_now(); -} -print ''; +print '
' . $langs->trans('Parameters') . '' . $langs->trans('Value') . '
' . $langs->trans("DateRange") . ''; -print $langs->trans('From') . $form->selectDate($startday, 'datestart', 0, 0, 0, '', 1); -print $langs->trans('At') . $form->selectDate(dol_time_plus_duree($startday, 1, 'y'), 'dateend', 0, 0, 0, '', 1); +// DateRange +$startYear = strftime('%Y', dol_now()) - (!getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS')))); +$startDay = dol_mktime(0, 0, 0, getDolGlobalInt('SOCIETE_FISCAL_MONTH_START'), 1, $startYear); +print '
' . $langs->trans('DateRange') . ''; +print $langs->trans('From') . $form->selectDate((!empty($dateStart) ? $dateStart : $startDay), 'dateStart'); +print $langs->trans('At') . $form->selectDate((!empty($dateEnd) ? $dateEnd : dol_now()), 'dateEnd'); +print $langs->trans('UseDateRange'); +print ''; print '
'; +print ''; print ''; -// Button print ''; -print ''; +print ''; // Get list of files -if ( ! empty($upload_dir)) { - // Loop on each file found - if (is_array($file_list)) { - foreach ($file_list as $file) { - // Show file name with link to download - print ''; - print ''; - - // Show file size - $size = (!empty($file['size']) ? $file['size'] : dol_filesize($upload_dir . "/" . $file["name"])); - print ''; - - // Show file date - $date = (!empty($file['date']) ? $file['date'] : dol_filemtime($upload_dir . "/" . $file["name"])); - print ''; - print ''; - } - } +$fileList = dol_dir_list($upload_dir, 'files', 0, '(\.csv)', '', 'date', SORT_DESC, 1); +if (is_array($fileList)) { + foreach ($fileList as $file) { + // Show file name with link to download + print ''; + + // Show file size + $size = (!empty($file['size']) ? $file['size'] : dol_filesize($upload_dir . '/' . $file['name'])); + print ''; + + // Show file date + $date = (!empty($file['date']) ? $file['date'] : dol_filemtime($upload_dir . '/' . $file['name'])); + print ''; + print ''; + } } print '
'; print '' . $langs->trans('GenerateCSV') . ' ' . ''; print ''; print ''; -print ' ' . $langs->trans('UseDateRange') . ' '; -print ''; -print '
'; - print ''; - print img_mime($file["name"], $langs->trans("File") . ': ' . $file["name"]); - print dol_trunc($file["name"], 150); - print ''; - print '' . dol_print_size($size, 1, 1) . '' . dol_print_date($date, 'dayhour', 'tzuser') . '
'; + print ''; + print dol_trunc($file['name'], 150); + print '' . dol_print_size($size, 1, 1) . '' . dol_print_date($date, 'dayhour', 'tzuser') . '
'; -print '
'; print '
'; -print '
'; -print '
'; -// End of page +print '
'; + print dol_get_fiche_end(); + +// End of page llxFooter(); $db->close();