diff --git a/langs/fr_FR/digiriskdolibarr.lang b/langs/fr_FR/digiriskdolibarr.lang index fcf3d3089..5dcd209fa 100644 --- a/langs/fr_FR/digiriskdolibarr.lang +++ b/langs/fr_FR/digiriskdolibarr.lang @@ -657,6 +657,11 @@ AccidentRateIndicator = Taux et indice des indicateurs de performance des accide NbPresquAccidents = Nombre de presqu'accidents NbAccidentInvestigations = Nombre d'enquête accidents NbWorkedHours = Nombre d\'heures travaillées +AccidentInvestigation = Enquête Accident +AccidentInvestigationDocument = Document d'enquête accident +accidentinvestigation.odt = Enquête accident +NewAccidentInvestigation = Nouvelle Enquête Accident +AccidentInvestigationList = Liste des Enquêtes Accidents # AccidentTooltip - Tooltip des accidents VictimActivityTooltip = Précisez l’activité ou la tâche de la victime au moment de l’accident, c’est-à-dire ce que faisait la victime diff --git a/view/accident_investigation/accident_investigation_card.php b/view/accident_investigation/accident_investigation_card.php new file mode 100644 index 000000000..367efc30e --- /dev/null +++ b/view/accident_investigation/accident_investigation_card.php @@ -0,0 +1,157 @@ + + * + * 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_investigation.php + * \ingroup digiriskdolibarr + * \brief Tab of accident investigation on generic element + */ + +// Load EasyCRM 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/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php'; + +// Load Digirisk librairies +require_once __DIR__ . '/../../class/accident.class.php'; +require_once __DIR__ . '/../../class/accidentinvestigation.class.php'; +require_once __DIR__ . '/../../lib/digiriskdolibarr_accidentinvestigation.lib.php'; + +// Global variables definitions +global $conf, $db, $hookmanager, $langs, $user; + +// Load translation files required by the page +saturne_load_langs(); + +// Get parameters +$id = GETPOST('id', 'int'); +$fkAccident = GETPOST('fk_accident', 'int'); +$objectType = GETPOST('from_type', 'alpha'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action', 'aZ09'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accidentinvestigationcard'; // To manage different context of search +$cancel = GETPOST('cancel', 'aZ09'); +$backtopage = GETPOST('backtopage', 'alpha') ? GETPOST('backtopage', 'alpha') : 'accident_investigation_list.php'; + +// Initialize technical objects +$accident = new Accident($db); +$object = new AccidentInvestigation($db); + +// Initialize view objects +$form = new Form($db); +$formcompany = new FormCompany($db); + +$hookmanager->initHooks(['accidentinvestigation', 'accidentinvestigationcard', 'digiriskdolibarrglobal', 'globalcard']); // Note that conf->hooks_modules contains array + +// Security check - Protection if external user +$permissiontoread = $user->rights->digiriskdolibarr->accident->read; +$permissiontoadd = $user->rights->digiriskdolibarr->accident->write; +$permissiontodelete = $user->rights->digiriskdolibarr->accident->delete; +saturne_check_access($permissiontoread); + +/* +* Actions +*/ + +$parameters = ['id' => $id]; +$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $objectLinked may have been modified by some hooks +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} + +if (empty($reshook)) { + // Cancel + if ($cancel && !empty($backtopage)) { + header('Location: ' . $backtopage); + exit; + } + + if ($action == 'add_accident_investigation') { + if (!empty($fkAccident)) { + $object->create($user); + } + } +} + +/* +* View +*/ + +$title = $langs->trans('AccidentInvestigation'); +$helpUrl = 'FR:Module_Digirisk#DigiRisk_-_Accident_b.C3.A9nins_et_presque_accidents'; + +saturne_header(0,'', $title, $helpUrl); + +if ($action == 'create') { + print load_fiche_titre($langs->trans("NewAccidentInvestigation"), $backtopage, $object->picto); + + print dol_get_fiche_head(); + + print '
'; + print ''; + print ''; + if ($backtopage) { + print ''; + } + + print '' . "\n"; + + // Common attributes + include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php'; + + print '

'; + + print dol_get_fiche_end(); + + print $form->buttonsSaveCancel('Create'); +} else if ($id > 0 || (!empty($ref) && empty($action))) { + $object->fetch($id); + + saturne_get_fiche_head($object, 'accidentinvestigation', $title); + + $morehtml = '' . $langs->trans('BackToList') . ''; + saturne_banner_tab($object, 'ref', $morehtml, 1, 'ref', 'ref', '', !empty($object->photo)); + + print '
'; + + print '
'; + + $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 ''; +if ($optioncss != '') { + print ''; +} +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$newcardbutton = ''; +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=common' . preg_replace('/([&?])*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), ['morecss' => 'reposition']); +$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER['PHP_SELF'] . '?mode=kanban' . preg_replace('/([&?])*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), ['morecss' => 'reposition']); +$newcardbutton .= dolGetButtonTitleSeparator(); +$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/digiriskdolibarr/view/accident/accident_investigation_card.php', 1) . '?action=create', '', $permissiontoadd); + +print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbTotalOfRecords, 'object_' . $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1); + +// Add code for pre mass action (confirmation or email presend form). +$topicmail = 'SendAccidentInvestigationRef'; +$modelmail = 'accidentinvestigation'; +$objecttmp = new AccidentInvestigation($db); +$trackid = 'xxxx' . $object->id; +include DOL_DOCUMENT_ROOT . '/core/tpl/massactions_pre.tpl.php'; + +if ($search_all) { + $setupstring = ''; + foreach ($fieldstosearchall as $key => $val) { + $fieldstosearchall[$key] = $langs->trans($val); + $setupstring .= $key . '=' . $val . ';'; + } + print ''; + print '
' . $langs->trans('FilterOnInto', $search_all) . join(', ', $fieldstosearchall) . '
'; +} + +$moreforfilter = ''; + +$parameters = []; +$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook. +if (empty($reshook)) { + $moreforfilter .= $hookmanager->resPrint; +} else { + $moreforfilter = $hookmanager->resPrint; +} + +if (!empty($moreforfilter)) { + print '
'; + print $moreforfilter; + print '
'; +} + +$varpage = empty($contextpage) ? $_SERVER['PHP_SELF'] : $contextpage; +$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields. +$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); + +print '
'; // You can use div-table-responsive-no-min if you don't need reserved height for your table. +print ''; + +// Fields title search. +// -------------------------------------------------------------------- +print ''; +// Action column +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} +foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } elseif (in_array($val['type'], ['date', 'datetime', 'timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } elseif (in_array($val['type'], ['timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap'; + } elseif (in_array($val['type'], ['double(24,8)', 'double(6,3)', 'integer', 'real', 'price']) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'right'; + } + if (!empty($arrayfields['t.' . $key]['checked'])) { + print ''; + } +} + +// Extra fields. +include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_input.tpl.php'; + +// Fields from hook. +$parameters = ['arrayfields' => $arrayfields]; +$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook. +print $hookmanager->resPrint; +// Action column +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; +} +print ''; + +$totalarray = []; +$totalarray['nbfield'] = 0; + +// Fields title label. +// -------------------------------------------------------------------- +print ''; +if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER['PHP_SELF'], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); +} +foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } elseif (in_array($val['type'], ['date', 'datetime', 'timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } elseif (in_array($val['type'], ['timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap'; + } elseif (in_array($val['type'], ['double(24,8)', 'double(6,3)', 'integer', 'real', 'price']) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'right'; + } + $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label + if (!empty($arrayfields['t.' . $key]['checked'])) { + print getTitleFieldOfList($arrayfields['t.' . $key]['label'], 0, $_SERVER['PHP_SELF'], 't.' . $key, '', $param, ($cssforfield ? 'class="' . $cssforfield . '"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield . ' ' : '')); + $totalarray['nbfield']++; + } +} + +// Extra fields. +include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_search_title.tpl.php'; + +// Hook fields. +$parameters = ['arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray]; +$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook. +print $hookmanager->resPrint; +// Action column +if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER['PHP_SELF'], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); +} +print ''; + +// Detect if we need a fetch on each output line. +$needToFetchEachLine = 0; +if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) { + foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) { + if (preg_match('/\$object/', $val)) { + $needToFetchEachLine++; // There is at least one compute field that use $object. + } + } +} + +// Loop on record. +// -------------------------------------------------------------------- +$i = 0; +$savnbfield = $totalarray['nbfield'] + 1; +$totalarray = []; +$totalarray['nbfield'] = 0; +$imaxinloop = ($limit ? min($num, $limit) : $num); +while ($i < $imaxinloop) { + $obj = $db->fetch_object($resql); + if (empty($obj)) { + break; // Should not happen. + } + + // Store properties in $object. + $object->setVarsFromFetchObj($obj); + + if ($mode == 'kanban') { + if ($i == 0) { + print ''; + } + } else { + // Show here line of result. + $j = 0; + print ''; + // Action column + if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + + foreach ($object->fields as $key => $val) { + $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']); + if (in_array($val['type'], ['date', 'datetime', 'timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } elseif ($key == 'status') { + $cssforfield .= ($cssforfield ? ' ' : '') . 'center'; + } + + if (in_array($val['type'], ['timestamp'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap'; + } elseif ($key == 'ref') { + $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap'; + } + + if (in_array($val['type'], ['double(24,8)', 'double(6,3)', 'integer', 'real', 'price']) && !in_array($key, ['rowid', 'status']) && empty($val['arrayofkeyval'])) { + $cssforfield .= ($cssforfield ? ' ' : '') . 'right'; + } + //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100'; + + if (!empty($arrayfields['t.' . $key]['checked'])) { + print ''; + $object->module = 'custom/' . $object->module; + if ($key == 'status') { + print $object->getLibStatut(5); + } elseif ($key == 'rowid') { + print $object->showOutputField($val, $key, $object->id); + } else { + print $object->showOutputField($val, $key, $object->$key); + } + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + if (!empty($val['isameasure'])) { + if (!$i) { + $totalarray['pos'][$totalarray['nbfield']] = 't.' . $key; + } + if (!isset($totalarray['val'])) { + $totalarray['val'] = []; + } + if (!isset($totalarray['val']['t.' . $key])) { + $totalarray['val']['t.' . $key] = 0; + } + $totalarray['val']['t.' . $key] += $object->$key; + } + } + } + + // Extra fields. + include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_print_fields.tpl.php'; + + $parameters = ['arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray]; + $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook. + print $hookmanager->resPrint; + // Action column + if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) { + print ''; + } + if (!$i) { + $totalarray['nbfield']++; + } + print ''; + } + $i++; +} + +// Show total line. +include DOL_DOCUMENT_ROOT . '/core/tpl/list_print_total.tpl.php'; + +// If no record found. +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''; +} + +$db->free($resql); + +$parameters = ['arrayfields' => $arrayfields, 'sql' => $sql]; +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +print '
'; + $searchpicto = $form->showFilterButtons('left'); + print $searchpicto; + print ''; + if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) { + print $form->selectarray('search_' . $key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'); + } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) { + print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1); + } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) { + print '
'; + print $form->selectDate($search[$key . '_dtstart'] ?: '', 'search_' . $key . '_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print '
'; + print $form->selectDate($search[$key . '_dtend'] ?: '', 'search_' . $key . '_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to')); + print '
'; + } elseif ($key == 'lang') { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($db); + print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2); + } else { + print ''; + } + print '
'; + $searchpicto = $form->showFilterButtons(); + print $searchpicto; + print '
'; + print '
'; + } + // Output Kanban + print $object->getKanbanView(); + if ($i == ($imaxinloop - 1)) { + print '
'; + print '
'; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined. + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print ''; + if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined. + $selected = 0; + if (in_array($object->id, $arrayofselected)) { + $selected = 1; + } + print ''; + } + print '
' . $langs->trans('NoRecordFound') . '
'; +print '
'; +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 @@ +