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 $date_creation;
114 public $fk_user_creat;
115 public $fk_user_modif;
164 global $conf, $langs;
168 $this->ismultientitymanaged = 0;
169 $this->isextrafieldmanaged = 0;
172 $this->fields[
'rowid'][
'visible'] = 0;
174 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
175 $this->fields[
'entity'][
'enabled'] = 0;
185 foreach ($this->fields as $key => $val) {
186 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
187 unset($this->fields[$key]);
192 if (is_object($langs)) {
193 foreach ($this->fields as $key => $val) {
194 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
195 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
196 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
214 $filter =
'(fk_object:=:'.((int) $this->fk_object).
") AND (objecttype:=:'".$this->db->escape($this->objecttype).
"') AND (fk_skill:=:".((int) $this->fk_skill).
")";
216 $alreadyLinked = $this->
fetchAll(
'ASC',
'rowid', 0, 0, $filter);
217 if (!empty($alreadyLinked)) {
218 $this->error = $langs->trans(
'ErrSkillAlreadyAdded');
224 return $resultcreate;
237 global $langs, $extrafields;
247 $result =
$object->fetchCommon($fromid);
248 if ($result > 0 && !empty(
$object->table_element_line)) {
260 if (!empty($fk_object) && $fk_object > 0) {
266 if (property_exists(
$object,
'ref')) {
267 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
269 if (property_exists(
$object,
'label')) {
270 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
272 if (property_exists(
$object,
'status')) {
273 $object->status = self::STATUS_DRAFT;
275 if (property_exists(
$object,
'date_creation')) {
278 if (property_exists(
$object,
'date_modification')) {
279 $object->date_modification =
null;
281 if (!empty($fk_object) && $fk_object > 0) {
282 if (property_exists(
$object,
'fk_object')) {
283 $object->fk_object = ($fk_object = 0 ? $this->fk_object : $fk_object);
288 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
289 $extrafields->fetch_name_optionals_label($this->table_element);
290 foreach (
$object->array_options as $key => $option) {
291 $shortkey = preg_replace(
'/options_/',
'', $key);
292 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
294 unset(
$object->array_options[$key]);
300 $object->context[
'createfromclone'] =
'createfromclone';
301 $result =
$object->createCommon($user);
316 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
323 unset(
$object->context[
'createfromclone']);
330 $this->db->rollback();
342 public function fetch($id, $ref =
null)
345 if ($result > 0 && !empty($this->table_element_line)) {
358 $this->lines = array();
376 $this->fk_skill = $currentSkill->fk_skill;
377 $this->rankorder = $currentSkill->rankorder;
378 $this->fk_object = $fk_user;
379 $this->date_creation =
dol_now();
380 $this->fk_user_creat = $user->id;
381 $this->fk_user_modif = $user->id;
382 $this->objecttype = self::SKILLRANK_TYPE_USER;
383 $result = $this->
create($user);
400 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
408 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
409 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
410 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
412 $sql .=
' WHERE 1 = 1';
419 $this->errors[] = $errormessage;
420 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
424 if (!empty($sortfield)) {
425 $sql .= $this->db->order($sortfield, $sortorder);
427 if (!empty($limit)) {
428 $sql .=
' '.$this->db->plimit($limit, $offset);
431 $resql = $this->db->query($sql);
433 $num = $this->db->num_rows($resql);
435 while ($i < ($limit ? min($limit, $num) : $num)) {
436 $obj = $this->db->fetch_object($resql);
438 $record =
new self($this->db);
439 $record->setVarsFromFetchObj($obj);
441 $records[$record->id] = $record;
445 $this->db->free($resql);
449 $this->errors[] =
'Error '.$this->db->lasterror();
450 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
475 public function delete(
User $user, $notrigger = 0)
492 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
509 global $conf, $langs;
511 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
516 if ($this->
status == self::STATUS_VALIDATED) {
517 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
534 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
539 $this->newref = $num;
543 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
544 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
545 $sql .=
" status = ".self::STATUS_VALIDATED;
546 if (!empty($this->fields[
'date_validation'])) {
547 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
549 if (!empty($this->fields[
'fk_user_valid'])) {
550 $sql .=
", fk_user_valid = ".((int) $user->id);
552 $sql .=
" WHERE rowid = ".((int) $this->
id);
554 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
555 $resql = $this->db->query($sql);
558 $this->error = $this->db->lasterror();
562 if (!$error && !$notrigger) {
564 $result = $this->
call_trigger(
'HRM_SKILLRANK_VALIDATE', $user);
573 $this->oldref = $this->ref;
576 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
578 $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).
"'";
579 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'skillrank/".$this->db->escape($this->
ref).
"' and entity = ".((int) $conf->entity);
580 $resql = $this->db->query($sql);
583 $this->error = $this->db->lasterror();
585 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'skillrank/".$this->db->escape($this->newref).
"'";
586 $sql .=
" WHERE filepath = 'skillrank/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
587 $resql = $this->db->query($sql);
590 $this->error = $this->db->lasterror();
596 $dirsource = $conf->hrm->dir_output.
'/skillrank/'.$oldref;
597 $dirdest = $conf->hrm->dir_output.
'/skillrank/'.$newref;
598 if (!$error && file_exists($dirsource)) {
599 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
601 if (@rename($dirsource, $dirdest)) {
604 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/skillrank/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
605 foreach ($listoffiles as $fileentry) {
606 $dirsource = $fileentry[
'name'];
607 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
608 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
609 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
610 @rename($dirsource, $dirdest);
620 $this->
status = self::STATUS_VALIDATED;
627 $this->db->rollback();
643 if ($this->
status <= self::STATUS_DRAFT) {
654 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'SKILLRANK_UNVALIDATE');
664 public function cancel($user, $notrigger = 0)
667 if ($this->
status != self::STATUS_VALIDATED) {
678 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'SKILLRANK_CANCEL');
688 public function reopen($user, $notrigger = 0)
691 if ($this->
status != self::STATUS_CANCELED) {
702 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'SKILLRANK_REOPEN');
715 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
717 global $conf, $langs, $hookmanager;
719 if (!empty($conf->dol_no_mouse_hover)) {
725 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"SkillRank").
'</u>';
726 if (isset($this->
status)) {
727 $label .=
' '.$this->getLibStatut(5);
730 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
732 $url =
dol_buildpath(
'/hrm/skillrank_card.php', 1).
'?id='.$this->id;
734 if ($option !=
'nolink') {
736 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
737 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
738 $add_save_lastsearch_values = 1;
740 if ($add_save_lastsearch_values) {
741 $url .=
'&save_lastsearch_values=1';
746 if (empty($notooltip)) {
748 $label = $langs->trans(
"ShowSkillRank");
749 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
751 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
752 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
754 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
757 if ($option ==
'nolink') {
758 $linkstart =
'<span';
760 $linkstart =
'<a href="'.$url.
'"';
762 $linkstart .= $linkclose.
'>';
763 if ($option ==
'nolink') {
764 $linkend =
'</span>';
769 $result .= $linkstart;
771 if (empty($this->showphoto_on_popup)) {
773 $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);
777 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
779 list($class, $module) = explode(
'@', $this->picto);
782 $filename = $filearray[0][
'name'];
783 if (!empty($filename)) {
784 $pospoint = strpos($filearray[0][
'name'],
'.');
786 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
788 $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>';
790 $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>';
795 $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);
800 if ($withpicto != 2) {
801 $result .= $this->ref;
807 global $action, $hookmanager;
808 $hookmanager->initHooks(array(
'skillrankdao'));
809 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
810 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
812 $result = $hookmanager->resPrint;
814 $result .= $hookmanager->resPrint;
842 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
845 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
846 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
847 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
848 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
849 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
850 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
853 $statusType =
'status'.$status;
855 if ($status == self::STATUS_CANCELED) {
856 $statusType =
'status6';
859 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
870 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
871 $sql .=
' fk_user_creat, fk_user_modif';
872 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
873 $sql .=
' WHERE t.rowid = '.((int) $id);
874 $result = $this->db->query($sql);
876 if ($this->db->num_rows($result)) {
877 $obj = $this->db->fetch_object($result);
879 $this->
id = $obj->rowid;
881 $this->user_creation_id = $obj->fk_user_creat;
882 $this->user_modification_id = $obj->fk_user_modif;
883 $this->date_creation = $this->db->jdate($obj->datec);
884 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
887 $this->db->free($result);
915 $this->lines = array();
941 global $langs, $conf;
945 $conf->global->hrm_SKILLRANK_ADDON =
'mod_skillrank_standard';
955 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
956 foreach ($dirmodels as $reldir) {
960 $mybool = ((bool) @include_once $dir.$file) || $mybool;
963 if ($mybool ===
false) {
968 if (class_exists($classname)) {
969 $obj =
new $classname();
970 $numref = $obj->getNextValue($this);
972 if ($numref !=
'' && $numref !=
'-1') {
975 $this->error = $obj->error;
980 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
984 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
1000 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1002 global $conf, $langs;
1005 $includedocgeneration = 0;
1007 $langs->load(
"hrm");
1010 $modele =
'standard_skillrank';
1012 if (!empty($this->model_pdf)) {
1013 $modele = $this->model_pdf;
1019 $modelpath =
"core/modules/hrm/doc/";
1021 if ($includedocgeneration && !empty($modele)) {
1022 $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.