dolibarr 19.0.3
skill_tab.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2021 Grégory Blémand <contact@atm-consulting.fr>
3 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
4 * Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
5 * Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
6 * Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
7 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
30// Load Dolibarr environment
31require '../main.inc.php';
32
33require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
35require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php';
36require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php';
37require_once DOL_DOCUMENT_ROOT . '/hrm/class/job.class.php';
38require_once DOL_DOCUMENT_ROOT . '/hrm/class/skill.class.php';
39require_once DOL_DOCUMENT_ROOT . '/hrm/class/skillrank.class.php';
40require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_skill.lib.php';
41require_once DOL_DOCUMENT_ROOT .'/hrm/class/evaluation.class.php';
42require_once DOL_DOCUMENT_ROOT.'/hrm/lib/hrm_evaluation.lib.php';
43
44// Load translation files required by the page
45$langs->loadLangs(array('hrm', 'other'));
46
47// Get Parameters
48$action = GETPOST('action', 'aZ09');
49$confirm = GETPOST('confirm', 'alpha');
50$cancel = GETPOST('cancel', 'aZ09');
51$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skillcard'; // To manage different context of search
52$backtopage = GETPOST('backtopage', 'alpha');
53$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
54
55$id = GETPOST('id', 'int');
56$TSkillsToAdd = GETPOST('fk_skill', 'array');
57$objecttype = GETPOST('objecttype', 'alpha');
58$TNote = GETPOST('TNote', 'array');
59$lineid = GETPOST('lineid', 'int');
60
61if (empty($objecttype)) {
62 $objecttype = 'job';
63}
64
65$TAuthorizedObjects = array('job', 'user');
66$skill = new SkillRank($db);
67
68// Initialize technical objects
69if (in_array($objecttype, $TAuthorizedObjects)) {
70 if ($objecttype == 'job') {
71 $object = new Job($db);
72 } elseif ($objecttype == "user") {
73 $object = new User($db);
74 }
75} else {
76 accessforbidden('ErrorBadObjectType');
77}
78
79$hookmanager->initHooks(array('skilltab', 'globalcard')); // Note that conf->hooks_modules contains array
80
81// Load object
82include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
83if (method_exists($object, 'loadPersonalConf')) {
84 $object->loadPersonalConf();
85}
86
87// Permissions
88$permissiontoread = $user->hasRight('hrm', 'all', 'read');
89$permissiontoadd = $user->hasRight('hrm', 'all', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
90
91// Security check (enable the most restrictive one)
92if ($user->socid > 0) {
94}
95if (!isModEnabled('hrm')) {
97}
98if (!$permissiontoread) {
100}
101
102
103/*
104 * Actions
105 */
106
107$parameters = array();
108$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
109if ($reshook < 0) {
110 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
111}
112
113if (empty($reshook)) {
114 $error = 0;
115
116 $backurlforlist = DOL_URL_ROOT.'/hrm/skill_list.php';
117
118 if (empty($backtopage) || ($cancel && empty($id))) {
119 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
120 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
121 $backtopage = $backurlforlist;
122 } else {
123 $backtopage = DOL_URL_ROOT.'/hrm/skill_list.php?id=' . ($id > 0 ? $id : '__ID__');
124 }
125 }
126 }
127
128 // update national_registration_number
129 if ($action == 'setnational_registration_number') {
130 $object->national_registration_number = (string) GETPOST('national_registration_number', 'alphanohtml');
131 $result = $object->update($user);
132 if ($result < 0) {
133 setEventMessages($object->error, $object->errors, 'errors');
134 }
135 }
136
137 if ($action == 'addSkill') {
138 $error = 0;
139
140 if (empty($TSkillsToAdd)) {
141 setEventMessage('ErrNoSkillSelected', 'errors');
142 $error++;
143 }
144 if (!$error) {
145 foreach ($TSkillsToAdd as $k=>$v) {
146 $skillAdded = new SkillRank($db);
147 $skillAdded->fk_skill = $v;
148 $skillAdded->fk_object = $id;
149 $skillAdded->objecttype = $objecttype;
150 $ret = $skillAdded->create($user);
151 if ($ret < 0) {
152 setEventMessages($skillAdded->error, null, 'errors');
153 }
154 //else unset($TSkillsToAdd);
155 }
156 if ($ret > 0) {
157 setEventMessages($langs->trans("SaveAddSkill"), null);
158 }
159 }
160 } elseif ($action == 'saveSkill') {
161 if (!empty($TNote)) {
162 foreach ($TNote as $skillId => $rank) {
163 $TSkills = $skill->fetchAll('ASC', 't.rowid', 0, 0, array('customsql' => 'fk_object=' . ((int) $id) . " AND objecttype='" . $db->escape($objecttype) . "' AND fk_skill = " . ((int) $skillId)));
164 if (is_array($TSkills) && !empty($TSkills)) {
165 foreach ($TSkills as $tmpObj) {
166 $tmpObj->rankorder = $rank;
167 $tmpObj->update($user);
168 }
169 }
170 }
171 setEventMessages($langs->trans("SaveLevelSkill"), null);
172 header("Location: " . DOL_URL_ROOT.'/hrm/skill_tab.php?id=' . $id. '&objecttype=job');
173 exit;
174 }
175 } elseif ($action == 'confirm_deleteskill' && $confirm == 'yes') {
176 $skillToDelete = new SkillRank($db);
177 $ret = $skillToDelete->fetch($lineid);
178 setEventMessages($langs->trans("DeleteSkill"), null);
179 if ($ret > 0) {
180 $skillToDelete->delete($user);
181 }
182 }
183}
184
185/*
186 * View
187 */
188
189$form = new Form($db);
190$formfile = new FormFile($db);
191$formproject = new FormProjets($db);
192
193$title = $langs->trans("RequiredSkills");
194$help_url = '';
195llxHeader('', $title, $help_url);
196
197// Part to show record
198if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
199 $res = $object->fetch_optionals();
200
201 // view configuration
202 if ($objecttype == 'job') {
203 require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_job.lib.php';
204 $head = jobPrepareHead($object);
205 $listLink = dol_buildpath('/hrm/job_list.php', 1);
206 } elseif ($objecttype == "user") {
207 require_once DOL_DOCUMENT_ROOT . "/core/lib/usergroups.lib.php";
208 $object->getRights();
209 $head = user_prepare_head($object);
210 $listLink = dol_buildpath('/user/list.php', 1);
211 }
212
213 print dol_get_fiche_head($head, 'skill_tab', $langs->trans("Workstation"), -1, $object->picto);
214
215 $formconfirm = '';
216
217 // Confirmation to delete
218 /*if ($action == 'delete') {
219 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteSkill'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
220 }*/
221 // Confirmation to delete line
222 if ($action == 'ask_deleteskill') {
223 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id . '&objecttype=' . $objecttype . '&lineid=' . $lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteskill', '', 0, 1);
224 }
225 // Clone confirmation
226 /*if ($action == 'clone') {
227 // Create an array for form
228 $formquestion = array();
229 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
230 }*/
231
232 // Call Hook formConfirm
233 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
234 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
235 if (empty($reshook)) {
236 $formconfirm .= $hookmanager->resPrint;
237 } elseif ($reshook > 0) {
238 $formconfirm = $hookmanager->resPrint;
239 }
240
241 // Print form confirm
242 print $formconfirm;
243
244
245 // Object card
246 // ------------------------------------------------------------
247 if ($objecttype == 'job') {
248 $linkback = '<a href="' . dol_buildpath('/hrm/job_list.php', 1) . '?restore_lastsearch_values=1' . (!empty($socid) ? '&socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
249
250 $morehtmlref = '<div class="refid">';
251 $morehtmlref.= $object->label;
252 $morehtmlref .= '</div>';
253
254 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref);
255 } else {
256 $linkback = '<a href="' . $listLink . '?restore_lastsearch_values=1' . (!empty($socid) ? '&socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
257
258 $morehtmlref = '<a href="'.DOL_URL_ROOT.'/user/vcard.php?id='.$object->id.'&output=file&file='.urlencode(dol_sanitizeFileName($object->getFullName($langs).'.vcf')).'" class="refid" rel="noopener">';
259 $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
260 $morehtmlref .= '</a>';
261
262 $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id);
263 $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover');
264
265 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref, '&objecttype='.$objecttype);
266 }
267
268 // Get all available skills
269 $static_skill = new Skill($db);
270 $TAllSkills = $static_skill->fetchAll();
271
272 // Array format for multiselectarray function
273 $TAllSkillsFormatted=array();
274 if (!empty($TAllSkills)) {
275 foreach ($TAllSkills as $k=>$v) {
276 $TAllSkillsFormatted[$k] = $v->label;
277 }
278 }
279
280 // table of skillRank linked to current object
281 //$TSkillsJob = $skill->fetchAll('ASC', 't.rowid', 0, 0);
282 $sql_skill = "SELECT sr.fk_object, sr.rowid, s.label,s.skill_type, sr.rankorder, sr.fk_skill";
283 $sql_skill .=" FROM ".MAIN_DB_PREFIX."hrm_skillrank AS sr";
284 $sql_skill .=" JOIN ".MAIN_DB_PREFIX."hrm_skill AS s ON sr.fk_skill = s.rowid";
285 $sql_skill .= " AND sr.fk_object = ".((int) $id);
286 $result = $db->query($sql_skill);
287 $numSkills = $db->num_rows($result);
288 for ($i=0; $i < $numSkills; $i++) {
289 $objSkillRank = $db->fetch_object($result);
290 $TSkillsJob[] = $objSkillRank;
291 }
292
293 $TAlreadyUsedSkill = array();
294 if (is_array($TSkillsJob) && !empty($TSkillsJob)) {
295 foreach ($TSkillsJob as $skillElement) {
296 $TAlreadyUsedSkill[$skillElement->fk_skill] = $skillElement->fk_skill;
297 }
298 }
299
300 print '<div class="fichecenter">';
301 print '<div class="fichehalfleft">';
302
303 print '<div class="underbanner clearboth"></div>';
304 print '<table class="border centpercent tableforfield">'."\n";
305
306 if ($objecttype == 'job') {
307 // Common attributes
308 //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
309 //unset($object->fields['fk_project']); // Hide field already shown in banner
310 //unset($object->fields['fk_soc']); // Hide field already shown in banner
311 $object->fields['label']['visible']=0; // Already in banner
312 include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php';
313
314 // Other attributes. Fields from hook formObjectOptions and Extrafields.
315 include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
316 } else {
317 // Login
318 print '<tr><td class="titlefield">'.$langs->trans("Login").'</td>';
319 if (!empty($object->ldap_sid) && $object->statut == 0) {
320 print '<td class="error">';
321 print $langs->trans("LoginAccountDisableInDolibarr");
322 print '</td>';
323 } else {
324 print '<td>';
325 $addadmin = '';
326 if (property_exists($object, 'admin')) {
327 if (isModEnabled('multicompany') && !empty($object->admin) && empty($object->entity)) {
328 $addadmin .= img_picto($langs->trans("SuperAdministratorDesc"), "redstar", 'class="paddingleft"');
329 } elseif (!empty($object->admin)) {
330 $addadmin .= img_picto($langs->trans("AdministratorDesc"), "star", 'class="paddingleft"');
331 }
332 }
333 print showValueWithClipboardCPButton(!empty($object->login) ? $object->login : '').$addadmin;
334 print '</td>';
335 }
336 print '</tr>'."\n";
337
338 $object->fields['label']['visible']=0; // Already in banner
339 $object->fields['firstname']['visible']=0; // Already in banner
340 $object->fields['lastname']['visible']=0; // Already in banner
341 //include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php';
342
343 // Ref employee
344 print '<tr><td class="titlefield">'.$langs->trans("RefEmployee").'</td>';
345 print '<td class="error">';
346 print showValueWithClipboardCPButton(!empty($object->ref_employee) ? $object->ref_employee : '');
347 print '</td>';
348 print '</tr>'."\n";
349
350 // National Registration Number
351 print '<tr><td class="titlefield">'.$langs->trans("NationalRegistrationNumber").' <a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&objecttype=user&action=editnational_registration_number&token='.newToken().'">'.img_picto($langs->trans("Edit"), 'edit').'</a></td>';
352 print '<td>';
353 if ($action == 'editnational_registration_number') {
354 $ret = '<form method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&objecttype=user">';
355 $ret .= '<input type="hidden" name="action" value="setnational_registration_number">';
356 $ret .= '<input type="hidden" name="token" value="'.newToken().'">';
357 $ret .= '<input type="hidden" name="id" value="'.$object->id.'">';
358 $ret .= '<input type="text" name="national_registration_number" value="'.$object->national_registration_number.'">';
359 $ret .= '<input type="submit" class="button smallpaddingimp" name="modify" value="'.$langs->trans("Modify").'"> ';
360 $ret .= '<input type="submit" class="button smallpaddingimp button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
361 $ret .= '</form>';
362 print $ret;
363 } else {
364 print showValueWithClipboardCPButton(!empty($object->national_registration_number) ? $object->national_registration_number : '');
365 }
366 print '</td>';
367 print '</tr>'."\n";
368 }
369
370 print '</table>';
371
372 print '</div>';
373 print '</div>';
374
375
376 print '<div class="clearboth"></div><br>';
377
378 if ($objecttype != 'user' && $permissiontoadd) {
379 // form to add new skills
380 print '<br>';
381 print '<form name="addSkill" method="post" action="' . $_SERVER['PHP_SELF'] . '">';
382 print '<input type="hidden" name="objecttype" value="' . $objecttype . '">';
383 print '<input type="hidden" name="id" value="' . $id . '">';
384 print '<input type="hidden" name="action" value="addSkill">';
385 print '<input type="hidden" name="token" value="'.newToken().'">';
386 print '<div class="div-table-responsive-no-min">';
387 print '<table id="tablelines" class="noborder noshadow" width="100%">';
388 print '<tr><td style="width:90%">' . $langs->trans('AddSkill') . '</td><td style="width:10%"></td></tr>';
389 print '<tr>';
390 print '<td>';
391 print img_picto('', 'shapes', 'class="pictofixedwidth"');
392 print $form->multiselectarray('fk_skill', array_diff_key($TAllSkillsFormatted, $TAlreadyUsedSkill), array(), 0, 0, 'widthcentpercentminusx') . '</td>';
393 print '<td><input class="button reposition" type="submit" value="' . $langs->trans('Add') . '"></td>';
394 print '</tr>';
395 print '</table>';
396 print '</div>';
397 print '</form>';
398 }
399 print '<br>';
400
401 print '<div class="clearboth"></div>';
402
403 if ($objecttype != 'user' && $permissiontoadd) {
404 print '<form name="saveSkill" method="post" action="' . $_SERVER['PHP_SELF'] . '">';
405 print '<input type="hidden" name="objecttype" value="' . $objecttype . '">';
406 print '<input type="hidden" name="id" value="' . $id . '">';
407 print '<input type="hidden" name="token" value="'.newToken().'">';
408 print '<input type="hidden" name="action" value="saveSkill">';
409 }
410 if ($objecttype != 'user') {
411 print '<div class="div-table-responsive-no-min">';
412 print '<table id="tablelines" class="noborder centpercent" width="100%">';
413 print '<tr class="liste_titre">';
414 print '<th>'.$langs->trans('SkillType').'</th>';
415 print '<th>'.$langs->trans('Label').'</th>';
416 print '<th>'.$langs->trans('Description').'</th>';
417 print '<th>'.$langs->trans($objecttype === 'job' ? 'RequiredRank' : 'EmployeeRank').'</th>';
418 if ($objecttype === 'job') {
419 print '<th class="linecoledit"></th>';
420 print '<th class="linecoldelete"></th>';
421 }
422 print '</tr>';
423 if (!is_array($TSkillsJob) || empty($TSkillsJob)) {
424 print '<tr><td><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
425 } else {
426 $sk = new Skill($db);
427 foreach ($TSkillsJob as $skillElement) {
428 $sk->fetch((int) $skillElement->fk_skill);
429 print '<tr>';
430 print '<td>';
431 print Skill::typeCodeToLabel($sk->skill_type);
432 print '</td><td class="linecolfk_skill">';
433 print $sk->getNomUrl(1);
434 print '</td>';
435 print '<td>';
436 print $sk->description;
437 print '</td><td class="linecolrank">';
438 print displayRankInfos($skillElement->rankorder, $skillElement->fk_skill, 'TNote', $objecttype == 'job' && $permissiontoadd ? 'edit' : 'view');
439 print '</td>';
440 if ($objecttype != 'user' && $permissiontoadd) {
441 print '<td class="linecoledit"></td>';
442 print '<td class="linecoldelete">';
443 print '<a class="reposition" href="' . $_SERVER["PHP_SELF"] . '?id=' . $skillElement->fk_object . '&amp;objecttype=' . $objecttype . '&amp;action=ask_deleteskill&amp;lineid=' . $skillElement->rowid . '">';
444 print img_delete();
445 print '</a>';
446 }
447 print '</td>';
448 print '</tr>';
449 }
450 }
451
452 print '</table>';
453 if ($objecttype != 'user' && $permissiontoadd) {
454 print '<td><input class="button pull-right" type="submit" value="' . $langs->trans('SaveRank') . '"></td>';
455 }
456 print '</div>';
457 if ($objecttype != 'user' && $permissiontoadd) {
458 print '</form>';
459 }
460 }
461
462
463 // liste des evaluation liées
464 if ($objecttype == 'user' && $permissiontoadd) {
465 $evaltmp = new Evaluation($db);
466 $job = new Job($db);
467 $sql = "select e.rowid,e.ref,e.fk_user,e.fk_job,e.date_eval,ed.rankorder,ed.required_rank,ed.fk_skill,s.label";
468 $sql .= " FROM ".MAIN_DB_PREFIX."hrm_evaluation as e";
469 $sql .= ", ".MAIN_DB_PREFIX."hrm_evaluationdet as ed";
470 $sql .= ", ".MAIN_DB_PREFIX."hrm_skill as s";
471 $sql .= " WHERE e.rowid = ed.fk_evaluation";
472 $sql .= " AND s.rowid = ed.fk_skill";
473 $sql .= " AND e.fk_user = ".((int) $id);
474 $sql .= " AND e.status > 0";
475 $resql = $db->query($sql);
476 $num = $db->num_rows($resql);
477
478 print_barre_liste($langs->trans("Evaluations"), $page, $_SERVER["PHP_SELF"], '', '', '', '', $num, $num, $evaltmp->picto, 0);
479
480 print '<div class="div-table-responsive-no-min">';
481 print '<table id="tablelines" class="noborder centpercent" width="100%">';
482 print '<tr class="liste_titre">';
483 print '<th>'.$langs->trans('Label').'</th>';
484 print '<th>'.$langs->trans('Description').'</th>';
485 print '<th>'.$langs->trans('DateEval').'</th>';
486 print '<th>'.$langs->trans('Status').'</th>';
487 print '<th>'.$langs->trans("Result").' ' .$form->textwithpicto('', GetLegendSkills(), 1) .'</th>';
488 print '</tr>';
489 if (!$resql) {
490 print '<tr><td><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
491 } else {
492 $i = 0;
493 $sameRef = array();
494 $objects = array();
495 while ($i < $num) {
496 $obj = $db->fetch_object($resql);
497 $obj->result = getRankOrderResults($obj);
498 $objects[$i] = $obj;
499 $i++;
500 }
501 //grouped skills by evaluation
502 $resultArray = getGroupedEval($objects);
503 foreach ($resultArray as $object) {
504 if (is_array($object)) {
505 $evaltmp->fetch($object[0]->rowid);
506 $evaltmp->id = $object[0]->rowid;
507 $evaltmp->ref = $object[0]->ref;
508 $job->fetch($object[0]->fk_job);
509 } else {
510 $evaltmp->ref = $object->ref;
511 $evaltmp->fetch($object->rowid);
512 $evaltmp->id = $object->rowid;
513 $job->fetch($object->fk_job);
514 }
515
516 print '<tr>';
517 print '<td>';
518 print $evaltmp->getNomUrl(1);
519 print '</td><td class="linecolfk_skill">';
520 print $job->getNomUrl(1);
521 print '</td>';
522 print '<td>';
523 print dol_print_date((!is_array($object) ? $object->date_eval : $object[0]->date_eval), 'day', 'tzserver');
524 print '</td><td>';
525 print $evaltmp->getLibStatut(2);
526 print '</td>';
527 print '<td class="linecolrank tdoverflowmax300">';
528 if (!is_array($object)) {
529 print $object->result;
530 } else {
531 foreach ($object as $skill) {
532 print $skill->result;
533 }
534 }
535 print '</td>';
536 print '</tr>';
537 }
538 }
539 print '</table>';
540 }
541
542 print dol_get_fiche_end();
543
544 llxFooter();
545}
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class for Evaluation.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class for Job.
Definition job.class.php:37
Class for Skill.
static typeCodeToLabel($code)
Class for SkillRank.
Class to manage Dolibarr users.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
GetLegendSkills()
getRankOrderResults($obj)
getGroupedEval($objects)
Grouped rows with same ref in array.
jobPrepareHead($object)
Prepare array of tabs for Job.
displayRankInfos($selected_rank, $fk_skill, $inputname='TNote', $mode='view')
Used to print ranks of a skill into several case, view or edit pour js necessary to select a rank.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
Definition invoice.php:1907
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
user_prepare_head(User $object)
Prepare array with list of tabs.