35require
'../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
37require_once DOL_DOCUMENT_ROOT .
'/projet/class/task.class.php';
38require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
39require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
40require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
41require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
43require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formintervention.class.php';
55$langsLoad = array(
'projects',
'bills',
'orders',
'companies');
56if (isModEnabled(
'eventorganization')) {
57 $langsLoad[] =
'eventorganization';
60$langs->loadLangs($langsLoad);
62$action =
GETPOST(
'action',
'alpha');
63$massaction =
GETPOST(
'massaction',
'alpha');
64$confirm =
GETPOST(
'confirm',
'alpha');
65$cancel =
GETPOST(
'cancel',
'alpha');
66$toselect =
GETPOST(
'toselect',
'array');
67$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'timespentlist';
68$backtopage =
GETPOST(
'backtopage',
'alpha');
69$optioncss =
GETPOST(
'optioncss',
'alpha');
70$mode =
GETPOST(
'mode',
'alpha');
76$project_ref =
GETPOST(
'project_ref',
'alpha');
82$search_date_startday =
GETPOSTINT(
'search_date_startday');
83$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
84$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
85$search_date_endday =
GETPOSTINT(
'search_date_endday');
86$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
87$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
88$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
89$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
90$search_note =
GETPOST(
'search_note',
'alpha');
91$search_duration =
GETPOST(
'search_duration',
'alpha');
92$search_task_ref =
GETPOST(
'search_task_ref',
'alpha');
93$search_task_label =
GETPOST(
'search_task_label',
'alpha');
94$search_user =
GETPOST(
'search_user',
'intcomma');
95$search_valuebilled =
GETPOST(
'search_valuebilled',
'intcomma');
96$search_product_ref =
GETPOST(
'search_product_ref',
'alpha');
97$search_company =
GETPOST(
'$search_company',
'alpha');
98$search_company_alias =
GETPOST(
'$search_company_alias',
'alpha');
99$search_project_ref =
GETPOST(
'$search_project_ref',
'alpha');
100$search_project_label =
GETPOST(
'$search_project_label',
'alpha');
101$search_timespent_starthour =
GETPOSTINT(
"search_timespent_duration_starthour");
102$search_timespent_startmin =
GETPOSTINT(
"search_timespent_duration_startmin");
103$search_timespent_endhour =
GETPOSTINT(
"search_timespent_duration_endhour");
104$search_timespent_endmin =
GETPOSTINT(
"search_timespent_duration_endmin");
107$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
108$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
110if (empty($page) || $page == -1) {
113$offset = $limit * $page;
114$pageprev = $page - 1;
115$pagenext = $page + 1;
117 $sortfield =
't.element_date,t.element_datehour,t.rowid';
120 $sortorder =
'DESC,DESC,DESC';
123$childids = $user->getAllChildIds(1);
127$hookmanager->initHooks(array(
'projecttasktime',
'globalcard'));
131$projectstatic =
new Project($db);
134$extrafields->fetch_name_optionals_label($projectstatic->table_element);
135$extrafields->fetch_name_optionals_label(
$object->table_element);
138if ($id > 0 || $ref) {
146if (!$user->hasRight(
'projet',
'lire')) {
155 if (empty($projectid) && !$user->hasRight(
'projet',
'all',
'lire')) {
156 $search_user = $user->id;
166if (
GETPOST(
'cancel',
'alpha')) {
169if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend' && $massaction !=
'confirm_generateinvoice' && $massaction !=
'confirm_generateinter') {
173$parameters = array(
'socid' => $socid,
'projectid' => $projectid);
174$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
179include DOL_DOCUMENT_ROOT .
'/core/actions_changeselectedfields.inc.php';
182if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
187 $search_duration =
'';
188 $search_date_startday =
'';
189 $search_date_startmonth =
'';
190 $search_date_startyear =
'';
191 $search_date_endday =
'';
192 $search_date_endmonth =
'';
193 $search_date_endyear =
'';
194 $search_date_start =
'';
195 $search_date_end =
'';
196 $search_task_ref =
'';
197 $search_company =
'';
198 $search_company_alias =
'';
199 $search_project_ref =
'';
200 $search_project_label =
'';
201 $search_task_label =
'';
203 $search_valuebilled =
'';
204 $search_product_ref =
'';
206 $search_array_options = array();
207 $search_timespent_starthour =
'';
208 $search_timespent_startmin =
'';
209 $search_timespent_endhour =
'';
210 $search_timespent_endmin =
'';
214if ($action ==
'addtimespent' && $user->hasRight(
'projet',
'time')) {
215 $timespent_durationhour =
GETPOSTINT(
'timespent_durationhour');
216 $timespent_durationmin =
GETPOSTINT(
'timespent_durationmin');
217 if (empty($timespent_durationhour) && empty($timespent_durationmin)) {
218 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
222 $langs->load(
"errors");
223 setEventMessages($langs->trans(
'ErrorUserNotAssignedToTask'),
null,
'errors');
232 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")),
null,
'errors');
233 $action =
'createtime';
243 if (empty(
$object->project->status)) {
244 setEventMessages($langs->trans(
"ProjectMustBeValidatedFirst"),
null,
'errors');
245 $action =
'createtime';
256 $object->timespent_withhour = 1;
259 $object->timespent_withhour = 0;
264 $result =
$object->addTimeSpent($user);
275 $action =
'createtime';
279if (($action ==
'updateline' || $action ==
'updatesplitline') && !$cancel && $user->hasRight(
'projet',
'lire')) {
280 if (!
GETPOST(
"new_durationhour") && !
GETPOST(
"new_durationmin")) {
281 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
"Duration")),
null,
'errors');
297 $object->fetch($id_temp, $ref);
299 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
303 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0 && !empty($timespent_date)) {
305 $object->timespent_withhour = 1;
306 } elseif (!empty($timespent_date)) {
307 $object->timespent_date = $timespent_date;
308 $object->timespent_withhour = 0;
316 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
317 $result =
$object->updateTimeSpent($user);
330 $object->timespent_note =
GETPOST(
"timespent_note_line",
"alphanohtml");
334 if (
GETPOST(
"timelinehour") !=
'' &&
GETPOST(
"timelinehour") >= 0) {
336 $object->timespent_withhour = 1;
337 } elseif (!empty($timespent_date)) {
338 $object->timespent_date = $timespent_date;
339 $object->timespent_withhour = 0;
347 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
348 $result =
$object->updateTimeSpent($user);
363if ($action ==
'confirm_deleteline' && $confirm ==
"yes" && ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer'))) {
366 if (in_array(
$object->timespent_fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
367 $result =
$object->delTimeSpent($user);
370 $langs->load(
"errors");
381if (!empty($project_ref) && !empty($withproject)) {
382 if ($projectstatic->fetch(0, $project_ref) > 0) {
383 $tasksarray =
$object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
384 if (count($tasksarray) > 0) {
385 $id = $tasksarray[0]->id;
387 header(
"Location: " . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'') . (empty($mode) ?
'' :
'&mode=' . $mode));
394$projectidforalltimes = 0;
396 $projectidforalltimes =
GETPOSTINT(
'projectid');
398 $result = $projectstatic->fetch($projectidforalltimes);
399 if (!empty($projectstatic->socid)) {
400 $projectstatic->fetch_thirdparty();
402 $res = $projectstatic->fetch_optionals();
403} elseif (
GETPOST(
'project_ref',
'alpha')) {
404 $projectstatic->fetch(0,
GETPOST(
'project_ref',
'alpha'));
405 $projectidforalltimes = $projectstatic->id;
409 $result = $projectstatic->fetch(
$object->fk_project);
412if ($id <= 0 && $projectidforalltimes == 0) {
413 $allprojectforuser = $user->id;
416if ($action ==
'confirm_generateinvoice') {
417 if (!empty($projectstatic->socid)) {
418 $projectstatic->fetch_thirdparty();
421 if (!($projectstatic->thirdparty->id > 0)) {
422 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateInvoice"),
null,
'errors');
424 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
425 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
426 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
428 $tmpinvoice =
new Facture($db);
429 $tmptimespent =
new Task($db);
430 $tmpproduct =
new Product($db);
431 $fuser =
new User($db);
436 $generateinvoicemode =
GETPOST(
'generateinvoicemode',
'alphanohtml');
439 $prodDurationHoursBase = 1.0;
440 $product_data_cache = array();
442 $tmpproduct->fetch($idprod);
448 $prodDurationHoursBase = $tmpproduct->getProductDurationHours();
449 if ($prodDurationHoursBase < 0) {
451 $langs->load(
"errors");
455 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
457 $pu_ht = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
458 $txtva = $dataforprice[
'tva_tx'];
459 $localtax1 = $dataforprice[
'localtax1'];
460 $localtax2 = $dataforprice[
'localtax2'];
462 $prodDurationHoursBase = 1;
470 $tmpinvoice->socid = $projectstatic->thirdparty->id;
472 $tmpinvoice->fk_project = $projectstatic->id;
473 $tmpinvoice->cond_reglement_id = $condidproject;
474 $tmpinvoice->mode_reglement_id = $projectstatic->thirdparty->mode_reglement_id;
475 $tmpinvoice->fk_account = $projectstatic->thirdparty->fk_account;
478 $tmpinvoice->fetch($invoiceToUse);
480 $result = $tmpinvoice->create($user);
488 if ($generateinvoicemode ==
'onelineperuser') {
489 $arrayoftasks = array();
490 foreach ($toselect as $key => $value) {
492 $object->fetchTimeSpent($value);
493 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
494 $arrayoftasks[
$object->timespent_fk_user][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
497 foreach ($arrayoftasks as $userid => $data) {
498 $fuser->fetch($userid);
499 $username = $fuser->getFullName($langs);
501 foreach ($data as $fk_product => $timespent_data) {
503 $qtyhour = $timespent_data[
'timespent'] / 3600;
510 } elseif ($idprod <= 0) {
513 $pu_ht = $fuser->thm;
518 if ($timespent_data[
'timespent']) {
519 $pu_ht =
price2num(($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent']),
'MU');
524 $prodDurationHours = $prodDurationHoursBase;
525 $idprodline = $idprod;
528 $localtax1line = $localtax1;
529 $localtax2line = $localtax2;
532 if (!empty($fk_product) && ($fk_product > 0) && ($fk_product !== $idprod)) {
533 if (!array_key_exists($fk_product, $product_data_cache)) {
534 $result = $tmpproduct->fetch($fk_product);
539 $prodDurationHours = $tmpproduct->getProductDurationHours();
540 if ($prodDurationHours < 0) {
542 $langs->load(
"errors");
546 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
548 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
549 $txtvaline = $dataforprice[
'tva_tx'];
550 $localtax1line = $dataforprice[
'localtax1'];
551 $localtax2line = $dataforprice[
'localtax2'];
553 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
555 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
556 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
557 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
558 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
559 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
561 $idprodline = $fk_product;
565 $lineid = $tmpinvoice->addline($langs->trans(
"TimeSpentForInvoice", $username) .
' : ' . $qtyhourtext, $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
572 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
573 $sql .=
' WHERE rowid IN ('.$db->sanitize(implode(
',', $toselect)).
') AND fk_user = '.((
int) $userid);
574 $result = $db->query($sql);
582 } elseif ($generateinvoicemode ==
'onelineperperiod') {
583 $arrayoftasks = array();
585 $withdetail =
GETPOST(
'detail_time_duration',
'alpha');
586 foreach ($toselect as $key => $value) {
588 $object->fetchTimeSpent($value);
590 $ftask =
new Task($db);
593 $fuser->fetch(
$object->timespent_fk_user);
594 $username = $fuser->getFullName($langs);
596 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
597 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
598 $arrayoftasks[
$object->timespent_id][
'note'] = $ftask->ref .
' - ' . $ftask->label .
' - ' . $username;
601 if (!empty($withdetail)) {
602 if (!empty(
$object->timespent_withhour)) {
609 $arrayoftasks[
$object->timespent_id][
'user'] =
$object->timespent_fk_user;
610 $arrayoftasks[
$object->timespent_id][
'fk_product'] =
$object->timespent_fk_product;
613 foreach ($arrayoftasks as $timespent_id => $value) {
614 $userid = $value[
'user'];
618 $qtyhour = $value[
'timespent'] / 3600;
622 $pu_ht =
price2num($value[
'totalvaluetodivideby3600'] / 3600,
'MU');
626 $prodDurationHours = $prodDurationHoursBase;
627 $idprodline = $idprod;
630 $localtax1line = $localtax1;
631 $localtax2line = $localtax2;
633 if (!empty($value[
'fk_product']) && $value[
'fk_product'] !== $idprod) {
634 if (!array_key_exists($value[
'fk_product'], $product_data_cache)) {
635 $result = $tmpproduct->fetch($value[
'fk_product']);
640 $prodDurationHours = $tmpproduct->getProductDurationHours();
641 if ($prodDurationHours < 0) {
643 $langs->load(
"errors");
647 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
649 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
650 $txtvaline = $dataforprice[
'tva_tx'];
651 $localtax1line = $dataforprice[
'localtax1'];
652 $localtax2line = $dataforprice[
'localtax2'];
654 $product_data_cache[$value[
'fk_product']] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
656 $prodDurationHours = $product_data_cache[$value[
'fk_product']][
'duration'];
657 $pu_htline = empty($product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'pu_ht'];
658 $txtvaline = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'tva_tx'];
659 $localtax1line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax1'];
660 $localtax2line = $product_data_cache[$value[
'fk_product']][
'dataforprice'][
'localtax2'];
662 $idprodline = $value[
'fk_product'];
664 $lineid = $tmpinvoice->addline($value[
'note'], $pu_htline, round($qtyhour / $prodDurationHours, 2), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject);
672 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'element_time SET invoice_line_id = '.((int) $lineid).
', invoice_id = '.((int) $tmpinvoice->id);
673 $sql .=
' WHERE rowid = '.((int) $timespent_id).
' AND fk_user = '.((int) $userid);
674 $result = $db->query($sql);
681 } elseif ($generateinvoicemode ==
'onelinepertask') {
682 $arrayoftasks = array();
683 foreach ($toselect as $key => $value) {
685 $object->fetchTimeSpent($value);
687 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'timespent'] +=
$object->timespent_duration;
688 $arrayoftasks[
$object->id][(int)
$object->timespent_fk_product][
'totalvaluetodivideby3600'] += (
$object->timespent_duration *
$object->timespent_thm);
691 foreach ($arrayoftasks as $task_id => $data) {
692 $ftask =
new Task($db);
693 $ftask->fetch($task_id);
695 foreach ($data as $fk_product => $timespent_data) {
696 $qtyhour = $timespent_data[
'timespent'] / 3600;
700 $prodDurationHours = $prodDurationHoursBase;
701 $idprodline = $idprod;
704 $localtax1line = $localtax1;
705 $localtax2line = $localtax2;
707 if (!empty($fk_product) && $fk_product !== $idprod) {
708 if (!array_key_exists($fk_product, $product_data_cache)) {
709 $result = $tmpproduct->fetch($fk_product);
714 $prodDurationHours = $tmpproduct->getProductDurationHours();
715 if ($prodDurationHours < 0) {
717 $langs->load(
"errors");
721 $dataforprice = $tmpproduct->getSellPrice($mysoc, $projectstatic->thirdparty, 0);
723 $pu_htline = empty($dataforprice[
'pu_ht']) ? 0 : $dataforprice[
'pu_ht'];
724 $txtvaline = $dataforprice[
'tva_tx'];
725 $localtax1line = $dataforprice[
'localtax1'];
726 $localtax2line = $dataforprice[
'localtax2'];
728 $product_data_cache[$fk_product] = array(
'duration' => $prodDurationHours,
'dataforprice' => $dataforprice);
730 $prodDurationHours = $product_data_cache[$fk_product][
'duration'];
731 $pu_htline = empty($product_data_cache[$fk_product][
'dataforprice'][
'pu_ht']) ? 0 : $product_data_cache[$fk_product][
'dataforprice'][
'pu_ht'];
732 $txtvaline = $product_data_cache[$fk_product][
'dataforprice'][
'tva_tx'];
733 $localtax1line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax1'];
734 $localtax2line = $product_data_cache[$fk_product][
'dataforprice'][
'localtax2'];
736 $idprodline = $fk_product;
740 if ($idprodline > 0) {
742 $pu_ht_for_task = $pu_htline;
745 $pu_ht_for_task = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
747 $pa_ht = (float)
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU') * $prodDurationHours;
753 $pu_ht_for_task =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
755 $pa_ht =
price2num($timespent_data[
'totalvaluetodivideby3600'] / $timespent_data[
'timespent'],
'MU');
761 $lineName = $ftask->ref .
' - ' . $ftask->label;
762 $lineid = $tmpinvoice->addline($lineName, $pu_ht_for_task,
price2num($qtyhour / $prodDurationHours,
'MS'), $txtvaline, $localtax1line, $localtax2line, ($idprodline > 0 ? $idprodline : 0), $remiseproject, $date_start, $date_end, 0, 0,
'',
'HT', 0, 1, -1, 0,
'', 0, 0, null, $pa_ht);
771 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'element_time SET invoice_line_id = ' . ((int) $lineid) .
', invoice_id = ' . ((int) $tmpinvoice->id);
772 $sql .=
' WHERE rowid IN (' . $db->sanitize(implode(
',', $toselect)) .
')';
773 $result = $db->query($sql);
786 $urltoinvoice = $tmpinvoice->getNomUrl(0);
787 $mesg = $langs->trans(
"InvoiceGeneratedFromTimeSpent",
'{s1}');
788 $mesg = str_replace(
'{s1}', $urltoinvoice, $mesg);
798if ($action ==
'confirm_generateinter') {
799 $langs->load(
'interventions');
801 if (!empty($projectstatic->socid)) {
802 $projectstatic->fetch_thirdparty();
805 if (!($projectstatic->thirdparty->id > 0)) {
806 setEventMessages($langs->trans(
"ThirdPartyRequiredToGenerateIntervention"),
null,
'errors');
808 include_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
809 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
810 include_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
813 require_once DOL_DOCUMENT_ROOT .
'/fichinter/class/fichinter.class.php';
815 $tmptimespent =
new Task($db);
816 $fuser =
new User($db);
822 $tmpinter->socid = $projectstatic->thirdparty->id;
824 $tmpinter->fk_project = $projectstatic->id;
825 $tmpinter->description = $projectstatic->title . (!empty($projectstatic->description) ?
'-' . $projectstatic->label :
'');
828 $tmpinter->fetch($interToUse);
830 $result = $tmpinter->create($user);
838 $arrayoftasks = array();
839 foreach ($toselect as $key => $value) {
841 $object->fetchTimeSpent($value);
844 $arrayoftasks[
$object->timespent_id][
'timespent'] =
$object->timespent_duration;
845 $arrayoftasks[
$object->timespent_id][
'totalvaluetodivideby3600'] =
$object->timespent_duration *
$object->timespent_thm;
846 $arrayoftasks[
$object->timespent_id][
'note'] =
$object->timespent_note;
847 $arrayoftasks[
$object->timespent_id][
'date'] = date(
'Y-m-d H:i:s',
$object->timespent_datehour);
850 foreach ($arrayoftasks as $timespent_id => $value) {
851 $ftask =
new Task($db);
852 $ftask->fetch($value[
'id']);
854 $qtyhour = $value[
'timespent'] / 3600;
858 $lineid = $tmpinter->addline($user, $tmpinter->id, $ftask->label . (!empty($value[
'note']) ?
' - ' . $value[
'note'] :
''), $value[
'date'], $value[
'timespent']);
863 $urltointer = $tmpinter->getNomUrl(0);
864 $mesg = $langs->trans(
"InterventionGeneratedFromTimeSpent",
'{s1}');
865 $mesg = str_replace(
'{s1}', $urltointer, $mesg);
882$form =
new Form($db);
885$userstatic =
new User($db);
887$arrayofselected = is_array($toselect) ? $toselect : array();
889$title =
$object->ref .
' - ' . $langs->trans(
"TimeSpent");
890if (!empty($withproject)) {
891 $title .=
' | ' . $langs->trans(
"Project") . (!empty($projectstatic->ref) ?
': ' . $projectstatic->ref :
'');
895llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project project-tasks page-task_time');
897if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser > 0) {
901 if ($projectidforalltimes > 0) {
902 $result = $projectstatic->fetch($projectidforalltimes);
903 if (!empty($projectstatic->socid)) {
904 $projectstatic->fetch_thirdparty();
906 $res = $projectstatic->fetch_optionals();
907 } elseif (
$object->fetch($id, $ref) >= 0) {
908 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_TASK') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
911 $result = $projectstatic->fetch(
$object->fk_project);
912 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic,
'fetchComments') && empty($projectstatic->comments)) {
913 $projectstatic->fetchComments();
915 if (!empty($projectstatic->socid)) {
916 $projectstatic->fetch_thirdparty();
918 $res = $projectstatic->fetch_optionals();
920 $object->project = clone $projectstatic;
923 $userRead = $projectstatic->restrictedProjectArea($user,
'read');
924 $linktocreatetime =
'';
926 if ($projectstatic->id > 0) {
929 if (empty($id) || $tab ==
'timespent') {
936 print
dol_get_fiche_head($head, $tab, $langs->trans(
"Project"), -1, ($projectstatic->public ?
'projectpub' :
'project'));
938 $param = ((!empty($mode) && $mode ==
'mine') ?
'&mode=mine' :
'');
940 $param .=
'&search_user=' . ((int) $search_user);
943 $param .=
'&search_month=' . ((int) $search_month);
946 $param .=
'&search_year=' . ((int) $search_year);
951 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
953 $morehtmlref =
'<div class="refidno">';
955 $morehtmlref .= $projectstatic->title;
957 if (!empty($projectstatic->thirdparty->id) && $projectstatic->thirdparty->id > 0) {
958 $morehtmlref .=
'<br>' . $projectstatic->thirdparty->getNomUrl(1,
'project');
960 $morehtmlref .=
'</div>';
963 if (!$user->hasRight(
'projet',
'all',
'lire')) {
964 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
965 $projectstatic->next_prev_filter =
"rowid:IN:" . $db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
968 dol_banner_tab($projectstatic,
'project_ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
970 print
'<div class="fichecenter">';
971 print
'<div class="fichehalfleft">';
972 print
'<div class="underbanner clearboth"></div>';
974 print
'<table class="border tableforfield centpercent">';
978 print
'<tr><td class="tdtop">';
979 print $langs->trans(
"Usage");
983 print
'<input type="checkbox" disabled name="usage_opportunity"' . (GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_opportunity ?
' checked="checked"' :
'')) .
'"> ';
984 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
985 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
989 print
'<input type="checkbox" disabled name="usage_task"' . (GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : ($projectstatic->usage_task ?
' checked="checked"' :
'')) .
'"> ';
990 $htmltext = $langs->trans(
"ProjectFollowTasks");
991 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
995 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"' :
'')) .
'"> ';
996 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
997 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1000 if (isModEnabled(
'eventorganization')) {
1001 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"' :
'')) .
'"> ';
1002 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1003 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1009 print
'<tr><td>' . $langs->trans(
"Budget") .
'</td><td>';
1010 if (!is_null($projectstatic->budget_amount) && strcmp($projectstatic->budget_amount,
'')) {
1011 print
'<span class="amount">' .
price($projectstatic->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency) .
'</span>';
1016 print
'<tr><td>' . $langs->trans(
"Dates") .
'</td><td>';
1018 print($start ? $start :
'?');
1021 print($end ? $end :
'?');
1022 if ($projectstatic->hasDelay()) {
1028 print
'<tr><td class="titlefield">' . $langs->trans(
"Visibility") .
'</td><td>';
1029 if ($projectstatic->public) {
1030 print
img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1031 print $langs->trans(
'SharedProject');
1033 print
img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1034 print $langs->trans(
'PrivateProject');
1042 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
1048 print
'<div class="fichehalfright">';
1049 print
'<div class="underbanner clearboth"></div>';
1051 print
'<table class="border tableforfield centpercent">';
1054 if (isModEnabled(
'category')) {
1055 print
'<tr><td class="valignmiddle">' . $langs->trans(
"Categories") .
'</td><td>';
1056 print $form->showCategories($projectstatic->id,
'project', 1);
1061 print
'<tr><td class="titlefield'.($projectstatic->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1062 if ($projectstatic->description) {
1063 print
'<tr><td class="nottitleforfield" colspan="2">';
1064 print
'<div class="longmessagecut">';
1075 print
'<div class="clearboth"></div>';
1085 $linktocreatetimeBtnStatus = 0;
1086 $linktocreatetimeUrl =
'';
1087 $linktocreatetimeHelpText =
'';
1088 if ($user->hasRight(
'projet',
'time')) {
1089 if ($projectstatic->public || $userRead > 0) {
1090 $linktocreatetimeBtnStatus = 1;
1092 if (!empty($projectidforalltimes)) {
1094 $backtourl = $_SERVER[
'PHP_SELF'] .
'?projectid=' . $projectstatic->id . ($withproject ?
'&withproject=1' :
'');
1095 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') .
'&projectid=' . $projectstatic->id .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1098 $backtourl = $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id . ($withproject ?
'&withproject=1' :
'');
1099 $linktocreatetimeUrl = $_SERVER[
'PHP_SELF'] .
'?' . ($withproject ?
'withproject=1' :
'') . (
$object->id > 0 ?
'&id=' .
$object->id :
'&projectid=' . $projectstatic->id) .
'&action=createtime&token=' .
newToken() . $param .
'&backtopage=' . urlencode($backtourl);
1102 $linktocreatetimeBtnStatus = -2;
1103 $linktocreatetimeHelpText = $langs->trans(
"NotOwnerOfProject");
1106 $linktocreatetimeBtnStatus = -2;
1107 $linktocreatetimeHelpText = $langs->trans(
"NotEnoughPermissions");
1110 $paramsbutton = array(
'morecss' =>
'reposition');
1111 $linktocreatetime =
dolGetButtonTitle($langs->trans(
'AddTimeSpent'), $linktocreatetimeHelpText,
'fa fa-plus-circle', $linktocreatetimeUrl,
'', $linktocreatetimeBtnStatus, $paramsbutton);
1114 $massactionbutton =
'';
1115 $arrayofmassactions = array();
1117 if ($projectstatic->id > 0) {
1119 if ($projectstatic->usage_bill_time) {
1120 $arrayofmassactions = array(
1121 'generateinvoice' => $langs->trans(
"GenerateBill"),
1125 if (isModEnabled(
'intervention') && $user->hasRight(
'ficheinter',
'creer')) {
1126 $langs->load(
"interventions");
1127 $arrayofmassactions[
'generateinter'] = $langs->trans(
"GenerateInter");
1131 if (in_array($massaction, array(
'presend',
'predelete',
'generateinvoice',
'generateinter'))) {
1132 $arrayofmassactions = array();
1134 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
1139 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1141 print
dol_get_fiche_head($head,
'task_time', $langs->trans(
"Task"), -1,
'projecttask', 0,
'',
'reposition');
1143 if ($action ==
'deleteline') {
1144 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1145 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1148 $param = ($withproject ?
'&withproject=1' :
'');
1149 $param .= ($param ?
'&' :
'') .
'id=' .
$object->id;
1150 $linkback = $withproject ?
'<a href="' . DOL_URL_ROOT .
'/projet/tasks.php?id=' . $projectstatic->id .
'">' . $langs->trans(
"BackToList") .
'</a>' :
'';
1152 if (!
GETPOST(
'withproject') || empty($projectstatic->id)) {
1153 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
1154 $object->next_prev_filter =
"fk_projet:IN:" . $db->sanitize($projectsListId);
1156 $object->next_prev_filter =
"fk_projet:=:" . ((int) $projectstatic->id);
1162 if (empty($withproject)) {
1163 $morehtmlref .=
'<div class="refidno">';
1164 $morehtmlref .= $langs->trans(
"Project") .
': ';
1165 $morehtmlref .= $projectstatic->getNomUrl(1);
1166 $morehtmlref .=
'<br>';
1169 $morehtmlref .= $langs->trans(
"ThirdParty") .
': ';
1170 if (!empty($projectstatic->thirdparty) && is_object($projectstatic->thirdparty)) {
1171 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
1173 $morehtmlref .=
'</div>';
1176 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref, $param);
1178 print
'<div class="fichecenter">';
1179 print
'<div class="fichehalfleft">';
1181 print
'<div class="underbanner clearboth"></div>';
1182 print
'<table class="border centpercent tableforfield">';
1185 print
'<tr><td>' . $langs->trans(
"ChildOfTask") .
'</td><td>';
1186 if (
$object->fk_task_parent > 0) {
1187 $tasktmp =
new Task($db);
1188 $tasktmp->fetch(
$object->fk_task_parent);
1189 print $tasktmp->getNomUrl(1);
1194 print
'<tr><td class="titlefield">' . $langs->trans(
"DateStart") .
' - ' . $langs->trans(
"Deadline") .
'</td><td>';
1196 print($start ? $start :
'?');
1199 print($end ? $end :
'?');
1206 print
'<tr><td>' . $langs->trans(
"PlannedWorkload") .
'</td><td>';
1207 if (
$object->planned_workload) {
1215 print
'<div class="fichehalfright">';
1217 print
'<div class="underbanner clearboth"></div>';
1218 print
'<table class="border tableforfield centpercent">';
1221 print
'<tr><td class="titlefield">' . $langs->trans(
"ProgressDeclared") .
'</td><td>';
1226 print
'<tr><td>' . $langs->trans(
"ProgressCalculated") .
'</td><td>';
1227 if (
$object->planned_workload) {
1228 $tmparray =
$object->getSummaryOfTimeSpent();
1229 if ($tmparray[
'total_duration'] > 0) {
1230 print round($tmparray[
'total_duration'] /
$object->planned_workload * 100, 2) .
' %';
1235 print
'<span class="opacitymedium">' . $langs->trans(
"WorkloadNotDefined") .
'</span>';
1246 print
'<div class="clearboth"></div>';
1250 if ($action ==
'deleteline') {
1251 $urlafterconfirm = $_SERVER[
"PHP_SELF"] .
"?" . (
$object->id > 0 ?
"id=" .
$object->id :
'projectid=' . $projectstatic->id) .
'&lineid=' .
GETPOSTINT(
"lineid") . ($withproject ?
'&withproject=1' :
'');
1252 print $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1257 if ($projectstatic->id > 0 || $allprojectforuser > 0) {
1259 $hookmanager->initHooks(array(
'tasktimelist'));
1263 if ($action ==
'deleteline' && !empty($projectidforalltimes)) {
1265 $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);
1266 $formconfirm = $form->formconfirm($urlafterconfirm, $langs->trans(
"DeleteATimeSpent"), $langs->trans(
"ConfirmDeleteATimeSpent"),
"confirm_deleteline",
'',
'', 1);
1270 $parameters = array(
'formConfirm' => $formconfirm,
"projectstatic" => $projectstatic,
"withproject" => $withproject);
1271 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1272 if (empty($reshook)) {
1273 $formconfirm .= $hookmanager->resPrint;
1274 } elseif ($reshook > 0) {
1275 $formconfirm = $hookmanager->resPrint;
1282 $arrayfields = array();
1283 $arrayfields[
't.element_date'] = array(
'label' => $langs->trans(
"Date"),
'checked' => 1);
1284 $arrayfields[
'p.fk_soc'] = array(
'label' => $langs->trans(
"ThirdParty"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1',
'checked' => 1);
1285 $arrayfields[
's.name_alias'] = array(
'label' => $langs->trans(
"AliasNameShort"),
'type' =>
'integer:Societe:/societe/class/societe.class.php:1');
1286 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1287 if (! empty($allprojectforuser)) {
1288 $arrayfields[
'p.project_ref'] = [
'label' => $langs->trans(
'RefProject'),
'checked' => 1];
1289 $arrayfields[
'p.project_label'] = [
'label' => $langs->trans(
'ProjectLabel'),
'checked' => 1];
1291 $arrayfields[
't.element_ref'] = array(
'label' => $langs->trans(
"RefTask"),
'checked' => 1);
1292 $arrayfields[
't.element_label'] = array(
'label' => $langs->trans(
"LabelTask"),
'checked' => 1);
1294 $arrayfields[
'author'] = array(
'label' => $langs->trans(
"By"),
'checked' => 1);
1295 $arrayfields[
't.note'] = array(
'label' => $langs->trans(
"Note"),
'checked' => 1);
1296 if (isModEnabled(
'service') && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1297 $arrayfields[
't.fk_product'] = array(
'label' => $langs->trans(
"Product"),
'checked' => 1);
1299 $arrayfields[
't.element_duration'] = array(
'label' => $langs->trans(
"Duration"),
'checked' => 1);
1300 $arrayfields[
'value'] = array(
'label' => $langs->trans(
"Value"),
'checked' => 1,
'enabled' => isModEnabled(
"salaries"));
1301 $arrayfields[
'valuebilled'] = array(
'label' => $langs->trans(
"Billed"),
'checked' => 1,
'enabled' => (((
getDolGlobalInt(
'PROJECT_HIDE_TASKS') || !
getDolGlobalInt(
'PROJECT_BILL_TIME_SPENT')) ? 0 : 1) && $projectstatic->usage_bill_time));
1303 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_list_array_fields.tpl.php';
1306 '@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields';
1309 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1310 $param .=
'&contextpage=' . urlencode($contextpage);
1312 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1313 $param .=
'&limit='.((int) $limit);
1315 if ($search_month > 0) {
1316 $param .=
'&search_month=' . urlencode((
string) ($search_month));
1318 if ($search_year > 0) {
1319 $param .=
'&search_year=' . urlencode((
string) ($search_year));
1321 if (!empty($search_user)) {
1322 $param .=
'&search_user='.urlencode($search_user);
1324 if ($search_task_ref !=
'') {
1325 $param .=
'&search_task_ref=' . urlencode($search_task_ref);
1327 if ($search_company !=
'') {
1328 $param .=
'&$search_company=' . urlencode($search_company);
1330 if ($search_company_alias !=
'') {
1331 $param .=
'&$search_company_alias=' . urlencode($search_company_alias);
1333 if ($search_project_ref !=
'') {
1334 $param .=
'&$search_project_ref=' . urlencode($search_project_ref);
1336 if ($search_project_label !=
'') {
1337 $param .=
'&$search_project_label=' . urlencode($search_project_label);
1339 if ($search_task_label !=
'') {
1340 $param .=
'&search_task_label=' . urlencode($search_task_label);
1342 if ($search_note !=
'') {
1343 $param .=
'&search_note=' . urlencode($search_note);
1345 if ($search_duration !=
'') {
1346 $param .=
'&search_field2=' . urlencode((
string) ($search_duration));
1348 if ($optioncss !=
'') {
1349 $param .=
'&optioncss=' . urlencode($optioncss);
1351 if ($search_date_startday) {
1352 $param .=
'&search_date_startday=' . urlencode((
string) ($search_date_startday));
1354 if ($search_date_startmonth) {
1355 $param .=
'&search_date_startmonth=' . urlencode((
string) ($search_date_startmonth));
1357 if ($search_date_startyear) {
1358 $param .=
'&search_date_startyear=' . urlencode((
string) ($search_date_startyear));
1360 if ($search_date_endday) {
1361 $param .=
'&search_date_endday=' . urlencode((
string) ($search_date_endday));
1363 if ($search_date_endmonth) {
1364 $param .=
'&search_date_endmonth=' . urlencode((
string) ($search_date_endmonth));
1366 if ($search_date_endyear) {
1367 $param .=
'&search_date_endyear=' . urlencode((
string) ($search_date_endyear));
1369 if ($search_timespent_starthour) {
1370 $param .=
'&search_timespent_duration_starthour=' . urlencode((
string) ($search_timespent_starthour));
1372 if ($search_timespent_startmin) {
1373 $param .=
'&search_timespent_duration_startmin=' . urlencode((
string) ($search_timespent_startmin));
1375 if ($search_timespent_endhour) {
1376 $param .=
'&search_timespent_duration_endhour=' . urlencode((
string) ($search_timespent_endhour));
1378 if ($search_timespent_endmin) {
1379 $param .=
'&search_timespent_duration_endmin=' . urlencode((
string) ($search_timespent_endmin));
1387 $param .=
'&id=' . urlencode((
string) ($id));
1390 $param .=
'&projectid=' . urlencode((
string) ($projectid));
1393 $param .=
'&withproject=' . urlencode((
string) ($withproject));
1396 $parameters = array(
'param' => &$param);
1397 $reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
1398 $param .= $hookmanager->resPrint;
1400 print
'<form method="POST" action="' . $_SERVER[
"PHP_SELF"] .
'">';
1401 if ($optioncss !=
'') {
1402 print
'<input type="hidden" name="optioncss" value="' . $optioncss .
'">';
1404 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1405 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1406 if ($action ==
'editline') {
1407 print
'<input type="hidden" name="action" value="updateline">';
1408 } elseif ($action ==
'splitline') {
1409 print
'<input type="hidden" name="action" value="updatesplitline">';
1410 } elseif ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1411 print
'<input type="hidden" name="action" value="addtimespent">';
1412 } elseif ($massaction ==
'generateinvoice' && $user->hasRight(
'facture',
'creer')) {
1413 print
'<input type="hidden" name="action" value="confirm_generateinvoice">';
1414 } elseif ($massaction ==
'generateinter' && $user->hasRight(
'ficheinter',
'creer')) {
1415 print
'<input type="hidden" name="action" value="confirm_generateinter">';
1417 print
'<input type="hidden" name="action" value="list">';
1419 print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
1420 print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
1422 print
'<input type="hidden" name="id" value="' .
$id .
'">';
1423 print
'<input type="hidden" name="projectid" value="' . $projectidforalltimes .
'">';
1424 print
'<input type="hidden" name="withproject" value="' . $withproject .
'">';
1425 print
'<input type="hidden" name="tab" value="' . $tab .
'">';
1426 print
'<input type="hidden" name="page_y" value="">';
1429 if ($massaction ==
'generateinvoice') {
1430 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1431 print
'<table class="noborder centerpercent">';
1433 print
'<td class="titlefield">';
1434 print $langs->trans(
'DateInvoice');
1437 print $form->selectDate(
'',
'', 0, 0, 0,
'', 1, 1);
1443 print $langs->trans(
'Mode');
1447 'onelineperuser' =>
'OneLinePerUser',
1448 'onelinepertask' =>
'OneLinePerTask',
1449 'onelineperperiod' =>
'OneLinePerTimeSpentLine',
1451 print $form->selectarray(
'generateinvoicemode', $tmparray,
'onelineperuser', 0, 0, 0,
'', 1);
1452 print
"\n" .
'<script type="text/javascript">';
1454 $(document).ready(function () {
1455 setDetailVisibility();
1456 $("#generateinvoicemode").change(function() {
1457 setDetailVisibility();
1459 function setDetailVisibility() {
1460 generateinvoicemode = $("#generateinvoicemode option:selected").val();
1461 if (generateinvoicemode=="onelineperperiod") {
1462 $("#detail_time_duration").show();
1464 $("#detail_time_duration").hide();
1469 print
'</script>' .
"\n";
1470 print
'<span style="display:none" id="detail_time_duration"><input type="checkbox" value="detail" name="detail_time_duration"/>' . $langs->trans(
'AddDetailDateAndDuration') .
'</span>';
1474 if (isModEnabled(
"service")) {
1477 print $langs->trans(
'ServiceToUseOnLines');
1480 $form->select_produits(
'',
'productid',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 0, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500');
1485 print
'<td class="titlefield">';
1486 print $langs->trans(
'InvoiceToUse');
1489 print $form->selectInvoice($projectstatic->thirdparty->id,
'',
'invoiceid', 24, 0, $langs->trans(
'NewInvoice'), 1, 0, 0,
'maxwidth500',
'',
'all');
1493 print
'<td class="titlefield">';
1494 print $langs->trans(
"CustomerRelativeDiscount");
1497 print
'<input type="text" size="5" name="remiseproject" value="'.$projectstatic->thirdparty->remise_percent.
'">%';
1500 print
'<tr class="newinvoicedetail">';
1501 print
'<td class="titlefield">';
1502 print $langs->trans(
"PaymentConditions");
1505 print $form->getSelectConditionsPaiements($projectstatic->thirdparty->cond_reglement_id,
'condidproject');
1519 print
'<div class="center">';
1520 print
'<input type="submit" class="button" id="createbills" name="createbills" value="' . $langs->trans(
'GenerateBill') .
'"> ';
1521 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1525 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateInvoice") .
'</div>';
1526 print
'<div class="center">';
1527 print
'<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1531 } elseif ($massaction ==
'generateinter') {
1533 print
'<input type="hidden" name="massaction" value="confirm_createinter">';
1535 if (!empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0) {
1537 print
'<table class="noborder centpercent">';
1539 print
'<td class="titlefield">';
1540 print
img_picto(
'',
'intervention',
'class="pictofixedwidth"') . $langs->trans(
'InterToUse');
1544 print $forminter->select_interventions($projectstatic->thirdparty->id, 0,
'interid', 24, $langs->trans(
'NewInter'),
true);
1549 print
'<div class="center">';
1550 print
'<input type="submit" class="button" id="createinter" name="createinter" value="' . $langs->trans(
'GenerateInter') .
'"> ';
1551 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1555 print
'<div class="warning">' . $langs->trans(
"ThirdPartyRequiredToGenerateIntervention") .
'</div>';
1556 print
'<div class="center">';
1557 print
'<input type="submit" class="button" id="cancel" name="cancel" value="' . $langs->trans(
'Cancel') .
'">';
1564 $parameters = array(
1565 'toselect' => $toselect,
1566 'uploaddir' => isset($uploaddir) ? $uploaddir : null
1569 $reshook = $hookmanager->executeHooks(
'doPreMassActions', $parameters, $object, $action);
1573 print $hookmanager->resPrint;
1581 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1582 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1584 $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,";
1585 $sql .=
" t.fk_product,";
1586 $sql .=
" pt.ref, pt.label, pt.fk_projet,";
1587 $sql .=
" u.lastname, u.firstname, u.login, u.photo, u.gender, u.statut as user_status,";
1588 $sql .=
" il.fk_facture as invoice_id, inv.fk_statut,";
1589 $sql .=
" p.fk_soc,s.name_alias,";
1590 $sql .=
" t.invoice_line_id,";
1591 $sql .=
" pt.billable";
1593 $parameters = array();
1594 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
1595 $sql .= $hookmanager->resPrint;
1596 $sql = preg_replace(
'/,\s*$/',
'', $sql);
1600 $sql .=
" FROM ".MAIN_DB_PREFIX.
"element_time as t";
1601 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facturedet as il ON il.rowid = t.invoice_line_id";
1602 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture as inv ON inv.rowid = il.fk_facture";
1603 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as prod ON prod.rowid = t.fk_product";
1604 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet_task as pt ON pt.rowid = t.fk_element";
1605 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"projet as p ON p.rowid = pt.fk_projet";
1606 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"user as u ON t.fk_user = u.rowid";
1607 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON s.rowid = p.fk_soc";
1610 $parameters = array();
1611 $reshook = $hookmanager->executeHooks(
'printFieldListFrom', $parameters, $object, $action);
1612 $sql .= $hookmanager->resPrint;
1613 $sql .=
" WHERE elementtype = 'task'";
1614 $sql .=
" AND p.entity IN (".getEntity(
'project').
")";
1615 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1619 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $user->socid > 0 ? $user->socid : 0, $filterproj);
1620 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId).
")";
1622 if (empty($projectidforalltimes) && empty($allprojectforuser)) {
1624 $sql .=
" AND t.fk_element =".((int)
$object->id);
1625 } elseif (!empty($projectidforalltimes)) {
1627 $sql .=
" AND pt.fk_projet IN (" . $db->sanitize($projectidforalltimes) .
")";
1628 } elseif (!empty($allprojectforuser)) {
1630 if (empty($search_user) && !empty($arrayfields[
'author'][
'checked'])) {
1631 $search_user = $user->id;
1633 if ($search_user > 0) {
1634 $sql .=
" AND t.fk_user = " . ((int) $search_user);
1641 if ($search_task_ref) {
1644 if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_company) {
1645 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_company);
1647 if ($search_company) {
1650 if ($search_company_alias) {
1654 if ($search_project_ref) {
1657 if ($search_project_label) {
1660 if ($search_task_label) {
1663 if ($search_user > 0) {
1666 if (!empty($search_product_ref)) {
1669 if ($search_valuebilled ==
'1') {
1670 $sql .=
' AND t.invoice_id > 0';
1672 if ($search_valuebilled ==
'0') {
1673 $sql .=
' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)';
1676 if ($search_date_start) {
1677 $sql .=
" AND t.element_date >= '".$db->idate($search_date_start).
"'";
1679 if ($search_date_end) {
1680 $sql .=
" AND t.element_date <= '".$db->idate($search_date_end).
"'";
1683 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1684 if ($search_timespent_starthour || $search_timespent_startmin) {
1685 $timespent_duration_start = $search_timespent_starthour * 60 * 60;
1686 $timespent_duration_start += ($search_timespent_startmin ? $search_timespent_startmin : 0) * 60;
1687 $sql .=
" AND t.element_duration >= " . $timespent_duration_start;
1690 if ($search_timespent_endhour || $search_timespent_endmin) {
1691 $timespent_duration_end = $search_timespent_endhour * 60 * 60;
1692 $timespent_duration_end += ($search_timespent_endmin ? $search_timespent_endmin : 0) * 60;
1693 $sql .=
" AND t.element_duration <= " . $timespent_duration_end;
1697 $sql .=
dolSqlDateFilter(
't.element_datehour', $search_day, $search_month, $search_year);
1700 $parameters = array();
1701 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
1702 $sql .= $hookmanager->resPrint;
1705 $nbtotalofrecords =
'';
1708 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
1709 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
1710 $resql = $db->query($sqlforcount);
1712 $objforcount = $db->fetch_object($resql);
1713 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1718 if (($page * $limit) > $nbtotalofrecords) {
1726 $sql .= $db->order($sortfield, $sortorder);
1728 $sql .= $db->plimit($limit + 1, $offset);
1731 $resql = $db->query($sql);
1737 $num = $db->num_rows($resql);
1740 if (!empty($projectidforalltimes)) {
1741 print
'<!-- List of time spent for project -->' .
"\n";
1743 $title = $langs->trans(
"ListTaskTimeUserProject");
1745 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1747 print
'<!-- List of time spent -->' .
"\n";
1749 $title = $langs->trans(
"ListTaskTimeForTask");
1751 print_barre_liste($title, $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'clock', 0, $linktocreatetime,
'', $limit, 0, 0, 1);
1756 $row = $db->fetch_object($resql);
1768 if ($action ==
'createtime' && $user->hasRight(
'projet',
'time')) {
1769 print
'<!-- table to add time spent -->' .
"\n";
1771 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
1774 print
'<div class="div-table-responsive-no-min">';
1775 print
'<table class="noborder nohover centpercent">';
1777 print
'<tr class="liste_titre">';
1778 print
'<td>' . $langs->trans(
"Date") .
'</td>';
1779 if (!empty($allprojectforuser)) {
1780 print
'<td>' . $langs->trans(
"Project") .
'</td>';
1783 print
'<td>' . $langs->trans(
"Task") .
'</td>';
1785 print
'<td>' . $langs->trans(
"By") .
'</td>';
1786 print
'<td>' . $langs->trans(
"Note") .
'</td>';
1787 print
'<td>' . $langs->trans(
"NewTimeSpent") .
'</td>';
1788 print
'<td>' . $langs->trans(
"ProgressDeclared") .
'</td>';
1792 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1793 print
'<td>'.$langs->trans(
"Product").
'</td>';
1797 $parameters = array(
'mode' =>
'create');
1798 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1799 print $hookmanager->resPrint;
1803 print
'<tr class="oddeven nohover">';
1806 print
'<td class="maxwidthonsmartphone">';
1808 print $form->selectDate($newdate,
'time', (
$conf->browser->layout ==
'phone' ? 2 : 1), 1, 2,
"timespent_date", 1, 0);
1811 if (!empty($allprojectforuser)) {
1820 print
'<td class="maxwidthonsmartphone">';
1821 $nboftasks = $formproject->selectTasks(-1,
GETPOSTINT(
'taskid'),
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth300', $projectstatic->id,
'progress');
1826 print
'<td class="maxwidthonsmartphone nowraponall">';
1827 $contactsofproject = $projectstatic->getListContactId(
'internal');
1828 if (count($contactsofproject) > 0) {
1829 print
img_object(
'',
'user',
'class="hideonsmartphone"');
1830 if (in_array($user->id, $contactsofproject)) {
1831 $userid = $user->id;
1833 $userid = $contactsofproject[0];
1836 if ($projectstatic->public) {
1837 $contactsofproject = array();
1839 print $form->select_dolusers((
GETPOSTINT(
'userid') ?
GETPOSTINT(
'userid') : $userid),
'userid', 0,
'', 0,
'', $contactsofproject, 0, 0, 0,
'', 0, $langs->trans(
"ResourceNotAssignedToProject"),
'minwidth150imp maxwidth200');
1842 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) .
' ' . $langs->trans(
'FirstAddRessourceToAllocateTime');
1849 print
'<textarea name="timespent_note" class="maxwidth100onsmartphone" rows="' . ROWS_2 .
'">' . (
GETPOST(
'timespent_note') ?
GETPOST(
'timespent_note') :
'') .
'</textarea>';
1853 print
'<td class="nowraponall">';
1854 $durationtouse = (
GETPOST(
'timespent_duration') ?
GETPOST(
'timespent_duration') :
'');
1855 if (GETPOSTISSET(
'timespent_durationhour') || GETPOSTISSET(
'timespent_durationmin')) {
1856 $durationtouse = ((int)
GETPOST(
'timespent_durationhour') * 3600 + (int)
GETPOST(
'timespent_durationmin') * 60);
1858 print $form->select_duration(
'timespent_duration', $durationtouse, 0,
'text');
1862 print
'<td class="nowrap">';
1863 print $formother->select_percent(
GETPOST(
'progress') ?
GETPOST(
'progress') :
$object->progress,
'progress', 0, 5, 0, 100, 1);
1871 if (isModEnabled(
"service") && !empty($projectstatic->thirdparty) && $projectstatic->thirdparty->id > 0 && $projectstatic->usage_bill_time) {
1872 print
'<td class="nowraponall">';
1874 print $form->select_produits((GETPOSTISSET(
'fk_product') ?
GETPOSTINT(
"fk_product") :
''),
'fk_product',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth150', 0,
'', null, 1);
1880 $parameters = array(
'mode' =>
'create');
1881 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1882 print $hookmanager->resPrint;
1884 print
'<td class="center">';
1885 $form->buttonsSaveCancel();
1886 print
'<input type="submit" name="save" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-add reposition" value="'.$langs->trans(
"Add").
'">';
1887 print
'<input type="submit" name="cancel" class="button buttongen smallpaddingimp marginleftonly margintoponlyshort marginbottomonlyshort button-cancel" value="'.$langs->trans(
"Cancel").
'">';
1896 $moreforfilter =
'';
1898 $parameters = array();
1899 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
1900 if (empty($reshook)) {
1901 $moreforfilter .= $hookmanager->resPrint;
1903 $moreforfilter = $hookmanager->resPrint;
1906 if (!empty($moreforfilter)) {
1907 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
1908 print $moreforfilter;
1912 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
1913 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
1914 $selectedfields .= (is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
1916 print
'<div class="div-table-responsive">';
1917 print
'<table class="tagtable nobottomiftotal liste' . ($moreforfilter ?
" listwithfilterbefore" :
"") .
'">' .
"\n";
1921 print
'<tr class="liste_titre_filter">';
1924 print
'<td class="liste_titre center">';
1925 $searchpicto = $form->showFilterButtons(
'left');
1930 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
1931 print
'<td class="liste_titre left">';
1932 print
'<div class="nowrapfordate">';
1933 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1935 print
'<div class="nowrapfordate">';
1936 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1941 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
1942 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company" value="' .
dol_escape_htmltag($search_company) .
'"></td>';
1946 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1947 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_company_alias" value="' .
dol_escape_htmltag($search_company_alias) .
'"></td>';
1950 if (!empty($allprojectforuser)) {
1951 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
1952 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_ref" value="' .
dol_escape_htmltag($search_project_ref) .
'"></td>';
1954 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
1955 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="$search_project_label" value="' .
dol_escape_htmltag($search_project_label) .
'"></td>';
1959 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
1960 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
1961 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'"></td>';
1963 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
1964 print
'<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
1968 if (!empty($arrayfields[
'author'][
'checked'])) {
1969 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>';
1972 if (!empty($arrayfields[
't.note'][
'checked'])) {
1973 print
'<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_note" value="' .
dol_escape_htmltag($search_note) .
'"></td>';
1976 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
1978 print
'<td class="liste_titre right">';
1980 $durationtouse_start =
'';
1981 if ($search_timespent_starthour || $search_timespent_startmin) {
1982 $durationtouse_start = ($search_timespent_starthour * 3600 + $search_timespent_startmin * 60);
1984 print
'<div class="nowraponall">' . $langs->trans(
'from') .
' ';
1985 print $form->select_duration(
'search_timespent_duration_start', $durationtouse_start, 0,
'text', 0, 1);
1988 $durationtouse_end =
'';
1989 if ($search_timespent_endhour || $search_timespent_endmin) {
1990 $durationtouse_end = ($search_timespent_endhour * 3600 + $search_timespent_endmin * 60);
1992 print
'<div class="nowraponall">' . $langs->trans(
'to') .
' ';
1993 print $form->select_duration(
'search_timespent_duration_end', $durationtouse_end, 0,
'text', 0, 1);
1999 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2000 print
'<td class="liste_titre right"></td>';
2003 if (!empty($arrayfields[
'value'][
'checked'])) {
2004 print
'<td class="liste_titre"></td>';
2007 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2008 print
'<td class="liste_titre center">' . $form->selectyesno(
'search_valuebilled', $search_valuebilled, 1,
false, 1) .
'</td>';
2016 $parameters = array(
'arrayfields' => $arrayfields);
2017 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
2018 print $hookmanager->resPrint;
2021 print
'<td class="liste_titre center">';
2022 $searchpicto = $form->showFilterButtons();
2026 print
'</tr>' .
"\n";
2029 $totalarray = array();
2030 $totalarray[
'nbfield'] = 0;
2034 print
'<tr class="liste_titre">';
2036 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
2037 $totalarray[
'nbfield']++;
2039 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2040 print_liste_field_titre($arrayfields[
't.element_date'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2041 $totalarray[
'nbfield']++;
2043 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2044 print_liste_field_titre($arrayfields[
'p.fk_soc'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_date,t.element_datehour,t.rowid',
'', $param,
'', $sortfield, $sortorder);
2045 $totalarray[
'nbfield']++;
2047 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2049 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
'PHP_SELF'],
's.name_alias',
'', $param,
'', $sortfield, $sortorder);
2050 $totalarray[
'nbfield']++;
2052 if (!empty($allprojectforuser)) {
2053 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2055 $totalarray[
'nbfield']++;
2057 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2058 print_liste_field_titre(
"ProjectLabel", $_SERVER[
'PHP_SELF'],
'p.title',
'', $param,
'', $sortfield, $sortorder);
2059 $totalarray[
'nbfield']++;
2062 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2063 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2064 print_liste_field_titre($arrayfields[
't.element_ref'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.ref',
'', $param,
'', $sortfield, $sortorder);
2065 $totalarray[
'nbfield']++;
2067 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2068 print_liste_field_titre($arrayfields[
't.element_label'][
'label'], $_SERVER[
'PHP_SELF'],
'pt.label',
'', $param,
'', $sortfield, $sortorder);
2069 $totalarray[
'nbfield']++;
2072 if (!empty($arrayfields[
'author'][
'checked'])) {
2073 print_liste_field_titre($arrayfields[
'author'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder);
2074 $totalarray[
'nbfield']++;
2076 if (!empty($arrayfields[
't.note'][
'checked'])) {
2077 print_liste_field_titre($arrayfields[
't.note'][
'label'], $_SERVER[
'PHP_SELF'],
't.note',
'', $param,
'', $sortfield, $sortorder);
2078 $totalarray[
'nbfield']++;
2080 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2081 print_liste_field_titre($arrayfields[
't.element_duration'][
'label'], $_SERVER[
'PHP_SELF'],
't.element_duration',
'', $param,
'', $sortfield, $sortorder,
'right ');
2082 $totalarray[
'nbfield']++;
2084 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2085 print_liste_field_titre($arrayfields[
't.fk_product'][
'label'], $_SERVER[
'PHP_SELF'],
't.fk_product',
'', $param,
'', $sortfield, $sortorder);
2086 $totalarray[
'nbfield']++;
2089 if (!empty($arrayfields[
'value'][
'checked'])) {
2090 print_liste_field_titre($arrayfields[
'value'][
'label'], $_SERVER[
'PHP_SELF'],
'',
'', $param,
'', $sortfield, $sortorder,
'right ');
2091 $totalarray[
'nbfield']++;
2093 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2094 print_liste_field_titre($arrayfields[
'valuebilled'][
'label'], $_SERVER[
'PHP_SELF'],
'il.total_ht',
'', $param,
'', $sortfield, $sortorder,
'center ', $langs->trans(
"SelectLinesOfTimeSpentToInvoice"));
2095 $totalarray[
'nbfield']++;
2102 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
2103 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
2104 print $hookmanager->resPrint;
2106 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'width="80"', $sortfield, $sortorder,
'center maxwidthsearch ');
2107 $totalarray[
'nbfield']++;
2111 $tasktmp =
new Task($db);
2112 $tmpinvoice =
new Facture($db);
2115 $param .=
'&page='.((int) $page);
2117 $param .=
'&sortfield='.urlencode($sortfield).
'&sortorder='.urlencode($sortorder);
2121 $savnbfield = $totalarray[
'nbfield'];
2122 $totalarray = array();
2123 $totalarray[
'nbfield'] = 0;
2125 foreach ($tasks as $task_time) {
2131 $invoiced = $task_time->invoice_id ? true :
false;
2133 $date1 = $db->jdate($task_time->element_date);
2134 $date2 = $db->jdate($task_time->element_datehour);
2138 print
'<tr data-rowid="'.$task_time->rowid.
'" class="oddeven">';
2142 print
'<td class="center nowraponall">';
2143 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2144 print
'<input type="hidden" name="lineid" value="' .
GETPOSTINT(
'lineid') .
'">';
2145 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2147 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2148 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2149 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2150 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' :
'').
'">';
2151 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2155 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' :
'') .
'">';
2156 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2160 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' :
'').
'">';
2161 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2164 if ($massactionbutton || $massaction) {
2166 if (in_array($task_time->rowid, $arrayofselected)) {
2172 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2173 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2177 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2178 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2187 $totalarray[
'nbfield']++;
2192 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2193 print
'<td class="nowrap">';
2194 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2195 if (empty($task_time->element_date_withhour)) {
2196 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 4, 3, 2,
"timespent_date", 1, 0);
2198 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 2, 1, 2,
"timespent_date", 1, 0);
2201 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2205 $totalarray[
'nbfield']++;
2210 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2211 print
'<td class="tdoverflowmax125">';
2212 if ($task_time->fk_soc > 0) {
2213 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2214 $tmpsociete =
new Societe($db);
2215 $tmpsociete->fetch($task_time->fk_soc);
2216 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2218 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2220 print $tmpsociete->getNomUrl(1,
'', 100, 0, 1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
2224 $totalarray[
'nbfield']++;
2229 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2230 if ($task_time->fk_soc > 0) {
2231 if (empty(
$conf->cache[
'thirdparty'][$task_time->fk_soc])) {
2232 $tmpsociete =
new Societe($db);
2233 $tmpsociete->fetch($task_time->fk_soc);
2234 $conf->cache[
'thirdparty'][$task_time->fk_soc] = $tmpsociete;
2236 $tmpsociete =
$conf->cache[
'thirdparty'][$task_time->fk_soc];
2238 $valtoshow = $tmpsociete->name_alias;
2240 print
'<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($valtoshow).
'">';
2244 $totalarray[
'nbfield']++;
2249 if (!empty($allprojectforuser)) {
2250 if (!empty($arrayfields[
'p.project_ref'][
'checked'])) {
2251 print
'<td class="nowraponall">';
2252 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2253 $tmpproject =
new Project($db);
2254 $tmpproject->fetch($task_time->fk_projet);
2255 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2257 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2259 print $tmpproject->getNomUrl(1);
2262 $totalarray[
'nbfield']++;
2265 if (!empty($arrayfields[
'p.project_label'][
'checked'])) {
2266 if (empty(
$conf->cache[
'project'][$task_time->fk_projet])) {
2267 $tmpproject =
new Project($db);
2268 $tmpproject->fetch($task_time->fk_projet);
2269 $conf->cache[
'project'][$task_time->fk_projet] = $tmpproject;
2271 $tmpproject =
$conf->cache[
'project'][$task_time->fk_projet];
2273 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($tmpproject->title).
'">';
2277 $totalarray[
'nbfield']++;
2283 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2284 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2285 print
'<td class="nowrap">';
2286 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2287 $formproject->selectTasks(-1,
GETPOSTINT(
'taskid') ?
GETPOSTINT(
'taskid') : $task_time->fk_element,
'taskid', 0, 0, 1, 1, 0, 0,
'maxwidth250', $projectstatic->id,
'');
2289 $tasktmp->id = $task_time->fk_element;
2290 $tasktmp->ref = $task_time->ref;
2291 $tasktmp->label = $task_time->label;
2292 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2296 $totalarray[
'nbfield']++;
2299 } elseif ($action !==
'createtime') {
2300 print
'<input type="hidden" name="taskid" value="' .
$id .
'">';
2304 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2305 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2306 print
'<td class="tdoverflowmax250" title="'.dol_escape_htmltag($task_time->label).
'">';
2310 $totalarray[
'nbfield']++;
2316 if (!empty($arrayfields[
'author'][
'checked'])) {
2317 print
'<td class="minwidth100 tdoverflowmax125">';
2318 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2321 $object->fetch($task_time->fk_element);
2323 $contactsoftask =
$object->getListContactId(
'internal');
2324 if (!in_array($task_time->fk_user, $contactsoftask)) {
2325 $contactsoftask[] = $task_time->fk_user;
2327 if (count($contactsoftask) > 0) {
2328 print
img_object(
'',
'user',
'class="pictofixedwidth hideonsmartphone"');
2329 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
null, 0,
'', $contactsoftask,
'0', 0, 0,
'', 0,
'',
'minwidth100 maxwidth100');
2331 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2334 $userstatic->id = $task_time->fk_user;
2335 $userstatic->lastname = $task_time->lastname;
2336 $userstatic->firstname = $task_time->firstname;
2337 $userstatic->photo = $task_time->photo;
2338 $userstatic->gender = $task_time->gender;
2339 $userstatic->status = $task_time->user_status;
2341 print $userstatic->getNomUrl(-1);
2345 $totalarray[
'nbfield']++;
2350 if (!empty($arrayfields[
't.note'][
'checked'])) {
2351 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2352 print
'<td class="small">';
2353 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2356 print
'<td class="small tdoverflowmax150 classfortooltip" title="'.dol_string_onlythesehtmltags(
dol_htmlentitiesbr($task_time->note)).
'">';
2361 $totalarray[
'nbfield']++;
2363 } elseif ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2364 print
'<input type="hidden" name="timespent_note_line" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2368 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2369 print
'<td class="right nowraponall">';
2370 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2371 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2372 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2378 $totalarray[
'nbfield']++;
2381 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.element_duration';
2383 if (empty($totalarray[
'val'][
't.element_duration'])) {
2384 $totalarray[
'val'][
't.element_duration'] = $task_time->element_duration;
2386 $totalarray[
'val'][
't.element_duration'] += $task_time->element_duration;
2389 $totalarray[
'totaldurationfield'] = $totalarray[
'nbfield'];
2391 if (empty($totalarray[
'totalduration'])) {
2392 $totalarray[
'totalduration'] = $task_time->element_duration;
2394 $totalarray[
'totalduration'] += $task_time->element_duration;
2399 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2400 print
'<td class="nowraponall">';
2401 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2403 print $form->select_produits($task_time->fk_product,
'fk_product',
'1', 0, $projectstatic->thirdparty->price_level, 1, 2,
'', 1, array(), $projectstatic->thirdparty->id,
'None', 0,
'maxwidth500', 0,
'',
null, 1);
2404 } elseif (!empty($task_time->fk_product)) {
2406 $resultFetch = $product->fetch($task_time->fk_product);
2407 if ($resultFetch < 0) {
2410 print $product->getNomUrl(1);
2415 $totalarray[
'nbfield']++;
2420 if (!empty($arrayfields[
'value'][
'checked'])) {
2421 $langs->load(
"salaries");
2422 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2424 print
'<td class="nowraponall right">';
2425 print
'<span class="amount" title="' . $langs->trans(
"THM") .
': ' .
price($task_time->thm) .
'">';
2426 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2430 $totalarray[
'nbfield']++;
2433 $totalarray[
'pos'][$totalarray[
'nbfield']] =
'value';
2435 if (empty($totalarray[
'val'][
'value'])) {
2436 $totalarray[
'val'][
'value'] = $value;
2438 $totalarray[
'val'][
'value'] += $value;
2441 $totalarray[
'totalvaluefield'] = $totalarray[
'nbfield'];
2443 if (empty($totalarray[
'totalvalue'])) {
2444 $totalarray[
'totalvalue'] = $value;
2446 $totalarray[
'totalvalue'] += $value;
2451 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2452 print
'<td class="center">';
2454 if ($projectstatic->usage_bill_time) {
2455 if ($task_time->invoice_id) {
2456 $result = $tmpinvoice->fetch($task_time->invoice_id);
2458 if ($action ==
'editline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2459 print $formproject->selectInvoiceAndLine($task_time->invoice_id, $task_time->invoice_line_id,
'invoiceid',
'invoicelineid',
'maxwidth500', array(
'p.rowid' => $projectstatic->id));
2461 print $tmpinvoice->getNomUrl(1);
2462 if (!empty($task_time->invoice_line_id)) {
2464 $invoiceLine->fetch($task_time->invoice_line_id);
2465 if (!empty($invoiceLine->id)) {
2466 print
'<br>'.$langs->trans(
'Qty').
':'.$invoiceLine->qty;
2467 print
' '.$langs->trans(
'TotalHT').
':'.
price($invoiceLine->total_ht);
2474 if (intval($task_time->billable) == 1) {
2475 print $langs->trans(
"No");
2477 print $langs->trans(
"Disabled");
2481 print
'<span class="opacitymedium">' . $langs->trans(
"NA") .
'</span>';
2486 $totalarray[
'nbfield']++;
2496 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'i' => $i,
'totalarray' => &$totalarray);
2497 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2498 print $hookmanager->resPrint;
2502 print
'<td class="center nowraponall">';
2503 if (($action ==
'editline' || $action ==
'splitline') &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2504 print
'<input type="hidden" name="lineid" value="'.GETPOSTINT(
'lineid').
'">';
2505 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-save" name="save" value="'.$langs->trans(
"Save").
'">';
2507 print
'<input type="submit" class="button buttongen smallpaddingimp margintoponlyshort marginbottomonlyshort button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2508 } elseif ($user->hasRight(
'projet',
'time') || $user->hasRight(
'projet',
'all',
'creer')) {
2509 if (in_array($task_time->fk_user, $childids) || $user->hasRight(
'projet',
'all',
'creer')) {
2510 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' :
'').
'">';
2511 print
img_edit(
'default', 0,
'class="pictofixedwidth paddingleft"');
2515 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' :
'') .
'">';
2516 print
img_split(
'',
'class="pictofixedwidth paddingleft"');
2520 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' :
'').
'">';
2521 print
img_delete(
'default',
'class="pictodelete paddingleft"');
2524 if ($massactionbutton || $massaction) {
2526 if (in_array($task_time->rowid, $arrayofselected)) {
2532 $disabled = (intval($task_time->billable) != 1 || $invoiced);
2533 $ctrl =
'<input '.($disabled ?
'disabled' :
'').
' id="cb' . $task_time->rowid .
'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="' . $task_time->rowid .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
2537 print
'<span id="cbsp'. $task_time->rowid .
'">'.$ctrl.
'</span>';
2538 print
'<script>$("#cbsp' . $task_time->rowid .
'").dblclick(()=>{ $("#cb' . $task_time->rowid .
'").removeAttr("disabled") })</script>';
2547 $totalarray[
'nbfield']++;
2556 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2557 print
'<!-- first line -->';
2558 print
'<tr class="oddeven">';
2566 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2567 print
'<td class="nowrap">';
2568 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2569 if (empty($task_time->element_date_withhour)) {
2570 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 3, 3, 2,
"timespent_date", 1, 0);
2572 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline', 1, 1, 2,
"timespent_date", 1, 0);
2575 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2581 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2582 print
'<td class="nowrap">';
2587 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2588 print
'<td class="nowrap">';
2593 if (!empty($allprojectforuser)) {
2594 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2595 print
'<td class="nowrap">';
2601 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2602 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2603 print
'<td class="nowrap">';
2604 $tasktmp->id = $task_time->fk_element;
2605 $tasktmp->ref = $task_time->ref;
2606 $tasktmp->label = $task_time->label;
2607 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2613 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2614 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2615 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($task_time->label).
'">';
2622 if (!empty($arrayfields[
'author'][
'checked'])) {
2623 print
'<td class="nowraponall">';
2624 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2626 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2629 $contactsoftask =
$object->getListContactId(
'internal');
2630 if (!in_array($task_time->fk_user, $contactsoftask)) {
2631 $contactsoftask[] = $task_time->fk_user;
2633 if (count($contactsoftask) > 0) {
2634 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2635 print $form->select_dolusers($task_time->fk_user,
'userid_line', 0,
'', 0,
'', $contactsoftask);
2637 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2640 $userstatic->id = $task_time->fk_user;
2641 $userstatic->lastname = $task_time->lastname;
2642 $userstatic->firstname = $task_time->firstname;
2643 $userstatic->photo = $task_time->photo;
2644 $userstatic->status = $task_time->user_status;
2645 print $userstatic->getNomUrl(-1);
2651 if (!empty($arrayfields[
't.note'][
'checked'])) {
2652 print
'<td class="tdoverflowmax300">';
2653 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2654 print
'<textarea name="timespent_note_line" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2659 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2660 print
'<input type="hidden" name="timespent_note_line" rows="' . ROWS_2 .
'" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2664 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2665 print
'<td class="right">';
2666 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2667 print
'<input type="hidden" name="old_duration" value="'.$task_time->element_duration.
'">';
2668 print $form->select_duration(
'new_duration', $task_time->element_duration, 0,
'text');
2676 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2677 print
'<td class="nowraponall tdoverflowmax125">';
2682 if (!empty($arrayfields[
'value'][
'checked'])) {
2683 print
'<td class="right">';
2684 print
'<span class="amount">';
2685 $value =
price2num($task_time->thm * $task_time->element_duration / 3600,
'MT', 1);
2686 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2692 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2693 print
'<td class="right">';
2694 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2695 if (isset($task_time->total_ht)) {
2696 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2707 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split1');
2708 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2709 print $hookmanager->resPrint;
2713 print
'<td class="center nowraponall">';
2722 print
'<!-- second line --><tr class="oddeven">';
2726 print
'<td class="center nowraponall">';
2731 if (!empty($arrayfields[
't.element_date'][
'checked'])) {
2732 print
'<td class="nowrap">';
2733 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2734 if (empty($task_time->element_date_withhour)) {
2735 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 3, 3, 2,
"timespent_date", 1, 0);
2737 print $form->selectDate(($date2 ? $date2 : $date1),
'timeline_2', 1, 1, 2,
"timespent_date", 1, 0);
2740 print
dol_print_date(($date2 ? $date2 : $date1), ($task_time->element_date_withhour ?
'dayhour' :
'day'));
2746 if (!empty($arrayfields[
'p.fk_soc'][
'checked'])) {
2747 print
'<td class="nowrap">';
2752 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
2753 print
'<td class="nowrap">';
2758 if (!empty($allprojectforuser)) {
2759 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2760 print
'<td class="nowrap">';
2766 if (!empty($arrayfields[
't.element_ref'][
'checked'])) {
2767 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2768 print
'<td class="nowrap">';
2769 $tasktmp->id = $task_time->fk_element;
2770 $tasktmp->ref = $task_time->ref;
2771 $tasktmp->label = $task_time->label;
2772 print $tasktmp->getNomUrl(1,
'withproject',
'time');
2778 if (!empty($arrayfields[
't.element_label'][
'checked'])) {
2779 if ((empty($id) && empty($ref)) || !empty($projectidforalltimes)) {
2780 print
'<td class="nowrap">';
2787 if (!empty($arrayfields[
'author'][
'checked'])) {
2788 print
'<td class="nowraponall tdoverflowmax100">';
2789 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2791 $idTask = (!empty($id)) ? $id : $task_time->fk_element;
2794 $contactsoftask =
$object->getListContactId(
'internal');
2795 if (!in_array($task_time->fk_user, $contactsoftask)) {
2796 $contactsoftask[] = $task_time->fk_user;
2798 if (count($contactsoftask) > 0) {
2799 print
img_object(
'',
'user',
'class="hideonsmartphone"');
2800 print $form->select_dolusers($task_time->fk_user,
'userid_line_2', 0,
'', 0,
'', $contactsoftask);
2802 print
img_error($langs->trans(
'FirstAddRessourceToAllocateTime')) . $langs->trans(
'FirstAddRessourceToAllocateTime');
2805 $userstatic->id = $task_time->fk_user;
2806 $userstatic->lastname = $task_time->lastname;
2807 $userstatic->firstname = $task_time->firstname;
2808 $userstatic->photo = $task_time->photo;
2809 $userstatic->status = $task_time->user_status;
2810 print $userstatic->getNomUrl(-1);
2816 if (!empty($arrayfields[
't.note'][
'checked'])) {
2817 print
'<td class="small tdoverflowmax300"">';
2818 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2819 print
'<textarea name="timespent_note_line_2" width="95%" rows="' . ROWS_2 .
'">' .
dol_escape_htmltag($task_time->note, 0, 1) .
'</textarea>';
2824 } elseif ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2825 print
'<input type="hidden" name="timespent_note_line_2" value="' .
dol_escape_htmltag($task_time->note, 0, 1) .
'">';
2829 if (!empty($arrayfields[
't.element_duration'][
'checked'])) {
2830 print
'<td class="right">';
2831 if ($action ==
'splitline' &&
GETPOSTINT(
'lineid') == $task_time->rowid) {
2832 print
'<input type="hidden" name="old_duration_2" value="0">';
2833 print $form->select_duration(
'new_duration_2', 0, 0,
'text');
2841 if (!empty($arrayfields[
't.fk_product'][
'checked'])) {
2842 print
'<td class="nowraponall tdoverflowmax125">';
2847 if (!empty($arrayfields[
'value'][
'checked'])) {
2848 print
'<td class="right">';
2849 print
'<span class="amount">';
2851 print
price($value, 1, $langs, 1, -1, -1,
$conf->currency);
2857 if (!empty($arrayfields[
'valuebilled'][
'checked'])) {
2858 print
'<td class="right">';
2859 $valuebilled =
price2num($task_time->total_ht,
'', 1);
2860 if (isset($task_time->total_ht)) {
2861 print
'<span class="amount">';
2862 print
price($valuebilled, 1, $langs, 1, -1, -1,
$conf->currency);
2874 $parameters = array(
'arrayfields' => $arrayfields,
'obj' => $task_time,
'mode' =>
'split2');
2875 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
2876 print $hookmanager->resPrint;
2880 print
'<td class="center nowraponall">';
2892 if (isset($totalarray[
'totaldurationfield']) || isset($totalarray[
'totalvaluefield'])) {
2893 print
'<tr class="liste_total">';
2895 while ($i < $totalarray[
'nbfield']) {
2898 if ($num < $limit && empty($offset)) {
2899 print
'<td class="left">' . $langs->trans(
"Total") .
'</td>';
2901 print
'<td class="left">'.$form->textwithpicto($langs->trans(
"Total"), $langs->trans(
"Totalforthispage")).
'</td>';
2903 } elseif (isset($totalarray[
'totaldurationfield']) && $totalarray[
'totaldurationfield'] == $i) {
2904 print
'<td class="right">' .
convertSecondToTime($totalarray[
'totalduration'],
'allhourmin') .
'</td>';
2905 } elseif (isset($totalarray[
'totalvaluefield']) && $totalarray[
'totalvaluefield'] == $i) {
2906 print
'<td class="right">' .
price($totalarray[
'totalvalue']) .
'</td>';
2915 if (!count($tasks)) {
2916 $totalnboffields = 1;
2917 foreach ($arrayfields as $value) {
2918 if (!empty($value[
'checked'])) {
2922 print
'<tr class="oddeven"><td colspan="' . $totalnboffields .
'">';
2923 print
'<span class="opacitymedium">' . $langs->trans(
"None") .
'</span>';
2927 $parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
2928 $reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
2929 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage invoices.
Class to manage invoice lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
task_prepare_head($object)
Prepare array with list of tabs.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.