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();
424 if ($action ==
'update_extras' && $projectstatic->id > 0) {
425 $permissiontoeditextra = $user->hasRight(
'projet',
'creer');
426 if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[$projectstatic->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
427 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[$projectstatic->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
430 if ($permissiontoeditextra) {
431 $projectstatic->oldcopy =
dol_clone($projectstatic, 2);
433 $attribute_name =
GETPOST(
'attribute',
'aZ09');
436 $ret = $extrafields->setOptionalsFromPost(
null, $projectstatic, $attribute_name);
442 $result = $projectstatic->updateExtraField($attribute_name,
'PROJECT_MODIFY');
451 $action =
'edit_extras';
454} elseif (
GETPOST(
'project_ref',
'alpha')) {
455 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
456 $projectidforalltimes = $projectstatic->id;
460 $result = $projectstatic->fetch(
$object->fk_project);
463$allprojectforuser = 0;
465if ($id <= 0 && $projectidforalltimes == 0) {
466 $allprojectforuser = $user->id;
469if ($action ==
'confirm_generateinvoice' && $user->hasRight(
'facture',
'creer')) {
470 if (!empty($projectstatic->socid)) {
471 $projectstatic->fetch_thirdparty();
474 if (!($projectstatic->thirdparty->id > 0)) {
475 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
477 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
478 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
479 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
481 $tmpinvoice =
new Facture($db);
482 $tmptimespent =
new Task($db);
483 $tmpproduct =
new Product($db);
484 $fuser =
new User($db);
491 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
494 $prodDurationHoursBase = 1.0;
495 $product_data_cache = array();
497 $tmpproduct->fetch($idprod);
503 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
504 if ($prodDurationHoursBase < 0) {
506 $langs->load(
"errors");
510 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
512 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
513 $txtva = $dataforprice[
'tva_tx'];
514 $localtax1 =
get_localtax($txtva, 1, $projectstatic->thirdparty);
515 $localtax2 =
get_localtax($txtva, 2, $projectstatic->thirdparty);
517 $prodDurationHoursBase = 1;
525 $tmpinvoice->socid = $projectstatic->thirdparty->id;
527 $tmpinvoice->fk_project = $projectstatic->id;
528 $tmpinvoice->cond_reglement_id = $condidproject;
529 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
530 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
533 $tmpinvoice->fetch($invoiceToUse);
535 $result = $tmpinvoice->create($user);
543 if ($generateinvoicemode ==
'onelineperuser') {
544 $arrayoftasks = array();
545 foreach ($toselect as $key => $value) {
547 $object->fetchTimeSpent($value);
548 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
549 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
552 foreach ($arrayoftasks as $userid => $data) {
553 $fuser->fetch($userid);
554 $username = $fuser->getFullName($langs);
556 foreach ($data as $fk_product => $timespent_data) {
558 $qtyhour = $timespent_data[
'timespent'] / 3600;
559 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
565 } elseif ($idprod <= 0) {
568 $pu_ht = $fuser->thm;
573 if ($timespent_data[
'timespent']) {
574 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
579 $prodDurationHours = $prodDurationHoursBase;
580 $idprodline = $idprod;
583 $localtax1line = $localtax1;
584 $localtax2line = $localtax2;
587 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
588 if (!array_key_exists($fk_product, $product_data_cache)) {
589 $result = $tmpproduct->fetch($fk_product);
594 $prodDurationHours = $tmpproduct->getProductDurationHours();
595 if ($prodDurationHours < 0) {
597 $langs->load(
"errors");
603 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
605 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
606 $txtvaline = $dataforprice[
'tva_tx'];
607 $localtax1line = $dataforprice[
'localtax1'];
608 $localtax2line = $dataforprice[
'localtax2'];
610 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
612 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
613 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
614 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
615 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
616 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
618 $idprodline = $fk_product;
625 $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);
632 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
633 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
634 $result = $db->query($sql);
642 } elseif ($generateinvoicemode ==
'onelineperperiod') {
643 $arrayoftasks = array();
645 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
646 foreach ($toselect as $key => $value) {
648 $object->fetchTimeSpent($value);
650 $ftask =
new Task($db);
653 $fuser->fetch(
$object->timespent_fk_user);
654 $username = $fuser->getFullName($langs);
656 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
657 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
658 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
661 if (!empty($withdetail)) {
662 if (!empty(
$object->timespent_withhour)) {
669 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
670 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
673 $pu_ht_saved = $pu_ht;
674 foreach ($arrayoftasks as $timespent_id => $value) {
675 $pu_ht = $pu_ht_saved;
676 $userid = $value[
'user'];
680 $qtyhour = $value[
'timespent'] / 3600;
684 if ($value[
'timespent']) {
685 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
690 $prodDurationHours = $prodDurationHoursBase;
691 $idprodline = $idprod;
694 $localtax1line = $localtax1;
695 $localtax2line = $localtax2;
697 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
698 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
699 $result = $tmpproduct->fetch($value[
'fk_product']);
704 $prodDurationHours = $tmpproduct->getProductDurationHours();
705 if ($prodDurationHours < 0) {
707 $langs->load(
"errors");
713 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
715 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
716 $txtvaline = $dataforprice[
'tva_tx'];
717 $localtax1line = $dataforprice[
'localtax1'];
718 $localtax2line = $dataforprice[
'localtax2'];
720 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
722 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
723 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
724 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
725 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
726 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
728 $idprodline = $value[
'fk_product'];
734 $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);
742 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
743 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
744 $result = $db->query($sql);
751 } elseif ($generateinvoicemode ==
'onelinepertask') {
752 $arrayoftasks = array();
753 foreach ($toselect as $key => $value) {
755 $object->fetchTimeSpent($value);
757 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
758 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
761 foreach ($arrayoftasks as $task_id => $data) {
762 $ftask =
new Task($db);
763 $ftask->fetch($task_id);
765 foreach ($data as $fk_product => $timespent_data) {
766 $qtyhour = $timespent_data[
'timespent'] / 3600;
767 $qtyhourtext =
convertSecondToTime($timespent_data[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
770 $prodDurationHours = $prodDurationHoursBase;
771 $idprodline = $idprod;
774 $localtax1line = $localtax1;
775 $localtax2line = $localtax2;
777 if (!empty($fk_product) && $fk_product !== $idprod) {
778 if (!array_key_exists($fk_product, $product_data_cache)) {
779 $result = $tmpproduct->fetch($fk_product);
784 $prodDurationHours = $tmpproduct->getProductDurationHours();
785 if ($prodDurationHours < 0) {
787 $langs->load(
"errors");
793 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
795 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
796 $txtvaline = $dataforprice[
'tva_tx'];
797 $localtax1line = $dataforprice[
'localtax1'];
798 $localtax2line = $dataforprice[
'localtax2'];
800 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
802 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
803 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
804 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
805 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
806 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
808 $idprodline = $fk_product;
812 if ($idprodline > 0) {
814 $pu_ht_for_task = $pu_htline;
817 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
819 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
825 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
827 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
833 $lineName = $ftask->ref .
' - ' . $ftask->label;
834 $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);
843 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
844 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
845 $result = $db->query($sql);
858 $urltoinvoice = $tmpinvoice->getNomUrl(0);
859 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
860 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
870if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
871 $langs->load(
'interventions');
873 if (!empty($projectstatic->socid)) {
874 $projectstatic->fetch_thirdparty();
877 if (!($projectstatic->thirdparty->id > 0)) {
878 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
880 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
881 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
882 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
885 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
887 $tmptimespent =
new Task($db);
888 $fuser =
new User($db);
894 $tmpinter->socid = $projectstatic->thirdparty->id;
896 $tmpinter->fk_project = $projectstatic->id;
897 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->description :
'');
900 $tmpinter->fetch($interToUse);
902 $result = $tmpinter->create($user);
910 $arrayoftasks = array();
911 foreach ($toselect as $key => $value) {
913 $object->fetchTimeSpent($value);
916 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
917 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
918 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
919 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
922 foreach ($arrayoftasks as $timespent_id => $value) {
923 $ftask =
new Task($db);
924 $ftask->fetch($value[
'id']);
926 $qtyhour = $value[
'timespent'] / 3600;
927 $qtyhourtext =
convertSecondToTime($value[
'timespent'],
'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
930 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
935 $timespent->fetch($timespent_id);
936 $timespent->intervention_id = $tmpinter->id;
937 $timespent->intervention_line_id = $lineid;
938 $result = $timespent->update($user);
948 $urltointer = $tmpinter->getNomUrl(0);
949 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
950 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
967$form =
new Form($db);
970$userstatic =
new User($db);
972$arrayofselected = is_array($toselect) ? $toselect : array();
974$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
975if (!empty($withproject)) {
976 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
980llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
983$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
985 $param .=
'&search_user=' . ((int) $search_user);
988 $param .=
'&search_month=' . ((int) $search_month);
991 $param .=
'&search_year=' . ((int) $search_year);
995if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
997 if ($projectidforalltimes > 0) {
998 $result = $projectstatic->fetch($projectidforalltimes);
999 if (!empty($projectstatic->socid)) {
1000 $projectstatic->fetch_thirdparty();
1002 $res = $projectstatic->fetch_optionals();
1003 } elseif (
$object->fetch($id, $ref) > 0) {
1007 $result = $projectstatic->fetch(
$object->fk_project);
1008 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
1009 $projectstatic->fetchComments();
1011 if (!empty($projectstatic->socid)) {
1012 $projectstatic->fetch_thirdparty();
1014 $res = $projectstatic->fetch_optionals();
1016 $object->project = clone $projectstatic;
1019 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
1020 $linktocreatetime =
'';
1022 if ($projectstatic->id > 0) {
1025 if (empty($id) || $tab ==
'timespent') {
1032 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
1036 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1038 $morehtmlref =
'<div class="refidno">';
1040 $morehtmlref .= $projectstatic->title;
1042 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1043 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1045 $morehtmlref .=
'</div>';
1048 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1049 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1050 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1053 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1055 print
'<div class="fichecenter">';
1056 print
'<div class="fichehalfleft">';
1057 print
'<div class="underbanner clearboth"></div>';
1059 print
'<table class="border tableforfield centpercent">';
1063 print
'<tr><td class="tdtop">';
1064 print $langs->trans(
"Usage");
1068 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1069 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1070 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1074 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1075 $htmltext = $langs->trans(
"ProjectFollowTasks");
1076 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1080 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"' :
'')) .
'"> ';
1081 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1082 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1086 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"' :
'')) .
'"> ';
1087 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1088 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1094 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1095 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1096 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency) .
'</span>';
1101 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1103 print($start ? $start :
'?');
1106 print($end ? $end :
'?');
1107 if ($projectstatic->hasDelay()) {
1113 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1114 if ($projectstatic->public) {
1115 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1116 print $langs->trans(
'SharedProject');
1118 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1119 print $langs->trans(
'PrivateProject');
1130 $forcefieldid =
'projectid';
1131 $moreparam =
'&withproject=1';
1132 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1133 unset($forcefieldid, $moreparam);
1139 print
'<div class="fichehalfright">';
1140 print
'<div class="underbanner clearboth"></div>';
1142 print
'<table class="border tableforfield centpercent">';
1146 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1147 print $form->showCategories($projectstatic->id,
'project', 1);
1152 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1153 if ($projectstatic->description) {
1154 print
'<tr><td class="nottitleforfield" colspan="2">';
1155 print
'<div class="longmessagecut">';
1166 print
'<div class="clearboth"></div>';
1174 $linktocreatetimeBtnStatus = 0;
1175 $linktocreatetimeUrl =
'';
1176 $linktocreatetimeHelpText =
'';
1177 if ($user->hasRight(
'projet',
'time')) {
1178 if ($projectstatic->public || $userRead > 0) {
1179 $linktocreatetimeBtnStatus = 1;
1181 if (!empty($projectidforalltimes)) {
1183 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1184 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1187 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1188 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1191 $linktocreatetimeBtnStatus = -2;
1192 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1195 $linktocreatetimeBtnStatus = -2;
1196 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1199 $paramsbutton = array(
'morecss' =>
'reposition');
1200 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1203 $massactionbutton =
'';
1204 $arrayofmassactions = array();
1206 if ($projectstatic->id > 0) {
1208 if ($projectstatic->usage_bill_time) {
1209 $arrayofmassactions = array(
1210 'generateinvoice' => $langs->trans(
"GenerateBill"),
1214 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1215 $langs->load(
"interventions");
1216 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1219 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1220 $arrayofmassactions = array();
1222 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1229 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1231 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1233 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1234 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1236 if ($action ==
'deleteline') {
1237 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1238 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1241 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1242 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1243 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1245 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1251 if (empty($withproject)) {
1252 $morehtmlref .=
'<div class="refidno">';
1253 $morehtmlref .= $langs->trans(
"Project") .
': ';
1254 $morehtmlref .= $projectstatic->getNomUrl(1);
1255 $morehtmlref .=
'<br>';
1258 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1259 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1260 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1262 $morehtmlref .=
'</div>';
1265 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1267 print
'<div class="fichecenter">';
1268 print
'<div class="fichehalfleft">';
1270 print
'<div class="underbanner clearboth"></div>';
1271 print
'<table class="border centpercent tableforfield">';
1274 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1275 if (
$object->fk_task_parent > 0) {
1276 $tasktmp =
new Task($db);
1277 $tasktmp->fetch(
$object->fk_task_parent);
1278 print $tasktmp->getNomUrl(1);
1283 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1285 print($start ? $start :
'?');
1288 print($end ? $end :
'?');
1295 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1296 if (
$object->planned_workload) {
1304 print
'<div class="fichehalfright">';
1306 print
'<div class="underbanner clearboth"></div>';
1307 print
'<table class="border tableforfield centpercent">';
1310 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1315 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1316 if (
$object->planned_workload) {
1317 $tmparray =
$object->getSummaryOfTimeSpent();
1318 if ($tmparray[
'total_duration'] > 0) {
1319 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1324 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1335 print
'<div class="clearboth"></div>';
1339 if ($action ==
'deleteline') {
1340 $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;
1341 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1346 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1347 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1348 if (empty($reshook)) {
1349 $formconfirm .= $hookmanager->resPrint;
1350 } elseif ($reshook > 0) {
1351 $formconfirm = $hookmanager->resPrint;
1355 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1357 $hookmanager->initHooks(array(
'tasktimelist'));
1363 $arrayfields = array();
1364 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1365 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1366 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1367 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1368 if (! empty($allprojectforuser)) {
1369 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1370 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1372 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1373 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1375 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1376 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1377 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1378 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1380 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1381 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1382 $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));
1384 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1389 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1390 $param .=
'&contextpage=' . urlencode($contextpage);
1392 if ($limit > 0 && $limit != $conf->liste_limit) {
1393 $param .=
'&limit='.((int) $limit);
1396 $param .=
'&id='.((int) $id);
1398 if ($search_month > 0) {
1399 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1401 if ($search_year > 0) {
1402 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1404 if (!empty($search_user)) {
1405 $param .=
'&search_user='.urlencode($search_user);
1407 if ($search_task_ref !=
'') {
1408 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1410 if ($search_company !=
'') {
1411 $param .=
'&search_company=' . urlencode($search_company);
1413 if ($search_company_alias !=
'') {
1414 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1416 if ($search_project_ref !=
'') {
1417 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1419 if ($search_project_label !=
'') {
1420 $param .=
'&search_project_label=' . urlencode($search_project_label);
1422 if ($search_task_label !=
'') {
1423 $param .=
'&search_task_label=' . urlencode($search_task_label);
1425 if ($search_note !=
'') {
1426 $param .=
'&search_note=' . urlencode($search_note);
1428 if ($search_duration !=
'') {
1429 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1431 if ($optioncss !=
'') {
1432 $param .=
'&optioncss=' . urlencode($optioncss);
1434 if ($search_date_startday) {
1435 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1437 if ($search_date_startmonth) {
1438 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1440 if ($search_date_startyear) {
1441 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1443 if ($search_date_endday) {
1444 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1446 if ($search_date_endmonth) {
1447 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1449 if ($search_date_endyear) {
1450 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1452 if ($search_timespent_starthour) {
1453 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1455 if ($search_timespent_startmin) {
1456 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1458 if ($search_timespent_endhour) {
1459 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1461 if ($search_timespent_endmin) {
1462 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1465 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1467 $param .=
'&id=' . urlencode((
string) ($id));
1470 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1473 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1476 $parameters = array(
'param' => &$param);
1477 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1478 $param .= $hookmanager->resPrint;
1480 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1481 if ($optioncss !=
'') {
1482 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1484 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1485 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1486 if ($action ==
'editline') {
1487 print
'<input type="hidden" name="action" value="updateline">';
1488 } elseif ($action ==
'splitline') {
1489 print
'<input type="hidden" name="action" value="updatesplitline">';
1490 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1491 print
'<input type="hidden" name="action" value="addtimespent">';
1492 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1493 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1494 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1495 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1497 print
'<input type="hidden" name="action" value="list">';
1499 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1500 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1504 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1505 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1506 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1507 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1508 print
'<input type="hidden" name="page_y" value="">';
1511 if ($massaction ==
'generateinvoice') {
1512 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1513 print
'<table class="noborder centerpercent">';
1515 print
'<td class="titlefield">';
1516 print $langs->trans(
'DateInvoice');
1519 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1525 print $langs->trans(
'Mode');
1529 'onelineperuser' =>
'OneLinePerUser',
1530 'onelinepertask' =>
'OneLinePerTask',
1531 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1533 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1534 print
"\n" .
'<script type="text/javascript">';
1536 $(document).ready(function () {
1537 setDetailVisibility();
1538 $("#generateinvoicemode").change(function() {
1539 setDetailVisibility();
1541 function setDetailVisibility() {
1542 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1543 if (generateinvoicemode=="onelineperperiod") {
1544 $("#detail_time_duration").show();
1546 $("#detail_time_duration").hide();
1551 print
'</script>' .
"\n";
1552 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1559 print $langs->trans(
'ServiceToUseOnLines');
1562 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1567 print
'<td class="titlefield">';
1568 print $langs->trans(
'InvoiceToUse');
1571 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1575 print
'<td class="titlefield">';
1576 print $langs->trans(
"CustomerRelativeDiscount");
1579 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1582 print
'<tr class="newinvoicedetail">';
1583 print
'<td class="titlefield">';
1584 print $langs->trans(
"PaymentConditions");
1587 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1601 print
'<div class="center">';
1602 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1603 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1607 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1608 print
'<div class="center">';
1609 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1613 } elseif ($massaction ==
'generateinter') {
1615 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1617 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1619 print
'<table class="noborder centpercent">';
1621 print
'<td class="titlefield">';
1622 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1626 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1631 print
'<div class="center">';
1632 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1633 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1637 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1638 print
'<div class="center">';
1639 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1646 $parameters = array(
1647 'toselect' => $toselect,
1648 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1651 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1655 print $hookmanager->resPrint;
1663 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1664 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1667 if ($projectstatic->usage_bill_time) {
1668 $arrayfields[
'valuebilled'][
'checked'] = 1;
1671 $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,";
1672 $sql .=
" t.fk_product, t.invoice_line_id,";
1673 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet, pt.billable,";
1674 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1675 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1676 $sql .=
" p.fk_soc,s.name_alias";
1677 if (!empty($extrafields->attributes[
'projet_task'][
'label'])) {
1678 foreach ($extrafields->attributes[
'projet_task'][
'label'] as $key => $val) {
1679 $sql .= ($extrafields->attributes[
'projet_task'][
'type'][$key] !=
'separate' ?
",efpt.".$key.
" as options_".$key :
'');
1683 $parameters = array();
1684 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1685 $sql .= $hookmanager->resPrint;
1686 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1690 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1691 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1692 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1693 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1694 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1695 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"projet_task_extrafields as efpt ON pt.rowid = efpt.fk_object";
1696 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1697 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1698 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1701 $parameters = array();
1702 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1703 $sql .= $hookmanager->resPrint;
1704 $sql .=
" WHERE elementtype = 'task'";
1705 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1706 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1710 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1711 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1713 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1715 $sql .=
" AND t.fk_element =".((int)
$object->id);
1716 } elseif (!empty($projectidforalltimes)) {
1718 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize((
string) $projectidforalltimes) .
")";
1719 } elseif (!empty($allprojectforuser)) {
1721 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1722 $search_user = $user->id;
1724 if ($search_user > 0) {
1725 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1732 if ($search_task_ref) {
1735 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1736 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1738 if ($search_company) {
1741 if ($search_company_alias) {
1745 if ($search_project_ref) {
1748 if ($search_project_label) {
1751 if ($search_task_label) {
1754 if ($search_user > 0) {
1757 if (!empty($search_product_ref)) {
1760 if ($search_valuebilled ==
'1') {
1761 $sql .=
' AND t.invoice_id > 0';
1763 if ($search_valuebilled ==
'0') {
1764 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1767 if ($search_date_start) {
1768 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1770 if ($search_date_end) {
1771 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1774 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1775 if ($search_timespent_starthour || $search_timespent_startmin) {
1776 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1777 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1778 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1781 if ($search_timespent_endhour || $search_timespent_endmin) {
1782 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1783 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1784 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1788 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1791 $extrafieldsobjectkey =
'projet_task';
1792 $extrafieldsobjectprefix =
'efpt.';
1793 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
1796 $parameters = array();
1797 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1798 $sql .= $hookmanager->resPrint;
1801 $nbtotalofrecords =
'';
1804 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1805 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1806 $resql = $db->query($sqlforcount);
1808 $objforcount = $db->fetch_object($resql);
1809 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1814 if (($page * $limit) > (
int) $nbtotalofrecords) {
1822 $sql .= $db->order($sortfield, $sortorder);
1824 $sql .= $db->plimit($limit + 1, $offset);
1827 $resql = $db->query($sql);
1833 $num = $db->num_rows($resql);
1836 if (!empty($projectidforalltimes)) {
1837 print
'<!-- List of time spent for project -->' .
"\n";
1839 $title = $langs->trans(
"ListTaskTimeUserProject");
1841 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1843 print
'<!-- List of time spent -->' .
"\n";
1845 $title = $langs->trans(
"ListTaskTimeForTask");
1847 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1852 $row = $db->fetch_object($resql);
1866 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1867 print
'<!-- table to add time spent -->' .
"\n";
1869 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1872 print
'<div class="div-table-responsive-no-min">';
1873 print
'<table class="noborder nohover centpercent">';
1875 print
'<tr class="liste_titre">';
1876 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1877 if (!empty($allprojectforuser)) {
1878 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1881 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1883 print
'<td>' . $langs->trans(
"By") .
'</td>';
1884 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1885 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1886 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1890 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1891 print
'<td>'.$langs->trans(
"Product").
'</td>';
1895 $parameters = array(
'mode' =>
'create');
1896 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1897 print $hookmanager->resPrint;
1901 print
'<tr class="oddeven nohover">';
1904 print
'<td class="maxwidthonsmartphone">';
1906 print $form->selectDate($newdate,
'time', ($conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1909 if (!empty($allprojectforuser)) {
1918 print
'<td class="maxwidthonsmartphone">';
1919 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1924 print
'<td class="maxwidthonsmartphone nowraponall">';
1925 $contactsofproject = $projectstatic->getListContactId(
'internal');
1926 if (count($contactsofproject) > 0) {
1927 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1928 if (in_array($user->id, $contactsofproject)) {
1929 $userid = $user->id;
1931 $userid = $contactsofproject[0];
1934 if ($projectstatic->public) {
1935 $contactsofproject = array();
1937 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1940 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1947 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1951 print
'<td class="nowraponall">';
1952 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1953 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1954 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1956 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1960 print
'<td class="nowrap">';
1961 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1969 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1970 print
'<td class="nowraponall">';
1972 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);
1978 $parameters = array(
'mode' =>
'create');
1979 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1980 print $hookmanager->resPrint;
1982 print
'<td class="center">';
1983 $form->buttonsSaveCancel();
1984 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1985 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1994 $moreforfilter =
'';
1996 $parameters = array();
1997 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1998 if (empty($reshook)) {
1999 $moreforfilter .= $hookmanager->resPrint;
2001 $moreforfilter = $hookmanager->resPrint;
2004 if (!empty($moreforfilter)) {
2005 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
2006 print $moreforfilter;
2010 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
2011 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
2012 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
2015 if ($projectstatic->usage_bill_time) {
2016 $arrayfields[
'valuebilled'][
'checked'] = 1;
2019 print
'<!-- Liste of time spent -->'.
"\n";
2020 print
'<div class="div-table-responsive">';
2021 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
2025 print
'<tr class="liste_titre_filter">';
2028 print
'<td class="liste_titre center">';
2029 $searchpicto = $form->showFilterButtons(
'left');
2034 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2035 print
'<td class="liste_titre left">';
2036 print
'<div class="nowrapfordate paddingright">';
2037 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
2039 print
'<div class="nowrapfordate">';
2040 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
2045 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2046 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
2050 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2051 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
2054 if (!empty($allprojectforuser)) {
2055 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2056 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2058 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2059 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2063 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2064 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2065 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2067 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2068 print
'<td class="liste_titre"><input type="text" class="flat maxwidth125" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2072 if (!empty($arrayfields[
'author'][
'checked'])) {
2073 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>';
2076 if (!empty($arrayfields[
't.note'][
'checked'])) {
2077 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2080 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2082 print
'<td class="liste_titre right">';
2084 $durationtouse_start =
'';
2085 if ($search_timespent_starthour || $search_timespent_startmin) {
2086 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2088 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
2089 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2092 $durationtouse_end =
'';
2093 if ($search_timespent_endhour || $search_timespent_endmin) {
2094 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2096 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
2097 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2103 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2104 print
'<td class="liste_titre right"></td>';
2107 if (!empty($arrayfields[
'value'][
'checked'])) {
2108 print
'<td class="liste_titre"></td>';
2111 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2112 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2116 $extrafieldsobjectkey =
'projet_task';
2117 $extrafieldsobjectprefix =
'ef.';
2118 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
2120 $parameters = array(
'arrayfields' => $arrayfields);
2121 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2122 print $hookmanager->resPrint;
2125 print
'<td class="liste_titre center">';
2126 $searchpicto = $form->showFilterButtons();
2130 print
'</tr>' .
"\n";
2138 print
'<tr class="liste_titre">';
2140 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2143 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2144 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2147 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2148 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2151 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2153 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2156 if (!empty($allprojectforuser)) {
2157 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2158 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2161 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2162 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2166 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2167 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2168 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2171 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2172 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2176 if (!empty($arrayfields[
'author'][
'checked'])) {
2177 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2180 if (!empty($arrayfields[
't.note'][
'checked'])) {
2181 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2184 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2185 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2188 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2189 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2193 if (!empty($arrayfields[
'value'][
'checked'])) {
2194 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2197 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2198 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2202 $extrafieldsobjectkey =
'projet_task';
2203 $extrafieldsobjectprefix =
'ef.';
2204 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
2206 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2207 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2208 print $hookmanager->resPrint;
2210 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2215 $tasktmp =
new Task($db);
2216 $tmpinvoice =
new Facture($db);
2219 $param .=
'&page='.((int) $page);
2221 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2229 foreach ($tasks as $task_time) {
2235 $invoiced = $task_time->invoice_id ? true :
false;
2237 $date1 = $db->jdate($task_time->element_date);
2238 $date2 = $db->jdate($task_time->element_datehour);
2242 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2246 print
'<td class="center nowraponall">';
2247 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2248 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2250 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2252 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2254 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2255 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2256 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2257 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' :
'').
'">';
2258 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2262 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' :
'') .
'">';
2263 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2267 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' :
'').
'">';
2268 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2271 if ($massactionbutton || $massaction) {
2273 if (in_array($task_time->rowid, $arrayofselected)) {
2279 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2280 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2284 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2285 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2299 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2300 print
'<td class="nowrap">';
2301 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2302 if (empty($task_time->element_date_withhour)) {
2303 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2305 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2308 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2317 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2318 print
'<td class="tdoverflowmax125">';
2319 if ($task_time->fk_soc > 0) {
2320 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2321 $tmpsociete =
new Societe($db);
2322 $tmpsociete->fetch($task_time->fk_soc);
2323 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2325 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2327 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2336 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2338 if ($task_time->fk_soc > 0) {
2339 if (empty($conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2340 $tmpsociete =
new Societe($db);
2341 $tmpsociete->fetch($task_time->fk_soc);
2342 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2344 $tmpsociete = $conf->cache[
'thirdparty'][$task_time->fk_soc];
2346 $valtoshow = $tmpsociete->name_alias;
2348 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2356 if (!empty($allprojectforuser)) {
2358 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2359 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2360 $tmpproject =
new Project($db);
2361 $tmpproject->fetch($task_time->fk_projet);
2362 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2364 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2366 print
'<td class="nowraponall">';
2367 print $tmpproject->getNomUrl(1);
2374 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2375 if (empty($conf->cache[
'project'][$task_time->fk_projet])) {
2376 $tmpproject =
new Project($db);
2377 $tmpproject->fetch($task_time->fk_projet);
2378 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2380 $tmpproject = $conf->cache[
'project'][$task_time->fk_projet];
2382 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2383 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2386 print $tmpproject->getNomUrl(1,
'', -1);
2396 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2397 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2398 print
'<td class="nowrap">';
2399 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2400 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (string) $projectstatic->id,
'');
2402 $tasktmp->id = $task_time->fk_element;
2403 $tasktmp->ref = $task_time->ref;
2404 $tasktmp->label = $task_time->label;
2405 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2412 } elseif ($action !==
'createtime') {
2413 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2417 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2418 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2419 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2420 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2423 $tasktmp->id = $task_time->fk_element;
2424 $tasktmp->ref = $task_time->ref;
2425 $tasktmp->label = $task_time->label;
2426 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2436 if (!empty($arrayfields[
'author'][
'checked'])) {
2437 print
'<td class="tdoverflowmax125">';
2438 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2441 $object->fetch($task_time->fk_element);
2443 $contactsoftask =
$object->getListContactId(
'internal');
2444 if (!in_array($task_time->fk_user, $contactsoftask)) {
2445 $contactsoftask[] = $task_time->fk_user;
2447 if (count($contactsoftask) > 0) {
2448 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2449 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2451 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2454 $userstatic->id = $task_time->fk_user;
2455 $userstatic->lastname = $task_time->lastname;
2456 $userstatic->firstname = $task_time->firstname;
2457 $userstatic->photo = $task_time->photo;
2458 $userstatic->gender = $task_time->gender;
2459 $userstatic->status = $task_time->user_status;
2461 print $userstatic->getNomUrl(-1);
2470 if (!empty($arrayfields[
't.note'][
'checked'])) {
2471 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2472 print
'<td class="small">';
2473 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2476 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2483 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2484 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2488 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2489 print
'<td class="right nowraponall">';
2490 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2491 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2492 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2503 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2504 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2506 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2512 $totalarray[
'totalduration'] = $task_time->element_duration;
2514 $totalarray[
'totalduration'] += $task_time->element_duration;
2519 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2520 print
'<td class="nowraponall">';
2521 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2523 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);
2524 } elseif (!empty($task_time->fk_product)) {
2526 $resultFetch = $product->fetch($task_time->fk_product);
2527 if ($resultFetch < 0) {
2530 print $product->getNomUrl(1);
2540 if (!empty($arrayfields[
'value'][
'checked'])) {
2541 $langs->load(
"salaries");
2542 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2544 print
'<td class="nowraponall right">';
2545 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2546 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2571 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2572 print
'<td class="center">';
2574 if ($projectstatic->usage_bill_time) {
2575 if ($task_time->invoice_id) {
2576 $result = $tmpinvoice->fetch($task_time->invoice_id);
2578 if ($user->hasRight(
'facture',
'lire')) {
2579 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2580 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2582 print $tmpinvoice->getNomUrl(1);
2583 if (!empty($task_time->invoice_line_id)) {
2585 $invoiceLine->fetch($task_time->invoice_line_id);
2586 if (!empty($invoiceLine->id)) {
2587 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2588 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2594 print $langs->trans(
"Yes");
2599 if (intval($task_time->billable) == 1) {
2600 print $langs->trans(
"No");
2602 print $langs->trans(
"Disabled");
2606 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2617 $extrafieldsobjectkey =
'projet_task';
2618 $extrafieldsobjectprefix =
'ef.';
2619 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2622 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2623 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2624 print $hookmanager->resPrint;
2628 print
'<td class="center nowraponall">';
2629 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2630 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2631 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2633 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2634 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2635 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2636 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' :
'').
'">';
2637 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2641 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' :
'') .
'">';
2642 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2646 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' :
'').
'">';
2647 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2650 if ($massactionbutton || $massaction) {
2652 if (in_array($task_time->rowid, $arrayofselected)) {
2658 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2659 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2663 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2664 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2682 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2683 print
'<!-- first line -->';
2684 print
'<tr class="oddeven">';
2692 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2693 print
'<td class="nowrap">';
2694 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2695 if (empty($task_time->element_date_withhour)) {
2696 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2698 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2701 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2707 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2708 print
'<td class="nowrap">';
2713 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2714 print
'<td class="nowrap">';
2719 if (!empty($allprojectforuser)) {
2720 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2721 print
'<td class="nowrap">';
2727 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2728 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2729 print
'<td class="nowrap">';
2730 $tasktmp->id = $task_time->fk_element;
2731 $tasktmp->ref = $task_time->ref;
2732 $tasktmp->label = $task_time->label;
2733 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2739 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2740 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2741 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2748 if (!empty($arrayfields[
'author'][
'checked'])) {
2749 print
'<td class="nowraponall">';
2750 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2752 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2755 $contactsoftask =
$object->getListContactId(
'internal');
2756 if (!in_array($task_time->fk_user, $contactsoftask)) {
2757 $contactsoftask[] = $task_time->fk_user;
2759 if (count($contactsoftask) > 0) {
2760 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2761 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2763 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2766 $userstatic->id = $task_time->fk_user;
2767 $userstatic->lastname = $task_time->lastname;
2768 $userstatic->firstname = $task_time->firstname;
2769 $userstatic->photo = $task_time->photo;
2770 $userstatic->status = $task_time->user_status;
2771 print $userstatic->getNomUrl(-1);
2777 if (!empty($arrayfields[
't.note'][
'checked'])) {
2778 print
'<td class="tdoverflowmax300">';
2779 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2780 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2785 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2786 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2790 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2791 print
'<td class="right">';
2792 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2793 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2794 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2802 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2803 print
'<td class="nowraponall tdoverflowmax125">';
2808 if (!empty($arrayfields[
'value'][
'checked'])) {
2809 print
'<td class="right">';
2810 print
'<span class="amount">';
2811 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2812 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2818 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2819 print
'<td class="right">';
2820 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2821 if (isset($task_time->total_ht)) {
2822 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2829 $extrafieldsobjectkey =
'projet_task';
2830 $extrafieldsobjectprefix =
'ef.';
2831 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2834 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2835 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2836 print $hookmanager->resPrint;
2840 print
'<td class="center nowraponall">';
2849 print
'<!-- second line --><tr class="oddeven">';
2853 print
'<td class="center nowraponall">';
2858 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2859 print
'<td class="nowraponall">';
2860 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2861 if (empty($task_time->element_date_withhour)) {
2862 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2864 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2867 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2873 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2879 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2885 if (!empty($allprojectforuser)) {
2886 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2893 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2894 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2895 print
'<td class="nowraponall">';
2896 $tasktmp->id = $task_time->fk_element;
2897 $tasktmp->ref = $task_time->ref;
2898 $tasktmp->label = $task_time->label;
2899 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2905 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2906 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2907 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2914 if (!empty($arrayfields[
'author'][
'checked'])) {
2915 print
'<td class="nowraponall tdoverflowmax100">';
2916 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2918 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2921 $contactsoftask =
$object->getListContactId(
'internal');
2922 if (!in_array($task_time->fk_user, $contactsoftask)) {
2923 $contactsoftask[] = $task_time->fk_user;
2925 if (count($contactsoftask) > 0) {
2926 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2927 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2929 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2932 $userstatic->id = $task_time->fk_user;
2933 $userstatic->lastname = $task_time->lastname;
2934 $userstatic->firstname = $task_time->firstname;
2935 $userstatic->photo = $task_time->photo;
2936 $userstatic->status = $task_time->user_status;
2937 print $userstatic->getNomUrl(-1);
2943 if (!empty($arrayfields[
't.note'][
'checked'])) {
2944 print
'<td class="small tdoverflowmax300"">';
2945 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2946 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2951 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2952 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2956 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2957 print
'<td class="right">';
2958 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2959 print
'<input type="hidden" name="old_duration_2" value="0">';
2960 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2968 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2969 print
'<td class="nowraponall tdoverflowmax125">';
2974 if (!empty($arrayfields[
'value'][
'checked'])) {
2975 print
'<td class="right">';
2976 print
'<span class="amount nowraponall">';
2978 print
price($value, 1, $langs, 1, -1, -1, $conf->currency);
2985 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2986 print
'<td class="right">';
2987 if (isset($task_time->total_ht)) {
2988 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2989 print
'<span class="amount nowraponall small">';
2990 print
price($valuebilled, 1, $langs, 1, -1, -1, $conf->currency);
2998 $extrafieldsobjectkey =
'projet_task';
2999 $extrafieldsobjectprefix =
'ef.';
3000 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
3003 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
3004 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
3005 print $hookmanager->resPrint;
3009 print
'<td class="center nowraponall">';
3022 print
'<tr class="liste_total">';
3027 if ($num < $limit && empty($offset)) {
3028 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
3030 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
3044 if (!count($tasks)) {
3045 $totalnboffields = 1;
3046 foreach ($arrayfields as $value) {
3047 if (!empty($value[
'checked'])) {
3051 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
3052 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
3056 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
3057 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
3058 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.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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.