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'));
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;
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;
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';
457 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
460 $prodDurationHoursBase = 1.0;
461 $product_data_cache = array();
463 $result = $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 if (!array_key_exists(
$object->timespent_fk_user, $arrayoftasks)) {
515 $arrayoftasks[
$object->timespent_fk_user] = [
516 (int)
$object->timespent_fk_product => [
'timespent' => 0,
'totalvaluetodivideby3600' => 0]
519 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
520 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
523 foreach ($arrayoftasks as $userid => $data) {
524 $fuser->fetch($userid);
525 $username = $fuser->getFullName($langs);
527 foreach ($data as $fk_product => $timespent_data) {
529 $qtyhour = $timespent_data[
'timespent'] / 3600;
536 } elseif ($idprod <= 0) {
539 $pu_ht = $fuser->thm;
544 if ($timespent_data[
'timespent']) {
545 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
550 $prodDurationHours = $prodDurationHoursBase;
551 $idprodline = $idprod;
554 $localtax1line = $localtax1;
555 $localtax2line = $localtax2;
558 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
559 if (!array_key_exists($fk_product, $product_data_cache)) {
560 $result = $tmpproduct->fetch($fk_product);
565 $prodDurationHours = $tmpproduct->getProductDurationHours();
566 if ($prodDurationHours < 0) {
568 $langs->load(
"errors");
572 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
574 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
575 $txtvaline = $dataforprice[
'tva_tx'];
576 $localtax1line = $dataforprice[
'localtax1'];
577 $localtax2line = $dataforprice[
'localtax2'];
579 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
581 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
582 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
583 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
584 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
585 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
587 $idprodline = $fk_product;
594 $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);
601 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
602 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
603 $result =
$db->query($sql);
611 } elseif ($generateinvoicemode ==
'onelineperperiod') {
612 $arrayoftasks = array();
614 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
615 foreach ($toselect as $key => $value) {
617 $object->fetchTimeSpent($value);
622 $fuser->fetch(
$object->timespent_fk_user);
623 $username = $fuser->getFullName($langs);
625 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
626 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
627 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
630 if (!empty($withdetail)) {
631 if (!empty(
$object->timespent_withhour)) {
638 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
639 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
642 $pu_ht_saved = $pu_ht;
643 foreach ($arrayoftasks as $timespent_id => $value) {
644 $pu_ht = $pu_ht_saved;
645 $userid = $value[
'user'];
649 $qtyhour = $value[
'timespent'] / 3600;
653 if ($value[
'timespent']) {
654 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
659 $prodDurationHours = $prodDurationHoursBase;
660 $idprodline = $idprod;
663 $localtax1line = $localtax1;
664 $localtax2line = $localtax2;
666 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
667 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
668 $result = $tmpproduct->fetch($value[
'fk_product']);
673 $prodDurationHours = $tmpproduct->getProductDurationHours();
674 if ($prodDurationHours < 0) {
676 $langs->load(
"errors");
680 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
682 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
683 $txtvaline = $dataforprice[
'tva_tx'];
684 $localtax1line = $dataforprice[
'localtax1'];
685 $localtax2line = $dataforprice[
'localtax2'];
687 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
689 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
690 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
691 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
692 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
693 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
695 $idprodline = $value[
'fk_product'];
701 $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);
709 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
710 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
711 $result =
$db->query($sql);
718 } elseif ($generateinvoicemode ==
'onelinepertask') {
719 $arrayoftasks = array();
720 foreach ($toselect as $key => $value) {
722 $object->fetchTimeSpent($value);
724 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
725 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
728 foreach ($arrayoftasks as $task_id => $data) {
730 $ftask->fetch($task_id);
732 foreach ($data as $fk_product => $timespent_data) {
733 $qtyhour = $timespent_data[
'timespent'] / 3600;
737 $prodDurationHours = $prodDurationHoursBase;
738 $idprodline = $idprod;
741 $localtax1line = $localtax1;
742 $localtax2line = $localtax2;
744 if (!empty($fk_product) && $fk_product !== $idprod) {
745 if (!array_key_exists($fk_product, $product_data_cache)) {
746 $result = $tmpproduct->fetch($fk_product);
751 $prodDurationHours = $tmpproduct->getProductDurationHours();
752 if ($prodDurationHours < 0) {
754 $langs->load(
"errors");
758 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
760 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
761 $txtvaline = $dataforprice[
'tva_tx'];
762 $localtax1line = $dataforprice[
'localtax1'];
763 $localtax2line = $dataforprice[
'localtax2'];
765 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
767 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
768 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
769 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
770 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
771 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
773 $idprodline = $fk_product;
777 if ($idprodline > 0) {
779 $pu_ht_for_task = $pu_htline;
782 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
784 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
790 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
792 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
798 $lineName = $ftask->ref .
' - ' . $ftask->label;
799 $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);
808 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
809 $sql .=
' WHERE rowid IN (' .
$db->sanitize(implode(
',', $toselect)) .
')';
810 $result =
$db->query($sql);
823 $urltoinvoice = $tmpinvoice->getNomUrl(0);
824 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
825 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
835if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
836 $langs->load(
'interventions');
838 if (!empty($projectstatic->socid)) {
839 $projectstatic->fetch_thirdparty();
842 if (!($projectstatic->thirdparty->id > 0)) {
843 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
845 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
846 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
847 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
850 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
859 $tmpinter->socid = $projectstatic->thirdparty->id;
861 $tmpinter->fk_project = $projectstatic->id;
862 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
865 $tmpinter->fetch($interToUse);
867 $result = $tmpinter->create($user);
875 $arrayoftasks = array();
876 foreach ($toselect as $key => $value) {
878 $object->fetchTimeSpent($value);
881 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
882 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
883 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
884 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
887 foreach ($arrayoftasks as $timespent_id => $value) {
889 $ftask->fetch($value[
'id']);
891 $qtyhour = $value[
'timespent'] / 3600;
895 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
900 $timespent->fetch($timespent_id);
901 $timespent->intervention_id = $tmpinter->id;
902 $timespent->intervention_line_id = $lineid;
903 $result = $timespent->update($user);
913 $urltointer = $tmpinter->getNomUrl(0);
914 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
915 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
937$arrayofselected = is_array($toselect) ? $toselect : array();
939$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
940if (!empty($withproject)) {
941 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
945llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
948$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
950 $param .=
'&search_user=' . ((int) $search_user);
953 $param .=
'&search_month=' . ((int) $search_month);
956 $param .=
'&search_year=' . ((int) $search_year);
960if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
962 if ($projectidforalltimes > 0) {
963 $result = $projectstatic->fetch($projectidforalltimes);
964 if (!empty($projectstatic->socid)) {
965 $projectstatic->fetch_thirdparty();
967 $res = $projectstatic->fetch_optionals();
968 } elseif (
$object->fetch($id, $ref) > 0) {
972 $result = $projectstatic->fetch(
$object->fk_project);
973 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
974 $projectstatic->fetchComments();
976 if (!empty($projectstatic->socid)) {
977 $projectstatic->fetch_thirdparty();
979 $res = $projectstatic->fetch_optionals();
981 $object->project = clone $projectstatic;
984 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
985 $linktocreatetime =
'';
987 if ($projectstatic->id > 0) {
990 if (empty($id) || $tab ==
'timespent') {
997 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
1001 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1003 $morehtmlref =
'<div class="refidno">';
1005 $morehtmlref .= $projectstatic->title;
1007 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1008 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1010 $morehtmlref .=
'</div>';
1013 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1014 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1015 $projectstatic->next_prev_filter =
"rowid:IN:" .
$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1018 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1020 print
'<div class="fichecenter">';
1021 print
'<div class="fichehalfleft">';
1022 print
'<div class="underbanner clearboth"></div>';
1024 print
'<table class="border tableforfield centpercent">';
1028 print
'<tr><td class="tdtop">';
1029 print $langs->trans(
"Usage");
1033 print
'<input type="checkbox" disabled name="usage_opportunity"' . (
GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1034 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1035 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1039 print
'<input type="checkbox" disabled name="usage_task"' . (
GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1040 $htmltext = $langs->trans(
"ProjectFollowTasks");
1041 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1045 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"' :
'')) .
'"> ';
1046 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1047 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1051 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"' :
'')) .
'"> ';
1052 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1053 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1059 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1060 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1061 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1066 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1068 print($start ? $start :
'?');
1071 print($end ? $end :
'?');
1072 if ($projectstatic->hasDelay()) {
1078 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1079 if ($projectstatic->public) {
1080 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1081 print $langs->trans(
'SharedProject');
1083 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1084 print $langs->trans(
'PrivateProject');
1092 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1098 print
'<div class="fichehalfright">';
1099 print
'<div class="underbanner clearboth"></div>';
1101 print
'<table class="border tableforfield centpercent">';
1105 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1106 print $form->showCategories($projectstatic->id,
'project', 1);
1111 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1112 if ($projectstatic->description) {
1113 print
'<tr><td class="nottitleforfield" colspan="2">';
1114 print
'<div class="longmessagecut">';
1125 print
'<div class="clearboth"></div>';
1133 $linktocreatetimeBtnStatus = 0;
1134 $linktocreatetimeUrl =
'';
1135 $linktocreatetimeHelpText =
'';
1136 if ($user->hasRight(
'projet',
'time')) {
1137 if ($projectstatic->public || $userRead > 0) {
1138 $linktocreatetimeBtnStatus = 1;
1140 if (!empty($projectidforalltimes)) {
1142 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1143 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1146 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1147 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1150 $linktocreatetimeBtnStatus = -2;
1151 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1154 $linktocreatetimeBtnStatus = -2;
1155 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1158 $paramsbutton = array(
'morecss' =>
'reposition');
1159 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1162 $massactionbutton =
'';
1163 $arrayofmassactions = array();
1165 if ($projectstatic->id > 0) {
1167 if ($projectstatic->usage_bill_time) {
1168 $arrayofmassactions = array(
1169 'generateinvoice' => $langs->trans(
"GenerateBill"),
1173 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1174 $langs->load(
"interventions");
1175 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1178 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1179 $arrayofmassactions = array();
1181 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1188 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1190 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1192 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1193 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1195 if ($action ==
'deleteline') {
1196 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1197 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1200 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1201 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1202 $object->next_prev_filter =
"fk_projet:IN:" .
$db->sanitize($projectsListId);
1204 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1210 if (empty($withproject)) {
1211 $morehtmlref .=
'<div class="refidno">';
1212 $morehtmlref .= $langs->trans(
"Project") .
': ';
1213 $morehtmlref .= $projectstatic->getNomUrl(1);
1214 $morehtmlref .=
'<br>';
1217 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1218 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1219 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1221 $morehtmlref .=
'</div>';
1224 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1226 print
'<div class="fichecenter">';
1227 print
'<div class="fichehalfleft">';
1229 print
'<div class="underbanner clearboth"></div>';
1230 print
'<table class="border centpercent tableforfield">';
1233 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1234 if (
$object->fk_task_parent > 0) {
1236 $tasktmp->fetch(
$object->fk_task_parent);
1237 print $tasktmp->getNomUrl(1);
1242 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1244 print($start ? $start :
'?');
1247 print($end ? $end :
'?');
1254 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1255 if (
$object->planned_workload) {
1263 print
'<div class="fichehalfright">';
1265 print
'<div class="underbanner clearboth"></div>';
1266 print
'<table class="border tableforfield centpercent">';
1269 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1274 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1275 if (
$object->planned_workload) {
1276 $tmparray =
$object->getSummaryOfTimeSpent();
1277 if ($tmparray[
'total_duration'] > 0) {
1278 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1283 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1294 print
'<div class="clearboth"></div>';
1298 if ($action ==
'deleteline') {
1299 $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;
1300 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1305 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1306 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1307 if (empty($reshook)) {
1308 $formconfirm .= $hookmanager->resPrint;
1309 } elseif ($reshook > 0) {
1310 $formconfirm = $hookmanager->resPrint;
1314 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1316 $hookmanager->initHooks(array(
'tasktimelist'));
1322 $arrayfields = array();
1323 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1324 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1325 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1326 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1327 if (! empty($allprojectforuser)) {
1328 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1329 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1331 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1332 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1334 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1335 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1336 $arrayfields[
't.tms'] = array(
'label' => $langs->trans(
"DateModification"),
'checked' =>
'0');
1337 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1338 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1340 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1341 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'0',
'enabled' => (
string) (
int) (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1342 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1343 $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));
1345 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1350 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1351 $param .=
'&contextpage=' . urlencode($contextpage);
1353 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1354 $param .=
'&limit='.((int) $limit);
1357 $param .=
'&id='.((int) $id);
1359 if ($search_month > 0) {
1360 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1362 if ($search_year > 0) {
1363 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1365 if (!empty($search_user)) {
1366 $param .=
'&search_user='.urlencode($search_user);
1368 if ($search_task_ref !=
'') {
1369 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1371 if ($search_company !=
'') {
1372 $param .=
'&search_company=' . urlencode($search_company);
1374 if ($search_company_alias !=
'') {
1375 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1377 if ($search_project_ref !=
'') {
1378 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1380 if ($search_project_label !=
'') {
1381 $param .=
'&search_project_label=' . urlencode($search_project_label);
1383 if ($search_task_label !=
'') {
1384 $param .=
'&search_task_label=' . urlencode($search_task_label);
1386 if ($search_note !=
'') {
1387 $param .=
'&search_note=' . urlencode($search_note);
1389 if ($search_duration !=
'') {
1390 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1392 if ($optioncss !=
'') {
1393 $param .=
'&optioncss=' . urlencode($optioncss);
1395 if ($search_date_startday) {
1396 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1398 if ($search_date_startmonth) {
1399 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1401 if ($search_date_startyear) {
1402 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1404 if ($search_date_endday) {
1405 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1407 if ($search_date_endmonth) {
1408 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1410 if ($search_date_endyear) {
1411 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1413 if ($search_timespent_starthour) {
1414 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1416 if ($search_timespent_startmin) {
1417 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1419 if ($search_timespent_endhour) {
1420 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1422 if ($search_timespent_endmin) {
1423 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1430 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1433 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1436 $parameters = array(
'param' => &$param);
1437 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1438 $param .= $hookmanager->resPrint;
1440 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1441 if ($optioncss !=
'') {
1442 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1444 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1445 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1446 if ($action ==
'editline') {
1447 print
'<input type="hidden" name="action" value="updateline">';
1448 } elseif ($action ==
'splitline') {
1449 print
'<input type="hidden" name="action" value="updatesplitline">';
1450 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1451 print
'<input type="hidden" name="action" value="addtimespent">';
1452 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1453 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1454 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1455 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1457 print
'<input type="hidden" name="action" value="list">';
1459 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1460 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1464 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1465 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1466 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1467 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1468 print
'<input type="hidden" name="page_y" value="">';
1471 if ($massaction ==
'generateinvoice') {
1472 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1473 print
'<table class="noborder centerpercent">';
1475 print
'<td class="titlefield">';
1476 print $langs->trans(
'DateInvoice');
1479 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1485 print $langs->trans(
'Mode');
1489 'onelineperuser' =>
'OneLinePerUser',
1490 'onelinepertask' =>
'OneLinePerTask',
1491 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1493 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1494 print
"\n" .
'<script type="text/javascript">';
1496 $(document).ready(function () {
1497 setDetailVisibility();
1498 $("#generateinvoicemode").change(function() {
1499 setDetailVisibility();
1501 function setDetailVisibility() {
1502 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1503 if (generateinvoicemode=="onelineperperiod") {
1504 $("#detail_time_duration").show();
1506 $("#detail_time_duration").hide();
1511 print
'</script>' .
"\n";
1512 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1519 print $langs->trans(
'ServiceToUseOnLines');
1522 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1527 print
'<td class="titlefield">';
1528 print $langs->trans(
'InvoiceToUse');
1531 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1535 print
'<td class="titlefield">';
1536 print $langs->trans(
"CustomerRelativeDiscount");
1539 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1542 print
'<tr class="newinvoicedetail">';
1543 print
'<td class="titlefield">';
1544 print $langs->trans(
"PaymentConditions");
1547 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1561 print
'<div class="center">';
1562 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1563 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1567 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1568 print
'<div class="center">';
1569 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1573 } elseif ($massaction ==
'generateinter') {
1575 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1577 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1579 print
'<table class="noborder centpercent">';
1581 print
'<td class="titlefield">';
1582 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1586 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1591 print
'<div class="center">';
1592 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1593 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1597 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1598 print
'<div class="center">';
1599 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1606 $parameters = array(
1607 'toselect' => $toselect,
1608 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1611 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1615 print $hookmanager->resPrint;
1623 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1624 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1627 if ($projectstatic->usage_bill_time) {
1628 $arrayfields[
'valuebilled'][
'checked'] = 1;
1631 $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,";
1632 $sql .=
" t.fk_product, t.import_key, t.datec, t.tms,";
1633 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet,";
1634 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1635 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1636 $sql .=
" p.fk_soc,s.name_alias,";
1637 $sql .=
" t.invoice_line_id,";
1638 $sql .=
" pt.billable";
1640 $parameters = array();
1641 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1642 $sql .= $hookmanager->resPrint;
1643 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1647 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1648 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1649 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1650 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1651 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1652 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1653 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1654 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1657 $parameters = array();
1658 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1659 $sql .= $hookmanager->resPrint;
1660 $sql .=
" WHERE elementtype = 'task'";
1661 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1662 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1666 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1667 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1669 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1671 $sql .=
" AND t.fk_element =".((int)
$object->id);
1672 } elseif (!empty($projectidforalltimes)) {
1674 $sql .=
" AND pt.fk_projet IN (" .
$db->sanitize((
string) $projectidforalltimes) .
")";
1675 } elseif (!empty($allprojectforuser)) {
1677 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1678 $search_user = $user->id;
1680 if ($search_user > 0) {
1681 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1688 if ($search_task_ref) {
1691 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1692 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1694 if ($search_company) {
1697 if ($search_company_alias) {
1701 if ($search_project_ref) {
1704 if ($search_project_label) {
1707 if ($search_task_label) {
1710 if ($search_user > 0) {
1713 if (!empty($search_product_ref)) {
1716 if ($search_valuebilled ==
'1') {
1717 $sql .=
' AND t.invoice_id > 0';
1719 if ($search_valuebilled ==
'0') {
1720 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1723 if ($search_date_start) {
1724 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1726 if ($search_date_end) {
1727 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1730 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1731 if ($search_timespent_starthour || $search_timespent_startmin) {
1732 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1733 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1734 $sql .=
" AND t.element_duration >= " . ((int) $timespent_duration_start);
1737 if ($search_timespent_endhour || $search_timespent_endmin) {
1738 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1739 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1740 $sql .=
" AND t.element_duration <= " . ((int) $timespent_duration_end);
1744 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1747 $parameters = array();
1748 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1749 $sql .= $hookmanager->resPrint;
1752 $nbtotalofrecords =
'';
1755 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1756 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1757 $resql =
$db->query($sqlforcount);
1759 $objforcount =
$db->fetch_object($resql);
1760 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1765 if (($page * $limit) > (
int) $nbtotalofrecords) {
1773 $sql .=
$db->order($sortfield, $sortorder);
1775 $sql .=
$db->plimit($limit + 1, $offset);
1778 $resql =
$db->query($sql);
1784 $num =
$db->num_rows($resql);
1787 if (!empty($projectidforalltimes)) {
1788 print
'<!-- List of time spent for project -->' .
"\n";
1790 $title = $langs->trans(
"ListTaskTimeUserProject");
1792 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1794 print
'<!-- List of time spent -->' .
"\n";
1796 $title = $langs->trans(
"ListTaskTimeForTask");
1798 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1803 $obj =
$db->fetch_object($resql);
1817 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1818 print
'<!-- table to add time spent -->' .
"\n";
1820 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1823 print
'<div class="div-table-responsive-no-min">';
1824 print
'<table class="noborder nohover centpercent">';
1826 print
'<tr class="liste_titre">';
1827 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1828 if (!empty($allprojectforuser)) {
1829 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1832 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1834 print
'<td>' . $langs->trans(
"By") .
'</td>';
1835 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1836 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1837 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1841 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1842 print
'<td>'.$langs->trans(
"Product").
'</td>';
1846 $parameters = array(
'mode' =>
'create');
1847 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1848 print $hookmanager->resPrint;
1852 print
'<tr class="oddeven nohover">';
1855 print
'<td class="maxwidthonsmartphone">';
1857 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1860 if (!empty($allprojectforuser)) {
1869 print
'<td class="maxwidthonsmartphone">';
1870 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1875 print
'<td class="maxwidthonsmartphone nowraponall">';
1876 $contactsofproject = $projectstatic->getListContactId(
'internal');
1877 if (count($contactsofproject) > 0) {
1878 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1879 if (in_array($user->id, $contactsofproject)) {
1880 $userid = $user->id;
1882 $userid = $contactsofproject[0];
1885 if ($projectstatic->public) {
1886 $contactsofproject = array();
1888 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1891 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1898 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1902 print
'<td class="nowraponall">';
1903 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1905 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1907 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1911 print
'<td class="nowrap">';
1912 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1920 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1921 print
'<td class="nowraponall">';
1923 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);
1929 $parameters = array(
'mode' =>
'create');
1930 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1931 print $hookmanager->resPrint;
1933 print
'<td class="center">';
1934 $form->buttonsSaveCancel();
1935 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1936 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1945 $moreforfilter =
'';
1947 $parameters = array();
1948 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1949 if (empty($reshook)) {
1950 $moreforfilter .= $hookmanager->resPrint;
1952 $moreforfilter = $hookmanager->resPrint;
1955 if (!empty($moreforfilter)) {
1956 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1957 print $moreforfilter;
1961 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1962 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1963 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1966 if ($projectstatic->usage_bill_time) {
1967 $arrayfields[
'valuebilled'][
'checked'] = 1;
1970 print
'<!-- Liste of time spent -->'.
"\n";
1971 print
'<div class="div-table-responsive">';
1972 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1976 print
'<tr class="liste_titre_filter">';
1978 if (
$conf->main_checkbox_left_column) {
1979 print
'<td class="liste_titre center">';
1980 $searchpicto = $form->showFilterButtons(
'left');
1985 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1986 print
'<td class="liste_titre left">';
1987 print
'<div class="nowrapfordate paddingright">';
1988 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1990 print
'<div class="nowrapfordate">';
1991 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1996 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1997 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
2001 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2002 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
2005 if (!empty($allprojectforuser)) {
2006 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2007 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2009 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2010 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2014 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2015 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2016 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2018 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2019 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2023 if (!empty($arrayfields[
'author'][
'checked'])) {
2024 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>';
2027 if (!empty($arrayfields[
't.note'][
'checked'])) {
2028 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2031 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2032 print
'<td class="liste_titre"></td>';
2035 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2037 print
'<td class="liste_titre right">';
2039 $durationtouse_start =
'';
2040 if ($search_timespent_starthour || $search_timespent_startmin) {
2041 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2043 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'fromhour') .
'</span> ';
2044 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2047 $durationtouse_end =
'';
2048 if ($search_timespent_endhour || $search_timespent_endmin) {
2049 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2051 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'tohour') .
'</span> ';
2052 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2058 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2059 print
'<td class="liste_titre"></td>';
2062 if (!empty($arrayfields[
'value'][
'checked'])) {
2063 print
'<td class="liste_titre"></td>';
2066 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2067 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2075 $parameters = array(
'arrayfields' => $arrayfields);
2076 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2077 print $hookmanager->resPrint;
2079 if (!
$conf->main_checkbox_left_column) {
2080 print
'<td class="liste_titre center">';
2081 $searchpicto = $form->showFilterButtons();
2085 print
'</tr>' .
"\n";
2093 print
'<tr class="liste_titre">';
2094 if (
$conf->main_checkbox_left_column) {
2095 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2098 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2099 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2102 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2103 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2106 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2108 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2111 if (!empty($allprojectforuser)) {
2112 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2113 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2116 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2117 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2121 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2122 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2123 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2126 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2127 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2131 if (!empty($arrayfields[
'author'][
'checked'])) {
2132 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2135 if (!empty($arrayfields[
't.note'][
'checked'])) {
2136 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2139 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2140 print_liste_field_titre($arrayfields[
't.tms'][
'label'], $_SERVER[
'PHP_SELF'],
't.tms',
'', $param,
'', $sortfield, $sortorder);
2143 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2144 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2147 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2148 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2152 if (!empty($arrayfields[
'value'][
'checked'])) {
2153 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2156 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2157 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2165 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2166 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2167 print $hookmanager->resPrint;
2168 if (!
$conf->main_checkbox_left_column) {
2169 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2178 $param .=
'&page='.((int) $page);
2180 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2188 foreach ($tasks as $task_time) {
2194 $invoiced = $task_time->invoice_id ? true :
false;
2196 $date1 =
$db->jdate($task_time->element_date);
2197 $date2 =
$db->jdate($task_time->element_datehour);
2201 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2204 if (
$conf->main_checkbox_left_column) {
2205 print
'<td class="center nowraponall">';
2206 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2207 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2209 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2211 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2213 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2214 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2215 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2216 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' :
'').
'">';
2217 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2221 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' :
'') .
'">';
2222 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2226 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' :
'').
'">';
2227 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2230 if ($massactionbutton || $massaction) {
2232 if (in_array($task_time->rowid, $arrayofselected)) {
2238 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2239 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2243 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2244 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2258 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2259 print
'<td class="nowrap">';
2260 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2261 if (empty($task_time->element_date_withhour)) {
2262 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2264 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2267 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2276 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2277 print
'<td class="tdoverflowmax125">';
2278 if ($task_time->fk_soc > 0) {
2279 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2281 $tmpsociete->fetch($task_time->fk_soc);
2282 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2284 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2286 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2295 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2297 if ($task_time->fk_soc > 0) {
2298 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2300 $tmpsociete->fetch($task_time->fk_soc);
2301 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2303 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2305 $valtoshow = $tmpsociete->name_alias;
2307 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2315 if (!empty($allprojectforuser)) {
2317 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2318 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2320 $tmpproject->fetch($task_time->fk_projet);
2321 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2323 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2325 print
'<td class="nowraponall">';
2326 print $tmpproject->getNomUrl(1);
2333 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2334 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2336 $tmpproject->fetch($task_time->fk_projet);
2337 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2339 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2341 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2342 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2345 print $tmpproject->getNomUrl(1,
'', -1);
2355 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2356 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2357 print
'<td class="nowrap">';
2358 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2359 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (
string) $projectstatic->id,
'');
2361 $tasktmp->id = $task_time->fk_element;
2362 $tasktmp->ref = $task_time->ref;
2363 $tasktmp->label = $task_time->label;
2364 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2371 } elseif ($action !==
'createtime') {
2372 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2376 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2377 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2378 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2379 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2382 $tasktmp->id = $task_time->fk_element;
2383 $tasktmp->ref = $task_time->ref;
2384 $tasktmp->label = $task_time->label;
2385 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2395 if (!empty($arrayfields[
'author'][
'checked'])) {
2396 print
'<td class="tdoverflowmax125">';
2397 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2400 $object->fetch($task_time->fk_element);
2402 $contactsoftask =
$object->getListContactId(
'internal');
2403 if (!in_array($task_time->fk_user, $contactsoftask)) {
2404 $contactsoftask[] = $task_time->fk_user;
2406 if (count($contactsoftask) > 0) {
2407 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2408 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2410 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2413 $userstatic->id = $task_time->fk_user;
2414 $userstatic->lastname = $task_time->lastname;
2415 $userstatic->firstname = $task_time->firstname;
2416 $userstatic->photo = $task_time->photo;
2417 $userstatic->gender = $task_time->gender;
2418 $userstatic->status = $task_time->user_status;
2420 print $userstatic->getNomUrl(-1);
2429 if (!empty($arrayfields[
't.note'][
'checked'])) {
2430 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2431 print
'<td class="small">';
2432 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2435 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2442 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2443 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2447 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2448 print
'<td class="nowraponall">';
2457 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2458 print
'<td class="right nowraponall">';
2459 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2460 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2461 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2472 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2473 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2475 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2481 $totalarray[
'totalduration'] = $task_time->element_duration;
2483 $totalarray[
'totalduration'] += $task_time->element_duration;
2488 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2489 print
'<td class="nowraponall">';
2490 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2492 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);
2493 } elseif (!empty($task_time->fk_product)) {
2495 $resultFetch = $product->fetch($task_time->fk_product);
2496 if ($resultFetch < 0) {
2499 print $product->getNomUrl(1);
2509 if (!empty($arrayfields[
'value'][
'checked'])) {
2510 $langs->load(
"salaries");
2511 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2513 print
'<td class="nowraponall right">';
2514 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2515 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2540 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2541 print
'<td class="center">';
2543 if ($projectstatic->usage_bill_time) {
2544 if ($task_time->invoice_id) {
2545 $result = $tmpinvoice->fetch($task_time->invoice_id);
2547 if ($user->hasRight(
'facture',
'lire')) {
2548 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2549 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2551 print $tmpinvoice->getNomUrl(1);
2552 if (!empty($task_time->invoice_line_id)) {
2554 $invoiceLine->fetch($task_time->invoice_line_id);
2555 if (!empty($invoiceLine->id)) {
2556 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2557 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2563 print $langs->trans(
"Yes");
2568 if (intval($task_time->billable) == 1) {
2569 print $langs->trans(
"No");
2571 print $langs->trans(
"Disabled");
2575 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2590 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2591 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2592 print $hookmanager->resPrint;
2595 if (!
$conf->main_checkbox_left_column) {
2596 print
'<td class="center nowraponall">';
2597 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2598 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2599 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2601 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2602 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2603 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2604 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' :
'').
'">';
2605 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2609 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' :
'') .
'">';
2610 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2614 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' :
'').
'">';
2615 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2618 if ($massactionbutton || $massaction) {
2620 if (in_array($task_time->rowid, $arrayofselected)) {
2626 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2627 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2631 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2632 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2650 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2651 print
'<!-- first line -->';
2652 print
'<tr class="oddeven">';
2655 if (
$conf->main_checkbox_left_column) {
2660 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2661 print
'<td class="nowrap">';
2662 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2663 if (empty($task_time->element_date_withhour)) {
2664 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2666 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2669 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2675 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2676 print
'<td class="nowrap">';
2681 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2682 print
'<td class="nowrap">';
2687 if (!empty($allprojectforuser)) {
2688 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2689 print
'<td class="nowrap">';
2695 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2696 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2697 print
'<td class="nowrap">';
2698 $tasktmp->id = $task_time->fk_element;
2699 $tasktmp->ref = $task_time->ref;
2700 $tasktmp->label = $task_time->label;
2701 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2707 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2708 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2709 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2716 if (!empty($arrayfields[
'author'][
'checked'])) {
2717 print
'<td class="nowraponall">';
2718 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2720 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2723 $contactsoftask =
$object->getListContactId(
'internal');
2724 if (!in_array($task_time->fk_user, $contactsoftask)) {
2725 $contactsoftask[] = $task_time->fk_user;
2727 if (count($contactsoftask) > 0) {
2728 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2729 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2731 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2734 $userstatic->id = $task_time->fk_user;
2735 $userstatic->lastname = $task_time->lastname;
2736 $userstatic->firstname = $task_time->firstname;
2737 $userstatic->photo = $task_time->photo;
2738 $userstatic->status = $task_time->user_status;
2739 print $userstatic->getNomUrl(-1);
2745 if (!empty($arrayfields[
't.note'][
'checked'])) {
2746 print
'<td class="tdoverflowmax300">';
2747 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2748 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2753 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2754 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2758 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2759 print
'<td class="nowraponall">';
2764 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2765 print
'<td class="right">';
2766 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2767 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2768 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2776 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2777 print
'<td class="nowraponall tdoverflowmax125">';
2782 if (!empty($arrayfields[
'value'][
'checked'])) {
2783 print
'<td class="right">';
2784 print
'<span class="amount">';
2785 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2786 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2792 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2793 print
'<td class="right">';
2794 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2795 if (isset($task_time->total_ht)) {
2796 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2807 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2808 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2809 print $hookmanager->resPrint;
2812 if (!
$conf->main_checkbox_left_column) {
2813 print
'<td class="center nowraponall">';
2822 print
'<!-- second line --><tr class="oddeven">';
2825 if (
$conf->main_checkbox_left_column) {
2826 print
'<td class="center nowraponall">';
2831 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2832 print
'<td class="nowraponall">';
2833 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2834 if (empty($task_time->element_date_withhour)) {
2835 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2837 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2840 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2846 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2852 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2858 if (!empty($allprojectforuser)) {
2859 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2866 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2867 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2868 print
'<td class="nowraponall">';
2869 $tasktmp->id = $task_time->fk_element;
2870 $tasktmp->ref = $task_time->ref;
2871 $tasktmp->label = $task_time->label;
2872 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2878 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2879 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2880 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2887 if (!empty($arrayfields[
'author'][
'checked'])) {
2888 print
'<td class="nowraponall tdoverflowmax100">';
2889 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2891 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2894 $contactsoftask =
$object->getListContactId(
'internal');
2895 if (!in_array($task_time->fk_user, $contactsoftask)) {
2896 $contactsoftask[] = $task_time->fk_user;
2898 if (count($contactsoftask) > 0) {
2899 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2900 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2902 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2905 $userstatic->id = $task_time->fk_user;
2906 $userstatic->lastname = $task_time->lastname;
2907 $userstatic->firstname = $task_time->firstname;
2908 $userstatic->photo = $task_time->photo;
2909 $userstatic->status = $task_time->user_status;
2910 print $userstatic->getNomUrl(-1);
2916 if (!empty($arrayfields[
't.note'][
'checked'])) {
2917 print
'<td class="small tdoverflowmax300"">';
2918 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2919 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2924 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2925 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2929 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2930 print
'<td class="nowraponall">';
2936 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2937 print
'<td class="right">';
2938 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2939 print
'<input type="hidden" name="old_duration_2" value="0">';
2940 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2948 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2949 print
'<td class="nowraponall tdoverflowmax125">';
2954 if (!empty($arrayfields[
'value'][
'checked'])) {
2955 print
'<td class="right">';
2956 print
'<span class="amount nowraponall">';
2958 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2965 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2966 print
'<td class="right">';
2967 if (isset($task_time->total_ht)) {
2968 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2969 print
'<span class="amount nowraponall small">';
2970 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2982 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2983 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2984 print $hookmanager->resPrint;
2987 if (!
$conf->main_checkbox_left_column) {
2988 print
'<td class="center nowraponall">';
3001 print
'<tr class="liste_total">';
3006 if ($num < $limit && empty($offset)) {
3007 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
3009 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
3023 if (!count($tasks)) {
3024 $totalnboffields = 1;
3025 foreach ($arrayfields as $value) {
3026 if (!empty($value[
'checked'])) {
3030 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
3031 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
3035 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
3036 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
3037 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.
$date_start
Variables from include:
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.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
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.
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'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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.