29 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
41 public $module =
'hrm';
46 public $element =
'skilldet';
51 public $table_element =
'hrm_skilldet';
57 public $ismultientitymanaged = 0;
62 public $isextrafieldmanaged = 1;
67 public $picto =
'skilldet@hrm';
70 const STATUS_DRAFT = 0;
71 const STATUS_VALIDATED = 1;
72 const STATUS_CANCELED = 9;
105 public $fields=array(
106 'rowid' => array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>
'1',
'position'=>1,
'notnull'=>1,
'visible'=>0,
'noteditable'=>
'1',
'index'=>1,
'css'=>
'left',
'comment'=>
"Id"),
107 'fk_skill' => array(
'type'=>
'integer:Skill:/hrm/class/skill.class.php',
'label'=>
'fk_skill',
'enabled'=>
'1',
'position'=>5,
'notnull'=>1,
'visible'=>0,),
108 'rankorder' => array(
'type'=>
'integer',
'label'=>
'rank',
'enabled'=>
'1',
'position'=>10,
'notnull'=>0,
'visible'=>2,),
109 'description' => array(
'type'=>
'text',
'label'=>
'Description',
'enabled'=>
'1',
'position'=>60,
'notnull'=>0,
'visible'=>1,),
110 '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',),
111 'fk_user_modif' => array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>
'1',
'position'=>511,
'notnull'=>-1,
'visible'=>0,),
117 public $fk_user_creat;
118 public $fk_user_modif;
165 global $conf, $langs;
169 if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields[
'rowid'])) {
170 $this->fields[
'rowid'][
'visible'] = 0;
172 if (!
isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
173 $this->fields[
'entity'][
'enabled'] = 0;
183 foreach ($this->fields as $key => $val) {
184 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
185 unset($this->fields[$key]);
190 if (is_object($langs)) {
191 foreach ($this->fields as $key => $val) {
192 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
193 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
194 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
214 return $resultcreate;
226 global $langs, $extrafields;
231 $object =
new self($this->db);
236 $result = $object->fetchCommon($fromid);
237 if ($result > 0 && !empty($object->table_element_line)) {
238 $object->fetchLines();
247 unset($object->fk_user_creat);
248 unset($object->import_key);
251 if (property_exists($object,
'ref')) {
252 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
254 if (property_exists($object,
'label')) {
255 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".$object->label : $this->fields[
'label'][
'default'];
257 if (property_exists($object,
'status')) {
258 $object->status = self::STATUS_DRAFT;
260 if (property_exists($object,
'date_creation')) {
261 $object->date_creation =
dol_now();
263 if (property_exists($object,
'date_modification')) {
264 $object->date_modification =
null;
268 if (is_array($object->array_options) && count($object->array_options) > 0) {
269 $extrafields->fetch_name_optionals_label($this->table_element);
270 foreach ($object->array_options as $key => $option) {
271 $shortkey = preg_replace(
'/options_/',
'', $key);
272 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
274 unset($object->array_options[$key]);
280 $object->context[
'createfromclone'] =
'createfromclone';
281 $result = $object->createCommon($user);
284 $this->error = $object->error;
285 $this->errors = $object->errors;
297 if (property_exists($this,
'fk_soc') && $this->fk_soc == $object->socid) {
304 unset($object->context[
'createfromclone']);
311 $this->
db->rollback();
323 public function fetch($id, $ref =
null)
326 if ($result > 0 && !empty($this->table_element_line)) {
339 $this->lines = array();
357 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, array $filter = array(), $filtermode =
'AND')
367 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
368 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
369 $sql .=
' WHERE t.entity IN ('.getEntity($this->table_element).
')';
371 $sql .=
' WHERE 1 = 1';
375 if (count($filter) > 0) {
376 foreach ($filter as $key => $value) {
377 if ($key ==
't.rowid') {
378 $sqlwhere[] = $key.
'='.$value;
379 } elseif ($key ==
'customsql') {
380 $sqlwhere[] = $value;
381 } elseif (in_array($this->fields[$key][
'type'], array(
'date',
'datetime',
'timestamp'))) {
382 $sqlwhere[] = $key.
" = '".$this->
db->idate($value).
"'";
383 } elseif (strpos($value,
'%') ===
false) {
384 $sqlwhere[] = $key.
" IN (".$this->
db->sanitize($this->
db->escape($value)).
")";
386 $sqlwhere[] = $key.
" LIKE '%".$this->
db->escape($value).
"%'";
390 if (count($sqlwhere) > 0) {
391 $sql .=
" AND (".implode(
" ".$filtermode.
" ", $sqlwhere).
")";
394 if (!empty($sortfield)) {
395 $sql .= $this->
db->order($sortfield, $sortorder);
397 if (!empty($limit)) {
398 $sql .=
" ".$this->db->plimit($limit, $offset);
405 while ($i < ($limit ? min($limit, $num) : $num)) {
406 $obj = $this->
db->fetch_object(
$resql);
408 $record =
new self($this->db);
409 $record->setVarsFromFetchObj($obj);
411 $records[$record->id] = $record;
419 $this->errors[] =
'Error '.$this->db->lasterror();
420 dol_syslog(__METHOD__.
' '.join(
',', $this->errors), LOG_ERR);
445 public function delete(
User $user, $notrigger =
false)
461 if ($this->status < 0) {
462 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
479 global $conf, $langs;
481 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
486 if ($this->status == self::STATUS_VALIDATED) {
487 dol_syslog(get_class($this).
"::validate action abandonned: already validated", LOG_WARNING);
504 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
509 $this->newref = $num;
513 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
514 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
515 $sql .=
" status = ".self::STATUS_VALIDATED;
516 if (!empty($this->fields[
'date_validation'])) {
517 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
519 if (!empty($this->fields[
'fk_user_valid'])) {
520 $sql .=
", fk_user_valid = ".((int) $user->id);
522 $sql .=
" WHERE rowid = ".((int) $this->
id);
524 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
528 $this->error = $this->
db->lasterror();
532 if (!$error && !$notrigger) {
534 $result = $this->
call_trigger(
'SKILLDET_VALIDATE', $user);
543 $this->oldref = $this->ref;
546 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
548 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->
db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'skilldet/".$this->
db->escape($this->newref).
"'";
549 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'skilldet/".$this->
db->escape($this->
ref).
"' and entity = ".$conf->entity;
552 $error++; $this->error = $this->
db->lasterror();
558 $dirsource = $conf->hrm->dir_output.
'/skilldet/'.$oldref;
559 $dirdest = $conf->hrm->dir_output.
'/skilldet/'.$newref;
560 if (!$error && file_exists($dirsource)) {
561 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
563 if (@rename($dirsource, $dirdest)) {
566 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/skilldet/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
567 foreach ($listoffiles as $fileentry) {
568 $dirsource = $fileentry[
'name'];
569 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
570 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
571 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
572 @rename($dirsource, $dirdest);
582 $this->status = self::STATUS_VALIDATED;
589 $this->
db->rollback();
605 if ($this->status <= self::STATUS_DRAFT) {
616 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'SKILLDET_UNVALIDATE');
626 public function cancel($user, $notrigger = 0)
629 if ($this->status != self::STATUS_VALIDATED) {
640 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'SKILLDET_CANCEL');
650 public function reopen($user, $notrigger = 0)
653 if ($this->status != self::STATUS_CANCELED) {
664 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'SKILLDET_REOPEN');
677 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
679 global $conf, $langs, $hookmanager;
681 if (!empty($conf->dol_no_mouse_hover)) {
687 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Skilldet").
'</u>';
688 if (isset($this->status)) {
689 $label .=
' '.$this->getLibStatut(5);
692 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
694 $url =
dol_buildpath(
'/hrm/skilldet_card.php', 1).
'?id='.$this->id;
696 if ($option !=
'nolink') {
698 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
699 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
700 $add_save_lastsearch_values = 1;
702 if ($add_save_lastsearch_values) {
703 $url .=
'&save_lastsearch_values=1';
708 if (empty($notooltip)) {
709 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
710 $label = $langs->trans(
"ShowSkilldet");
711 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
713 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
714 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
716 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
719 if ($option ==
'nolink') {
720 $linkstart =
'<span';
722 $linkstart =
'<a href="'.$url.
'"';
724 $linkstart .= $linkclose.
'>';
725 if ($option ==
'nolink') {
726 $linkend =
'</span>';
731 $result .= $linkstart;
733 if (empty($this->showphoto_on_popup)) {
735 $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);
739 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
741 list($class, $module) = explode(
'@', $this->picto);
744 $filename = $filearray[0][
'name'];
745 if (!empty($filename)) {
746 $pospoint = strpos($filearray[0][
'name'],
'.');
748 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
749 if (empty($conf->global->{strtoupper($module.
'_'.$class).
'_FORMATLISTPHOTOSASUSERS'})) {
750 $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>';
752 $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>';
757 $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);
762 if ($withpicto != 2) {
763 $result .= $this->ref;
769 global $action, $hookmanager;
770 $hookmanager->initHooks(array(
'skilldetdao'));
771 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
772 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
774 $result = $hookmanager->resPrint;
776 $result .= $hookmanager->resPrint;
790 return $this->LibStatut($this->status, $mode);
804 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
807 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
808 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
809 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
810 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
811 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
812 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
815 $statusType =
'status'.$status;
817 if ($status == self::STATUS_CANCELED) {
818 $statusType =
'status6';
821 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
832 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
833 $sql .=
' fk_user_creat, fk_user_modif';
834 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
835 $sql .=
' WHERE t.rowid = '.((int) $id);
836 $result = $this->
db->query($sql);
838 if ($this->
db->num_rows($result)) {
839 $obj = $this->
db->fetch_object($result);
840 $this->
id = $obj->rowid;
842 $this->user_creation_id = $obj->fk_user_creat;
843 $this->user_modification_id = $obj->fk_user_modif;
844 $this->date_creation = $this->
db->jdate($obj->datec);
845 $this->date_modification = empty($obj->datem) ?
'' : $this->
db->jdate($obj->datem);
848 $this->
db->free($result);
866 $this->initAsSpecimenCommon();
877 global $langs, $conf;
880 if (empty($conf->global->hrm_SKILLDET_ADDON)) {
881 $conf->global->hrm_SKILLDET_ADDON =
'mod_skilldet_standard';
884 if (!empty($conf->global->hrm_SKILLDET_ADDON)) {
887 $file = $conf->global->hrm_SKILLDET_ADDON.
".php";
888 $classname = $conf->global->hrm_SKILLDET_ADDON;
891 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
892 foreach ($dirmodels as $reldir) {
896 $mybool |= @include_once $dir.$file;
899 if ($mybool ===
false) {
904 if (class_exists($classname)) {
905 $obj =
new $classname();
906 $numref = $obj->getNextValue($this);
908 if ($numref !=
'' && $numref !=
'-1') {
911 $this->error = $obj->error;
916 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
920 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
936 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
938 global $conf, $langs;
941 $includedocgeneration = 0;
946 $modele =
'standard_skilldet';
948 if (!empty($this->model_pdf)) {
949 $modele = $this->model_pdf;
950 } elseif (!empty($conf->global->SKILLDET_ADDON_PDF)) {
951 $modele = $conf->global->SKILLDET_ADDON_PDF;
955 $modelpath =
"core/modules/hrm/doc/";
957 if ($includedocgeneration && !empty($modele)) {
958 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
973 global $conf, $langs;
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
getFieldList($alias='')
Function to concat keys of fields.
fetchCommon($id, $ref=null, $morewhere='')
Load object in memory from the database.
createCommon(User $user, $notrigger=false)
Create object into database.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
updateCommon(User $user, $notrigger=false)
Update object into database.
fetchLinesCommon($morewhere='')
Load object in memory from the database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
update(User $user, $notrigger=false)
Update object into database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
cancel($user, $notrigger=0)
Set cancel status.
getLibStatut($mode=0)
Return the label of the status.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionaly the picto)
LibStatut($status, $mode=0)
Return the status.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
fetchLines()
Load object lines in memory from the database.
create(User $user, $notrigger=false)
Create object into database.
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
__construct(DoliDB $db)
Constructor.
fetch($id, $ref=null)
Load object in memory from the database.
createFromClone(User $user, $fromid)
Clone an object into another one.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
validate($user, $notrigger=0)
Validate object.
info($id)
Load the info information in the object.
reopen($user, $notrigger=0)
Set back to validated status.
setDraft($user, $notrigger=0)
Set draft status.
Class to manage Dolibarr users.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
dol_dir_list($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.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
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.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$conf db
API class for accounts.