35require
'../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
37require_once DOL_DOCUMENT_ROOT .
'/projet/class/task.class.php';
38require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
39require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
40require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
43require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
46$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
47if (isModEnabled(
'eventorganization')) {
48 $langsLoad[] =
'eventorganization';
51$langs->loadLangs($langsLoad);
53$action =
GETPOST(
'action',
'alpha');
54$massaction =
GETPOST(
'massaction',
'alpha');
55$confirm =
GETPOST(
'confirm',
'alpha');
56$cancel =
GETPOST(
'cancel',
'alpha');
57$toselect =
GETPOST(
'toselect',
'array');
58$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
59$backtopage =
GETPOST(
'backtopage',
'alpha');
60$optioncss =
GETPOST(
'optioncss',
'alpha');
61$mode =
GETPOST(
'mode',
'alpha');
67$project_ref =
GETPOST(
'project_ref',
'alpha');
73$search_date_startday =
GETPOSTINT(
'search_date_startday');
74$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
75$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
76$search_date_endday =
GETPOSTINT(
'search_date_endday');
77$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
78$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
79$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
80$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
81$search_note =
GETPOST(
'search_note',
'alpha');
82$search_duration =
GETPOST(
'search_duration',
'alpha');
83$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
84$search_task_label =
GETPOST(
'search_task_label',
'alpha');
85$search_user =
GETPOST(
'search_user',
'intcomma');
86$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
87$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
88$search_company =
GETPOST(
'$search_company',
'alpha');
89$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
90$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
91$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
92$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
93$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
94$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
95$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
98$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
99$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
101if (empty($page) || $page == -1) {
104$offset = $limit * $page;
105$pageprev = $page - 1;
106$pagenext = $page + 1;
108 $sortfield =
't.element_date,t.element_datehour,t.rowid';
111 $sortorder =
'DESC,DESC,DESC';
114$childids = $user->getAllChildIds(1);
118$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
122$projectstatic =
new Project($db);
125$extrafields->fetch_name_optionals_label($projectstatic->table_element);
126$extrafields->fetch_name_optionals_label(
$object->table_element);
129if ($id > 0 || $ref) {
137if (!$user->hasRight(
'projet',
'lire')) {
146 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
147 $search_user = $user->id;
156if (
GETPOST(
'cancel',
'alpha')) {
159if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
163$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
164$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
169include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
172if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
177 $search_duration =
'';
178 $search_date_startday =
'';
179 $search_date_startmonth =
'';
180 $search_date_startyear =
'';
181 $search_date_endday =
'';
182 $search_date_endmonth =
'';
183 $search_date_endyear =
'';
184 $search_date_start =
'';
185 $search_date_end =
'';
186 $search_task_ref =
'';
187 $search_company =
'';
188 $search_company_alias =
'';
189 $search_project_ref =
'';
190 $search_project_label =
'';
191 $search_task_label =
'';
193 $search_valuebilled =
'';
194 $search_product_ref =
'';
196 $search_array_options = array();
197 $search_timespent_starthour =
'';
198 $search_timespent_startmin =
'';
199 $search_timespent_endhour =
'';
200 $search_timespent_endmin =
'';
204if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
207 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
208 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
209 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
210 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
214 $langs->load(
"errors");
215 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
224 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
225 $action =
'createtime';
235 if (empty(
$object->project->status)) {
236 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
237 $action =
'createtime';
248 $object->timespent_withhour = 1;
251 $object->timespent_withhour = 0;
256 $result =
$object->addTimeSpent($user);
267 $action =
'createtime';
271if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
274 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
275 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
287 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
288 $result =
$object->delTimeSpent($user);
291 $object->fetch($id_temp, $ref);
293 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
297 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
299 $object->timespent_withhour = 1;
302 $object->timespent_withhour = 0;
310 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
311 $result =
$object->addTimeSpent($user);
323 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
327 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
329 $object->timespent_withhour = 1;
332 $object->timespent_withhour = 0;
340 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
341 $result =
$object->updateTimeSpent($user);
356if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
359 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
360 $result =
$object->delTimeSpent($user);
363 $langs->load(
"errors");
374if (!empty($project_ref) && !empty($withproject)) {
375 if ($projectstatic->fetch(0, $project_ref) > 0) {
376 $tasksarray =
$object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
377 if (count($tasksarray) > 0) {
378 $id = $tasksarray[0]->id;
380 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
387$projectidforalltimes = 0;
389 $projectidforalltimes =
GETPOSTINT(
'projectid');
391 $result = $projectstatic->fetch($projectidforalltimes);
392 if (!empty($projectstatic->socid)) {
393 $projectstatic->fetch_thirdparty();
395 $res = $projectstatic->fetch_optionals();
396} elseif (
GETPOST(
'project_ref',
'alpha')) {
397 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
398 $projectidforalltimes = $projectstatic->id;
402 $result = $projectstatic->fetch(
$object->fk_project);
405if ($id <= 0 && $projectidforalltimes == 0) {
406 $allprojectforuser = $user->id;
409if ($action ==
'confirm_generateinvoice') {
410 if (!empty($projectstatic->socid)) {
411 $projectstatic->fetch_thirdparty();
414 if (!($projectstatic->thirdparty->id > 0)) {
415 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
417 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
418 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
419 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
421 $tmpinvoice =
new Facture($db);
422 $tmptimespent =
new Task($db);
423 $tmpproduct =
new Product($db);
424 $fuser =
new User($db);
429 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
432 $prodDurationHoursBase = 1.0;
433 $product_data_cache = array();
435 $tmpproduct->fetch($idprod);
441 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
442 if ($prodDurationHoursBase < 0) {
444 $langs->load(
"errors");
448 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
450 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
451 $txtva = $dataforprice[
'tva_tx'];
452 $localtax1 = $dataforprice[
'localtax1'];
453 $localtax2 = $dataforprice[
'localtax2'];
455 $prodDurationHoursBase = 1;
463 $tmpinvoice->socid = $projectstatic->thirdparty->id;
465 $tmpinvoice->fk_project = $projectstatic->id;
466 $tmpinvoice->cond_reglement_id = $condidproject;
467 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
468 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
471 $tmpinvoice->fetch($invoiceToUse);
473 $result = $tmpinvoice->create($user);
481 if ($generateinvoicemode ==
'onelineperuser') {
482 $arrayoftasks = array();
483 foreach ($toselect as $key => $value) {
485 $object->fetchTimeSpent($value);
486 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
487 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
490 foreach ($arrayoftasks as $userid => $data) {
491 $fuser->fetch($userid);
492 $username = $fuser->getFullName($langs);
494 foreach ($data as $fk_product => $timespent_data) {
496 $qtyhour = $timespent_data[
'timespent'] / 3600;
497 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
503 } elseif ($idprod <= 0) {
506 $pu_ht = $fuser->thm;
511 if ($timespent_data[
'timespent']) {
512 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
517 $prodDurationHours = $prodDurationHoursBase;
518 $idprodline = $idprod;
521 $localtax1line = $localtax1;
522 $localtax2line = $localtax2;
525 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
526 if (!array_key_exists($fk_product, $product_data_cache)) {
527 $result = $tmpproduct->fetch($fk_product);
532 $prodDurationHours = $tmpproduct->getProductDurationHours();
533 if ($prodDurationHours < 0) {
535 $langs->load(
"errors");
539 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
541 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
542 $txtvaline = $dataforprice[
'tva_tx'];
543 $localtax1line = $dataforprice[
'localtax1'];
544 $localtax2line = $dataforprice[
'localtax2'];
546 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
548 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
549 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
550 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
551 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
552 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
554 $idprodline = $fk_product;
558 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice", $username) .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
565 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
566 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
567 $result = $db->query($sql);
575 } elseif ($generateinvoicemode ==
'onelineperperiod') {
576 $arrayoftasks = array();
578 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
579 foreach ($toselect as $key => $value) {
581 $object->fetchTimeSpent($value);
583 $ftask =
new Task($db);
586 $fuser->fetch(
$object->timespent_fk_user);
587 $username = $fuser->getFullName($langs);
589 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
590 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
591 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
594 if (!empty($withdetail)) {
595 if (!empty(
$object->timespent_withhour)) {
602 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
603 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
606 foreach ($arrayoftasks as $timespent_id => $value) {
607 $userid = $value[
'user'];
611 $qtyhour = $value[
'timespent'] / 3600;
615 $pu_ht =
price2num($value[
'totalvaluetodivideby3600'] / 3600,
'MU');
619 $prodDurationHours = $prodDurationHoursBase;
620 $idprodline = $idprod;
623 $localtax1line = $localtax1;
624 $localtax2line = $localtax2;
626 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
627 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
628 $result = $tmpproduct->fetch($value[
'fk_product']);
633 $prodDurationHours = $tmpproduct->getProductDurationHours();
634 if ($prodDurationHours < 0) {
636 $langs->load(
"errors");
640 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
642 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
643 $txtvaline = $dataforprice[
'tva_tx'];
644 $localtax1line = $dataforprice[
'localtax1'];
645 $localtax2line = $dataforprice[
'localtax2'];
647 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
649 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
650 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
651 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
652 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
653 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
655 $idprodline = $value[
'fk_product'];
657 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
665 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
666 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
667 $result = $db->query($sql);
674 } elseif ($generateinvoicemode ==
'onelinepertask') {
675 $arrayoftasks = array();
676 foreach ($toselect as $key => $value) {
678 $object->fetchTimeSpent($value);
680 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
681 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
684 foreach ($arrayoftasks as $task_id => $data) {
685 $ftask =
new Task($db);
686 $ftask->fetch($task_id);
688 foreach ($data as $fk_product => $timespent_data) {
689 $qtyhour = $timespent_data[
'timespent'] / 3600;
690 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
693 $prodDurationHours = $prodDurationHoursBase;
694 $idprodline = $idprod;
697 $localtax1line = $localtax1;
698 $localtax2line = $localtax2;
700 if (!empty($fk_product) && $fk_product !== $idprod) {
701 if (!array_key_exists($fk_product, $product_data_cache)) {
702 $result = $tmpproduct->fetch($fk_product);
707 $prodDurationHours = $tmpproduct->getProductDurationHours();
708 if ($prodDurationHours < 0) {
710 $langs->load(
"errors");
714 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
716 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
717 $txtvaline = $dataforprice[
'tva_tx'];
718 $localtax1line = $dataforprice[
'localtax1'];
719 $localtax2line = $dataforprice[
'localtax2'];
721 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
723 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
724 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
725 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
726 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
727 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
729 $idprodline = $fk_product;
733 if ($idprodline > 0) {
735 $pu_ht_for_task = $pu_htline;
738 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
740 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
746 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
748 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
754 $lineName = $ftask->ref .
' - ' . $ftask->label;
755 $lineid = $tmpinvoice->addline($lineName, $pu_ht_for_task,
price2num($qtyhour / $prodDurationHours,
'MS'), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject, $date_start, $date_end, 0, 0,
'',
'HT', 0, 1, -1, 0,
'', 0, 0, null, $pa_ht);
764 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
765 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
766 $result = $db->query($sql);
779 $urltoinvoice = $tmpinvoice->getNomUrl(0);
780 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
781 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
793if ($action ==
'confirm_generateinter') {
794 $langs->load(
'interventions');
796 if (!empty($projectstatic->socid)) {
797 $projectstatic->fetch_thirdparty();
800 if (!($projectstatic->thirdparty->id > 0)) {
801 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
803 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
804 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
805 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
808 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
810 $tmptimespent =
new Task($db);
811 $fuser =
new User($db);
817 $tmpinter->socid = $projectstatic->thirdparty->id;
819 $tmpinter->fk_project = $projectstatic->id;
820 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
823 $tmpinter->fetch($interToUse);
825 $result = $tmpinter->create($user);
833 $arrayoftasks = array();
834 foreach ($toselect as $key => $value) {
836 $object->fetchTimeSpent($value);
839 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
840 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
841 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
842 $arrayoftasks[
$object->timespent_id][
'date'] = date(
'Y-m-d H:i:s',
$object->timespent_datehour);
845 foreach ($arrayoftasks as $timespent_id => $value) {
846 $ftask =
new Task($db);
847 $ftask->fetch($value[
'id']);
849 $qtyhour = $value[
'timespent'] / 3600;
850 $qtyhourtext =
convertSecondToTime($value[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
853 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), $value[
'date'], $value[
'timespent']);
858 $urltointer = $tmpinter->getNomUrl(0);
859 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
860 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
877$form =
new Form($db);
880$userstatic =
new User($db);
882$arrayofselected = is_array($toselect) ? $toselect : array();
884$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
885if (!empty($withproject)) {
886 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
892if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
896 if ($projectidforalltimes > 0) {
897 $result = $projectstatic->fetch($projectidforalltimes);
898 if (!empty($projectstatic->socid)) {
899 $projectstatic->fetch_thirdparty();
901 $res = $projectstatic->fetch_optionals();
902 } elseif (
$object->fetch($id, $ref) >= 0) {
903 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
906 $result = $projectstatic->fetch(
$object->fk_project);
907 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
908 $projectstatic->fetchComments();
910 if (!empty($projectstatic->socid)) {
911 $projectstatic->fetch_thirdparty();
913 $res = $projectstatic->fetch_optionals();
915 $object->project = clone $projectstatic;
918 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
919 $linktocreatetime =
'';
921 if ($projectstatic->id > 0) {
924 if (empty($id) || $tab ==
'timespent') {
931 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
933 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
935 $param .=
'&search_user=' . ((int) $search_user);
938 $param .=
'&search_month=' . ((int) $search_month);
941 $param .=
'&search_year=' . ((int) $search_year);
946 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
948 $morehtmlref =
'<div class="refidno">';
950 $morehtmlref .= $projectstatic->title;
952 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
953 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
955 $morehtmlref .=
'</div>';
958 if (!$user->hasRight(
'projet',
'all',
'lire')) {
959 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
960 $projectstatic->next_prev_filter =
"rowid IN (" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0') .
")";
963 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
965 print
'<div class="fichecenter">';
966 print
'<div class="fichehalfleft">';
967 print
'<div class="underbanner clearboth"></div>';
969 print
'<table class="border tableforfield centpercent">';
973 print
'<tr><td class="tdtop">';
974 print $langs->trans(
"Usage");
978 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
979 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
980 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
984 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
985 $htmltext = $langs->trans(
"ProjectFollowTasks");
986 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
990 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"' :
'')) .
'"> ';
991 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
992 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
995 if (isModEnabled(
'eventorganization')) {
996 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"' :
'')) .
'"> ';
997 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
998 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1004 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1005 if ($projectstatic->public) {
1006 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1007 print $langs->trans(
'SharedProject');
1009 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1010 print $langs->trans(
'PrivateProject');
1015 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1016 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1017 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency) .
'</span>';
1022 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1024 print($start ? $start :
'?');
1027 print($end ? $end :
'?');
1028 if ($projectstatic->hasDelay()) {
1037 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1043 print
'<div class="fichehalfright">';
1044 print
'<div class="underbanner clearboth"></div>';
1046 print
'<table class="border tableforfield centpercent">';
1049 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>';
1054 if (isModEnabled(
'category')) {
1055 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1056 print $form->showCategories($projectstatic->id,
'project', 1);
1065 print
'<div class="clearboth"></div>';
1075 $linktocreatetimeBtnStatus = 0;
1076 $linktocreatetimeUrl =
'';
1077 $linktocreatetimeHelpText =
'';
1078 if ($user->hasRight(
'projet',
'time')) {
1079 if ($projectstatic->public || $userRead > 0) {
1080 $linktocreatetimeBtnStatus = 1;
1082 if (!empty($projectidforalltimes)) {
1084 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1085 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1088 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1089 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1092 $linktocreatetimeBtnStatus = -2;
1093 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1096 $linktocreatetimeBtnStatus = -2;
1097 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1100 $paramsbutton = array(
'morecss' =>
'reposition');
1101 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1104 $massactionbutton =
'';
1105 $arrayofmassactions = array();
1107 if ($projectstatic->id > 0) {
1109 if ($projectstatic->usage_bill_time) {
1110 $arrayofmassactions = array(
1111 'generateinvoice' => $langs->trans(
"GenerateBill"),
1115 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1116 $langs->load(
"interventions");
1117 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1121 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1122 $arrayofmassactions = array();
1124 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1129 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1131 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1133 if ($action ==
'deleteline') {
1134 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1135 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1138 $param = ($withproject ?
'&withproject=1' :
'');
1139 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1140 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1142 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1143 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1144 $object->next_prev_filter =
"fk_projet IN (" . $db->sanitize($projectsListId) .
")";
1146 $object->next_prev_filter =
"fk_projet = " . ((int) $projectstatic->id);
1152 if (empty($withproject)) {
1153 $morehtmlref .=
'<div class="refidno">';
1154 $morehtmlref .= $langs->trans(
"Project") .
': ';
1155 $morehtmlref .= $projectstatic->getNomUrl(1);
1156 $morehtmlref .=
'<br>';
1159 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1160 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1161 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1163 $morehtmlref .=
'</div>';
1166 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1168 print
'<div class="fichecenter">';
1169 print
'<div class="fichehalfleft">';
1171 print
'<div class="underbanner clearboth"></div>';
1172 print
'<table class="border centpercent tableforfield">';
1175 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1176 if (
$object->fk_task_parent > 0) {
1177 $tasktmp =
new Task($db);
1178 $tasktmp->fetch(
$object->fk_task_parent);
1179 print $tasktmp->getNomUrl(1);
1184 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1186 print($start ? $start :
'?');
1189 print($end ? $end :
'?');
1196 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1197 if (
$object->planned_workload) {
1205 print
'<div class="fichehalfright">';
1207 print
'<div class="underbanner clearboth"></div>';
1208 print
'<table class="border tableforfield centpercent">';
1211 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1216 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1217 if (
$object->planned_workload) {
1218 $tmparray =
$object->getSummaryOfTimeSpent();
1219 if ($tmparray[
'total_duration'] > 0) {
1220 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1225 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1236 print
'<div class="clearboth"></div>';
1240 if ($action ==
'deleteline') {
1241 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1242 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1247 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1249 $hookmanager->initHooks(array(
'tasktimelist'));
1253 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1255 $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);
1256 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1260 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1261 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1262 if (empty($reshook)) {
1263 $formconfirm .= $hookmanager->resPrint;
1264 } elseif ($reshook > 0) {
1265 $formconfirm = $hookmanager->resPrint;
1272 $arrayfields = array();
1273 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' => 1);
1274 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' => 1);
1275 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1276 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1277 if (! empty($allprojectforuser)) {
1278 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' => 1];
1279 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' => 1];
1281 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' => 1);
1282 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' => 1);
1284 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' => 1);
1285 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' => 1);
1286 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1287 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' => 1);
1289 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' => 1);
1290 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' => 1,
'enabled' => isModEnabled(
"salaries"));
1291 $arrayfields[
'valuebilled'] = array(
'label' => $langs->trans(
"Billed"),
'checked' => 1,
'enabled' => (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1293 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1296 '@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields';
1299 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1300 $param .=
'&contextpage=' . urlencode($contextpage);
1302 if ($limit > 0 && $limit != $conf->liste_limit) {
1303 $param .=
'&limit='.((int) $limit);
1305 if ($search_month > 0) {
1306 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1308 if ($search_year > 0) {
1309 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1311 if (!empty($search_user)) {
1312 $param .=
'&search_user='.urlencode($search_user);
1314 if ($search_task_ref !=
'') {
1315 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1317 if ($search_company !=
'') {
1318 $param .=
'&$search_company=' . urlencode($search_company);
1320 if ($search_company_alias !=
'') {
1321 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1323 if ($search_project_ref !=
'') {
1324 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1326 if ($search_project_label !=
'') {
1327 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1329 if ($search_task_label !=
'') {
1330 $param .=
'&search_task_label=' . urlencode($search_task_label);
1332 if ($search_note !=
'') {
1333 $param .=
'&search_note=' . urlencode($search_note);
1335 if ($search_duration !=
'') {
1336 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1338 if ($optioncss !=
'') {
1339 $param .=
'&optioncss=' . urlencode($optioncss);
1341 if ($search_date_startday) {
1342 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1344 if ($search_date_startmonth) {
1345 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1347 if ($search_date_startyear) {
1348 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1350 if ($search_date_endday) {
1351 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1353 if ($search_date_endmonth) {
1354 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1356 if ($search_date_endyear) {
1357 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1359 if ($search_timespent_starthour) {
1360 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1362 if ($search_timespent_startmin) {
1363 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1365 if ($search_timespent_endhour) {
1366 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1368 if ($search_timespent_endmin) {
1369 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1377 $param .=
'&id=' . urlencode((
string) ($id));
1380 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1383 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1386 $parameters = array(
'param' => &$param);
1387 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1388 $param .= $hookmanager->resPrint;
1390 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1391 if ($optioncss !=
'') {
1392 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1394 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1395 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1396 if ($action ==
'editline') {
1397 print
'<input type="hidden" name="action" value="updateline">';
1398 } elseif ($action ==
'splitline') {
1399 print
'<input type="hidden" name="action" value="updatesplitline">';
1400 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1401 print
'<input type="hidden" name="action" value="addtimespent">';
1402 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1403 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1404 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1405 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1407 print
'<input type="hidden" name="action" value="list">';
1409 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1410 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1412 print
'<input type="hidden" name="id" value="' . $id .
'">';
1413 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1414 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1415 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1416 print
'<input type="hidden" name="page_y" value="">';
1419 if ($massaction ==
'generateinvoice') {
1420 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1421 print
'<table class="noborder centerpercent">';
1423 print
'<td class="titlefield">';
1424 print $langs->trans(
'DateInvoice');
1427 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1433 print $langs->trans(
'Mode');
1437 'onelineperuser' =>
'OneLinePerUser',
1438 'onelinepertask' =>
'OneLinePerTask',
1439 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1441 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1442 print
"\n" .
'<script type="text/javascript">';
1444 $(document).ready(function () {
1445 setDetailVisibility();
1446 $("#generateinvoicemode").change(function() {
1447 setDetailVisibility();
1449 function setDetailVisibility() {
1450 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1451 if (generateinvoicemode=="onelineperperiod") {
1452 $("#detail_time_duration").show();
1454 $("#detail_time_duration").hide();
1459 print
'</script>' .
"\n";
1460 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1464 if (isModEnabled(
"service")) {
1467 print $langs->trans(
'ServiceToUseOnLines');
1470 $form->select_produits(
'',
'productid',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1475 print
'<td class="titlefield">';
1476 print $langs->trans(
'InvoiceToUse');
1479 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1483 print
'<td class="titlefield">';
1484 print $langs->trans(
"CustomerRelativeDiscount");
1487 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1490 print
'<tr class="newinvoicedetail">';
1491 print
'<td class="titlefield">';
1492 print $langs->trans(
"PaymentConditions");
1495 print $form->getSelectConditionsPaiements($projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1509 print
'<div class="center">';
1510 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1511 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1515 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1516 print
'<div class="center">';
1517 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1521 } elseif ($massaction ==
'generateinter') {
1523 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1525 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1527 print
'<table class="noborder centpercent">';
1529 print
'<td class="titlefield">';
1530 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1534 print $forminter->select_interventions($projectstatic->thirdparty->id,
'',
'interid', 24, $langs->trans(
'NewInter'),
true);
1539 print
'<div class="center">';
1540 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1541 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1545 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1546 print
'<div class="center">';
1547 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1554 $parameters = array(
1555 'toselect' => $toselect,
1556 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1559 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1563 print $hookmanager->resPrint;
1571 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1572 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1574 $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,";
1575 $sql .=
" t.fk_product,";
1576 $sql .=
" pt.ref, pt.label, pt.fk_projet,";
1577 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1578 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1579 $sql .=
" p.fk_soc,s.name_alias,";
1580 $sql .=
" t.invoice_line_id";
1582 $parameters = array();
1583 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1584 $sql .= $hookmanager->resPrint;
1585 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1589 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1590 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1591 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1592 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1593 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1594 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1595 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1596 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1599 $parameters = array();
1600 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1601 $sql .= $hookmanager->resPrint;
1602 $sql .=
" WHERE elementtype = 'task'";
1603 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1604 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1608 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1609 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1611 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1613 $sql .=
" AND t.fk_element =".((int)
$object->id);
1614 } elseif (!empty($projectidforalltimes)) {
1616 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize($projectidforalltimes) .
")";
1617 } elseif (!empty($allprojectforuser)) {
1619 if (empty($search_user)) {
1620 $search_user = $user->id;
1622 if ($search_user > 0) {
1623 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1630 if ($search_task_ref) {
1633 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1634 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1636 if ($search_company) {
1639 if ($search_company_alias) {
1643 if ($search_project_ref) {
1646 if ($search_project_label) {
1649 if ($search_task_label) {
1652 if ($search_user > 0) {
1655 if (!empty($search_product_ref)) {
1658 if ($search_valuebilled ==
'1') {
1659 $sql .=
' AND t.invoice_id > 0';
1661 if ($search_valuebilled ==
'0') {
1662 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1665 if ($search_date_start) {
1666 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1668 if ($search_date_end) {
1669 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1672 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1673 if ($search_timespent_starthour || $search_timespent_startmin) {
1674 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1675 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1676 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1679 if ($search_timespent_endhour || $search_timespent_endmin) {
1680 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1681 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1682 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1686 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1689 $parameters = array();
1690 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1691 $sql .= $hookmanager->resPrint;
1694 $nbtotalofrecords =
'';
1697 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1698 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1699 $resql = $db->query($sqlforcount);
1701 $objforcount = $db->fetch_object($resql);
1702 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1707 if (($page * $limit) > $nbtotalofrecords) {
1715 $sql .= $db->order($sortfield, $sortorder);
1717 $sql .= $db->plimit($limit + 1, $offset);
1720 $resql = $db->query($sql);
1726 $num = $db->num_rows($resql);
1729 if (!empty($projectidforalltimes)) {
1730 print
'<!-- List of time spent for project -->' .
"\n";
1732 $title = $langs->trans(
"ListTaskTimeUserProject");
1734 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1736 print
'<!-- List of time spent -->' .
"\n";
1738 $title = $langs->trans(
"ListTaskTimeForTask");
1740 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1745 $row = $db->fetch_object($resql);
1757 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1758 print
'<!-- table to add time spent -->' .
"\n";
1760 print
'<input type="hidden" name="taskid" value="' . $id .
'">';
1763 print
'<div class="div-table-responsive-no-min">';
1764 print
'<table class="noborder nohover centpercent">';
1766 print
'<tr class="liste_titre">';
1767 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1768 if (!empty($allprojectforuser)) {
1769 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1772 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1774 print
'<td>' . $langs->trans(
"By") .
'</td>';
1775 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1776 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1777 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1781 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1782 print
'<td>'.$langs->trans(
"Product").
'</td>';
1786 $parameters = array(
'mode' =>
'create');
1787 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1788 print $hookmanager->resPrint;
1792 print
'<tr class="oddeven nohover">';
1795 print
'<td class="maxwidthonsmartphone">';
1797 print $form->selectDate($newdate,
'time', ($conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1800 if (!empty($allprojectforuser)) {
1809 print
'<td class="maxwidthonsmartphone">';
1810 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth300', $projectstatic->id,
'progress');
1815 print
'<td class="maxwidthonsmartphone nowraponall">';
1816 $contactsofproject = $projectstatic->getListContactId(
'internal');
1817 if (count($contactsofproject) > 0) {
1818 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1819 if (in_array($user->id, $contactsofproject)) {
1820 $userid = $user->id;
1822 $userid = $contactsofproject[0];
1825 if ($projectstatic->public) {
1826 $contactsofproject = array();
1828 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0,
'', 0,
'', $contactsofproject, 0, 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1831 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1838 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1842 print
'<td class="nowraponall">';
1843 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1844 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1845 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1847 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1851 print
'<td class="nowrap">';
1852 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1860 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1861 print
'<td class="nowraponall">';
1863 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', 0,
'', null, 1);
1869 $parameters = array(
'mode' =>
'create');
1870 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1871 print $hookmanager->resPrint;
1873 print
'<td class="center">';
1874 $form->buttonsSaveCancel();
1875 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1876 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1885 $moreforfilter =
'';
1887 $parameters = array();
1888 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1889 if (empty($reshook)) {
1890 $moreforfilter .= $hookmanager->resPrint;
1892 $moreforfilter = $hookmanager->resPrint;
1895 if (!empty($moreforfilter)) {
1896 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1897 print $moreforfilter;
1901 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1902 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1903 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1905 print
'<div class="div-table-responsive">';
1906 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1910 print
'<tr class="liste_titre_filter">';
1913 print
'<td class="liste_titre center">';
1914 $searchpicto = $form->showFilterButtons(
'left');
1919 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1920 print
'<td class="liste_titre left">';
1921 print
'<div class="nowrapfordate">';
1922 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1924 print
'<div class="nowrapfordate">';
1925 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1930 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1931 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1935 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1936 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1939 if (!empty($allprojectforuser)) {
1940 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1941 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
1943 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
1944 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
1948 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1949 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
1950 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
1952 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
1953 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
1957 if (!empty($arrayfields[
'author'][
'checked'])) {
1958 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>';
1961 if (!empty($arrayfields[
't.note'][
'checked'])) {
1962 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
1965 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1967 print
'<td class="liste_titre right">';
1969 $durationtouse_start =
'';
1970 if ($search_timespent_starthour || $search_timespent_startmin) {
1971 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
1973 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
1974 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
1977 $durationtouse_end =
'';
1978 if ($search_timespent_endhour || $search_timespent_endmin) {
1979 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
1981 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
1982 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
1988 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
1989 print
'<td class="liste_titre right"></td>';
1992 if (!empty($arrayfields[
'value'][
'checked'])) {
1993 print
'<td class="liste_titre"></td>';
1996 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
1997 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2005 $parameters = array(
'arrayfields' => $arrayfields);
2006 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2007 print $hookmanager->resPrint;
2010 print
'<td class="liste_titre center">';
2011 $searchpicto = $form->showFilterButtons();
2015 print
'</tr>' .
"\n";
2018 $totalarray = array();
2019 $totalarray[
'nbfield'] = 0;
2023 print
'<tr class="liste_titre">';
2025 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2026 $totalarray[
'nbfield']++;
2028 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2029 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2030 $totalarray[
'nbfield']++;
2032 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2033 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2034 $totalarray[
'nbfield']++;
2036 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2037 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2038 $totalarray[
'nbfield']++;
2040 if (!empty($allprojectforuser)) {
2041 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2043 $totalarray[
'nbfield']++;
2045 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2046 print_liste_field_titre(
"ProjectLabel", $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2047 $totalarray[
'nbfield']++;
2050 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2051 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2052 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2053 $totalarray[
'nbfield']++;
2055 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2056 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2057 $totalarray[
'nbfield']++;
2060 if (!empty($arrayfields[
'author'][
'checked'])) {
2061 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2062 $totalarray[
'nbfield']++;
2064 if (!empty($arrayfields[
't.note'][
'checked'])) {
2065 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2066 $totalarray[
'nbfield']++;
2068 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2069 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2070 $totalarray[
'nbfield']++;
2072 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2073 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2074 $totalarray[
'nbfield']++;
2077 if (!empty($arrayfields[
'value'][
'checked'])) {
2078 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2079 $totalarray[
'nbfield']++;
2081 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2082 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2083 $totalarray[
'nbfield']++;
2090 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2091 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2092 print $hookmanager->resPrint;
2094 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2095 $totalarray[
'nbfield']++;
2099 $tasktmp =
new Task($db);
2100 $tmpinvoice =
new Facture($db);
2103 $param .=
'&page='.((int) $page);
2105 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2109 $savnbfield = $totalarray[
'nbfield'];
2110 $totalarray = array();
2111 $totalarray[
'nbfield'] = 0;
2113 foreach ($tasks as $task_time) {
2118 $date1 = $db->jdate($task_time->element_date);
2119 $date2 = $db->jdate($task_time->element_datehour);
2123 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2127 print
'<td class="center nowraponall">';
2128 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2129 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2130 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2132 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2133 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2134 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2135 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' :
'').
'">';
2136 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2140 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' :
'') .
'">';
2141 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2145 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' :
'').
'">';
2146 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2149 if ($massactionbutton || $massaction) {
2151 if (in_array($task_time->rowid, $arrayofselected)) {
2155 print
'<input id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2161 $totalarray[
'nbfield']++;
2166 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2167 print
'<td class="nowrap">';
2168 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2169 if (empty($task_time->element_date_withhour)) {
2170 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2172 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2175 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2179 $totalarray[
'nbfield']++;
2184 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2185 print
'<td class="tdoverflowmax125">';
2186 if ($task_time->fk_soc > 0) {
2187 if (empty($conf->cache[
'thridparty'][$task_time->fk_soc])) {
2188 $tmpsociete =
new Societe($db);
2189 $tmpsociete->fetch($task_time->fk_soc);
2190 $conf->cache[
'thridparty'][$task_time->fk_soc] = $tmpsociete;
2192 $tmpsociete = $conf->cache[
'thridparty'][$task_time->fk_soc];
2194 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2198 $totalarray[
'nbfield']++;
2203 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2204 if ($task_time->fk_soc > 0) {
2205 if (empty($conf->cache[
'thridparty'][$task_time->fk_soc])) {
2206 $tmpsociete =
new Societe($db);
2207 $tmpsociete->fetch($task_time->fk_soc);
2208 $conf->cache[
'thridparty'][$task_time->fk_soc] = $tmpsociete;
2210 $tmpsociete = $conf->cache[
'thridparty'][$task_time->fk_soc];
2212 $valtoshow = $tmpsociete->name_alias;
2214 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2218 $totalarray[
'nbfield']++;
2223 if (!empty($allprojectforuser)) {
2224 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2225 print
'<td class="nowraponall">';
2226 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2227 $tmpproject =
new Project($db);
2228 $tmpproject->fetch($task_time->fk_projet);
2229 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2231 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2233 print $tmpproject->getNomUrl(1);
2236 $totalarray[
'nbfield']++;
2239 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2240 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2241 $tmpproject =
new Project($db);
2242 $tmpproject->fetch($task_time->fk_projet);
2243 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2245 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2247 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($tmpproject->title).
'">';
2251 $totalarray[
'nbfield']++;
2257 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2258 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2259 print
'<td class="nowrap">';
2260 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2261 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth250', $projectstatic->id,
'');
2263 $tasktmp->id = $task_time->fk_element;
2264 $tasktmp->ref = $task_time->ref;
2265 $tasktmp->label = $task_time->label;
2266 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2270 $totalarray[
'nbfield']++;
2273 } elseif ($action !==
'createtime') {
2274 print
'<input type="hidden" name="taskid" value="' . $id .
'">';
2278 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2279 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2280 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($task_time->label).
'">';
2284 $totalarray[
'nbfield']++;
2290 if (!empty($arrayfields[
'author'][
'checked'])) {
2291 print
'<td class="minwidth100 tdoverflowmax125">';
2292 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2295 $object->fetch($task_time->fk_element);
2297 $contactsoftask =
$object->getListContactId(
'internal');
2298 if (!in_array($task_time->fk_user, $contactsoftask)) {
2299 $contactsoftask[] = $task_time->fk_user;
2301 if (count($contactsoftask) > 0) {
2302 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2303 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2305 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2308 $userstatic->id = $task_time->fk_user;
2309 $userstatic->lastname = $task_time->lastname;
2310 $userstatic->firstname = $task_time->firstname;
2311 $userstatic->photo = $task_time->photo;
2312 $userstatic->gender = $task_time->gender;
2313 $userstatic->status = $task_time->user_status;
2315 print $userstatic->getNomUrl(-1);
2319 $totalarray[
'nbfield']++;
2324 if (!empty($arrayfields[
't.note'][
'checked'])) {
2325 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2326 print
'<td class="small">';
2327 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2330 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2335 $totalarray[
'nbfield']++;
2337 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2338 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2342 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2343 print
'<td class="right nowraponall">';
2344 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2345 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2346 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2352 $totalarray[
'nbfield']++;
2355 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.element_duration';
2357 if (empty($totalarray[
'val'][
't.element_duration'])) {
2358 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2360 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2363 $totalarray[
'totaldurationfield'] = $totalarray[
'nbfield'];
2365 if (empty($totalarray[
'totalduration'])) {
2366 $totalarray[
'totalduration'] = $task_time->element_duration;
2368 $totalarray[
'totalduration'] += $task_time->element_duration;
2373 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2374 print
'<td class="nowraponall">';
2375 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2377 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', 0,
'',
null, 1);
2378 } elseif (!empty($task_time->fk_product)) {
2380 $resultFetch = $product->fetch($task_time->fk_product);
2381 if ($resultFetch < 0) {
2384 print $product->getNomUrl(1);
2389 $totalarray[
'nbfield']++;
2394 if (!empty($arrayfields[
'value'][
'checked'])) {
2395 $langs->load(
"salaries");
2396 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2398 print
'<td class="nowraponall right">';
2399 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2400 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2404 $totalarray[
'nbfield']++;
2407 $totalarray[
'pos'][$totalarray[
'nbfield']] =
'value';
2409 if (empty($totalarray[
'val'][
'value'])) {
2410 $totalarray[
'val'][
'value'] = $value;
2412 $totalarray[
'val'][
'value'] += $value;
2415 $totalarray[
'totalvaluefield'] = $totalarray[
'nbfield'];
2417 if (empty($totalarray[
'totalvalue'])) {
2418 $totalarray[
'totalvalue'] = $value;
2420 $totalarray[
'totalvalue'] += $value;
2425 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2426 print
'<td class="center">';
2428 if ($projectstatic->usage_bill_time) {
2429 if ($task_time->invoice_id) {
2430 $result = $tmpinvoice->fetch($task_time->invoice_id);
2432 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2433 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2435 print $tmpinvoice->getNomUrl(1);
2436 if (!empty($task_time->invoice_line_id)) {
2438 $invoiceLine->fetch($task_time->invoice_line_id);
2439 if (!empty($invoiceLine->id)) {
2440 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2441 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2447 print $langs->trans(
"No");
2450 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2455 $totalarray[
'nbfield']++;
2465 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &$totalarray);
2466 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2467 print $hookmanager->resPrint;
2471 print
'<td class="center nowraponall">';
2472 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2473 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2474 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2476 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2477 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2478 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2479 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' :
'').
'">';
2480 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2484 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' :
'') .
'">';
2485 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2489 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' :
'').
'">';
2490 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2493 if ($massactionbutton || $massaction) {
2495 if (in_array($task_time->rowid, $arrayofselected)) {
2499 print
'<input id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2505 $totalarray[
'nbfield']++;
2514 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2515 print
'<!-- first line -->';
2516 print
'<tr class="oddeven">';
2524 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2525 print
'<td class="nowrap">';
2526 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2527 if (empty($task_time->element_date_withhour)) {
2528 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2530 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2533 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2539 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2540 print
'<td class="nowrap">';
2545 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2546 print
'<td class="nowrap">';
2551 if (!empty($allprojectforuser)) {
2552 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2553 print
'<td class="nowrap">';
2559 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2560 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2561 print
'<td class="nowrap">';
2562 $tasktmp->id = $task_time->fk_element;
2563 $tasktmp->ref = $task_time->ref;
2564 $tasktmp->label = $task_time->label;
2565 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2571 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2572 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2573 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2580 if (!empty($arrayfields[
'author'][
'checked'])) {
2581 print
'<td class="nowraponall">';
2582 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2584 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2587 $contactsoftask =
$object->getListContactId(
'internal');
2588 if (!in_array($task_time->fk_user, $contactsoftask)) {
2589 $contactsoftask[] = $task_time->fk_user;
2591 if (count($contactsoftask) > 0) {
2592 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2593 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
'', 0,
'', $contactsoftask);
2595 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2598 $userstatic->id = $task_time->fk_user;
2599 $userstatic->lastname = $task_time->lastname;
2600 $userstatic->firstname = $task_time->firstname;
2601 $userstatic->photo = $task_time->photo;
2602 $userstatic->status = $task_time->user_status;
2603 print $userstatic->getNomUrl(-1);
2609 if (!empty($arrayfields[
't.note'][
'checked'])) {
2610 print
'<td class="tdoverflowmax300">';
2611 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2612 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2617 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2618 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_1 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2622 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2623 print
'<td class="right">';
2624 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2625 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2626 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2634 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2635 print
'<td class="nowraponall tdoverflowmax125">';
2640 if (!empty($arrayfields[
'value'][
'checked'])) {
2641 print
'<td class="right">';
2642 print
'<span class="amount">';
2643 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2644 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2650 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2651 print
'<td class="right">';
2652 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2653 if (isset($task_time->total_ht)) {
2654 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2665 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2666 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2667 print $hookmanager->resPrint;
2671 print
'<td class="center nowraponall">';
2680 print
'<!-- second line --><tr class="oddeven">';
2684 print
'<td class="center nowraponall">';
2689 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2690 print
'<td class="nowrap">';
2691 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2692 if (empty($task_time->element_date_withhour)) {
2693 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2695 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2698 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2704 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2705 print
'<td class="nowrap">';
2710 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2711 print
'<td class="nowrap">';
2716 if (!empty($allprojectforuser)) {
2717 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2718 print
'<td class="nowrap">';
2724 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2725 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2726 print
'<td class="nowrap">';
2727 $tasktmp->id = $task_time->fk_element;
2728 $tasktmp->ref = $task_time->ref;
2729 $tasktmp->label = $task_time->label;
2730 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2736 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2737 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2738 print
'<td class="nowrap">';
2745 if (!empty($arrayfields[
'author'][
'checked'])) {
2746 print
'<td class="nowraponall tdoverflowmax100">';
2747 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2749 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2752 $contactsoftask =
$object->getListContactId(
'internal');
2753 if (!in_array($task_time->fk_user, $contactsoftask)) {
2754 $contactsoftask[] = $task_time->fk_user;
2756 if (count($contactsoftask) > 0) {
2757 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2758 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
'', 0,
'', $contactsoftask);
2760 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2763 $userstatic->id = $task_time->fk_user;
2764 $userstatic->lastname = $task_time->lastname;
2765 $userstatic->firstname = $task_time->firstname;
2766 $userstatic->photo = $task_time->photo;
2767 $userstatic->status = $task_time->user_status;
2768 print $userstatic->getNomUrl(-1);
2774 if (!empty($arrayfields[
't.note'][
'checked'])) {
2775 print
'<td class="small tdoverflowmax300"">';
2776 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2777 print
'<textarea name="timespent_note_line_2" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2782 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2783 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2787 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2788 print
'<td class="right">';
2789 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2790 print
'<input type="hidden" name="old_duration_2" value="0">';
2791 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2799 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2800 print
'<td class="nowraponall tdoverflowmax125">';
2805 if (!empty($arrayfields[
'value'][
'checked'])) {
2806 print
'<td class="right">';
2807 print
'<span class="amount">';
2809 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2815 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2816 print
'<td class="right">';
2817 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2818 if (isset($task_time->total_ht)) {
2819 print
'<span class="amount">';
2820 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2832 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2833 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2834 print $hookmanager->resPrint;
2838 print
'<td class="center nowraponall">';
2850 if (isset($totalarray[
'totaldurationfield']) || isset($totalarray[
'totalvaluefield'])) {
2851 print
'<tr class="liste_total">';
2853 while ($i < $totalarray[
'nbfield']) {
2856 if ($num < $limit && empty($offset)) {
2857 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2859 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2861 } elseif (isset($totalarray[
'totaldurationfield']) && $totalarray[
'totaldurationfield'] == $i) {
2862 print
'<td class="right">' .
convertSecondToTime($totalarray[
'totalduration'],
'allhourmin') .
'</td>';
2863 } elseif (isset($totalarray[
'totalvaluefield']) && $totalarray[
'totalvaluefield'] == $i) {
2864 print
'<td class="right">' .
price($totalarray[
'totalvalue']) .
'</td>';
2873 if (!count($tasks)) {
2874 $totalnboffields = 1;
2875 foreach ($arrayfields as $value) {
2876 if (!empty($value[
'checked'])) {
2880 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2881 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2885 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2886 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2887 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage invoices.
Class to manage invoice lines.
Class to manage interventions.
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 ...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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 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...
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.