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