36require
'../../main.inc.php';
46@phan-var-force ?string $uploaddir
48require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
49require_once DOL_DOCUMENT_ROOT .
'/projet/class/task.class.php';
50require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
51require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
53require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
56require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
59$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
61 $langsLoad[] =
'eventorganization';
64$langs->loadLangs($langsLoad);
66$action =
GETPOST(
'action',
'aZ09');
67$massaction =
GETPOST(
'massaction',
'alpha');
68$confirm =
GETPOST(
'confirm',
'alpha');
69$cancel =
GETPOST(
'cancel',
'alpha');
70$toselect =
GETPOST(
'toselect',
'array:int');
71$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
72$backtopage =
GETPOST(
'backtopage',
'alpha');
73$optioncss =
GETPOST(
'optioncss',
'alpha');
74$mode =
GETPOST(
'mode',
'alpha');
81$project_ref =
GETPOST(
'project_ref',
'alpha');
87$search_date_startday =
GETPOSTINT(
'search_date_startday');
88$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
89$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
90$search_date_endday =
GETPOSTINT(
'search_date_endday');
91$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
92$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
93$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
94$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
95$search_note =
GETPOST(
'search_note',
'alpha');
96$search_duration =
GETPOST(
'search_duration',
'alpha');
97$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
98$search_task_label =
GETPOST(
'search_task_label',
'alpha');
99$search_user =
GETPOST(
'search_user',
'intcomma');
100$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
101$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
102$search_company =
GETPOST(
'$search_company',
'alpha');
103$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
104$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
105$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
106$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
107$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
108$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
109$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
112$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
113$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
115if (empty($page) || $page == -1) {
118$offset = $limit * $page;
119$pageprev = $page - 1;
120$pagenext = $page + 1;
122 $sortfield =
't.element_date,t.element_datehour,t.rowid';
125 $sortorder =
'DESC,DESC,DESC';
128$childids = $user->getAllChildIds(1);
132$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
136$projectstatic =
new Project($db);
139$extrafields->fetch_name_optionals_label($projectstatic->table_element);
140$extrafields->fetch_name_optionals_label(
$object->table_element);
143if ($id > 0 || $ref) {
152if (!$user->hasRight(
'projet',
'lire')) {
161 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
162 $search_user = $user->id;
173if (
GETPOST(
'cancel',
'alpha')) {
176if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
180$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
181$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
186include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
189if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
194 $search_duration =
'';
195 $search_date_startday =
'';
196 $search_date_startmonth =
'';
197 $search_date_startyear =
'';
198 $search_date_endday =
'';
199 $search_date_endmonth =
'';
200 $search_date_endyear =
'';
201 $search_date_start =
'';
202 $search_date_end =
'';
203 $search_task_ref =
'';
204 $search_company =
'';
205 $search_company_alias =
'';
206 $search_project_ref =
'';
207 $search_project_label =
'';
208 $search_task_label =
'';
210 $search_valuebilled =
'';
211 $search_product_ref =
'';
213 $search_array_options = array();
214 $search_timespent_starthour =
'';
215 $search_timespent_startmin =
'';
216 $search_timespent_endhour =
'';
217 $search_timespent_endmin =
'';
221if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
222 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
223 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
224 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
225 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
229 $langs->load(
"errors");
230 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
239 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
240 $action =
'createtime';
250 if (empty(
$object->project->status)) {
251 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
252 $action =
'createtime';
263 $object->timespent_withhour = 1;
266 $object->timespent_withhour = 0;
271 $result =
$object->addTimeSpent($user);
282 $action =
'createtime';
286if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
287 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
288 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
299 $object->fetchTimeSpent($lineid);
303 $object->fetch($id_temp, $ref);
305 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
309 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
311 $object->timespent_withhour = 1;
312 } elseif (!empty($timespent_date)) {
313 $object->timespent_date = $timespent_date;
314 $object->timespent_withhour = 0;
317 if (GETPOSTISSET(
"userid_line")) {
325 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
326 $result =
$object->updateTimeSpent($user);
339 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
344 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
347 $object->timespent_withhour = 1;
348 } elseif (!empty($timespent_date)) {
349 $object->timespent_date = $timespent_date;
350 $object->timespent_datehour = $timespent_date;
351 $object->timespent_withhour = 0;
355 if (GETPOSTISSET(
"userid_line")) {
364 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
365 $result =
$object->updateTimeSpent($user);
380if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
383 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
384 $result =
$object->delTimeSpent($user);
387 $langs->load(
"errors");
398if (!empty($project_ref) && !empty($withproject)) {
399 if ($projectstatic->fetch(0, $project_ref) > 0) {
400 $tasksarray =
$object->getTasksArray(
null,
null, $projectstatic->id, $socid, 0);
401 if (count($tasksarray) > 0) {
402 $id = $tasksarray[0]->id;
404 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
411$projectidforalltimes = 0;
413 $projectidforalltimes =
GETPOSTINT(
'projectid');
415 $result = $projectstatic->fetch($projectidforalltimes);
416 if (!empty($projectstatic->socid)) {
417 $projectstatic->fetch_thirdparty();
419 $res = $projectstatic->fetch_optionals();
420} elseif (
GETPOST(
'project_ref',
'alpha')) {
421 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
422 $projectidforalltimes = $projectstatic->id;
426 $result = $projectstatic->fetch(
$object->fk_project);
429$allprojectforuser = 0;
431if ($id <= 0 && $projectidforalltimes == 0) {
432 $allprojectforuser = $user->id;
435if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
436 if (!empty($projectstatic->socid)) {
437 $projectstatic->fetch_thirdparty();
440 if (!($projectstatic->thirdparty->id > 0)) {
441 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
443 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
444 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
445 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
447 $tmpinvoice =
new Facture($db);
448 $tmptimespent =
new Task($db);
449 $tmpproduct =
new Product($db);
450 $fuser =
new User($db);
457 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
460 $prodDurationHoursBase = 1.0;
461 $product_data_cache = array();
463 $tmpproduct->fetch($idprod);
469 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
470 if ($prodDurationHoursBase < 0) {
472 $langs->load(
"errors");
476 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
478 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
479 $txtva = $dataforprice[
'tva_tx'];
480 $localtax1 =
get_localtax($txtva, 1, $projectstatic->thirdparty);
481 $localtax2 =
get_localtax($txtva, 2, $projectstatic->thirdparty);
483 $prodDurationHoursBase = 1;
491 $tmpinvoice->socid = $projectstatic->thirdparty->id;
493 $tmpinvoice->fk_project = $projectstatic->id;
494 $tmpinvoice->cond_reglement_id = $condidproject;
495 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
496 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
499 $tmpinvoice->fetch($invoiceToUse);
501 $result = $tmpinvoice->create($user);
509 if ($generateinvoicemode ==
'onelineperuser') {
510 $arrayoftasks = array();
511 foreach ($toselect as $key => $value) {
513 $object->fetchTimeSpent($value);
514 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
515 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
518 foreach ($arrayoftasks as $userid => $data) {
519 $fuser->fetch($userid);
520 $username = $fuser->getFullName($langs);
522 foreach ($data as $fk_product => $timespent_data) {
524 $qtyhour = $timespent_data[
'timespent'] / 3600;
525 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
531 } elseif ($idprod <= 0) {
534 $pu_ht = $fuser->thm;
539 if ($timespent_data[
'timespent']) {
540 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
545 $prodDurationHours = $prodDurationHoursBase;
546 $idprodline = $idprod;
549 $localtax1line = $localtax1;
550 $localtax2line = $localtax2;
553 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
554 if (!array_key_exists($fk_product, $product_data_cache)) {
555 $result = $tmpproduct->fetch($fk_product);
560 $prodDurationHours = $tmpproduct->getProductDurationHours();
561 if ($prodDurationHours < 0) {
563 $langs->load(
"errors");
567 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
569 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
570 $txtvaline = $dataforprice[
'tva_tx'];
571 $localtax1line = $dataforprice[
'localtax1'];
572 $localtax2line = $dataforprice[
'localtax2'];
574 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
576 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
577 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
578 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
579 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
580 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
582 $idprodline = $fk_product;
589 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice").
' - '.$username .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject,
'',
'', 0, 0, 0,
'HT', 0,
Product::TYPE_SERVICE);
596 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
597 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
598 $result = $db->query($sql);
606 } elseif ($generateinvoicemode ==
'onelineperperiod') {
607 $arrayoftasks = array();
609 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
610 foreach ($toselect as $key => $value) {
612 $object->fetchTimeSpent($value);
614 $ftask =
new Task($db);
617 $fuser->fetch(
$object->timespent_fk_user);
618 $username = $fuser->getFullName($langs);
620 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
621 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
622 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
625 if (!empty($withdetail)) {
626 if (!empty(
$object->timespent_withhour)) {
633 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
634 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
637 $pu_ht_saved = $pu_ht;
638 foreach ($arrayoftasks as $timespent_id => $value) {
639 $pu_ht = $pu_ht_saved;
640 $userid = $value[
'user'];
644 $qtyhour = $value[
'timespent'] / 3600;
648 if ($value[
'timespent']) {
649 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
654 $prodDurationHours = $prodDurationHoursBase;
655 $idprodline = $idprod;
658 $localtax1line = $localtax1;
659 $localtax2line = $localtax2;
661 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
662 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
663 $result = $tmpproduct->fetch($value[
'fk_product']);
668 $prodDurationHours = $tmpproduct->getProductDurationHours();
669 if ($prodDurationHours < 0) {
671 $langs->load(
"errors");
675 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
677 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
678 $txtvaline = $dataforprice[
'tva_tx'];
679 $localtax1line = $dataforprice[
'localtax1'];
680 $localtax2line = $dataforprice[
'localtax2'];
682 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
684 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
685 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
686 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
687 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
688 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
690 $idprodline = $value[
'fk_product'];
696 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject,
'',
'', 0, 0, 0,
'HT', 0,
Product::TYPE_SERVICE);
704 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
705 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
706 $result = $db->query($sql);
713 } elseif ($generateinvoicemode ==
'onelinepertask') {
714 $arrayoftasks = array();
715 foreach ($toselect as $key => $value) {
717 $object->fetchTimeSpent($value);
719 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
720 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
723 foreach ($arrayoftasks as $task_id => $data) {
724 $ftask =
new Task($db);
725 $ftask->fetch($task_id);
727 foreach ($data as $fk_product => $timespent_data) {
728 $qtyhour = $timespent_data[
'timespent'] / 3600;
729 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
732 $prodDurationHours = $prodDurationHoursBase;
733 $idprodline = $idprod;
736 $localtax1line = $localtax1;
737 $localtax2line = $localtax2;
739 if (!empty($fk_product) && $fk_product !== $idprod) {
740 if (!array_key_exists($fk_product, $product_data_cache)) {
741 $result = $tmpproduct->fetch($fk_product);
746 $prodDurationHours = $tmpproduct->getProductDurationHours();
747 if ($prodDurationHours < 0) {
749 $langs->load(
"errors");
753 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
755 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
756 $txtvaline = $dataforprice[
'tva_tx'];
757 $localtax1line = $dataforprice[
'localtax1'];
758 $localtax2line = $dataforprice[
'localtax2'];
760 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
762 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
763 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
764 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
765 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
766 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
768 $idprodline = $fk_product;
772 if ($idprodline > 0) {
774 $pu_ht_for_task = $pu_htline;
777 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
779 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
785 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
787 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
793 $lineName = $ftask->ref .
' - ' . $ftask->label;
794 $lineid = $tmpinvoice->addline($lineName, (
float) $pu_ht_for_task, (
float)
price2num($qtyhour / $prodDurationHours,
'MS'), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject, $date_start, $date_end, 0, 0, 0,
'HT', 0, 1, -1, 0,
'', 0, 0, 0, $pa_ht);
803 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
804 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
805 $result = $db->query($sql);
818 $urltoinvoice = $tmpinvoice->getNomUrl(0);
819 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
820 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
830if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
831 $langs->load(
'interventions');
833 if (!empty($projectstatic->socid)) {
834 $projectstatic->fetch_thirdparty();
837 if (!($projectstatic->thirdparty->id > 0)) {
838 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
840 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
841 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
842 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
845 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
847 $tmptimespent =
new Task($db);
848 $fuser =
new User($db);
854 $tmpinter->socid = $projectstatic->thirdparty->id;
856 $tmpinter->fk_project = $projectstatic->id;
857 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
860 $tmpinter->fetch($interToUse);
862 $result = $tmpinter->create($user);
870 $arrayoftasks = array();
871 foreach ($toselect as $key => $value) {
873 $object->fetchTimeSpent($value);
876 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
877 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
878 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
879 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
882 foreach ($arrayoftasks as $timespent_id => $value) {
883 $ftask =
new Task($db);
884 $ftask->fetch($value[
'id']);
886 $qtyhour = $value[
'timespent'] / 3600;
887 $qtyhourtext =
convertSecondToTime($value[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
890 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
895 $timespent->fetch($timespent_id);
896 $timespent->intervention_id = $tmpinter->id;
897 $timespent->intervention_line_id = $lineid;
898 $result = $timespent->update($user);
908 $urltointer = $tmpinter->getNomUrl(0);
909 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
910 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
927$form =
new Form($db);
930$userstatic =
new User($db);
932$arrayofselected = is_array($toselect) ? $toselect : array();
934$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
935if (!empty($withproject)) {
936 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
940llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
943$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
945 $param .=
'&search_user=' . ((int) $search_user);
948 $param .=
'&search_month=' . ((int) $search_month);
951 $param .=
'&search_year=' . ((int) $search_year);
955if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
957 if ($projectidforalltimes > 0) {
958 $result = $projectstatic->fetch($projectidforalltimes);
959 if (!empty($projectstatic->socid)) {
960 $projectstatic->fetch_thirdparty();
962 $res = $projectstatic->fetch_optionals();
963 } elseif (
$object->fetch($id, $ref) > 0) {
967 $result = $projectstatic->fetch(
$object->fk_project);
968 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
969 $projectstatic->fetchComments();
971 if (!empty($projectstatic->socid)) {
972 $projectstatic->fetch_thirdparty();
974 $res = $projectstatic->fetch_optionals();
976 $object->project = clone $projectstatic;
979 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
980 $linktocreatetime =
'';
982 if ($projectstatic->id > 0) {
985 if (empty($id) || $tab ==
'timespent') {
992 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
996 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
998 $morehtmlref =
'<div class="refidno">';
1000 $morehtmlref .= $projectstatic->title;
1002 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1003 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1005 $morehtmlref .=
'</div>';
1008 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1009 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1010 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1013 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1015 print
'<div class="fichecenter">';
1016 print
'<div class="fichehalfleft">';
1017 print
'<div class="underbanner clearboth"></div>';
1019 print
'<table class="border tableforfield centpercent">';
1023 print
'<tr><td class="tdtop">';
1024 print $langs->trans(
"Usage");
1028 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1029 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1030 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1034 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1035 $htmltext = $langs->trans(
"ProjectFollowTasks");
1036 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1040 print
'<input type="checkbox" disabled name="usage_bill_time"' . (GETPOSTISSET(
'usage_bill_time') ? (
GETPOST(
'usage_bill_time',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_bill_time ?
' checked="checked"' :
'')) .
'"> ';
1041 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1042 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1046 print
'<input type="checkbox" disabled name="usage_organize_event"' . (GETPOSTISSET(
'usage_organize_event') ? (
GETPOST(
'usage_organize_event',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_organize_event ?
' checked="checked"' :
'')) .
'"> ';
1047 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1048 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1054 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1055 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1056 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency) .
'</span>';
1061 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1063 print($start ? $start :
'?');
1066 print($end ? $end :
'?');
1067 if ($projectstatic->hasDelay()) {
1073 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1074 if ($projectstatic->public) {
1075 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1076 print $langs->trans(
'SharedProject');
1078 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1079 print $langs->trans(
'PrivateProject');
1087 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1093 print
'<div class="fichehalfright">';
1094 print
'<div class="underbanner clearboth"></div>';
1096 print
'<table class="border tableforfield centpercent">';
1100 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1101 print $form->showCategories($projectstatic->id,
'project', 1);
1106 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1107 if ($projectstatic->description) {
1108 print
'<tr><td class="nottitleforfield" colspan="2">';
1109 print
'<div class="longmessagecut">';
1120 print
'<div class="clearboth"></div>';
1128 $linktocreatetimeBtnStatus = 0;
1129 $linktocreatetimeUrl =
'';
1130 $linktocreatetimeHelpText =
'';
1131 if ($user->hasRight(
'projet',
'time')) {
1132 if ($projectstatic->public || $userRead > 0) {
1133 $linktocreatetimeBtnStatus = 1;
1135 if (!empty($projectidforalltimes)) {
1137 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1138 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1141 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1142 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1145 $linktocreatetimeBtnStatus = -2;
1146 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1149 $linktocreatetimeBtnStatus = -2;
1150 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1153 $paramsbutton = array(
'morecss' =>
'reposition');
1154 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1157 $massactionbutton =
'';
1158 $arrayofmassactions = array();
1160 if ($projectstatic->id > 0) {
1162 if ($projectstatic->usage_bill_time) {
1163 $arrayofmassactions = array(
1164 'generateinvoice' => $langs->trans(
"GenerateBill"),
1168 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1169 $langs->load(
"interventions");
1170 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1173 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1174 $arrayofmassactions = array();
1176 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1183 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1185 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1187 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1188 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1190 if ($action ==
'deleteline') {
1191 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1192 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1195 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1196 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1197 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1199 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1205 if (empty($withproject)) {
1206 $morehtmlref .=
'<div class="refidno">';
1207 $morehtmlref .= $langs->trans(
"Project") .
': ';
1208 $morehtmlref .= $projectstatic->getNomUrl(1);
1209 $morehtmlref .=
'<br>';
1212 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1213 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1214 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1216 $morehtmlref .=
'</div>';
1219 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1221 print
'<div class="fichecenter">';
1222 print
'<div class="fichehalfleft">';
1224 print
'<div class="underbanner clearboth"></div>';
1225 print
'<table class="border centpercent tableforfield">';
1228 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1229 if (
$object->fk_task_parent > 0) {
1230 $tasktmp =
new Task($db);
1231 $tasktmp->fetch(
$object->fk_task_parent);
1232 print $tasktmp->getNomUrl(1);
1237 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1239 print($start ? $start :
'?');
1242 print($end ? $end :
'?');
1249 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1250 if (
$object->planned_workload) {
1258 print
'<div class="fichehalfright">';
1260 print
'<div class="underbanner clearboth"></div>';
1261 print
'<table class="border tableforfield centpercent">';
1264 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1269 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1270 if (
$object->planned_workload) {
1271 $tmparray =
$object->getSummaryOfTimeSpent();
1272 if ($tmparray[
'total_duration'] > 0) {
1273 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1278 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1289 print
'<div class="clearboth"></div>';
1293 if ($action ==
'deleteline') {
1294 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . ($projectstatic->id > 0 ?
'projectid=' . $projectstatic->id : (
$object->id > 0 ?
"id=" .
$object->id :
'')) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'').
"&contextpage=" . urlencode($contextpage).$param;
1295 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1300 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1301 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1302 if (empty($reshook)) {
1303 $formconfirm .= $hookmanager->resPrint;
1304 } elseif ($reshook > 0) {
1305 $formconfirm = $hookmanager->resPrint;
1309 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1311 $hookmanager->initHooks(array(
'tasktimelist'));
1317 $arrayfields = array();
1318 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1319 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1320 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1321 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1322 if (! empty($allprojectforuser)) {
1323 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1324 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1326 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1327 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1329 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1330 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1331 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1332 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1334 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1335 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1336 $arrayfields[
'valuebilled'] = array(
'label' => $langs->trans(
"Billed"),
'checked' =>
'1',
'enabled' => (
string) (
int) (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1338 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1343 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1344 $param .=
'&contextpage=' . urlencode($contextpage);
1346 if ($limit > 0 && $limit != $conf->liste_limit) {
1347 $param .=
'&limit='.((int) $limit);
1350 $param .=
'&id='.((int) $id);
1352 if ($search_month > 0) {
1353 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1355 if ($search_year > 0) {
1356 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1358 if (!empty($search_user)) {
1359 $param .=
'&search_user='.urlencode($search_user);
1361 if ($search_task_ref !=
'') {
1362 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1364 if ($search_company !=
'') {
1365 $param .=
'&search_company=' . urlencode($search_company);
1367 if ($search_company_alias !=
'') {
1368 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1370 if ($search_project_ref !=
'') {
1371 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1373 if ($search_project_label !=
'') {
1374 $param .=
'&search_project_label=' . urlencode($search_project_label);
1376 if ($search_task_label !=
'') {
1377 $param .=
'&search_task_label=' . urlencode($search_task_label);
1379 if ($search_note !=
'') {
1380 $param .=
'&search_note=' . urlencode($search_note);
1382 if ($search_duration !=
'') {
1383 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1385 if ($optioncss !=
'') {
1386 $param .=
'&optioncss=' . urlencode($optioncss);
1388 if ($search_date_startday) {
1389 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1391 if ($search_date_startmonth) {
1392 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1394 if ($search_date_startyear) {
1395 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1397 if ($search_date_endday) {
1398 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1400 if ($search_date_endmonth) {
1401 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1403 if ($search_date_endyear) {
1404 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1406 if ($search_timespent_starthour) {
1407 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1409 if ($search_timespent_startmin) {
1410 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1412 if ($search_timespent_endhour) {
1413 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1415 if ($search_timespent_endmin) {
1416 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1423 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1426 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1429 $parameters = array(
'param' => &$param);
1430 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1431 $param .= $hookmanager->resPrint;
1433 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1434 if ($optioncss !=
'') {
1435 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1437 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1438 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1439 if ($action ==
'editline') {
1440 print
'<input type="hidden" name="action" value="updateline">';
1441 } elseif ($action ==
'splitline') {
1442 print
'<input type="hidden" name="action" value="updatesplitline">';
1443 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1444 print
'<input type="hidden" name="action" value="addtimespent">';
1445 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1446 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1447 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1448 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1450 print
'<input type="hidden" name="action" value="list">';
1452 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1453 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1457 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1458 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1459 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1460 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1461 print
'<input type="hidden" name="page_y" value="">';
1464 if ($massaction ==
'generateinvoice') {
1465 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1466 print
'<table class="noborder centerpercent">';
1468 print
'<td class="titlefield">';
1469 print $langs->trans(
'DateInvoice');
1472 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1478 print $langs->trans(
'Mode');
1482 'onelineperuser' =>
'OneLinePerUser',
1483 'onelinepertask' =>
'OneLinePerTask',
1484 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1486 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1487 print
"\n" .
'<script type="text/javascript">';
1489 $(document).ready(function () {
1490 setDetailVisibility();
1491 $("#generateinvoicemode").change(function() {
1492 setDetailVisibility();
1494 function setDetailVisibility() {
1495 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1496 if (generateinvoicemode=="onelineperperiod") {
1497 $("#detail_time_duration").show();
1499 $("#detail_time_duration").hide();
1504 print
'</script>' .
"\n";
1505 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1512 print $langs->trans(
'ServiceToUseOnLines');
1515 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1520 print
'<td class="titlefield">';
1521 print $langs->trans(
'InvoiceToUse');
1524 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1528 print
'<td class="titlefield">';
1529 print $langs->trans(
"CustomerRelativeDiscount");
1532 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1535 print
'<tr class="newinvoicedetail">';
1536 print
'<td class="titlefield">';
1537 print $langs->trans(
"PaymentConditions");
1540 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1554 print
'<div class="center">';
1555 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1556 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1560 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1561 print
'<div class="center">';
1562 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1566 } elseif ($massaction ==
'generateinter') {
1568 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1570 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1572 print
'<table class="noborder centpercent">';
1574 print
'<td class="titlefield">';
1575 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1579 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1584 print
'<div class="center">';
1585 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1586 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1590 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1591 print
'<div class="center">';
1592 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1599 $parameters = array(
1600 'toselect' => $toselect,
1601 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1604 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1608 print $hookmanager->resPrint;
1616 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1617 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1620 if ($projectstatic->usage_bill_time) {
1621 $arrayfields[
'valuebilled'][
'checked'] = 1;
1624 $sql =
"SELECT t.rowid, t.fk_element, t.element_date, t.element_datehour, t.element_date_withhour, t.element_duration, t.fk_user, t.note, t.thm,";
1625 $sql .=
" t.fk_product,";
1626 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet,";
1627 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1628 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1629 $sql .=
" p.fk_soc,s.name_alias,";
1630 $sql .=
" t.invoice_line_id,";
1631 $sql .=
" pt.billable";
1633 $parameters = array();
1634 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1635 $sql .= $hookmanager->resPrint;
1636 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1640 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1641 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1642 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1643 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1644 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1645 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1646 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1647 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1650 $parameters = array();
1651 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1652 $sql .= $hookmanager->resPrint;
1653 $sql .=
" WHERE elementtype = 'task'";
1654 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1655 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1659 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1660 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1662 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1664 $sql .=
" AND t.fk_element =".((int)
$object->id);
1665 } elseif (!empty($projectidforalltimes)) {
1667 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize((
string) $projectidforalltimes) .
")";
1668 } elseif (!empty($allprojectforuser)) {
1670 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1671 $search_user = $user->id;
1673 if ($search_user > 0) {
1674 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1681 if ($search_task_ref) {
1684 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1685 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1687 if ($search_company) {
1690 if ($search_company_alias) {
1694 if ($search_project_ref) {
1697 if ($search_project_label) {
1700 if ($search_task_label) {
1703 if ($search_user > 0) {
1706 if (!empty($search_product_ref)) {
1709 if ($search_valuebilled ==
'1') {
1710 $sql .=
' AND t.invoice_id > 0';
1712 if ($search_valuebilled ==
'0') {
1713 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1716 if ($search_date_start) {
1717 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1719 if ($search_date_end) {
1720 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1723 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1724 if ($search_timespent_starthour || $search_timespent_startmin) {
1725 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1726 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1727 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1730 if ($search_timespent_endhour || $search_timespent_endmin) {
1731 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1732 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1733 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1737 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1740 $parameters = array();
1741 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1742 $sql .= $hookmanager->resPrint;
1745 $nbtotalofrecords =
'';
1748 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1749 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1750 $resql = $db->query($sqlforcount);
1752 $objforcount = $db->fetch_object($resql);
1753 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1758 if (($page * $limit) > (
int) $nbtotalofrecords) {
1766 $sql .= $db->order($sortfield, $sortorder);
1768 $sql .= $db->plimit($limit + 1, $offset);
1771 $resql = $db->query($sql);
1777 $num = $db->num_rows($resql);
1780 if (!empty($projectidforalltimes)) {
1781 print
'<!-- List of time spent for project -->' .
"\n";
1783 $title = $langs->trans(
"ListTaskTimeUserProject");
1785 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1787 print
'<!-- List of time spent -->' .
"\n";
1789 $title = $langs->trans(
"ListTaskTimeForTask");
1791 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1796 $row = $db->fetch_object($resql);
1810 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1811 print
'<!-- table to add time spent -->' .
"\n";
1813 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1816 print
'<div class="div-table-responsive-no-min">';
1817 print
'<table class="noborder nohover centpercent">';
1819 print
'<tr class="liste_titre">';
1820 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1821 if (!empty($allprojectforuser)) {
1822 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1825 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1827 print
'<td>' . $langs->trans(
"By") .
'</td>';
1828 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1829 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1830 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1834 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1835 print
'<td>'.$langs->trans(
"Product").
'</td>';
1839 $parameters = array(
'mode' =>
'create');
1840 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1841 print $hookmanager->resPrint;
1845 print
'<tr class="oddeven nohover">';
1848 print
'<td class="maxwidthonsmartphone">';
1850 print $form->selectDate($newdate,
'time', ($conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1853 if (!empty($allprojectforuser)) {
1862 print
'<td class="maxwidthonsmartphone">';
1863 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1868 print
'<td class="maxwidthonsmartphone nowraponall">';
1869 $contactsofproject = $projectstatic->getListContactId(
'internal');
1870 if (count($contactsofproject) > 0) {
1871 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1872 if (in_array($user->id, $contactsofproject)) {
1873 $userid = $user->id;
1875 $userid = $contactsofproject[0];
1878 if ($projectstatic->public) {
1879 $contactsofproject = array();
1881 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1884 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1891 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1895 print
'<td class="nowraponall">';
1896 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1897 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1898 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1900 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1904 print
'<td class="nowrap">';
1905 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1913 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1914 print
'<td class="nowraponall">';
1916 print $form->select_produits((GETPOSTISSET(
'fk_product') ?
GETPOSTINT(
"fk_product") :
''),
'fk_product', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth150', ($user->hasRight(
'produit',
'lire') ? 0 : 1),
'', null, 1);
1922 $parameters = array(
'mode' =>
'create');
1923 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1924 print $hookmanager->resPrint;
1926 print
'<td class="center">';
1927 $form->buttonsSaveCancel();
1928 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1929 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1938 $moreforfilter =
'';
1940 $parameters = array();
1941 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1942 if (empty($reshook)) {
1943 $moreforfilter .= $hookmanager->resPrint;
1945 $moreforfilter = $hookmanager->resPrint;
1948 if (!empty($moreforfilter)) {
1949 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1950 print $moreforfilter;
1954 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1955 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1956 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1959 if ($projectstatic->usage_bill_time) {
1960 $arrayfields[
'valuebilled'][
'checked'] = 1;
1963 print
'<!-- Liste of time spent -->'.
"\n";
1964 print
'<div class="div-table-responsive">';
1965 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1969 print
'<tr class="liste_titre_filter">';
1972 print
'<td class="liste_titre center">';
1973 $searchpicto = $form->showFilterButtons(
'left');
1978 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1979 print
'<td class="liste_titre left">';
1980 print
'<div class="nowrapfordate paddingright">';
1981 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1983 print
'<div class="nowrapfordate">';
1984 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1989 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1990 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1994 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1995 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1998 if (!empty($allprojectforuser)) {
1999 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2000 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2002 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2003 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2007 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2008 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2009 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2011 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2012 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2016 if (!empty($arrayfields[
'author'][
'checked'])) {
2017 print
'<td class="liste_titre">'.$form->select_dolusers(($search_user > 0 ? $search_user : -1),
'search_user', 1, null, 0,
'',
'',
'0', 0, 0,
'', 0,
'',
'maxwidth125').
'</td>';
2020 if (!empty($arrayfields[
't.note'][
'checked'])) {
2021 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2024 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2026 print
'<td class="liste_titre right">';
2028 $durationtouse_start =
'';
2029 if ($search_timespent_starthour || $search_timespent_startmin) {
2030 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2032 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
2033 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2036 $durationtouse_end =
'';
2037 if ($search_timespent_endhour || $search_timespent_endmin) {
2038 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2040 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2041 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2047 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2048 print
'<td class="liste_titre right"></td>';
2051 if (!empty($arrayfields[
'value'][
'checked'])) {
2052 print
'<td class="liste_titre"></td>';
2055 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2056 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2064 $parameters = array(
'arrayfields' => $arrayfields);
2065 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2066 print $hookmanager->resPrint;
2069 print
'<td class="liste_titre center">';
2070 $searchpicto = $form->showFilterButtons();
2074 print
'</tr>' .
"\n";
2082 print
'<tr class="liste_titre">';
2084 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2087 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2088 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2091 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2092 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2095 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2097 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2100 if (!empty($allprojectforuser)) {
2101 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2102 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2105 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2106 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2110 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2111 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2112 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2115 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2116 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2120 if (!empty($arrayfields[
'author'][
'checked'])) {
2121 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2124 if (!empty($arrayfields[
't.note'][
'checked'])) {
2125 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2128 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2129 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2132 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2133 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2137 if (!empty($arrayfields[
'value'][
'checked'])) {
2138 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2141 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2142 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2150 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2151 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2152 print $hookmanager->resPrint;
2154 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2159 $tasktmp =
new Task($db);
2160 $tmpinvoice =
new Facture($db);
2163 $param .=
'&page='.((int) $page);
2165 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2173 foreach ($tasks as $task_time) {
2179 $invoiced = $task_time->invoice_id ? true :
false;
2181 $date1 = $db->jdate($task_time->element_date);
2182 $date2 = $db->jdate($task_time->element_datehour);
2186 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2190 print
'<td class="center nowraponall">';
2191 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2192 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2194 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2196 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2198 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2199 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2200 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2201 print
'<a class="reposition editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?'.($withproject ?
'id='.$task_time->fk_element :
'').
'&action=editline&token='.
newToken().
'&lineid='.$task_time->rowid.$param.((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'').
'">';
2202 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2206 print
'<a class="reposition editfielda paddingleft" href="' . $_SERVER[
"PHP_SELF"] .
'?action=splitline&token=' .
newToken() .
'&lineid=' . $task_time->rowid . $param . ((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'') .
'">';
2207 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2211 print
'<a class="reposition paddingleft" href="'.$_SERVER[
"PHP_SELF"].
'?'.($withproject ?
'id='.$task_time->fk_element :
'').
'&action=deleteline&token='.
newToken().
'&lineid='.$task_time->rowid.$param.((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'').
'">';
2212 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2215 if ($massactionbutton || $massaction) {
2217 if (in_array($task_time->rowid, $arrayofselected)) {
2223 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2224 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2228 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2229 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2243 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2244 print
'<td class="nowrap">';
2245 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2246 if (empty($task_time->element_date_withhour)) {
2247 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2249 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2252 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2261 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2262 print
'<td class="tdoverflowmax125">';
2263 if ($task_time->fk_soc > 0) {
2264 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2265 $tmpsociete =
new Societe($db);
2266 $tmpsociete->fetch($task_time->fk_soc);
2267 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2269 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2271 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2280 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2282 if ($task_time->fk_soc > 0) {
2283 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2284 $tmpsociete =
new Societe($db);
2285 $tmpsociete->fetch($task_time->fk_soc);
2286 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2288 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2290 $valtoshow = $tmpsociete->name_alias;
2292 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2300 if (!empty($allprojectforuser)) {
2302 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2303 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2304 $tmpproject =
new Project($db);
2305 $tmpproject->fetch($task_time->fk_projet);
2306 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2308 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2310 print
'<td class="nowraponall">';
2311 print $tmpproject->getNomUrl(1);
2318 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2319 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2320 $tmpproject =
new Project($db);
2321 $tmpproject->fetch($task_time->fk_projet);
2322 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2324 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2326 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2327 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2330 print $tmpproject->getNomUrl(1,
'', -1);
2340 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2341 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2342 print
'<td class="nowrap">';
2343 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2344 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (string) $projectstatic->id,
'');
2346 $tasktmp->id = $task_time->fk_element;
2347 $tasktmp->ref = $task_time->ref;
2348 $tasktmp->label = $task_time->label;
2349 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2356 } elseif ($action !==
'createtime') {
2357 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2361 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2362 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2363 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2364 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2367 $tasktmp->id = $task_time->fk_element;
2368 $tasktmp->ref = $task_time->ref;
2369 $tasktmp->label = $task_time->label;
2370 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2380 if (!empty($arrayfields[
'author'][
'checked'])) {
2381 print
'<td class="tdoverflowmax125">';
2382 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2385 $object->fetch($task_time->fk_element);
2387 $contactsoftask =
$object->getListContactId(
'internal');
2388 if (!in_array($task_time->fk_user, $contactsoftask)) {
2389 $contactsoftask[] = $task_time->fk_user;
2391 if (count($contactsoftask) > 0) {
2392 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2393 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2395 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2398 $userstatic->id = $task_time->fk_user;
2399 $userstatic->lastname = $task_time->lastname;
2400 $userstatic->firstname = $task_time->firstname;
2401 $userstatic->photo = $task_time->photo;
2402 $userstatic->gender = $task_time->gender;
2403 $userstatic->status = $task_time->user_status;
2405 print $userstatic->getNomUrl(-1);
2414 if (!empty($arrayfields[
't.note'][
'checked'])) {
2415 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2416 print
'<td class="small">';
2417 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2420 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2427 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2428 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2432 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2433 print
'<td class="right nowraponall">';
2434 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2435 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2436 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2447 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2448 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2450 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2456 $totalarray[
'totalduration'] = $task_time->element_duration;
2458 $totalarray[
'totalduration'] += $task_time->element_duration;
2463 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2464 print
'<td class="nowraponall">';
2465 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2467 print $form->select_produits($task_time->fk_product,
'fk_product', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500', ($user->hasRight(
'produit',
'lire') ? 0 : 1),
'', null, 1);
2468 } elseif (!empty($task_time->fk_product)) {
2470 $resultFetch = $product->fetch($task_time->fk_product);
2471 if ($resultFetch < 0) {
2474 print $product->getNomUrl(1);
2484 if (!empty($arrayfields[
'value'][
'checked'])) {
2485 $langs->load(
"salaries");
2486 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2488 print
'<td class="nowraponall right">';
2489 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2490 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2515 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2516 print
'<td class="center">';
2518 if ($projectstatic->usage_bill_time) {
2519 if ($task_time->invoice_id) {
2520 $result = $tmpinvoice->fetch($task_time->invoice_id);
2522 if ($user->hasRight(
'facture',
'lire')) {
2523 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2524 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2526 print $tmpinvoice->getNomUrl(1);
2527 if (!empty($task_time->invoice_line_id)) {
2529 $invoiceLine->fetch($task_time->invoice_line_id);
2530 if (!empty($invoiceLine->id)) {
2531 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2532 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2538 print $langs->trans(
"Yes");
2543 if (intval($task_time->billable) == 1) {
2544 print $langs->trans(
"No");
2546 print $langs->trans(
"Disabled");
2550 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2565 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2566 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2567 print $hookmanager->resPrint;
2571 print
'<td class="center nowraponall">';
2572 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2573 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2574 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2576 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2577 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2578 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2579 print
'<a class="reposition editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?'.($withproject ?
'id='.$task_time->fk_element :
'').
'&action=editline&token='.
newToken().
'&lineid='.$task_time->rowid.$param.((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'').
'">';
2580 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2584 print
'<a class="reposition editfielda paddingleft" href="' . $_SERVER[
"PHP_SELF"] .
'?action=splitline&token=' .
newToken() .
'&lineid=' . $task_time->rowid . $param . ((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'') .
'">';
2585 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2589 print
'<a class="reposition paddingleft" href="'.$_SERVER[
"PHP_SELF"].
'?'.($withproject ?
'id='.$task_time->fk_element :
'').
'&action=deleteline&token='.
newToken().
'&lineid='.$task_time->rowid.$param.((empty($id) || $tab ==
'timespent') ?
'&tab=timespent' :
'').
'">';
2590 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2593 if ($massactionbutton || $massaction) {
2595 if (in_array($task_time->rowid, $arrayofselected)) {
2601 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2602 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2606 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2607 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2625 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2626 print
'<!-- first line -->';
2627 print
'<tr class="oddeven">';
2635 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2636 print
'<td class="nowrap">';
2637 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2638 if (empty($task_time->element_date_withhour)) {
2639 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2641 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2644 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2650 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2651 print
'<td class="nowrap">';
2656 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2657 print
'<td class="nowrap">';
2662 if (!empty($allprojectforuser)) {
2663 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2664 print
'<td class="nowrap">';
2670 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2671 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2672 print
'<td class="nowrap">';
2673 $tasktmp->id = $task_time->fk_element;
2674 $tasktmp->ref = $task_time->ref;
2675 $tasktmp->label = $task_time->label;
2676 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2682 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2683 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2684 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2691 if (!empty($arrayfields[
'author'][
'checked'])) {
2692 print
'<td class="nowraponall">';
2693 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2695 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2698 $contactsoftask =
$object->getListContactId(
'internal');
2699 if (!in_array($task_time->fk_user, $contactsoftask)) {
2700 $contactsoftask[] = $task_time->fk_user;
2702 if (count($contactsoftask) > 0) {
2703 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2704 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2706 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2709 $userstatic->id = $task_time->fk_user;
2710 $userstatic->lastname = $task_time->lastname;
2711 $userstatic->firstname = $task_time->firstname;
2712 $userstatic->photo = $task_time->photo;
2713 $userstatic->status = $task_time->user_status;
2714 print $userstatic->getNomUrl(-1);
2720 if (!empty($arrayfields[
't.note'][
'checked'])) {
2721 print
'<td class="tdoverflowmax300">';
2722 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2723 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2728 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2729 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2733 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2734 print
'<td class="right">';
2735 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2736 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2737 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2745 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2746 print
'<td class="nowraponall tdoverflowmax125">';
2751 if (!empty($arrayfields[
'value'][
'checked'])) {
2752 print
'<td class="right">';
2753 print
'<span class="amount">';
2754 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2755 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2761 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2762 print
'<td class="right">';
2763 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2764 if (isset($task_time->total_ht)) {
2765 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2776 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2777 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2778 print $hookmanager->resPrint;
2782 print
'<td class="center nowraponall">';
2791 print
'<!-- second line --><tr class="oddeven">';
2795 print
'<td class="center nowraponall">';
2800 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2801 print
'<td class="nowraponall">';
2802 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2803 if (empty($task_time->element_date_withhour)) {
2804 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2806 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2809 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2815 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2821 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2827 if (!empty($allprojectforuser)) {
2828 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2835 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2836 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2837 print
'<td class="nowraponall">';
2838 $tasktmp->id = $task_time->fk_element;
2839 $tasktmp->ref = $task_time->ref;
2840 $tasktmp->label = $task_time->label;
2841 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2847 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2848 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2849 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2856 if (!empty($arrayfields[
'author'][
'checked'])) {
2857 print
'<td class="nowraponall tdoverflowmax100">';
2858 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2860 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2863 $contactsoftask =
$object->getListContactId(
'internal');
2864 if (!in_array($task_time->fk_user, $contactsoftask)) {
2865 $contactsoftask[] = $task_time->fk_user;
2867 if (count($contactsoftask) > 0) {
2868 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2869 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2871 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2874 $userstatic->id = $task_time->fk_user;
2875 $userstatic->lastname = $task_time->lastname;
2876 $userstatic->firstname = $task_time->firstname;
2877 $userstatic->photo = $task_time->photo;
2878 $userstatic->status = $task_time->user_status;
2879 print $userstatic->getNomUrl(-1);
2885 if (!empty($arrayfields[
't.note'][
'checked'])) {
2886 print
'<td class="small tdoverflowmax300"">';
2887 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2888 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2893 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2894 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2898 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2899 print
'<td class="right">';
2900 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2901 print
'<input type="hidden" name="old_duration_2" value="0">';
2902 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2910 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2911 print
'<td class="nowraponall tdoverflowmax125">';
2916 if (!empty($arrayfields[
'value'][
'checked'])) {
2917 print
'<td class="right">';
2918 print
'<span class="amount nowraponall">';
2920 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2927 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2928 print
'<td class="right">';
2929 if (isset($task_time->total_ht)) {
2930 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2931 print
'<span class="amount nowraponall small">';
2932 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2944 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2945 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2946 print $hookmanager->resPrint;
2950 print
'<td class="center nowraponall">';
2963 print
'<tr class="liste_total">';
2968 if ($num < $limit && empty($offset)) {
2969 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2971 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2985 if (!count($tasks)) {
2986 $totalnboffields = 1;
2987 foreach ($arrayfields as $value) {
2988 if (!empty($value[
'checked'])) {
2992 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2993 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2997 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2998 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2999 print $hookmanager->resPrint;
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
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.
Class to manage invoices.
Class to manage invoice lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
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...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
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.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
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...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
img_split($titlealt='default', $other='class="pictosplit"')
Show split 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).
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
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...
task_prepare_head($object)
Prepare array with list of tabs.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.