36require
'../../main.inc.php';
37require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
38require_once DOL_DOCUMENT_ROOT .
'/projet/class/task.class.php';
39require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
40require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
41require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
42require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
43require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
44require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
45require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
56@phan-var-force ?string $uploaddir
60$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
61if (isModEnabled(
'eventorganization')) {
62 $langsLoad[] =
'eventorganization';
65$langs->loadLangs($langsLoad);
67$action =
GETPOST(
'action',
'alpha');
68$massaction =
GETPOST(
'massaction',
'alpha');
69$confirm =
GETPOST(
'confirm',
'alpha');
70$cancel =
GETPOST(
'cancel',
'alpha');
71$toselect =
GETPOST(
'toselect',
'array');
72$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
73$backtopage =
GETPOST(
'backtopage',
'alpha');
74$optioncss =
GETPOST(
'optioncss',
'alpha');
75$mode =
GETPOST(
'mode',
'alpha');
81$project_ref =
GETPOST(
'project_ref',
'alpha');
87$search_date_startday =
GETPOSTINT(
'search_date_startday');
88$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
89$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
90$search_date_endday =
GETPOSTINT(
'search_date_endday');
91$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
92$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
93$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
94$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
95$search_note =
GETPOST(
'search_note',
'alpha');
96$search_duration =
GETPOST(
'search_duration',
'alpha');
97$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
98$search_task_label =
GETPOST(
'search_task_label',
'alpha');
99$search_user =
GETPOST(
'search_user',
'intcomma');
100$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
101$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
102$search_company =
GETPOST(
'$search_company',
'alpha');
103$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
104$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
105$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
106$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
107$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
108$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
109$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
112$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
113$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
115if (empty($page) || $page == -1) {
118$offset = $limit * $page;
119$pageprev = $page - 1;
120$pagenext = $page + 1;
122 $sortfield =
't.element_date,t.element_datehour,t.rowid';
125 $sortorder =
'DESC,DESC,DESC';
128$childids = $user->getAllChildIds(1);
132$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
136$projectstatic =
new Project($db);
139$extrafields->fetch_name_optionals_label($projectstatic->table_element);
140$extrafields->fetch_name_optionals_label(
$object->table_element);
142$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
145if ($id > 0 || $ref) {
153if (!$user->hasRight(
'projet',
'lire')) {
162 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
163 $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');
304 $object->fetch($id_temp, $ref);
306 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
310 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
312 $object->timespent_withhour = 1;
313 } elseif (!empty($timespent_date)) {
314 $object->timespent_date = $timespent_date;
315 $object->timespent_withhour = 0;
323 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
324 $result =
$object->updateTimeSpent($user);
337 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
341 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
344 $object->timespent_withhour = 1;
345 } elseif (!empty($timespent_date)) {
346 $object->timespent_date = $timespent_date;
347 $object->timespent_datehour = $timespent_date;
348 $object->timespent_withhour = 0;
356 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
357 $result =
$object->updateTimeSpent($user);
372if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
375 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
376 $result =
$object->delTimeSpent($user);
379 $langs->load(
"errors");
390if (!empty($project_ref) && !empty($withproject)) {
391 if ($projectstatic->fetch(0, $project_ref) > 0) {
392 $tasksarray =
$object->getTasksArray(
null,
null, $projectstatic->id, $socid, 0);
393 if (count($tasksarray) > 0) {
394 $id = $tasksarray[0]->id;
396 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
403$projectidforalltimes = 0;
405 $projectidforalltimes =
GETPOSTINT(
'projectid');
407 $result = $projectstatic->fetch($projectidforalltimes);
408 if (!empty($projectstatic->socid)) {
409 $projectstatic->fetch_thirdparty();
411 $res = $projectstatic->fetch_optionals();
412} elseif (
GETPOST(
'project_ref',
'alpha')) {
413 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
414 $projectidforalltimes = $projectstatic->id;
418 $result = $projectstatic->fetch(
$object->fk_project);
421$allprojectforuser = 0;
422if ($id <= 0 && $projectidforalltimes == 0) {
423 $allprojectforuser = $user->id;
426if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
427 if (!empty($projectstatic->socid)) {
428 $projectstatic->fetch_thirdparty();
431 if (!($projectstatic->thirdparty->id > 0)) {
432 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
434 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
435 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
436 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
438 $tmpinvoice =
new Facture($db);
439 $tmptimespent =
new Task($db);
440 $tmpproduct =
new Product($db);
441 $fuser =
new User($db);
446 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
449 $prodDurationHoursBase = 1.0;
450 $product_data_cache = array();
452 $tmpproduct->fetch($idprod);
458 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
459 if ($prodDurationHoursBase < 0) {
461 $langs->load(
"errors");
465 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
467 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
468 $txtva = $dataforprice[
'tva_tx'];
469 $localtax1 = $dataforprice[
'localtax1'];
470 $localtax2 = $dataforprice[
'localtax2'];
472 $prodDurationHoursBase = 1;
480 $tmpinvoice->socid = $projectstatic->thirdparty->id;
482 $tmpinvoice->fk_project = $projectstatic->id;
483 $tmpinvoice->cond_reglement_id = $condidproject;
484 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
485 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
488 $tmpinvoice->fetch($invoiceToUse);
490 $result = $tmpinvoice->create($user);
498 if ($generateinvoicemode ==
'onelineperuser') {
499 $arrayoftasks = array();
500 foreach ($toselect as $key => $value) {
502 $object->fetchTimeSpent($value);
503 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
504 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
507 foreach ($arrayoftasks as $userid => $data) {
508 $fuser->fetch($userid);
509 $username = $fuser->getFullName($langs);
511 foreach ($data as $fk_product => $timespent_data) {
513 $qtyhour = $timespent_data[
'timespent'] / 3600;
520 } elseif ($idprod <= 0) {
523 $pu_ht = $fuser->thm;
528 if ($timespent_data[
'timespent']) {
529 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
534 $prodDurationHours = $prodDurationHoursBase;
535 $idprodline = $idprod;
538 $localtax1line = $localtax1;
539 $localtax2line = $localtax2;
542 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
543 if (!array_key_exists($fk_product, $product_data_cache)) {
544 $result = $tmpproduct->fetch($fk_product);
549 $prodDurationHours = $tmpproduct->getProductDurationHours();
550 if ($prodDurationHours < 0) {
552 $langs->load(
"errors");
558 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
560 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
561 $txtvaline = $dataforprice[
'tva_tx'];
562 $localtax1line = $dataforprice[
'localtax1'];
563 $localtax2line = $dataforprice[
'localtax2'];
565 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
567 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
568 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
569 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
570 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
571 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
573 $idprodline = $fk_product;
580 $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);
587 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
588 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
589 $result = $db->query($sql);
597 } elseif ($generateinvoicemode ==
'onelineperperiod') {
598 $arrayoftasks = array();
600 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
601 foreach ($toselect as $key => $value) {
603 $object->fetchTimeSpent($value);
605 $ftask =
new Task($db);
608 $fuser->fetch(
$object->timespent_fk_user);
609 $username = $fuser->getFullName($langs);
611 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
612 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
613 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
616 if (!empty($withdetail)) {
617 if (!empty(
$object->timespent_withhour)) {
624 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
625 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
628 $pu_ht_saved = $pu_ht;
629 foreach ($arrayoftasks as $timespent_id => $value) {
630 $pu_ht = $pu_ht_saved;
631 $userid = $value[
'user'];
635 $qtyhour = $value[
'timespent'] / 3600;
639 if ($value[
'timespent']) {
640 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
645 $prodDurationHours = $prodDurationHoursBase;
646 $idprodline = $idprod;
649 $localtax1line = $localtax1;
650 $localtax2line = $localtax2;
652 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
653 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
654 $result = $tmpproduct->fetch($value[
'fk_product']);
659 $prodDurationHours = $tmpproduct->getProductDurationHours();
660 if ($prodDurationHours < 0) {
662 $langs->load(
"errors");
668 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
670 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
671 $txtvaline = $dataforprice[
'tva_tx'];
672 $localtax1line = $dataforprice[
'localtax1'];
673 $localtax2line = $dataforprice[
'localtax2'];
675 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
677 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
678 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
679 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
680 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
681 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
683 $idprodline = $value[
'fk_product'];
689 $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);
697 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
698 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
699 $result = $db->query($sql);
706 } elseif ($generateinvoicemode ==
'onelinepertask') {
707 $arrayoftasks = array();
708 foreach ($toselect as $key => $value) {
710 $object->fetchTimeSpent($value);
712 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
713 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
716 foreach ($arrayoftasks as $task_id => $data) {
717 $ftask =
new Task($db);
718 $ftask->fetch($task_id);
720 foreach ($data as $fk_product => $timespent_data) {
721 $qtyhour = $timespent_data[
'timespent'] / 3600;
725 $prodDurationHours = $prodDurationHoursBase;
726 $idprodline = $idprod;
729 $localtax1line = $localtax1;
730 $localtax2line = $localtax2;
732 if (!empty($fk_product) && $fk_product !== $idprod) {
733 if (!array_key_exists($fk_product, $product_data_cache)) {
734 $result = $tmpproduct->fetch($fk_product);
739 $prodDurationHours = $tmpproduct->getProductDurationHours();
740 if ($prodDurationHours < 0) {
742 $langs->load(
"errors");
748 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
750 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
751 $txtvaline = $dataforprice[
'tva_tx'];
752 $localtax1line = $dataforprice[
'localtax1'];
753 $localtax2line = $dataforprice[
'localtax2'];
755 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
757 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
758 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
759 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
760 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
761 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
763 $idprodline = $fk_product;
767 if ($idprodline > 0) {
769 $pu_ht_for_task = $pu_htline;
772 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
774 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
780 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
782 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
788 $lineName = $ftask->ref .
' - ' . $ftask->label;
789 $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);
798 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
799 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
800 $result = $db->query($sql);
813 $urltoinvoice = $tmpinvoice->getNomUrl(0);
814 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
815 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
825if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
826 $langs->load(
'interventions');
828 if (!empty($projectstatic->socid)) {
829 $projectstatic->fetch_thirdparty();
832 if (!($projectstatic->thirdparty->id > 0)) {
833 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
835 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
836 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
837 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
840 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
842 $tmptimespent =
new Task($db);
843 $fuser =
new User($db);
849 $tmpinter->socid = $projectstatic->thirdparty->id;
851 $tmpinter->fk_project = $projectstatic->id;
852 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->description :
'');
855 $tmpinter->fetch($interToUse);
857 $result = $tmpinter->create($user);
865 $arrayoftasks = array();
866 foreach ($toselect as $key => $value) {
868 $object->fetchTimeSpent($value);
871 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
872 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
873 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
874 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
877 foreach ($arrayoftasks as $timespent_id => $value) {
878 $ftask =
new Task($db);
879 $ftask->fetch($value[
'id']);
881 $qtyhour = $value[
'timespent'] / 3600;
885 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
890 $timespent->fetch($timespent_id);
891 $timespent->intervention_id = $tmpinter->id;
892 $timespent->intervention_line_id = $lineid;
893 $result = $timespent->update($user);
903 $urltointer = $tmpinter->getNomUrl(0);
904 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
905 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
922$form =
new Form($db);
925$userstatic =
new User($db);
927$arrayofselected = is_array($toselect) ? $toselect : array();
929$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
930if (!empty($withproject)) {
931 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
935llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
937if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
941 if ($projectidforalltimes > 0) {
942 $result = $projectstatic->fetch($projectidforalltimes);
943 if (!empty($projectstatic->socid)) {
944 $projectstatic->fetch_thirdparty();
946 $res = $projectstatic->fetch_optionals();
947 } elseif (
$object->fetch($id, $ref) >= 0) {
948 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
951 $result = $projectstatic->fetch(
$object->fk_project);
952 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
953 $projectstatic->fetchComments();
955 if (!empty($projectstatic->socid)) {
956 $projectstatic->fetch_thirdparty();
958 $res = $projectstatic->fetch_optionals();
960 $object->project = clone $projectstatic;
963 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
964 $linktocreatetime =
'';
966 if ($projectstatic->id > 0) {
969 if (empty($id) || $tab ==
'timespent') {
976 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
978 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
980 $param .=
'&search_user=' . ((int) $search_user);
983 $param .=
'&search_month=' . ((int) $search_month);
986 $param .=
'&search_year=' . ((int) $search_year);
991 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
993 $morehtmlref =
'<div class="refidno">';
995 $morehtmlref .= $projectstatic->title;
997 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
998 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1000 $morehtmlref .=
'</div>';
1003 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1004 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1005 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1008 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1010 print
'<div class="fichecenter">';
1011 print
'<div class="fichehalfleft">';
1012 print
'<div class="underbanner clearboth"></div>';
1014 print
'<table class="border tableforfield centpercent">';
1018 print
'<tr><td class="tdtop">';
1019 print $langs->trans(
"Usage");
1023 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1024 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1025 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1029 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1030 $htmltext = $langs->trans(
"ProjectFollowTasks");
1031 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1035 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"' :
'')) .
'"> ';
1036 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1037 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1040 if (isModEnabled(
'eventorganization')) {
1041 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"' :
'')) .
'"> ';
1042 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1043 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1049 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1050 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1051 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1056 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1058 print($start ? $start :
'?');
1061 print($end ? $end :
'?');
1062 if ($projectstatic->hasDelay()) {
1068 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1069 if ($projectstatic->public) {
1070 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1071 print $langs->trans(
'SharedProject');
1073 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1074 print $langs->trans(
'PrivateProject');
1082 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1088 print
'<div class="fichehalfright">';
1089 print
'<div class="underbanner clearboth"></div>';
1091 print
'<table class="border tableforfield centpercent">';
1094 if (isModEnabled(
'category')) {
1095 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1096 print $form->showCategories($projectstatic->id,
'project', 1);
1101 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1102 if ($projectstatic->description) {
1103 print
'<tr><td class="nottitleforfield" colspan="2">';
1104 print
'<div class="longmessagecut">';
1115 print
'<div class="clearboth"></div>';
1125 $linktocreatetimeBtnStatus = 0;
1126 $linktocreatetimeUrl =
'';
1127 $linktocreatetimeHelpText =
'';
1128 if ($user->hasRight(
'projet',
'time')) {
1129 if ($projectstatic->public || $userRead > 0) {
1130 $linktocreatetimeBtnStatus = 1;
1132 if (!empty($projectidforalltimes)) {
1134 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1135 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1138 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1139 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1142 $linktocreatetimeBtnStatus = -2;
1143 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1146 $linktocreatetimeBtnStatus = -2;
1147 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1150 $paramsbutton = array(
'morecss' =>
'reposition');
1151 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1154 $massactionbutton =
'';
1155 $arrayofmassactions = array();
1157 if ($projectstatic->id > 0) {
1159 if ($projectstatic->usage_bill_time) {
1160 $arrayofmassactions = array(
1161 'generateinvoice' => $langs->trans(
"GenerateBill"),
1165 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1166 $langs->load(
"interventions");
1167 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1171 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1172 $arrayofmassactions = array();
1174 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1179 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1181 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1183 if ($action ==
'deleteline') {
1184 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1185 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1188 $param = ($withproject ?
'&withproject=1' :
'');
1189 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1190 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1192 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1193 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1194 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1196 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1202 if (empty($withproject)) {
1203 $morehtmlref .=
'<div class="refidno">';
1204 $morehtmlref .= $langs->trans(
"Project") .
': ';
1205 $morehtmlref .= $projectstatic->getNomUrl(1);
1206 $morehtmlref .=
'<br>';
1209 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1210 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1211 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1213 $morehtmlref .=
'</div>';
1216 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1218 print
'<div class="fichecenter">';
1219 print
'<div class="fichehalfleft">';
1221 print
'<div class="underbanner clearboth"></div>';
1222 print
'<table class="border centpercent tableforfield">';
1225 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1226 if (
$object->fk_task_parent > 0) {
1227 $tasktmp =
new Task($db);
1228 $tasktmp->fetch(
$object->fk_task_parent);
1229 print $tasktmp->getNomUrl(1);
1234 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1236 print($start ? $start :
'?');
1239 print($end ? $end :
'?');
1246 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1247 if (
$object->planned_workload) {
1255 print
'<div class="fichehalfright">';
1257 print
'<div class="underbanner clearboth"></div>';
1258 print
'<table class="border tableforfield centpercent">';
1261 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1266 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1267 if (
$object->planned_workload) {
1268 $tmparray =
$object->getSummaryOfTimeSpent();
1269 if ($tmparray[
'total_duration'] > 0) {
1270 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1275 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1286 print
'<div class="clearboth"></div>';
1290 if ($action ==
'deleteline') {
1291 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1292 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1297 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1299 $hookmanager->initHooks(array(
'tasktimelist'));
1303 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1305 $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);
1306 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1310 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1311 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1312 if (empty($reshook)) {
1313 $formconfirm .= $hookmanager->resPrint;
1314 } elseif ($reshook > 0) {
1315 $formconfirm = $hookmanager->resPrint;
1322 $arrayfields = array();
1323 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1324 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1325 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1326 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1327 if (! empty($allprojectforuser)) {
1328 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1329 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1331 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1332 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1334 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1335 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1336 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1337 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1339 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1340 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int) isModEnabled(
"salaries"));
1341 $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));
1343 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1348 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1349 $param .=
'&contextpage=' . urlencode($contextpage);
1351 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1352 $param .=
'&limit='.((int) $limit);
1354 if ($search_month > 0) {
1355 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1357 if ($search_year > 0) {
1358 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1360 if (!empty($search_user)) {
1361 $param .=
'&search_user='.urlencode($search_user);
1363 if ($search_task_ref !=
'') {
1364 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1366 if ($search_company !=
'') {
1367 $param .=
'&$search_company=' . urlencode($search_company);
1369 if ($search_company_alias !=
'') {
1370 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1372 if ($search_project_ref !=
'') {
1373 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1375 if ($search_project_label !=
'') {
1376 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1378 if ($search_task_label !=
'') {
1379 $param .=
'&search_task_label=' . urlencode($search_task_label);
1381 if ($search_note !=
'') {
1382 $param .=
'&search_note=' . urlencode($search_note);
1384 if ($search_duration !=
'') {
1385 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1387 if ($optioncss !=
'') {
1388 $param .=
'&optioncss=' . urlencode($optioncss);
1390 if ($search_date_startday) {
1391 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1393 if ($search_date_startmonth) {
1394 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1396 if ($search_date_startyear) {
1397 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1399 if ($search_date_endday) {
1400 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1402 if ($search_date_endmonth) {
1403 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1405 if ($search_date_endyear) {
1406 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1408 if ($search_timespent_starthour) {
1409 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1411 if ($search_timespent_startmin) {
1412 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1414 if ($search_timespent_endhour) {
1415 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1417 if ($search_timespent_endmin) {
1418 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1422 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1424 $param .=
'&id=' . urlencode((
string) ($id));
1427 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1430 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1433 $parameters = array(
'param' => &$param);
1434 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1435 $param .= $hookmanager->resPrint;
1437 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1438 if ($optioncss !=
'') {
1439 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1441 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1442 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1443 if ($action ==
'editline') {
1444 print
'<input type="hidden" name="action" value="updateline">';
1445 } elseif ($action ==
'splitline') {
1446 print
'<input type="hidden" name="action" value="updatesplitline">';
1447 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1448 print
'<input type="hidden" name="action" value="addtimespent">';
1449 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1450 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1451 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1452 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1454 print
'<input type="hidden" name="action" value="list">';
1456 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1457 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1459 print
'<input type="hidden" name="id" value="' .
$id .
'">';
1460 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1461 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1462 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1463 print
'<input type="hidden" name="page_y" value="">';
1466 if ($massaction ==
'generateinvoice') {
1467 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1468 print
'<table class="noborder centerpercent">';
1470 print
'<td class="titlefield">';
1471 print $langs->trans(
'DateInvoice');
1474 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1480 print $langs->trans(
'Mode');
1484 'onelineperuser' =>
'OneLinePerUser',
1485 'onelinepertask' =>
'OneLinePerTask',
1486 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1488 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1489 print
"\n" .
'<script type="text/javascript">';
1491 $(document).ready(function () {
1492 setDetailVisibility();
1493 $("#generateinvoicemode").change(function() {
1494 setDetailVisibility();
1496 function setDetailVisibility() {
1497 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1498 if (generateinvoicemode=="onelineperperiod") {
1499 $("#detail_time_duration").show();
1501 $("#detail_time_duration").hide();
1506 print
'</script>' .
"\n";
1507 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1511 if (isModEnabled(
"service")) {
1514 print $langs->trans(
'ServiceToUseOnLines');
1517 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1522 print
'<td class="titlefield">';
1523 print $langs->trans(
'InvoiceToUse');
1526 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1530 print
'<td class="titlefield">';
1531 print $langs->trans(
"CustomerRelativeDiscount");
1534 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1537 print
'<tr class="newinvoicedetail">';
1538 print
'<td class="titlefield">';
1539 print $langs->trans(
"PaymentConditions");
1542 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1556 print
'<div class="center">';
1557 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1558 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1562 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1563 print
'<div class="center">';
1564 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1568 } elseif ($massaction ==
'generateinter') {
1570 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1572 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1574 print
'<table class="noborder centpercent">';
1576 print
'<td class="titlefield">';
1577 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1581 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1586 print
'<div class="center">';
1587 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1588 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1592 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1593 print
'<div class="center">';
1594 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1601 $parameters = array(
1602 'toselect' => $toselect,
1603 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1606 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1610 print $hookmanager->resPrint;
1618 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1619 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1621 $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,";
1622 $sql .=
" t.fk_product, t.invoice_line_id,";
1623 $sql .=
" pt.ref, pt.label, pt.fk_projet, pt.billable,";
1624 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1625 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1626 $sql .=
" p.fk_soc,s.name_alias,";
1627 if (!empty($extrafields->attributes[
'projet_task'][
'label'])) {
1628 foreach ($extrafields->attributes[
'projet_task'][
'label'] as $key => $val) {
1629 $sql .= ($extrafields->attributes[
'projet_task'][
'type'][$key] !=
'separate' ?
",efpt.".$key.
" as options_".$key :
'');
1633 $parameters = array();
1634 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1635 $sql .= $hookmanager->resPrint;
1636 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1640 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1641 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1642 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1643 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1644 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1645 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"projet_task_extrafields as efpt ON pt.rowid = efpt.fk_object";
1646 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1647 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1648 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1651 $parameters = array();
1652 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1653 $sql .= $hookmanager->resPrint;
1654 $sql .=
" WHERE elementtype = 'task'";
1655 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1656 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1660 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1661 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1663 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1665 $sql .=
" AND t.fk_element =".((int)
$object->id);
1666 } elseif (!empty($projectidforalltimes)) {
1668 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize((
string) $projectidforalltimes) .
")";
1669 } elseif (!empty($allprojectforuser)) {
1671 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1672 $search_user = $user->id;
1674 if ($search_user > 0) {
1675 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1682 if ($search_task_ref) {
1685 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1686 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1688 if ($search_company) {
1691 if ($search_company_alias) {
1695 if ($search_project_ref) {
1698 if ($search_project_label) {
1701 if ($search_task_label) {
1704 if ($search_user > 0) {
1707 if (!empty($search_product_ref)) {
1710 if ($search_valuebilled ==
'1') {
1711 $sql .=
' AND t.invoice_id > 0';
1713 if ($search_valuebilled ==
'0') {
1714 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1717 if ($search_date_start) {
1718 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1720 if ($search_date_end) {
1721 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1724 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1725 if ($search_timespent_starthour || $search_timespent_startmin) {
1726 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1727 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1728 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1731 if ($search_timespent_endhour || $search_timespent_endmin) {
1732 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1733 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1734 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1738 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1741 $extrafieldsobjectkey =
'projet_task';
1742 $extrafieldsobjectprefix =
'efpt.';
1743 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
1746 $parameters = array();
1747 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1748 $sql .= $hookmanager->resPrint;
1751 $nbtotalofrecords =
'';
1754 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1755 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1756 $resql = $db->query($sqlforcount);
1758 $objforcount = $db->fetch_object($resql);
1759 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1764 if (($page * $limit) > $nbtotalofrecords) {
1772 $sql .= $db->order($sortfield, $sortorder);
1774 $sql .= $db->plimit($limit + 1, $offset);
1777 $resql = $db->query($sql);
1783 $num = $db->num_rows($resql);
1786 if (!empty($projectidforalltimes)) {
1787 print
'<!-- List of time spent for project -->' .
"\n";
1789 $title = $langs->trans(
"ListTaskTimeUserProject");
1791 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1793 print
'<!-- List of time spent -->' .
"\n";
1795 $title = $langs->trans(
"ListTaskTimeForTask");
1797 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1802 $row = $db->fetch_object($resql);
1814 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1815 print
'<!-- table to add time spent -->' .
"\n";
1817 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1820 print
'<div class="div-table-responsive-no-min">';
1821 print
'<table class="noborder nohover centpercent">';
1823 print
'<tr class="liste_titre">';
1824 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1825 if (!empty($allprojectforuser)) {
1826 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1829 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1831 print
'<td>' . $langs->trans(
"By") .
'</td>';
1832 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1833 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1834 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1838 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1839 print
'<td>'.$langs->trans(
"Product").
'</td>';
1843 $parameters = array(
'mode' =>
'create');
1844 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1845 print $hookmanager->resPrint;
1849 print
'<tr class="oddeven nohover">';
1852 print
'<td class="maxwidthonsmartphone">';
1854 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1857 if (!empty($allprojectforuser)) {
1866 print
'<td class="maxwidthonsmartphone">';
1867 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1872 print
'<td class="maxwidthonsmartphone nowraponall">';
1873 $contactsofproject = $projectstatic->getListContactId(
'internal');
1874 if (count($contactsofproject) > 0) {
1875 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1876 if (in_array($user->id, $contactsofproject)) {
1877 $userid = $user->id;
1879 $userid = $contactsofproject[0];
1882 if ($projectstatic->public) {
1883 $contactsofproject = array();
1885 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1888 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1895 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1899 print
'<td class="nowraponall">';
1900 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1901 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1902 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1904 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1908 print
'<td class="nowrap">';
1909 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1917 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1918 print
'<td class="nowraponall">';
1920 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);
1926 $parameters = array(
'mode' =>
'create');
1927 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1928 print $hookmanager->resPrint;
1930 print
'<td class="center">';
1931 $form->buttonsSaveCancel();
1932 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1933 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1942 $moreforfilter =
'';
1944 $parameters = array();
1945 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1946 if (empty($reshook)) {
1947 $moreforfilter .= $hookmanager->resPrint;
1949 $moreforfilter = $hookmanager->resPrint;
1952 if (!empty($moreforfilter)) {
1953 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1954 print $moreforfilter;
1958 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1959 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1960 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1962 print
'<!-- Liste of time spent -->'.
"\n";
1963 print
'<div class="div-table-responsive">';
1964 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1968 print
'<tr class="liste_titre_filter">';
1971 print
'<td class="liste_titre center">';
1972 $searchpicto = $form->showFilterButtons(
'left');
1977 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1978 print
'<td class="liste_titre left">';
1979 print
'<div class="nowrapfordate paddingright">';
1980 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1982 print
'<div class="nowrapfordate">';
1983 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1988 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1989 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1993 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1994 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1997 if (!empty($allprojectforuser)) {
1998 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1999 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2001 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2002 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2006 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2007 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2008 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2010 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2011 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2015 if (!empty($arrayfields[
'author'][
'checked'])) {
2016 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>';
2019 if (!empty($arrayfields[
't.note'][
'checked'])) {
2020 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2023 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2025 print
'<td class="liste_titre right">';
2027 $durationtouse_start =
'';
2028 if ($search_timespent_starthour || $search_timespent_startmin) {
2029 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2031 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
2032 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2035 $durationtouse_end =
'';
2036 if ($search_timespent_endhour || $search_timespent_endmin) {
2037 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2039 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2040 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2046 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2047 print
'<td class="liste_titre right"></td>';
2050 if (!empty($arrayfields[
'value'][
'checked'])) {
2051 print
'<td class="liste_titre"></td>';
2054 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2055 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2059 $extrafieldsobjectkey =
'projet_task';
2060 $extrafieldsobjectprefix =
'ef.';
2061 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
2063 $parameters = array(
'arrayfields' => $arrayfields);
2064 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2065 print $hookmanager->resPrint;
2068 print
'<td class="liste_titre center">';
2069 $searchpicto = $form->showFilterButtons();
2073 print
'</tr>' .
"\n";
2081 print
'<tr class="liste_titre">';
2083 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2086 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2087 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2090 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2091 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2094 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2096 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2099 if (!empty($allprojectforuser)) {
2100 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2101 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2104 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2105 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2109 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2110 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2111 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2114 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2115 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2119 if (!empty($arrayfields[
'author'][
'checked'])) {
2120 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2123 if (!empty($arrayfields[
't.note'][
'checked'])) {
2124 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2127 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2128 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2131 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2132 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2136 if (!empty($arrayfields[
'value'][
'checked'])) {
2137 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2140 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2141 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2145 $extrafieldsobjectkey =
'projet_task';
2146 $extrafieldsobjectprefix =
'ef.';
2147 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
2149 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2150 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2151 print $hookmanager->resPrint;
2153 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2158 $tasktmp =
new Task($db);
2159 $tmpinvoice =
new Facture($db);
2162 $param .=
'&page='.((int) $page);
2164 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2172 foreach ($tasks as $task_time) {
2178 $invoiced = $task_time->invoice_id ? true :
false;
2180 $date1 = $db->jdate($task_time->element_date);
2181 $date2 = $db->jdate($task_time->element_datehour);
2185 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2189 print
'<td class="center nowraponall">';
2190 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2191 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2192 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2194 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2195 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2196 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2197 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' :
'').
'">';
2198 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2202 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' :
'') .
'">';
2203 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2207 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' :
'').
'">';
2208 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2211 if ($massactionbutton || $massaction) {
2213 if (in_array($task_time->rowid, $arrayofselected)) {
2219 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2220 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2224 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2225 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2239 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2240 print
'<td class="nowrap">';
2241 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2242 if (empty($task_time->element_date_withhour)) {
2243 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2245 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2248 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2257 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2258 print
'<td class="tdoverflowmax125">';
2259 if ($task_time->fk_soc > 0) {
2260 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2261 $tmpsociete =
new Societe($db);
2262 $tmpsociete->fetch($task_time->fk_soc);
2263 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2265 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2267 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2276 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2278 if ($task_time->fk_soc > 0) {
2279 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2280 $tmpsociete =
new Societe($db);
2281 $tmpsociete->fetch($task_time->fk_soc);
2282 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2284 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2286 $valtoshow = $tmpsociete->name_alias;
2288 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2296 if (!empty($allprojectforuser)) {
2298 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2299 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2300 $tmpproject =
new Project($db);
2301 $tmpproject->fetch($task_time->fk_projet);
2302 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2304 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2306 print
'<td class="nowraponall">';
2307 print $tmpproject->getNomUrl(1);
2314 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2315 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2316 $tmpproject =
new Project($db);
2317 $tmpproject->fetch($task_time->fk_projet);
2318 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2320 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2322 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2323 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2326 print $tmpproject->getNomUrl(1,
'', -1);
2336 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2337 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2338 print
'<td class="nowrap">';
2339 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2340 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (string) $projectstatic->id,
'');
2342 $tasktmp->id = $task_time->fk_element;
2343 $tasktmp->ref = $task_time->ref;
2344 $tasktmp->label = $task_time->label;
2345 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2352 } elseif ($action !==
'createtime') {
2353 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2357 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2358 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2359 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2360 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2363 $tasktmp->id = $task_time->fk_element;
2364 $tasktmp->ref = $task_time->ref;
2365 $tasktmp->label = $task_time->label;
2366 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2376 if (!empty($arrayfields[
'author'][
'checked'])) {
2377 print
'<td class="tdoverflowmax125">';
2378 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2381 $object->fetch($task_time->fk_element);
2383 $contactsoftask =
$object->getListContactId(
'internal');
2384 if (!in_array($task_time->fk_user, $contactsoftask)) {
2385 $contactsoftask[] = $task_time->fk_user;
2387 if (count($contactsoftask) > 0) {
2388 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2389 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2391 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2394 $userstatic->id = $task_time->fk_user;
2395 $userstatic->lastname = $task_time->lastname;
2396 $userstatic->firstname = $task_time->firstname;
2397 $userstatic->photo = $task_time->photo;
2398 $userstatic->gender = $task_time->gender;
2399 $userstatic->status = $task_time->user_status;
2401 print $userstatic->getNomUrl(-1);
2410 if (!empty($arrayfields[
't.note'][
'checked'])) {
2411 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2412 print
'<td class="small">';
2413 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2416 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2423 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2424 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2428 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2429 print
'<td class="right nowraponall">';
2430 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2431 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2432 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2443 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2444 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2446 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2452 $totalarray[
'totalduration'] = $task_time->element_duration;
2454 $totalarray[
'totalduration'] += $task_time->element_duration;
2459 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2460 print
'<td class="nowraponall">';
2461 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2463 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);
2464 } elseif (!empty($task_time->fk_product)) {
2466 $resultFetch = $product->fetch($task_time->fk_product);
2467 if ($resultFetch < 0) {
2470 print $product->getNomUrl(1);
2480 if (!empty($arrayfields[
'value'][
'checked'])) {
2481 $langs->load(
"salaries");
2482 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2484 print
'<td class="nowraponall right">';
2485 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2486 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2511 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2512 print
'<td class="center">';
2514 if ($projectstatic->usage_bill_time) {
2515 if ($task_time->invoice_id) {
2516 $result = $tmpinvoice->fetch($task_time->invoice_id);
2518 if ($user->hasRight(
'facture',
'lire')) {
2519 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2520 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2522 print $tmpinvoice->getNomUrl(1);
2523 if (!empty($task_time->invoice_line_id)) {
2525 $invoiceLine->fetch($task_time->invoice_line_id);
2526 if (!empty($invoiceLine->id)) {
2527 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2528 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2533 print $langs->trans(
"Yes");
2538 if (intval($task_time->billable) == 1) {
2539 print $langs->trans(
"No");
2541 print $langs->trans(
"Disabled");
2545 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2556 $extrafieldsobjectkey =
'projet_task';
2557 $extrafieldsobjectprefix =
'ef.';
2558 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2561 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2562 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2563 print $hookmanager->resPrint;
2567 print
'<td class="center nowraponall">';
2568 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2569 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2570 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2572 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2573 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2574 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2575 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' :
'').
'">';
2576 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2580 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' :
'') .
'">';
2581 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2585 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' :
'').
'">';
2586 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2589 if ($massactionbutton || $massaction) {
2591 if (in_array($task_time->rowid, $arrayofselected)) {
2597 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2598 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2602 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2603 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2621 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2622 print
'<!-- first line -->';
2623 print
'<tr class="oddeven">';
2631 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2632 print
'<td class="nowrap">';
2633 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2634 if (empty($task_time->element_date_withhour)) {
2635 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2637 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2640 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2646 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2647 print
'<td class="nowrap">';
2652 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2653 print
'<td class="nowrap">';
2658 if (!empty($allprojectforuser)) {
2659 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2660 print
'<td class="nowrap">';
2666 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2667 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2668 print
'<td class="nowrap">';
2669 $tasktmp->id = $task_time->fk_element;
2670 $tasktmp->ref = $task_time->ref;
2671 $tasktmp->label = $task_time->label;
2672 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2678 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2679 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2680 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2687 if (!empty($arrayfields[
'author'][
'checked'])) {
2688 print
'<td class="nowraponall">';
2689 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2691 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2694 $contactsoftask =
$object->getListContactId(
'internal');
2695 if (!in_array($task_time->fk_user, $contactsoftask)) {
2696 $contactsoftask[] = $task_time->fk_user;
2698 if (count($contactsoftask) > 0) {
2699 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2700 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2702 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2705 $userstatic->id = $task_time->fk_user;
2706 $userstatic->lastname = $task_time->lastname;
2707 $userstatic->firstname = $task_time->firstname;
2708 $userstatic->photo = $task_time->photo;
2709 $userstatic->status = $task_time->user_status;
2710 print $userstatic->getNomUrl(-1);
2716 if (!empty($arrayfields[
't.note'][
'checked'])) {
2717 print
'<td class="tdoverflowmax300">';
2718 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2719 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2724 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2725 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2729 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2730 print
'<td class="right">';
2731 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2732 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2733 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2741 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2742 print
'<td class="nowraponall tdoverflowmax125">';
2747 if (!empty($arrayfields[
'value'][
'checked'])) {
2748 print
'<td class="right">';
2749 print
'<span class="amount">';
2750 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2751 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2757 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2758 print
'<td class="right">';
2759 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2760 if (isset($task_time->total_ht)) {
2761 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2768 $extrafieldsobjectkey =
'projet_task';
2769 $extrafieldsobjectprefix =
'ef.';
2770 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2773 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2774 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2775 print $hookmanager->resPrint;
2779 print
'<td class="center nowraponall">';
2788 print
'<!-- second line --><tr class="oddeven">';
2792 print
'<td class="center nowraponall">';
2797 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2798 print
'<td class="nowraponall">';
2799 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2800 if (empty($task_time->element_date_withhour)) {
2801 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2803 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2806 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2812 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2818 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2824 if (!empty($allprojectforuser)) {
2825 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2832 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2833 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2834 print
'<td class="nowraponall">';
2835 $tasktmp->id = $task_time->fk_element;
2836 $tasktmp->ref = $task_time->ref;
2837 $tasktmp->label = $task_time->label;
2838 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2844 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2845 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2846 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2853 if (!empty($arrayfields[
'author'][
'checked'])) {
2854 print
'<td class="nowraponall tdoverflowmax100">';
2855 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2857 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2860 $contactsoftask =
$object->getListContactId(
'internal');
2861 if (!in_array($task_time->fk_user, $contactsoftask)) {
2862 $contactsoftask[] = $task_time->fk_user;
2864 if (count($contactsoftask) > 0) {
2865 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2866 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2868 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2871 $userstatic->id = $task_time->fk_user;
2872 $userstatic->lastname = $task_time->lastname;
2873 $userstatic->firstname = $task_time->firstname;
2874 $userstatic->photo = $task_time->photo;
2875 $userstatic->status = $task_time->user_status;
2876 print $userstatic->getNomUrl(-1);
2882 if (!empty($arrayfields[
't.note'][
'checked'])) {
2883 print
'<td class="small tdoverflowmax300"">';
2884 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2885 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2890 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2891 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2895 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2896 print
'<td class="right">';
2897 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2898 print
'<input type="hidden" name="old_duration_2" value="0">';
2899 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2907 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2908 print
'<td class="nowraponall tdoverflowmax125">';
2913 if (!empty($arrayfields[
'value'][
'checked'])) {
2914 print
'<td class="right">';
2915 print
'<span class="amount nowraponall">';
2917 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2924 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2925 print
'<td class="right">';
2926 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2927 if (isset($task_time->total_ht)) {
2928 print
'<span class="amount nowraponall">';
2929 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2937 $extrafieldsobjectkey =
'projet_task';
2938 $extrafieldsobjectprefix =
'ef.';
2939 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2942 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2943 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2944 print $hookmanager->resPrint;
2948 print
'<td class="center nowraponall">';
2961 print
'<tr class="liste_total">';
2966 if ($num < $limit && empty($offset)) {
2967 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2969 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2983 if (!count($tasks)) {
2984 $totalnboffields = 1;
2985 foreach ($arrayfields as $value) {
2986 if (!empty($value[
'checked'])) {
2990 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2991 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2995 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2996 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2997 print $hookmanager->resPrint;
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage invoices.
Class to manage invoice lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
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...
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.