36require
'../../main.inc.php';
46@phan-var-force ?string $uploaddir
48require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
49require_once DOL_DOCUMENT_ROOT .
'/projet/class/task.class.php';
50require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
51require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
53require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
56require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
59$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
61 $langsLoad[] =
'eventorganization';
64$langs->loadLangs($langsLoad);
66$action =
GETPOST(
'action',
'aZ09');
67$massaction =
GETPOST(
'massaction',
'alpha');
68$confirm =
GETPOST(
'confirm',
'alpha');
69$cancel =
GETPOST(
'cancel',
'alpha');
70$toselect =
GETPOST(
'toselect',
'array:int');
71$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
72$backtopage =
GETPOST(
'backtopage',
'alpha');
73$optioncss =
GETPOST(
'optioncss',
'alpha');
74$mode =
GETPOST(
'mode',
'alpha');
81$project_ref =
GETPOST(
'project_ref',
'alpha');
87$search_date_startday =
GETPOSTINT(
'search_date_startday');
88$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
89$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
90$search_date_endday =
GETPOSTINT(
'search_date_endday');
91$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
92$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
93$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
94$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
95$search_note =
GETPOST(
'search_note',
'alpha');
96$search_duration =
GETPOST(
'search_duration',
'alpha');
97$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
98$search_task_label =
GETPOST(
'search_task_label',
'alpha');
99$search_user =
GETPOST(
'search_user',
'intcomma');
100$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
101$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
102$search_company =
GETPOST(
'$search_company',
'alpha');
103$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
104$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
105$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
106$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
107$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
108$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
109$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
112$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
113$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
115if (empty($page) || $page == -1) {
118$offset = $limit * $page;
119$pageprev = $page - 1;
120$pagenext = $page + 1;
122 $sortfield =
't.element_date,t.element_datehour,t.rowid';
125 $sortorder =
'DESC,DESC,DESC';
128$childids = $user->getAllChildIds(1);
132$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
136$projectstatic =
new Project($db);
139$extrafields->fetch_name_optionals_label($projectstatic->table_element);
140$extrafields->fetch_name_optionals_label(
$object->table_element);
142$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
145if ($id > 0 || $ref) {
154if (!$user->hasRight(
'projet',
'lire')) {
163 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
164 $search_user = $user->id;
175if (
GETPOST(
'cancel',
'alpha')) {
178if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
182$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
183$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
188include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
191if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
196 $search_duration =
'';
197 $search_date_startday =
'';
198 $search_date_startmonth =
'';
199 $search_date_startyear =
'';
200 $search_date_endday =
'';
201 $search_date_endmonth =
'';
202 $search_date_endyear =
'';
203 $search_date_start =
'';
204 $search_date_end =
'';
205 $search_task_ref =
'';
206 $search_company =
'';
207 $search_company_alias =
'';
208 $search_project_ref =
'';
209 $search_project_label =
'';
210 $search_task_label =
'';
212 $search_valuebilled =
'';
213 $search_product_ref =
'';
215 $search_array_options = array();
216 $search_timespent_starthour =
'';
217 $search_timespent_startmin =
'';
218 $search_timespent_endhour =
'';
219 $search_timespent_endmin =
'';
223if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
224 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
225 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
226 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
227 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
231 $langs->load(
"errors");
232 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
241 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
242 $action =
'createtime';
252 if (empty(
$object->project->status)) {
253 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
254 $action =
'createtime';
265 $object->timespent_withhour = 1;
268 $object->timespent_withhour = 0;
273 $result =
$object->addTimeSpent($user);
284 $action =
'createtime';
288if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
289 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
290 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
301 $object->fetchTimeSpent($lineid);
305 $object->fetch($id_temp, $ref);
307 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
311 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
313 $object->timespent_withhour = 1;
314 } elseif (!empty($timespent_date)) {
315 $object->timespent_date = $timespent_date;
316 $object->timespent_withhour = 0;
319 if (GETPOSTISSET(
"userid_line")) {
327 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
328 $result =
$object->updateTimeSpent($user);
341 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
346 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
349 $object->timespent_withhour = 1;
350 } elseif (!empty($timespent_date)) {
351 $object->timespent_date = $timespent_date;
352 $object->timespent_datehour = $timespent_date;
353 $object->timespent_withhour = 0;
357 if (GETPOSTISSET(
"userid_line")) {
366 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
367 $result =
$object->updateTimeSpent($user);
382if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
385 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
386 $result =
$object->delTimeSpent($user);
389 $langs->load(
"errors");
400if (!empty($project_ref) && !empty($withproject)) {
401 if ($projectstatic->fetch(0, $project_ref) > 0) {
402 $tasksarray =
$object->getTasksArray(
null,
null, $projectstatic->id, $socid, 0);
403 if (count($tasksarray) > 0) {
404 $id = $tasksarray[0]->id;
406 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
413$projectidforalltimes = 0;
415 $projectidforalltimes =
GETPOSTINT(
'projectid');
417 $result = $projectstatic->fetch($projectidforalltimes);
418 if (!empty($projectstatic->socid)) {
419 $projectstatic->fetch_thirdparty();
421 $res = $projectstatic->fetch_optionals();
422} elseif (
GETPOST(
'project_ref',
'alpha')) {
423 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
424 $projectidforalltimes = $projectstatic->id;
428 $result = $projectstatic->fetch(
$object->fk_project);
431$allprojectforuser = 0;
433if ($id <= 0 && $projectidforalltimes == 0) {
434 $allprojectforuser = $user->id;
437if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
438 if (!empty($projectstatic->socid)) {
439 $projectstatic->fetch_thirdparty();
442 if (!($projectstatic->thirdparty->id > 0)) {
443 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
445 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
446 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
447 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
449 $tmpinvoice =
new Facture($db);
450 $tmptimespent =
new Task($db);
451 $tmpproduct =
new Product($db);
452 $fuser =
new User($db);
459 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
462 $prodDurationHoursBase = 1.0;
463 $product_data_cache = array();
465 $tmpproduct->fetch($idprod);
471 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
472 if ($prodDurationHoursBase < 0) {
474 $langs->load(
"errors");
478 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
480 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
481 $txtva = $dataforprice[
'tva_tx'];
482 $localtax1 =
get_localtax($txtva, 1, $projectstatic->thirdparty);
483 $localtax2 =
get_localtax($txtva, 2, $projectstatic->thirdparty);
485 $prodDurationHoursBase = 1;
493 $tmpinvoice->socid = $projectstatic->thirdparty->id;
495 $tmpinvoice->fk_project = $projectstatic->id;
496 $tmpinvoice->cond_reglement_id = $condidproject;
497 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
498 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
501 $tmpinvoice->fetch($invoiceToUse);
503 $result = $tmpinvoice->create($user);
511 if ($generateinvoicemode ==
'onelineperuser') {
512 $arrayoftasks = array();
513 foreach ($toselect as $key => $value) {
515 $object->fetchTimeSpent($value);
516 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
517 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
520 foreach ($arrayoftasks as $userid => $data) {
521 $fuser->fetch($userid);
522 $username = $fuser->getFullName($langs);
524 foreach ($data as $fk_product => $timespent_data) {
526 $qtyhour = $timespent_data[
'timespent'] / 3600;
527 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
533 } elseif ($idprod <= 0) {
536 $pu_ht = $fuser->thm;
541 if ($timespent_data[
'timespent']) {
542 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
547 $prodDurationHours = $prodDurationHoursBase;
548 $idprodline = $idprod;
551 $localtax1line = $localtax1;
552 $localtax2line = $localtax2;
555 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
556 if (!array_key_exists($fk_product, $product_data_cache)) {
557 $result = $tmpproduct->fetch($fk_product);
562 $prodDurationHours = $tmpproduct->getProductDurationHours();
563 if ($prodDurationHours < 0) {
565 $langs->load(
"errors");
569 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
571 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
572 $txtvaline = $dataforprice[
'tva_tx'];
573 $localtax1line = $dataforprice[
'localtax1'];
574 $localtax2line = $dataforprice[
'localtax2'];
576 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
578 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
579 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
580 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
581 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
582 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
584 $idprodline = $fk_product;
591 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice").
' - '.$username .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject,
'',
'', 0, 0, 0,
'HT', 0,
Product::TYPE_SERVICE);
598 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
599 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
600 $result = $db->query($sql);
608 } elseif ($generateinvoicemode ==
'onelineperperiod') {
609 $arrayoftasks = array();
611 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
612 foreach ($toselect as $key => $value) {
614 $object->fetchTimeSpent($value);
616 $ftask =
new Task($db);
619 $fuser->fetch(
$object->timespent_fk_user);
620 $username = $fuser->getFullName($langs);
622 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
623 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
624 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
627 if (!empty($withdetail)) {
628 if (!empty(
$object->timespent_withhour)) {
635 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
636 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
639 $pu_ht_saved = $pu_ht;
640 foreach ($arrayoftasks as $timespent_id => $value) {
641 $pu_ht = $pu_ht_saved;
642 $userid = $value[
'user'];
646 $qtyhour = $value[
'timespent'] / 3600;
650 if ($value[
'timespent']) {
651 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
656 $prodDurationHours = $prodDurationHoursBase;
657 $idprodline = $idprod;
660 $localtax1line = $localtax1;
661 $localtax2line = $localtax2;
663 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
664 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
665 $result = $tmpproduct->fetch($value[
'fk_product']);
670 $prodDurationHours = $tmpproduct->getProductDurationHours();
671 if ($prodDurationHours < 0) {
673 $langs->load(
"errors");
677 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
679 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
680 $txtvaline = $dataforprice[
'tva_tx'];
681 $localtax1line = $dataforprice[
'localtax1'];
682 $localtax2line = $dataforprice[
'localtax2'];
684 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
686 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
687 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
688 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
689 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
690 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
692 $idprodline = $value[
'fk_product'];
698 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject,
'',
'', 0, 0, 0,
'HT', 0,
Product::TYPE_SERVICE);
706 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
707 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
708 $result = $db->query($sql);
715 } elseif ($generateinvoicemode ==
'onelinepertask') {
716 $arrayoftasks = array();
717 foreach ($toselect as $key => $value) {
719 $object->fetchTimeSpent($value);
721 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
722 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
725 foreach ($arrayoftasks as $task_id => $data) {
726 $ftask =
new Task($db);
727 $ftask->fetch($task_id);
729 foreach ($data as $fk_product => $timespent_data) {
730 $qtyhour = $timespent_data[
'timespent'] / 3600;
731 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
734 $prodDurationHours = $prodDurationHoursBase;
735 $idprodline = $idprod;
738 $localtax1line = $localtax1;
739 $localtax2line = $localtax2;
741 if (!empty($fk_product) && $fk_product !== $idprod) {
742 if (!array_key_exists($fk_product, $product_data_cache)) {
743 $result = $tmpproduct->fetch($fk_product);
748 $prodDurationHours = $tmpproduct->getProductDurationHours();
749 if ($prodDurationHours < 0) {
751 $langs->load(
"errors");
755 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
757 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
758 $txtvaline = $dataforprice[
'tva_tx'];
759 $localtax1line = $dataforprice[
'localtax1'];
760 $localtax2line = $dataforprice[
'localtax2'];
762 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
764 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
765 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
766 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
767 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
768 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
770 $idprodline = $fk_product;
774 if ($idprodline > 0) {
776 $pu_ht_for_task = $pu_htline;
779 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
781 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
787 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
789 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
795 $lineName = $ftask->ref .
' - ' . $ftask->label;
796 $lineid = $tmpinvoice->addline($lineName, (
float) $pu_ht_for_task, (
float)
price2num($qtyhour / $prodDurationHours,
'MS'), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), (float) $remiseproject, $date_start, $date_end, 0, 0, 0,
'HT', 0, 1, -1, 0,
'', 0, 0, 0, $pa_ht);
805 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
806 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
807 $result = $db->query($sql);
820 $urltoinvoice = $tmpinvoice->getNomUrl(0);
821 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
822 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
832if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
833 $langs->load(
'interventions');
835 if (!empty($projectstatic->socid)) {
836 $projectstatic->fetch_thirdparty();
839 if (!($projectstatic->thirdparty->id > 0)) {
840 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
842 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
843 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
844 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
847 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
849 $tmptimespent =
new Task($db);
850 $fuser =
new User($db);
856 $tmpinter->socid = $projectstatic->thirdparty->id;
858 $tmpinter->fk_project = $projectstatic->id;
859 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
862 $tmpinter->fetch($interToUse);
864 $result = $tmpinter->create($user);
872 $arrayoftasks = array();
873 foreach ($toselect as $key => $value) {
875 $object->fetchTimeSpent($value);
878 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
879 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
880 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
881 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
884 foreach ($arrayoftasks as $timespent_id => $value) {
885 $ftask =
new Task($db);
886 $ftask->fetch($value[
'id']);
888 $qtyhour = $value[
'timespent'] / 3600;
889 $qtyhourtext =
convertSecondToTime($value[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
892 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
897 $timespent->fetch($timespent_id);
898 $timespent->intervention_id = $tmpinter->id;
899 $timespent->intervention_line_id = $lineid;
900 $result = $timespent->update($user);
910 $urltointer = $tmpinter->getNomUrl(0);
911 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
912 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
929$form =
new Form($db);
932$userstatic =
new User($db);
934$arrayofselected = is_array($toselect) ? $toselect : array();
936$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
937if (!empty($withproject)) {
938 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
942llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
945$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
947 $param .=
'&search_user=' . ((int) $search_user);
950 $param .=
'&search_month=' . ((int) $search_month);
953 $param .=
'&search_year=' . ((int) $search_year);
957if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
959 if ($projectidforalltimes > 0) {
960 $result = $projectstatic->fetch($projectidforalltimes);
961 if (!empty($projectstatic->socid)) {
962 $projectstatic->fetch_thirdparty();
964 $res = $projectstatic->fetch_optionals();
965 } elseif (
$object->fetch($id, $ref) > 0) {
969 $result = $projectstatic->fetch(
$object->fk_project);
970 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
971 $projectstatic->fetchComments();
973 if (!empty($projectstatic->socid)) {
974 $projectstatic->fetch_thirdparty();
976 $res = $projectstatic->fetch_optionals();
978 $object->project = clone $projectstatic;
981 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
982 $linktocreatetime =
'';
984 if ($projectstatic->id > 0) {
987 if (empty($id) || $tab ==
'timespent') {
994 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
998 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1000 $morehtmlref =
'<div class="refidno">';
1002 $morehtmlref .= $projectstatic->title;
1004 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1005 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1007 $morehtmlref .=
'</div>';
1010 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1011 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1012 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1015 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1017 print
'<div class="fichecenter">';
1018 print
'<div class="fichehalfleft">';
1019 print
'<div class="underbanner clearboth"></div>';
1021 print
'<table class="border tableforfield centpercent">';
1025 print
'<tr><td class="tdtop">';
1026 print $langs->trans(
"Usage");
1030 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1031 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1032 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1036 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1037 $htmltext = $langs->trans(
"ProjectFollowTasks");
1038 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1042 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"' :
'')) .
'"> ';
1043 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1044 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1048 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"' :
'')) .
'"> ';
1049 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1050 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1056 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1057 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1058 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency) .
'</span>';
1063 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1065 print($start ? $start :
'?');
1068 print($end ? $end :
'?');
1069 if ($projectstatic->hasDelay()) {
1075 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1076 if ($projectstatic->public) {
1077 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1078 print $langs->trans(
'SharedProject');
1080 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1081 print $langs->trans(
'PrivateProject');
1089 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1095 print
'<div class="fichehalfright">';
1096 print
'<div class="underbanner clearboth"></div>';
1098 print
'<table class="border tableforfield centpercent">';
1102 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1103 print $form->showCategories($projectstatic->id,
'project', 1);
1108 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1109 if ($projectstatic->description) {
1110 print
'<tr><td class="nottitleforfield" colspan="2">';
1111 print
'<div class="longmessagecut">';
1122 print
'<div class="clearboth"></div>';
1130 $linktocreatetimeBtnStatus = 0;
1131 $linktocreatetimeUrl =
'';
1132 $linktocreatetimeHelpText =
'';
1133 if ($user->hasRight(
'projet',
'time')) {
1134 if ($projectstatic->public || $userRead > 0) {
1135 $linktocreatetimeBtnStatus = 1;
1137 if (!empty($projectidforalltimes)) {
1139 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1140 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1143 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1144 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1147 $linktocreatetimeBtnStatus = -2;
1148 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1151 $linktocreatetimeBtnStatus = -2;
1152 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1155 $paramsbutton = array(
'morecss' =>
'reposition');
1156 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1159 $massactionbutton =
'';
1160 $arrayofmassactions = array();
1162 if ($projectstatic->id > 0) {
1164 if ($projectstatic->usage_bill_time) {
1165 $arrayofmassactions = array(
1166 'generateinvoice' => $langs->trans(
"GenerateBill"),
1170 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1171 $langs->load(
"interventions");
1172 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1175 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1176 $arrayofmassactions = array();
1178 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1185 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1187 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1189 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1190 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1192 if ($action ==
'deleteline') {
1193 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1194 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1197 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1198 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1199 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1201 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1207 if (empty($withproject)) {
1208 $morehtmlref .=
'<div class="refidno">';
1209 $morehtmlref .= $langs->trans(
"Project") .
': ';
1210 $morehtmlref .= $projectstatic->getNomUrl(1);
1211 $morehtmlref .=
'<br>';
1214 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1215 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1216 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1218 $morehtmlref .=
'</div>';
1221 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1223 print
'<div class="fichecenter">';
1224 print
'<div class="fichehalfleft">';
1226 print
'<div class="underbanner clearboth"></div>';
1227 print
'<table class="border centpercent tableforfield">';
1230 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1231 if (
$object->fk_task_parent > 0) {
1232 $tasktmp =
new Task($db);
1233 $tasktmp->fetch(
$object->fk_task_parent);
1234 print $tasktmp->getNomUrl(1);
1239 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1241 print($start ? $start :
'?');
1244 print($end ? $end :
'?');
1251 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1252 if (
$object->planned_workload) {
1260 print
'<div class="fichehalfright">';
1262 print
'<div class="underbanner clearboth"></div>';
1263 print
'<table class="border tableforfield centpercent">';
1266 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1271 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1272 if (
$object->planned_workload) {
1273 $tmparray =
$object->getSummaryOfTimeSpent();
1274 if ($tmparray[
'total_duration'] > 0) {
1275 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1280 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1291 print
'<div class="clearboth"></div>';
1295 if ($action ==
'deleteline') {
1296 $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).$param;
1297 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1302 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1303 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1304 if (empty($reshook)) {
1305 $formconfirm .= $hookmanager->resPrint;
1306 } elseif ($reshook > 0) {
1307 $formconfirm = $hookmanager->resPrint;
1311 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1313 $hookmanager->initHooks(array(
'tasktimelist'));
1319 $arrayfields = array();
1320 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1321 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1322 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1323 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1324 if (! empty($allprojectforuser)) {
1325 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1326 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1328 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1329 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1331 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1332 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1333 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1334 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1336 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1337 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1338 $arrayfields[
'valuebilled'] = array(
'label' => $langs->trans(
"Billed"),
'checked' =>
'1',
'enabled' => (
string) (
int) (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1340 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1345 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1346 $param .=
'&contextpage=' . urlencode($contextpage);
1348 if ($limit > 0 && $limit != $conf->liste_limit) {
1349 $param .=
'&limit='.((int) $limit);
1352 $param .=
'&id='.((int) $id);
1354 if ($search_month > 0) {
1355 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1357 if ($search_year > 0) {
1358 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1360 if (!empty($search_user)) {
1361 $param .=
'&search_user='.urlencode($search_user);
1363 if ($search_task_ref !=
'') {
1364 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1366 if ($search_company !=
'') {
1367 $param .=
'&search_company=' . urlencode($search_company);
1369 if ($search_company_alias !=
'') {
1370 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1372 if ($search_project_ref !=
'') {
1373 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1375 if ($search_project_label !=
'') {
1376 $param .=
'&search_project_label=' . urlencode($search_project_label);
1378 if ($search_task_label !=
'') {
1379 $param .=
'&search_task_label=' . urlencode($search_task_label);
1381 if ($search_note !=
'') {
1382 $param .=
'&search_note=' . urlencode($search_note);
1384 if ($search_duration !=
'') {
1385 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1387 if ($optioncss !=
'') {
1388 $param .=
'&optioncss=' . urlencode($optioncss);
1390 if ($search_date_startday) {
1391 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1393 if ($search_date_startmonth) {
1394 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1396 if ($search_date_startyear) {
1397 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1399 if ($search_date_endday) {
1400 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1402 if ($search_date_endmonth) {
1403 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1405 if ($search_date_endyear) {
1406 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1408 if ($search_timespent_starthour) {
1409 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1411 if ($search_timespent_startmin) {
1412 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1414 if ($search_timespent_endhour) {
1415 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1417 if ($search_timespent_endmin) {
1418 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1421 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1423 $param .=
'&id=' . urlencode((
string) ($id));
1426 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1429 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1432 $parameters = array(
'param' => &$param);
1433 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1434 $param .= $hookmanager->resPrint;
1436 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1437 if ($optioncss !=
'') {
1438 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1440 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1441 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1442 if ($action ==
'editline') {
1443 print
'<input type="hidden" name="action" value="updateline">';
1444 } elseif ($action ==
'splitline') {
1445 print
'<input type="hidden" name="action" value="updatesplitline">';
1446 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1447 print
'<input type="hidden" name="action" value="addtimespent">';
1448 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1449 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1450 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1451 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1453 print
'<input type="hidden" name="action" value="list">';
1455 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1456 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1460 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1461 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1462 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1463 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1464 print
'<input type="hidden" name="page_y" value="">';
1467 if ($massaction ==
'generateinvoice') {
1468 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1469 print
'<table class="noborder centerpercent">';
1471 print
'<td class="titlefield">';
1472 print $langs->trans(
'DateInvoice');
1475 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1481 print $langs->trans(
'Mode');
1485 'onelineperuser' =>
'OneLinePerUser',
1486 'onelinepertask' =>
'OneLinePerTask',
1487 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1489 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1490 print
"\n" .
'<script type="text/javascript">';
1492 $(document).ready(function () {
1493 setDetailVisibility();
1494 $("#generateinvoicemode").change(function() {
1495 setDetailVisibility();
1497 function setDetailVisibility() {
1498 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1499 if (generateinvoicemode=="onelineperperiod") {
1500 $("#detail_time_duration").show();
1502 $("#detail_time_duration").hide();
1507 print
'</script>' .
"\n";
1508 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1515 print $langs->trans(
'ServiceToUseOnLines');
1518 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1523 print
'<td class="titlefield">';
1524 print $langs->trans(
'InvoiceToUse');
1527 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1531 print
'<td class="titlefield">';
1532 print $langs->trans(
"CustomerRelativeDiscount");
1535 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1538 print
'<tr class="newinvoicedetail">';
1539 print
'<td class="titlefield">';
1540 print $langs->trans(
"PaymentConditions");
1543 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1557 print
'<div class="center">';
1558 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1559 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1563 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1564 print
'<div class="center">';
1565 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1569 } elseif ($massaction ==
'generateinter') {
1571 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1573 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1575 print
'<table class="noborder centpercent">';
1577 print
'<td class="titlefield">';
1578 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1582 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1587 print
'<div class="center">';
1588 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1589 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1593 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1594 print
'<div class="center">';
1595 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1602 $parameters = array(
1603 'toselect' => $toselect,
1604 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1607 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1611 print $hookmanager->resPrint;
1619 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1620 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1623 if ($projectstatic->usage_bill_time) {
1624 $arrayfields[
'valuebilled'][
'checked'] = 1;
1627 $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,";
1628 $sql .=
" t.fk_product, t.invoice_line_id,";
1629 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet, pt.billable,";
1630 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1631 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1632 $sql .=
" p.fk_soc,s.name_alias";
1633 if (!empty($extrafields->attributes[
'projet_task'][
'label'])) {
1634 foreach ($extrafields->attributes[
'projet_task'][
'label'] as $key => $val) {
1635 $sql .= ($extrafields->attributes[
'projet_task'][
'type'][$key] !=
'separate' ?
",efpt.".$key.
" as options_".$key :
'');
1639 $parameters = array();
1640 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1641 $sql .= $hookmanager->resPrint;
1642 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1646 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1647 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1648 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1649 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1650 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1651 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"projet_task_extrafields as efpt ON pt.rowid = efpt.fk_object";
1652 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1653 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1654 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1657 $parameters = array();
1658 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1659 $sql .= $hookmanager->resPrint;
1660 $sql .=
" WHERE elementtype = 'task'";
1661 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1662 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1666 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1667 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1669 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1671 $sql .=
" AND t.fk_element =".((int)
$object->id);
1672 } elseif (!empty($projectidforalltimes)) {
1674 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize((
string) $projectidforalltimes) .
")";
1675 } elseif (!empty($allprojectforuser)) {
1677 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1678 $search_user = $user->id;
1680 if ($search_user > 0) {
1681 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1688 if ($search_task_ref) {
1691 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1692 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1694 if ($search_company) {
1697 if ($search_company_alias) {
1701 if ($search_project_ref) {
1704 if ($search_project_label) {
1707 if ($search_task_label) {
1710 if ($search_user > 0) {
1713 if (!empty($search_product_ref)) {
1716 if ($search_valuebilled ==
'1') {
1717 $sql .=
' AND t.invoice_id > 0';
1719 if ($search_valuebilled ==
'0') {
1720 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1723 if ($search_date_start) {
1724 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1726 if ($search_date_end) {
1727 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1730 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1731 if ($search_timespent_starthour || $search_timespent_startmin) {
1732 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1733 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1734 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1737 if ($search_timespent_endhour || $search_timespent_endmin) {
1738 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1739 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1740 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1744 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1747 $extrafieldsobjectkey =
'projet_task';
1748 $extrafieldsobjectprefix =
'efpt.';
1749 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
1752 $parameters = array();
1753 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1754 $sql .= $hookmanager->resPrint;
1757 $nbtotalofrecords =
'';
1760 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1761 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1762 $resql = $db->query($sqlforcount);
1764 $objforcount = $db->fetch_object($resql);
1765 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1770 if (($page * $limit) > (
int) $nbtotalofrecords) {
1778 $sql .= $db->order($sortfield, $sortorder);
1780 $sql .= $db->plimit($limit + 1, $offset);
1783 $resql = $db->query($sql);
1789 $num = $db->num_rows($resql);
1792 if (!empty($projectidforalltimes)) {
1793 print
'<!-- List of time spent for project -->' .
"\n";
1795 $title = $langs->trans(
"ListTaskTimeUserProject");
1797 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1799 print
'<!-- List of time spent -->' .
"\n";
1801 $title = $langs->trans(
"ListTaskTimeForTask");
1803 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1808 $row = $db->fetch_object($resql);
1822 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1823 print
'<!-- table to add time spent -->' .
"\n";
1825 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1828 print
'<div class="div-table-responsive-no-min">';
1829 print
'<table class="noborder nohover centpercent">';
1831 print
'<tr class="liste_titre">';
1832 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1833 if (!empty($allprojectforuser)) {
1834 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1837 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1839 print
'<td>' . $langs->trans(
"By") .
'</td>';
1840 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1841 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1842 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1846 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1847 print
'<td>'.$langs->trans(
"Product").
'</td>';
1851 $parameters = array(
'mode' =>
'create');
1852 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1853 print $hookmanager->resPrint;
1857 print
'<tr class="oddeven nohover">';
1860 print
'<td class="maxwidthonsmartphone">';
1862 print $form->selectDate($newdate,
'time', ($conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1865 if (!empty($allprojectforuser)) {
1874 print
'<td class="maxwidthonsmartphone">';
1875 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1880 print
'<td class="maxwidthonsmartphone nowraponall">';
1881 $contactsofproject = $projectstatic->getListContactId(
'internal');
1882 if (count($contactsofproject) > 0) {
1883 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1884 if (in_array($user->id, $contactsofproject)) {
1885 $userid = $user->id;
1887 $userid = $contactsofproject[0];
1890 if ($projectstatic->public) {
1891 $contactsofproject = array();
1893 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1896 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1903 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1907 print
'<td class="nowraponall">';
1908 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1909 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1910 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1912 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1916 print
'<td class="nowrap">';
1917 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1925 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1926 print
'<td class="nowraponall">';
1928 print $form->select_produits((GETPOSTISSET(
'fk_product') ?
GETPOSTINT(
"fk_product") :
''),
'fk_product', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth150', ($user->hasRight(
'produit',
'lire') ? 0 : 1),
'', null, 1);
1934 $parameters = array(
'mode' =>
'create');
1935 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1936 print $hookmanager->resPrint;
1938 print
'<td class="center">';
1939 $form->buttonsSaveCancel();
1940 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1941 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1950 $moreforfilter =
'';
1952 $parameters = array();
1953 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1954 if (empty($reshook)) {
1955 $moreforfilter .= $hookmanager->resPrint;
1957 $moreforfilter = $hookmanager->resPrint;
1960 if (!empty($moreforfilter)) {
1961 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1962 print $moreforfilter;
1966 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1967 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1968 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1971 if ($projectstatic->usage_bill_time) {
1972 $arrayfields[
'valuebilled'][
'checked'] = 1;
1975 print
'<!-- Liste of time spent -->'.
"\n";
1976 print
'<div class="div-table-responsive">';
1977 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1981 print
'<tr class="liste_titre_filter">';
1984 print
'<td class="liste_titre center">';
1985 $searchpicto = $form->showFilterButtons(
'left');
1990 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1991 print
'<td class="liste_titre left">';
1992 print
'<div class="nowrapfordate paddingright">';
1993 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1995 print
'<div class="nowrapfordate">';
1996 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
2001 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2002 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
2006 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2007 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
2010 if (!empty($allprojectforuser)) {
2011 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2012 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2014 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2015 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2019 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2020 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2021 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2023 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2024 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2028 if (!empty($arrayfields[
'author'][
'checked'])) {
2029 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>';
2032 if (!empty($arrayfields[
't.note'][
'checked'])) {
2033 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2036 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2038 print
'<td class="liste_titre right">';
2040 $durationtouse_start =
'';
2041 if ($search_timespent_starthour || $search_timespent_startmin) {
2042 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2044 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
2045 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2048 $durationtouse_end =
'';
2049 if ($search_timespent_endhour || $search_timespent_endmin) {
2050 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2052 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2053 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2059 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2060 print
'<td class="liste_titre right"></td>';
2063 if (!empty($arrayfields[
'value'][
'checked'])) {
2064 print
'<td class="liste_titre"></td>';
2067 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2068 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2072 $extrafieldsobjectkey =
'projet_task';
2073 $extrafieldsobjectprefix =
'ef.';
2074 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
2076 $parameters = array(
'arrayfields' => $arrayfields);
2077 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2078 print $hookmanager->resPrint;
2081 print
'<td class="liste_titre center">';
2082 $searchpicto = $form->showFilterButtons();
2086 print
'</tr>' .
"\n";
2094 print
'<tr class="liste_titre">';
2096 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2099 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2100 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2103 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2104 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2107 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2109 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2112 if (!empty($allprojectforuser)) {
2113 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2114 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2117 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2118 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2122 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2123 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2124 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2127 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2128 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2132 if (!empty($arrayfields[
'author'][
'checked'])) {
2133 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2136 if (!empty($arrayfields[
't.note'][
'checked'])) {
2137 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2140 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2141 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2144 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2145 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2149 if (!empty($arrayfields[
'value'][
'checked'])) {
2150 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2153 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2154 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2158 $extrafieldsobjectkey =
'projet_task';
2159 $extrafieldsobjectprefix =
'ef.';
2160 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
2162 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2163 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2164 print $hookmanager->resPrint;
2166 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2171 $tasktmp =
new Task($db);
2172 $tmpinvoice =
new Facture($db);
2175 $param .=
'&page='.((int) $page);
2177 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2185 foreach ($tasks as $task_time) {
2191 $invoiced = $task_time->invoice_id ? true :
false;
2193 $date1 = $db->jdate($task_time->element_date);
2194 $date2 = $db->jdate($task_time->element_datehour);
2198 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2202 print
'<td class="center nowraponall">';
2203 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2204 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2206 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2208 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2210 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2211 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2212 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2213 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' :
'').
'">';
2214 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2218 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' :
'') .
'">';
2219 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2223 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' :
'').
'">';
2224 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2227 if ($massactionbutton || $massaction) {
2229 if (in_array($task_time->rowid, $arrayofselected)) {
2235 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2236 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2240 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2241 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2255 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2256 print
'<td class="nowrap">';
2257 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2258 if (empty($task_time->element_date_withhour)) {
2259 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2261 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2264 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2273 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2274 print
'<td class="tdoverflowmax125">';
2275 if ($task_time->fk_soc > 0) {
2276 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2277 $tmpsociete =
new Societe($db);
2278 $tmpsociete->fetch($task_time->fk_soc);
2279 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2281 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2283 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2292 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2294 if ($task_time->fk_soc > 0) {
2295 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2296 $tmpsociete =
new Societe($db);
2297 $tmpsociete->fetch($task_time->fk_soc);
2298 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2300 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2302 $valtoshow = $tmpsociete->name_alias;
2304 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2312 if (!empty($allprojectforuser)) {
2314 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2315 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2316 $tmpproject =
new Project($db);
2317 $tmpproject->fetch($task_time->fk_projet);
2318 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2320 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2322 print
'<td class="nowraponall">';
2323 print $tmpproject->getNomUrl(1);
2330 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2331 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2332 $tmpproject =
new Project($db);
2333 $tmpproject->fetch($task_time->fk_projet);
2334 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2336 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2338 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2339 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2342 print $tmpproject->getNomUrl(1,
'', -1);
2352 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2353 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2354 print
'<td class="nowrap">';
2355 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2356 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (string) $projectstatic->id,
'');
2358 $tasktmp->id = $task_time->fk_element;
2359 $tasktmp->ref = $task_time->ref;
2360 $tasktmp->label = $task_time->label;
2361 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2368 } elseif ($action !==
'createtime') {
2369 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2373 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2374 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2375 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2376 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2379 $tasktmp->id = $task_time->fk_element;
2380 $tasktmp->ref = $task_time->ref;
2381 $tasktmp->label = $task_time->label;
2382 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2392 if (!empty($arrayfields[
'author'][
'checked'])) {
2393 print
'<td class="tdoverflowmax125">';
2394 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2397 $object->fetch($task_time->fk_element);
2399 $contactsoftask =
$object->getListContactId(
'internal');
2400 if (!in_array($task_time->fk_user, $contactsoftask)) {
2401 $contactsoftask[] = $task_time->fk_user;
2403 if (count($contactsoftask) > 0) {
2404 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2405 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2407 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2410 $userstatic->id = $task_time->fk_user;
2411 $userstatic->lastname = $task_time->lastname;
2412 $userstatic->firstname = $task_time->firstname;
2413 $userstatic->photo = $task_time->photo;
2414 $userstatic->gender = $task_time->gender;
2415 $userstatic->status = $task_time->user_status;
2417 print $userstatic->getNomUrl(-1);
2426 if (!empty($arrayfields[
't.note'][
'checked'])) {
2427 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2428 print
'<td class="small">';
2429 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2432 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2439 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2440 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2444 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2445 print
'<td class="right nowraponall">';
2446 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2447 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2448 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2459 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2460 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2462 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2468 $totalarray[
'totalduration'] = $task_time->element_duration;
2470 $totalarray[
'totalduration'] += $task_time->element_duration;
2475 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2476 print
'<td class="nowraponall">';
2477 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2479 print $form->select_produits($task_time->fk_product,
'fk_product', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500', ($user->hasRight(
'produit',
'lire') ? 0 : 1),
'', null, 1);
2480 } elseif (!empty($task_time->fk_product)) {
2482 $resultFetch = $product->fetch($task_time->fk_product);
2483 if ($resultFetch < 0) {
2486 print $product->getNomUrl(1);
2496 if (!empty($arrayfields[
'value'][
'checked'])) {
2497 $langs->load(
"salaries");
2498 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2500 print
'<td class="nowraponall right">';
2501 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2502 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2527 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2528 print
'<td class="center">';
2530 if ($projectstatic->usage_bill_time) {
2531 if ($task_time->invoice_id) {
2532 $result = $tmpinvoice->fetch($task_time->invoice_id);
2534 if ($user->hasRight(
'facture',
'lire')) {
2535 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2536 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2538 print $tmpinvoice->getNomUrl(1);
2539 if (!empty($task_time->invoice_line_id)) {
2541 $invoiceLine->fetch($task_time->invoice_line_id);
2542 if (!empty($invoiceLine->id)) {
2543 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2544 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2550 print $langs->trans(
"Yes");
2555 if (intval($task_time->billable) == 1) {
2556 print $langs->trans(
"No");
2558 print $langs->trans(
"Disabled");
2562 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2573 $extrafieldsobjectkey =
'projet_task';
2574 $extrafieldsobjectprefix =
'ef.';
2575 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2578 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2579 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2580 print $hookmanager->resPrint;
2584 print
'<td class="center nowraponall">';
2585 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2586 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2587 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2589 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2590 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2591 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2592 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' :
'').
'">';
2593 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2597 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' :
'') .
'">';
2598 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2602 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' :
'').
'">';
2603 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2606 if ($massactionbutton || $massaction) {
2608 if (in_array($task_time->rowid, $arrayofselected)) {
2614 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2615 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2619 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2620 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2638 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2639 print
'<!-- first line -->';
2640 print
'<tr class="oddeven">';
2648 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2649 print
'<td class="nowrap">';
2650 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2651 if (empty($task_time->element_date_withhour)) {
2652 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2654 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2657 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2663 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2664 print
'<td class="nowrap">';
2669 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2670 print
'<td class="nowrap">';
2675 if (!empty($allprojectforuser)) {
2676 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2677 print
'<td class="nowrap">';
2683 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2684 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2685 print
'<td class="nowrap">';
2686 $tasktmp->id = $task_time->fk_element;
2687 $tasktmp->ref = $task_time->ref;
2688 $tasktmp->label = $task_time->label;
2689 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2695 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2696 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2697 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2704 if (!empty($arrayfields[
'author'][
'checked'])) {
2705 print
'<td class="nowraponall">';
2706 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2708 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2711 $contactsoftask =
$object->getListContactId(
'internal');
2712 if (!in_array($task_time->fk_user, $contactsoftask)) {
2713 $contactsoftask[] = $task_time->fk_user;
2715 if (count($contactsoftask) > 0) {
2716 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2717 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2719 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2722 $userstatic->id = $task_time->fk_user;
2723 $userstatic->lastname = $task_time->lastname;
2724 $userstatic->firstname = $task_time->firstname;
2725 $userstatic->photo = $task_time->photo;
2726 $userstatic->status = $task_time->user_status;
2727 print $userstatic->getNomUrl(-1);
2733 if (!empty($arrayfields[
't.note'][
'checked'])) {
2734 print
'<td class="tdoverflowmax300">';
2735 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2736 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2741 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2742 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2746 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2747 print
'<td class="right">';
2748 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2749 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2750 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2758 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2759 print
'<td class="nowraponall tdoverflowmax125">';
2764 if (!empty($arrayfields[
'value'][
'checked'])) {
2765 print
'<td class="right">';
2766 print
'<span class="amount">';
2767 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2768 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2774 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2775 print
'<td class="right">';
2776 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2777 if (isset($task_time->total_ht)) {
2778 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2785 $extrafieldsobjectkey =
'projet_task';
2786 $extrafieldsobjectprefix =
'ef.';
2787 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2790 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2791 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2792 print $hookmanager->resPrint;
2796 print
'<td class="center nowraponall">';
2805 print
'<!-- second line --><tr class="oddeven">';
2809 print
'<td class="center nowraponall">';
2814 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2815 print
'<td class="nowraponall">';
2816 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2817 if (empty($task_time->element_date_withhour)) {
2818 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2820 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2823 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2829 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2835 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2841 if (!empty($allprojectforuser)) {
2842 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2849 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2850 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2851 print
'<td class="nowraponall">';
2852 $tasktmp->id = $task_time->fk_element;
2853 $tasktmp->ref = $task_time->ref;
2854 $tasktmp->label = $task_time->label;
2855 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2861 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2862 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2863 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2870 if (!empty($arrayfields[
'author'][
'checked'])) {
2871 print
'<td class="nowraponall tdoverflowmax100">';
2872 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2874 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2877 $contactsoftask =
$object->getListContactId(
'internal');
2878 if (!in_array($task_time->fk_user, $contactsoftask)) {
2879 $contactsoftask[] = $task_time->fk_user;
2881 if (count($contactsoftask) > 0) {
2882 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2883 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2885 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2888 $userstatic->id = $task_time->fk_user;
2889 $userstatic->lastname = $task_time->lastname;
2890 $userstatic->firstname = $task_time->firstname;
2891 $userstatic->photo = $task_time->photo;
2892 $userstatic->status = $task_time->user_status;
2893 print $userstatic->getNomUrl(-1);
2899 if (!empty($arrayfields[
't.note'][
'checked'])) {
2900 print
'<td class="small tdoverflowmax300"">';
2901 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2902 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2907 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2908 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2912 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2913 print
'<td class="right">';
2914 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2915 print
'<input type="hidden" name="old_duration_2" value="0">';
2916 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2924 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2925 print
'<td class="nowraponall tdoverflowmax125">';
2930 if (!empty($arrayfields[
'value'][
'checked'])) {
2931 print
'<td class="right">';
2932 print
'<span class="amount nowraponall">';
2934 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2941 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2942 print
'<td class="right">';
2943 if (isset($task_time->total_ht)) {
2944 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2945 print
'<span class="amount nowraponall small">';
2946 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2954 $extrafieldsobjectkey =
'projet_task';
2955 $extrafieldsobjectprefix =
'ef.';
2956 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2959 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2960 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2961 print $hookmanager->resPrint;
2965 print
'<td class="center nowraponall">';
2978 print
'<tr class="liste_total">';
2983 if ($num < $limit && empty($offset)) {
2984 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2986 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
3000 if (!count($tasks)) {
3001 $totalnboffields = 1;
3002 foreach ($arrayfields as $value) {
3003 if (!empty($value[
'checked'])) {
3007 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
3008 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
3012 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
3013 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
3014 print $hookmanager->resPrint;
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage invoices.
Class to manage invoice lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
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.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
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.
isModEnabled($module)
Is Dolibarr module enabled.
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...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
task_prepare_head($object)
Prepare array with list of tabs.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.