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);
143if ($id > 0 || $ref) {
151if (!$user->hasRight(
'projet',
'lire')) {
160 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
161 $search_user = $user->id;
171if (
GETPOST(
'cancel',
'alpha')) {
174if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
178$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
179$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
184include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
187if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
192 $search_duration =
'';
193 $search_date_startday =
'';
194 $search_date_startmonth =
'';
195 $search_date_startyear =
'';
196 $search_date_endday =
'';
197 $search_date_endmonth =
'';
198 $search_date_endyear =
'';
199 $search_date_start =
'';
200 $search_date_end =
'';
201 $search_task_ref =
'';
202 $search_company =
'';
203 $search_company_alias =
'';
204 $search_project_ref =
'';
205 $search_project_label =
'';
206 $search_task_label =
'';
208 $search_valuebilled =
'';
209 $search_product_ref =
'';
211 $search_array_options = array();
212 $search_timespent_starthour =
'';
213 $search_timespent_startmin =
'';
214 $search_timespent_endhour =
'';
215 $search_timespent_endmin =
'';
219if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
220 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
221 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
222 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
223 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
227 $langs->load(
"errors");
228 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
237 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
238 $action =
'createtime';
248 if (empty(
$object->project->status)) {
249 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
250 $action =
'createtime';
261 $object->timespent_withhour = 1;
264 $object->timespent_withhour = 0;
269 $result =
$object->addTimeSpent($user);
280 $action =
'createtime';
284if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
285 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
286 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
302 $object->fetch($id_temp, $ref);
304 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
308 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
310 $object->timespent_withhour = 1;
311 } elseif (!empty($timespent_date)) {
312 $object->timespent_date = $timespent_date;
313 $object->timespent_withhour = 0;
321 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
322 $result =
$object->updateTimeSpent($user);
335 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
339 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
342 $object->timespent_withhour = 1;
343 } elseif (!empty($timespent_date)) {
344 $object->timespent_date = $timespent_date;
345 $object->timespent_datehour = $timespent_date;
346 $object->timespent_withhour = 0;
354 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
355 $result =
$object->updateTimeSpent($user);
370if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
373 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
374 $result =
$object->delTimeSpent($user);
377 $langs->load(
"errors");
388if (!empty($project_ref) && !empty($withproject)) {
389 if ($projectstatic->fetch(0, $project_ref) > 0) {
390 $tasksarray =
$object->getTasksArray(
null,
null, $projectstatic->id, $socid, 0);
391 if (count($tasksarray) > 0) {
392 $id = $tasksarray[0]->id;
394 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
401$projectidforalltimes = 0;
403 $projectidforalltimes =
GETPOSTINT(
'projectid');
405 $result = $projectstatic->fetch($projectidforalltimes);
406 if (!empty($projectstatic->socid)) {
407 $projectstatic->fetch_thirdparty();
409 $res = $projectstatic->fetch_optionals();
410} elseif (
GETPOST(
'project_ref',
'alpha')) {
411 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
412 $projectidforalltimes = $projectstatic->id;
416 $result = $projectstatic->fetch(
$object->fk_project);
419$allprojectforuser = 0;
420if ($id <= 0 && $projectidforalltimes == 0) {
421 $allprojectforuser = $user->id;
424if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
425 if (!empty($projectstatic->socid)) {
426 $projectstatic->fetch_thirdparty();
429 if (!($projectstatic->thirdparty->id > 0)) {
430 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
432 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
433 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
434 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
436 $tmpinvoice =
new Facture($db);
437 $tmptimespent =
new Task($db);
438 $tmpproduct =
new Product($db);
439 $fuser =
new User($db);
444 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
447 $prodDurationHoursBase = 1.0;
448 $product_data_cache = array();
450 $tmpproduct->fetch($idprod);
456 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
457 if ($prodDurationHoursBase < 0) {
459 $langs->load(
"errors");
463 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
465 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
466 $txtva = $dataforprice[
'tva_tx'];
467 $localtax1 = $dataforprice[
'localtax1'];
468 $localtax2 = $dataforprice[
'localtax2'];
470 $prodDurationHoursBase = 1;
478 $tmpinvoice->socid = $projectstatic->thirdparty->id;
480 $tmpinvoice->fk_project = $projectstatic->id;
481 $tmpinvoice->cond_reglement_id = $condidproject;
482 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
483 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
486 $tmpinvoice->fetch($invoiceToUse);
488 $result = $tmpinvoice->create($user);
496 if ($generateinvoicemode ==
'onelineperuser') {
497 $arrayoftasks = array();
498 foreach ($toselect as $key => $value) {
500 $object->fetchTimeSpent($value);
501 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
502 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
505 foreach ($arrayoftasks as $userid => $data) {
506 $fuser->fetch($userid);
507 $username = $fuser->getFullName($langs);
509 foreach ($data as $fk_product => $timespent_data) {
511 $qtyhour = $timespent_data[
'timespent'] / 3600;
518 } elseif ($idprod <= 0) {
521 $pu_ht = $fuser->thm;
526 if ($timespent_data[
'timespent']) {
527 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
532 $prodDurationHours = $prodDurationHoursBase;
533 $idprodline = $idprod;
536 $localtax1line = $localtax1;
537 $localtax2line = $localtax2;
540 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
541 if (!array_key_exists($fk_product, $product_data_cache)) {
542 $result = $tmpproduct->fetch($fk_product);
547 $prodDurationHours = $tmpproduct->getProductDurationHours();
548 if ($prodDurationHours < 0) {
550 $langs->load(
"errors");
554 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
556 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
557 $txtvaline = $dataforprice[
'tva_tx'];
558 $localtax1line = $dataforprice[
'localtax1'];
559 $localtax2line = $dataforprice[
'localtax2'];
561 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
563 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
564 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
565 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
566 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
567 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
569 $idprodline = $fk_product;
576 $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);
583 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
584 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
585 $result = $db->query($sql);
593 } elseif ($generateinvoicemode ==
'onelineperperiod') {
594 $arrayoftasks = array();
596 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
597 foreach ($toselect as $key => $value) {
599 $object->fetchTimeSpent($value);
601 $ftask =
new Task($db);
604 $fuser->fetch(
$object->timespent_fk_user);
605 $username = $fuser->getFullName($langs);
607 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
608 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
609 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
612 if (!empty($withdetail)) {
613 if (!empty(
$object->timespent_withhour)) {
620 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
621 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
624 $pu_ht_saved = $pu_ht;
625 foreach ($arrayoftasks as $timespent_id => $value) {
626 $pu_ht = $pu_ht_saved;
627 $userid = $value[
'user'];
631 $qtyhour = $value[
'timespent'] / 3600;
635 if ($value[
'timespent']) {
636 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
641 $prodDurationHours = $prodDurationHoursBase;
642 $idprodline = $idprod;
645 $localtax1line = $localtax1;
646 $localtax2line = $localtax2;
648 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
649 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
650 $result = $tmpproduct->fetch($value[
'fk_product']);
655 $prodDurationHours = $tmpproduct->getProductDurationHours();
656 if ($prodDurationHours < 0) {
658 $langs->load(
"errors");
662 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
664 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
665 $txtvaline = $dataforprice[
'tva_tx'];
666 $localtax1line = $dataforprice[
'localtax1'];
667 $localtax2line = $dataforprice[
'localtax2'];
669 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
671 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
672 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
673 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
674 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
675 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
677 $idprodline = $value[
'fk_product'];
683 $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);
691 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
692 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
693 $result = $db->query($sql);
700 } elseif ($generateinvoicemode ==
'onelinepertask') {
701 $arrayoftasks = array();
702 foreach ($toselect as $key => $value) {
704 $object->fetchTimeSpent($value);
706 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
707 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
710 foreach ($arrayoftasks as $task_id => $data) {
711 $ftask =
new Task($db);
712 $ftask->fetch($task_id);
714 foreach ($data as $fk_product => $timespent_data) {
715 $qtyhour = $timespent_data[
'timespent'] / 3600;
719 $prodDurationHours = $prodDurationHoursBase;
720 $idprodline = $idprod;
723 $localtax1line = $localtax1;
724 $localtax2line = $localtax2;
726 if (!empty($fk_product) && $fk_product !== $idprod) {
727 if (!array_key_exists($fk_product, $product_data_cache)) {
728 $result = $tmpproduct->fetch($fk_product);
733 $prodDurationHours = $tmpproduct->getProductDurationHours();
734 if ($prodDurationHours < 0) {
736 $langs->load(
"errors");
740 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
742 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
743 $txtvaline = $dataforprice[
'tva_tx'];
744 $localtax1line = $dataforprice[
'localtax1'];
745 $localtax2line = $dataforprice[
'localtax2'];
747 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
749 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
750 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
751 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
752 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
753 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
755 $idprodline = $fk_product;
759 if ($idprodline > 0) {
761 $pu_ht_for_task = $pu_htline;
764 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
766 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
772 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
774 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
780 $lineName = $ftask->ref .
' - ' . $ftask->label;
781 $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);
790 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
791 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
792 $result = $db->query($sql);
805 $urltoinvoice = $tmpinvoice->getNomUrl(0);
806 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
807 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
817if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
818 $langs->load(
'interventions');
820 if (!empty($projectstatic->socid)) {
821 $projectstatic->fetch_thirdparty();
824 if (!($projectstatic->thirdparty->id > 0)) {
825 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
827 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
828 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
829 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
832 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
834 $tmptimespent =
new Task($db);
835 $fuser =
new User($db);
841 $tmpinter->socid = $projectstatic->thirdparty->id;
843 $tmpinter->fk_project = $projectstatic->id;
844 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
847 $tmpinter->fetch($interToUse);
849 $result = $tmpinter->create($user);
857 $arrayoftasks = array();
858 foreach ($toselect as $key => $value) {
860 $object->fetchTimeSpent($value);
863 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
864 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
865 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
866 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
869 foreach ($arrayoftasks as $timespent_id => $value) {
870 $ftask =
new Task($db);
871 $ftask->fetch($value[
'id']);
873 $qtyhour = $value[
'timespent'] / 3600;
877 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
882 $timespent->fetch($timespent_id);
883 $timespent->intervention_id = $tmpinter->id;
884 $timespent->intervention_line_id = $lineid;
885 $result = $timespent->update($user);
895 $urltointer = $tmpinter->getNomUrl(0);
896 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
897 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
914$form =
new Form($db);
917$userstatic =
new User($db);
919$arrayofselected = is_array($toselect) ? $toselect : array();
921$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
922if (!empty($withproject)) {
923 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
927llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
929if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
933 if ($projectidforalltimes > 0) {
934 $result = $projectstatic->fetch($projectidforalltimes);
935 if (!empty($projectstatic->socid)) {
936 $projectstatic->fetch_thirdparty();
938 $res = $projectstatic->fetch_optionals();
939 } elseif (
$object->fetch($id, $ref) >= 0) {
940 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
943 $result = $projectstatic->fetch(
$object->fk_project);
944 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
945 $projectstatic->fetchComments();
947 if (!empty($projectstatic->socid)) {
948 $projectstatic->fetch_thirdparty();
950 $res = $projectstatic->fetch_optionals();
952 $object->project = clone $projectstatic;
955 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
956 $linktocreatetime =
'';
958 if ($projectstatic->id > 0) {
961 if (empty($id) || $tab ==
'timespent') {
968 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
970 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
972 $param .=
'&search_user=' . ((int) $search_user);
975 $param .=
'&search_month=' . ((int) $search_month);
978 $param .=
'&search_year=' . ((int) $search_year);
983 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
985 $morehtmlref =
'<div class="refidno">';
987 $morehtmlref .= $projectstatic->title;
989 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
990 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
992 $morehtmlref .=
'</div>';
995 if (!$user->hasRight(
'projet',
'all',
'lire')) {
996 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
997 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1000 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1002 print
'<div class="fichecenter">';
1003 print
'<div class="fichehalfleft">';
1004 print
'<div class="underbanner clearboth"></div>';
1006 print
'<table class="border tableforfield centpercent">';
1010 print
'<tr><td class="tdtop">';
1011 print $langs->trans(
"Usage");
1015 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1016 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1017 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1021 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1022 $htmltext = $langs->trans(
"ProjectFollowTasks");
1023 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1027 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"' :
'')) .
'"> ';
1028 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1029 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1032 if (isModEnabled(
'eventorganization')) {
1033 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"' :
'')) .
'"> ';
1034 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1035 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1041 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1042 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1043 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1048 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1050 print($start ? $start :
'?');
1053 print($end ? $end :
'?');
1054 if ($projectstatic->hasDelay()) {
1060 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1061 if ($projectstatic->public) {
1062 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1063 print $langs->trans(
'SharedProject');
1065 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1066 print $langs->trans(
'PrivateProject');
1074 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1080 print
'<div class="fichehalfright">';
1081 print
'<div class="underbanner clearboth"></div>';
1083 print
'<table class="border tableforfield centpercent">';
1086 if (isModEnabled(
'category')) {
1087 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1088 print $form->showCategories($projectstatic->id,
'project', 1);
1093 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1094 if ($projectstatic->description) {
1095 print
'<tr><td class="nottitleforfield" colspan="2">';
1096 print
'<div class="longmessagecut">';
1107 print
'<div class="clearboth"></div>';
1117 $linktocreatetimeBtnStatus = 0;
1118 $linktocreatetimeUrl =
'';
1119 $linktocreatetimeHelpText =
'';
1120 if ($user->hasRight(
'projet',
'time')) {
1121 if ($projectstatic->public || $userRead > 0) {
1122 $linktocreatetimeBtnStatus = 1;
1124 if (!empty($projectidforalltimes)) {
1126 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1127 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1130 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1131 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1134 $linktocreatetimeBtnStatus = -2;
1135 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1138 $linktocreatetimeBtnStatus = -2;
1139 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1142 $paramsbutton = array(
'morecss' =>
'reposition');
1143 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1146 $massactionbutton =
'';
1147 $arrayofmassactions = array();
1149 if ($projectstatic->id > 0) {
1151 if ($projectstatic->usage_bill_time) {
1152 $arrayofmassactions = array(
1153 'generateinvoice' => $langs->trans(
"GenerateBill"),
1157 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1158 $langs->load(
"interventions");
1159 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1163 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1164 $arrayofmassactions = array();
1166 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1171 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1173 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1175 if ($action ==
'deleteline') {
1176 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1177 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1180 $param = ($withproject ?
'&withproject=1' :
'');
1181 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1182 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1184 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1185 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1186 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1188 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1194 if (empty($withproject)) {
1195 $morehtmlref .=
'<div class="refidno">';
1196 $morehtmlref .= $langs->trans(
"Project") .
': ';
1197 $morehtmlref .= $projectstatic->getNomUrl(1);
1198 $morehtmlref .=
'<br>';
1201 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1202 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1203 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1205 $morehtmlref .=
'</div>';
1208 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1210 print
'<div class="fichecenter">';
1211 print
'<div class="fichehalfleft">';
1213 print
'<div class="underbanner clearboth"></div>';
1214 print
'<table class="border centpercent tableforfield">';
1217 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1218 if (
$object->fk_task_parent > 0) {
1219 $tasktmp =
new Task($db);
1220 $tasktmp->fetch(
$object->fk_task_parent);
1221 print $tasktmp->getNomUrl(1);
1226 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1228 print($start ? $start :
'?');
1231 print($end ? $end :
'?');
1238 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1239 if (
$object->planned_workload) {
1247 print
'<div class="fichehalfright">';
1249 print
'<div class="underbanner clearboth"></div>';
1250 print
'<table class="border tableforfield centpercent">';
1253 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1258 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1259 if (
$object->planned_workload) {
1260 $tmparray =
$object->getSummaryOfTimeSpent();
1261 if ($tmparray[
'total_duration'] > 0) {
1262 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1267 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1278 print
'<div class="clearboth"></div>';
1282 if ($action ==
'deleteline') {
1283 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1284 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1289 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1291 $hookmanager->initHooks(array(
'tasktimelist'));
1295 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1297 $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);
1298 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1302 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1303 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1304 if (empty($reshook)) {
1305 $formconfirm .= $hookmanager->resPrint;
1306 } elseif ($reshook > 0) {
1307 $formconfirm = $hookmanager->resPrint;
1314 $arrayfields = array();
1315 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1316 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1317 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1318 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1319 if (! empty($allprojectforuser)) {
1320 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1321 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1323 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1324 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1326 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1327 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1328 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1329 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1331 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1332 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int) isModEnabled(
"salaries"));
1333 $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));
1335 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1340 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1341 $param .=
'&contextpage=' . urlencode($contextpage);
1343 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1344 $param .=
'&limit='.((int) $limit);
1346 if ($search_month > 0) {
1347 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1349 if ($search_year > 0) {
1350 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1352 if (!empty($search_user)) {
1353 $param .=
'&search_user='.urlencode($search_user);
1355 if ($search_task_ref !=
'') {
1356 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1358 if ($search_company !=
'') {
1359 $param .=
'&$search_company=' . urlencode($search_company);
1361 if ($search_company_alias !=
'') {
1362 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1364 if ($search_project_ref !=
'') {
1365 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1367 if ($search_project_label !=
'') {
1368 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1370 if ($search_task_label !=
'') {
1371 $param .=
'&search_task_label=' . urlencode($search_task_label);
1373 if ($search_note !=
'') {
1374 $param .=
'&search_note=' . urlencode($search_note);
1376 if ($search_duration !=
'') {
1377 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1379 if ($optioncss !=
'') {
1380 $param .=
'&optioncss=' . urlencode($optioncss);
1382 if ($search_date_startday) {
1383 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1385 if ($search_date_startmonth) {
1386 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1388 if ($search_date_startyear) {
1389 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1391 if ($search_date_endday) {
1392 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1394 if ($search_date_endmonth) {
1395 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1397 if ($search_date_endyear) {
1398 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1400 if ($search_timespent_starthour) {
1401 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1403 if ($search_timespent_startmin) {
1404 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1406 if ($search_timespent_endhour) {
1407 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1409 if ($search_timespent_endmin) {
1410 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1418 $param .=
'&id=' . urlencode((
string) ($id));
1421 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1424 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1427 $parameters = array(
'param' => &$param);
1428 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1429 $param .= $hookmanager->resPrint;
1431 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1432 if ($optioncss !=
'') {
1433 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1435 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1436 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1437 if ($action ==
'editline') {
1438 print
'<input type="hidden" name="action" value="updateline">';
1439 } elseif ($action ==
'splitline') {
1440 print
'<input type="hidden" name="action" value="updatesplitline">';
1441 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1442 print
'<input type="hidden" name="action" value="addtimespent">';
1443 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1444 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1445 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1446 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1448 print
'<input type="hidden" name="action" value="list">';
1450 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1451 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1453 print
'<input type="hidden" name="id" value="' .
$id .
'">';
1454 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1455 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1456 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1457 print
'<input type="hidden" name="page_y" value="">';
1460 if ($massaction ==
'generateinvoice') {
1461 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1462 print
'<table class="noborder centerpercent">';
1464 print
'<td class="titlefield">';
1465 print $langs->trans(
'DateInvoice');
1468 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1474 print $langs->trans(
'Mode');
1478 'onelineperuser' =>
'OneLinePerUser',
1479 'onelinepertask' =>
'OneLinePerTask',
1480 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1482 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1483 print
"\n" .
'<script type="text/javascript">';
1485 $(document).ready(function () {
1486 setDetailVisibility();
1487 $("#generateinvoicemode").change(function() {
1488 setDetailVisibility();
1490 function setDetailVisibility() {
1491 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1492 if (generateinvoicemode=="onelineperperiod") {
1493 $("#detail_time_duration").show();
1495 $("#detail_time_duration").hide();
1500 print
'</script>' .
"\n";
1501 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1505 if (isModEnabled(
"service")) {
1508 print $langs->trans(
'ServiceToUseOnLines');
1511 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1516 print
'<td class="titlefield">';
1517 print $langs->trans(
'InvoiceToUse');
1520 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1524 print
'<td class="titlefield">';
1525 print $langs->trans(
"CustomerRelativeDiscount");
1528 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1531 print
'<tr class="newinvoicedetail">';
1532 print
'<td class="titlefield">';
1533 print $langs->trans(
"PaymentConditions");
1536 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1550 print
'<div class="center">';
1551 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1552 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1556 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1557 print
'<div class="center">';
1558 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1562 } elseif ($massaction ==
'generateinter') {
1564 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1566 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1568 print
'<table class="noborder centpercent">';
1570 print
'<td class="titlefield">';
1571 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1575 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1580 print
'<div class="center">';
1581 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1582 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1586 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1587 print
'<div class="center">';
1588 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1595 $parameters = array(
1596 'toselect' => $toselect,
1597 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1600 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1604 print $hookmanager->resPrint;
1612 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1613 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1615 $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,";
1616 $sql .=
" t.fk_product,";
1617 $sql .=
" pt.ref, pt.label, pt.fk_projet,";
1618 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1619 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1620 $sql .=
" p.fk_soc,s.name_alias,";
1621 $sql .=
" t.invoice_line_id,";
1622 $sql .=
" pt.billable";
1624 $parameters = array();
1625 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1626 $sql .= $hookmanager->resPrint;
1627 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1631 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1632 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1633 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1634 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1635 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1636 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1637 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1638 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1641 $parameters = array();
1642 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1643 $sql .= $hookmanager->resPrint;
1644 $sql .=
" WHERE elementtype = 'task'";
1645 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1646 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1650 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1651 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1653 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1655 $sql .=
" AND t.fk_element =".((int)
$object->id);
1656 } elseif (!empty($projectidforalltimes)) {
1658 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize((
string) $projectidforalltimes) .
")";
1659 } elseif (!empty($allprojectforuser)) {
1661 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1662 $search_user = $user->id;
1664 if ($search_user > 0) {
1665 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1672 if ($search_task_ref) {
1675 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1676 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1678 if ($search_company) {
1681 if ($search_company_alias) {
1685 if ($search_project_ref) {
1688 if ($search_project_label) {
1691 if ($search_task_label) {
1694 if ($search_user > 0) {
1697 if (!empty($search_product_ref)) {
1700 if ($search_valuebilled ==
'1') {
1701 $sql .=
' AND t.invoice_id > 0';
1703 if ($search_valuebilled ==
'0') {
1704 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1707 if ($search_date_start) {
1708 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1710 if ($search_date_end) {
1711 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1714 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1715 if ($search_timespent_starthour || $search_timespent_startmin) {
1716 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1717 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1718 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1721 if ($search_timespent_endhour || $search_timespent_endmin) {
1722 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1723 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1724 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1728 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1731 $parameters = array();
1732 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1733 $sql .= $hookmanager->resPrint;
1736 $nbtotalofrecords =
'';
1739 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1740 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1741 $resql = $db->query($sqlforcount);
1743 $objforcount = $db->fetch_object($resql);
1744 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1749 if (($page * $limit) > $nbtotalofrecords) {
1757 $sql .= $db->order($sortfield, $sortorder);
1759 $sql .= $db->plimit($limit + 1, $offset);
1762 $resql = $db->query($sql);
1768 $num = $db->num_rows($resql);
1771 if (!empty($projectidforalltimes)) {
1772 print
'<!-- List of time spent for project -->' .
"\n";
1774 $title = $langs->trans(
"ListTaskTimeUserProject");
1776 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1778 print
'<!-- List of time spent -->' .
"\n";
1780 $title = $langs->trans(
"ListTaskTimeForTask");
1782 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1787 $row = $db->fetch_object($resql);
1799 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1800 print
'<!-- table to add time spent -->' .
"\n";
1802 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1805 print
'<div class="div-table-responsive-no-min">';
1806 print
'<table class="noborder nohover centpercent">';
1808 print
'<tr class="liste_titre">';
1809 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1810 if (!empty($allprojectforuser)) {
1811 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1814 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1816 print
'<td>' . $langs->trans(
"By") .
'</td>';
1817 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1818 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1819 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1823 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1824 print
'<td>'.$langs->trans(
"Product").
'</td>';
1828 $parameters = array(
'mode' =>
'create');
1829 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1830 print $hookmanager->resPrint;
1834 print
'<tr class="oddeven nohover">';
1837 print
'<td class="maxwidthonsmartphone">';
1839 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1842 if (!empty($allprojectforuser)) {
1851 print
'<td class="maxwidthonsmartphone">';
1852 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1857 print
'<td class="maxwidthonsmartphone nowraponall">';
1858 $contactsofproject = $projectstatic->getListContactId(
'internal');
1859 if (count($contactsofproject) > 0) {
1860 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1861 if (in_array($user->id, $contactsofproject)) {
1862 $userid = $user->id;
1864 $userid = $contactsofproject[0];
1867 if ($projectstatic->public) {
1868 $contactsofproject = array();
1870 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1873 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1880 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1884 print
'<td class="nowraponall">';
1885 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1886 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1887 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1889 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1893 print
'<td class="nowrap">';
1894 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1902 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1903 print
'<td class="nowraponall">';
1905 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);
1911 $parameters = array(
'mode' =>
'create');
1912 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1913 print $hookmanager->resPrint;
1915 print
'<td class="center">';
1916 $form->buttonsSaveCancel();
1917 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1918 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1927 $moreforfilter =
'';
1929 $parameters = array();
1930 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1931 if (empty($reshook)) {
1932 $moreforfilter .= $hookmanager->resPrint;
1934 $moreforfilter = $hookmanager->resPrint;
1937 if (!empty($moreforfilter)) {
1938 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1939 print $moreforfilter;
1943 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1944 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1945 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1947 print
'<!-- Liste of time spent -->'.
"\n";
1948 print
'<div class="div-table-responsive">';
1949 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1953 print
'<tr class="liste_titre_filter">';
1956 print
'<td class="liste_titre center">';
1957 $searchpicto = $form->showFilterButtons(
'left');
1962 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1963 print
'<td class="liste_titre left">';
1964 print
'<div class="nowrapfordate paddingright">';
1965 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1967 print
'<div class="nowrapfordate">';
1968 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1973 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1974 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1978 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1979 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1982 if (!empty($allprojectforuser)) {
1983 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1984 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
1986 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
1987 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
1991 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1992 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
1993 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
1995 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
1996 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2000 if (!empty($arrayfields[
'author'][
'checked'])) {
2001 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>';
2004 if (!empty($arrayfields[
't.note'][
'checked'])) {
2005 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2008 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2010 print
'<td class="liste_titre right">';
2012 $durationtouse_start =
'';
2013 if ($search_timespent_starthour || $search_timespent_startmin) {
2014 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2016 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
2017 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2020 $durationtouse_end =
'';
2021 if ($search_timespent_endhour || $search_timespent_endmin) {
2022 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2024 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2025 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2031 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2032 print
'<td class="liste_titre right"></td>';
2035 if (!empty($arrayfields[
'value'][
'checked'])) {
2036 print
'<td class="liste_titre"></td>';
2039 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2040 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2048 $parameters = array(
'arrayfields' => $arrayfields);
2049 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2050 print $hookmanager->resPrint;
2053 print
'<td class="liste_titre center">';
2054 $searchpicto = $form->showFilterButtons();
2058 print
'</tr>' .
"\n";
2066 print
'<tr class="liste_titre">';
2068 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2071 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2072 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2075 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2076 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2079 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2081 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2084 if (!empty($allprojectforuser)) {
2085 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2086 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2089 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2090 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2094 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2095 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2096 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2099 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2100 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2104 if (!empty($arrayfields[
'author'][
'checked'])) {
2105 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2108 if (!empty($arrayfields[
't.note'][
'checked'])) {
2109 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2112 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2113 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2116 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2117 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2121 if (!empty($arrayfields[
'value'][
'checked'])) {
2122 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2125 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2126 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2134 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2135 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2136 print $hookmanager->resPrint;
2138 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2143 $tasktmp =
new Task($db);
2144 $tmpinvoice =
new Facture($db);
2147 $param .=
'&page='.((int) $page);
2149 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2157 foreach ($tasks as $task_time) {
2163 $invoiced = $task_time->invoice_id ? true :
false;
2165 $date1 = $db->jdate($task_time->element_date);
2166 $date2 = $db->jdate($task_time->element_datehour);
2170 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2174 print
'<td class="center nowraponall">';
2175 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2176 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2177 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2179 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2180 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2181 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2182 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' :
'').
'">';
2183 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2187 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' :
'') .
'">';
2188 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2192 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' :
'').
'">';
2193 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2196 if ($massactionbutton || $massaction) {
2198 if (in_array($task_time->rowid, $arrayofselected)) {
2204 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2205 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2209 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2210 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2224 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2225 print
'<td class="nowrap">';
2226 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2227 if (empty($task_time->element_date_withhour)) {
2228 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2230 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2233 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2242 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2243 print
'<td class="tdoverflowmax125">';
2244 if ($task_time->fk_soc > 0) {
2245 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2246 $tmpsociete =
new Societe($db);
2247 $tmpsociete->fetch($task_time->fk_soc);
2248 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2250 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2252 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2261 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2263 if ($task_time->fk_soc > 0) {
2264 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2265 $tmpsociete =
new Societe($db);
2266 $tmpsociete->fetch($task_time->fk_soc);
2267 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2269 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2271 $valtoshow = $tmpsociete->name_alias;
2273 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2281 if (!empty($allprojectforuser)) {
2283 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2284 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2285 $tmpproject =
new Project($db);
2286 $tmpproject->fetch($task_time->fk_projet);
2287 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2289 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2291 print
'<td class="nowraponall">';
2292 print $tmpproject->getNomUrl(1);
2299 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2300 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2301 $tmpproject =
new Project($db);
2302 $tmpproject->fetch($task_time->fk_projet);
2303 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2305 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2307 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2308 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2311 print $tmpproject->getNomUrl(1,
'', -1);
2321 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2322 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2323 print
'<td class="nowrap">';
2324 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2325 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (string) $projectstatic->id,
'');
2327 $tasktmp->id = $task_time->fk_element;
2328 $tasktmp->ref = $task_time->ref;
2329 $tasktmp->label = $task_time->label;
2330 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2337 } elseif ($action !==
'createtime') {
2338 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2342 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2343 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2344 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2345 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2348 $tasktmp->id = $task_time->fk_element;
2349 $tasktmp->ref = $task_time->ref;
2350 $tasktmp->label = $task_time->label;
2351 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2361 if (!empty($arrayfields[
'author'][
'checked'])) {
2362 print
'<td class="tdoverflowmax125">';
2363 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2366 $object->fetch($task_time->fk_element);
2368 $contactsoftask =
$object->getListContactId(
'internal');
2369 if (!in_array($task_time->fk_user, $contactsoftask)) {
2370 $contactsoftask[] = $task_time->fk_user;
2372 if (count($contactsoftask) > 0) {
2373 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2374 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2376 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2379 $userstatic->id = $task_time->fk_user;
2380 $userstatic->lastname = $task_time->lastname;
2381 $userstatic->firstname = $task_time->firstname;
2382 $userstatic->photo = $task_time->photo;
2383 $userstatic->gender = $task_time->gender;
2384 $userstatic->status = $task_time->user_status;
2386 print $userstatic->getNomUrl(-1);
2395 if (!empty($arrayfields[
't.note'][
'checked'])) {
2396 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2397 print
'<td class="small">';
2398 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2401 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2408 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2409 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2413 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2414 print
'<td class="right nowraponall">';
2415 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2416 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2417 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2428 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2429 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2431 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2437 $totalarray[
'totalduration'] = $task_time->element_duration;
2439 $totalarray[
'totalduration'] += $task_time->element_duration;
2444 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2445 print
'<td class="nowraponall">';
2446 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2448 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);
2449 } elseif (!empty($task_time->fk_product)) {
2451 $resultFetch = $product->fetch($task_time->fk_product);
2452 if ($resultFetch < 0) {
2455 print $product->getNomUrl(1);
2465 if (!empty($arrayfields[
'value'][
'checked'])) {
2466 $langs->load(
"salaries");
2467 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2469 print
'<td class="nowraponall right">';
2470 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2471 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2496 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2497 print
'<td class="center">';
2499 if ($projectstatic->usage_bill_time) {
2500 if ($task_time->invoice_id) {
2501 $result = $tmpinvoice->fetch($task_time->invoice_id);
2503 if ($user->hasRight(
'facture',
'lire')) {
2504 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2505 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2507 print $tmpinvoice->getNomUrl(1);
2508 if (!empty($task_time->invoice_line_id)) {
2510 $invoiceLine->fetch($task_time->invoice_line_id);
2511 if (!empty($invoiceLine->id)) {
2512 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2513 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2518 print $langs->trans(
"Yes");
2523 if (intval($task_time->billable) == 1) {
2524 print $langs->trans(
"No");
2526 print $langs->trans(
"Disabled");
2530 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2545 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2546 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2547 print $hookmanager->resPrint;
2551 print
'<td class="center nowraponall">';
2552 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2553 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2554 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2556 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2557 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2558 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2559 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' :
'').
'">';
2560 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2564 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' :
'') .
'">';
2565 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2569 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' :
'').
'">';
2570 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2573 if ($massactionbutton || $massaction) {
2575 if (in_array($task_time->rowid, $arrayofselected)) {
2581 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2582 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2586 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2587 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2605 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2606 print
'<!-- first line -->';
2607 print
'<tr class="oddeven">';
2615 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2616 print
'<td class="nowrap">';
2617 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2618 if (empty($task_time->element_date_withhour)) {
2619 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2621 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2624 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2630 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2631 print
'<td class="nowrap">';
2636 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2637 print
'<td class="nowrap">';
2642 if (!empty($allprojectforuser)) {
2643 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2644 print
'<td class="nowrap">';
2650 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2651 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2652 print
'<td class="nowrap">';
2653 $tasktmp->id = $task_time->fk_element;
2654 $tasktmp->ref = $task_time->ref;
2655 $tasktmp->label = $task_time->label;
2656 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2662 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2663 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2664 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2671 if (!empty($arrayfields[
'author'][
'checked'])) {
2672 print
'<td class="nowraponall">';
2673 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2675 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2678 $contactsoftask =
$object->getListContactId(
'internal');
2679 if (!in_array($task_time->fk_user, $contactsoftask)) {
2680 $contactsoftask[] = $task_time->fk_user;
2682 if (count($contactsoftask) > 0) {
2683 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2684 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2686 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2689 $userstatic->id = $task_time->fk_user;
2690 $userstatic->lastname = $task_time->lastname;
2691 $userstatic->firstname = $task_time->firstname;
2692 $userstatic->photo = $task_time->photo;
2693 $userstatic->status = $task_time->user_status;
2694 print $userstatic->getNomUrl(-1);
2700 if (!empty($arrayfields[
't.note'][
'checked'])) {
2701 print
'<td class="tdoverflowmax300">';
2702 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2703 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2708 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2709 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2713 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2714 print
'<td class="right">';
2715 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2716 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2717 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2725 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2726 print
'<td class="nowraponall tdoverflowmax125">';
2731 if (!empty($arrayfields[
'value'][
'checked'])) {
2732 print
'<td class="right">';
2733 print
'<span class="amount">';
2734 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2735 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2741 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2742 print
'<td class="right">';
2743 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2744 if (isset($task_time->total_ht)) {
2745 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2756 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2757 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2758 print $hookmanager->resPrint;
2762 print
'<td class="center nowraponall">';
2771 print
'<!-- second line --><tr class="oddeven">';
2775 print
'<td class="center nowraponall">';
2780 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2781 print
'<td class="nowraponall">';
2782 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2783 if (empty($task_time->element_date_withhour)) {
2784 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2786 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2789 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2795 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2801 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2807 if (!empty($allprojectforuser)) {
2808 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2815 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2816 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2817 print
'<td class="nowraponall">';
2818 $tasktmp->id = $task_time->fk_element;
2819 $tasktmp->ref = $task_time->ref;
2820 $tasktmp->label = $task_time->label;
2821 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2827 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2828 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2829 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2836 if (!empty($arrayfields[
'author'][
'checked'])) {
2837 print
'<td class="nowraponall tdoverflowmax100">';
2838 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2840 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2843 $contactsoftask =
$object->getListContactId(
'internal');
2844 if (!in_array($task_time->fk_user, $contactsoftask)) {
2845 $contactsoftask[] = $task_time->fk_user;
2847 if (count($contactsoftask) > 0) {
2848 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2849 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2851 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2854 $userstatic->id = $task_time->fk_user;
2855 $userstatic->lastname = $task_time->lastname;
2856 $userstatic->firstname = $task_time->firstname;
2857 $userstatic->photo = $task_time->photo;
2858 $userstatic->status = $task_time->user_status;
2859 print $userstatic->getNomUrl(-1);
2865 if (!empty($arrayfields[
't.note'][
'checked'])) {
2866 print
'<td class="small tdoverflowmax300"">';
2867 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2868 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2873 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2874 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2878 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2879 print
'<td class="right">';
2880 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2881 print
'<input type="hidden" name="old_duration_2" value="0">';
2882 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2890 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2891 print
'<td class="nowraponall tdoverflowmax125">';
2896 if (!empty($arrayfields[
'value'][
'checked'])) {
2897 print
'<td class="right">';
2898 print
'<span class="amount nowraponall">';
2900 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2907 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2908 print
'<td class="right">';
2909 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2910 if (isset($task_time->total_ht)) {
2911 print
'<span class="amount nowraponall">';
2912 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2924 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2925 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2926 print $hookmanager->resPrint;
2930 print
'<td class="center nowraponall">';
2943 print
'<tr class="liste_total">';
2948 if ($num < $limit && empty($offset)) {
2949 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2951 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2965 if (!count($tasks)) {
2966 $totalnboffields = 1;
2967 foreach ($arrayfields as $value) {
2968 if (!empty($value[
'checked'])) {
2972 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2973 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2977 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2978 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2979 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.