';
+
+ $parameters = ['address' => $object];
+ $reshook = $hookmanager->executeHooks('digiriskdolibarrAccidentInvestigationHead', $parameters, $object); // Note that $action and $object may have been modified by some hooks
+ if ($reshook > 0) {
+ // do smth
+ } else {
+ // do smth else
+ }
+
+ print load_fiche_titre($langs->trans('AccidentInvestigation'), '', $object->picto);
+
+
+ print dol_get_fiche_end();
+}
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/view/accident_investigation/accident_investigation_list.php b/view/accident_investigation/accident_investigation_list.php
new file mode 100644
index 000000000..23004ac6f
--- /dev/null
+++ b/view/accident_investigation/accident_investigation_list.php
@@ -0,0 +1,697 @@
+
+ *
+ * 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/accident/accident_investigation_list.php
+ * \ingroup digiriskdolibarr
+ * \brief Page to generate accident investigation document
+ */
+
+// Load Digirisk 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 . '/core/class/html.formfile.class.php';
+
+// Load Digirisk librairies
+require_once __DIR__ . '/../../class/digiriskdocuments.class.php';
+require_once __DIR__ . '/../../class/accident.class.php';
+require_once __DIR__ . '/../../class/accidentinvestigation.class.php';
+require_once __DIR__ . '/../../class/digiriskstandard.class.php';
+require_once __DIR__ . '/../../lib/digiriskdolibarr_function.lib.php';
+require_once __DIR__ . '/../../lib/digiriskdolibarr_accident.lib.php';
+
+// Global variables definitions
+global $conf, $db, $hookmanager, $langs, $user;
+
+// Load translation files required by the page
+saturne_load_langs(['other']);
+
+// Get parameters.
+$id = GETPOST('id', 'int');
+$ref = GETPOST('ref', 'alpha');
+$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view';
+$confirm = GETPOST('confirm', 'alpha');
+$cancel = GETPOST('cancel', 'alpha');
+$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
+
+// Get list parameters.
+$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
+$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
+$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'timesheetlist'; // To manage different context of search
+$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
+$mode = GETPOST('mode', 'aZ');
+
+// Get pagination parameters.
+$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$sortfield = GETPOST('sortfield', 'aZ09comma');
+$sortorder = GETPOST('sortorder', 'aZ09comma');
+$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST('page', 'int');
+
+if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // If $page is not defined, or '' or -1 or if we click on clear filters.
+ $page = 0;
+}
+
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+
+// Initialize technical objects
+$object = new AccidentInvestigation($db);
+$accident = new Accident($db);
+$signatory = new AccidentSignature($db);
+$objectline = new AccidentWorkStop($db);
+
+$form = new Form($db);
+$contact = new Contact($db);
+$usertmp = new User($db);
+$thirdparty = new Societe($db);
+$extrafields = new ExtraFields($db);
+$digiriskelement = new DigiriskElement($db);
+$digiriskstandard = new DigiriskStandard($db);
+$project = new Project($db);
+
+// Load object
+$object->fetch($id);
+
+$hookmanager->initHooks(['accidentinvestigationlist']);
+
+
+// Fetch optionals attributes and labels.
+$extrafields->fetch_name_optionals_label($object->table_element);
+
+$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
+
+// Default sort order (if not yet defined by previous GETPOST).
+if (!$sortfield) {
+ reset($object->fields); // Reset is required to avoid key() to return null.
+ $sortfield = 't.' . key($object->fields); // Set here default search field. By default, 1st field in definition.
+}
+if (!$sortorder) {
+ $sortorder = 'ASC';
+}
+
+// Initialize array of search criterias.
+$search_all = GETPOST('search_all') ? GETPOST('search_all') : GETPOST('sall');
+$search = [];
+foreach ($object->fields as $key => $val) {
+ if (GETPOST('search_' . $key, 'alpha') !== '') {
+ $search[$key] = GETPOST('search_' . $key, 'alpha');
+ }
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key . '_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_' . $key . '_dtstartmonth', 'int'), GETPOST('search_' . $key . '_dtstartday', 'int'), GETPOST('search_' . $key . '_dtstartyear', 'int'));
+ $search[$key . '_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_' . $key . '_dtendmonth', 'int'), GETPOST('search_' . $key . '_dtendday', 'int'), GETPOST('search_' . $key . '_dtendyear', 'int'));
+ }
+}
+
+// List of fields to search into when doing a "search in all".
+$fieldstosearchall = [];
+foreach ($object->fields as $key => $val) {
+ if (!empty($val['searchall'])) {
+ $fieldstosearchall['t.' . $key] = $val['label'];
+ }
+}
+
+// Definition of array of fields for columns.
+$arrayfields = [];
+foreach ($object->fields as $key => $val) {
+ // If $val['visible']==0, then we never show the field
+ if (!empty($val['visible'])) {
+ $visible = (int)dol_eval($val['visible'], 1);
+ $arrayfields['t.' . $key] = [
+ 'label' => $val['label'],
+ 'checked' => (($visible < 0) ? 0 : 1),
+ 'enabled' => ($visible != 3 && dol_eval($val['enabled'], 1)),
+ 'position' => $val['position'],
+ 'help' => $val['help'] ?? ''
+ ];
+ }
+}
+
+// Extra fields
+include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_array_fields.tpl.php';
+
+$object->fields = dol_sort_array($object->fields, 'position');
+$arrayfields = dol_sort_array($arrayfields, 'position');
+
+$permissiontoread = $user->rights->digiriskdolibarr->accident->read;
+$permissiontoadd = $user->rights->digiriskdolibarr->accident->write;
+$permissiontodelete = $user->rights->digiriskdolibarr->accident->delete;
+
+saturne_check_access($permissiontoread);
+
+/*
+ * 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)) {
+ if (GETPOST('cancel', 'alpha')) {
+ $action = 'list';
+ $massaction = '';
+ }
+ if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
+ $massaction = '';
+ }
+
+ // Selection of new fields.
+ include DOL_DOCUMENT_ROOT . '/core/actions_changeselectedfields.inc.php';
+
+ // Purge search criteria.
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers.
+ foreach ($object->fields as $key => $val) {
+ $search[$key] = '';
+ if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
+ $search[$key.'_dtstart'] = '';
+ $search[$key.'_dtend'] = '';
+ }
+ }
+ $toselect = [];
+ $search_array_options = [];
+ $search_category_array = [];
+ }
+ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
+ || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
+ $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation.
+ }
+
+ // Mass actions.
+ $objectclass = 'AccidentInvestigation';
+ $objectlabel = 'AccidentInvestigation';
+ $uploaddir = $conf->digiriskdolibarr->multidir_output[$conf->entity];
+ include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
+}
+
+/*
+ * View
+ */
+
+$title = $langs->trans('AccidentInvestigationList');
+$helpUrl = 'FR:Module_Digirisk#DigiRisk_-_Accident_b.C3.A9nins_et_presque_accidents';
+$morejs = ["/digiriskdolibarr/js/digiriskdolibarr.js"];
+$morecss = ["/digiriskdolibarr/css/digiriskdolibarr.css"];
+
+// Build and execute select.
+// --------------------------------------------------------------------
+$sql = 'SELECT ';
+$sql .= $object->getFieldList('t');
+// Add fields from extrafields.
+if (!empty($extrafields->attributes[$object->table_element]['label'])) {
+ foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
+ $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ', ef.' . $key . ' as options_' . $key . ', ' : '');
+ }
+}
+
+// Add fields from hooks.
+$parameters = [];
+$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook.
+$sql .= preg_replace('/^,/', '', $hookmanager->resPrint);
+$sql = preg_replace('/,\s*$/', '', $sql);
+$sql .= ' FROM ' . MAIN_DB_PREFIX.$object->table_element . ' as t';
+if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
+ $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . $object->table_element . '_extrafields as ef on (t.rowid = ef.fk_object)';
+}
+
+// Add table from hooks.
+$parameters = [];
+$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook.
+$sql .= $hookmanager->resPrint;
+if ($object->ismultientitymanaged == 1) {
+ $sql .= ' WHERE t.entity IN (' . getEntity($object->element) . ')';
+} else {
+ $sql .= ' WHERE 1 = 1';
+}
+
+foreach ($search as $key => $val) {
+ if (array_key_exists($key, $object->fields)) {
+ if ($key == 'status' && $val == -1) {
+ continue;
+ }
+ $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
+ if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
+ if ($val == '-1' || ($val === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
+ $val = '';
+ }
+ $mode_search = 2;
+ }
+ if ($val != '') {
+ $sql .= natural_search('t.'. $db->escape($key), $val, (($key == 'status') ? 2 : $mode_search));
+ }
+ } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && $val != '') {
+ $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
+ if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
+ if (preg_match('/_dtstart$/', $key)) {
+ $sql .= ' AND t.' . $columnName . " >= '" . $db->idate($val) . "'";
+ }
+ if (preg_match('/_dtend$/', $key)) {
+ $sql .= ' AND t.' . $columnName . " <= '" . $db->idate($val) . "'";
+ }
+ }
+ }
+}
+if ($search_all) {
+ $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
+}
+
+// Add where from extra fields.
+include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_sql.tpl.php';
+
+// Add where from hooks.
+$parameters = [];
+$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook.
+$sql .= $hookmanager->resPrint;
+
+// Count total nb of records.
+$nbTotalOfRecords = '';
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
+ /* The fast and low memory method to get and count full list converts the sql into a sql count */
+ $sqlForCount = preg_replace('/^SELECT[a-zA-Z0-9\._\s\(\),=<>\:\-\']+\sFROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql);
+ $resql = $db->query($sqlForCount);
+ if ($resql) {
+ $objForCount = $db->fetch_object($resql);
+ $nbTotalOfRecords = $objForCount->nbtotalofrecords;
+ } else {
+ dol_print_error($db);
+ }
+
+ if (($page * $limit) > $nbTotalOfRecords) { // if total of record found is smaller than page * limit, goto and load page 0
+ $page = 0;
+ $offset = 0;
+ }
+ $db->free($resql);
+}
+
+// Complete request and execute it with limit.
+$sql .= $db->order($sortfield, $sortorder);
+if ($limit) {
+ $sql .= $db->plimit($limit + 1, $offset);
+}
+
+$resql = $db->query($sql);
+if (!$resql) {
+ dol_print_error($db);
+ exit;
+}
+
+$num = $db->num_rows($resql);
+
+// Direct jump if only one record found.
+if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
+ $obj = $db->fetch_object($resql);
+ $id = $obj->rowid;
+ header('Location: ' . dol_buildpath('/digiriskdolibarr/view/accident/accident_investigation_card.php', 1) . '?id=' . $id);
+ exit;
+}
+
+saturne_header(0,'', $title, $helpUrl, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
+
+$arrayofselected = is_array($toselect) ? $toselect : [];
+
+$param = '';
+if (!empty($mode)) {
+ $param .= '&mode=' . urlencode($mode);
+}
+if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) {
+ $param .= '&contextpage=' . urlencode($contextpage);
+}
+if ($limit > 0 && $limit != $conf->liste_limit) {
+ $param .= '&limit=' . urlencode($limit);
+}
+foreach ($search as $key => $val) {
+ if (is_array($val) && count($val)) {
+ foreach ($val as $skey) {
+ $param .= '&search_' . $key . '[]=' . urlencode($skey);
+ }
+ } elseif ($val != '') {
+ $param .= '&search_' . $key . '=' . urlencode($val);
+ }
+}
+
+if ($optioncss != '') {
+ $param .= '&optioncss='.urlencode($optioncss);
+}
+// Add $param from extra fields.
+include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_param.tpl.php';
+
+// Add $param from hooks.
+$parameters = [];
+$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
+$param .= $hookmanager->resPrint;
+
+// List of mass actions available.
+$arrayofmassactions = [];
+if ($permissiontodelete) {
+ $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"') . $langs->trans('Delete');
+}
+if (GETPOST('nomassaction', 'int') || in_array($massaction, ['presend', 'predelete'])) {
+ $arrayofmassactions = [];
+}
+$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
+
+print '
';
+
+// End of page
+llxFooter();
+$db->close();
diff --git a/view/accident_investigation/index.php b/view/accident_investigation/index.php
new file mode 100644
index 000000000..17927e656
--- /dev/null
+++ b/view/accident_investigation/index.php
@@ -0,0 +1,2 @@
+