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 .
'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
41require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
42require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
43require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
44require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
56$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
57if (isModEnabled(
'eventorganization')) {
58 $langsLoad[] =
'eventorganization';
61$langs->loadLangs($langsLoad);
63$action =
GETPOST(
'action',
'alpha');
64$massaction =
GETPOST(
'massaction',
'alpha');
65$confirm =
GETPOST(
'confirm',
'alpha');
66$cancel =
GETPOST(
'cancel',
'alpha');
67$toselect =
GETPOST(
'toselect',
'array');
68$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
69$backtopage =
GETPOST(
'backtopage',
'alpha');
70$optioncss =
GETPOST(
'optioncss',
'alpha');
71$mode =
GETPOST(
'mode',
'alpha');
77$project_ref =
GETPOST(
'project_ref',
'alpha');
83$search_date_startday =
GETPOSTINT(
'search_date_startday');
84$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
85$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
86$search_date_endday =
GETPOSTINT(
'search_date_endday');
87$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
88$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
89$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
90$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
91$search_note =
GETPOST(
'search_note',
'alpha');
92$search_duration =
GETPOST(
'search_duration',
'alpha');
93$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
94$search_task_label =
GETPOST(
'search_task_label',
'alpha');
95$search_user =
GETPOST(
'search_user',
'intcomma');
96$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
97$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
98$search_company =
GETPOST(
'$search_company',
'alpha');
99$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
100$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
101$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
102$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
103$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
104$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
105$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
108$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
109$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
111if (empty($page) || $page == -1) {
114$offset = $limit * $page;
115$pageprev = $page - 1;
116$pagenext = $page + 1;
118 $sortfield =
't.element_date,t.element_datehour,t.rowid';
121 $sortorder =
'DESC,DESC,DESC';
124$childids = $user->getAllChildIds(1);
128$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
132$projectstatic =
new Project($db);
135$extrafields->fetch_name_optionals_label($projectstatic->table_element);
136$extrafields->fetch_name_optionals_label(
$object->table_element);
139if ($id > 0 || $ref) {
147if (!$user->hasRight(
'projet',
'lire')) {
156 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
157 $search_user = $user->id;
167if (
GETPOST(
'cancel',
'alpha')) {
170if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
174$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
175$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
180include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
183if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
188 $search_duration =
'';
189 $search_date_startday =
'';
190 $search_date_startmonth =
'';
191 $search_date_startyear =
'';
192 $search_date_endday =
'';
193 $search_date_endmonth =
'';
194 $search_date_endyear =
'';
195 $search_date_start =
'';
196 $search_date_end =
'';
197 $search_task_ref =
'';
198 $search_company =
'';
199 $search_company_alias =
'';
200 $search_project_ref =
'';
201 $search_project_label =
'';
202 $search_task_label =
'';
204 $search_valuebilled =
'';
205 $search_product_ref =
'';
207 $search_array_options = array();
208 $search_timespent_starthour =
'';
209 $search_timespent_startmin =
'';
210 $search_timespent_endhour =
'';
211 $search_timespent_endmin =
'';
215if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
216 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
217 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
218 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
219 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
223 $langs->load(
"errors");
224 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
233 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
234 $action =
'createtime';
244 if (empty(
$object->project->status)) {
245 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
246 $action =
'createtime';
257 $object->timespent_withhour = 1;
260 $object->timespent_withhour = 0;
265 $result =
$object->addTimeSpent($user);
276 $action =
'createtime';
280if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
281 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
282 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
298 $object->fetch($id_temp, $ref);
300 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
304 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
306 $object->timespent_withhour = 1;
307 } elseif (!empty($timespent_date)) {
308 $object->timespent_date = $timespent_date;
309 $object->timespent_withhour = 0;
317 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
318 $result =
$object->updateTimeSpent($user);
331 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
335 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
338 $object->timespent_withhour = 1;
339 } elseif (!empty($timespent_date)) {
340 $object->timespent_date = $timespent_date;
341 $object->timespent_datehour = $timespent_date;
342 $object->timespent_withhour = 0;
350 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
351 $result =
$object->updateTimeSpent($user);
366if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
369 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
370 $result =
$object->delTimeSpent($user);
373 $langs->load(
"errors");
384if (!empty($project_ref) && !empty($withproject)) {
385 if ($projectstatic->fetch(0, $project_ref) > 0) {
386 $tasksarray =
$object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
387 if (count($tasksarray) > 0) {
388 $id = $tasksarray[0]->id;
390 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
397$projectidforalltimes = 0;
399 $projectidforalltimes =
GETPOSTINT(
'projectid');
401 $result = $projectstatic->fetch($projectidforalltimes);
402 if (!empty($projectstatic->socid)) {
403 $projectstatic->fetch_thirdparty();
405 $res = $projectstatic->fetch_optionals();
406} elseif (
GETPOST(
'project_ref',
'alpha')) {
407 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
408 $projectidforalltimes = $projectstatic->id;
412 $result = $projectstatic->fetch(
$object->fk_project);
415if ($id <= 0 && $projectidforalltimes == 0) {
416 $allprojectforuser = $user->id;
419if ($action ==
'confirm_generateinvoice') {
420 if (!empty($projectstatic->socid)) {
421 $projectstatic->fetch_thirdparty();
424 if (!($projectstatic->thirdparty->id > 0)) {
425 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
427 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
428 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
429 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
431 $tmpinvoice =
new Facture($db);
432 $tmptimespent =
new Task($db);
433 $tmpproduct =
new Product($db);
434 $fuser =
new User($db);
439 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
442 $prodDurationHoursBase = 1.0;
443 $product_data_cache = array();
445 $tmpproduct->fetch($idprod);
451 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
452 if ($prodDurationHoursBase < 0) {
454 $langs->load(
"errors");
458 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
460 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
461 $txtva = $dataforprice[
'tva_tx'];
462 $localtax1 = $dataforprice[
'localtax1'];
463 $localtax2 = $dataforprice[
'localtax2'];
465 $prodDurationHoursBase = 1;
473 $tmpinvoice->socid = $projectstatic->thirdparty->id;
475 $tmpinvoice->fk_project = $projectstatic->id;
476 $tmpinvoice->cond_reglement_id = $condidproject;
477 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
478 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
481 $tmpinvoice->fetch($invoiceToUse);
483 $result = $tmpinvoice->create($user);
491 if ($generateinvoicemode ==
'onelineperuser') {
492 $arrayoftasks = array();
493 foreach ($toselect as $key => $value) {
495 $object->fetchTimeSpent($value);
496 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
497 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
500 foreach ($arrayoftasks as $userid => $data) {
501 $fuser->fetch($userid);
502 $username = $fuser->getFullName($langs);
504 foreach ($data as $fk_product => $timespent_data) {
506 $qtyhour = $timespent_data[
'timespent'] / 3600;
513 } elseif ($idprod <= 0) {
516 $pu_ht = $fuser->thm;
521 if ($timespent_data[
'timespent']) {
522 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
527 $prodDurationHours = $prodDurationHoursBase;
528 $idprodline = $idprod;
531 $localtax1line = $localtax1;
532 $localtax2line = $localtax2;
535 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
536 if (!array_key_exists($fk_product, $product_data_cache)) {
537 $result = $tmpproduct->fetch($fk_product);
542 $prodDurationHours = $tmpproduct->getProductDurationHours();
543 if ($prodDurationHours < 0) {
545 $langs->load(
"errors");
549 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
551 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
552 $txtvaline = $dataforprice[
'tva_tx'];
553 $localtax1line = $dataforprice[
'localtax1'];
554 $localtax2line = $dataforprice[
'localtax2'];
556 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
558 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
559 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
560 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
561 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
562 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
564 $idprodline = $fk_product;
571 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice", $username) .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject,
'',
'', 0, 0,
'',
'HT', 0,
Product::TYPE_SERVICE);
578 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
579 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
580 $result = $db->query($sql);
588 } elseif ($generateinvoicemode ==
'onelineperperiod') {
589 $arrayoftasks = array();
591 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
592 foreach ($toselect as $key => $value) {
594 $object->fetchTimeSpent($value);
596 $ftask =
new Task($db);
599 $fuser->fetch(
$object->timespent_fk_user);
600 $username = $fuser->getFullName($langs);
602 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
603 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
604 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
607 if (!empty($withdetail)) {
608 if (!empty(
$object->timespent_withhour)) {
615 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
616 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
619 foreach ($arrayoftasks as $timespent_id => $value) {
620 $userid = $value[
'user'];
624 $qtyhour = $value[
'timespent'] / 3600;
628 $pu_ht =
price2num($value[
'totalvaluetodivideby3600'] / 3600,
'MU');
632 $prodDurationHours = $prodDurationHoursBase;
633 $idprodline = $idprod;
636 $localtax1line = $localtax1;
637 $localtax2line = $localtax2;
639 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
640 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
641 $result = $tmpproduct->fetch($value[
'fk_product']);
646 $prodDurationHours = $tmpproduct->getProductDurationHours();
647 if ($prodDurationHours < 0) {
649 $langs->load(
"errors");
653 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
655 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
656 $txtvaline = $dataforprice[
'tva_tx'];
657 $localtax1line = $dataforprice[
'localtax1'];
658 $localtax2line = $dataforprice[
'localtax2'];
660 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
662 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
663 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
664 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
665 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
666 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
668 $idprodline = $value[
'fk_product'];
674 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject,
'',
'', 0, 0,
'',
'HT', 0,
Product::TYPE_SERVICE);
682 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
683 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
684 $result = $db->query($sql);
691 } elseif ($generateinvoicemode ==
'onelinepertask') {
692 $arrayoftasks = array();
693 foreach ($toselect as $key => $value) {
695 $object->fetchTimeSpent($value);
697 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
698 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
701 foreach ($arrayoftasks as $task_id => $data) {
702 $ftask =
new Task($db);
703 $ftask->fetch($task_id);
705 foreach ($data as $fk_product => $timespent_data) {
706 $qtyhour = $timespent_data[
'timespent'] / 3600;
710 $prodDurationHours = $prodDurationHoursBase;
711 $idprodline = $idprod;
714 $localtax1line = $localtax1;
715 $localtax2line = $localtax2;
717 if (!empty($fk_product) && $fk_product !== $idprod) {
718 if (!array_key_exists($fk_product, $product_data_cache)) {
719 $result = $tmpproduct->fetch($fk_product);
724 $prodDurationHours = $tmpproduct->getProductDurationHours();
725 if ($prodDurationHours < 0) {
727 $langs->load(
"errors");
731 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
733 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
734 $txtvaline = $dataforprice[
'tva_tx'];
735 $localtax1line = $dataforprice[
'localtax1'];
736 $localtax2line = $dataforprice[
'localtax2'];
738 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
740 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
741 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
742 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
743 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
744 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
746 $idprodline = $fk_product;
750 if ($idprodline > 0) {
752 $pu_ht_for_task = $pu_htline;
755 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
757 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
763 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
765 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
771 $lineName = $ftask->ref .
' - ' . $ftask->label;
772 $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);
781 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
782 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
783 $result = $db->query($sql);
796 $urltoinvoice = $tmpinvoice->getNomUrl(0);
797 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
798 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
808if ($action ==
'confirm_generateinter') {
809 $langs->load(
'interventions');
811 if (!empty($projectstatic->socid)) {
812 $projectstatic->fetch_thirdparty();
815 if (!($projectstatic->thirdparty->id > 0)) {
816 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
818 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
819 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
820 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
823 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
825 $tmptimespent =
new Task($db);
826 $fuser =
new User($db);
832 $tmpinter->socid = $projectstatic->thirdparty->id;
834 $tmpinter->fk_project = $projectstatic->id;
835 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
838 $tmpinter->fetch($interToUse);
840 $result = $tmpinter->create($user);
848 $arrayoftasks = array();
849 foreach ($toselect as $key => $value) {
851 $object->fetchTimeSpent($value);
854 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
855 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
856 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
857 $arrayoftasks[
$object->timespent_id][
'date'] = date(
'Y-m-d H:i:s',
$object->timespent_datehour);
860 foreach ($arrayoftasks as $timespent_id => $value) {
861 $ftask =
new Task($db);
862 $ftask->fetch($value[
'id']);
864 $qtyhour = $value[
'timespent'] / 3600;
868 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), $value[
'date'], $value[
'timespent']);
873 $urltointer = $tmpinter->getNomUrl(0);
874 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
875 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
892$form =
new Form($db);
895$userstatic =
new User($db);
897$arrayofselected = is_array($toselect) ? $toselect : array();
899$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
900if (!empty($withproject)) {
901 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
905llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
907if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
911 if ($projectidforalltimes > 0) {
912 $result = $projectstatic->fetch($projectidforalltimes);
913 if (!empty($projectstatic->socid)) {
914 $projectstatic->fetch_thirdparty();
916 $res = $projectstatic->fetch_optionals();
917 } elseif (
$object->fetch($id, $ref) >= 0) {
918 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
921 $result = $projectstatic->fetch(
$object->fk_project);
922 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
923 $projectstatic->fetchComments();
925 if (!empty($projectstatic->socid)) {
926 $projectstatic->fetch_thirdparty();
928 $res = $projectstatic->fetch_optionals();
930 $object->project = clone $projectstatic;
933 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
934 $linktocreatetime =
'';
936 if ($projectstatic->id > 0) {
939 if (empty($id) || $tab ==
'timespent') {
946 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
948 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
950 $param .=
'&search_user=' . ((int) $search_user);
953 $param .=
'&search_month=' . ((int) $search_month);
956 $param .=
'&search_year=' . ((int) $search_year);
961 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
963 $morehtmlref =
'<div class="refidno">';
965 $morehtmlref .= $projectstatic->title;
967 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
968 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
970 $morehtmlref .=
'</div>';
973 if (!$user->hasRight(
'projet',
'all',
'lire')) {
974 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
975 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
978 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
980 print
'<div class="fichecenter">';
981 print
'<div class="fichehalfleft">';
982 print
'<div class="underbanner clearboth"></div>';
984 print
'<table class="border tableforfield centpercent">';
988 print
'<tr><td class="tdtop">';
989 print $langs->trans(
"Usage");
993 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
994 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
995 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
999 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1000 $htmltext = $langs->trans(
"ProjectFollowTasks");
1001 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1005 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"' :
'')) .
'"> ';
1006 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1007 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1010 if (isModEnabled(
'eventorganization')) {
1011 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"' :
'')) .
'"> ';
1012 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1013 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1019 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1020 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1021 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1026 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1028 print($start ? $start :
'?');
1031 print($end ? $end :
'?');
1032 if ($projectstatic->hasDelay()) {
1038 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1039 if ($projectstatic->public) {
1040 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1041 print $langs->trans(
'SharedProject');
1043 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1044 print $langs->trans(
'PrivateProject');
1052 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1058 print
'<div class="fichehalfright">';
1059 print
'<div class="underbanner clearboth"></div>';
1061 print
'<table class="border tableforfield centpercent">';
1064 if (isModEnabled(
'category')) {
1065 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1066 print $form->showCategories($projectstatic->id,
'project', 1);
1071 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1072 if ($projectstatic->description) {
1073 print
'<tr><td class="nottitleforfield" colspan="2">';
1074 print
'<div class="longmessagecut">';
1085 print
'<div class="clearboth"></div>';
1095 $linktocreatetimeBtnStatus = 0;
1096 $linktocreatetimeUrl =
'';
1097 $linktocreatetimeHelpText =
'';
1098 if ($user->hasRight(
'projet',
'time')) {
1099 if ($projectstatic->public || $userRead > 0) {
1100 $linktocreatetimeBtnStatus = 1;
1102 if (!empty($projectidforalltimes)) {
1104 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1105 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1108 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1109 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1112 $linktocreatetimeBtnStatus = -2;
1113 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1116 $linktocreatetimeBtnStatus = -2;
1117 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1120 $paramsbutton = array(
'morecss' =>
'reposition');
1121 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1124 $massactionbutton =
'';
1125 $arrayofmassactions = array();
1127 if ($projectstatic->id > 0) {
1129 if ($projectstatic->usage_bill_time) {
1130 $arrayofmassactions = array(
1131 'generateinvoice' => $langs->trans(
"GenerateBill"),
1135 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1136 $langs->load(
"interventions");
1137 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1141 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1142 $arrayofmassactions = array();
1144 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1149 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1151 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1153 if ($action ==
'deleteline') {
1154 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1155 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1158 $param = ($withproject ?
'&withproject=1' :
'');
1159 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1160 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1162 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1163 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1164 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1166 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1172 if (empty($withproject)) {
1173 $morehtmlref .=
'<div class="refidno">';
1174 $morehtmlref .= $langs->trans(
"Project") .
': ';
1175 $morehtmlref .= $projectstatic->getNomUrl(1);
1176 $morehtmlref .=
'<br>';
1179 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1180 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1181 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1183 $morehtmlref .=
'</div>';
1186 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1188 print
'<div class="fichecenter">';
1189 print
'<div class="fichehalfleft">';
1191 print
'<div class="underbanner clearboth"></div>';
1192 print
'<table class="border centpercent tableforfield">';
1195 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1196 if (
$object->fk_task_parent > 0) {
1197 $tasktmp =
new Task($db);
1198 $tasktmp->fetch(
$object->fk_task_parent);
1199 print $tasktmp->getNomUrl(1);
1204 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1206 print($start ? $start :
'?');
1209 print($end ? $end :
'?');
1216 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1217 if (
$object->planned_workload) {
1225 print
'<div class="fichehalfright">';
1227 print
'<div class="underbanner clearboth"></div>';
1228 print
'<table class="border tableforfield centpercent">';
1231 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1236 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1237 if (
$object->planned_workload) {
1238 $tmparray =
$object->getSummaryOfTimeSpent();
1239 if ($tmparray[
'total_duration'] > 0) {
1240 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1245 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1256 print
'<div class="clearboth"></div>';
1260 if ($action ==
'deleteline') {
1261 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1262 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1267 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1269 $hookmanager->initHooks(array(
'tasktimelist'));
1273 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1275 $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);
1276 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1280 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1281 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1282 if (empty($reshook)) {
1283 $formconfirm .= $hookmanager->resPrint;
1284 } elseif ($reshook > 0) {
1285 $formconfirm = $hookmanager->resPrint;
1292 $arrayfields = array();
1293 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' => 1);
1294 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' => 1);
1295 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1296 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1297 if (! empty($allprojectforuser)) {
1298 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' => 1];
1299 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' => 1];
1301 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' => 1);
1302 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' => 1);
1304 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' => 1);
1305 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' => 1);
1306 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1307 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' => 1);
1309 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' => 1);
1310 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' => 1,
'enabled' => isModEnabled(
"salaries"));
1311 $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));
1313 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1316 '@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields';
1319 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1320 $param .=
'&contextpage=' . urlencode($contextpage);
1322 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1323 $param .=
'&limit='.((int) $limit);
1325 if ($search_month > 0) {
1326 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1328 if ($search_year > 0) {
1329 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1331 if (!empty($search_user)) {
1332 $param .=
'&search_user='.urlencode($search_user);
1334 if ($search_task_ref !=
'') {
1335 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1337 if ($search_company !=
'') {
1338 $param .=
'&$search_company=' . urlencode($search_company);
1340 if ($search_company_alias !=
'') {
1341 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1343 if ($search_project_ref !=
'') {
1344 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1346 if ($search_project_label !=
'') {
1347 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1349 if ($search_task_label !=
'') {
1350 $param .=
'&search_task_label=' . urlencode($search_task_label);
1352 if ($search_note !=
'') {
1353 $param .=
'&search_note=' . urlencode($search_note);
1355 if ($search_duration !=
'') {
1356 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1358 if ($optioncss !=
'') {
1359 $param .=
'&optioncss=' . urlencode($optioncss);
1361 if ($search_date_startday) {
1362 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1364 if ($search_date_startmonth) {
1365 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1367 if ($search_date_startyear) {
1368 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1370 if ($search_date_endday) {
1371 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1373 if ($search_date_endmonth) {
1374 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1376 if ($search_date_endyear) {
1377 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1379 if ($search_timespent_starthour) {
1380 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1382 if ($search_timespent_startmin) {
1383 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1385 if ($search_timespent_endhour) {
1386 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1388 if ($search_timespent_endmin) {
1389 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1397 $param .=
'&id=' . urlencode((
string) ($id));
1400 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1403 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1406 $parameters = array(
'param' => &$param);
1407 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1408 $param .= $hookmanager->resPrint;
1410 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1411 if ($optioncss !=
'') {
1412 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1414 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1415 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1416 if ($action ==
'editline') {
1417 print
'<input type="hidden" name="action" value="updateline">';
1418 } elseif ($action ==
'splitline') {
1419 print
'<input type="hidden" name="action" value="updatesplitline">';
1420 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1421 print
'<input type="hidden" name="action" value="addtimespent">';
1422 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1423 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1424 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1425 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1427 print
'<input type="hidden" name="action" value="list">';
1429 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1430 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1432 print
'<input type="hidden" name="id" value="' .
$id .
'">';
1433 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1434 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1435 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1436 print
'<input type="hidden" name="page_y" value="">';
1439 if ($massaction ==
'generateinvoice') {
1440 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1441 print
'<table class="noborder centerpercent">';
1443 print
'<td class="titlefield">';
1444 print $langs->trans(
'DateInvoice');
1447 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1453 print $langs->trans(
'Mode');
1457 'onelineperuser' =>
'OneLinePerUser',
1458 'onelinepertask' =>
'OneLinePerTask',
1459 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1461 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1462 print
"\n" .
'<script type="text/javascript">';
1464 $(document).ready(function () {
1465 setDetailVisibility();
1466 $("#generateinvoicemode").change(function() {
1467 setDetailVisibility();
1469 function setDetailVisibility() {
1470 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1471 if (generateinvoicemode=="onelineperperiod") {
1472 $("#detail_time_duration").show();
1474 $("#detail_time_duration").hide();
1479 print
'</script>' .
"\n";
1480 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1484 if (isModEnabled(
"service")) {
1487 print $langs->trans(
'ServiceToUseOnLines');
1490 $form->select_produits(
'',
'productid',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1495 print
'<td class="titlefield">';
1496 print $langs->trans(
'InvoiceToUse');
1499 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1503 print
'<td class="titlefield">';
1504 print $langs->trans(
"CustomerRelativeDiscount");
1507 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1510 print
'<tr class="newinvoicedetail">';
1511 print
'<td class="titlefield">';
1512 print $langs->trans(
"PaymentConditions");
1515 print $form->getSelectConditionsPaiements($projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1529 print
'<div class="center">';
1530 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1531 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1535 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1536 print
'<div class="center">';
1537 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1541 } elseif ($massaction ==
'generateinter') {
1543 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1545 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1547 print
'<table class="noborder centpercent">';
1549 print
'<td class="titlefield">';
1550 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1554 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1559 print
'<div class="center">';
1560 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1561 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1565 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1566 print
'<div class="center">';
1567 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1574 $parameters = array(
1575 'toselect' => $toselect,
1576 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1579 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1583 print $hookmanager->resPrint;
1591 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1592 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1594 $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,";
1595 $sql .=
" t.fk_product,";
1596 $sql .=
" pt.ref, pt.label, pt.fk_projet,";
1597 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1598 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1599 $sql .=
" p.fk_soc,s.name_alias,";
1600 $sql .=
" t.invoice_line_id,";
1601 $sql .=
" pt.billable";
1603 $parameters = array();
1604 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1605 $sql .= $hookmanager->resPrint;
1606 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1610 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1611 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1612 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1613 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1614 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1615 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1616 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1617 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1620 $parameters = array();
1621 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1622 $sql .= $hookmanager->resPrint;
1623 $sql .=
" WHERE elementtype = 'task'";
1624 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1625 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1629 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1630 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1632 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1634 $sql .=
" AND t.fk_element =".((int)
$object->id);
1635 } elseif (!empty($projectidforalltimes)) {
1637 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize($projectidforalltimes) .
")";
1638 } elseif (!empty($allprojectforuser)) {
1640 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1641 $search_user = $user->id;
1643 if ($search_user > 0) {
1644 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1651 if ($search_task_ref) {
1654 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1655 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1657 if ($search_company) {
1660 if ($search_company_alias) {
1664 if ($search_project_ref) {
1667 if ($search_project_label) {
1670 if ($search_task_label) {
1673 if ($search_user > 0) {
1676 if (!empty($search_product_ref)) {
1679 if ($search_valuebilled ==
'1') {
1680 $sql .=
' AND t.invoice_id > 0';
1682 if ($search_valuebilled ==
'0') {
1683 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1686 if ($search_date_start) {
1687 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1689 if ($search_date_end) {
1690 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1693 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1694 if ($search_timespent_starthour || $search_timespent_startmin) {
1695 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1696 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1697 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1700 if ($search_timespent_endhour || $search_timespent_endmin) {
1701 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1702 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1703 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1707 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1710 $parameters = array();
1711 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1712 $sql .= $hookmanager->resPrint;
1715 $nbtotalofrecords =
'';
1718 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1719 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1720 $resql = $db->query($sqlforcount);
1722 $objforcount = $db->fetch_object($resql);
1723 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1728 if (($page * $limit) > $nbtotalofrecords) {
1736 $sql .= $db->order($sortfield, $sortorder);
1738 $sql .= $db->plimit($limit + 1, $offset);
1741 $resql = $db->query($sql);
1747 $num = $db->num_rows($resql);
1750 if (!empty($projectidforalltimes)) {
1751 print
'<!-- List of time spent for project -->' .
"\n";
1753 $title = $langs->trans(
"ListTaskTimeUserProject");
1755 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1757 print
'<!-- List of time spent -->' .
"\n";
1759 $title = $langs->trans(
"ListTaskTimeForTask");
1761 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1766 $row = $db->fetch_object($resql);
1778 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1779 print
'<!-- table to add time spent -->' .
"\n";
1781 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1784 print
'<div class="div-table-responsive-no-min">';
1785 print
'<table class="noborder nohover centpercent">';
1787 print
'<tr class="liste_titre">';
1788 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1789 if (!empty($allprojectforuser)) {
1790 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1793 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1795 print
'<td>' . $langs->trans(
"By") .
'</td>';
1796 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1797 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1798 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1802 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1803 print
'<td>'.$langs->trans(
"Product").
'</td>';
1807 $parameters = array(
'mode' =>
'create');
1808 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1809 print $hookmanager->resPrint;
1813 print
'<tr class="oddeven nohover">';
1816 print
'<td class="maxwidthonsmartphone">';
1818 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1821 if (!empty($allprojectforuser)) {
1830 print
'<td class="maxwidthonsmartphone">';
1831 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth300', $projectstatic->id,
'progress');
1836 print
'<td class="maxwidthonsmartphone nowraponall">';
1837 $contactsofproject = $projectstatic->getListContactId(
'internal');
1838 if (count($contactsofproject) > 0) {
1839 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1840 if (in_array($user->id, $contactsofproject)) {
1841 $userid = $user->id;
1843 $userid = $contactsofproject[0];
1846 if ($projectstatic->public) {
1847 $contactsofproject = array();
1849 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0,
'', 0,
'', $contactsofproject, 0, 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1852 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1859 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1863 print
'<td class="nowraponall">';
1864 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1865 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1866 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1868 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1872 print
'<td class="nowrap">';
1873 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1881 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1882 print
'<td class="nowraponall">';
1884 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);
1890 $parameters = array(
'mode' =>
'create');
1891 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1892 print $hookmanager->resPrint;
1894 print
'<td class="center">';
1895 $form->buttonsSaveCancel();
1896 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1897 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1906 $moreforfilter =
'';
1908 $parameters = array();
1909 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1910 if (empty($reshook)) {
1911 $moreforfilter .= $hookmanager->resPrint;
1913 $moreforfilter = $hookmanager->resPrint;
1916 if (!empty($moreforfilter)) {
1917 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1918 print $moreforfilter;
1922 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1923 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1924 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1926 print
'<div class="div-table-responsive">';
1927 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1931 print
'<tr class="liste_titre_filter">';
1934 print
'<td class="liste_titre center">';
1935 $searchpicto = $form->showFilterButtons(
'left');
1940 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1941 print
'<td class="liste_titre left">';
1942 print
'<div class="nowrapfordate">';
1943 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1945 print
'<div class="nowrapfordate">';
1946 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1951 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1952 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1956 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1957 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1960 if (!empty($allprojectforuser)) {
1961 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1962 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
1964 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
1965 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
1969 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1970 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
1971 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
1973 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
1974 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
1978 if (!empty($arrayfields[
'author'][
'checked'])) {
1979 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>';
1982 if (!empty($arrayfields[
't.note'][
'checked'])) {
1983 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
1986 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1988 print
'<td class="liste_titre right">';
1990 $durationtouse_start =
'';
1991 if ($search_timespent_starthour || $search_timespent_startmin) {
1992 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
1994 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
1995 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
1998 $durationtouse_end =
'';
1999 if ($search_timespent_endhour || $search_timespent_endmin) {
2000 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2002 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2003 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2009 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2010 print
'<td class="liste_titre right"></td>';
2013 if (!empty($arrayfields[
'value'][
'checked'])) {
2014 print
'<td class="liste_titre"></td>';
2017 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2018 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2026 $parameters = array(
'arrayfields' => $arrayfields);
2027 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2028 print $hookmanager->resPrint;
2031 print
'<td class="liste_titre center">';
2032 $searchpicto = $form->showFilterButtons();
2036 print
'</tr>' .
"\n";
2039 $totalarray = array();
2040 $totalarray[
'nbfield'] = 0;
2044 print
'<tr class="liste_titre">';
2046 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2047 $totalarray[
'nbfield']++;
2049 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2050 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2051 $totalarray[
'nbfield']++;
2053 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2054 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2055 $totalarray[
'nbfield']++;
2057 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2059 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2060 $totalarray[
'nbfield']++;
2062 if (!empty($allprojectforuser)) {
2063 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2065 $totalarray[
'nbfield']++;
2067 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2068 print_liste_field_titre(
"ProjectLabel", $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2069 $totalarray[
'nbfield']++;
2072 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2073 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2074 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2075 $totalarray[
'nbfield']++;
2077 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2078 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2079 $totalarray[
'nbfield']++;
2082 if (!empty($arrayfields[
'author'][
'checked'])) {
2083 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2084 $totalarray[
'nbfield']++;
2086 if (!empty($arrayfields[
't.note'][
'checked'])) {
2087 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2088 $totalarray[
'nbfield']++;
2090 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2091 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2092 $totalarray[
'nbfield']++;
2094 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2095 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2096 $totalarray[
'nbfield']++;
2099 if (!empty($arrayfields[
'value'][
'checked'])) {
2100 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2101 $totalarray[
'nbfield']++;
2103 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2104 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2105 $totalarray[
'nbfield']++;
2112 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2113 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2114 print $hookmanager->resPrint;
2116 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2117 $totalarray[
'nbfield']++;
2121 $tasktmp =
new Task($db);
2122 $tmpinvoice =
new Facture($db);
2125 $param .=
'&page='.((int) $page);
2127 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2131 $savnbfield = $totalarray[
'nbfield'];
2132 $totalarray = array();
2133 $totalarray[
'nbfield'] = 0;
2135 foreach ($tasks as $task_time) {
2141 $invoiced = $task_time->invoice_id ? true :
false;
2143 $date1 = $db->jdate($task_time->element_date);
2144 $date2 = $db->jdate($task_time->element_datehour);
2148 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2152 print
'<td class="center nowraponall">';
2153 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2154 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2155 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2157 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2158 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2159 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2160 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' :
'').
'">';
2161 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2165 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' :
'') .
'">';
2166 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2170 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' :
'').
'">';
2171 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2174 if ($massactionbutton || $massaction) {
2176 if (in_array($task_time->rowid, $arrayofselected)) {
2182 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2183 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2187 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2188 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2197 $totalarray[
'nbfield']++;
2202 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2203 print
'<td class="nowrap">';
2204 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2205 if (empty($task_time->element_date_withhour)) {
2206 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2208 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2211 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2215 $totalarray[
'nbfield']++;
2220 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2221 print
'<td class="tdoverflowmax125">';
2222 if ($task_time->fk_soc > 0) {
2223 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2224 $tmpsociete =
new Societe($db);
2225 $tmpsociete->fetch($task_time->fk_soc);
2226 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2228 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2230 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2234 $totalarray[
'nbfield']++;
2239 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2240 if ($task_time->fk_soc > 0) {
2241 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2242 $tmpsociete =
new Societe($db);
2243 $tmpsociete->fetch($task_time->fk_soc);
2244 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2246 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2248 $valtoshow = $tmpsociete->name_alias;
2250 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2254 $totalarray[
'nbfield']++;
2259 if (!empty($allprojectforuser)) {
2260 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2261 print
'<td class="nowraponall">';
2262 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2263 $tmpproject =
new Project($db);
2264 $tmpproject->fetch($task_time->fk_projet);
2265 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2267 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2269 print $tmpproject->getNomUrl(1);
2272 $totalarray[
'nbfield']++;
2275 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2276 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2277 $tmpproject =
new Project($db);
2278 $tmpproject->fetch($task_time->fk_projet);
2279 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2281 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2283 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($tmpproject->title).
'">';
2287 $totalarray[
'nbfield']++;
2293 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2294 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2295 print
'<td class="nowrap">';
2296 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2297 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth250', $projectstatic->id,
'');
2299 $tasktmp->id = $task_time->fk_element;
2300 $tasktmp->ref = $task_time->ref;
2301 $tasktmp->label = $task_time->label;
2302 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2306 $totalarray[
'nbfield']++;
2309 } elseif ($action !==
'createtime') {
2310 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2314 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2315 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2316 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($task_time->label).
'">';
2320 $totalarray[
'nbfield']++;
2326 if (!empty($arrayfields[
'author'][
'checked'])) {
2327 print
'<td class="minwidth100 tdoverflowmax125">';
2328 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2331 $object->fetch($task_time->fk_element);
2333 $contactsoftask =
$object->getListContactId(
'internal');
2334 if (!in_array($task_time->fk_user, $contactsoftask)) {
2335 $contactsoftask[] = $task_time->fk_user;
2337 if (count($contactsoftask) > 0) {
2338 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2339 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2341 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2344 $userstatic->id = $task_time->fk_user;
2345 $userstatic->lastname = $task_time->lastname;
2346 $userstatic->firstname = $task_time->firstname;
2347 $userstatic->photo = $task_time->photo;
2348 $userstatic->gender = $task_time->gender;
2349 $userstatic->status = $task_time->user_status;
2351 print $userstatic->getNomUrl(-1);
2355 $totalarray[
'nbfield']++;
2360 if (!empty($arrayfields[
't.note'][
'checked'])) {
2361 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2362 print
'<td class="small">';
2363 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2366 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2371 $totalarray[
'nbfield']++;
2373 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2374 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2378 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2379 print
'<td class="right nowraponall">';
2380 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2381 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2382 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2388 $totalarray[
'nbfield']++;
2391 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.element_duration';
2393 if (empty($totalarray[
'val'][
't.element_duration'])) {
2394 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2396 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2399 $totalarray[
'totaldurationfield'] = $totalarray[
'nbfield'];
2401 if (empty($totalarray[
'totalduration'])) {
2402 $totalarray[
'totalduration'] = $task_time->element_duration;
2404 $totalarray[
'totalduration'] += $task_time->element_duration;
2409 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2410 print
'<td class="nowraponall">';
2411 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2413 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);
2414 } elseif (!empty($task_time->fk_product)) {
2416 $resultFetch = $product->fetch($task_time->fk_product);
2417 if ($resultFetch < 0) {
2420 print $product->getNomUrl(1);
2425 $totalarray[
'nbfield']++;
2430 if (!empty($arrayfields[
'value'][
'checked'])) {
2431 $langs->load(
"salaries");
2432 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2434 print
'<td class="nowraponall right">';
2435 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2436 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2440 $totalarray[
'nbfield']++;
2443 $totalarray[
'pos'][$totalarray[
'nbfield']] =
'value';
2445 if (empty($totalarray[
'val'][
'value'])) {
2446 $totalarray[
'val'][
'value'] = $value;
2448 $totalarray[
'val'][
'value'] += $value;
2451 $totalarray[
'totalvaluefield'] = $totalarray[
'nbfield'];
2453 if (empty($totalarray[
'totalvalue'])) {
2454 $totalarray[
'totalvalue'] = $value;
2456 $totalarray[
'totalvalue'] += $value;
2461 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2462 print
'<td class="center">';
2464 if ($projectstatic->usage_bill_time) {
2465 if ($task_time->invoice_id) {
2466 $result = $tmpinvoice->fetch($task_time->invoice_id);
2468 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2469 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2471 print $tmpinvoice->getNomUrl(1);
2472 if (!empty($task_time->invoice_line_id)) {
2474 $invoiceLine->fetch($task_time->invoice_line_id);
2475 if (!empty($invoiceLine->id)) {
2476 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2477 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2484 if (intval($task_time->billable) == 1) {
2485 print $langs->trans(
"No");
2487 print $langs->trans(
"Disabled");
2491 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2496 $totalarray[
'nbfield']++;
2506 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &$totalarray);
2507 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2508 print $hookmanager->resPrint;
2512 print
'<td class="center nowraponall">';
2513 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2514 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2515 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2517 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2518 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2519 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2520 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' :
'').
'">';
2521 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2525 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' :
'') .
'">';
2526 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2530 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' :
'').
'">';
2531 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2534 if ($massactionbutton || $massaction) {
2536 if (in_array($task_time->rowid, $arrayofselected)) {
2542 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2543 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2547 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2548 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2557 $totalarray[
'nbfield']++;
2566 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2567 print
'<!-- first line -->';
2568 print
'<tr class="oddeven">';
2576 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2577 print
'<td class="nowrap">';
2578 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2579 if (empty($task_time->element_date_withhour)) {
2580 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2582 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2585 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2591 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2592 print
'<td class="nowrap">';
2597 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2598 print
'<td class="nowrap">';
2603 if (!empty($allprojectforuser)) {
2604 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2605 print
'<td class="nowrap">';
2611 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2612 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2613 print
'<td class="nowrap">';
2614 $tasktmp->id = $task_time->fk_element;
2615 $tasktmp->ref = $task_time->ref;
2616 $tasktmp->label = $task_time->label;
2617 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2623 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2624 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2625 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2632 if (!empty($arrayfields[
'author'][
'checked'])) {
2633 print
'<td class="nowraponall">';
2634 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2636 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2639 $contactsoftask =
$object->getListContactId(
'internal');
2640 if (!in_array($task_time->fk_user, $contactsoftask)) {
2641 $contactsoftask[] = $task_time->fk_user;
2643 if (count($contactsoftask) > 0) {
2644 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2645 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
'', 0,
'', $contactsoftask);
2647 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2650 $userstatic->id = $task_time->fk_user;
2651 $userstatic->lastname = $task_time->lastname;
2652 $userstatic->firstname = $task_time->firstname;
2653 $userstatic->photo = $task_time->photo;
2654 $userstatic->status = $task_time->user_status;
2655 print $userstatic->getNomUrl(-1);
2661 if (!empty($arrayfields[
't.note'][
'checked'])) {
2662 print
'<td class="tdoverflowmax300">';
2663 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2664 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2669 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2670 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2674 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2675 print
'<td class="right">';
2676 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2677 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2678 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2686 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2687 print
'<td class="nowraponall tdoverflowmax125">';
2692 if (!empty($arrayfields[
'value'][
'checked'])) {
2693 print
'<td class="right">';
2694 print
'<span class="amount">';
2695 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2696 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2702 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2703 print
'<td class="right">';
2704 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2705 if (isset($task_time->total_ht)) {
2706 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2717 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2718 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2719 print $hookmanager->resPrint;
2723 print
'<td class="center nowraponall">';
2732 print
'<!-- second line --><tr class="oddeven">';
2736 print
'<td class="center nowraponall">';
2741 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2742 print
'<td class="nowrap">';
2743 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2744 if (empty($task_time->element_date_withhour)) {
2745 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2747 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2750 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2756 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2757 print
'<td class="nowrap">';
2762 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2763 print
'<td class="nowrap">';
2768 if (!empty($allprojectforuser)) {
2769 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2770 print
'<td class="nowrap">';
2776 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2777 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2778 print
'<td class="nowrap">';
2779 $tasktmp->id = $task_time->fk_element;
2780 $tasktmp->ref = $task_time->ref;
2781 $tasktmp->label = $task_time->label;
2782 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2788 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2789 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2790 print
'<td class="nowrap">';
2797 if (!empty($arrayfields[
'author'][
'checked'])) {
2798 print
'<td class="nowraponall tdoverflowmax100">';
2799 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2801 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2804 $contactsoftask =
$object->getListContactId(
'internal');
2805 if (!in_array($task_time->fk_user, $contactsoftask)) {
2806 $contactsoftask[] = $task_time->fk_user;
2808 if (count($contactsoftask) > 0) {
2809 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2810 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
'', 0,
'', $contactsoftask);
2812 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2815 $userstatic->id = $task_time->fk_user;
2816 $userstatic->lastname = $task_time->lastname;
2817 $userstatic->firstname = $task_time->firstname;
2818 $userstatic->photo = $task_time->photo;
2819 $userstatic->status = $task_time->user_status;
2820 print $userstatic->getNomUrl(-1);
2826 if (!empty($arrayfields[
't.note'][
'checked'])) {
2827 print
'<td class="small tdoverflowmax300"">';
2828 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2829 print
'<textarea name="timespent_note_line_2" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2834 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2835 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2839 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2840 print
'<td class="right">';
2841 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2842 print
'<input type="hidden" name="old_duration_2" value="0">';
2843 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2851 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2852 print
'<td class="nowraponall tdoverflowmax125">';
2857 if (!empty($arrayfields[
'value'][
'checked'])) {
2858 print
'<td class="right">';
2859 print
'<span class="amount">';
2861 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2867 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2868 print
'<td class="right">';
2869 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2870 if (isset($task_time->total_ht)) {
2871 print
'<span class="amount">';
2872 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2884 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2885 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2886 print $hookmanager->resPrint;
2890 print
'<td class="center nowraponall">';
2902 if (isset($totalarray[
'totaldurationfield']) || isset($totalarray[
'totalvaluefield'])) {
2903 print
'<tr class="liste_total">';
2905 while ($i < $totalarray[
'nbfield']) {
2908 if ($num < $limit && empty($offset)) {
2909 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2911 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2913 } elseif (isset($totalarray[
'totaldurationfield']) && $totalarray[
'totaldurationfield'] == $i) {
2914 print
'<td class="right">' .
convertSecondToTime($totalarray[
'totalduration'],
'allhourmin') .
'</td>';
2915 } elseif (isset($totalarray[
'totalvaluefield']) && $totalarray[
'totalvaluefield'] == $i) {
2916 print
'<td class="right">' .
price($totalarray[
'totalvalue']) .
'</td>';
2925 if (!count($tasks)) {
2926 $totalnboffields = 1;
2927 foreach ($arrayfields as $value) {
2928 if (!empty($value[
'checked'])) {
2932 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2933 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2937 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2938 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2939 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage invoices.
Class to manage invoice lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
task_prepare_head($object)
Prepare array with list of tabs.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.