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;
317 if (GETPOSTISSET(
"userid_line")) {
325 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
326 $result =
$object->updateTimeSpent($user);
339 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
344 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
347 $object->timespent_withhour = 1;
348 } elseif (!empty($timespent_date)) {
349 $object->timespent_date = $timespent_date;
350 $object->timespent_datehour = $timespent_date;
351 $object->timespent_withhour = 0;
355 if (GETPOSTISSET(
"userid_line")) {
364 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
365 $result =
$object->updateTimeSpent($user);
380if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
383 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
384 $result =
$object->delTimeSpent($user);
387 $langs->load(
"errors");
398if (!empty($project_ref) && !empty($withproject)) {
399 if ($projectstatic->fetch(0, $project_ref) > 0) {
400 $tasksarray =
$object->getTasksArray(
null,
null, $projectstatic->id, $socid, 0);
401 if (count($tasksarray) > 0) {
402 $id = $tasksarray[0]->id;
404 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
411$projectidforalltimes = 0;
413 $projectidforalltimes =
GETPOSTINT(
'projectid');
415 $result = $projectstatic->fetch($projectidforalltimes);
416 if (!empty($projectstatic->socid)) {
417 $projectstatic->fetch_thirdparty();
419 $res = $projectstatic->fetch_optionals();
420} elseif (
GETPOST(
'project_ref',
'alpha')) {
421 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
422 $projectidforalltimes = $projectstatic->id;
426 $result = $projectstatic->fetch(
$object->fk_project);
429$allprojectforuser = 0;
431if ($id <= 0 && $projectidforalltimes == 0) {
432 $allprojectforuser = $user->id;
435if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
436 if (!empty($projectstatic->socid)) {
437 $projectstatic->fetch_thirdparty();
440 if (!($projectstatic->thirdparty->id > 0)) {
441 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
443 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
444 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
445 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
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 foreach ($arrayoftasks as $timespent_id => $value) {
643 $userid = $value[
'user'];
647 $qtyhour = $value[
'timespent'] / 3600;
651 $pu_ht =
price2num($value[
'totalvaluetodivideby3600'] / 3600,
'MU');
655 $prodDurationHours = $prodDurationHoursBase;
656 $idprodline = $idprod;
659 $localtax1line = $localtax1;
660 $localtax2line = $localtax2;
662 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
663 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
664 $result = $tmpproduct->fetch($value[
'fk_product']);
669 $prodDurationHours = $tmpproduct->getProductDurationHours();
670 if ($prodDurationHours < 0) {
672 $langs->load(
"errors");
676 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
678 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
679 $txtvaline = $dataforprice[
'tva_tx'];
680 $localtax1line = $dataforprice[
'localtax1'];
681 $localtax2line = $dataforprice[
'localtax2'];
683 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
685 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
686 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
687 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
688 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
689 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
691 $idprodline = $value[
'fk_product'];
697 $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);
705 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
706 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
707 $result =
$db->query($sql);
714 } elseif ($generateinvoicemode ==
'onelinepertask') {
715 $arrayoftasks = array();
716 foreach ($toselect as $key => $value) {
718 $object->fetchTimeSpent($value);
720 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
721 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
724 foreach ($arrayoftasks as $task_id => $data) {
726 $ftask->fetch($task_id);
728 foreach ($data as $fk_product => $timespent_data) {
729 $qtyhour = $timespent_data[
'timespent'] / 3600;
733 $prodDurationHours = $prodDurationHoursBase;
734 $idprodline = $idprod;
737 $localtax1line = $localtax1;
738 $localtax2line = $localtax2;
740 if (!empty($fk_product) && $fk_product !== $idprod) {
741 if (!array_key_exists($fk_product, $product_data_cache)) {
742 $result = $tmpproduct->fetch($fk_product);
747 $prodDurationHours = $tmpproduct->getProductDurationHours();
748 if ($prodDurationHours < 0) {
750 $langs->load(
"errors");
754 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
756 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
757 $txtvaline = $dataforprice[
'tva_tx'];
758 $localtax1line = $dataforprice[
'localtax1'];
759 $localtax2line = $dataforprice[
'localtax2'];
761 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
763 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
764 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
765 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
766 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
767 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
769 $idprodline = $fk_product;
773 if ($idprodline > 0) {
775 $pu_ht_for_task = $pu_htline;
778 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
780 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
786 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
788 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
794 $lineName = $ftask->ref .
' - ' . $ftask->label;
795 $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);
804 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
805 $sql .=
' WHERE rowid IN (' .
$db->sanitize(implode(
',', $toselect)) .
')';
806 $result =
$db->query($sql);
819 $urltoinvoice = $tmpinvoice->getNomUrl(0);
820 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
821 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
831if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
832 $langs->load(
'interventions');
834 if (!empty($projectstatic->socid)) {
835 $projectstatic->fetch_thirdparty();
838 if (!($projectstatic->thirdparty->id > 0)) {
839 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
841 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
842 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
843 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
846 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
855 $tmpinter->socid = $projectstatic->thirdparty->id;
857 $tmpinter->fk_project = $projectstatic->id;
858 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
861 $tmpinter->fetch($interToUse);
863 $result = $tmpinter->create($user);
871 $arrayoftasks = array();
872 foreach ($toselect as $key => $value) {
874 $object->fetchTimeSpent($value);
877 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
878 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
879 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
880 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
883 foreach ($arrayoftasks as $timespent_id => $value) {
885 $ftask->fetch($value[
'id']);
887 $qtyhour = $value[
'timespent'] / 3600;
891 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
896 $timespent->fetch($timespent_id);
897 $timespent->intervention_id = $tmpinter->id;
898 $timespent->intervention_line_id = $lineid;
899 $result = $timespent->update($user);
909 $urltointer = $tmpinter->getNomUrl(0);
910 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
911 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
933$arrayofselected = is_array($toselect) ? $toselect : array();
935$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
936if (!empty($withproject)) {
937 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
941llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
944$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
946 $param .=
'&search_user=' . ((int) $search_user);
949 $param .=
'&search_month=' . ((int) $search_month);
952 $param .=
'&search_year=' . ((int) $search_year);
956if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
958 if ($projectidforalltimes > 0) {
959 $result = $projectstatic->fetch($projectidforalltimes);
960 if (!empty($projectstatic->socid)) {
961 $projectstatic->fetch_thirdparty();
963 $res = $projectstatic->fetch_optionals();
964 } elseif (
$object->fetch($id, $ref) > 0) {
968 $result = $projectstatic->fetch(
$object->fk_project);
969 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
970 $projectstatic->fetchComments();
972 if (!empty($projectstatic->socid)) {
973 $projectstatic->fetch_thirdparty();
975 $res = $projectstatic->fetch_optionals();
977 $object->project = clone $projectstatic;
980 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
981 $linktocreatetime =
'';
983 if ($projectstatic->id > 0) {
986 if (empty($id) || $tab ==
'timespent') {
993 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
997 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
999 $morehtmlref =
'<div class="refidno">';
1001 $morehtmlref .= $projectstatic->title;
1003 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1004 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1006 $morehtmlref .=
'</div>';
1009 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1010 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1011 $projectstatic->next_prev_filter =
"rowid:IN:" .
$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1014 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1016 print
'<div class="fichecenter">';
1017 print
'<div class="fichehalfleft">';
1018 print
'<div class="underbanner clearboth"></div>';
1020 print
'<table class="border tableforfield centpercent">';
1024 print
'<tr><td class="tdtop">';
1025 print $langs->trans(
"Usage");
1029 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1030 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1031 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1035 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1036 $htmltext = $langs->trans(
"ProjectFollowTasks");
1037 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1041 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"' :
'')) .
'"> ';
1042 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1043 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1047 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"' :
'')) .
'"> ';
1048 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1049 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1055 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1056 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1057 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1062 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1064 print($start ? $start :
'?');
1067 print($end ? $end :
'?');
1068 if ($projectstatic->hasDelay()) {
1074 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1075 if ($projectstatic->public) {
1076 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1077 print $langs->trans(
'SharedProject');
1079 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1080 print $langs->trans(
'PrivateProject');
1088 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1094 print
'<div class="fichehalfright">';
1095 print
'<div class="underbanner clearboth"></div>';
1097 print
'<table class="border tableforfield centpercent">';
1101 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1102 print $form->showCategories($projectstatic->id,
'project', 1);
1107 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1108 if ($projectstatic->description) {
1109 print
'<tr><td class="nottitleforfield" colspan="2">';
1110 print
'<div class="longmessagecut">';
1121 print
'<div class="clearboth"></div>';
1129 $linktocreatetimeBtnStatus = 0;
1130 $linktocreatetimeUrl =
'';
1131 $linktocreatetimeHelpText =
'';
1132 if ($user->hasRight(
'projet',
'time')) {
1133 if ($projectstatic->public || $userRead > 0) {
1134 $linktocreatetimeBtnStatus = 1;
1136 if (!empty($projectidforalltimes)) {
1138 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1139 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' . newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1142 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1143 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' . newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1146 $linktocreatetimeBtnStatus = -2;
1147 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1150 $linktocreatetimeBtnStatus = -2;
1151 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1154 $paramsbutton = array(
'morecss' =>
'reposition');
1155 $linktocreatetime = dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1158 $massactionbutton =
'';
1159 $arrayofmassactions = array();
1161 if ($projectstatic->id > 0) {
1163 if ($projectstatic->usage_bill_time) {
1164 $arrayofmassactions = array(
1165 'generateinvoice' => $langs->trans(
"GenerateBill"),
1169 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1170 $langs->load(
"interventions");
1171 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1174 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1175 $arrayofmassactions = array();
1177 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1184 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1186 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1188 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1189 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1191 if ($action ==
'deleteline') {
1192 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1193 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1196 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1197 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1198 $object->next_prev_filter =
"fk_projet:IN:" .
$db->sanitize($projectsListId);
1200 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1206 if (empty($withproject)) {
1207 $morehtmlref .=
'<div class="refidno">';
1208 $morehtmlref .= $langs->trans(
"Project") .
': ';
1209 $morehtmlref .= $projectstatic->getNomUrl(1);
1210 $morehtmlref .=
'<br>';
1213 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1214 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1215 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1217 $morehtmlref .=
'</div>';
1220 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1222 print
'<div class="fichecenter">';
1223 print
'<div class="fichehalfleft">';
1225 print
'<div class="underbanner clearboth"></div>';
1226 print
'<table class="border centpercent tableforfield">';
1229 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1230 if (
$object->fk_task_parent > 0) {
1232 $tasktmp->fetch(
$object->fk_task_parent);
1233 print $tasktmp->getNomUrl(1);
1238 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1240 print($start ? $start :
'?');
1243 print($end ? $end :
'?');
1250 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1251 if (
$object->planned_workload) {
1259 print
'<div class="fichehalfright">';
1261 print
'<div class="underbanner clearboth"></div>';
1262 print
'<table class="border tableforfield centpercent">';
1265 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1270 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1271 if (
$object->planned_workload) {
1272 $tmparray =
$object->getSummaryOfTimeSpent();
1273 if ($tmparray[
'total_duration'] > 0) {
1274 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1279 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1290 print
'<div class="clearboth"></div>';
1294 if ($action ==
'deleteline') {
1295 $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;
1296 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1301 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1302 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1303 if (empty($reshook)) {
1304 $formconfirm .= $hookmanager->resPrint;
1305 } elseif ($reshook > 0) {
1306 $formconfirm = $hookmanager->resPrint;
1310 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1312 $hookmanager->initHooks(array(
'tasktimelist'));
1318 $arrayfields = array();
1319 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1320 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1321 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1322 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1323 if (! empty($allprojectforuser)) {
1324 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1325 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1327 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1328 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1330 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1331 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1332 $arrayfields[
't.tms'] = array(
'label' => $langs->trans(
"DateModification"),
'checked' =>
'0');
1333 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1334 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1336 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1337 $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));
1338 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1339 $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));
1341 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1346 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1347 $param .=
'&contextpage=' . urlencode($contextpage);
1349 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1350 $param .=
'&limit='.((int) $limit);
1353 $param .=
'&id='.((int) $id);
1355 if ($search_month > 0) {
1356 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1358 if ($search_year > 0) {
1359 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1361 if (!empty($search_user)) {
1362 $param .=
'&search_user='.urlencode($search_user);
1364 if ($search_task_ref !=
'') {
1365 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1367 if ($search_company !=
'') {
1368 $param .=
'&search_company=' . urlencode($search_company);
1370 if ($search_company_alias !=
'') {
1371 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1373 if ($search_project_ref !=
'') {
1374 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1376 if ($search_project_label !=
'') {
1377 $param .=
'&search_project_label=' . urlencode($search_project_label);
1379 if ($search_task_label !=
'') {
1380 $param .=
'&search_task_label=' . urlencode($search_task_label);
1382 if ($search_note !=
'') {
1383 $param .=
'&search_note=' . urlencode($search_note);
1385 if ($search_duration !=
'') {
1386 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1388 if ($optioncss !=
'') {
1389 $param .=
'&optioncss=' . urlencode($optioncss);
1391 if ($search_date_startday) {
1392 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1394 if ($search_date_startmonth) {
1395 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1397 if ($search_date_startyear) {
1398 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1400 if ($search_date_endday) {
1401 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1403 if ($search_date_endmonth) {
1404 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1406 if ($search_date_endyear) {
1407 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1409 if ($search_timespent_starthour) {
1410 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1412 if ($search_timespent_startmin) {
1413 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1415 if ($search_timespent_endhour) {
1416 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1418 if ($search_timespent_endmin) {
1419 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1426 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1429 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1432 $parameters = array(
'param' => &$param);
1433 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1434 $param .= $hookmanager->resPrint;
1436 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1437 if ($optioncss !=
'') {
1438 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1440 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
1441 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1442 if ($action ==
'editline') {
1443 print
'<input type="hidden" name="action" value="updateline">';
1444 } elseif ($action ==
'splitline') {
1445 print
'<input type="hidden" name="action" value="updatesplitline">';
1446 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1447 print
'<input type="hidden" name="action" value="addtimespent">';
1448 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1449 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1450 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1451 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1453 print
'<input type="hidden" name="action" value="list">';
1455 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1456 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1460 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1461 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1462 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1463 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1464 print
'<input type="hidden" name="page_y" value="">';
1467 if ($massaction ==
'generateinvoice') {
1468 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1469 print
'<table class="noborder centerpercent">';
1471 print
'<td class="titlefield">';
1472 print $langs->trans(
'DateInvoice');
1475 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1481 print $langs->trans(
'Mode');
1485 'onelineperuser' =>
'OneLinePerUser',
1486 'onelinepertask' =>
'OneLinePerTask',
1487 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1489 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1490 print
"\n" .
'<script type="text/javascript">';
1492 $(document).ready(function () {
1493 setDetailVisibility();
1494 $("#generateinvoicemode").change(function() {
1495 setDetailVisibility();
1497 function setDetailVisibility() {
1498 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1499 if (generateinvoicemode=="onelineperperiod") {
1500 $("#detail_time_duration").show();
1502 $("#detail_time_duration").hide();
1507 print
'</script>' .
"\n";
1508 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1515 print $langs->trans(
'ServiceToUseOnLines');
1518 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1523 print
'<td class="titlefield">';
1524 print $langs->trans(
'InvoiceToUse');
1527 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1531 print
'<td class="titlefield">';
1532 print $langs->trans(
"CustomerRelativeDiscount");
1535 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1538 print
'<tr class="newinvoicedetail">';
1539 print
'<td class="titlefield">';
1540 print $langs->trans(
"PaymentConditions");
1543 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1557 print
'<div class="center">';
1558 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1559 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1563 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1564 print
'<div class="center">';
1565 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1569 } elseif ($massaction ==
'generateinter') {
1571 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1573 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1575 print
'<table class="noborder centpercent">';
1577 print
'<td class="titlefield">';
1578 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1582 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1587 print
'<div class="center">';
1588 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1589 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1593 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1594 print
'<div class="center">';
1595 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1602 $parameters = array(
1603 'toselect' => $toselect,
1604 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1607 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1611 print $hookmanager->resPrint;
1619 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1620 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1623 if ($projectstatic->usage_bill_time) {
1624 $arrayfields[
'valuebilled'][
'checked'] = 1;
1627 $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,";
1628 $sql .=
" t.fk_product, t.import_key, t.datec, t.tms,";
1629 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet,";
1630 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1631 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1632 $sql .=
" p.fk_soc,s.name_alias,";
1633 $sql .=
" t.invoice_line_id,";
1634 $sql .=
" pt.billable";
1636 $parameters = array();
1637 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1638 $sql .= $hookmanager->resPrint;
1639 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1643 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1644 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1645 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1646 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1647 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1648 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1649 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1650 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1653 $parameters = array();
1654 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1655 $sql .= $hookmanager->resPrint;
1656 $sql .=
" WHERE elementtype = 'task'";
1657 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1658 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1662 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1663 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1665 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1667 $sql .=
" AND t.fk_element =".((int)
$object->id);
1668 } elseif (!empty($projectidforalltimes)) {
1670 $sql .=
" AND pt.fk_projet IN (" .
$db->sanitize((
string) $projectidforalltimes) .
")";
1671 } elseif (!empty($allprojectforuser)) {
1673 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1674 $search_user = $user->id;
1676 if ($search_user > 0) {
1677 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1684 if ($search_task_ref) {
1687 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1688 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1690 if ($search_company) {
1693 if ($search_company_alias) {
1697 if ($search_project_ref) {
1700 if ($search_project_label) {
1703 if ($search_task_label) {
1706 if ($search_user > 0) {
1709 if (!empty($search_product_ref)) {
1712 if ($search_valuebilled ==
'1') {
1713 $sql .=
' AND t.invoice_id > 0';
1715 if ($search_valuebilled ==
'0') {
1716 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1719 if ($search_date_start) {
1720 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1722 if ($search_date_end) {
1723 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1726 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1727 if ($search_timespent_starthour || $search_timespent_startmin) {
1728 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1729 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1730 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1733 if ($search_timespent_endhour || $search_timespent_endmin) {
1734 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1735 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1736 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1740 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1743 $parameters = array();
1744 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1745 $sql .= $hookmanager->resPrint;
1748 $nbtotalofrecords =
'';
1751 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1752 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1753 $resql =
$db->query($sqlforcount);
1755 $objforcount =
$db->fetch_object($resql);
1756 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1761 if (($page * $limit) > (
int) $nbtotalofrecords) {
1769 $sql .=
$db->order($sortfield, $sortorder);
1771 $sql .=
$db->plimit($limit + 1, $offset);
1774 $resql =
$db->query($sql);
1780 $num =
$db->num_rows($resql);
1783 if (!empty($projectidforalltimes)) {
1784 print
'<!-- List of time spent for project -->' .
"\n";
1786 $title = $langs->trans(
"ListTaskTimeUserProject");
1788 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1790 print
'<!-- List of time spent -->' .
"\n";
1792 $title = $langs->trans(
"ListTaskTimeForTask");
1794 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1799 $obj =
$db->fetch_object($resql);
1813 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1814 print
'<!-- table to add time spent -->' .
"\n";
1816 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1819 print
'<div class="div-table-responsive-no-min">';
1820 print
'<table class="noborder nohover centpercent">';
1822 print
'<tr class="liste_titre">';
1823 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1824 if (!empty($allprojectforuser)) {
1825 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1828 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1830 print
'<td>' . $langs->trans(
"By") .
'</td>';
1831 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1832 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1833 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1837 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1838 print
'<td>'.$langs->trans(
"Product").
'</td>';
1842 $parameters = array(
'mode' =>
'create');
1843 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1844 print $hookmanager->resPrint;
1848 print
'<tr class="oddeven nohover">';
1851 print
'<td class="maxwidthonsmartphone">';
1853 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1856 if (!empty($allprojectforuser)) {
1865 print
'<td class="maxwidthonsmartphone">';
1866 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1871 print
'<td class="maxwidthonsmartphone nowraponall">';
1872 $contactsofproject = $projectstatic->getListContactId(
'internal');
1873 if (count($contactsofproject) > 0) {
1874 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1875 if (in_array($user->id, $contactsofproject)) {
1876 $userid = $user->id;
1878 $userid = $contactsofproject[0];
1881 if ($projectstatic->public) {
1882 $contactsofproject = array();
1884 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1887 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1894 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1898 print
'<td class="nowraponall">';
1899 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1900 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1901 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1903 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1907 print
'<td class="nowrap">';
1908 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1916 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1917 print
'<td class="nowraponall">';
1919 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);
1925 $parameters = array(
'mode' =>
'create');
1926 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1927 print $hookmanager->resPrint;
1929 print
'<td class="center">';
1930 $form->buttonsSaveCancel();
1931 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1932 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1941 $moreforfilter =
'';
1943 $parameters = array();
1944 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1945 if (empty($reshook)) {
1946 $moreforfilter .= $hookmanager->resPrint;
1948 $moreforfilter = $hookmanager->resPrint;
1951 if (!empty($moreforfilter)) {
1952 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1953 print $moreforfilter;
1957 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1958 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1959 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1962 if ($projectstatic->usage_bill_time) {
1963 $arrayfields[
'valuebilled'][
'checked'] = 1;
1966 print
'<!-- Liste of time spent -->'.
"\n";
1967 print
'<div class="div-table-responsive">';
1968 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1972 print
'<tr class="liste_titre_filter">';
1974 if (
$conf->main_checkbox_left_column) {
1975 print
'<td class="liste_titre center">';
1976 $searchpicto = $form->showFilterButtons(
'left');
1981 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1982 print
'<td class="liste_titre left">';
1983 print
'<div class="nowrapfordate paddingright">';
1984 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1986 print
'<div class="nowrapfordate">';
1987 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1992 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1993 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1997 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1998 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
2001 if (!empty($allprojectforuser)) {
2002 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2003 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2005 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2006 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2010 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2011 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2012 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2014 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2015 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2019 if (!empty($arrayfields[
'author'][
'checked'])) {
2020 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>';
2023 if (!empty($arrayfields[
't.note'][
'checked'])) {
2024 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2027 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2028 print
'<td class="liste_titre"></td>';
2031 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2033 print
'<td class="liste_titre right">';
2035 $durationtouse_start =
'';
2036 if ($search_timespent_starthour || $search_timespent_startmin) {
2037 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2039 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'fromhour') .
'</span> ';
2040 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2043 $durationtouse_end =
'';
2044 if ($search_timespent_endhour || $search_timespent_endmin) {
2045 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2047 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'tohour') .
'</span> ';
2048 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2054 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2055 print
'<td class="liste_titre"></td>';
2058 if (!empty($arrayfields[
'value'][
'checked'])) {
2059 print
'<td class="liste_titre"></td>';
2062 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2063 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2071 $parameters = array(
'arrayfields' => $arrayfields);
2072 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2073 print $hookmanager->resPrint;
2075 if (!
$conf->main_checkbox_left_column) {
2076 print
'<td class="liste_titre center">';
2077 $searchpicto = $form->showFilterButtons();
2081 print
'</tr>' .
"\n";
2089 print
'<tr class="liste_titre">';
2090 if (
$conf->main_checkbox_left_column) {
2091 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2094 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2095 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2098 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2099 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2102 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2104 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2107 if (!empty($allprojectforuser)) {
2108 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2109 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2112 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2113 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2117 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2118 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2119 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2122 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2123 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2127 if (!empty($arrayfields[
'author'][
'checked'])) {
2128 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2131 if (!empty($arrayfields[
't.note'][
'checked'])) {
2132 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2135 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2136 print_liste_field_titre($arrayfields[
't.tms'][
'label'], $_SERVER[
'PHP_SELF'],
't.tms',
'', $param,
'', $sortfield, $sortorder);
2139 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2140 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2143 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2144 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2148 if (!empty($arrayfields[
'value'][
'checked'])) {
2149 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2152 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2153 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2161 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2162 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2163 print $hookmanager->resPrint;
2164 if (!
$conf->main_checkbox_left_column) {
2165 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2174 $param .=
'&page='.((int) $page);
2176 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2184 foreach ($tasks as $task_time) {
2190 $invoiced = $task_time->invoice_id ? true :
false;
2192 $date1 =
$db->jdate($task_time->element_date);
2193 $date2 =
$db->jdate($task_time->element_datehour);
2197 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2200 if (
$conf->main_checkbox_left_column) {
2201 print
'<td class="center nowraponall">';
2202 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2203 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2205 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2207 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2209 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2210 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2211 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2212 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' :
'').
'">';
2213 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2217 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' :
'') .
'">';
2218 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2222 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' :
'').
'">';
2223 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2226 if ($massactionbutton || $massaction) {
2228 if (in_array($task_time->rowid, $arrayofselected)) {
2234 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2235 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2239 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2240 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2254 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2255 print
'<td class="nowrap">';
2256 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2257 if (empty($task_time->element_date_withhour)) {
2258 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2260 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2263 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2272 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2273 print
'<td class="tdoverflowmax125">';
2274 if ($task_time->fk_soc > 0) {
2275 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2277 $tmpsociete->fetch($task_time->fk_soc);
2278 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2280 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2282 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2291 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2293 if ($task_time->fk_soc > 0) {
2294 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2296 $tmpsociete->fetch($task_time->fk_soc);
2297 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2299 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2301 $valtoshow = $tmpsociete->name_alias;
2303 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2311 if (!empty($allprojectforuser)) {
2313 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2314 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2316 $tmpproject->fetch($task_time->fk_projet);
2317 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2319 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2321 print
'<td class="nowraponall">';
2322 print $tmpproject->getNomUrl(1);
2329 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2330 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2332 $tmpproject->fetch($task_time->fk_projet);
2333 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2335 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2337 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2338 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2341 print $tmpproject->getNomUrl(1,
'', -1);
2351 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2352 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2353 print
'<td class="nowrap">';
2354 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2355 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (
string) $projectstatic->id,
'');
2357 $tasktmp->id = $task_time->fk_element;
2358 $tasktmp->ref = $task_time->ref;
2359 $tasktmp->label = $task_time->label;
2360 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2367 } elseif ($action !==
'createtime') {
2368 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2372 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2373 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2374 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2375 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2378 $tasktmp->id = $task_time->fk_element;
2379 $tasktmp->ref = $task_time->ref;
2380 $tasktmp->label = $task_time->label;
2381 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2391 if (!empty($arrayfields[
'author'][
'checked'])) {
2392 print
'<td class="tdoverflowmax125">';
2393 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2396 $object->fetch($task_time->fk_element);
2398 $contactsoftask =
$object->getListContactId(
'internal');
2399 if (!in_array($task_time->fk_user, $contactsoftask)) {
2400 $contactsoftask[] = $task_time->fk_user;
2402 if (count($contactsoftask) > 0) {
2403 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2404 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2406 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2409 $userstatic->id = $task_time->fk_user;
2410 $userstatic->lastname = $task_time->lastname;
2411 $userstatic->firstname = $task_time->firstname;
2412 $userstatic->photo = $task_time->photo;
2413 $userstatic->gender = $task_time->gender;
2414 $userstatic->status = $task_time->user_status;
2416 print $userstatic->getNomUrl(-1);
2425 if (!empty($arrayfields[
't.note'][
'checked'])) {
2426 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2427 print
'<td class="small">';
2428 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2431 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2438 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2439 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2443 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2444 print
'<td class="nowraponall">';
2453 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2454 print
'<td class="right nowraponall">';
2455 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2456 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2457 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2468 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2469 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2471 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2477 $totalarray[
'totalduration'] = $task_time->element_duration;
2479 $totalarray[
'totalduration'] += $task_time->element_duration;
2484 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2485 print
'<td class="nowraponall">';
2486 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2488 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);
2489 } elseif (!empty($task_time->fk_product)) {
2491 $resultFetch = $product->fetch($task_time->fk_product);
2492 if ($resultFetch < 0) {
2495 print $product->getNomUrl(1);
2505 if (!empty($arrayfields[
'value'][
'checked'])) {
2506 $langs->load(
"salaries");
2507 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2509 print
'<td class="nowraponall right">';
2510 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2511 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2536 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2537 print
'<td class="center">';
2539 if ($projectstatic->usage_bill_time) {
2540 if ($task_time->invoice_id) {
2541 $result = $tmpinvoice->fetch($task_time->invoice_id);
2543 if ($user->hasRight(
'facture',
'lire')) {
2544 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2545 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2547 print $tmpinvoice->getNomUrl(1);
2548 if (!empty($task_time->invoice_line_id)) {
2550 $invoiceLine->fetch($task_time->invoice_line_id);
2551 if (!empty($invoiceLine->id)) {
2552 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2553 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2559 print $langs->trans(
"Yes");
2564 if (intval($task_time->billable) == 1) {
2565 print $langs->trans(
"No");
2567 print $langs->trans(
"Disabled");
2571 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2586 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2587 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2588 print $hookmanager->resPrint;
2591 if (!
$conf->main_checkbox_left_column) {
2592 print
'<td class="center nowraponall">';
2593 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2594 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2595 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2597 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2598 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2599 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2600 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' :
'').
'">';
2601 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2605 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' :
'') .
'">';
2606 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2610 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' :
'').
'">';
2611 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2614 if ($massactionbutton || $massaction) {
2616 if (in_array($task_time->rowid, $arrayofselected)) {
2622 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2623 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2627 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2628 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2646 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2647 print
'<!-- first line -->';
2648 print
'<tr class="oddeven">';
2651 if (
$conf->main_checkbox_left_column) {
2656 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2657 print
'<td class="nowrap">';
2658 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2659 if (empty($task_time->element_date_withhour)) {
2660 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2662 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2665 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2671 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2672 print
'<td class="nowrap">';
2677 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2678 print
'<td class="nowrap">';
2683 if (!empty($allprojectforuser)) {
2684 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2685 print
'<td class="nowrap">';
2691 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2692 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2693 print
'<td class="nowrap">';
2694 $tasktmp->id = $task_time->fk_element;
2695 $tasktmp->ref = $task_time->ref;
2696 $tasktmp->label = $task_time->label;
2697 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2703 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2704 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2705 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2712 if (!empty($arrayfields[
'author'][
'checked'])) {
2713 print
'<td class="nowraponall">';
2714 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2716 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2719 $contactsoftask =
$object->getListContactId(
'internal');
2720 if (!in_array($task_time->fk_user, $contactsoftask)) {
2721 $contactsoftask[] = $task_time->fk_user;
2723 if (count($contactsoftask) > 0) {
2724 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2725 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2727 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2730 $userstatic->id = $task_time->fk_user;
2731 $userstatic->lastname = $task_time->lastname;
2732 $userstatic->firstname = $task_time->firstname;
2733 $userstatic->photo = $task_time->photo;
2734 $userstatic->status = $task_time->user_status;
2735 print $userstatic->getNomUrl(-1);
2741 if (!empty($arrayfields[
't.note'][
'checked'])) {
2742 print
'<td class="tdoverflowmax300">';
2743 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2744 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2749 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2750 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2754 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2755 print
'<td class="nowraponall">';
2760 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2761 print
'<td class="right">';
2762 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2763 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2764 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2772 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2773 print
'<td class="nowraponall tdoverflowmax125">';
2778 if (!empty($arrayfields[
'value'][
'checked'])) {
2779 print
'<td class="right">';
2780 print
'<span class="amount">';
2781 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2782 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2788 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2789 print
'<td class="right">';
2790 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2791 if (isset($task_time->total_ht)) {
2792 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2803 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2804 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2805 print $hookmanager->resPrint;
2808 if (!
$conf->main_checkbox_left_column) {
2809 print
'<td class="center nowraponall">';
2818 print
'<!-- second line --><tr class="oddeven">';
2821 if (
$conf->main_checkbox_left_column) {
2822 print
'<td class="center nowraponall">';
2827 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2828 print
'<td class="nowraponall">';
2829 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2830 if (empty($task_time->element_date_withhour)) {
2831 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2833 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2836 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2842 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2848 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2854 if (!empty($allprojectforuser)) {
2855 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2862 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2863 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2864 print
'<td class="nowraponall">';
2865 $tasktmp->id = $task_time->fk_element;
2866 $tasktmp->ref = $task_time->ref;
2867 $tasktmp->label = $task_time->label;
2868 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2874 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2875 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2876 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2883 if (!empty($arrayfields[
'author'][
'checked'])) {
2884 print
'<td class="nowraponall tdoverflowmax100">';
2885 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2887 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2890 $contactsoftask =
$object->getListContactId(
'internal');
2891 if (!in_array($task_time->fk_user, $contactsoftask)) {
2892 $contactsoftask[] = $task_time->fk_user;
2894 if (count($contactsoftask) > 0) {
2895 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2896 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2898 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2901 $userstatic->id = $task_time->fk_user;
2902 $userstatic->lastname = $task_time->lastname;
2903 $userstatic->firstname = $task_time->firstname;
2904 $userstatic->photo = $task_time->photo;
2905 $userstatic->status = $task_time->user_status;
2906 print $userstatic->getNomUrl(-1);
2912 if (!empty($arrayfields[
't.note'][
'checked'])) {
2913 print
'<td class="small tdoverflowmax300"">';
2914 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2915 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2920 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2921 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2925 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2926 print
'<td class="nowraponall">';
2932 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2933 print
'<td class="right">';
2934 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2935 print
'<input type="hidden" name="old_duration_2" value="0">';
2936 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2944 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2945 print
'<td class="nowraponall tdoverflowmax125">';
2950 if (!empty($arrayfields[
'value'][
'checked'])) {
2951 print
'<td class="right">';
2952 print
'<span class="amount nowraponall">';
2954 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2961 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2962 print
'<td class="right">';
2963 if (isset($task_time->total_ht)) {
2964 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2965 print
'<span class="amount nowraponall small">';
2966 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2978 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2979 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2980 print $hookmanager->resPrint;
2983 if (!
$conf->main_checkbox_left_column) {
2984 print
'<td class="center nowraponall">';
2997 print
'<tr class="liste_total">';
3002 if ($num < $limit && empty($offset)) {
3003 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
3005 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
3019 if (!count($tasks)) {
3020 $totalnboffields = 1;
3021 foreach ($arrayfields as $value) {
3022 if (!empty($value[
'checked'])) {
3026 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
3027 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
3031 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
3032 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
3033 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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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...
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.