dolibarr  19.0.0-dev
task.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2006-2017 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2010-2012 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 require "../../main.inc.php";
28 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
29 require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php';
36 
37 // Load translation files required by the page
38 $langs->loadlangs(array('projects', 'companies'));
39 
40 $action = GETPOST('action', 'aZ09');
41 $confirm = GETPOST('confirm', 'alpha');
42 
43 $id = GETPOST('id', 'int');
44 $ref = GETPOST("ref", 'alpha', 1); // task ref
45 $taskref = GETPOST("taskref", 'alpha'); // task ref
46 $withproject = GETPOST('withproject', 'int');
47 $project_ref = GETPOST('project_ref', 'alpha');
48 $planned_workload = ((GETPOST('planned_workloadhour', 'int') != '' || GETPOST('planned_workloadmin', 'int') != '') ? (GETPOST('planned_workloadhour', 'int') > 0 ?GETPOST('planned_workloadhour', 'int') * 3600 : 0) + (GETPOST('planned_workloadmin', 'int') > 0 ?GETPOST('planned_workloadmin', 'int') * 60 : 0) : '');
49 $mode = GETPOST('mode', 'alpha');
50 
51 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
52 $hookmanager->initHooks(array('projecttaskcard', 'globalcard'));
53 
54 $object = new Task($db);
55 $extrafields = new ExtraFields($db);
56 $projectstatic = new Project($db);
57 
58 // fetch optionals attributes and labels
59 $extrafields->fetch_name_optionals_label($object->table_element);
60 
61 $parameters = array('id'=>$id);
62 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
63 if ($reshook < 0) {
64  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
65 }
66 
67 if ($id > 0 || $ref) {
68  $object->fetch($id, $ref);
69 }
70 
71 // Security check
72 $socid = 0;
73 
74 restrictedArea($user, 'projet', $object->fk_project, 'projet&project');
75 
76 
77 
78 /*
79  * Actions
80  */
81 
82 if ($action == 'update' && !GETPOST("cancel") && $user->rights->projet->creer) {
83  $error = 0;
84 
85  if (empty($taskref)) {
86  $error++;
87  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref")), null, 'errors');
88  }
89  if (!GETPOST("label")) {
90  $error++;
91  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
92  }
93  if (!$error) {
94  $object->oldcopy = clone $object;
95 
96  $tmparray = explode('_', GETPOST('task_parent'));
97  $task_parent = $tmparray[1];
98  if (empty($task_parent)) {
99  $task_parent = 0; // If task_parent is ''
100  }
101 
102  $object->ref = $taskref ? $taskref : GETPOST("ref", 'alpha', 2);
103  $object->label = GETPOST("label", "alphanohtml");
104  if (empty($conf->global->FCKEDITOR_ENABLE_SOCIETE)) {
105  $object->description = GETPOST('description', "alphanohtml");
106  } else {
107  $object->description = GETPOST('description', "restricthtml");
108  }
109  $object->fk_task_parent = $task_parent;
110  $object->planned_workload = $planned_workload;
111  $object->date_start = dol_mktime(GETPOST('dateohour', 'int'), GETPOST('dateomin', 'int'), 0, GETPOST('dateomonth', 'int'), GETPOST('dateoday', 'int'), GETPOST('dateoyear', 'int'));
112  $object->date_end = dol_mktime(GETPOST('dateehour', 'int'), GETPOST('dateemin', 'int'), 0, GETPOST('dateemonth', 'int'), GETPOST('dateeday', 'int'), GETPOST('dateeyear', 'int'));
113  $object->progress = price2num(GETPOST('progress', 'alphanohtml'));
114  $object->budget_amount = price2num(GETPOST('budget_amount', 'alphanohtml'));
115 
116  // Fill array 'array_options' with data from add form
117  $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
118  if ($ret < 0) {
119  $error++;
120  }
121 
122  if (!$error) {
123  $result = $object->update($user);
124  if ($result < 0) {
125  setEventMessages($object->error, $object->errors, 'errors');
126  $action = 'edit';
127  }
128  } else {
129  $action = 'edit';
130  }
131  } else {
132  $action = 'edit';
133  }
134 }
135 
136 if ($action == 'confirm_clone' && $confirm == 'yes') {
137  //$clone_contacts = GETPOST('clone_contacts') ? 1 : 0;
138  $clone_prog = GETPOST('clone_prog') ? 1 : 0;
139  $clone_time = GETPOST('clone_time') ? 1 : 0;
140  $clone_affectation = GETPOST('clone_affectation') ? 1 : 0;
141  $clone_change_dt = GETPOST('clone_change_dt') ? 1 : 0;
142  $clone_notes = GETPOST('clone_notes') ? 1 : 0;
143  $clone_file = GETPOST('clone_file') ? 1 : 0;
144  $result = $object->createFromClone($user, $object->id, $object->fk_project, $object->fk_task_parent, $clone_change_dt, $clone_affectation, $clone_time, $clone_file, $clone_notes, $clone_prog);
145  if ($result <= 0) {
146  setEventMessages($object->error, $object->errors, 'errors');
147  } else {
148  // Load new object
149  $newobject = new Task($db);
150  $newobject->fetch($result);
151  $newobject->fetch_optionals();
152  $newobject->fetch_thirdparty(); // Load new object
153  $object = $newobject;
154  $action = '';
155  }
156 }
157 
158 if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->projet->supprimer) {
159  $result = $projectstatic->fetch($object->fk_project);
160  $projectstatic->fetch_thirdparty();
161 
162  if ($object->delete($user) > 0) {
163  header('Location: '.DOL_URL_ROOT.'/projet/tasks.php?restore_lastsearch_values=1&id='.$projectstatic->id.($withproject ? '&withproject=1' : ''));
164  exit;
165  } else {
166  setEventMessages($object->error, $object->errors, 'errors');
167  $action = '';
168  }
169 }
170 
171 // Retrieve First Task ID of Project if withprojet is on to allow project prev next to work
172 if (!empty($project_ref) && !empty($withproject)) {
173  if ($projectstatic->fetch('', $project_ref) > 0) {
174  $tasksarray = $object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
175  if (count($tasksarray) > 0) {
176  $id = $tasksarray[0]->id;
177  } else {
178  header("Location: ".DOL_URL_ROOT.'/projet/tasks.php?id='.$projectstatic->id.(empty($mode) ? '' : '&mode='.$mode));
179  }
180  }
181 }
182 
183 // Build doc
184 if ($action == 'builddoc' && $user->rights->projet->creer) {
185  // Save last template used to generate document
186  if (GETPOST('model')) {
187  $object->setDocModel($user, GETPOST('model', 'alpha'));
188  }
189 
190  $outputlangs = $langs;
191  if (GETPOST('lang_id', 'aZ09')) {
192  $outputlangs = new Translate("", $conf);
193  $outputlangs->setDefaultLang(GETPOST('lang_id', 'aZ09'));
194  }
195  $result = $object->generateDocument($object->model_pdf, $outputlangs);
196  if ($result <= 0) {
197  setEventMessages($object->error, $object->errors, 'errors');
198  $action = '';
199  }
200 }
201 
202 // Delete file in doc form
203 if ($action == 'remove_file' && $user->rights->projet->creer) {
204  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
205 
206  $langs->load("other");
207  $upload_dir = $conf->project->dir_output;
208  $file = $upload_dir.'/'.dol_sanitizeFileName(GETPOST('file'));
209 
210  $ret = dol_delete_file($file);
211  if ($ret) {
212  setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs');
213  } else {
214  setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors');
215  }
216 }
217 
218 
219 /*
220  * View
221  */
222 $form = new Form($db);
223 $formother = new FormOther($db);
224 $formfile = new FormFile($db);
225 $result = $projectstatic->fetch($object->fk_project);
226 
227 $title = $object->ref;
228 if (!empty($withproject)) {
229  $title .= ' | ' . $langs->trans("Project") . (!empty($projectstatic->ref) ? ': '.$projectstatic->ref : '') ;
230 }
231 $help_url = '';
232 
233 llxHeader('', $title, $help_url);
234 
235 
236 if ($id > 0 || !empty($ref)) {
237  $res = $object->fetch_optionals();
238  if (!empty($conf->global->PROJECT_ALLOW_COMMENT_ON_TASK) && method_exists($object, 'fetchComments') && empty($object->comments)) {
239  $object->fetchComments();
240  }
241 
242 
243  if (!empty($conf->global->PROJECT_ALLOW_COMMENT_ON_PROJECT) && method_exists($projectstatic, 'fetchComments') && empty($projectstatic->comments)) {
244  $projectstatic->fetchComments();
245  }
246  if (!empty($projectstatic->socid)) {
247  $projectstatic->fetch_thirdparty();
248  }
249 
250  $object->project = clone $projectstatic;
251 
252  //$userWrite = $projectstatic->restrictedProjectArea($user, 'write');
253 
254  if (!empty($withproject)) {
255  // Tabs for project
256  $tab = 'tasks';
257  $head = project_prepare_head($projectstatic);
258  print dol_get_fiche_head($head, $tab, $langs->trans("Project"), -1, ($projectstatic->public ? 'projectpub' : 'project'), 0, '', '');
259 
260  $param = ($mode == 'mine' ? '&mode=mine' : '');
261 
262  // Project card
263 
264  $linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
265 
266  $morehtmlref = '<div class="refidno">';
267  // Title
268  $morehtmlref .= $projectstatic->title;
269  // Thirdparty
270  if (!empty($projectstatic->thirdparty->id) &&$projectstatic->thirdparty->id > 0) {
271  $morehtmlref .= '<br>'.$projectstatic->thirdparty->getNomUrl(1, 'project');
272  }
273  $morehtmlref .= '</div>';
274 
275  // Define a complementary filter for search of next/prev ref.
276  if (empty($user->rights->projet->all->lire)) {
277  $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
278  $projectstatic->next_prev_filter = " rowid IN (".$db->sanitize(count($objectsListId) ?join(',', array_keys($objectsListId)) : '0').")";
279  }
280 
281  dol_banner_tab($projectstatic, 'project_ref', $linkback, 1, 'ref', 'ref', $morehtmlref, $param);
282 
283  print '<div class="fichecenter">';
284  print '<div class="fichehalfleft">';
285  print '<div class="underbanner clearboth"></div>';
286 
287  print '<table class="border tableforfield centpercent">';
288 
289  // Usage
290  if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES) || empty($conf->global->PROJECT_HIDE_TASKS) || isModEnabled('eventorganization')) {
291  print '<tr><td class="tdtop">';
292  print $langs->trans("Usage");
293  print '</td>';
294  print '<td>';
295  if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) {
296  print '<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_opportunity ? ' checked="checked"' : '')).'"> ';
297  $htmltext = $langs->trans("ProjectFollowOpportunity");
298  print $form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext);
299  print '<br>';
300  }
301  if (empty($conf->global->PROJECT_HIDE_TASKS)) {
302  print '<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_task ? ' checked="checked"' : '')).'"> ';
303  $htmltext = $langs->trans("ProjectFollowTasks");
304  print $form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext);
305  print '<br>';
306  }
307  if (empty($conf->global->PROJECT_HIDE_TASKS) && !empty($conf->global->PROJECT_BILL_TIME_SPENT)) {
308  print '<input type="checkbox" disabled name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_bill_time ? ' checked="checked"' : '')).'"> ';
309  $htmltext = $langs->trans("ProjectBillTimeDescription");
310  print $form->textwithpicto($langs->trans("BillTime"), $htmltext);
311  print '<br>';
312  }
313  if (isModEnabled('eventorganization')) {
314  print '<input type="checkbox" disabled name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_organize_event ? ' checked="checked"' : '')).'"> ';
315  $htmltext = $langs->trans("EventOrganizationDescriptionLong");
316  print $form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext);
317  }
318  print '</td></tr>';
319  }
320 
321  // Visibility
322  print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
323  if ($projectstatic->public) {
324  print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
325  print $langs->trans('SharedProject');
326  } else {
327  print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
328  print $langs->trans('PrivateProject');
329  }
330  print '</td></tr>';
331 
332  // Budget
333  print '<tr><td>'.$langs->trans("Budget").'</td><td>';
334  if (strcmp($projectstatic->budget_amount, '')) {
335  print '<span class="amount">'.price($projectstatic->budget_amount, '', $langs, 1, 0, 0, $conf->currency).'</span>';
336  }
337  print '</td></tr>';
338 
339  // Date start - end project
340  print '<tr><td>'.$langs->trans("Dates").'</td><td>';
341  $start = dol_print_date($projectstatic->date_start, 'day');
342  print ($start ? $start : '?');
343  $end = dol_print_date($projectstatic->date_end, 'day');
344  print ' - ';
345  print ($end ? $end : '?');
346  if ($projectstatic->hasDelay()) {
347  print img_warning("Late");
348  }
349  print '</td></tr>';
350 
351  // Other attributes
352  $cols = 2;
353  //include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
354 
355  print '</table>';
356 
357  print '</div>';
358 
359  print '<div class="fichehalfright">';
360  print '<div class="underbanner clearboth"></div>';
361 
362  print '<table class="border tableforfield centpercent">';
363 
364  // Description
365  print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
366  print nl2br($projectstatic->description);
367  print '</td></tr>';
368 
369  // Categories
370  if (isModEnabled('categorie')) {
371  print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
372  print $form->showCategories($projectstatic->id, 'project', 1);
373  print "</td></tr>";
374  }
375 
376  print '</table>';
377 
378  print '</div>';
379  print '</div>';
380 
381  print '<div class="clearboth"></div>';
382 
383  print dol_get_fiche_end();
384 
385  print '<br>';
386  }
387 
388  /*
389  * Actions
390  */
391  /*print '<div class="tabsAction">';
392 
393  if ($user->rights->projet->all->creer || $user->rights->projet->creer)
394  {
395  if ($projectstatic->public || $userWrite > 0)
396  {
397  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=create'.$param.'">'.$langs->trans('AddTask').'</a>';
398  }
399  else
400  {
401  print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotOwnerOfProject").'">'.$langs->trans('AddTask').'</a>';
402  }
403  }
404  else
405  {
406  print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('AddTask').'</a>';
407  }
408 
409  print '</div>';
410  */
411 
412  // To verify role of users
413  //$userAccess = $projectstatic->restrictedProjectArea($user); // We allow task affected to user even if a not allowed project
414  //$arrayofuseridoftask=$object->getListContactId('internal');
415 
416  if ($action == 'clone') {
417  $formquestion = array(
418  'text' => $langs->trans("ConfirmClone"),
419  //array('type' => 'checkbox', 'name' => 'clone_contacts', 'label' => $langs->trans("CloneContacts"), 'value' => true),
420  array('type' => 'checkbox', 'name' => 'clone_change_dt', 'label' => $langs->trans("CloneChanges"), 'value' => true),
421  array('type' => 'checkbox', 'name' => 'clone_affectation', 'label' => $langs->trans("CloneAffectation"), 'value' => true),
422  array('type' => 'checkbox', 'name' => 'clone_prog', 'label' => $langs->trans("CloneProgression"), 'value' => true),
423  array('type' => 'checkbox', 'name' => 'clone_time', 'label' => $langs->trans("CloneTimes"), 'value' => true),
424  array('type' => 'checkbox', 'name' => 'clone_file', 'label' => $langs->trans("CloneFile"), 'value' => true),
425 
426  );
427 
428  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ToClone"), $langs->trans("ConfirmCloneTask"), "confirm_clone", $formquestion, '', 1, 300, 590);
429  }
430 
431 
432  $head = task_prepare_head($object);
433 
434  if ($action == 'edit' && $user->rights->projet->creer) {
435  print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
436  print '<input type="hidden" name="token" value="'.newToken().'">';
437  print '<input type="hidden" name="action" value="update">';
438  print '<input type="hidden" name="withproject" value="'.$withproject.'">';
439  print '<input type="hidden" name="id" value="'.$object->id.'">';
440 
441  print dol_get_fiche_head($head, 'task_task', $langs->trans("Task"), 0, 'projecttask', 0, '', '');
442 
443  print '<table class="border centpercent">';
444 
445  // Ref
446  print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Ref").'</td>';
447  print '<td><input class="minwidth100" name="taskref" value="'.$object->ref.'"></td></tr>';
448 
449  // Label
450  print '<tr><td class="fieldrequired">'.$langs->trans("Label").'</td>';
451  print '<td><input class="minwidth500" name="label" value="'.$object->label.'"></td></tr>';
452 
453  // Project
454  if (empty($withproject)) {
455  print '<tr><td>'.$langs->trans("Project").'</td><td colspan="3">';
456  print $projectstatic->getNomUrl(1);
457  print '</td></tr>';
458 
459  // Third party
460  print '<td>'.$langs->trans("ThirdParty").'</td><td colspan="3">';
461  if ($projectstatic->thirdparty->id) {
462  print $projectstatic->thirdparty->getNomUrl(1);
463  } else {
464  print '&nbsp;';
465  }
466  print '</td></tr>';
467  }
468 
469  // Task parent
470  print '<tr><td>'.$langs->trans("ChildOfProjectTask").'</td><td>';
471  $formother->selectProjectTasks($object->fk_task_parent, $projectstatic->id, 'task_parent', ($user->admin ? 0 : 1), 0, 0, 0, $object->id);
472  print '</td></tr>';
473 
474  // Date start
475  print '<tr><td>'.$langs->trans("DateStart").'</td><td>';
476  print $form->selectDate($object->date_start, 'dateo', 1, 1, 0, '', 1, 0);
477  print '</td></tr>';
478 
479  // Date end
480  print '<tr><td>'.$langs->trans("Deadline").'</td><td>';
481  print $form->selectDate($object->date_end ? $object->date_end : -1, 'datee', 1, 1, 0, '', 1, 0);
482  print '</td></tr>';
483 
484  // Planned workload
485  print '<tr><td>'.$langs->trans("PlannedWorkload").'</td><td>';
486  print $form->select_duration('planned_workload', $object->planned_workload, 0, 'text');
487  print '</td></tr>';
488 
489  // Progress declared
490  print '<tr><td>'.$langs->trans("ProgressDeclared").'</td><td>';
491  print $formother->select_percent($object->progress, 'progress', 0, 5, 0, 100, 1);
492  print '</td></tr>';
493 
494  // Description
495  print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
496  print '<td>';
497 
498  // WYSIWYG editor
499  include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
500  $cked_enabled = (!empty($conf->global->FCKEDITOR_ENABLE_SOCIETE) ? $conf->global->FCKEDITOR_ENABLE_SOCIETE : 0);
501  $nbrows = getDolGlobalInt('MAIN_INPUT_DESC_HEIGHT', 0);
502  $doleditor = new DolEditor('description', $object->description, '', 80, 'dolibarr_details', '', false, true, $cked_enabled, $nbrows);
503  print $doleditor->Create();
504  print '</td></tr>';
505 
506  print '<tr><td>'.$langs->trans("Budget").'</td>';
507  print '<td><input size="5" type="text" name="budget_amount" value="'.dol_escape_htmltag(GETPOSTISSET('budget_amount') ? GETPOST('budget_amount') : price2num($object->budget_amount)).'"></td>';
508  print '</tr>';
509 
510  // Other options
511  $parameters = array();
512  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
513  print $hookmanager->resPrint;
514  if (empty($reshook)) {
515  print $object->showOptionals($extrafields, 'edit');
516  }
517 
518  print '</table>';
519 
520  print dol_get_fiche_end();
521 
522  print $form->buttonsSaveCancel("Modify");
523 
524  print '</form>';
525  } else {
526  /*
527  * Fiche tache en mode visu
528  */
529  $param = ($withproject ? '&withproject=1' : '');
530  $linkback = $withproject ? '<a href="'.DOL_URL_ROOT.'/projet/tasks.php?id='.$projectstatic->id.'&restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>' : '';
531 
532  print dol_get_fiche_head($head, 'task_task', $langs->trans("Task"), -1, 'projecttask', 0, '', 'reposition');
533 
534  if ($action == 'delete') {
535  print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".GETPOST("id", 'int').'&withproject='.$withproject, $langs->trans("DeleteATask"), $langs->trans("ConfirmDeleteATask"), "confirm_delete");
536  }
537 
538  if (!GETPOST('withproject') || empty($projectstatic->id)) {
539  $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
540  $object->next_prev_filter = " fk_projet IN (".$db->sanitize($projectsListId).")";
541  } else {
542  $object->next_prev_filter = " fk_projet = ".((int) $projectstatic->id);
543  }
544 
545  $morehtmlref = '';
546 
547  // Project
548  if (empty($withproject)) {
549  $morehtmlref .= '<div class="refidno">';
550  $morehtmlref .= $langs->trans("Project").': ';
551  $morehtmlref .= $projectstatic->getNomUrl(1);
552  $morehtmlref .= '<br>';
553 
554  // Third party
555  $morehtmlref .= $langs->trans("ThirdParty").': ';
556  if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
557  $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
558  }
559  $morehtmlref .= '</div>';
560  }
561 
562  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, $param);
563 
564  print '<div class="fichecenter">';
565  print '<div class="fichehalfleft">';
566 
567  print '<div class="underbanner clearboth"></div>';
568  print '<table class="border centpercent tableforfield">';
569 
570  // Task parent
571  print '<tr><td>'.$langs->trans("ChildOfTask").'</td><td>';
572  if ($object->fk_task_parent > 0) {
573  $tasktmp = new Task($db);
574  $tasktmp->fetch($object->fk_task_parent);
575  print $tasktmp->getNomUrl(1);
576  }
577  print '</td></tr>';
578 
579  // Date start - Date end task
580  print '<tr><td class="titlefield">'.$langs->trans("DateStart").' - '.$langs->trans("Deadline").'</td><td colspan="3">';
581  $start = dol_print_date($object->date_start, 'dayhour');
582  print ($start ? $start : '?');
583  $end = dol_print_date($object->date_end, 'dayhour');
584  print ' - ';
585  print ($end ? $end : '?');
586  if ($object->hasDelay()) {
587  print img_warning("Late");
588  }
589  print '</td></tr>';
590 
591  // Planned workload
592  print '<tr><td>'.$langs->trans("PlannedWorkload").'</td><td colspan="3">';
593  if ($object->planned_workload != '') {
594  print convertSecondToTime($object->planned_workload, 'allhourmin');
595  }
596  print '</td></tr>';
597 
598  // Description
599  print '<td class="tdtop">'.$langs->trans("Description").'</td><td colspan="3">';
600  print dol_htmlentitiesbr($object->description);
601  print '</td></tr>';
602 
603  print '</table>';
604  print '</div>';
605 
606  print '<div class="fichehalfright">';
607 
608  print '<div class="underbanner clearboth"></div>';
609  print '<table class="border centpercent tableforfield">';
610 
611  // Progress declared
612  print '<tr><td class="titlefield">'.$langs->trans("ProgressDeclared").'</td><td colspan="3">';
613  if ($object->progress != '') {
614  print $object->progress.' %';
615  }
616  print '</td></tr>';
617 
618  // Progress calculated
619  print '<tr><td>'.$langs->trans("ProgressCalculated").'</td><td colspan="3">';
620  if ($object->planned_workload != '') {
621  $tmparray = $object->getSummaryOfTimeSpent();
622  if ($tmparray['total_duration'] > 0 && !empty($object->planned_workload)) {
623  print round($tmparray['total_duration'] / $object->planned_workload * 100, 2).' %';
624  } else {
625  print '0 %';
626  }
627  } else {
628  print '<span class="opacitymedium">'.$langs->trans("WorkloadNotDefined").'</span>';
629  }
630  print '</td></tr>';
631 
632  // Budget
633  print '<tr><td>'.$langs->trans("Budget").'</td><td>';
634  if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) {
635  print '<span class="amount">'.price($object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).'</span>';
636  }
637  print '</td></tr>';
638 
639  // Other attributes
640  $cols = 3;
641  $parameters = array('socid'=>$socid);
642  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
643 
644  print '</table>';
645 
646  print '</div>';
647 
648  print '</div>';
649  print '<div class="clearboth"></div>';
650 
651  print dol_get_fiche_end();
652  }
653 
654 
655  if ($action != 'edit') {
656  /*
657  * Actions
658  */
659 
660  print '<div class="tabsAction">';
661 
662  $parameters = array();
663  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
664  // modified by hook
665  if (empty($reshook)) {
666  // Modify
667  if ($user->hasRight('projet', 'creer')) {
668  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'&withproject='.((int) $withproject).'">'.$langs->trans('Modify').'</a>';
669  print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=clone&token='.newToken().'&withproject='.((int) $withproject).'">'.$langs->trans('Clone').'</a>';
670  } else {
671  print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotAllowed").'">'.$langs->trans('Modify').'</a>';
672  }
673 
674  // Delete
675  $permissiontodelete = $user->hasRight('projet', 'supprimer');
676  if ($permissiontodelete) {
677  if (!$object->hasChildren() && !$object->hasTimeSpent()) {
678  print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', $permissiontodelete);
679  } else {
680  print dolGetButtonAction($langs->trans("TaskHasChild"), $langs->trans("Delete"), 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', 0);
681  }
682  } else {
683  print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&withproject='.((int) $withproject), 'delete', $permissiontodelete);
684  }
685 
686  print '</div>';
687  }
688 
689  print '<div class="fichecenter"><div class="fichehalfleft">';
690  print '<a name="builddoc"></a>'; // ancre
691 
692  /*
693  * Generated documents
694  */
695  $filename = dol_sanitizeFileName($projectstatic->ref)."/".dol_sanitizeFileName($object->ref);
696  $filedir = $conf->project->dir_output."/".dol_sanitizeFileName($projectstatic->ref)."/".dol_sanitizeFileName($object->ref);
697  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
698  $genallowed = ($user->rights->projet->lire);
699  $delallowed = ($user->hasRight('projet', 'creer'));
700 
701  print $formfile->showdocuments('project_task', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf);
702 
703  print '</div><div class="fichehalfright">';
704 
705  // List of actions on element
706  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
707  $formactions = new FormActions($db);
708  $formactions->showactions($object, 'project_task', 0, 1, '', 10, 'withproject='.$withproject);
709 
710  print '</div></div>';
711  }
712 }
713 
714 // End of page
715 llxFooter();
716 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class to manage projects.
Class to manage tasks.
Definition: task.class.php:40
Class to manage translations.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
Definition: date.lib.php:239
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
Definition: files.lib.php:1334
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
isModEnabled($module)
Is Dolibarr module enabled.
task_prepare_head($object)
Prepare array with list of tabs.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
Definition: project.lib.php:39
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.