From 0c0a64f532acab66844e23dda75647d08d647386 Mon Sep 17 00:00:00 2001 From: Florian Henry Date: Thu, 18 Jul 2013 10:24:45 +0200 Subject: [PATCH] [ task #924 ] Add numbering rule on task [ task #925 ] Add ODT document generation for Tasks in project module --- htdocs/core/class/html.formfile.class.php | 9 ++++ htdocs/core/lib/project.lib.php | 4 +- htdocs/core/modules/modProjet.class.php | 10 ++-- htdocs/install/etape1.php | 2 +- .../install/mysql/migration/3.4.0-3.5.0.sql | 8 ++++ .../install/mysql/tables/llx_projet_task.sql | 7 +-- htdocs/langs/en_US/admin.lang | 2 + htdocs/langs/fr_FR/admin.lang | 2 + htdocs/projet/admin/project.php | 5 ++ htdocs/projet/class/task.class.php | 48 +++++++++++++++---- htdocs/projet/tasks.php | 20 +++++++- htdocs/projet/tasks/task.php | 21 ++++---- 12 files changed, 110 insertions(+), 28 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 9290c9873bf..78bf317d3a9 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -309,6 +309,15 @@ class FormFile $modellist=ModelePDFProjects::liste_modeles($this->db); } } + elseif ($modulepart == 'project_task') + { + if (is_array($genallowed)) $modellist=$genallowed; + else + { + include_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php'; + $modellist=ModelePDFTask::liste_modeles($this->db); + } + } elseif ($modulepart == 'export') { if (is_array($genallowed)) $modellist=$genallowed; diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index e5ea867d0a7..52978d65349 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -281,12 +281,12 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t print ''; if ($showlineingray) { - print ''.img_object('','projecttask').' '.$lines[$i]->id.''; + print ''.img_object('','projecttask').' '.$lines[$i]->ref.''; } else { $taskstatic->id=$lines[$i]->id; - $taskstatic->ref=$lines[$i]->id; + $taskstatic->ref=$lines[$i]->ref; $taskstatic->label=($taskrole[$lines[$i]->id]?$langs->trans("YourRole").': '.$taskrole[$lines[$i]->id]:''); print $taskstatic->getNomUrl(1,($showproject?'':'withproject')); } diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 1cc0d091778..7b9ec52aef6 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -76,14 +76,14 @@ class modProjet extends DolibarrModules $this->const[$r][0] = "PROJECT_ADDON_PDF"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "baleine"; - $this->const[$r][3] = 'Nom du gestionnaire de generation des projets en PDF'; + $this->const[$r][3] = 'Name of PDF/ODT project manager class'; $this->const[$r][4] = 0; $r++; $this->const[$r][0] = "PROJECT_ADDON"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "mod_project_simple"; - $this->const[$r][3] = 'Nom du gestionnaire de numerotation des projets'; + $this->const[$r][3] = 'Name of Numbering Rule project manager class'; $this->const[$r][4] = 0; $r++; @@ -96,15 +96,15 @@ class modProjet extends DolibarrModules $this->const[$r][0] = "PROJECT_TASK_ADDON_PDF"; $this->const[$r][1] = "chaine"; - $this->const[$r][2] = "baleine"; - $this->const[$r][3] = 'Nom du gestionnaire de generation des task en PDF'; + $this->const[$r][2] = ""; + $this->const[$r][3] = 'Name of PDF/ODT tasks manager class'; $this->const[$r][4] = 0; $r++; $this->const[$r][0] = "PROJECT_TASK_ADDON"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = "mod_task_simple"; - $this->const[$r][3] = 'Nom du gestionnaire de numerotation des taches'; + $this->const[$r][3] = 'Name of Numbering Rule task manager class'; $this->const[$r][4] = 0; $r++; diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php index 36b26fd7953..f1aba6f52c2 100644 --- a/htdocs/install/etape1.php +++ b/htdocs/install/etape1.php @@ -402,7 +402,7 @@ if (! $error && $db->connected && $action == "set") require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $srcroot=$main_dir.'/install/doctemplates'; $destroot=$main_data_dir.'/doctemplates'; - $docs=array('thirdparties' => 'thirdparty', 'proposals' => 'proposal', 'orders' => 'order', 'invoices' => 'invoice', 'projects' => 'project', 'projects' => 'task_summary'); + $docs=array('thirdparties' => 'thirdparty', 'proposals' => 'proposal', 'orders' => 'order', 'invoices' => 'invoice', 'projects' => 'project', 'projects' => 'task_summary', 'tasks' => 'task_summary'); foreach($docs as $cursordir => $cursorfile) { $src=$srcroot.'/'.$cursordir.'/template_'.$cursorfile.'.odt'; diff --git a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql index e55f063ab15..7e1f4086dd7 100755 --- a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql +++ b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql @@ -90,4 +90,12 @@ ALTER TABLE llx_categorie_contact ADD INDEX idx_categorie_contact_fk_socpeople ( ALTER TABLE llx_categorie_contact ADD CONSTRAINT fk_categorie_contact_categorie_rowid FOREIGN KEY (fk_categorie) REFERENCES llx_categorie (rowid); ALTER TABLE llx_categorie_contact ADD CONSTRAINT fk_categorie_contact_fk_socpeople FOREIGN KEY (fk_socpeople) REFERENCES llx_socpeople (rowid); +insert into llx_const (name, value, type, note, visible, entity) values ('PROJECT_TASK_ADDON_PDF','','chaine','Name of PDF/ODT tasks manager class',0,1); +insert into llx_const (name, value, type, note, visible, entity) values ('PROJECT_TASK_ADDON','mod_task_simple','chaine','Name of Numbering Rule task manager class',0,1); +insert into llx_const (name, value, type, note, visible, entity) values ('PROJECT_TASK_ADDON_PDF_ODT_PATH','DOL_DATA_ROOT/doctemplates/tasks','chaine','',0,1); + +ALTER TABLE llx_projet_task ADD COLUMN ref varchar(50) AFTER rowid; +UPDATE llx_projet_task SET ref=rowid; +ALTER TABLE llx_projet_task ADD COLUMN model_pdf varchar(255); + diff --git a/htdocs/install/mysql/tables/llx_projet_task.sql b/htdocs/install/mysql/tables/llx_projet_task.sql index 1fc7325bea0..0c91a86b1a8 100644 --- a/htdocs/install/mysql/tables/llx_projet_task.sql +++ b/htdocs/install/mysql/tables/llx_projet_task.sql @@ -29,8 +29,8 @@ create table llx_projet_task datev datetime, -- date validation label varchar(255) NOT NULL, description text, - duration_effective real DEFAULT 0 NOT NULL, - planned_workload real DEFAULT 0 NOT NULL, + duration_effective real DEFAULT 0 NOT NULL, + planned_workload real DEFAULT 0 NOT NULL, progress integer DEFAULT 0, -- percentage increase priority integer DEFAULT 0, -- priority fk_user_creat integer, -- user who created the task @@ -38,5 +38,6 @@ create table llx_projet_task fk_statut smallint DEFAULT 0 NOT NULL, note_private text, note_public text, - rang integer DEFAULT 0 + rang integer DEFAULT 0, + model_pdf varchar(255) )ENGINE=innodb; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 80f2d76557b..34f04575546 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1454,6 +1454,8 @@ TestGeoIPResult=Test of a conversion IP -> country ProjectsNumberingModules=Projects numbering module ProjectsSetup=Project module setup ProjectsModelModule=Project reports document model +TasksNumberingModules=Tasks numbering module +TaskModelModule=Tasks reports document model ##### ECM (GED) ##### ECMSetup = GED Setup ECMAutoTree = Automatic tree folder and document diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index a057e02944c..1f4be3a3722 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1454,6 +1454,8 @@ TestGeoIPResult=Test de conversion IP -> Pays ProjectsNumberingModules=Modèles de numérotation des références projets ProjectsSetup=Configuration du module Projets ProjectsModelModule=Modèles de document de rapport projets +TasksNumberingModules==Modèles de numérotation des références taches +TaskModelModule=Modèles de document de rapport taches ##### ECM (GED) ##### ECMSetup = Configuration du module GED ECMAutoTree = L'arborescence automatique est disponible diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php index c0cc144861c..136e5124ca5 100644 --- a/htdocs/projet/admin/project.php +++ b/htdocs/projet/admin/project.php @@ -182,6 +182,11 @@ else if ($action == 'set') { $ret = addDocumentModel($value, $type, $label, $scandir); } +// Activate a model for task +else if ($action == 'settask') +{ + $ret = addDocumentModel($value,'project_task', $label, $scandir); +} else if ($action == 'del') { diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 94f6137c49b..d7c332aba16 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -36,6 +36,8 @@ class Task extends CommonObject var $id; + var $ref; + var $fk_project; var $fk_task_parent; var $label; @@ -52,6 +54,7 @@ class Task extends CommonObject var $statut; var $note_private; var $note_public; + var $rang; var $timespent_id; var $timespent_duration; @@ -95,6 +98,7 @@ class Task extends CommonObject // Insert request $sql = "INSERT INTO ".MAIN_DB_PREFIX."projet_task ("; $sql.= "fk_projet"; + $sql.= ", ref"; $sql.= ", fk_task_parent"; $sql.= ", label"; $sql.= ", description"; @@ -106,6 +110,7 @@ class Task extends CommonObject $sql.= ", progress"; $sql.= ") VALUES ("; $sql.= $this->fk_project; + $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)."'"; @@ -173,14 +178,16 @@ class Task extends CommonObject * Load object in memory from database * * @param int $id Id object + * @param int $ref ref object * @return int <0 if KO, >0 if OK */ - function fetch($id) + function fetch($id,$ref='') { global $langs; $sql = "SELECT"; $sql.= " t.rowid,"; + $sql.= " t.ref,"; $sql.= " t.fk_projet,"; $sql.= " t.fk_task_parent,"; $sql.= " t.label,"; @@ -196,9 +203,15 @@ class Task extends CommonObject $sql.= " t.progress,"; $sql.= " t.priority,"; $sql.= " t.note_private,"; - $sql.= " t.note_public"; + $sql.= " t.note_public,"; + $sql.= " t.rang"; $sql.= " FROM ".MAIN_DB_PREFIX."projet_task as t"; - $sql.= " WHERE t.rowid = ".$id; + $sql.= " WHERE "; + if (!empty($ref)) { + $sql.="t.ref = '".$ref."'"; + }else { + $sql.="t.rowid = ".$id; + } dol_syslog(get_class($this)."::fetch sql=".$sql, LOG_DEBUG); $resql=$this->db->query($sql); @@ -209,7 +222,7 @@ class Task extends CommonObject $obj = $this->db->fetch_object($resql); $this->id = $obj->rowid; - $this->ref = $obj->rowid; + $this->ref = $obj->ref; $this->fk_project = $obj->fk_projet; $this->fk_task_parent = $obj->fk_task_parent; $this->label = $obj->label; @@ -226,6 +239,7 @@ class Task extends CommonObject $this->priority = $obj->priority; $this->note_private = $obj->note_private; $this->note_public = $obj->note_public; + $this->rang = $obj->rang; } $this->db->free($resql); @@ -255,6 +269,7 @@ class Task extends CommonObject // 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); @@ -267,6 +282,7 @@ class Task extends CommonObject // 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").","; @@ -274,7 +290,8 @@ class Task extends CommonObject $sql.= " planned_workload=".(isset($this->planned_workload)?$this->planned_workload:"0").","; $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.= " progress=".$this->progress.","; + $sql.= " rang=".((!empty($this->rang))?$this->rang:"0"); $sql.= " WHERE rowid=".$this->id; $this->db->begin(); @@ -500,6 +517,7 @@ class Task extends CommonObject $this->id=0; $this->fk_projet=''; + $this->ref=''; $this->fk_task_parent=''; $this->title=''; $this->duration_effective=''; @@ -531,7 +549,7 @@ class Task extends CommonObject // 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,"; $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"; + $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"; @@ -583,9 +601,9 @@ class Task extends CommonObject if (! $error) { - $tasks[$i] = new stdClass(); + $tasks[$i] = new Task($db); $tasks[$i]->id = $obj->taskid; - $tasks[$i]->ref = $obj->taskid; + $tasks[$i]->ref = $obj->ref_task; $tasks[$i]->fk_project = $obj->projectid; $tasks[$i]->projectref = $obj->ref; $tasks[$i]->projectlabel = $obj->plabel; @@ -598,6 +616,7 @@ class Task extends CommonObject $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); + $tasks[$i]->rang = $obj->rang; } $i++; @@ -993,19 +1012,32 @@ class Task extends CommonObject $datec = $now; $clone_task=new Task($this->db); + $origin_task=new Task($this->db); $this->db->begin(); // Load source object $clone_task->fetch($fromid); + $origin_task->fetch($fromid); + + $defaultref=''; + $obj = empty($conf->global->PROJECT_TASK_ADDON)?'mod_task_simple':$conf->global->PROJECT_TASK_ADDON; + if (! empty($conf->global->PROJECT_TASK_ADDON) && is_readable(DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.".php")) + { + require_once DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.'.php'; + $modTask = new $obj; + $defaultref = $modTask->getNextValue(0,$clone_task); + } $ori_project_id = $clone_task->fk_project; $clone_task->id = 0; + $clone_task->ref = $defaultref; $clone_task->fk_project = $project_id; $clone_task->fk_task_parent = $parent_task_id; $clone_task->date_c = $datec; $clone_task->planned_workload = $clone_task->planned_workload; + $clone_task->rang = $origin_task->rang; //Manage Task Date if ($clone_change_dt) diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 152c604048e..fc29a748dbe 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -114,6 +114,7 @@ if ($action == 'createtask' && $user->rights->projet->creer) $task = new Task($db); $task->fk_project = $projectid; + $task->ref = GETPOST('ref','alpha'); $task->label = $label; $task->description = $description; $task->planned_workload = $planned_workload * 3600;//We set the planned workload into seconds @@ -170,6 +171,7 @@ if ($action == 'createtask' && $user->rights->projet->creer) $form=new Form($db); $formother=new FormOther($db); +$taskstatic = new Task($db); $userstatic=new User($db); $help_url="EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos"; @@ -266,11 +268,27 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->socie print ''; print ''; print ''; + if (! empty($object->id)) print ''; if (! empty($mode)) print ''; print ''; + $defaultref=''; + $obj = empty($conf->global->PROJECT_TASK_ADDON)?'mod_task_simple':$conf->global->PROJECT_TASK_ADDON; + if (! empty($conf->global->PROJECT_TASK_ADDON) && is_readable(DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.".php")) + { + require_once DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.'.php'; + $modTask = new $obj; + $defaultref = $modTask->getNextValue($soc,$object); + } + + if (is_numeric($defaultref) && $defaultref <= 0) $defaultref=''; + + // Ref + print ''; + print ''; + print ''; @@ -394,7 +412,7 @@ else print '
'.$langs->trans("Ref").''.($_POST["ref"]?$_POST["ref"]:$defaultref).'
'.$langs->trans("Label").''; print ''; print '
'; print ''; // print ''; - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index bb5995ce67c..f95d93d98be 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -23,6 +23,10 @@ * \brief Page of a project task */ +error_reporting(E_ALL); +ini_set('display_errors', true); +ini_set('html_errors', false); + require ("../../main.inc.php"); require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php'; @@ -30,6 +34,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php'; $langs->load("projects"); $langs->load("companies"); @@ -41,8 +47,6 @@ $confirm=GETPOST('confirm','alpha'); $withproject=GETPOST('withproject','int'); $project_ref=GETPOST('project_ref','alpha'); $planned_workload=GETPOST('planned_workloadhour'); -$taskid = GETPOST("id",'int'); -$taskref = GETPOST("ref",'int'); // Security check $socid=0; @@ -73,7 +77,7 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer) } if (! $error) { - $object->fetch($id); + $object->fetch($id,$ref); $tmparray=explode('_',$_POST['task_parent']); $task_parent=$tmparray[1]; @@ -100,7 +104,7 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer) if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->projet->supprimer) { - if ($object->fetch($id) >= 0 ) + if ($object->fetch($id,$ref) >= 0 ) { $result=$projectstatic->fetch($object->fk_projet); if (! empty($projectstatic->socid)) @@ -142,7 +146,7 @@ if (! empty($project_ref) && ! empty($withproject)) // Build doc if ($action == 'builddoc' && $user->rights->projet->creer) { - if ($object->fetch($id) >= 0 ) + if ($object->fetch($id,$ref) >= 0 ) { if (GETPOST('model')) { @@ -174,7 +178,7 @@ if ($action == 'remove_file' && $user->rights->projet->creer) { require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - if ($object->fetch($id) >= 0 ) + if ($object->fetch($id,$ref) >= 0 ) { $langs->load("other"); $upload_dir = $conf->projet->dir_output; @@ -199,7 +203,7 @@ $formfile = new FormFile($db); if ($id > 0 || ! empty($ref)) { - if ($object->fetch($id) > 0) + if ($object->fetch($id,$ref) > 0) { $res=$object->fetch_optionals($object->id,$extralabels); @@ -397,7 +401,7 @@ if ($id > 0 || ! empty($ref)) $object->next_prev_filter=" fk_projet in (".$projectsListId.")"; } else $object->next_prev_filter=" fk_projet = ".$projectstatic->id; - print $form->showrefnav($object,'id',$linkback,1,'rowid','ref','',$param); + print $form->showrefnav($object,'ref',$linkback,1,'ref','ref','',$param); print ''; print ''; @@ -502,6 +506,7 @@ if ($id > 0 || ! empty($ref)) $var=true; $somethingshown=$formfile->show_documents('project_task',$filename,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf); + print '
'.$langs->trans("Project").''.$langs->trans("RefTask").''.$langs->trans("RefTask").''.$langs->trans("LabelTask").''.$langs->trans("DateStart").''.$langs->trans("DateEnd").'
';