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 =
'';
179 $search_date_startday =
'';
180 $search_date_startmonth =
'';
181 $search_date_startyear =
'';
182 $search_date_endday =
'';
183 $search_date_endmonth =
'';
184 $search_date_endyear =
'';
185 $search_date_start =
'';
186 $search_date_end =
'';
187 $search_task_ref =
'';
188 $search_company =
'';
189 $search_company_alias =
'';
190 $search_project_ref =
'';
191 $search_project_label =
'';
192 $search_task_label =
'';
194 $search_valuebilled =
'';
195 $search_product_ref =
'';
197 $search_array_options = array();
198 $search_timespent_starthour =
'';
199 $search_timespent_startmin =
'';
200 $search_timespent_endhour =
'';
201 $search_timespent_endmin =
'';
205if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
208 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
209 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
210 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
211 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
215 $langs->load(
"errors");
216 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
225 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
226 $action =
'createtime';
236 if (empty(
$object->project->status)) {
237 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
238 $action =
'createtime';
249 $object->timespent_withhour = 1;
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;
309 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
310 $result =
$object->addTimeSpent($user);
322 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
326 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
328 $object->timespent_withhour = 1;
338 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
339 $result =
$object->updateTimeSpent($user);
354if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
357 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
358 $result =
$object->delTimeSpent($user);
361 $langs->load(
"errors");
372if (!empty($project_ref) && !empty($withproject)) {
373 if ($projectstatic->fetch(0, $project_ref) > 0) {
374 $tasksarray =
$object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
375 if (count($tasksarray) > 0) {
376 $id = $tasksarray[0]->id;
378 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
385$projectidforalltimes = 0;
387 $projectidforalltimes =
GETPOSTINT(
'projectid');
389 $result = $projectstatic->fetch($projectidforalltimes);
390 if (!empty($projectstatic->socid)) {
391 $projectstatic->fetch_thirdparty();
393 $res = $projectstatic->fetch_optionals();
394} elseif (
GETPOST(
'project_ref',
'alpha')) {
395 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
396 $projectidforalltimes = $projectstatic->id;
400 $result = $projectstatic->fetch(
$object->fk_project);
403if ($id <= 0 && $projectidforalltimes == 0) {
404 $allprojectforuser = $user->id;
407if ($action ==
'confirm_generateinvoice') {
408 if (!empty($projectstatic->socid)) {
409 $projectstatic->fetch_thirdparty();
412 if (!($projectstatic->thirdparty->id > 0)) {
413 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
415 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
416 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
417 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
419 $tmpinvoice =
new Facture($db);
420 $tmptimespent =
new Task($db);
421 $tmpproduct =
new Product($db);
422 $fuser =
new User($db);
427 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
430 $prodDurationHoursBase = 1.0;
431 $product_data_cache = array();
433 $tmpproduct->fetch($idprod);
439 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
440 if ($prodDurationHoursBase < 0) {
442 $langs->load(
"errors");
446 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
448 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
449 $txtva = $dataforprice[
'tva_tx'];
450 $localtax1 = $dataforprice[
'localtax1'];
451 $localtax2 = $dataforprice[
'localtax2'];
453 $prodDurationHoursBase = 1;
461 $tmpinvoice->socid = $projectstatic->thirdparty->id;
463 $tmpinvoice->fk_project = $projectstatic->id;
464 $tmpinvoice->cond_reglement_id = $condidproject;
465 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
466 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
469 $tmpinvoice->fetch($invoiceToUse);
471 $result = $tmpinvoice->create($user);
479 if ($generateinvoicemode ==
'onelineperuser') {
480 $arrayoftasks = array();
481 foreach ($toselect as $key => $value) {
483 $object->fetchTimeSpent($value);
484 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
485 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
488 foreach ($arrayoftasks as $userid => $data) {
489 $fuser->fetch($userid);
490 $username = $fuser->getFullName($langs);
492 foreach ($data as $fk_product => $timespent_data) {
494 $qtyhour = $timespent_data[
'timespent'] / 3600;
495 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
501 } elseif ($idprod <= 0) {
504 $pu_ht = $fuser->thm;
509 if ($timespent_data[
'timespent']) {
510 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
515 $prodDurationHours = $prodDurationHoursBase;
516 $idprodline = $idprod;
519 $localtax1line = $localtax1;
520 $localtax2line = $localtax2;
523 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
524 if (!array_key_exists($fk_product, $product_data_cache)) {
525 $result = $tmpproduct->fetch($fk_product);
530 $prodDurationHours = $tmpproduct->getProductDurationHours();
531 if ($prodDurationHours < 0) {
533 $langs->load(
"errors");
537 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
539 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
540 $txtvaline = $dataforprice[
'tva_tx'];
541 $localtax1line = $dataforprice[
'localtax1'];
542 $localtax2line = $dataforprice[
'localtax2'];
544 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
546 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
547 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
548 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
549 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
550 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
552 $idprodline = $fk_product;
556 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice", $username) .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
563 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
564 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
565 $result = $db->query($sql);
573 } elseif ($generateinvoicemode ==
'onelineperperiod') {
574 $arrayoftasks = array();
576 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
577 foreach ($toselect as $key => $value) {
579 $object->fetchTimeSpent($value);
581 $ftask =
new Task($db);
584 $fuser->fetch(
$object->timespent_fk_user);
585 $username = $fuser->getFullName($langs);
587 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
588 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
589 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
592 if (!empty($withdetail)) {
593 if (!empty(
$object->timespent_withhour)) {
600 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
601 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
604 foreach ($arrayoftasks as $timespent_id => $value) {
605 $userid = $value[
'user'];
609 $qtyhour = $value[
'timespent'] / 3600;
613 $pu_ht =
price2num($value[
'totalvaluetodivideby3600'] / 3600,
'MU');
617 $prodDurationHours = $prodDurationHoursBase;
618 $idprodline = $idprod;
621 $localtax1line = $localtax1;
622 $localtax2line = $localtax2;
624 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
625 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
626 $result = $tmpproduct->fetch($value[
'fk_product']);
631 $prodDurationHours = $tmpproduct->getProductDurationHours();
632 if ($prodDurationHours < 0) {
634 $langs->load(
"errors");
638 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
640 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
641 $txtvaline = $dataforprice[
'tva_tx'];
642 $localtax1line = $dataforprice[
'localtax1'];
643 $localtax2line = $dataforprice[
'localtax2'];
645 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
647 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
648 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
649 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
650 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
651 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
653 $idprodline = $value[
'fk_product'];
655 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
663 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
664 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
665 $result = $db->query($sql);
672 } elseif ($generateinvoicemode ==
'onelinepertask') {
673 $arrayoftasks = array();
674 foreach ($toselect as $key => $value) {
676 $object->fetchTimeSpent($value);
678 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
679 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
682 foreach ($arrayoftasks as $task_id => $data) {
683 $ftask =
new Task($db);
684 $ftask->fetch($task_id);
686 foreach ($data as $fk_product => $timespent_data) {
687 $qtyhour = $timespent_data[
'timespent'] / 3600;
688 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
691 $prodDurationHours = $prodDurationHoursBase;
692 $idprodline = $idprod;
695 $localtax1line = $localtax1;
696 $localtax2line = $localtax2;
698 if (!empty($fk_product) && $fk_product !== $idprod) {
699 if (!array_key_exists($fk_product, $product_data_cache)) {
700 $result = $tmpproduct->fetch($fk_product);
705 $prodDurationHours = $tmpproduct->getProductDurationHours();
706 if ($prodDurationHours < 0) {
708 $langs->load(
"errors");
712 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
714 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
715 $txtvaline = $dataforprice[
'tva_tx'];
716 $localtax1line = $dataforprice[
'localtax1'];
717 $localtax2line = $dataforprice[
'localtax2'];
719 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
721 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
722 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
723 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
724 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
725 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
727 $idprodline = $fk_product;
731 if ($idprodline > 0) {
733 $pu_ht_for_task = $pu_htline;
736 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
738 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
744 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
746 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
752 $lineName = $ftask->ref .
' - ' . $ftask->label;
753 $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);
762 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
763 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
764 $result = $db->query($sql);
777 $urltoinvoice = $tmpinvoice->getNomUrl(0);
778 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
779 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
791if ($action ==
'confirm_generateinter') {
792 $langs->load(
'interventions');
794 if (!empty($projectstatic->socid)) {
795 $projectstatic->fetch_thirdparty();
798 if (!($projectstatic->thirdparty->id > 0)) {
799 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
801 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
802 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
803 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
806 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
808 $tmptimespent =
new Task($db);
809 $fuser =
new User($db);
815 $tmpinter->socid = $projectstatic->thirdparty->id;
817 $tmpinter->fk_project = $projectstatic->id;
818 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
821 $tmpinter->fetch($interToUse);
823 $result = $tmpinter->create($user);
831 $arrayoftasks = array();
832 foreach ($toselect as $key => $value) {
834 $object->fetchTimeSpent($value);
837 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
838 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
839 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
840 $arrayoftasks[
$object->timespent_id][
'date'] = date(
'Y-m-d H:i:s',
$object->timespent_datehour);
843 foreach ($arrayoftasks as $timespent_id => $value) {
844 $ftask =
new Task($db);
845 $ftask->fetch($value[
'id']);
847 $qtyhour = $value[
'timespent'] / 3600;
848 $qtyhourtext =
convertSecondToTime($value[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
851 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), $value[
'date'], $value[
'timespent']);
856 $urltointer = $tmpinter->getNomUrl(0);
857 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
858 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
875$form =
new Form($db);
878$userstatic =
new User($db);
880$arrayofselected = is_array($toselect) ? $toselect : array();
882$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
883if (!empty($withproject)) {
884 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
890if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
894 if ($projectidforalltimes > 0) {
895 $result = $projectstatic->fetch($projectidforalltimes);
896 if (!empty($projectstatic->socid)) {
897 $projectstatic->fetch_thirdparty();
899 $res = $projectstatic->fetch_optionals();
900 } elseif (
$object->fetch($id, $ref) >= 0) {
901 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
904 $result = $projectstatic->fetch(
$object->fk_project);
905 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
906 $projectstatic->fetchComments();
908 if (!empty($projectstatic->socid)) {
909 $projectstatic->fetch_thirdparty();
911 $res = $projectstatic->fetch_optionals();
913 $object->project = clone $projectstatic;
916 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
917 $linktocreatetime =
'';
919 if ($projectstatic->id > 0) {
922 if (empty($id) || $tab ==
'timespent') {
929 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
931 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
933 $param .=
'&search_user=' . ((int) $search_user);
936 $param .=
'&search_month=' . ((int) $search_month);
939 $param .=
'&search_year=' . ((int) $search_year);
944 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
946 $morehtmlref =
'<div class="refidno">';
948 $morehtmlref .= $projectstatic->title;
950 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
951 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
953 $morehtmlref .=
'</div>';
956 if (!$user->hasRight(
'projet',
'all',
'lire')) {
957 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
958 $projectstatic->next_prev_filter =
"rowid IN (" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0') .
")";
961 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
963 print
'<div class="fichecenter">';
964 print
'<div class="fichehalfleft">';
965 print
'<div class="underbanner clearboth"></div>';
967 print
'<table class="border tableforfield centpercent">';
971 print
'<tr><td class="tdtop">';
972 print $langs->trans(
"Usage");
976 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
977 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
978 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
982 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
983 $htmltext = $langs->trans(
"ProjectFollowTasks");
984 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
988 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"' :
'')) .
'"> ';
989 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
990 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
993 if (isModEnabled(
'eventorganization')) {
994 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"' :
'')) .
'"> ';
995 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
996 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1002 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1003 if ($projectstatic->public) {
1004 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1005 print $langs->trans(
'SharedProject');
1007 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1008 print $langs->trans(
'PrivateProject');
1013 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1014 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1015 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency) .
'</span>';
1020 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1022 print($start ? $start :
'?');
1025 print($end ? $end :
'?');
1026 if ($projectstatic->hasDelay()) {
1035 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1041 print
'<div class="fichehalfright">';
1042 print
'<div class="underbanner clearboth"></div>';
1044 print
'<table class="border tableforfield centpercent">';
1047 print
'<td class="titlefield tdtop">'.$langs->trans(
"Description").
'</td><td>';
1052 if (isModEnabled(
'category')) {
1053 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1054 print $form->showCategories($projectstatic->id,
'project', 1);
1063 print
'<div class="clearboth"></div>';
1073 $linktocreatetimeBtnStatus = 0;
1074 $linktocreatetimeUrl =
'';
1075 $linktocreatetimeHelpText =
'';
1076 if ($user->hasRight(
'projet',
'time')) {
1077 if ($projectstatic->public || $userRead > 0) {
1078 $linktocreatetimeBtnStatus = 1;
1080 if (!empty($projectidforalltimes)) {
1082 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1083 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1086 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1087 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1090 $linktocreatetimeBtnStatus = -2;
1091 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1094 $linktocreatetimeBtnStatus = -2;
1095 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1098 $paramsbutton = array(
'morecss' =>
'reposition');
1099 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1102 $massactionbutton =
'';
1103 $arrayofmassactions = array();
1105 if ($projectstatic->id > 0) {
1107 if ($projectstatic->usage_bill_time) {
1108 $arrayofmassactions = array(
1109 'generateinvoice' => $langs->trans(
"GenerateBill"),
1113 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1114 $langs->load(
"interventions");
1115 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1119 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1120 $arrayofmassactions = array();
1122 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1127 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1129 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1131 if ($action ==
'deleteline') {
1132 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1133 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1136 $param = ($withproject ?
'&withproject=1' :
'');
1137 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1138 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1140 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1141 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1142 $object->next_prev_filter =
"fk_projet IN (" . $db->sanitize($projectsListId) .
")";
1144 $object->next_prev_filter =
"fk_projet = " . ((int) $projectstatic->id);
1150 if (empty($withproject)) {
1151 $morehtmlref .=
'<div class="refidno">';
1152 $morehtmlref .= $langs->trans(
"Project") .
': ';
1153 $morehtmlref .= $projectstatic->getNomUrl(1);
1154 $morehtmlref .=
'<br>';
1157 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1158 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1159 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1161 $morehtmlref .=
'</div>';
1164 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1166 print
'<div class="fichecenter">';
1167 print
'<div class="fichehalfleft">';
1169 print
'<div class="underbanner clearboth"></div>';
1170 print
'<table class="border centpercent tableforfield">';
1173 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1174 if (
$object->fk_task_parent > 0) {
1175 $tasktmp =
new Task($db);
1176 $tasktmp->fetch(
$object->fk_task_parent);
1177 print $tasktmp->getNomUrl(1);
1182 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1184 print($start ? $start :
'?');
1187 print($end ? $end :
'?');
1194 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1195 if (
$object->planned_workload) {
1203 print
'<div class="fichehalfright">';
1205 print
'<div class="underbanner clearboth"></div>';
1206 print
'<table class="border tableforfield centpercent">';
1209 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1214 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1215 if (
$object->planned_workload) {
1216 $tmparray =
$object->getSummaryOfTimeSpent();
1217 if ($tmparray[
'total_duration'] > 0) {
1218 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1223 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1234 print
'<div class="clearboth"></div>';
1238 if ($action ==
'deleteline') {
1239 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1240 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1245 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1247 $hookmanager->initHooks(array(
'tasktimelist'));
1251 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1253 $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);
1254 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1258 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1259 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1260 if (empty($reshook)) {
1261 $formconfirm .= $hookmanager->resPrint;
1262 } elseif ($reshook > 0) {
1263 $formconfirm = $hookmanager->resPrint;
1270 $arrayfields = array();
1271 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' => 1);
1272 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' => 1);
1273 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1274 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1275 if (! empty($allprojectforuser)) {
1276 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' => 1];
1277 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' => 1];
1279 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' => 1);
1280 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' => 1);
1282 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' => 1);
1283 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' => 1);
1284 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1285 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' => 1);
1287 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' => 1);
1288 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' => 1,
'enabled' => isModEnabled(
"salaries"));
1289 $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));
1291 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1294 '@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields';
1297 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1298 $param .=
'&contextpage=' . urlencode($contextpage);
1300 if ($limit > 0 && $limit != $conf->liste_limit) {
1301 $param .=
'&limit='.((int) $limit);
1303 if ($search_month > 0) {
1304 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1306 if ($search_year > 0) {
1307 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1309 if (!empty($search_user)) {
1310 $param .=
'&search_user='.urlencode($search_user);
1312 if ($search_task_ref !=
'') {
1313 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1315 if ($search_company !=
'') {
1316 $param .=
'&$search_company=' . urlencode($search_company);
1318 if ($search_company_alias !=
'') {
1319 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1321 if ($search_project_ref !=
'') {
1322 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1324 if ($search_project_label !=
'') {
1325 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1327 if ($search_task_label !=
'') {
1328 $param .=
'&search_task_label=' . urlencode($search_task_label);
1330 if ($search_note !=
'') {
1331 $param .=
'&search_note=' . urlencode($search_note);
1333 if ($search_duration !=
'') {
1334 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1336 if ($optioncss !=
'') {
1337 $param .=
'&optioncss=' . urlencode($optioncss);
1339 if ($search_date_startday) {
1340 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1342 if ($search_date_startmonth) {
1343 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1345 if ($search_date_startyear) {
1346 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1348 if ($search_date_endday) {
1349 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1351 if ($search_date_endmonth) {
1352 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1354 if ($search_date_endyear) {
1355 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1357 if ($search_timespent_starthour) {
1358 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1360 if ($search_timespent_startmin) {
1361 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1363 if ($search_timespent_endhour) {
1364 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1366 if ($search_timespent_endmin) {
1367 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1375 $param .=
'&id=' . urlencode((
string) ($id));
1378 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1381 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1384 $parameters = array(
'param' => &$param);
1385 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1386 $param .= $hookmanager->resPrint;
1388 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1389 if ($optioncss !=
'') {
1390 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1392 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1393 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1394 if ($action ==
'editline') {
1395 print
'<input type="hidden" name="action" value="updateline">';
1396 } elseif ($action ==
'splitline') {
1397 print
'<input type="hidden" name="action" value="updatesplitline">';
1398 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1399 print
'<input type="hidden" name="action" value="addtimespent">';
1400 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1401 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1402 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1403 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1405 print
'<input type="hidden" name="action" value="list">';
1407 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1408 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1410 print
'<input type="hidden" name="id" value="' . $id .
'">';
1411 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1412 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1413 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1414 print
'<input type="hidden" name="page_y" value="">';
1417 if ($massaction ==
'generateinvoice') {
1418 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1419 print
'<table class="noborder centerpercent">';
1421 print
'<td class="titlefield">';
1422 print $langs->trans(
'DateInvoice');
1425 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1431 print $langs->trans(
'Mode');
1435 'onelineperuser' =>
'OneLinePerUser',
1436 'onelinepertask' =>
'OneLinePerTask',
1437 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1439 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1440 print
"\n" .
'<script type="text/javascript">';
1442 $(document).ready(function () {
1443 setDetailVisibility();
1444 $("#generateinvoicemode").change(function() {
1445 setDetailVisibility();
1447 function setDetailVisibility() {
1448 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1449 if (generateinvoicemode=="onelineperperiod") {
1450 $("#detail_time_duration").show();
1452 $("#detail_time_duration").hide();
1457 print
'</script>' .
"\n";
1458 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1462 if (isModEnabled(
"service")) {
1465 print $langs->trans(
'ServiceToUseOnLines');
1468 $form->select_produits(
'',
'productid',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1473 print
'<td class="titlefield">';
1474 print $langs->trans(
'InvoiceToUse');
1477 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1481 print
'<td class="titlefield">';
1482 print $langs->trans(
"CustomerRelativeDiscount");
1485 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1488 print
'<tr class="newinvoicedetail">';
1489 print
'<td class="titlefield">';
1490 print $langs->trans(
"PaymentConditions");
1493 print $form->getSelectConditionsPaiements($projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1507 print
'<div class="center">';
1508 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1509 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1513 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1514 print
'<div class="center">';
1515 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1519 } elseif ($massaction ==
'generateinter') {
1521 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1523 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1525 print
'<table class="noborder centpercent">';
1527 print
'<td class="titlefield">';
1528 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1532 print $forminter->select_interventions($projectstatic->thirdparty->id,
'',
'interid', 24, $langs->trans(
'NewInter'),
true);
1537 print
'<div class="center">';
1538 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1539 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1543 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1544 print
'<div class="center">';
1545 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1552 $parameters = array(
1553 'toselect' => $toselect,
1554 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1557 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1561 print $hookmanager->resPrint;
1569 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1570 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1572 $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,";
1573 $sql .=
" t.fk_product,";
1574 $sql .=
" pt.ref, pt.label, pt.fk_projet,";
1575 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1576 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1577 $sql .=
" p.fk_soc,s.name_alias,";
1578 $sql .=
" t.invoice_line_id";
1580 $parameters = array();
1581 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1582 $sql .= $hookmanager->resPrint;
1583 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1587 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1588 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1589 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1590 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1591 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1592 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1593 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1594 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1597 $parameters = array();
1598 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1599 $sql .= $hookmanager->resPrint;
1600 $sql .=
" WHERE elementtype = 'task'";
1601 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1602 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1606 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1607 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1609 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1611 $sql .=
" AND t.fk_element =".((int)
$object->id);
1612 } elseif (!empty($projectidforalltimes)) {
1614 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize($projectidforalltimes) .
")";
1615 } elseif (!empty($allprojectforuser)) {
1617 if (empty($search_user)) {
1618 $search_user = $user->id;
1620 if ($search_user > 0) {
1621 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1628 if ($search_task_ref) {
1631 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1632 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1634 if ($search_company) {
1637 if ($search_company_alias) {
1641 if ($search_project_ref) {
1644 if ($search_project_label) {
1647 if ($search_task_label) {
1650 if ($search_user > 0) {
1653 if (!empty($search_product_ref)) {
1656 if ($search_valuebilled ==
'1') {
1657 $sql .=
' AND t.invoice_id > 0';
1659 if ($search_valuebilled ==
'0') {
1660 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1663 if ($search_date_start) {
1664 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1666 if ($search_date_end) {
1667 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1670 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1671 if ($search_timespent_starthour || $search_timespent_startmin) {
1672 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1673 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1674 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1677 if ($search_timespent_endhour || $search_timespent_endmin) {
1678 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1679 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1680 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1684 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1687 $parameters = array();
1688 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1689 $sql .= $hookmanager->resPrint;
1692 $nbtotalofrecords =
'';
1695 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1696 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1697 $resql = $db->query($sqlforcount);
1699 $objforcount = $db->fetch_object($resql);
1700 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1705 if (($page * $limit) > $nbtotalofrecords) {
1713 $sql .= $db->order($sortfield, $sortorder);
1715 $sql .= $db->plimit($limit + 1, $offset);
1718 $resql = $db->query($sql);
1724 $num = $db->num_rows($resql);
1727 if (!empty($projectidforalltimes)) {
1728 print
'<!-- List of time spent for project -->' .
"\n";
1730 $title = $langs->trans(
"ListTaskTimeUserProject");
1732 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1734 print
'<!-- List of time spent -->' .
"\n";
1736 $title = $langs->trans(
"ListTaskTimeForTask");
1738 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1743 $row = $db->fetch_object($resql);
1755 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1756 print
'<!-- table to add time spent -->' .
"\n";
1758 print
'<input type="hidden" name="taskid" value="' . $id .
'">';
1761 print
'<div class="div-table-responsive-no-min">';
1762 print
'<table class="noborder nohover centpercent">';
1764 print
'<tr class="liste_titre">';
1765 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1766 if (!empty($allprojectforuser)) {
1767 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1770 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1772 print
'<td>' . $langs->trans(
"By") .
'</td>';
1773 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1774 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1775 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1779 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1780 print
'<td>'.$langs->trans(
"Product").
'</td>';
1784 $parameters = array(
'mode' =>
'create');
1785 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1786 print $hookmanager->resPrint;
1790 print
'<tr class="oddeven nohover">';
1793 print
'<td class="maxwidthonsmartphone">';
1795 print $form->selectDate($newdate,
'time', ($conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1798 if (!empty($allprojectforuser)) {
1807 print
'<td class="maxwidthonsmartphone">';
1808 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth300', $projectstatic->id,
'progress');
1813 print
'<td class="maxwidthonsmartphone nowraponall">';
1814 $contactsofproject = $projectstatic->getListContactId(
'internal');
1815 if (count($contactsofproject) > 0) {
1816 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1817 if (in_array($user->id, $contactsofproject)) {
1818 $userid = $user->id;
1820 $userid = $contactsofproject[0];
1823 if ($projectstatic->public) {
1824 $contactsofproject = array();
1826 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0,
'', 0,
'', $contactsofproject, 0, 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1829 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1836 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1840 print
'<td class="nowraponall">';
1841 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1842 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1843 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1845 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1849 print
'<td class="nowrap">';
1850 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1858 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1859 print
'<td class="nowraponall">';
1861 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);
1867 $parameters = array(
'mode' =>
'create');
1868 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1869 print $hookmanager->resPrint;
1871 print
'<td class="center">';
1872 $form->buttonsSaveCancel();
1873 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1874 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1883 $moreforfilter =
'';
1885 $parameters = array();
1886 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1887 if (empty($reshook)) {
1888 $moreforfilter .= $hookmanager->resPrint;
1890 $moreforfilter = $hookmanager->resPrint;
1893 if (!empty($moreforfilter)) {
1894 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1895 print $moreforfilter;
1899 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1900 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1901 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1903 print
'<div class="div-table-responsive">';
1904 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1908 print
'<tr class="liste_titre_filter">';
1911 print
'<td class="liste_titre center">';
1912 $searchpicto = $form->showFilterButtons(
'left');
1917 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1918 print
'<td class="liste_titre left">';
1919 print
'<div class="nowrapfordate">';
1920 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1922 print
'<div class="nowrapfordate">';
1923 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1928 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1929 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1933 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1934 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1937 if (!empty($allprojectforuser)) {
1938 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1939 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
1941 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
1942 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
1946 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1947 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
1948 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
1950 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
1951 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
1955 if (!empty($arrayfields[
'author'][
'checked'])) {
1956 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>';
1959 if (!empty($arrayfields[
't.note'][
'checked'])) {
1960 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
1963 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1965 print
'<td class="liste_titre right">';
1967 $durationtouse_start =
'';
1968 if ($search_timespent_starthour || $search_timespent_startmin) {
1969 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
1971 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
1972 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
1975 $durationtouse_end =
'';
1976 if ($search_timespent_endhour || $search_timespent_endmin) {
1977 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
1979 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
1980 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
1986 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
1987 print
'<td class="liste_titre right"></td>';
1990 if (!empty($arrayfields[
'value'][
'checked'])) {
1991 print
'<td class="liste_titre"></td>';
1994 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
1995 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2003 $parameters = array(
'arrayfields' => $arrayfields);
2004 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2005 print $hookmanager->resPrint;
2008 print
'<td class="liste_titre center">';
2009 $searchpicto = $form->showFilterButtons();
2013 print
'</tr>' .
"\n";
2016 $totalarray = array();
2017 $totalarray[
'nbfield'] = 0;
2021 print
'<tr class="liste_titre">';
2023 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2024 $totalarray[
'nbfield']++;
2026 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2027 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2028 $totalarray[
'nbfield']++;
2030 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2031 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2032 $totalarray[
'nbfield']++;
2034 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2035 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2036 $totalarray[
'nbfield']++;
2038 if (!empty($allprojectforuser)) {
2039 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2041 $totalarray[
'nbfield']++;
2043 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2044 print_liste_field_titre(
"ProjectLabel", $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2045 $totalarray[
'nbfield']++;
2048 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2049 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2050 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2051 $totalarray[
'nbfield']++;
2053 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2054 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2055 $totalarray[
'nbfield']++;
2058 if (!empty($arrayfields[
'author'][
'checked'])) {
2059 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2060 $totalarray[
'nbfield']++;
2062 if (!empty($arrayfields[
't.note'][
'checked'])) {
2063 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2064 $totalarray[
'nbfield']++;
2066 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2067 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2068 $totalarray[
'nbfield']++;
2070 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2071 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2072 $totalarray[
'nbfield']++;
2075 if (!empty($arrayfields[
'value'][
'checked'])) {
2076 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2077 $totalarray[
'nbfield']++;
2079 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2080 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2081 $totalarray[
'nbfield']++;
2088 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2089 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2090 print $hookmanager->resPrint;
2092 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2093 $totalarray[
'nbfield']++;
2097 $tasktmp =
new Task($db);
2098 $tmpinvoice =
new Facture($db);
2101 $param .=
'&page='.((int) $page);
2103 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2107 $savnbfield = $totalarray[
'nbfield'];
2108 $totalarray = array();
2109 $totalarray[
'nbfield'] = 0;
2111 foreach ($tasks as $task_time) {
2116 $date1 = $db->jdate($task_time->element_date);
2117 $date2 = $db->jdate($task_time->element_datehour);
2121 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2125 print
'<td class="center nowraponall">';
2126 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2127 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2128 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2130 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2131 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2132 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2133 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' :
'').
'">';
2134 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2138 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' :
'') .
'">';
2139 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2143 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' :
'').
'">';
2144 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2147 if ($massactionbutton || $massaction) {
2149 if (in_array($task_time->rowid, $arrayofselected)) {
2153 print
'<input id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2159 $totalarray[
'nbfield']++;
2164 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2165 print
'<td class="nowrap">';
2166 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2167 if (empty($task_time->element_date_withhour)) {
2168 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2170 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2173 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2177 $totalarray[
'nbfield']++;
2182 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2183 print
'<td class="tdoverflowmax125">';
2184 if ($task_time->fk_soc > 0) {
2185 if (empty($conf->cache[
'thridparty'][$task_time->fk_soc])) {
2186 $tmpsociete =
new Societe($db);
2187 $tmpsociete->fetch($task_time->fk_soc);
2188 $conf->cache[
'thridparty'][$task_time->fk_soc] = $tmpsociete;
2190 $tmpsociete = $conf->cache[
'thridparty'][$task_time->fk_soc];
2192 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2196 $totalarray[
'nbfield']++;
2201 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2202 if ($task_time->fk_soc > 0) {
2203 if (empty($conf->cache[
'thridparty'][$task_time->fk_soc])) {
2204 $tmpsociete =
new Societe($db);
2205 $tmpsociete->fetch($task_time->fk_soc);
2206 $conf->cache[
'thridparty'][$task_time->fk_soc] = $tmpsociete;
2208 $tmpsociete = $conf->cache[
'thridparty'][$task_time->fk_soc];
2210 $valtoshow = $tmpsociete->name_alias;
2212 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2216 $totalarray[
'nbfield']++;
2221 if (!empty($allprojectforuser)) {
2222 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2223 print
'<td class="nowraponall">';
2224 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2225 $tmpproject =
new Project($db);
2226 $tmpproject->fetch($task_time->fk_projet);
2227 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2229 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2231 print $tmpproject->getNomUrl(1);
2234 $totalarray[
'nbfield']++;
2237 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2238 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2239 $tmpproject =
new Project($db);
2240 $tmpproject->fetch($task_time->fk_projet);
2241 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2243 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2245 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($tmpproject->title).
'">';
2249 $totalarray[
'nbfield']++;
2255 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2256 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2257 print
'<td class="nowrap">';
2258 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2259 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth250', $projectstatic->id,
'');
2261 $tasktmp->id = $task_time->fk_element;
2262 $tasktmp->ref = $task_time->ref;
2263 $tasktmp->label = $task_time->label;
2264 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2268 $totalarray[
'nbfield']++;
2271 } elseif ($action !==
'createtime') {
2272 print
'<input type="hidden" name="taskid" value="' . $id .
'">';
2276 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2277 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2278 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($task_time->label).
'">';
2282 $totalarray[
'nbfield']++;
2288 if (!empty($arrayfields[
'author'][
'checked'])) {
2289 print
'<td class="minwidth100 tdoverflowmax125">';
2290 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2293 $object->fetch($task_time->fk_element);
2295 $contactsoftask =
$object->getListContactId(
'internal');
2296 if (!in_array($task_time->fk_user, $contactsoftask)) {
2297 $contactsoftask[] = $task_time->fk_user;
2299 if (count($contactsoftask) > 0) {
2300 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2301 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2303 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2306 $userstatic->id = $task_time->fk_user;
2307 $userstatic->lastname = $task_time->lastname;
2308 $userstatic->firstname = $task_time->firstname;
2309 $userstatic->photo = $task_time->photo;
2310 $userstatic->gender = $task_time->gender;
2311 $userstatic->status = $task_time->user_status;
2313 print $userstatic->getNomUrl(-1);
2317 $totalarray[
'nbfield']++;
2322 if (!empty($arrayfields[
't.note'][
'checked'])) {
2323 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2324 print
'<td class="small">';
2325 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2328 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2333 $totalarray[
'nbfield']++;
2335 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2336 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2340 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2341 print
'<td class="right nowraponall">';
2342 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2343 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2344 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2350 $totalarray[
'nbfield']++;
2353 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.element_duration';
2355 if (empty($totalarray[
'val'][
't.element_duration'])) {
2356 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2358 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2361 $totalarray[
'totaldurationfield'] = $totalarray[
'nbfield'];
2363 if (empty($totalarray[
'totalduration'])) {
2364 $totalarray[
'totalduration'] = $task_time->element_duration;
2366 $totalarray[
'totalduration'] += $task_time->element_duration;
2371 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2372 print
'<td class="nowraponall">';
2373 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2375 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);
2376 } elseif (!empty($task_time->fk_product)) {
2378 $resultFetch = $product->fetch($task_time->fk_product);
2379 if ($resultFetch < 0) {
2382 print $product->getNomUrl(1);
2387 $totalarray[
'nbfield']++;
2392 if (!empty($arrayfields[
'value'][
'checked'])) {
2393 $langs->load(
"salaries");
2394 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2396 print
'<td class="nowraponall right">';
2397 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2398 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2402 $totalarray[
'nbfield']++;
2405 $totalarray[
'pos'][$totalarray[
'nbfield']] =
'value';
2407 if (empty($totalarray[
'val'][
'value'])) {
2408 $totalarray[
'val'][
'value'] = $value;
2410 $totalarray[
'val'][
'value'] += $value;
2413 $totalarray[
'totalvaluefield'] = $totalarray[
'nbfield'];
2415 if (empty($totalarray[
'totalvalue'])) {
2416 $totalarray[
'totalvalue'] = $value;
2418 $totalarray[
'totalvalue'] += $value;
2423 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2424 print
'<td class="center">';
2426 if ($projectstatic->usage_bill_time) {
2427 if ($task_time->invoice_id) {
2428 $result = $tmpinvoice->fetch($task_time->invoice_id);
2430 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2431 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2433 print $tmpinvoice->getNomUrl(1);
2434 if (!empty($task_time->invoice_line_id)) {
2436 $invoiceLine->fetch($task_time->invoice_line_id);
2437 if (!empty($invoiceLine->id)) {
2438 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2439 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2445 print $langs->trans(
"No");
2448 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2453 $totalarray[
'nbfield']++;
2463 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &$totalarray);
2464 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2465 print $hookmanager->resPrint;
2469 print
'<td class="center nowraponall">';
2470 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2471 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2472 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2474 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2475 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2476 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2477 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' :
'').
'">';
2478 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2482 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' :
'') .
'">';
2483 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2487 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' :
'').
'">';
2488 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2491 if ($massactionbutton || $massaction) {
2493 if (in_array($task_time->rowid, $arrayofselected)) {
2497 print
'<input id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2503 $totalarray[
'nbfield']++;
2512 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2513 print
'<!-- first line -->';
2514 print
'<tr class="oddeven">';
2522 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2523 print
'<td class="nowrap">';
2524 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2525 if (empty($task_time->element_date_withhour)) {
2526 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2528 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2531 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2537 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2538 print
'<td class="nowrap">';
2543 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2544 print
'<td class="nowrap">';
2549 if (!empty($allprojectforuser)) {
2550 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2551 print
'<td class="nowrap">';
2557 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2558 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2559 print
'<td class="nowrap">';
2560 $tasktmp->id = $task_time->fk_element;
2561 $tasktmp->ref = $task_time->ref;
2562 $tasktmp->label = $task_time->label;
2563 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2569 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2570 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2571 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2578 if (!empty($arrayfields[
'author'][
'checked'])) {
2579 print
'<td class="nowraponall">';
2580 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2584 $contactsoftask =
$object->getListContactId(
'internal');
2585 if (!in_array($task_time->fk_user, $contactsoftask)) {
2586 $contactsoftask[] = $task_time->fk_user;
2588 if (count($contactsoftask) > 0) {
2589 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2590 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
'', 0,
'', $contactsoftask);
2592 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2595 $userstatic->id = $task_time->fk_user;
2596 $userstatic->lastname = $task_time->lastname;
2597 $userstatic->firstname = $task_time->firstname;
2598 $userstatic->photo = $task_time->photo;
2599 $userstatic->status = $task_time->user_status;
2600 print $userstatic->getNomUrl(-1);
2606 if (!empty($arrayfields[
't.note'][
'checked'])) {
2607 print
'<td class="tdoverflowmax300">';
2608 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2609 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2614 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2615 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_1 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2619 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2620 print
'<td class="right">';
2621 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2622 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2623 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2631 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2632 print
'<td class="nowraponall tdoverflowmax125">';
2637 if (!empty($arrayfields[
'value'][
'checked'])) {
2638 print
'<td class="right">';
2639 print
'<span class="amount">';
2640 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2641 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2647 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2648 print
'<td class="right">';
2649 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2650 if (isset($task_time->total_ht)) {
2651 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2662 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2663 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2664 print $hookmanager->resPrint;
2668 print
'<td class="center nowraponall">';
2677 print
'<!-- second line --><tr class="oddeven">';
2681 print
'<td class="center nowraponall">';
2686 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2687 print
'<td class="nowrap">';
2688 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2689 if (empty($task_time->element_date_withhour)) {
2690 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2692 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2695 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2701 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2702 print
'<td class="nowrap">';
2707 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2708 print
'<td class="nowrap">';
2713 if (!empty($allprojectforuser)) {
2714 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2715 print
'<td class="nowrap">';
2721 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2722 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2723 print
'<td class="nowrap">';
2724 $tasktmp->id = $task_time->fk_element;
2725 $tasktmp->ref = $task_time->ref;
2726 $tasktmp->label = $task_time->label;
2727 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2733 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2734 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2735 print
'<td class="nowrap">';
2742 if (!empty($arrayfields[
'author'][
'checked'])) {
2743 print
'<td class="nowraponall tdoverflowmax100">';
2744 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2748 $contactsoftask =
$object->getListContactId(
'internal');
2749 if (!in_array($task_time->fk_user, $contactsoftask)) {
2750 $contactsoftask[] = $task_time->fk_user;
2752 if (count($contactsoftask) > 0) {
2753 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2754 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
'', 0,
'', $contactsoftask);
2756 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2759 $userstatic->id = $task_time->fk_user;
2760 $userstatic->lastname = $task_time->lastname;
2761 $userstatic->firstname = $task_time->firstname;
2762 $userstatic->photo = $task_time->photo;
2763 $userstatic->status = $task_time->user_status;
2764 print $userstatic->getNomUrl(-1);
2770 if (!empty($arrayfields[
't.note'][
'checked'])) {
2771 print
'<td class="small tdoverflowmax300"">';
2772 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2773 print
'<textarea name="timespent_note_line_2" width="95%" rows="' . ROWS_1 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2778 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2779 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2783 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2784 print
'<td class="right">';
2785 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2786 print
'<input type="hidden" name="old_duration_2" value="0">';
2787 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2795 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2796 print
'<td class="nowraponall tdoverflowmax125">';
2801 if (!empty($arrayfields[
'value'][
'checked'])) {
2802 print
'<td class="right">';
2803 print
'<span class="amount">';
2805 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2811 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2812 print
'<td class="right">';
2813 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2814 if (isset($task_time->total_ht)) {
2815 print
'<span class="amount">';
2816 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2828 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2829 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2830 print $hookmanager->resPrint;
2834 print
'<td class="center nowraponall">';
2846 if (isset($totalarray[
'totaldurationfield']) || isset($totalarray[
'totalvaluefield'])) {
2847 print
'<tr class="liste_total">';
2849 while ($i < $totalarray[
'nbfield']) {
2852 if ($num < $limit && empty($offset)) {
2853 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2855 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2857 } elseif (isset($totalarray[
'totaldurationfield']) && $totalarray[
'totaldurationfield'] == $i) {
2858 print
'<td class="right">' .
convertSecondToTime($totalarray[
'totalduration'],
'allhourmin') .
'</td>';
2859 } elseif (isset($totalarray[
'totalvaluefield']) && $totalarray[
'totalvaluefield'] == $i) {
2860 print
'<td class="right">' .
price($totalarray[
'totalvalue']) .
'</td>';
2869 if (!count($tasks)) {
2870 $totalnboffields = 1;
2871 foreach ($arrayfields as $value) {
2872 if (!empty($value[
'checked'])) {
2876 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2877 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2881 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2882 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2883 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.