Newer
Older
/* Copyright (C) 2008-2014 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2010-2012 Regis Houssin <regis.houssin@capnetworks.com>
* Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* \file htdocs/projet/class/task.class.php
* \brief This file is a CRUD class file for Task (Create/Read/Update/Delete)
Marcos García de La Fuente
committed
require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
*/
class Task extends CommonObject
public $element='project_task'; //!< Id that identify managed objects
public $table_element='projet_task'; //!< Name of table without prefix where object is stored
var $fk_project;
var $fk_task_parent;
var $label;
var $description;
var $duration_effective; // total of time spent on this task
var $date_c;
var $date_start;
var $date_end;
var $progress;
var $priority;
var $fk_user_creat;
var $fk_user_valid;
var $statut;
var $note_private;
var $note_public;
var $timespent_id;
var $timespent_duration;
var $timespent_old_duration;
var $timespent_date;
var $timespent_datehour; // More accurate start date (same than timespent_date but includes hours, minutes and seconds)
var $timespent_withhour; // 1 = we entered also start hours for timesheet line
var $timespent_fk_user;
var $timespent_note;
* Create into database
*
* @param User $user User that create
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int <0 if KO, Id of created object if OK
*/
function create($user, $notrigger=0)
{
Laurent Destailleur
committed
// Clean parameters
$this->label = trim($this->label);
$this->description = trim($this->description);
// Check parameters
// Put here code to add control on parameters values
$sql = "INSERT INTO ".MAIN_DB_PREFIX."projet_task (";
$sql.= "fk_projet";
$sql.= ", fk_task_parent";
$sql.= ", label";
$sql.= ", description";
$sql.= ", datec";
$sql.= ", fk_user_creat";
$sql.= ", dateo";
$sql.= ", datee";
$sql.= ", planned_workload";
$sql.= ", ".(!empty($this->ref)?"'".$this->db->escape($this->ref)."'":'null');
$sql.= ", ".$this->fk_task_parent;
$sql.= ", '".$this->db->escape($this->label)."'";
$sql.= ", '".$this->db->escape($this->description)."'";
$sql.= ", '".$this->db->idate($this->date_c)."'";
$sql.= ", ".$user->id;
$sql.= ", ".($this->date_start!=''?"'".$this->db->idate($this->date_start)."'":'null');
$sql.= ", ".($this->date_end!=''?"'".$this->db->idate($this->date_end)."'":'null');
$sql.= ", ".($this->planned_workload!=''?$this->planned_workload:0);
$sql.= ", ".($this->progress!=''?$this->progress:0);
$sql.= ")";
$this->db->begin();
dol_syslog(get_class($this)."::create", LOG_DEBUG);
$resql=$this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
{
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."projet_task");
// Call trigger
$result=$this->call_trigger('TASK_CREATE',$user);
if ($result < 0) { $error++; }
// Update extrafield
if (! $error)
if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
{
$result=$this->insertExtraFields();
if ($result < 0)
{
$error++;
}
}
}
// Commit or rollback
if ($error)
{
foreach($this->errors as $errmsg)
{
dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
$this->error.=($this->error?', '.$errmsg:$errmsg);
}
$this->db->rollback();
return -1*$error;
}
else
{
$this->db->commit();
* Load object in memory from database
*
* @param int $id Id object
Laurent Destailleur
committed
$sql.= " t.fk_projet,";
$sql.= " t.fk_task_parent,";
$sql.= " t.label,";
$sql.= " t.description,";
$sql.= " t.duration_effective,";
$sql.= " t.planned_workload,";
$sql.= " t.dateo,";
$sql.= " t.datee,";
$sql.= " t.fk_user_creat,";
$sql.= " t.fk_user_valid,";
$sql.= " t.fk_statut,";
$sql.= " t.progress,";
$sql.= " t.priority,";
$sql.= " t.note_private,";
$sql.= " t.note_public,";
$sql.= " t.rang";
$sql.= " FROM ".MAIN_DB_PREFIX."projet_task as t";
$sql.= " WHERE ";
if (!empty($ref)) {
}else {
$sql.="t.rowid = ".$id;
}
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->fk_project = $obj->fk_projet;
$this->fk_task_parent = $obj->fk_task_parent;
$this->label = $obj->label;
$this->description = $obj->description;
$this->duration_effective = $obj->duration_effective;
$this->planned_workload = $obj->planned_workload;
$this->date_c = $this->db->jdate($obj->datec);
$this->date_start = $this->db->jdate($obj->dateo);
$this->date_end = $this->db->jdate($obj->datee);
$this->fk_user_creat = $obj->fk_user_creat;
$this->fk_user_valid = $obj->fk_user_valid;
$this->fk_statut = $obj->fk_statut;
$this->progress = $obj->progress;
$this->priority = $obj->priority;
$this->note_private = $obj->note_private;
$this->note_public = $obj->note_public;
Laurent Destailleur
committed
return 1;
}
else
{
$this->error="Error ".$this->db->lasterror();
* Update database
*
* @param User $user User that modify
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int <0 if KO, >0 if OK
function update($user=null, $notrigger=0)
// Clean parameters
if (isset($this->fk_project)) $this->fk_project=trim($this->fk_project);
if (isset($this->ref)) $this->ref=trim($this->ref);
if (isset($this->fk_task_parent)) $this->fk_task_parent=trim($this->fk_task_parent);
if (isset($this->label)) $this->label=trim($this->label);
if (isset($this->description)) $this->description=trim($this->description);
if (isset($this->duration_effective)) $this->duration_effective=trim($this->duration_effective);
if (isset($this->planned_workload)) $this->planned_workload=trim($this->planned_workload);
// Check parameters
// Put here code to add control on parameters values
// Update request
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task SET";
$sql.= " fk_projet=".(isset($this->fk_project)?$this->fk_project:"null").",";
$sql.= " ref=".(isset($this->ref)?"'".$this->db->escape($this->ref)."'":"'".$this->id."'").",";
$sql.= " fk_task_parent=".(isset($this->fk_task_parent)?$this->fk_task_parent:"null").",";
$sql.= " label=".(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").",";
$sql.= " description=".(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").",";
$sql.= " duration_effective=".(isset($this->duration_effective)?$this->duration_effective:"null").",";
$sql.= " planned_workload=".((isset($this->planned_workload) && $this->planned_workload != '')?$this->planned_workload:"null").",";
$sql.= " dateo=".($this->date_start!=''?"'".$this->db->idate($this->date_start)."'":'null').",";
$sql.= " datee=".($this->date_end!=''?"'".$this->db->idate($this->date_end)."'":'null').",";
$sql.= " progress=".$this->progress.",";
$sql.= " rang=".((!empty($this->rang))?$this->rang:"0");
$sql.= " WHERE rowid=".$this->id;
dol_syslog(get_class($this)."::update", LOG_DEBUG);
$resql = $this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
if (! $error)
{
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('TASK_MODIFY',$user);
if ($result < 0) { $error++; }
//Update extrafield
if (!$error) {
if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
{
$result=$this->insertExtraFields();
if ($result < 0)
{
$error++;
}
}
}
if ($error)
{
foreach($this->errors as $errmsg)
{
dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
$this->error.=($this->error?', '.$errmsg:$errmsg);
}
$this->db->rollback();
return -1*$error;
}
else
{
$this->db->commit();
return 1;
}
* Delete task from database
*
* @param User $user User that delete
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int <0 if KO, >0 if OK
*/
function delete($user, $notrigger=0)
{
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
$error=0;
$this->db->begin();
if ($this->hasChildren() > 0)
{
dol_syslog(get_class($this)."::delete Can't delete record as it has some child", LOG_WARNING);
$this->error='ErrorRecordHasChildren';
$this->db->rollback();
return 0;
}
if (! $error)
{
// Delete linked contacts
$res = $this->delete_linked_contact();
if ($res < 0)
{
$this->error='ErrorFailToDeleteLinkedContact';
//$error++;
$this->db->rollback();
return 0;
}
}
if (! $error)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."projet_task_time";
$sql.= " WHERE fk_task=".$this->id;
$resql = $this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
}
if (! $error)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."projet_task_extrafields";
$sql.= " WHERE fk_object=".$this->id;
$resql = $this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
}
if (! $error)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."projet_task";
$sql.= " WHERE rowid=".$this->id;
$resql = $this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
}
if (! $error)
{
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('TASK_DELETE',$user);
if ($result < 0) { $error++; }
if ($error)
{
foreach($this->errors as $errmsg)
{
dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
$this->error.=($this->error?', '.$errmsg:$errmsg);
}
$this->db->rollback();
return -1*$error;
}
else
{
//Delete associated link file
if ($conf->projet->dir_output)
{
$projectstatic=new Project($this->db);
$projectstatic->fetch($this->fk_project);
$dir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($projectstatic->ref) . '/' . dol_sanitizeFileName($this->id);
dol_syslog(get_class($this)."::delete dir=".$dir, LOG_DEBUG);
Marcos García de La Fuente
committed
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
$res = @dol_delete_dir_recursive($dir);
if (!$res)
{
$this->error = 'ErrorFailToDeleteDir';
$this->db->rollback();
return 0;
}
}
}
}
}
/**
* Return nb of children
*
* @return int <0 if KO, 0 if no children, >0 if OK
*/
function hasChildren()
{
$ret=0;
$sql = "SELECT COUNT(*) as nb";
$sql.= " FROM ".MAIN_DB_PREFIX."projet_task";
$sql.= " WHERE fk_task_parent=".$this->id;
dol_syslog(get_class($this)."::hasChildren", LOG_DEBUG);
$resql = $this->db->query($sql);
if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
else
{
$obj=$this->db->fetch_object($resql);
if ($obj) $ret=$obj->nb;
}
if (! $error)
{
return $ret;
}
else
{
return -1;
}
}
* Return clicable name (with picto eventually)
* @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
* @param string $option 'withproject' or ''
* @param string $mode Mode 'task', 'time', 'contact', 'note', document' define page to link to.
function getNomUrl($withpicto=0,$option='',$mode='task')
$label = '<u>' . $langs->trans("ShowTask") . '</u>';
if (! empty($this->ref))
$label .= '<br><b>' . $langs->trans('Ref') . ':</b> ' . $this->ref;
if (! empty($this->title))
$label .= '<br><b>' . $langs->trans('LabelTask') . ':</b> ' . $this->label;
if ($this->date_start || $this->date_end)
{
$label .= "<br>".get_date_range($this->date_start,$this->date_end,'',$langs,0);
}
$linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">';
$link = '<a href="'.DOL_URL_ROOT.'/projet/tasks/'.$mode.'.php?id='.$this->id.($option=='withproject'?'&withproject=1':'').$linkclose;
$linkend='</a>';
if ($withpicto) $result.=($link.img_object($label, $picto, 'class="classfortooltip"').$linkend);
if ($withpicto && $withpicto != 2) $result.=' ';
if ($withpicto != 2) $result.=$link.$this->ref.$linkend;
* Initialise an instance with random values.
* Used to build previews or test instances.
* id must be 0 if object instance is a specimen.
*
*/
function initAsSpecimen()
{
$this->id=0;
$this->fk_projet='';
$this->fk_task_parent='';
$this->title='';
$this->duration_effective='';
$this->fk_user_creat='';
$this->statut='';
$this->note='';
}
/**
* Return list of tasks for all projects or for one particular project
* Sort order is on project, then on position of task, and last on start date of first level task
* @param User $usert Object user to limit tasks affected to a particular user
* @param User $userp Object user to limit projects of a particular user and public projects
* @param int $projectid Project id
* @param int $socid Third party id
* @param int $mode 0=Return list of tasks and their projects, 1=Return projects and tasks if exists
* @param string $filteronprojref Filter on project ref
* @param string $filteronprojstatus Filter on project status
* @return array Array of tasks
function getTasksArray($usert=0, $userp=0, $projectid=0, $socid=0, $mode=0, $filteronprojref='', $filteronprojstatus=-1)
{
global $conf;
$tasks = array();
//print $usert.'-'.$userp.'-'.$projectid.'-'.$socid.'-'.$mode.'<br>';
// List of tasks (does not care about permissions. Filtering will be done later)
$sql = "SELECT p.rowid as projectid, p.ref, p.title as plabel, p.public, p.fk_statut,";
$sql.= " t.rowid as taskid, t.label, t.description, t.fk_task_parent, t.duration_effective, t.progress,";
$sql.= " t.dateo as date_start, t.datee as date_end, t.planned_workload, t.ref as ref_task,t.rang";
if ($mode == 0)
{
$sql.= " FROM ".MAIN_DB_PREFIX."projet as p";
$sql.= ", ".MAIN_DB_PREFIX."projet_task as t";
$sql.= " WHERE t.fk_projet = p.rowid";
$sql.= " AND p.entity = ".$conf->entity;
if ($socid) $sql.= " AND p.fk_soc = ".$socid;
if ($projectid) $sql.= " AND p.rowid in (".$projectid.")";
}
if ($mode == 1)
{
$sql.= " FROM ".MAIN_DB_PREFIX."projet as p";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid";
$sql.= " WHERE p.entity = ".$conf->entity;
if ($socid) $sql.= " AND p.fk_soc = ".$socid;
if ($projectid) $sql.= " AND p.rowid in (".$projectid.")";
}
if ($filteronprojref) $sql.= " AND p.ref LIKE '%".$filteronprojref."%'";
if ($filteronprojstatus > -1) $sql.= " AND p.fk_statut = ".$filteronprojstatus;
$sql.= " ORDER BY p.ref, t.rang, t.dateo";
dol_syslog(get_class($this)."::getTasksArray", LOG_DEBUG);
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
$resql = $this->db->query($sql);
if ($resql)
{
$num = $this->db->num_rows($resql);
$i = 0;
// Loop on each record found, so each couple (project id, task id)
while ($i < $num)
{
$error=0;
$obj = $this->db->fetch_object($resql);
if ((! $obj->public) && (is_object($userp))) // If not public project and we ask a filter on project owned by a user
{
if (! $this->getUserRolesForProjectsOrTasks($userp, 0, $obj->projectid, 0))
{
$error++;
}
}
if (is_object($usert)) // If we ask a filter on a user affected to a task
{
if (! $this->getUserRolesForProjectsOrTasks(0, $usert, $obj->projectid, $obj->taskid))
{
$error++;
}
}
if (! $error)
{
$tasks[$i] = new Task($this->db);
$tasks[$i]->id = $obj->taskid;
$tasks[$i]->ref = $obj->ref_task;
$tasks[$i]->fk_project = $obj->projectid;
$tasks[$i]->projectref = $obj->ref;
$tasks[$i]->projectlabel = $obj->plabel;
$tasks[$i]->projectstatus = $obj->fk_statut;
$tasks[$i]->label = $obj->label;
$tasks[$i]->description = $obj->description;
$tasks[$i]->fk_parent = $obj->fk_task_parent;
$tasks[$i]->duration = $obj->duration_effective;
$tasks[$i]->planned_workload= $obj->planned_workload;
$tasks[$i]->progress = $obj->progress;
$tasks[$i]->public = $obj->public;
$tasks[$i]->date_start = $this->db->jdate($obj->date_start);
$tasks[$i]->date_end = $this->db->jdate($obj->date_end);
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
}
$i++;
}
$this->db->free($resql);
}
else
{
dol_print_error($this->db);
}
return $tasks;
}
/**
* Return list of roles for a user for each projects or each tasks (or a particular project or task).
*
* @param User $userp Return roles on project for this internal user (task id can't be defined)
* @param User $usert Return roles on task for this internal user
* @param int $projectid Project id list separated with , to filter on project
* @param int $taskid Task id to filter on a task
* @return array Array (projectid => 'list of roles for project' or taskid => 'list of roles for task')
*/
function getUserRolesForProjectsOrTasks($userp,$usert,$projectid='',$taskid=0)
{
$arrayroles = array();
dol_syslog(get_class($this)."::getUserRolesForProjectsOrTasks userp=".is_object($userp)." usert=".is_object($usert)." projectid=".$projectid." taskid=".$taskid);
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
// We want role of user for a projet or role of user for a task. Both are not possible.
if (empty($userp) && empty($usert))
{
$this->error="CallWithWrongParameters";
return -1;
}
if (! empty($userp) && ! empty($usert))
{
$this->error="CallWithWrongParameters";
return -1;
}
/* Liste des taches et role sur les projets ou taches */
$sql = "SELECT pt.rowid as pid, ec.element_id, ctc.code, ctc.source";
if ($userp) $sql.= " FROM ".MAIN_DB_PREFIX."projet as pt";
if ($usert) $sql.= " FROM ".MAIN_DB_PREFIX."projet_task as pt";
$sql.= ", ".MAIN_DB_PREFIX."element_contact as ec";
$sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc";
$sql.= " WHERE pt.rowid = ec.element_id";
if ($userp) $sql.= " AND ctc.element = 'project'";
if ($usert) $sql.= " AND ctc.element = 'project_task'";
$sql.= " AND ctc.rowid = ec.fk_c_type_contact";
if ($userp) $sql.= " AND ec.fk_socpeople = ".$userp->id;
if ($usert) $sql.= " AND ec.fk_socpeople = ".$usert->id;
$sql.= " AND ec.statut = 4";
$sql.= " AND ctc.source = 'internal'";
if ($projectid)
{
if ($userp) $sql.= " AND pt.rowid in (".$projectid.")";
if ($usert) $sql.= " AND pt.fk_projet in (".$projectid.")";
}
if ($taskid)
{
if ($userp) $sql.= " ERROR SHOULD NOT HAPPENS";
if ($usert) $sql.= " AND pt.rowid = ".$taskid;
}
//print $sql;
dol_syslog(get_class($this)."::getUserRolesForProjectsOrTasks", LOG_DEBUG);
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
$resql = $this->db->query($sql);
if ($resql)
{
$num = $this->db->num_rows($resql);
$i = 0;
while ($i < $num)
{
$obj = $this->db->fetch_object($resql);
if (empty($arrayroles[$obj->pid])) $arrayroles[$obj->pid] = $obj->code;
else $arrayroles[$obj->pid].=','.$obj->code;
$i++;
}
$this->db->free($resql);
}
else
{
dol_print_error($this->db);
}
return $arrayroles;
}
/**
* Return list of id of contacts of task
*
* @param string $source Source
* @return array Array of id of contacts
*/
function getListContactId($source='internal')
{
$contactAlreadySelected = array();
$tab = $this->liste_contact(-1,$source);
//var_dump($tab);
$num=count($tab);
$i = 0;
while ($i < $num)
{
if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
else $contactAlreadySelected[$i] = $tab[$i]['id'];
$i++;
}
return $contactAlreadySelected;
}
/**
* Add time spent
*
* @param User $user User object
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return void
*/
function addTimeSpent($user, $notrigger=0)
{
global $conf,$langs;
dol_syslog(get_class($this)."::addTimeSpent", LOG_DEBUG);
// Check parameters
if (! is_object($user))
{
dol_print_error('',"Method addTimeSpent was called with wrong parameter user");
return -1;
}
// Clean parameters
if (isset($this->timespent_note)) $this->timespent_note = trim($this->timespent_note);
if (empty($this->timespent_datehour)) $this->timespent_datehour = $this->timespent_date;
$sql = "INSERT INTO ".MAIN_DB_PREFIX."projet_task_time (";
$sql.= "fk_task";
$sql.= ", task_date";
$sql.= ", task_datehour";
$sql.= ", task_date_withhour";
$sql.= ", task_duration";
$sql.= ", fk_user";
$sql.= ", note";
$sql.= ") VALUES (";
$sql.= $this->id;
$sql.= ", '".$this->db->idate($this->timespent_date)."'";
$sql.= ", '".$this->db->idate($this->timespent_datehour)."'";
$sql.= ", ".(empty($this->timespent_withhour)?0:1);
$sql.= ", ".$this->timespent_duration;
$sql.= ", ".$this->timespent_fk_user;
$sql.= ", ".(isset($this->timespent_note)?"'".$this->db->escape($this->timespent_note)."'":"null");
$sql.= ")";
$resql=$this->db->query($sql);
if ($resql)
Maxime Kohlhaas
committed
$tasktime_id = $this->db->last_insert_id(MAIN_DB_PREFIX."projet_task_time");
// Call trigger
$result=$this->call_trigger('TASK_TIMESPENT_CREATE',$user);
if ($result < 0) { $ret=-1; }
$this->error=$this->db->lasterror();
$ret = -1;
}
if ($ret >= 0)
{
// Recalculate amount of time spent for task and update denormalized field
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task";
$sql.= " SET duration_effective = (SELECT SUM(task_duration) FROM ".MAIN_DB_PREFIX."projet_task_time as ptt where ptt.fk_task = ".$this->id.")";
if (isset($this->progress)) $sql.= ", progress = " . $this->progress; // Do not overwrite value if not provided
dol_syslog(get_class($this)."::addTimeSpent", LOG_DEBUG);
Maxime Kohlhaas
committed
if (! $this->db->query($sql) )
{
$this->error=$this->db->lasterror();
$ret = -2;
}
Maxime Kohlhaas
committed
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task_time";
$sql.= " SET thm = (SELECT thm FROM ".MAIN_DB_PREFIX."user WHERE rowid = ".$this->timespent_fk_user.")"; // set average hour rate of user
Maxime Kohlhaas
committed
$sql.= " WHERE rowid = ".$tasktime_id;
dol_syslog(get_class($this)."::addTimeSpent", LOG_DEBUG);
if (! $this->db->query($sql) )
{
$this->error=$this->db->lasterror();
$ret = -2;
}
}
if ($ret >=0)
{
$this->db->commit();
}
else
{
$this->db->rollback();
}
/**
* Calculate total of time spent for task
*
* @param int $id Id of object (here task)
* @return array Array of info for task array('min_date', 'max_date', 'total_duration')
*/
function getSummaryOfTimeSpent($id='')
{
global $langs;
if (empty($id)) $id=$this->id;
$result=array();
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
$sql = "SELECT";
$sql.= " MIN(t.task_datehour) as min_date,";
$sql.= " MAX(t.task_datehour) as max_date,";
$sql.= " SUM(t.task_duration) as total_duration";
$sql.= " FROM ".MAIN_DB_PREFIX."projet_task_time as t";
$sql.= " WHERE t.fk_task = ".$id;
dol_syslog(get_class($this)."::getSummaryOfTimeSpent", LOG_DEBUG);
$resql=$this->db->query($sql);
if ($resql)
{
$obj = $this->db->fetch_object($resql);
$result['min_date'] = $obj->min_date;
$result['max_date'] = $obj->max_date;
$result['total_duration'] = $obj->total_duration;
$this->db->free($resql);
return $result;
}
else
{
dol_print_error($this->db);
return $result;
}
}
/**
* Load object in memory from database
*
* @param int $id Id object
* @return int <0 if KO, >0 if OK
*/
function fetchTimeSpent($id)
{
$sql.= " t.rowid,";
$sql.= " t.fk_task,";
$sql.= " t.task_date,";
$sql.= " t.task_datehour,";
$sql.= " t.task_date_withhour,";
$sql.= " t.task_duration,";
$sql.= " t.fk_user,";
$sql.= " t.note";
$sql.= " FROM ".MAIN_DB_PREFIX."projet_task_time as t";
$sql.= " WHERE t.rowid = ".$id;
dol_syslog(get_class($this)."::fetchTimeSpent", LOG_DEBUG);
$resql=$this->db->query($sql);
if ($resql)
{
if ($this->db->num_rows($resql))
{
$obj = $this->db->fetch_object($resql);
$this->timespent_id = $obj->rowid;
$this->timespent_date = $this->db->jdate($obj->task_date);
$this->timespent_datehour = $this->db->jdate($obj->task_datehour);
$this->timespent_withhour = $obj->task_date_withhour;
$this->timespent_duration = $obj->task_duration;
$this->timespent_fk_user = $obj->fk_user;
}
$this->db->free($resql);
return 1;
}
else
{
$this->error="Error ".$this->db->lasterror();
/**
* Update time spent
*
* @param User $user User id
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int <0 if KO, >0 if OK
*/
function updateTimeSpent($user, $notrigger=0)
{
if (empty($this->timespent_datehour)) $this->timespent_datehour = $this->timespent_date;
if (isset($this->timespent_note)) $this->timespent_note = trim($this->timespent_note);
$sql = "UPDATE ".MAIN_DB_PREFIX."projet_task_time SET";
$sql.= " task_date = '".$this->db->idate($this->timespent_date)."',";
$sql.= " task_datehour = '".$this->db->idate($this->timespent_datehour)."',";
$sql.= " task_date_withhour = ".(empty($this->timespent_withhour)?0:1);
$sql.= " task_duration = ".$this->timespent_duration.",";
$sql.= " fk_user = ".$this->timespent_fk_user.",";
$sql.= " note = ".(isset($this->timespent_note)?"'".$this->db->escape($this->timespent_note)."'":"null");
$sql.= " WHERE rowid = ".$this->timespent_id;
dol_syslog(get_class($this)."::updateTimeSpent", LOG_DEBUG);
if ($this->db->query($sql) )
{
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('TASK_TIMESPENT_MODIFY',$user);
if ($result < 0)
{
$this->db->rollback();
$ret = -1;
else $ret = 1;