dolibarr 21.0.0-alpha
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 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
31// Load Dolibarr environment
32require '../main.inc.php';
33
34require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
35require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
36require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php';
37require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php';
38require_once DOL_DOCUMENT_ROOT . '/hrm/class/job.class.php';
39require_once DOL_DOCUMENT_ROOT . '/hrm/class/skill.class.php';
40require_once DOL_DOCUMENT_ROOT . '/hrm/class/skillrank.class.php';
41require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_skill.lib.php';
42require_once DOL_DOCUMENT_ROOT .'/hrm/class/evaluation.class.php';
43require_once DOL_DOCUMENT_ROOT.'/hrm/lib/hrm_evaluation.lib.php';
44
45// Load translation files required by the page
46$langs->loadLangs(array('hrm', 'other'));
47
48// Get Parameters
49$action = GETPOST('action', 'aZ09');
50$confirm = GETPOST('confirm', 'alpha');
51$cancel = GETPOST('cancel', 'aZ09');
52$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skillcard'; // To manage different context of search
53$backtopage = GETPOST('backtopage', 'alpha');
54$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
55
56$id = GETPOSTINT('id');
57$TSkillsToAdd = GETPOST('fk_skill', 'array');
58$objecttype = GETPOST('objecttype', 'alpha');
59$TNote = GETPOST('TNote', 'array');
60$lineid = GETPOSTINT('lineid');
61
62if (empty($objecttype)) {
63 $objecttype = 'job';
64}
65
66$TAuthorizedObjects = array('job', 'user');
67$skill = new SkillRank($db);
68
69// Initialize a technical objects
70if (in_array($objecttype, $TAuthorizedObjects)) {
71 if ($objecttype == 'job') {
72 $object = new Job($db);
73 } elseif ($objecttype == "user") {
74 $object = new User($db);
75 }
76} else {
77 accessforbidden('ErrorBadObjectType');
78}
79
80$hookmanager->initHooks(array('skilltab', 'globalcard')); // Note that conf->hooks_modules contains array
81
82// Load object
83include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
84if (method_exists($object, 'loadPersonalConf')) {
85 $object->loadPersonalConf();
86}
87
88// Permissions
89$permissiontoread = $user->hasRight('hrm', 'all', 'read');
90$permissiontoadd = $user->hasRight('hrm', 'all', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
91
92// Security check (enable the most restrictive one)
93if ($user->socid > 0) {
95}
96if (!isModEnabled('hrm')) {
98}
99if (!$permissiontoread) {
101}
102
103
104/*
105 * Actions
106 */
107
108$parameters = array();
109$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
110if ($reshook < 0) {
111 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
112}
113
114if (empty($reshook)) {
115 $error = 0;
116
117 $backurlforlist = DOL_URL_ROOT.'/hrm/skill_list.php';
118
119 if (empty($backtopage) || ($cancel && empty($id))) {
120 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
121 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
122 $backtopage = $backurlforlist;
123 } else {
124 $backtopage = DOL_URL_ROOT.'/hrm/skill_list.php?id=' . ($id > 0 ? $id : '__ID__');
125 }
126 }
127 }
128
129 // update national_registration_number
130 if ($action == 'setnational_registration_number' && $permissiontoadd) {
131 $object->national_registration_number = (string) GETPOST('national_registration_number', 'alphanohtml');
132 $result = $object->update($user);
133 if ($result < 0) {
134 setEventMessages($object->error, $object->errors, 'errors');
135 }
136 }
137
138 if ($action == 'addSkill' && $permissiontoadd) {
139 $error = 0;
140
141 if (empty($TSkillsToAdd)) {
142 setEventMessage('ErrNoSkillSelected', 'errors');
143 $error++;
144 }
145 if (!$error) {
146 foreach ($TSkillsToAdd as $k => $v) {
147 $skillAdded = new SkillRank($db);
148 $skillAdded->fk_skill = $v;
149 $skillAdded->fk_object = $id;
150 $skillAdded->objecttype = $objecttype;
151 $ret = $skillAdded->create($user);
152 if ($ret < 0) {
153 setEventMessages($skillAdded->error, null, 'errors');
154 }
155 //else unset($TSkillsToAdd);
156 }
157 if ($ret > 0) {
158 setEventMessages($langs->trans("SaveAddSkill"), null);
159 }
160 }
161 } elseif ($action == 'saveSkill' && $permissiontoadd) {
162 if (!empty($TNote)) {
163 foreach ($TNote as $skillId => $rank) {
164 $TSkills = $skill->fetchAll('ASC', 't.rowid', 0, 0, '(fk_object:=:'.((int) $id).") AND (objecttype:=:'".$db->escape($objecttype)."') AND (fk_skill:=:".((int) $skillId).')');
165 if (is_array($TSkills) && !empty($TSkills)) {
166 foreach ($TSkills as $tmpObj) {
167 $tmpObj->rankorder = $rank;
168 $tmpObj->update($user);
169 }
170 }
171 }
172 setEventMessages($langs->trans("SaveLevelSkill"), null);
173 header("Location: " . DOL_URL_ROOT.'/hrm/skill_tab.php?id=' . $id. '&objecttype=job');
174 exit;
175 }
176 } elseif ($action == 'confirm_deleteskill' && $confirm == 'yes' && $permissiontoadd) {
177 $skillToDelete = new SkillRank($db);
178 $ret = $skillToDelete->fetch($lineid);
179 setEventMessages($langs->trans("DeleteSkill"), null);
180 if ($ret > 0) {
181 $skillToDelete->delete($user);
182 }
183 }
184}
185
186
187/*
188 * View
189 */
190
191$form = new Form($db);
192$formfile = new FormFile($db);
193$formproject = new FormProjets($db);
194
195$title = $langs->trans("RequiredSkills");
196$help_url = '';
197llxHeader('', $title, $help_url);
198
199// Part to show record
200if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
201 $res = $object->fetch_optionals();
202
203 // view configuration
204 if ($objecttype == 'job') {
205 require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_job.lib.php';
206 $head = jobPrepareHead($object);
207 $listLink = dol_buildpath('/hrm/job_list.php', 1);
208 } elseif ($objecttype == "user") {
209 require_once DOL_DOCUMENT_ROOT . "/core/lib/usergroups.lib.php";
210 $object->getRights();
211 $head = user_prepare_head($object);
212 $listLink = dol_buildpath('/user/list.php', 1);
213 }
214
215 print dol_get_fiche_head($head, 'skill_tab', $langs->trans("Workstation"), -1, $object->picto);
216
217 $formconfirm = '';
218
219 // Confirmation to delete
220 // Confirmation to delete line
221 if ($action == 'ask_deleteskill') {
222 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id . '&objecttype=' . $objecttype . '&lineid=' . $lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteskill', '', 0, 1);
223 }
224 // Clone confirmation
225 /*if ($action == 'clone' && $permissiontoadd) {
226 // Create an array for form
227 $formquestion = array();
228 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
229 }*/
230
231 // Call Hook formConfirm
232 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
233 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
234 if (empty($reshook)) {
235 $formconfirm .= $hookmanager->resPrint;
236 } elseif ($reshook > 0) {
237 $formconfirm = $hookmanager->resPrint;
238 }
239
240 // Print form confirm
241 print $formconfirm;
242
243
244 // Object card
245 // ------------------------------------------------------------
246 if ($objecttype == 'job') {
247 $linkback = '<a href="' . dol_buildpath('/hrm/job_list.php', 1) . '?restore_lastsearch_values=1' . (!empty($socid) ? '&socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
248
249 $morehtmlref = '<div class="refid">';
250 $morehtmlref .= $object->label;
251 $morehtmlref .= '</div>';
252
253 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref);
254 } else {
255 $linkback = '<a href="' . $listLink . '?restore_lastsearch_values=1' . (!empty($socid) ? '&socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
256
257 $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">';
258 $morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
259 $morehtmlref .= '</a>';
260
261 $urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id);
262 $morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->trans("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover');
263
264 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref, '&objecttype='.$objecttype);
265 }
266
267 // Get all available skills
268 $static_skill = new Skill($db);
269 $TAllSkills = $static_skill->fetchAll();
270
271 // Array format for multiselectarray function
272 $TAllSkillsFormatted = array();
273 if (!empty($TAllSkills)) {
274 foreach ($TAllSkills as $k => $v) {
275 $TAllSkillsFormatted[$k] = $v->label;
276 }
277 }
278
279 // table of skillRank linked to current object
280 //$TSkillsJob = $skill->fetchAll('ASC', 't.rowid', 0, 0);
281 $sql_skill = "SELECT sr.fk_object, sr.rowid, s.label,s.skill_type, sr.rankorder, sr.fk_skill";
282 $sql_skill .= " FROM ".MAIN_DB_PREFIX."hrm_skillrank AS sr";
283 $sql_skill .= " JOIN ".MAIN_DB_PREFIX."hrm_skill AS s ON sr.fk_skill = s.rowid";
284 $sql_skill .= " AND sr.fk_object = ".((int) $id);
285 $result = $db->query($sql_skill);
286 $numSkills = $db->num_rows($result);
287 $TSkillsJob = array();
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 //num of evaluations for each user
479 $sqlEval = "SELECT rowid FROM ".MAIN_DB_PREFIX."hrm_evaluation as e";
480 $sqlEval .= " WHERE e.fk_user = ".((int) $id);
481 $rslt = $db->query($sqlEval);
482 $numEval = $db->num_rows($sqlEval);
483
484 $page = 0;
485 print_barre_liste($langs->trans("Evaluations"), $page, $_SERVER["PHP_SELF"], '', '', '', '', $numEval, $numEval, $evaltmp->picto, 0);
486
487 print '<div class="div-table-responsive-no-min">';
488 print '<table id="tablelines" class="noborder centpercent" width="100%">';
489 print '<tr class="liste_titre">';
490 print '<th>'.$langs->trans('Label').'</th>';
491 print '<th>'.$langs->trans('Description').'</th>';
492 print '<th>'.$langs->trans('DateEval').'</th>';
493 print '<th>'.$langs->trans('Status').'</th>';
494 print '<th>'.$langs->trans("Result").' ' .$form->textwithpicto('', GetLegendSkills(), 1) .'</th>';
495 print '</tr>';
496 if (!$resql) {
497 print '<tr><td><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
498 } else {
499 $i = 0;
500 $sameRef = array();
502 $objects = array();
503 while ($i < $num) {
504 $obj = $db->fetch_object($resql);
505 $obj->result = getRankOrderResults($obj);
506 $objects[$i] = $obj;
507 $i++;
508 }
509 //grouped skills by evaluation
510 $resultArray = getGroupedEval($objects);
511 foreach ($resultArray as $object) {
512 if (is_array($object)) {
513 $evaltmp->fetch($object[0]->rowid);
514 $evaltmp->id = $object[0]->rowid;
515 $evaltmp->ref = $object[0]->ref;
516 $job->fetch($object[0]->fk_job);
517 } else {
518 $evaltmp->ref = $object->ref;
519 $evaltmp->fetch($object->rowid);
520 $evaltmp->id = $object->rowid;
521 $job->fetch($object->fk_job);
522 }
523
524 print '<tr>';
525 print '<td>';
526 print $evaltmp->getNomUrl(1);
527 print '</td><td class="linecolfk_skill">';
528 print $job->getNomUrl(1);
529 print '</td>';
530 print '<td>';
531 print dol_print_date((!is_array($object) ? $object->date_eval : $object[0]->date_eval), 'day', 'tzserver');
532 print '</td><td>';
533 print $evaltmp->getLibStatut(2);
534 print '</td>';
535 print '<td class="linecolrank tdoverflowmax300">';
536
537 if (!is_array($object)) {
538 print $object->result;
539 } else {
540 foreach ($object as $skill) {
541 print $skill->result;
542 }
543 }
544 print '</td>';
545 print '</tr>';
546 }
547 }
548 print '</table>';
549 }
550
551 print dol_get_fiche_end();
552}
553
554llxFooter();
555$db->close();
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
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:38
Class for Skill.
static typeCodeToLabel($code)
Class for SkillRank.
Class to manage Dolibarr users.
llxFooter()
Footer empty.
Definition document.php:107
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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, $attop=0)
Set event message in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_barre_liste($title, $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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e rowid
Definition invoice.php:2002
user_prepare_head(User $object)
Prepare array with list of tabs.