31require
'../main.inc.php';
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';
45$langs->loadLangs(array(
'hrm',
'other'));
48$action =
GETPOST(
'action',
'aZ09');
49$confirm =
GETPOST(
'confirm',
'alpha');
50$cancel =
GETPOST(
'cancel',
'aZ09');
51$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'skillcard';
52$backtopage =
GETPOST(
'backtopage',
'alpha');
53$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
56$TSkillsToAdd =
GETPOST(
'fk_skill',
'array');
57$objecttype =
GETPOST(
'objecttype',
'alpha');
58$TNote =
GETPOST(
'TNote',
'array');
59$lineid =
GETPOST(
'lineid',
'int');
61if (empty($objecttype)) {
65$TAuthorizedObjects = array(
'job',
'user');
69if (in_array($objecttype, $TAuthorizedObjects)) {
70 if ($objecttype ==
'job') {
71 $object =
new Job($db);
72 } elseif ($objecttype ==
"user") {
73 $object =
new User($db);
79$hookmanager->initHooks(array(
'skilltab',
'globalcard'));
82include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
83if (method_exists($object,
'loadPersonalConf')) {
84 $object->loadPersonalConf();
88$permissiontoread = $user->hasRight(
'hrm',
'all',
'read');
89$permissiontoadd = $user->hasRight(
'hrm',
'all',
'write');
92if ($user->socid > 0) {
95if (!isModEnabled(
'hrm')) {
98if (!$permissiontoread) {
107$parameters = array();
108$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
113if (empty($reshook)) {
116 $backurlforlist = DOL_URL_ROOT.
'/hrm/skill_list.php';
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;
123 $backtopage = DOL_URL_ROOT.
'/hrm/skill_list.php?id=' . ($id > 0 ? $id :
'__ID__');
129 if ($action ==
'setnational_registration_number') {
130 $object->national_registration_number = (string)
GETPOST(
'national_registration_number',
'alphanohtml');
131 $result = $object->update($user);
137 if ($action ==
'addSkill') {
140 if (empty($TSkillsToAdd)) {
145 foreach ($TSkillsToAdd as $k=>$v) {
147 $skillAdded->fk_skill = $v;
148 $skillAdded->fk_object = $id;
149 $skillAdded->objecttype = $objecttype;
150 $ret = $skillAdded->create($user);
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);
172 header(
"Location: " . DOL_URL_ROOT.
'/hrm/skill_tab.php?id=' . $id.
'&objecttype=job');
175 } elseif ($action ==
'confirm_deleteskill' && $confirm ==
'yes') {
177 $ret = $skillToDelete->fetch($lineid);
180 $skillToDelete->delete($user);
189$form =
new Form($db);
193$title = $langs->trans(
"RequiredSkills");
198if ($object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
199 $res = $object->fetch_optionals();
202 if ($objecttype ==
'job') {
203 require_once DOL_DOCUMENT_ROOT .
'/hrm/lib/hrm_job.lib.php';
206 } elseif ($objecttype ==
"user") {
207 require_once DOL_DOCUMENT_ROOT .
"/core/lib/usergroups.lib.php";
208 $object->getRights();
213 print
dol_get_fiche_head($head,
'skill_tab', $langs->trans(
"Workstation"), -1, $object->picto);
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);
233 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
234 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
235 if (empty($reshook)) {
236 $formconfirm .= $hookmanager->resPrint;
237 } elseif ($reshook > 0) {
238 $formconfirm = $hookmanager->resPrint;
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>';
250 $morehtmlref =
'<div class="refid">';
251 $morehtmlref.= $object->label;
252 $morehtmlref .=
'</div>';
254 dol_banner_tab($object,
'id', $linkback, 1,
'rowid',
'rowid', $morehtmlref);
256 $linkback =
'<a href="' . $listLink .
'?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
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>';
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');
265 dol_banner_tab($object,
'id', $linkback, 1,
'rowid',
'rowid', $morehtmlref,
'&objecttype='.$objecttype);
269 $static_skill =
new Skill($db);
270 $TAllSkills = $static_skill->fetchAll();
273 $TAllSkillsFormatted=array();
274 if (!empty($TAllSkills)) {
275 foreach ($TAllSkills as $k=>$v) {
276 $TAllSkillsFormatted[$k] = $v->label;
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;
293 $TAlreadyUsedSkill = array();
294 if (is_array($TSkillsJob) && !empty($TSkillsJob)) {
295 foreach ($TSkillsJob as $skillElement) {
296 $TAlreadyUsedSkill[$skillElement->fk_skill] = $skillElement->fk_skill;
300 print
'<div class="fichecenter">';
301 print
'<div class="fichehalfleft">';
303 print
'<div class="underbanner clearboth"></div>';
304 print
'<table class="border centpercent tableforfield">'.
"\n";
306 if ($objecttype ==
'job') {
311 $object->fields[
'label'][
'visible']=0;
312 include DOL_DOCUMENT_ROOT .
'/core/tpl/commonfields_view.tpl.php';
315 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
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");
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"');
338 $object->fields[
'label'][
'visible']=0;
339 $object->fields[
'firstname'][
'visible']=0;
340 $object->fields[
'lastname'][
'visible']=0;
344 print
'<tr><td class="titlefield">'.$langs->trans(
"RefEmployee").
'</td>';
345 print
'<td class="error">';
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>';
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").
'">';
376 print
'<div class="clearboth"></div><br>';
378 if ($objecttype !=
'user' && $permissiontoadd) {
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>';
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>';
401 print
'<div class="clearboth"></div>';
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">';
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>';
423 if (!is_array($TSkillsJob) || empty($TSkillsJob)) {
424 print
'<tr><td><span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span></td></tr>';
426 $sk =
new Skill($db);
427 foreach ($TSkillsJob as $skillElement) {
428 $sk->fetch((
int) $skillElement->fk_skill);
432 print
'</td><td class="linecolfk_skill">';
433 print $sk->getNomUrl(1);
436 print $sk->description;
437 print
'</td><td class="linecolrank">';
438 print
displayRankInfos($skillElement->rankorder, $skillElement->fk_skill,
'TNote', $objecttype ==
'job' && $permissiontoadd ?
'edit' :
'view');
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 .
'&objecttype=' . $objecttype .
'&action=ask_deleteskill&lineid=' . $skillElement->rowid .
'">';
453 if ($objecttype !=
'user' && $permissiontoadd) {
454 print
'<td><input class="button pull-right" type="submit" value="' . $langs->trans(
'SaveRank') .
'"></td>';
457 if ($objecttype !=
'user' && $permissiontoadd) {
464 if ($objecttype ==
'user' && $permissiontoadd) {
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);
478 print_barre_liste($langs->trans(
"Evaluations"), $page, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $num, $num, $evaltmp->picto, 0);
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>';
490 print
'<tr><td><span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span></td></tr>';
496 $obj = $db->fetch_object($resql);
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);
510 $evaltmp->ref = $object->ref;
511 $evaltmp->fetch($object->rowid);
512 $evaltmp->id = $object->rowid;
513 $job->fetch($object->fk_job);
518 print $evaltmp->getNomUrl(1);
519 print
'</td><td class="linecolfk_skill">';
520 print $job->getNomUrl(1);
523 print
dol_print_date((!is_array($object) ? $object->date_eval : $object[0]->date_eval),
'day',
'tzserver');
525 print $evaltmp->getLibStatut(2);
527 print
'<td class="linecolrank tdoverflowmax300">';
528 if (!is_array($object)) {
529 print $object->result;
531 foreach ($object as $skill) {
532 print $skill->result;
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
static typeCodeToLabel($code)
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.
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
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.