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'));
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;
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;
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';
491 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
494 $prodDurationHoursBase = 1.0;
495 $product_data_cache = array();
497 $result = $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 if (!array_key_exists(
$object->timespent_fk_user, $arrayoftasks)) {
549 $arrayoftasks[
$object->timespent_fk_user] = [
550 (int)
$object->timespent_fk_product => [
'timespent' => 0,
'totalvaluetodivideby3600' => 0]
553 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
554 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
557 foreach ($arrayoftasks as $userid => $data) {
558 $fuser->fetch($userid);
559 $username = $fuser->getFullName($langs);
561 foreach ($data as $fk_product => $timespent_data) {
563 $qtyhour = $timespent_data[
'timespent'] / 3600;
570 } elseif ($idprod <= 0) {
573 $pu_ht = $fuser->thm;
578 if ($timespent_data[
'timespent']) {
579 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
584 $prodDurationHours = $prodDurationHoursBase;
585 $idprodline = $idprod;
588 $localtax1line = $localtax1;
589 $localtax2line = $localtax2;
592 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
593 if (!array_key_exists($fk_product, $product_data_cache)) {
594 $result = $tmpproduct->fetch($fk_product);
599 $prodDurationHours = $tmpproduct->getProductDurationHours();
600 if ($prodDurationHours < 0) {
602 $langs->load(
"errors");
608 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
610 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
611 $txtvaline = $dataforprice[
'tva_tx'];
612 $localtax1line = $dataforprice[
'localtax1'];
613 $localtax2line = $dataforprice[
'localtax2'];
615 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
617 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
618 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
619 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
620 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
621 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
623 $idprodline = $fk_product;
630 $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);
637 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
638 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
639 $result =
$db->query($sql);
647 } elseif ($generateinvoicemode ==
'onelineperperiod') {
648 $arrayoftasks = array();
650 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
651 foreach ($toselect as $key => $value) {
653 $object->fetchTimeSpent($value);
658 $fuser->fetch(
$object->timespent_fk_user);
659 $username = $fuser->getFullName($langs);
661 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
662 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
663 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
666 if (!empty($withdetail)) {
667 if (!empty(
$object->timespent_withhour)) {
674 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
675 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
678 $pu_ht_saved = $pu_ht;
679 foreach ($arrayoftasks as $timespent_id => $value) {
680 $pu_ht = $pu_ht_saved;
681 $userid = $value[
'user'];
685 $qtyhour = $value[
'timespent'] / 3600;
689 if ($value[
'timespent']) {
690 $pu_ht =
price2num(($value[
'totalvaluetodivideby3600'] / $value[
'timespent']),
'MU');
695 $prodDurationHours = $prodDurationHoursBase;
696 $idprodline = $idprod;
699 $localtax1line = $localtax1;
700 $localtax2line = $localtax2;
702 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
703 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
704 $result = $tmpproduct->fetch($value[
'fk_product']);
709 $prodDurationHours = $tmpproduct->getProductDurationHours();
710 if ($prodDurationHours < 0) {
712 $langs->load(
"errors");
718 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
720 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
721 $txtvaline = $dataforprice[
'tva_tx'];
722 $localtax1line = $dataforprice[
'localtax1'];
723 $localtax2line = $dataforprice[
'localtax2'];
725 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
727 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
728 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
729 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
730 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
731 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
733 $idprodline = $value[
'fk_product'];
739 $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);
747 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
748 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
749 $result =
$db->query($sql);
756 } elseif ($generateinvoicemode ==
'onelinepertask') {
757 $arrayoftasks = array();
758 foreach ($toselect as $key => $value) {
760 $object->fetchTimeSpent($value);
762 if (!isset($arrayoftasks[
$object->id][(
int)
$object->timespent_fk_product])) {
763 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product] = array(
'timespent' => 0,
'totalvaluetodivideby3600' => 0,
'ids' => array());
765 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
766 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
769 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'ids'][] = (
int) $value;
772 foreach ($arrayoftasks as $task_id => $data) {
774 $ftask->fetch($task_id);
776 foreach ($data as $fk_product => $timespent_data) {
777 $qtyhour = $timespent_data[
'timespent'] / 3600;
781 $prodDurationHours = $prodDurationHoursBase;
782 $idprodline = $idprod;
785 $localtax1line = $localtax1;
786 $localtax2line = $localtax2;
788 if (!empty($fk_product) && $fk_product !== $idprod) {
789 if (!array_key_exists($fk_product, $product_data_cache)) {
790 $result = $tmpproduct->fetch($fk_product);
795 $prodDurationHours = $tmpproduct->getProductDurationHours();
796 if ($prodDurationHours < 0) {
798 $langs->load(
"errors");
804 $dataforprice = $tmpproduct->getSellPrice(
$mysoc, $projectstatic->thirdparty, 0);
806 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
807 $txtvaline = $dataforprice[
'tva_tx'];
808 $localtax1line = $dataforprice[
'localtax1'];
809 $localtax2line = $dataforprice[
'localtax2'];
811 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
813 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
814 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
815 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
816 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
817 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
819 $idprodline = $fk_product;
823 if ($idprodline > 0) {
825 $pu_ht_for_task = $pu_htline;
828 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
830 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
836 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
838 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
844 $lineName = $ftask->ref .
' - ' . $ftask->label;
845 $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);
854 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
855 $sql .=
' WHERE rowid IN (' .
$db->sanitize(implode(
',', $timespent_data[
'ids'])) .
')';
856 $result =
$db->query($sql);
869 $urltoinvoice = $tmpinvoice->getNomUrl(0);
870 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
871 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
881if ($action ==
'confirm_generateinter' && $user->hasRight(
'fichinter',
'creer')) {
882 $langs->load(
'interventions');
884 if (!empty($projectstatic->socid)) {
885 $projectstatic->fetch_thirdparty();
888 if (!($projectstatic->thirdparty->id > 0)) {
889 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
891 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
892 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
893 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
896 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
905 $tmpinter->socid = $projectstatic->thirdparty->id;
907 $tmpinter->fk_project = $projectstatic->id;
908 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->description :
'');
911 $tmpinter->fetch($interToUse);
913 $result = $tmpinter->create($user);
921 $arrayoftasks = array();
922 foreach ($toselect as $key => $value) {
924 $object->fetchTimeSpent($value);
927 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
928 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
929 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
930 $arrayoftasks[
$object->timespent_id][
'date'] =
$object->timespent_datehour;
933 foreach ($arrayoftasks as $timespent_id => $value) {
935 $ftask->fetch($value[
'id']);
937 $qtyhour = $value[
'timespent'] / 3600;
941 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), (int) $value[
'date'], $value[
'timespent']);
946 $timespent->fetch($timespent_id);
947 $timespent->intervention_id = $tmpinter->id;
948 $timespent->intervention_line_id = $lineid;
949 $result = $timespent->update($user);
959 $urltointer = $tmpinter->getNomUrl(0);
960 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
961 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
983$arrayofselected = is_array($toselect) ? $toselect : array();
985$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
986if (!empty($withproject)) {
987 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
991llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
994$param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
996 $param .=
'&search_user=' . ((int) $search_user);
999 $param .=
'&search_month=' . ((int) $search_month);
1002 $param .=
'&search_year=' . ((int) $search_year);
1006if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
1008 if ($projectidforalltimes > 0) {
1009 $result = $projectstatic->fetch($projectidforalltimes);
1010 if (!empty($projectstatic->socid)) {
1011 $projectstatic->fetch_thirdparty();
1013 $res = $projectstatic->fetch_optionals();
1014 } elseif (
$object->fetch($id, $ref) > 0) {
1018 $result = $projectstatic->fetch(
$object->fk_project);
1019 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
1020 $projectstatic->fetchComments();
1022 if (!empty($projectstatic->socid)) {
1023 $projectstatic->fetch_thirdparty();
1025 $res = $projectstatic->fetch_optionals();
1027 $object->project = clone $projectstatic;
1030 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
1031 $linktocreatetime =
'';
1033 if ($projectstatic->id > 0) {
1036 if (empty($id) || $tab ==
'timespent') {
1043 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
1047 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1049 $morehtmlref =
'<div class="refidno">';
1051 $morehtmlref .= $projectstatic->title;
1053 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
1054 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
1056 $morehtmlref .=
'</div>';
1059 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1060 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
1061 $projectstatic->next_prev_filter =
"rowid:IN:" .
$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1064 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1066 print
'<div class="fichecenter">';
1067 print
'<div class="fichehalfleft">';
1068 print
'<div class="underbanner clearboth"></div>';
1070 print
'<table class="border tableforfield centpercent">';
1074 print
'<tr><td class="tdtop">';
1075 print $langs->trans(
"Usage");
1079 print
'<input type="checkbox" disabled name="usage_opportunity"' . (
GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
1080 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1081 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1085 print
'<input type="checkbox" disabled name="usage_task"' . (
GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
1086 $htmltext = $langs->trans(
"ProjectFollowTasks");
1087 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1091 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"' :
'')) .
'"> ';
1092 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1093 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1097 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"' :
'')) .
'"> ';
1098 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1099 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1105 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1106 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1107 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1112 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1114 print($start ? $start :
'?');
1117 print($end ? $end :
'?');
1118 if ($projectstatic->hasDelay()) {
1124 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1125 if ($projectstatic->public) {
1126 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1127 print $langs->trans(
'SharedProject');
1129 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1130 print $langs->trans(
'PrivateProject');
1141 $forcefieldid =
'projectid';
1142 $moreparam =
'&withproject=1';
1143 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1144 unset($forcefieldid, $moreparam);
1150 print
'<div class="fichehalfright">';
1151 print
'<div class="underbanner clearboth"></div>';
1153 print
'<table class="border tableforfield centpercent">';
1157 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1158 print $form->showCategories($projectstatic->id,
'project', 1);
1163 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1164 if ($projectstatic->description) {
1165 print
'<tr><td class="nottitleforfield" colspan="2">';
1166 print
'<div class="longmessagecut">';
1177 print
'<div class="clearboth"></div>';
1185 $linktocreatetimeBtnStatus = 0;
1186 $linktocreatetimeUrl =
'';
1187 $linktocreatetimeHelpText =
'';
1188 if ($user->hasRight(
'projet',
'time')) {
1189 if ($projectstatic->public || $userRead > 0) {
1190 $linktocreatetimeBtnStatus = 1;
1192 if (!empty($projectidforalltimes)) {
1194 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1195 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1198 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1199 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1202 $linktocreatetimeBtnStatus = -2;
1203 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1206 $linktocreatetimeBtnStatus = -2;
1207 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1210 $paramsbutton = array(
'morecss' =>
'reposition');
1211 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1214 $massactionbutton =
'';
1215 $arrayofmassactions = array();
1217 if ($projectstatic->id > 0) {
1219 if ($projectstatic->usage_bill_time) {
1220 $arrayofmassactions = array(
1221 'generateinvoice' => $langs->trans(
"GenerateBill"),
1225 if (
isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1226 $langs->load(
"interventions");
1227 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1230 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1231 $arrayofmassactions = array();
1233 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1240 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1242 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1244 $param = (
GETPOST(
'withproject') ?
'&withproject=1' :
'');
1245 $linkback =
GETPOST(
'withproject') ?
'<a href="'.DOL_URL_ROOT.
'/projet/tasks.php?id='.$projectstatic->id.
'">'.$langs->trans(
"BackToList").
'</a>' :
'';
1247 if ($action ==
'deleteline') {
1248 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . $param;
1249 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1252 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1253 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1254 $object->next_prev_filter =
"fk_projet:IN:" .
$db->sanitize($projectsListId);
1256 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1262 if (empty($withproject)) {
1263 $morehtmlref .=
'<div class="refidno">';
1264 $morehtmlref .= $langs->trans(
"Project") .
': ';
1265 $morehtmlref .= $projectstatic->getNomUrl(1);
1266 $morehtmlref .=
'<br>';
1269 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1270 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1271 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1273 $morehtmlref .=
'</div>';
1276 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1278 print
'<div class="fichecenter">';
1279 print
'<div class="fichehalfleft">';
1281 print
'<div class="underbanner clearboth"></div>';
1282 print
'<table class="border centpercent tableforfield">';
1285 print
'<tr><td>' . $langs->trans(
"ParentTask") .
'</td><td>';
1286 if (
$object->fk_task_parent > 0) {
1288 $tasktmp->fetch(
$object->fk_task_parent);
1289 print $tasktmp->getNomUrl(1);
1294 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1296 print($start ? $start :
'?');
1299 print($end ? $end :
'?');
1306 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1307 if (
$object->planned_workload) {
1315 print
'<div class="fichehalfright">';
1317 print
'<div class="underbanner clearboth"></div>';
1318 print
'<table class="border tableforfield centpercent">';
1321 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1326 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1327 if (
$object->planned_workload) {
1328 $tmparray =
$object->getSummaryOfTimeSpent();
1329 if ($tmparray[
'total_duration'] > 0) {
1330 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1335 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1346 print
'<div class="clearboth"></div>';
1350 if ($action ==
'deleteline') {
1351 $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;
1352 $formconfirm .= $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1357 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1358 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1359 if (empty($reshook)) {
1360 $formconfirm .= $hookmanager->resPrint;
1361 } elseif ($reshook > 0) {
1362 $formconfirm = $hookmanager->resPrint;
1366 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1368 $hookmanager->initHooks(array(
'tasktimelist'));
1374 $arrayfields = array();
1375 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' =>
'1');
1376 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' =>
'1');
1377 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1378 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1379 if (! empty($allprojectforuser)) {
1380 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' =>
'1'];
1381 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' =>
'1'];
1383 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' =>
'1');
1384 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' =>
'1');
1386 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' =>
'1');
1387 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' =>
'1');
1388 $arrayfields[
't.tms'] = array(
'label' => $langs->trans(
"DateModification"),
'checked' =>
'0');
1389 if (
isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1390 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'1');
1392 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' =>
'1');
1393 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' =>
'0',
'enabled' => (
string) (
int) (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1394 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' =>
'1',
'enabled' => (
string) (
int)
isModEnabled(
"salaries"));
1395 $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));
1397 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1402 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1403 $param .=
'&contextpage=' . urlencode($contextpage);
1405 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1406 $param .=
'&limit='.((int) $limit);
1409 $param .=
'&id='.((int) $id);
1411 if ($search_month > 0) {
1412 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1414 if ($search_year > 0) {
1415 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1417 if (!empty($search_user)) {
1418 $param .=
'&search_user='.urlencode($search_user);
1420 if ($search_task_ref !=
'') {
1421 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1423 if ($search_company !=
'') {
1424 $param .=
'&search_company=' . urlencode($search_company);
1426 if ($search_company_alias !=
'') {
1427 $param .=
'&search_company_alias=' . urlencode($search_company_alias);
1429 if ($search_project_ref !=
'') {
1430 $param .=
'&search_project_ref=' . urlencode($search_project_ref);
1432 if ($search_project_label !=
'') {
1433 $param .=
'&search_project_label=' . urlencode($search_project_label);
1435 if ($search_task_label !=
'') {
1436 $param .=
'&search_task_label=' . urlencode($search_task_label);
1438 if ($search_note !=
'') {
1439 $param .=
'&search_note=' . urlencode($search_note);
1441 if ($search_duration !=
'') {
1442 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1444 if ($optioncss !=
'') {
1445 $param .=
'&optioncss=' . urlencode($optioncss);
1447 if ($search_date_startday) {
1448 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1450 if ($search_date_startmonth) {
1451 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1453 if ($search_date_startyear) {
1454 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1456 if ($search_date_endday) {
1457 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1459 if ($search_date_endmonth) {
1460 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1462 if ($search_date_endyear) {
1463 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1465 if ($search_timespent_starthour) {
1466 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1468 if ($search_timespent_startmin) {
1469 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1471 if ($search_timespent_endhour) {
1472 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1474 if ($search_timespent_endmin) {
1475 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1478 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
1480 $param .=
'&id=' . urlencode((
string) ($id));
1483 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1486 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1489 $parameters = array(
'param' => &$param);
1490 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1491 $param .= $hookmanager->resPrint;
1493 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1494 if ($optioncss !=
'') {
1495 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1497 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1498 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1499 if ($action ==
'editline') {
1500 print
'<input type="hidden" name="action" value="updateline">';
1501 } elseif ($action ==
'splitline') {
1502 print
'<input type="hidden" name="action" value="updatesplitline">';
1503 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1504 print
'<input type="hidden" name="action" value="addtimespent">';
1505 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1506 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1507 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1508 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1510 print
'<input type="hidden" name="action" value="list">';
1512 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1513 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1517 print
'<input type="hidden" name="id" value="' . ((int) $id) .
'">';
1518 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1519 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1520 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1521 print
'<input type="hidden" name="page_y" value="">';
1524 if ($massaction ==
'generateinvoice') {
1525 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1526 print
'<table class="noborder centerpercent">';
1528 print
'<td class="titlefield">';
1529 print $langs->trans(
'DateInvoice');
1532 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1538 print $langs->trans(
'Mode');
1542 'onelineperuser' =>
'OneLinePerUser',
1543 'onelinepertask' =>
'OneLinePerTask',
1544 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1546 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1547 print
"\n" .
'<script type="text/javascript">';
1549 $(document).ready(function () {
1550 setDetailVisibility();
1551 $("#generateinvoicemode").change(function() {
1552 setDetailVisibility();
1554 function setDetailVisibility() {
1555 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1556 if (generateinvoicemode=="onelineperperiod") {
1557 $("#detail_time_duration").show();
1559 $("#detail_time_duration").hide();
1564 print
'</script>' .
"\n";
1565 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1572 print $langs->trans(
'ServiceToUseOnLines');
1575 $form->select_produits(0,
'productid', 1, 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1580 print
'<td class="titlefield">';
1581 print $langs->trans(
'InvoiceToUse');
1584 print $form->selectInvoiceForTimeProject($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1588 print
'<td class="titlefield">';
1589 print $langs->trans(
"CustomerRelativeDiscount");
1592 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1595 print
'<tr class="newinvoicedetail">';
1596 print
'<td class="titlefield">';
1597 print $langs->trans(
"PaymentConditions");
1600 print $form->getSelectConditionsPaiements((
int) $projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1614 print
'<div class="center">';
1615 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1616 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1620 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1621 print
'<div class="center">';
1622 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1626 } elseif ($massaction ==
'generateinter') {
1628 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1630 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1632 print
'<table class="noborder centpercent">';
1634 print
'<td class="titlefield">';
1635 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1639 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1644 print
'<div class="center">';
1645 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1646 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1650 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1651 print
'<div class="center">';
1652 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1659 $parameters = array(
1660 'toselect' => $toselect,
1661 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1664 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1668 print $hookmanager->resPrint;
1676 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1677 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
1680 if ($projectstatic->usage_bill_time) {
1681 $arrayfields[
'valuebilled'][
'checked'] = 1;
1684 $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,";
1685 $sql .=
" t.fk_product, t.invoice_line_id, t.import_key, t.datec, t.tms,";
1686 $sql .=
" pt.rowid as taskid, pt.ref, pt.label, pt.fk_projet, pt.billable,";
1687 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1688 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1689 $sql .=
" p.fk_soc, s.name_alias";
1690 if (!empty($extrafields->attributes[
'projet_task'][
'label'])) {
1691 foreach ($extrafields->attributes[
'projet_task'][
'label'] as $key => $val) {
1692 $sql .= ($extrafields->attributes[
'projet_task'][
'type'][$key] !=
'separate' ?
",efpt.".$key.
" as options_".$key :
'');
1696 $parameters = array();
1697 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1698 $sql .= $hookmanager->resPrint;
1699 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1703 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1704 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1705 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1706 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1707 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1708 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"projet_task_extrafields as efpt ON pt.rowid = efpt.fk_object";
1709 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1710 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1711 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1714 $parameters = array();
1715 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1716 $sql .= $hookmanager->resPrint;
1717 $sql .=
" WHERE elementtype = 'task'";
1718 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1719 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1723 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1724 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1726 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1728 $sql .=
" AND t.fk_element =".((int)
$object->id);
1729 } elseif (!empty($projectidforalltimes)) {
1731 $sql .=
" AND pt.fk_projet IN (" .
$db->sanitize((
string) $projectidforalltimes) .
")";
1732 } elseif (!empty($allprojectforuser)) {
1734 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1735 $search_user = $user->id;
1737 if ($search_user > 0) {
1738 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1745 if ($search_task_ref) {
1748 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1749 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1751 if ($search_company) {
1754 if ($search_company_alias) {
1758 if ($search_project_ref) {
1761 if ($search_project_label) {
1764 if ($search_task_label) {
1767 if ($search_user > 0) {
1770 if (!empty($search_product_ref)) {
1773 if ($search_valuebilled ==
'1') {
1774 $sql .=
' AND t.invoice_id > 0';
1776 if ($search_valuebilled ==
'0') {
1777 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1780 if ($search_date_start) {
1781 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1783 if ($search_date_end) {
1784 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1787 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1788 if ($search_timespent_starthour || $search_timespent_startmin) {
1789 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1790 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1791 $sql .=
" AND t.element_duration >= " . ((int) $timespent_duration_start);
1794 if ($search_timespent_endhour || $search_timespent_endmin) {
1795 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1796 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1797 $sql .=
" AND t.element_duration <= " . ((int) $timespent_duration_end);
1801 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1804 $extrafieldsobjectkey =
'projet_task';
1805 $extrafieldsobjectprefix =
'efpt.';
1806 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
1809 $parameters = array();
1810 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1811 $sql .= $hookmanager->resPrint;
1814 $nbtotalofrecords =
'';
1817 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1818 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1819 $resql =
$db->query($sqlforcount);
1821 $objforcount =
$db->fetch_object($resql);
1822 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1827 if (($page * $limit) > (
int) $nbtotalofrecords) {
1835 $sql .=
$db->order($sortfield, $sortorder);
1837 $sql .=
$db->plimit($limit + 1, $offset);
1840 $resql =
$db->query($sql);
1846 $num =
$db->num_rows($resql);
1849 if (!empty($projectidforalltimes)) {
1850 print
'<!-- List of time spent for project -->' .
"\n";
1852 $title = $langs->trans(
"ListTaskTimeUserProject");
1854 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1856 print
'<!-- List of time spent -->' .
"\n";
1858 $title = $langs->trans(
"ListTaskTimeForTask");
1860 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1865 $obj =
$db->fetch_object($resql);
1879 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1880 print
'<!-- table to add time spent -->' .
"\n";
1882 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1885 print
'<div class="div-table-responsive-no-min">';
1886 print
'<table class="noborder nohover centpercent">';
1888 print
'<tr class="liste_titre">';
1889 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1890 if (!empty($allprojectforuser)) {
1891 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1894 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1896 print
'<td>' . $langs->trans(
"By") .
'</td>';
1897 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1898 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1899 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1903 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1904 print
'<td>'.$langs->trans(
"Product").
'</td>';
1908 $parameters = array(
'mode' =>
'create');
1909 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1910 print $hookmanager->resPrint;
1914 print
'<tr class="oddeven nohover">';
1917 print
'<td class="maxwidthonsmartphone">';
1919 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1922 if (!empty($allprojectforuser)) {
1931 print
'<td class="maxwidthonsmartphone">';
1932 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth300', (
string) $projectstatic->id,
'progress');
1937 print
'<td class="maxwidthonsmartphone nowraponall">';
1938 $contactsofproject = $projectstatic->getListContactId(
'internal');
1939 if (count($contactsofproject) > 0) {
1940 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1941 if (in_array($user->id, $contactsofproject)) {
1942 $userid = $user->id;
1944 $userid = $contactsofproject[0];
1947 if ($projectstatic->public) {
1948 $contactsofproject = array();
1950 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0, null, 0,
'', $contactsofproject,
'0', 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1953 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1960 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1964 print
'<td class="nowraponall">';
1965 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1967 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1969 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1973 print
'<td class="nowrap">';
1974 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1982 if (
isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1983 print
'<td class="nowraponall">';
1985 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);
1991 $parameters = array(
'mode' =>
'create');
1992 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1993 print $hookmanager->resPrint;
1995 print
'<td class="center">';
1996 $form->buttonsSaveCancel();
1997 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1998 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
2007 $moreforfilter =
'';
2009 $parameters = array();
2010 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
2011 if (empty($reshook)) {
2012 $moreforfilter .= $hookmanager->resPrint;
2014 $moreforfilter = $hookmanager->resPrint;
2017 if (!empty($moreforfilter)) {
2018 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
2019 print $moreforfilter;
2023 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
2024 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
$conf->main_checkbox_left_column);
2025 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
2028 if ($projectstatic->usage_bill_time) {
2029 $arrayfields[
'valuebilled'][
'checked'] = 1;
2032 print
'<!-- Liste of time spent -->'.
"\n";
2033 print
'<div class="div-table-responsive">';
2034 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
2038 print
'<tr class="liste_titre_filter">';
2040 if (
$conf->main_checkbox_left_column) {
2041 print
'<td class="liste_titre center">';
2042 $searchpicto = $form->showFilterButtons(
'left');
2047 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2048 print
'<td class="liste_titre left">';
2049 print
'<div class="nowrapfordate paddingright">';
2050 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
2052 print
'<div class="nowrapfordate">';
2053 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
2058 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2059 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
2063 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2064 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
2067 if (!empty($allprojectforuser)) {
2068 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2069 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
2071 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2072 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
2076 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2077 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2078 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
2080 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2081 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
2085 if (!empty($arrayfields[
'author'][
'checked'])) {
2086 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>';
2089 if (!empty($arrayfields[
't.note'][
'checked'])) {
2090 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
2093 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2094 print
'<td class="liste_titre"></td>';
2097 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2099 print
'<td class="liste_titre right">';
2101 $durationtouse_start =
'';
2102 if ($search_timespent_starthour || $search_timespent_startmin) {
2103 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
2105 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'fromhour') .
'</span> ';
2106 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
2109 $durationtouse_end =
'';
2110 if ($search_timespent_endhour || $search_timespent_endmin) {
2111 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
2113 print
'<div class="nowraponall"><span class="opacitymedium">' . $langs->trans(
'tohour') .
'</span> ';
2114 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
2120 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2121 print
'<td class="liste_titre"></td>';
2124 if (!empty($arrayfields[
'value'][
'checked'])) {
2125 print
'<td class="liste_titre"></td>';
2128 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2129 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2133 $extrafieldsobjectkey =
'projet_task';
2134 $extrafieldsobjectprefix =
'ef.';
2135 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
2137 $parameters = array(
'arrayfields' => $arrayfields);
2138 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2139 print $hookmanager->resPrint;
2141 if (!
$conf->main_checkbox_left_column) {
2142 print
'<td class="liste_titre center">';
2143 $searchpicto = $form->showFilterButtons();
2147 print
'</tr>' .
"\n";
2155 print
'<tr class="liste_titre">';
2156 if (
$conf->main_checkbox_left_column) {
2157 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2160 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2161 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2164 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2165 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2168 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2170 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2173 if (!empty($allprojectforuser)) {
2174 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2175 print_liste_field_titre($arrayfields[
'p.project_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
2178 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2179 print_liste_field_titre($arrayfields[
'p.project_label'][
'label'], $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2183 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2184 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2185 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2188 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2189 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2193 if (!empty($arrayfields[
'author'][
'checked'])) {
2194 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2197 if (!empty($arrayfields[
't.note'][
'checked'])) {
2198 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2201 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2202 print_liste_field_titre($arrayfields[
't.tms'][
'label'], $_SERVER[
'PHP_SELF'],
't.tms',
'', $param,
'', $sortfield, $sortorder);
2205 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2206 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2209 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2210 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2214 if (!empty($arrayfields[
'value'][
'checked'])) {
2215 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2218 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2219 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2223 $extrafieldsobjectkey =
'projet_task';
2224 $extrafieldsobjectprefix =
'ef.';
2225 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
2227 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2228 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2229 print $hookmanager->resPrint;
2230 if (!
$conf->main_checkbox_left_column) {
2231 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'', $param,
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2240 $param .=
'&page='.((int) $page);
2242 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2250 foreach ($tasks as $task_time) {
2256 $invoiced = $task_time->invoice_id ? true :
false;
2258 $date1 =
$db->jdate($task_time->element_date);
2259 $date2 =
$db->jdate($task_time->element_datehour);
2263 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2266 if (
$conf->main_checkbox_left_column) {
2267 print
'<td class="center nowraponall">';
2268 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2269 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2271 print
'<input type="hidden" name="id" value="' .
$id .
'">';
2273 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2275 print
'<input type="submit" class="button buttongen reposition smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2276 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2277 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2278 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' :
'').
'">';
2279 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2283 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' :
'') .
'">';
2284 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2288 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' :
'').
'">';
2289 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2292 if ($massactionbutton || $massaction) {
2294 if (in_array($task_time->rowid, $arrayofselected)) {
2300 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2301 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2305 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2306 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2320 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2321 print
'<td class="nowrap">';
2322 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2323 if (empty($task_time->element_date_withhour)) {
2324 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2326 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2329 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2338 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2339 print
'<td class="tdoverflowmax125">';
2340 if ($task_time->fk_soc > 0) {
2341 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2343 $tmpsociete->fetch($task_time->fk_soc);
2344 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2346 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2348 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2357 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2359 if ($task_time->fk_soc > 0) {
2360 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2362 $tmpsociete->fetch($task_time->fk_soc);
2363 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2365 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2367 $valtoshow = $tmpsociete->name_alias;
2369 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2377 if (!empty($allprojectforuser)) {
2379 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2380 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2382 $tmpproject->fetch($task_time->fk_projet);
2383 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2385 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2387 print
'<td class="nowraponall">';
2388 print $tmpproject->getNomUrl(1);
2395 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2396 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2398 $tmpproject->fetch($task_time->fk_projet);
2399 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2401 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2403 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($tmpproject->title).
'">';
2404 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2407 print $tmpproject->getNomUrl(1,
'', -1);
2417 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2418 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2419 print
'<td class="nowrap">';
2420 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2421 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0,
'1', 1, 0, 0,
'maxwidth250', (
string) $projectstatic->id,
'');
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');
2433 } elseif ($action !==
'createtime') {
2434 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2438 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2439 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2440 print
'<td class="tdoverflowmax250" title="'.dolPrintHTMLForAttribute($task_time->label).
'">';
2441 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2444 $tasktmp->id = $task_time->fk_element;
2445 $tasktmp->ref = $task_time->ref;
2446 $tasktmp->label = $task_time->label;
2447 print $tasktmp->getNomUrl(1,
'withproject',
'time', -1);
2457 if (!empty($arrayfields[
'author'][
'checked'])) {
2458 print
'<td class="tdoverflowmax125">';
2459 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2462 $object->fetch($task_time->fk_element);
2464 $contactsoftask =
$object->getListContactId(
'internal');
2465 if (!in_array($task_time->fk_user, $contactsoftask)) {
2466 $contactsoftask[] = $task_time->fk_user;
2468 if (count($contactsoftask) > 0) {
2469 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2470 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2472 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2475 $userstatic->id = $task_time->fk_user;
2476 $userstatic->lastname = $task_time->lastname;
2477 $userstatic->firstname = $task_time->firstname;
2478 $userstatic->photo = $task_time->photo;
2479 $userstatic->gender = $task_time->gender;
2480 $userstatic->status = $task_time->user_status;
2482 print $userstatic->getNomUrl(-1);
2491 if (!empty($arrayfields[
't.note'][
'checked'])) {
2492 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2493 print
'<td class="small">';
2494 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2497 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2504 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2505 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2509 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2510 print
'<td class="nowraponall">';
2519 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2520 print
'<td class="right nowraponall">';
2521 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2522 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2523 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2534 if (empty(
$totalarray[
'val'][
't.element_duration'])) {
2535 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2537 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2543 $totalarray[
'totalduration'] = $task_time->element_duration;
2545 $totalarray[
'totalduration'] += $task_time->element_duration;
2550 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2551 print
'<td class="nowraponall">';
2552 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2554 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);
2555 } elseif (!empty($task_time->fk_product)) {
2557 $resultFetch = $product->fetch($task_time->fk_product);
2558 if ($resultFetch < 0) {
2561 print $product->getNomUrl(1);
2571 if (!empty($arrayfields[
'value'][
'checked'])) {
2572 $langs->load(
"salaries");
2573 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2575 print
'<td class="nowraponall right">';
2576 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2577 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2602 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2603 print
'<td class="center">';
2605 if ($projectstatic->usage_bill_time) {
2606 if ($task_time->invoice_id) {
2607 $result = $tmpinvoice->fetch($task_time->invoice_id);
2609 if ($user->hasRight(
'facture',
'lire')) {
2610 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2611 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2613 print $tmpinvoice->getNomUrl(1);
2614 if (!empty($task_time->invoice_line_id)) {
2616 $invoiceLine->fetch($task_time->invoice_line_id);
2617 if (!empty($invoiceLine->id)) {
2618 print
'<br><span class="small opacitymedium">'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2619 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2625 print $langs->trans(
"Yes");
2630 if (intval($task_time->billable) == 1) {
2631 print $langs->trans(
"No");
2633 print $langs->trans(
"Disabled");
2637 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2648 $extrafieldsobjectkey =
'projet_task';
2649 $extrafieldsobjectprefix =
'ef.';
2650 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2653 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &
$totalarray);
2654 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2655 print $hookmanager->resPrint;
2658 if (!
$conf->main_checkbox_left_column) {
2659 print
'<td class="center nowraponall">';
2660 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2661 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2662 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2664 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2665 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2666 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2667 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' :
'').
'">';
2668 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2672 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' :
'') .
'">';
2673 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2677 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' :
'').
'">';
2678 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2681 if ($massactionbutton || $massaction) {
2683 if (in_array($task_time->rowid, $arrayofselected)) {
2689 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2690 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2694 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2695 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2713 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2714 print
'<!-- first line -->';
2715 print
'<tr class="oddeven">';
2718 if (
$conf->main_checkbox_left_column) {
2723 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2724 print
'<td class="nowrap">';
2725 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2726 if (empty($task_time->element_date_withhour)) {
2727 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2729 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2732 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2738 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2739 print
'<td class="nowrap">';
2744 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2745 print
'<td class="nowrap">';
2750 if (!empty($allprojectforuser)) {
2751 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2752 print
'<td class="nowrap">';
2758 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2759 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2760 print
'<td class="nowrap">';
2761 $tasktmp->id = $task_time->fk_element;
2762 $tasktmp->ref = $task_time->ref;
2763 $tasktmp->label = $task_time->label;
2764 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2770 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2771 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2772 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2779 if (!empty($arrayfields[
'author'][
'checked'])) {
2780 print
'<td class="nowraponall">';
2781 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2783 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2786 $contactsoftask =
$object->getListContactId(
'internal');
2787 if (!in_array($task_time->fk_user, $contactsoftask)) {
2788 $contactsoftask[] = $task_time->fk_user;
2790 if (count($contactsoftask) > 0) {
2791 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2792 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask);
2794 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2797 $userstatic->id = $task_time->fk_user;
2798 $userstatic->lastname = $task_time->lastname;
2799 $userstatic->firstname = $task_time->firstname;
2800 $userstatic->photo = $task_time->photo;
2801 $userstatic->status = $task_time->user_status;
2802 print $userstatic->getNomUrl(-1);
2808 if (!empty($arrayfields[
't.note'][
'checked'])) {
2809 print
'<td class="tdoverflowmax300">';
2810 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2811 print
'<textarea name="timespent_note_line" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2816 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2817 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2821 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2822 print
'<td class="nowraponall">';
2827 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2828 print
'<td class="right">';
2829 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2830 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2831 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2839 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2840 print
'<td class="nowraponall tdoverflowmax125">';
2845 if (!empty($arrayfields[
'value'][
'checked'])) {
2846 print
'<td class="right">';
2847 print
'<span class="amount">';
2848 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2849 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2855 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2856 print
'<td class="right">';
2857 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2858 if (isset($task_time->total_ht)) {
2859 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2866 $extrafieldsobjectkey =
'projet_task';
2867 $extrafieldsobjectprefix =
'ef.';
2868 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
2871 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2872 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2873 print $hookmanager->resPrint;
2876 if (!
$conf->main_checkbox_left_column) {
2877 print
'<td class="center nowraponall">';
2886 print
'<!-- second line --><tr class="oddeven">';
2889 if (
$conf->main_checkbox_left_column) {
2890 print
'<td class="center nowraponall">';
2895 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2896 print
'<td class="nowraponall">';
2897 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2898 if (empty($task_time->element_date_withhour)) {
2899 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2901 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2904 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2910 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2916 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2922 if (!empty($allprojectforuser)) {
2923 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2930 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2931 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2932 print
'<td class="nowraponall">';
2933 $tasktmp->id = $task_time->fk_element;
2934 $tasktmp->ref = $task_time->ref;
2935 $tasktmp->label = $task_time->label;
2936 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2942 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2943 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2944 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($task_time->label).
'">';
2951 if (!empty($arrayfields[
'author'][
'checked'])) {
2952 print
'<td class="nowraponall tdoverflowmax100">';
2953 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2955 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2958 $contactsoftask =
$object->getListContactId(
'internal');
2959 if (!in_array($task_time->fk_user, $contactsoftask)) {
2960 $contactsoftask[] = $task_time->fk_user;
2962 if (count($contactsoftask) > 0) {
2963 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2964 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
null, 0,
'', $contactsoftask);
2966 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2969 $userstatic->id = $task_time->fk_user;
2970 $userstatic->lastname = $task_time->lastname;
2971 $userstatic->firstname = $task_time->firstname;
2972 $userstatic->photo = $task_time->photo;
2973 $userstatic->status = $task_time->user_status;
2974 print $userstatic->getNomUrl(-1);
2980 if (!empty($arrayfields[
't.note'][
'checked'])) {
2981 print
'<td class="small tdoverflowmax300"">';
2982 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2983 print
'<textarea name="timespent_note_line_2" class="centpercentimp" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2988 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2989 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2993 if (!empty($arrayfields[
't.tms'][
'checked'])) {
2994 print
'<td class="nowraponall">';
3000 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
3001 print
'<td class="right">';
3002 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
3003 print
'<input type="hidden" name="old_duration_2" value="0">';
3004 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
3012 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
3013 print
'<td class="nowraponall tdoverflowmax125">';
3018 if (!empty($arrayfields[
'value'][
'checked'])) {
3019 print
'<td class="right">';
3020 print
'<span class="amount nowraponall">';
3022 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
3029 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
3030 print
'<td class="right">';
3031 if (isset($task_time->total_ht)) {
3032 $valuebilled =
price2num($task_time->total_ht,
'', 1);
3033 print
'<span class="amount nowraponall small">';
3034 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
3042 $extrafieldsobjectkey =
'projet_task';
3043 $extrafieldsobjectprefix =
'ef.';
3044 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
3047 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
3048 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
3049 print $hookmanager->resPrint;
3052 if (!
$conf->main_checkbox_left_column) {
3053 print
'<td class="center nowraponall">';
3066 print
'<tr class="liste_total">';
3071 if ($num < $limit && empty($offset)) {
3072 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
3074 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
3088 if (!count($tasks)) {
3089 $totalnboffields = 1;
3090 foreach ($arrayfields as $value) {
3091 if (!empty($value[
'checked'])) {
3095 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
3096 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
3100 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
3101 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
3102 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.
$date_start
Variables from include:
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.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
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.
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'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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, $nodie=0, $mode='')
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.