dolibarr  17.0.4
perweek.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2010 François Legastelois <flegastelois@teclib.com>
6  * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 require "../../main.inc.php";
29 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
30 require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
37 
38 // Load translation files required by the page
39 $langs->loadLangs(array('projects', 'users', 'companies'));
40 
41 $action = GETPOST('action', 'aZ09');
42 $mode = GETPOST("mode", 'alpha');
43 $id = GETPOST('id', 'int');
44 $taskid = GETPOST('taskid', 'int');
45 
46 $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'perweekcard';
47 
48 $mine = 0;
49 if ($mode == 'mine') {
50  $mine = 1;
51 }
52 
53 $projectid = GETPOSTISSET("id") ? GETPOST("id", "int", 1) : GETPOST("projectid", "int");
54 
55 $hookmanager->initHooks(array('timesheetperweekcard'));
56 
57 // Security check
58 $socid = 0;
59 // For external user, no check is done on company because readability is managed by public status of project and assignement.
60 // if ($user->socid > 0) $socid=$user->socid;
61 $result = restrictedArea($user, 'projet', $projectid);
62 
63 $now = dol_now();
64 
65 $year = GETPOST('reyear', 'int') ?GETPOST('reyear', 'int') : (GETPOST("year", 'int') ?GETPOST("year", "int") : date("Y"));
66 $month = GETPOST('remonth', 'int') ?GETPOST('remonth', 'int') : (GETPOST("month", 'int') ?GETPOST("month", "int") : date("m"));
67 $day = GETPOST('reday', 'int') ?GETPOST('reday', 'int') : (GETPOST("day", 'int') ?GETPOST("day", "int") : date("d"));
68 $week = GETPOST("week", "int") ?GETPOST("week", "int") : date("W");
69 
70 $day = (int) $day;
71 
72 //$search_categ = GETPOST("search_categ", 'alpha');
73 $search_usertoprocessid = GETPOST('search_usertoprocessid', 'int');
74 $search_task_ref = GETPOST('search_task_ref', 'alpha');
75 $search_task_label = GETPOST('search_task_label', 'alpha');
76 $search_project_ref = GETPOST('search_project_ref', 'alpha');
77 $search_thirdparty = GETPOST('search_thirdparty', 'alpha');
78 $search_declared_progress = GETPOST('search_declared_progress', 'alpha');
79 
80 $sortfield = GETPOST('sortfield', 'aZ09comma');
81 $sortorder = GETPOST('sortorder', 'aZ09comma');
82 
83 $startdayarray = dol_get_first_day_week($day, $month, $year);
84 
85 $prev = $startdayarray;
86 $prev_year = $prev['prev_year'];
87 $prev_month = $prev['prev_month'];
88 $prev_day = $prev['prev_day'];
89 $first_day = $prev['first_day'];
90 $first_month = $prev['first_month'];
91 $first_year = $prev['first_year'];
92 $week = $prev['week'];
93 
94 $next = dol_get_next_week($first_day, $week, $first_month, $first_year);
95 $next_year = $next['year'];
96 $next_month = $next['month'];
97 $next_day = $next['day'];
98 
99 // Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1)
100 $firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year);
101 $firstdaytoshowgmt = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'gmt');
102 
103 if (empty($search_usertoprocessid) || $search_usertoprocessid == $user->id) {
104  $usertoprocess = $user;
105  $search_usertoprocessid = $usertoprocess->id;
106 } elseif ($search_usertoprocessid > 0) {
107  $usertoprocess = new User($db);
108  $usertoprocess->fetch($search_usertoprocessid);
109  $search_usertoprocessid = $usertoprocess->id;
110 } else {
111  $usertoprocess = new User($db);
112 }
113 
114 $object = new Task($db);
115 
116 // Extra fields
117 $extrafields = new ExtraFields($db);
118 
119 // fetch optionals attributes and labels
120 $extrafields->fetch_name_optionals_label($object->table_element);
121 
122 // Definition of fields for list
123 $arrayfields = array();
124 /*$arrayfields=array(
125  // Project
126  'p.opp_amount'=>array('label'=>$langs->trans("OpportunityAmountShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>103),
127  'p.fk_opp_status'=>array('label'=>$langs->trans("OpportunityStatusShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>104),
128  'p.opp_percent'=>array('label'=>$langs->trans("OpportunityProbabilityShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>105),
129  'p.budget_amount'=>array('label'=>$langs->trans("Budget"), 'checked'=>0, 'position'=>110),
130  'p.usage_bill_time'=>array('label'=>$langs->trans("BillTimeShort"), 'checked'=>0, 'position'=>115),
131  );*/
132 $arrayfields['t.planned_workload'] = array('label'=>'PlannedWorkload', 'checked'=>1, 'enabled'=>1, 'position'=>5);
133 $arrayfields['t.progress'] = array('label'=>'ProgressDeclared', 'checked'=>1, 'enabled'=>1, 'position'=>10);
134 $arrayfields['timeconsumed'] = array('label'=>'TimeConsumed', 'checked'=>1, 'enabled'=>1, 'position'=>15);
135 /*foreach($object->fields as $key => $val)
136  {
137  // If $val['visible']==0, then we never show the field
138  if (!empty($val['visible'])) $arrayfields['t.'.$key]=array('label'=>$val['label'], 'checked'=>(($val['visible']<0)?0:1), 'enabled'=>$val['enabled'], 'position'=>$val['position']);
139  }*/
140 // Definition of fields for list
141 // Extra fields
142 if (!empty($extrafields->attributes['projet_task']['label']) && is_array($extrafields->attributes['projet_task']['label']) && count($extrafields->attributes['projet_task']['label']) > 0) {
143  foreach ($extrafields->attributes['projet_task']['label'] as $key => $val) {
144  if (!empty($extrafields->attributes['projet_task']['list'][$key])) {
145  $arrayfields["efpt.".$key] = array('label'=>$extrafields->attributes['projet_task']['label'][$key], 'checked'=>(($extrafields->attributes['projet_task']['list'][$key] < 0) ? 0 : 1), 'position'=>$extrafields->attributes['projet_task']['pos'][$key], 'enabled'=>(abs((int) $extrafields->attributes['projet_task']['list'][$key]) != 3 && $extrafields->attributes['projet_task']['perms'][$key]));
146  }
147  }
148 }
149 $arrayfields = dol_sort_array($arrayfields, 'position');
150 
151 $search_array_options = array();
152 $search_array_options_project = $extrafields->getOptionalsFromPost('projet', '', 'search_');
153 $search_array_options_task = $extrafields->getOptionalsFromPost('projet_task', '', 'search_task_');
154 
155 
156 
157 /*
158  * Actions
159  */
160 
161 $parameters = array('id' => $id, 'taskid' => $taskid, 'projectid' => $projectid);
162 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
163 if ($reshook < 0) {
164  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
165 }
166 // Purge criteria
167 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
168  $action = '';
169  //$search_categ = '';
170  $search_usertoprocessid = $user->id;
171  $search_task_ref = '';
172  $search_task_label = '';
173  $search_project_ref = '';
174  $search_thirdparty = '';
175  $search_declared_progress = '';
176 
177  $search_array_options_project = array();
178  $search_array_options_task = array();
179 
180  // We redefine $usertoprocess
181  $usertoprocess = $user;
182 }
183 if (GETPOST("button_search_x", 'alpha') || GETPOST("button_search.x", 'alpha') || GETPOST("button_search", 'alpha')) {
184  $action = '';
185 }
186 
187 if (GETPOST('submitdateselect')) {
188  if (GETPOST('remonth', 'int') && GETPOST('reday', 'int') && GETPOST('reyear', 'int')) {
189  $daytoparse = dol_mktime(0, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
190  }
191 
192  $action = '';
193 }
194 
195 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
196 
197 if ($action == 'addtime' && $user->rights->projet->lire && GETPOST('assigntask') && GETPOST('formfilteraction') != 'listafterchangingselectedfields') {
198  $action = 'assigntask';
199 
200  if ($taskid > 0) {
201  $result = $object->fetch($taskid, $ref);
202  if ($result < 0) {
203  $error++;
204  }
205  } else {
206  setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Task")), '', 'errors');
207  $error++;
208  }
209  if (!GETPOST('type')) {
210  setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), '', 'errors');
211  $error++;
212  }
213 
214  if (!$error) {
215  $idfortaskuser = $usertoprocess->id;
216  $result = $object->add_contact($idfortaskuser, GETPOST("type"), 'internal');
217 
218  if ($result >= 0 || $result == -2) { // Contact add ok or already contact of task
219  // Test if we are already contact of the project (should be rare but sometimes we can add as task contact without being contact of project, like when admin user has been removed from contact of project)
220  $sql = 'SELECT ec.rowid FROM '.MAIN_DB_PREFIX.'element_contact as ec, '.MAIN_DB_PREFIX.'c_type_contact as tc WHERE tc.rowid = ec.fk_c_type_contact';
221  $sql .= ' AND ec.fk_socpeople = '.((int) $idfortaskuser)." AND ec.element_id = ".((int) $object->fk_project)." AND tc.element = 'project' AND source = 'internal'";
222  $resql = $db->query($sql);
223  if ($resql) {
224  $obj = $db->fetch_object($resql);
225  if (!$obj) { // User is not already linked to project, so we will create link to first type
226  $project = new Project($db);
227  $project->fetch($object->fk_project);
228  // Get type
229  $listofprojcontact = $project->liste_type_contact('internal');
230 
231  if (count($listofprojcontact)) {
232  $tmparray = array_keys($listofprojcontact);
233  $typeforprojectcontact = reset($tmparray);
234  $result = $project->add_contact($idfortaskuser, $typeforprojectcontact, 'internal');
235  }
236  }
237  } else {
238  dol_print_error($db);
239  }
240  }
241  }
242 
243  if ($result < 0) {
244  $error++;
245  if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
246  $langs->load("errors");
247  setEventMessages($langs->trans("ErrorTaskAlreadyAssigned"), null, 'warnings');
248  } else {
249  setEventMessages($object->error, $object->errors, 'errors');
250  }
251  }
252 
253  if (!$error) {
254  setEventMessages("TaskAssignedToEnterTime", null);
255  $taskid = 0;
256  }
257 
258  $action = '';
259 }
260 
261 if ($action == 'addtime' && $user->rights->projet->lire && GETPOST('formfilteraction') != 'listafterchangingselectedfields') {
262  $timetoadd = GETPOST('task');
263  if (empty($timetoadd)) {
264  setEventMessages($langs->trans("ErrorTimeSpentIsEmpty"), null, 'errors');
265  } else {
266  foreach ($timetoadd as $taskid => $value) { // Loop on each task
267  $updateoftaskdone = 0;
268  foreach ($value as $key => $val) { // Loop on each day
269  $amountoadd = $timetoadd[$taskid][$key];
270  if (!empty($amountoadd)) {
271  $tmpduration = explode(':', $amountoadd);
272  $newduration = 0;
273  if (!empty($tmpduration[0])) {
274  $newduration += ($tmpduration[0] * 3600);
275  }
276  if (!empty($tmpduration[1])) {
277  $newduration += ($tmpduration[1] * 60);
278  }
279  if (!empty($tmpduration[2])) {
280  $newduration += ($tmpduration[2]);
281  }
282 
283  if ($newduration > 0) {
284  $object->fetch($taskid);
285 
286  if (GETPOSTISSET($taskid.'progress')) {
287  $object->progress = GETPOST($taskid.'progress', 'int');
288  } else {
289  unset($object->progress);
290  }
291 
292  $object->timespent_duration = $newduration;
293  $object->timespent_fk_user = $usertoprocess->id;
294  $object->timespent_date = dol_time_plus_duree($firstdaytoshow, $key, 'd');
295  $object->timespent_datehour = $object->timespent_date;
296  $object->timespent_note = $object->description;
297 
298  $result = $object->addTimeSpent($user);
299  if ($result < 0) {
300  setEventMessages($object->error, $object->errors, 'errors');
301  $error++;
302  break;
303  }
304 
305  $updateoftaskdone++;
306  }
307  }
308  }
309 
310  if (!$updateoftaskdone) { // Check to update progress if no update were done on task.
311  $object->fetch($taskid);
312  //var_dump($object->progress);
313  //var_dump(GETPOST($taskid . 'progress', 'int')); exit;
314  if ($object->progress != GETPOST($taskid.'progress', 'int')) {
315  $object->progress = GETPOST($taskid.'progress', 'int');
316  $result = $object->update($user);
317  if ($result < 0) {
318  setEventMessages($object->error, $object->errors, 'errors');
319  $error++;
320  break;
321  }
322  }
323  }
324  }
325 
326  if (!$error) {
327  setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
328 
329  $param = '';
330  $param .= ($mode ? '&mode='.urlencode($mode) : '');
331  $param .= ($projectid ? 'id='.urlencode($projectid) : '');
332  $param .= ($search_usertoprocessid ? '&search_usertoprocessid='.urlencode($search_usertoprocessid) : '');
333  $param .= ($day ? '&day='.urlencode($day) : '').($month ? '&month='.urlencode($month) : '').($year ? '&year='.urlencode($year) : '');
334  $param .= ($search_project_ref ? '&search_project_ref='.urlencode($search_project_ref) : '');
335  $param .= ($search_usertoprocessid > 0 ? '&search_usertoprocessid='.urlencode($search_usertoprocessid) : '');
336  $param .= ($search_thirdparty ? '&search_thirdparty='.urlencode($search_thirdparty) : '');
337  $param .= ($search_declared_progress ? '&search_declared_progress='.urlencode($search_declared_progress) : '');
338  $param .= ($search_task_ref ? '&search_task_ref='.urlencode($search_task_ref) : '');
339  $param .= ($search_task_label ? '&search_task_label='.urlencode($search_task_label) : '');
340 
341  /*$search_array_options=$search_array_options_project;
342  $search_options_pattern='search_options_';
343  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
344  */
345 
346  $search_array_options = $search_array_options_task;
347  $search_options_pattern = 'search_task_options_';
348  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
349 
350  // Redirect to avoid submit twice on back
351  header('Location: '.$_SERVER["PHP_SELF"].'?'.$param);
352  exit;
353  }
354  }
355 }
356 
357 
358 /*
359  * View
360  */
361 
362 $form = new Form($db);
363 $formother = new FormOther($db);
364 $formcompany = new FormCompany($db);
365 $formproject = new FormProjets($db);
366 $projectstatic = new Project($db);
367 $project = new Project($db);
368 $taskstatic = new Task($db);
369 $thirdpartystatic = new Societe($db);
370 $holiday = new Holiday($db);
371 
372 $title = $langs->trans("TimeSpent");
373 
374 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess, (empty($usertoprocess->id) ? 2 : 0), 1); // Return all project i have permission on (assigned to me+public). I want my tasks and some of my task may be on a public projet that is not my project
375 //var_dump($projectsListId);
376 if ($id) {
377  $project->fetch($id);
378  $project->fetch_thirdparty();
379 }
380 
381 $onlyopenedproject = 1; // or -1
382 $morewherefilter = '';
383 
384 if ($search_project_ref) {
385  $morewherefilter .= natural_search(array("p.ref", "p.title"), $search_project_ref);
386 }
387 if ($search_task_ref) {
388  $morewherefilter .= natural_search("t.ref", $search_task_ref);
389 }
390 if ($search_task_label) {
391  $morewherefilter .= natural_search(array("t.ref", "t.label"), $search_task_label);
392 }
393 if ($search_thirdparty) {
394  $morewherefilter .= natural_search("s.nom", $search_thirdparty);
395 }
396 if ($search_declared_progress) {
397  $morewherefilter .= natural_search("t.progress", $search_declared_progress, 1);
398 }
399 
400 $sql = &$morewherefilter;
401 
402 /*$search_array_options = $search_array_options_project;
403  $extrafieldsobjectprefix='efp.';
404  $search_options_pattern='search_options_';
405  $extrafieldsobjectkey='projet';
406  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
407  */
408 $search_array_options = $search_array_options_task;
409 $extrafieldsobjectprefix = 'efpt.';
410 $search_options_pattern = 'search_task_options_';
411 $extrafieldsobjectkey = 'projet_task';
412 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
413 
414 $tasksarray = $taskstatic->getTasksArray(0, 0, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
415 if ($morewherefilter) { // Get all task without any filter, so we can show total of time spent for not visible tasks
416  $tasksarraywithoutfilter = $taskstatic->getTasksArray(0, 0, ($project->id ? $project->id : 0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid ? $search_usertoprocessid : 0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
417 }
418 $projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, 0, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
419 $tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(0, $usertoprocess, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
420 //var_dump($tasksarray);
421 //var_dump($projectsrole);
422 //var_dump($taskrole);
423 
424 
425 llxHeader("", $title, "", '', '', '', array('/core/js/timesheet.js'));
426 
427 //print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num, '', 'project');
428 
429 $param = '';
430 $param .= ($mode ? '&mode='.urlencode($mode) : '');
431 $param .= ($search_project_ref ? '&search_project_ref='.urlencode($search_project_ref) : '');
432 $param .= ($search_usertoprocessid > 0 ? '&search_usertoprocessid='.urlencode($search_usertoprocessid) : '');
433 $param .= ($search_thirdparty ? '&search_thirdparty='.urlencode($search_thirdparty) : '');
434 $param .= ($search_task_ref ? '&search_task_ref='.urlencode($search_task_ref) : '');
435 $param .= ($search_task_label ? '&search_task_label='.urlencode($search_task_label) : '');
436 
437 $search_array_options = $search_array_options_project;
438 $search_options_pattern = 'search_options_';
439 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
440 
441 $search_array_options = $search_array_options_task;
442 $search_options_pattern = 'search_task_options_';
443 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
444 
445 // Show navigation bar
446 $nav = '<a class="inline-block valignmiddle" href="?year='.$prev_year."&month=".$prev_month."&day=".$prev_day.$param.'">'.img_previous($langs->trans("Previous"))."</a>\n";
447 $nav .= ' <span id="month_name">'.dol_print_date(dol_mktime(0, 0, 0, $first_month, $first_day, $first_year), "%Y").", ".$langs->trans("WeekShort")." ".$week." </span>\n";
448 $nav .= '<a class="inline-block valignmiddle" href="?year='.$next_year."&month=".$next_month."&day=".$next_day.$param.'">'.img_next($langs->trans("Next"))."</a>\n";
449 $nav .= ' '.$form->selectDate(-1, '', 0, 0, 2, "addtime", 1, 1).' ';
450 $nav .= ' <button type="submit" name="submitdateselect" value="x" class="nobordertransp button_search_x"><span class="fa fa-search"></span></button>';
451 
452 $picto = 'clock';
453 
454 print '<form name="addtime" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
455 print '<input type="hidden" name="token" value="'.newToken().'">';
456 print '<input type="hidden" name="action" value="addtime">';
457 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
458 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
459 print '<input type="hidden" name="mode" value="'.$mode.'">';
460 print '<input type="hidden" name="day" value="'.$day.'">';
461 print '<input type="hidden" name="month" value="'.$month.'">';
462 print '<input type="hidden" name="year" value="'.$year.'">';
463 
464 $head = project_timesheet_prepare_head($mode, $usertoprocess);
465 print dol_get_fiche_head($head, 'inputperweek', $langs->trans('TimeSpent'), -1, $picto);
466 
467 // Show description of content
468 print '<div class="hideonsmartphone opacitymedium">';
469 if ($mine || ($usertoprocess->id == $user->id)) {
470  print $langs->trans("MyTasksDesc").'.'.($onlyopenedproject ? ' '.$langs->trans("OnlyOpenedProject") : '').'<br>';
471 } else {
472  if (empty($usertoprocess->id) || $usertoprocess->id < 0) {
473  if ($user->rights->projet->all->lire && !$socid) {
474  print $langs->trans("ProjectsDesc").'.'.($onlyopenedproject ? ' '.$langs->trans("OnlyOpenedProject") : '').'<br>';
475  } else {
476  print $langs->trans("ProjectsPublicTaskDesc").'.'.($onlyopenedproject ? ' '.$langs->trans("OnlyOpenedProject") : '').'<br>';
477  }
478  }
479 }
480 if ($mine || ($usertoprocess->id == $user->id)) {
481  print $langs->trans("OnlyYourTaskAreVisible").'<br>';
482 } else {
483  print $langs->trans("AllTaskVisibleButEditIfYouAreAssigned").'<br>';
484 }
485 print '</div>';
486 
487 print dol_get_fiche_end();
488 
489 print '<div class="floatright right'.($conf->dol_optimize_smallscreen ? ' centpercent' : '').'">'.$nav.'</div>'; // We move this before the assign to components so, the default submit button is not the assign to.
490 
491 print '<div class="colorbacktimesheet float valignmiddle">';
492 $titleassigntask = $langs->transnoentities("AssignTaskToMe");
493 if ($usertoprocess->id != $user->id) {
494  $titleassigntask = $langs->transnoentities("AssignTaskToUser", $usertoprocess->getFullName($langs));
495 }
496 print '<div class="taskiddiv inline-block">';
497 print img_picto('', 'projecttask', 'class="pictofixedwidth"');
498 $formproject->selectTasks($socid ? $socid : -1, $taskid, 'taskid', 32, 0, '-- '.$langs->trans("ChooseANotYetAssignedTask").' --', 1, 0, 0, '', '', 'all', $usertoprocess);
499 print '</div>';
500 print ' ';
501 print $formcompany->selectTypeContact($object, '', 'type', 'internal', 'position', 0, 'maxwidth150onsmartphone');
502 print '<input type="submit" class="button valignmiddle smallonsmartphone small" name="assigntask" value="'.dol_escape_htmltag($titleassigntask).'">';
503 print '</div>';
504 
505 print '<div class="clearboth" style="padding-bottom: 20px;"></div>';
506 
507 
508 $startday = dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['first_day'], $startdayarray['first_year']);
509 
510 $numendworkingday = 0;
511 $numstartworkingday = 0;
512 // Get if user is available or not for each day
513 $isavailable = array();
514 
515 // Assume from Monday to Friday if conf empty or badly formed
516 $numstartworkingday = 1;
517 $numendworkingday = 5;
518 
519 if (!empty($conf->global->MAIN_DEFAULT_WORKING_DAYS)) {
520  $tmparray = explode('-', $conf->global->MAIN_DEFAULT_WORKING_DAYS);
521  if (count($tmparray) >= 2) {
522  $numstartworkingday = $tmparray[0];
523  $numendworkingday = $tmparray[1];
524  }
525 }
526 
527 for ($idw = 0; $idw < 7; $idw++) {
528  $dayinloopfromfirstdaytoshow = dol_time_plus_duree($firstdaytoshow, $idw, 'd'); // $firstdaytoshow is a date with hours = 0
529  $dayinloopfromfirstdaytoshowgmt = dol_time_plus_duree($firstdaytoshowgmt, $idw, 'd'); // $firstdaytoshow is a date with hours = 0
530 
531  $statusofholidaytocheck = Holiday::STATUS_APPROVED;
532 
533  $isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $dayinloopfromfirstdaytoshow, $statusofholidaytocheck);
534  $isavailable[$dayinloopfromfirstdaytoshow] = $isavailablefordayanduser; // in projectLinesPerWeek later, we are using $firstdaytoshow and dol_time_plus_duree to loop on each day
535 
536  $test = num_public_holiday($dayinloopfromfirstdaytoshowgmt, $dayinloopfromfirstdaytoshowgmt + 86400, $mysoc->country_code);
537  if ($test) {
538  $isavailable[$dayinloopfromfirstdaytoshow] = array('morning'=>false, 'afternoon'=>false, 'morning_reason'=>'public_holiday', 'afternoon_reason'=>'public_holiday');
539  }
540 }
541 
542 
543 
544 $moreforfilter = '';
545 
546 // Filter on categories
547 /*
548  if (!empty($conf->categorie->enabled))
549  {
550  require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php';
551  $moreforfilter.='<div class="divsearchfield">';
552  $moreforfilter.=$langs->trans('ProjectCategories'). ': ';
553  $moreforfilter.=$formother->select_categories('project', $search_categ, 'search_categ', 1, 1, 'maxwidth300');
554  $moreforfilter.='</div>';
555  }*/
556 
557 // If the user can view user other than himself
558 $moreforfilter .= '<div class="divsearchfield">';
559 $moreforfilter .= '<div class="inline-block hideonsmartphone"></div>';
560 $includeonly = 'hierarchyme';
561 if (empty($user->rights->user->user->lire)) {
562  $includeonly = array($user->id);
563 }
564 $moreforfilter .= img_picto($langs->trans('Filter').' '.$langs->trans('User'), 'user', 'class="paddingright pictofixedwidth"').$form->select_dolusers($search_usertoprocessid ? $search_usertoprocessid : $usertoprocess->id, 'search_usertoprocessid', $user->rights->user->user->lire ? 0 : 0, null, 0, $includeonly, null, 0, 0, 0, '', 0, '', 'maxwidth200');
565 $moreforfilter .= '</div>';
566 
567 if (empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT)) {
568  $moreforfilter .= '<div class="divsearchfield">';
569  $moreforfilter .= '<div class="inline-block"></div>';
570  $moreforfilter .= img_picto($langs->trans('Filter').' '.$langs->trans('Project'), 'project', 'class="paddingright pictofixedwidth"').'<input type="text" name="search_project_ref" class="maxwidth100" value="'.dol_escape_htmltag($search_project_ref).'">';
571  $moreforfilter .= '</div>';
572 
573  $moreforfilter .= '<div class="divsearchfield">';
574  $moreforfilter .= '<div class="inline-block"></div>';
575  $moreforfilter .= img_picto($langs->trans('Filter').' '.$langs->trans('ThirdParty'), 'company', 'class="paddingright pictofixedwidth"').'<input type="text" name="search_thirdparty" class="maxwidth100" value="'.dol_escape_htmltag($search_thirdparty).'">';
576  $moreforfilter .= '</div>';
577 }
578 
579 if (!empty($moreforfilter)) {
580  print '<div class="liste_titre liste_titre_bydiv centpercent">';
581  print $moreforfilter;
582  $parameters = array();
583  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
584  print $hookmanager->resPrint;
585  print '</div>';
586 }
587 
588 
589 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
590 
591 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
592 
593 // This must be after the $selectedfields
594 $addcolspan = 0;
595 if (!empty($arrayfields['t.planned_workload']['checked'])) {
596  $addcolspan++;
597 }
598 if (!empty($arrayfields['t.progress']['checked'])) {
599  $addcolspan++;
600 }
601 foreach ($arrayfields as $key => $val) {
602  if ($val['checked'] && substr($key, 0, 5) == 'efpt.') {
603  $addcolspan++;
604  }
605 }
606 
607 print '<div class="div-table-responsive">';
608 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'" id="tablelines3">'."\n";
609 
610 print '<tr class="liste_titre_filter">';
611 if (!empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT)) {
612  print '<td class="liste_titre"><input type="text" size="4" name="search_project_ref" value="'.dol_escape_htmltag($search_project_ref).'"></td>';
613 }
614 if (!empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT)) {
615  print '<td class="liste_titre"><input type="text" size="4" name="search_thirdparty" value="'.dol_escape_htmltag($search_thirdparty).'"></td>';
616 }
617 print '<td class="liste_titre"><input type="text" size="4" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).'"></td>';
618 // TASK fields
619 $search_options_pattern = 'search_task_options_';
620 $extrafieldsobjectkey = 'projet_task';
621 $extrafieldsobjectprefix = 'efpt.';
622 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
623 if (!empty($arrayfields['t.planned_workload']['checked'])) {
624  print '<td class="liste_titre"></td>';
625 }
626 if (!empty($arrayfields['t.progress']['checked'])) {
627  print '<td class="liste_titre right"><input type="text" size="4" name="search_declared_progress" value="'.dol_escape_htmltag($search_declared_progress).'"></td>';
628 }
629 if (!empty($arrayfields['timeconsumed']['checked'])) {
630  print '<td class="liste_titre"></td>';
631  print '<td class="liste_titre"></td>';
632 }
633 for ($idw = 0; $idw < 7; $idw++) {
634  print '<td class="liste_titre"></td>';
635 }
636 // Action column
637 print '<td class="liste_titre nowrap right">';
638 $searchpicto = $form->showFilterAndCheckAddButtons(0);
639 print $searchpicto;
640 print '</td>';
641 print "</tr>\n";
642 
643 print '<tr class="liste_titre">';
644 if (!empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT)) {
645  print '<th>'.$langs->trans("Project").'</th>';
646 }
647 if (!empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT)) {
648  print '<th>'.$langs->trans("ThirdParty").'</th>';
649 }
650 print '<th>'.$langs->trans("Task").'</th>';
651 // TASK fields
652 $extrafieldsobjectkey = 'projet_task';
653 $extrafieldsobjectprefix = 'efpt.';
654 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
655 if (!empty($arrayfields['t.planned_workload']['checked'])) {
656  print '<th class="leftborder plannedworkload minwidth75 maxwidth100 right" title="'.dol_escape_htmltag($langs->trans("PlannedWorkload")).'">'.$langs->trans("PlannedWorkload").'</th>';
657 }
658 if (!empty($arrayfields['t.progress']['checked'])) {
659  print '<th class="right minwidth75 maxwidth100" title="'.dol_escape_htmltag($langs->trans("ProgressDeclared")).'">'.$langs->trans("ProgressDeclared").'</th>';
660 }
661 if (!empty($arrayfields['timeconsumed']['checked'])) {
662  print '<th class="right maxwidth100">'.$langs->trans("TimeSpent").'<br>';
663  print '<span class="nowraponall">';
664  print '<span class="opacitymedium nopadding userimg"><img alt="Photo" class="photouserphoto userphoto" src="'.DOL_URL_ROOT.'/theme/common/everybody.png"></span>';
665  print '<span class="opacitymedium paddingleft">'.$langs->trans("Everybody").'</span>';
666  print '</span>';
667  print '</th>';
668  print '<th class="right maxwidth75 maxwidth100">'.$langs->trans("TimeSpent").($usertoprocess->firstname ? '<br><span class="nowraponall">'.$usertoprocess->getNomUrl(-2).'<span class="opacitymedium paddingleft">'.dol_trunc($usertoprocess->firstname, 10).'</span></span>' : '').'</th>';
669 }
670 for ($idw = 0; $idw < 7; $idw++) {
671  $dayinloopfromfirstdaytoshow = dol_time_plus_duree($firstdaytoshow, $idw, 'd'); // $firstdaytoshow is a date with hours = 0
672 
673  $cssweekend = '';
674  if ((($idw + 1) < $numstartworkingday) || (($idw + 1) > $numendworkingday)) { // This is a day is not inside the setup of working days, so we use a week-end css.
675  $cssweekend = 'weekend';
676  }
677 
678  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
679 
680  $cssonholiday = '';
681  if (!$isavailable[$tmpday]['morning'] && !$isavailable[$tmpday]['afternoon']) {
682  $cssonholiday .= 'onholidayallday ';
683  } elseif (!$isavailable[$tmpday]['morning']) {
684  $cssonholiday .= 'onholidaymorning ';
685  } elseif (!$isavailable[$tmpday]['afternoon']) {
686  $cssonholiday .= 'onholidayafternoon ';
687  }
688 
689  print '<th width="6%" class="center bold hide'.$idw.($cssonholiday ? ' '.$cssonholiday : '').($cssweekend ? ' '.$cssweekend : '').'">';
690  print dol_print_date($dayinloopfromfirstdaytoshow, '%a');
691  print '<br>'.dol_print_date($dayinloopfromfirstdaytoshow, 'dayreduceformat').'</th>';
692 }
693 //print '<td></td>';
694 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
695 
696 
697 print "</tr>\n";
698 
699 $colspan = 1 + (empty($conf->global->PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT) ? 0 : 2);
700 
701 if ($conf->use_javascript_ajax) {
702  print '<tr class="liste_total">';
703  print '<td class="liste_total" colspan="'.($colspan + $addcolspan).'">';
704  print $langs->trans("Total");
705  print '<span class="opacitymediumbycolor"> - '.$langs->trans("ExpectedWorkedHours").': <strong>'.price($usertoprocess->weeklyhours, 1, $langs, 0, 0).'</strong></span>';
706  print '</td>';
707  if (!empty($arrayfields['timeconsumed']['checked'])) {
708  print '<td class="liste_total"></td>';
709  print '<td class="liste_total"></td>';
710  }
711  for ($idw = 0; $idw < 7; $idw++) {
712  $cssweekend = '';
713  if ((($idw + 1) < $numstartworkingday) || (($idw + 1) > $numendworkingday)) { // This is a day is not inside the setup of working days, so we use a week-end css.
714  $cssweekend = 'weekend';
715  }
716 
717  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
718 
719  $cssonholiday = '';
720  if (!$isavailable[$tmpday]['morning'] && !$isavailable[$tmpday]['afternoon']) {
721  $cssonholiday .= 'onholidayallday ';
722  } elseif (!$isavailable[$tmpday]['morning']) {
723  $cssonholiday .= 'onholidaymorning ';
724  } elseif (!$isavailable[$tmpday]['afternoon']) {
725  $cssonholiday .= 'onholidayafternoon ';
726  }
727  print '<td class="liste_total hide'.$idw.($cssonholiday ? ' '.$cssonholiday : '').($cssweekend ? ' '.$cssweekend : '').'" align="center"><div class="totalDay'.$idw.'">&nbsp;</div></td>';
728  }
729  print '<td class="liste_total center"><div class="totalDayAll">&nbsp;</div></td>';
730  print '</tr>';
731 }
732 
733 
734 
735 // By default, we can edit only tasks we are assigned to
736 $restrictviewformytask = ((!isset($conf->global->PROJECT_TIME_SHOW_TASK_NOT_ASSIGNED)) ? 2 : $conf->global->PROJECT_TIME_SHOW_TASK_NOT_ASSIGNED);
737 if (count($tasksarray) > 0) {
738  //var_dump($tasksarray); // contains only selected tasks
739  //var_dump($tasksarraywithoutfilter); // contains all tasks (if there is a filter, not defined if no filter)
740  //var_dump($tasksrole);
741 
742  $j = 0;
743  $level = 0;
744  $totalforvisibletasks = projectLinesPerWeek($j, $firstdaytoshow, $usertoprocess, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restrictviewformytask, $isavailable, 0, $arrayfields, $extrafields);
745  //var_dump($totalforvisibletasks);
746 
747  // Show total for all other tasks
748 
749  // Calculate total for all tasks
750  $listofdistinctprojectid = array(); // List of all distinct projects
751  if (!empty($tasksarraywithoutfilter) && is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
752  foreach ($tasksarraywithoutfilter as $tmptask) {
753  $listofdistinctprojectid[$tmptask->fk_project] = $tmptask->fk_project;
754  }
755  }
756  //var_dump($listofdistinctprojectid);
757  $totalforeachday = array();
758  foreach ($listofdistinctprojectid as $tmpprojectid) {
759  $projectstatic->id = $tmpprojectid;
760  $projectstatic->loadTimeSpent($firstdaytoshow, 0, $usertoprocess->id); // Load time spent from table projet_task_time for the project into this->weekWorkLoad and this->weekWorkLoadPerTask for all days of a week
761  for ($idw = 0; $idw < 7; $idw++) {
762  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
763  $totalforeachday[$tmpday] += $projectstatic->weekWorkLoad[$tmpday];
764  }
765  }
766 
767  //var_dump($totalforeachday);
768  //var_dump($totalforvisibletasks);
769 
770  // Is there a diff between selected/filtered tasks and all tasks ?
771  $isdiff = 0;
772  if (count($totalforeachday)) {
773  for ($idw = 0; $idw < 7; $idw++) {
774  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
775  $timeonothertasks = ($totalforeachday[$tmpday] - $totalforvisibletasks[$tmpday]);
776  if ($timeonothertasks) {
777  $isdiff = 1;
778  break;
779  }
780  }
781  }
782 
783  // There is a diff between total shown on screen and total spent by user, so we add a line with all other cumulated time of user
784  if ($isdiff) {
785  print '<tr class="oddeven othertaskwithtime">';
786  print '<td colspan="'.($colspan + $addcolspan).'" class="opacitymedium">';
787  print $langs->trans("OtherFilteredTasks");
788  print '</td>';
789  if (!empty($arrayfields['timeconsumed']['checked'])) {
790  print '<td class="liste_total"></td>';
791  print '<td class="liste_total"></td>';
792  }
793  for ($idw = 0; $idw < 7; $idw++) {
794  $cssweekend = '';
795  if ((($idw + 1) < $numstartworkingday) || (($idw + 1) > $numendworkingday)) { // This is a day is not inside the setup of working days, so we use a week-end css.
796  $cssweekend = 'weekend';
797  }
798 
799  print '<td class="center hide'.$idw.' '.($cssweekend ? ' '.$cssweekend : '').'">';
800  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
801  $timeonothertasks = ($totalforeachday[$tmpday] - $totalforvisibletasks[$tmpday]);
802  if ($timeonothertasks) {
803  print '<span class="timesheetalreadyrecorded" title="texttoreplace"><input type="text" class="center smallpadd" size="2" disabled="" id="timespent[-1]['.$idw.']" name="task[-1]['.$idw.']" value="';
804  print convertSecondToTime($timeonothertasks, 'allhourmin');
805  print '"></span>';
806  }
807  print '</td>';
808  }
809  print ' <td class="liste_total"></td>';
810  print '</tr>';
811  }
812 
813  if ($conf->use_javascript_ajax) {
814  print '<tr class="liste_total">';
815  print '<td class="liste_total" colspan="'.($colspan + $addcolspan).'">';
816  print $langs->trans("Total");
817  print '<span class="opacitymediumbycolor"> - '.$langs->trans("ExpectedWorkedHours").': <strong>'.price($usertoprocess->weeklyhours, 1, $langs, 0, 0).'</strong></span>';
818  print '</td>';
819  if (!empty($arrayfields['timeconsumed']['checked'])) {
820  print '<td class="liste_total"></td>';
821  print '<td class="liste_total"></td>';
822  }
823 
824  for ($idw = 0; $idw < 7; $idw++) {
825  $cssweekend = '';
826  if ((($idw + 1) < $numstartworkingday) || (($idw + 1) > $numendworkingday)) { // This is a day is not inside the setup of working days, so we use a week-end css.
827  $cssweekend = 'weekend';
828  }
829 
830  $tmpday = dol_time_plus_duree($firstdaytoshow, $idw, 'd');
831 
832  $cssonholiday = '';
833  if (!$isavailable[$tmpday]['morning'] && !$isavailable[$tmpday]['afternoon']) {
834  $cssonholiday .= 'onholidayallday ';
835  } elseif (!$isavailable[$tmpday]['morning']) {
836  $cssonholiday .= 'onholidaymorning ';
837  } elseif (!$isavailable[$tmpday]['afternoon']) {
838  $cssonholiday .= 'onholidayafternoon ';
839  }
840 
841  print '<td class="liste_total hide'.$idw.($cssonholiday ? ' '.$cssonholiday : '').($cssweekend ? ' '.$cssweekend : '').'" align="center"><div class="totalDay'.$idw.'">&nbsp;</div></td>';
842  }
843  print '<td class="liste_total center"><div class="totalDayAll">&nbsp;</div></td>';
844  print '</tr>';
845  }
846 } else {
847  print '<tr><td colspan="15"><span class="opacitymedium">'.$langs->trans("NoAssignedTasks").'</span></td></tr>';
848 }
849 print "</table>";
850 print '</div>';
851 
852 print '<input type="hidden" id="numberOfLines" name="numberOfLines" value="'.count($tasksarray).'"/>'."\n";
853 
854 print $form->buttonsSaveCancel("Save", '');
855 
856 print '</form>'."\n\n";
857 
858 $modeinput = 'hours';
859 
860 if ($conf->use_javascript_ajax) {
861  print "\n<!-- JS CODE TO ENABLE Tooltips on all object with class classfortooltip -->\n";
862  print '<script type="text/javascript">'."\n";
863  print "jQuery(document).ready(function () {\n";
864  print ' jQuery(".timesheetalreadyrecorded").tooltip({
865  show: { collision: "flipfit", effect:\'toggle\', delay:50 },
866  hide: { effect:\'toggle\', delay: 50 },
867  tooltipClass: "mytooltip",
868  content: function () {
869  return \''.dol_escape_js($langs->trans("TimeAlreadyRecorded", $usertoprocess->getFullName($langs))).'\';
870  }
871  });'."\n";
872 
873  $idw = 0;
874  while ($idw < 7) {
875  print ' updateTotal('.$idw.',\''.$modeinput.'\');';
876  $idw++;
877  }
878  print "\n});\n";
879  print '</script>';
880 }
881 
882 // End of page
883 llxFooter();
884 $db->close();
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
Class to manage standard extra fields.
Class to build HTML component for third parties management Only common components are here.
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 building of HTML components.
Class of the module paid holiday.
const STATUS_APPROVED
Approved.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage tasks.
Definition: task.class.php:38
Class to manage Dolibarr users.
Definition: user.class.php:47
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.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_get_next_week($day, $week, $month, $year)
Return next week.
Definition: date.lib.php:553
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition: date.lib.php:650
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:121
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:238
num_public_holiday($timestampStart, $timestampEnd, $country_code='', $lastday=0, $includesaturday=-1, $includesunday=-1, $includefriday=-1, $includemonday=-1)
Return the number of non working days including Friday, Saturday and Sunday (or not) between 2 dates ...
Definition: date.lib.php:744
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...
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_previous($titlealt='default', $moreatt='')
Show previous logo.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
img_next($titlealt='default', $moreatt='')
Show next logo.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
project_timesheet_prepare_head($mode, $fuser=null)
Prepare array with list of tabs.
projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask, &$isavailable, $oldprojectforbreak=0, $arrayfields=array(), $extrafields=null)
Output a task line into a perday intput mode.
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.