31require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
32require_once DOL_DOCUMENT_ROOT .
'/hrm/lib/hrm_skillrank.lib.php';
42 public $module =
'hrm';
47 public $element =
'skillrank';
52 public $table_element =
'hrm_skillrank';
57 public $picto =
'skillrank@hrm';
60 const STATUS_DRAFT = 0;
61 const STATUS_VALIDATED = 1;
62 const STATUS_CANCELED = 9;
64 const SKILLRANK_TYPE_JOB =
"job";
65 const SKILLRANK_TYPE_USER =
"user";
66 const SKILLRANK_TYPE_EVALDET =
"evaluationdet";
98 public $fields = array(
99 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'position' => 1,
'notnull' => 1,
'visible' => 0,
'noteditable' => 1,
'index' => 1,
'css' =>
'left',
'comment' =>
"Id"),
100 'fk_skill' => array(
'type' =>
'integer:Skill:hrm/class/skill.class.php:1',
'label' =>
'Skill',
'enabled' => 1,
'position' => 3,
'notnull' => 1,
'visible' => 1,
'index' => 1,),
101 'rankorder' => array(
'type' =>
'integer',
'label' =>
'Rank',
'enabled' => 1,
'position' => 4,
'notnull' => 1,
'visible' => 1,
'default' =>
'0'),
102 'fk_object' => array(
'type' =>
'integer',
'label' =>
'object',
'enabled' => 1,
'position' => 5,
'notnull' => 1,
'visible' => 0,),
103 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'position' => 500,
'notnull' => 1,
'visible' => -2,),
104 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'position' => 501,
'notnull' => 0,
'visible' => -2,),
105 'fk_user_creat' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'position' => 510,
'notnull' => 1,
'visible' => -2,
'foreignkey' =>
'user.rowid',),
106 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'position' => 511,
'notnull' => -1,
'visible' => -2,),
107 'objecttype' => array(
'type' =>
'varchar(128)',
'label' =>
'objecttype',
'enabled' => 1,
'position' => 6,
'notnull' => 1,
'visible' => 0,),
113 public $fk_user_creat;
114 public $fk_user_modif;
163 global $conf, $langs;
167 $this->ismultientitymanaged = 0;
168 $this->isextrafieldmanaged = 0;
171 $this->fields[
'rowid'][
'visible'] = 0;
173 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
174 $this->fields[
'entity'][
'enabled'] = 0;
184 foreach ($this->fields as $key => $val) {
185 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
186 unset($this->fields[$key]);
191 if (is_object($langs)) {
192 foreach ($this->fields as $key => $val) {
193 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
194 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
195 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
213 $filter =
'(fk_object:=:'.((int) $this->fk_object).
") AND (objecttype:=:'".$this->db->escape($this->objecttype).
"') AND (fk_skill:=:".((int) $this->fk_skill).
")";
215 $alreadyLinked = $this->
fetchAll(
'ASC',
'rowid', 0, 0, $filter);
216 if (!empty($alreadyLinked)) {
217 $this->error = $langs->trans(
'ErrSkillAlreadyAdded');
223 return $resultcreate;
236 global $langs, $extrafields;
246 $result =
$object->fetchCommon($fromid);
247 if ($result > 0 && !empty(
$object->table_element_line)) {
259 if (!empty($fk_object) && $fk_object > 0) {
265 if (property_exists(
$object,
'ref')) {
266 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
268 if (property_exists(
$object,
'label')) {
269 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
271 if (property_exists(
$object,
'status')) {
272 $object->status = self::STATUS_DRAFT;
274 if (property_exists(
$object,
'date_creation')) {
277 if (property_exists(
$object,
'date_modification')) {
278 $object->date_modification =
null;
280 if (!empty($fk_object) && $fk_object > 0) {
281 if (property_exists(
$object,
'fk_object')) {
282 $object->fk_object = ($fk_object = 0 ? $this->fk_object : $fk_object);
287 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
288 $extrafields->fetch_name_optionals_label($this->table_element);
289 foreach (
$object->array_options as $key => $option) {
290 $shortkey = preg_replace(
'/options_/',
'', $key);
291 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
293 unset(
$object->array_options[$key]);
299 $object->context[
'createfromclone'] =
'createfromclone';
300 $result =
$object->createCommon($user);
315 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
322 unset(
$object->context[
'createfromclone']);
329 $this->db->rollback();
341 public function fetch($id, $ref =
null)
344 if ($result > 0 && !empty($this->table_element_line)) {
357 $this->lines = array();
375 $this->fk_skill = $currentSkill->fk_skill;
376 $this->rankorder = $currentSkill->rankorder;
377 $this->fk_object = $fk_user;
378 $this->date_creation =
dol_now();
379 $this->fk_user_creat = $user->id;
380 $this->fk_user_modif = $user->id;
381 $this->objecttype = self::SKILLRANK_TYPE_USER;
382 $result = $this->
create($user);
399 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
407 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
408 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
409 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
411 $sql .=
' WHERE 1 = 1';
418 $this->errors[] = $errormessage;
419 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
423 if (!empty($sortfield)) {
424 $sql .= $this->db->order($sortfield, $sortorder);
426 if (!empty($limit)) {
427 $sql .=
' '.$this->db->plimit($limit, $offset);
430 $resql = $this->db->query($sql);
432 $num = $this->db->num_rows($resql);
434 while ($i < ($limit ? min($limit, $num) : $num)) {
435 $obj = $this->db->fetch_object($resql);
437 $record =
new self($this->db);
438 $record->setVarsFromFetchObj($obj);
440 $records[$record->id] = $record;
444 $this->db->free($resql);
448 $this->errors[] =
'Error '.$this->db->lasterror();
449 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
474 public function delete(
User $user, $notrigger = 0)
491 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
508 global $conf, $langs;
510 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
515 if ($this->
status == self::STATUS_VALIDATED) {
516 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
533 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
538 $this->newref = $num;
542 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
543 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
544 $sql .=
" status = ".self::STATUS_VALIDATED;
545 if (!empty($this->fields[
'date_validation'])) {
546 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
548 if (!empty($this->fields[
'fk_user_valid'])) {
549 $sql .=
", fk_user_valid = ".((int) $user->id);
551 $sql .=
" WHERE rowid = ".((int) $this->
id);
553 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
554 $resql = $this->db->query($sql);
557 $this->error = $this->db->lasterror();
561 if (!$error && !$notrigger) {
563 $result = $this->
call_trigger(
'HRM_SKILLRANK_VALIDATE', $user);
572 $this->oldref = $this->ref;
575 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
577 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'skillrank/".$this->db->escape($this->newref).
"'";
578 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'skillrank/".$this->db->escape($this->
ref).
"' and entity = ".((int) $conf->entity);
579 $resql = $this->db->query($sql);
582 $this->error = $this->db->lasterror();
584 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'skillrank/".$this->db->escape($this->newref).
"'";
585 $sql .=
" WHERE filepath = 'skillrank/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
586 $resql = $this->db->query($sql);
589 $this->error = $this->db->lasterror();
595 $dirsource = $conf->hrm->dir_output.
'/skillrank/'.$oldref;
596 $dirdest = $conf->hrm->dir_output.
'/skillrank/'.$newref;
597 if (!$error && file_exists($dirsource)) {
598 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
600 if (@rename($dirsource, $dirdest)) {
603 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/skillrank/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
604 foreach ($listoffiles as $fileentry) {
605 $dirsource = $fileentry[
'name'];
606 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
607 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
608 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
609 @rename($dirsource, $dirdest);
619 $this->
status = self::STATUS_VALIDATED;
626 $this->db->rollback();
642 if ($this->
status <= self::STATUS_DRAFT) {
653 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'SKILLRANK_UNVALIDATE');
663 public function cancel($user, $notrigger = 0)
666 if ($this->
status != self::STATUS_VALIDATED) {
677 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'SKILLRANK_CANCEL');
687 public function reopen($user, $notrigger = 0)
690 if ($this->
status != self::STATUS_CANCELED) {
701 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'SKILLRANK_REOPEN');
714 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
716 global $conf, $langs, $hookmanager;
718 if (!empty($conf->dol_no_mouse_hover)) {
724 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"SkillRank").
'</u>';
725 if (isset($this->
status)) {
726 $label .=
' '.$this->getLibStatut(5);
729 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
731 $url =
dol_buildpath(
'/hrm/skillrank_card.php', 1).
'?id='.$this->id;
733 if ($option !=
'nolink') {
735 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
736 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
737 $add_save_lastsearch_values = 1;
739 if ($add_save_lastsearch_values) {
740 $url .=
'&save_lastsearch_values=1';
745 if (empty($notooltip)) {
747 $label = $langs->trans(
"ShowSkillRank");
748 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
750 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
751 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
753 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
756 if ($option ==
'nolink') {
757 $linkstart =
'<span';
759 $linkstart =
'<a href="'.$url.
'"';
761 $linkstart .= $linkclose.
'>';
762 if ($option ==
'nolink') {
763 $linkend =
'</span>';
768 $result .= $linkstart;
770 if (empty($this->showphoto_on_popup)) {
772 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
776 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
778 list($class, $module) = explode(
'@', $this->picto);
781 $filename = $filearray[0][
'name'];
782 if (!empty($filename)) {
783 $pospoint = strpos($filearray[0][
'name'],
'.');
785 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
787 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref"><img class="photo'.$module.
'" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div></div>';
789 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><img class="photouserphoto userphoto" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div>';
794 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
799 if ($withpicto != 2) {
800 $result .= $this->ref;
806 global $action, $hookmanager;
807 $hookmanager->initHooks(array(
'skillrankdao'));
808 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
809 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
811 $result = $hookmanager->resPrint;
813 $result .= $hookmanager->resPrint;
841 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
844 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
845 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
846 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
847 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
848 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
849 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
852 $statusType =
'status'.$status;
854 if ($status == self::STATUS_CANCELED) {
855 $statusType =
'status6';
858 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
869 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
870 $sql .=
' fk_user_creat, fk_user_modif';
871 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
872 $sql .=
' WHERE t.rowid = '.((int) $id);
873 $result = $this->db->query($sql);
875 if ($this->db->num_rows($result)) {
876 $obj = $this->db->fetch_object($result);
878 $this->
id = $obj->rowid;
880 $this->user_creation_id = $obj->fk_user_creat;
881 $this->user_modification_id = $obj->fk_user_modif;
882 $this->date_creation = $this->db->jdate($obj->datec);
883 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
886 $this->db->free($result);
914 $this->lines = array();
940 global $langs, $conf;
944 $conf->global->hrm_SKILLRANK_ADDON =
'mod_skillrank_standard';
954 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
955 foreach ($dirmodels as $reldir) {
959 $mybool = ((bool) @include_once $dir.$file) || $mybool;
962 if ($mybool ===
false) {
967 if (class_exists($classname)) {
968 $obj =
new $classname();
969 $numref = $obj->getNextValue($this);
971 if ($numref !=
'' && $numref !=
'-1') {
974 $this->error = $obj->error;
979 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
983 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
999 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1001 global $conf, $langs;
1004 $includedocgeneration = 0;
1006 $langs->load(
"hrm");
1009 $modele =
'standard_skillrank';
1011 if (!empty($this->model_pdf)) {
1012 $modele = $this->model_pdf;
1018 $modelpath =
"core/modules/hrm/doc/";
1020 if ($includedocgeneration && !empty($modele)) {
1021 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
reopen($user, $notrigger=0)
Set back to validated status.
__construct(DoliDB $db)
Constructor.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
LibStatut($status, $mode=0)
Return the status.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
setDraft($user, $notrigger=0)
Set draft status.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
fetchLines()
Load object lines in memory from the database.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
fetch($id, $ref=null)
Load object in memory from the database.
cloneFromCurrentSkill($currentSkill, $fk_user)
Clone skillrank Object linked to job with user id The skillrank table is a join table that is marked ...
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
createFromClone(User $user, $fromid, $fk_object=0)
Clone an object into another one.
create(User $user, $notrigger=0)
Create object into database.
update(User $user, $notrigger=0)
Update object into database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
info($id)
Load the info information in the object.
validate($user, $notrigger=0)
Validate object.
getLibStatut($mode=0)
Return the label of the status.
cancel($user, $notrigger=0)
Set cancel status.
getLinesArray()
Create an array of lines.
Class to manage Dolibarr users.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
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.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.