31require
"../../main.inc.php";
32require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcategory.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/lib/project.lib.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
36require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
40$langs->loadLangs(array(
'projects',
'users',
'companies'));
42$action =
GETPOST(
'action',
'aZ09');
43$massaction =
GETPOST(
'massaction',
'alpha');
45$confirm =
GETPOST(
'confirm',
'alpha');
46$toselect =
GETPOST(
'toselect',
'array');
47$optioncss =
GETPOST(
'optioncss',
'aZ09');
52$search_all = trim((
GETPOST(
'search_all',
'alphanohtml') !=
'') ?
GETPOST(
'search_all',
'alphanohtml') :
GETPOST(
'sall',
'alphanohtml'));
53$search_categ =
GETPOST(
"search_categ",
'intcomma');
54$search_projectstatus =
GETPOST(
'search_projectstatus',
'intcomma');
55$search_project_ref =
GETPOST(
'search_project_ref');
56$search_project_title =
GETPOST(
'search_project_title');
57$search_task_ref =
GETPOST(
'search_task_ref');
58$search_task_label =
GETPOST(
'search_task_label');
59$search_task_description =
GETPOST(
'search_task_description');
60$search_task_ref_parent =
GETPOST(
'search_task_ref_parent');
61$search_project_user =
GETPOST(
'search_project_user',
'intcomma');
62$search_task_user =
GETPOST(
'search_task_user',
'intcomma');
63$search_task_progress =
GETPOST(
'search_task_progress');
64$search_task_budget_amount =
GETPOST(
'search_task_budget_amount');
65$search_societe =
GETPOST(
'search_societe');
66$search_societe_alias =
GETPOST(
'search_societe_alias');
67$search_opp_status =
GETPOST(
"search_opp_status",
'alpha');
68$searchCategoryCustomerOperator = 0;
69if (GETPOSTISSET(
'formfilteraction')) {
70 $searchCategoryCustomerOperator =
GETPOSTINT(
'search_category_customer_operator');
74$searchCategoryCustomerList =
GETPOST(
'search_category_customer_list',
'array');
76if (!isset($search_projectstatus) || $search_projectstatus ===
'') {
77 if ($search_all !=
'') {
78 $search_projectstatus = -1;
80 $search_projectstatus = 1;
84$mine =
GETPOST(
'mode',
'alpha') ==
'mine' ? 1 : 0;
86 $search_task_user = $user->id;
91$search_date_startday =
GETPOSTINT(
'search_date_startday');
92$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
93$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
94$search_date_endday =
GETPOSTINT(
'search_date_endday');
95$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
96$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
97$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
98$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
99$search_datelimit_startday =
GETPOSTINT(
'search_datelimit_startday');
100$search_datelimit_startmonth =
GETPOSTINT(
'search_datelimit_startmonth');
101$search_datelimit_startyear =
GETPOSTINT(
'search_datelimit_startyear');
102$search_datelimit_endday =
GETPOSTINT(
'search_datelimit_endday');
103$search_datelimit_endmonth =
GETPOSTINT(
'search_datelimit_endmonth');
104$search_datelimit_endyear =
GETPOSTINT(
'search_datelimit_endyear');
105$search_datelimit_start =
dol_mktime(0, 0, 0, $search_datelimit_startmonth, $search_datelimit_startday, $search_datelimit_startyear);
106$search_datelimit_end =
dol_mktime(23, 59, 59, $search_datelimit_endmonth, $search_datelimit_endday, $search_datelimit_endyear);
109$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'tasklist';
113$hookmanager->initHooks(array(
'tasklist'));
117$extrafields->fetch_name_optionals_label(
$object->table_element);
118$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
123if (!$user->hasRight(
'projet',
'lire')) {
127$diroutputmassaction = $conf->project->dir_output.
'/tasks/temp/massgeneration/'.$user->id;
130$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
131$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
133if (empty($page) || $page < 0 ||
GETPOST(
'button_search',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
137$offset = $limit * $page;
138$pageprev = $page - 1;
139$pagenext = $page + 1;
141 $sortfield =
'p.ref';
148$fieldstosearchall = array(
150 't.label' =>
"Label",
151 't.description' =>
"Description",
152 't.note_public' =>
"NotePublic",
154if (empty($user->socid)) {
155 $fieldstosearchall[
't.note_private'] =
"NotePrivate";
159 't.ref' => array(
'label' =>
"RefTask",
'checked' => 1,
'position' => 50),
160 't.fk_task_parent' => array(
'label' =>
"RefTaskParent",
'checked' => 0,
'position' => 70),
161 't.label' => array(
'label' =>
"LabelTask",
'checked' => 1,
'position' => 75),
162 't.description' => array(
'label' =>
"Description",
'checked' => 0,
'position' => 80),
163 't.dateo' => array(
'label' =>
"DateStart",
'checked' => 1,
'position' => 100),
164 't.datee' => array(
'label' =>
"Deadline",
'checked' => 1,
'position' => 101),
165 'p.ref' => array(
'label' =>
"ProjectRef",
'checked' => 1,
'position' => 151),
166 'p.title' => array(
'label' =>
"ProjectLabel",
'checked' => 0,
'position' => 152),
167 's.nom' => array(
'label' =>
"ThirdParty",
'checked' => -1,
'csslist' =>
'tdoverflowmax125',
'position' => 200),
168 's.name_alias' => array(
'label' =>
"AliasNameShort",
'checked' => 0,
'csslist' =>
'tdoverflowmax125',
'position' => 201),
169 'p.fk_statut' => array(
'label' =>
"ProjectStatus",
'checked' => 1,
'position' => 205),
170 't.planned_workload' => array(
'label' =>
"PlannedWorkload",
'checked' => 1,
'position' => 302),
171 't.duration_effective' => array(
'label' =>
"TimeSpent",
'checked' => 1,
'position' => 303),
172 't.progress_calculated' => array(
'label' =>
"ProgressCalculated",
'checked' => -1,
'position' => 304),
173 't.progress' => array(
'label' =>
"ProgressDeclared",
'checked' => 1,
'position' => 305),
174 't.progress_summary' => array(
'label' =>
"TaskProgressSummary",
'checked' => 1,
'position' => 306),
175 't.budget_amount' => array(
'label' =>
"Budget",
'checked' => 0,
'position' => 307),
176 't.tobill' => array(
'label' =>
"TimeToBill",
'checked' => 0,
'position' => 310),
177 't.billed' => array(
'label' =>
"TimeBilled",
'checked' => 0,
'position' => 311),
178 't.datec' => array(
'label' =>
"DateCreation",
'checked' => 0,
'position' => 500),
179 't.tms' => array(
'label' =>
"DateModificationShort",
'checked' => 0,
'position' => 501),
183include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_array_fields.tpl.php';
187'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields';
189$permissiontoread = $user->hasRight(
'projet',
'lire');
190$permissiontocreate = $user->hasRight(
'projet',
'creer');
191$permissiontodelete = $user->hasRight(
'projet',
'supprimer');
193if (!$permissiontoread) {
202if (
GETPOST(
'cancel',
'alpha')) {
206if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
210$parameters = array(
'socid' => $socid);
211$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
216if (empty($reshook)) {
218 include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
221 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
224 $search_projectstatus = -1;
225 $search_project_ref =
"";
226 $search_societe =
"";
227 $search_societe_alias =
"";
228 $search_project_title =
"";
229 $search_task_ref =
"";
230 $search_task_label =
"";
231 $search_task_description =
"";
232 $search_task_ref_parent =
"";
233 $search_task_progress =
"";
234 $search_task_budget_amount =
"";
235 $search_task_user = -1;
236 $search_project_user = -1;
237 $search_date_startday =
'';
238 $search_date_startmonth =
'';
239 $search_date_startyear =
'';
240 $search_date_endday =
'';
241 $search_date_endmonth =
'';
242 $search_date_endyear =
'';
243 $search_date_start =
'';
244 $search_date_end =
'';
245 $search_datelimit_startday =
'';
246 $search_datelimit_startmonth =
'';
247 $search_datelimit_startyear =
'';
248 $search_datelimit_endday =
'';
249 $search_datelimit_endmonth =
'';
250 $search_datelimit_endyear =
'';
251 $search_datelimit_start =
'';
252 $search_datelimit_end =
'';
254 $searchCategoryCustomerList = array();
255 $search_array_options = array();
259 $objectclass =
'Task';
260 $objectlabel =
'Tasks';
261 $uploaddir = $conf->project->dir_output.
'/tasks';
262 include DOL_DOCUMENT_ROOT.
'/core/actions_massactions.inc.php';
265if (empty($search_projectstatus) && $search_projectstatus ==
'') {
266 $search_projectstatus = 1;
273$form =
new Form($db);
276$projectstatic =
new Project($db);
277$puser =
new User($db);
278$tuser =
new User($db);
282$title = $langs->trans(
"Activities");
283$help_url =
"EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos";
287if ($search_project_user > 0) {
288 $puser->fetch($search_project_user);
290if ($search_task_user > 0) {
291 $tuser->fetch($search_task_user);
295$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
296$selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
300 $projectstatic->fetch($id);
301 $projectstatic->fetch_thirdparty();
305if (!$user->hasRight(
'projet',
'all',
'lire')) {
306 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1, $socid);
311$listofprojectcontacttype = array();
312$sql =
"SELECT ctc.rowid, ctc.code FROM ".MAIN_DB_PREFIX.
"c_type_contact as ctc";
313$sql .=
" WHERE ctc.element = '".$db->escape($projectstatic->element).
"'";
314$sql .=
" AND ctc.source = 'internal'";
315$resql = $db->query($sql);
317 while ($obj = $db->fetch_object($resql)) {
318 $listofprojectcontacttype[$obj->rowid] = $obj->code;
323if (count($listofprojectcontacttype) == 0) {
324 $listofprojectcontacttype[0] =
'0';
327$listoftaskcontacttype = array();
328$sql =
"SELECT ctc.rowid, ctc.code FROM ".MAIN_DB_PREFIX.
"c_type_contact as ctc";
329$sql .=
" WHERE ctc.element = '".$db->escape(
$object->element).
"'";
330$sql .=
" AND ctc.source = 'internal'";
331$resql = $db->query($sql);
333 while ($obj = $db->fetch_object($resql)) {
334 $listoftaskcontacttype[$obj->rowid] = $obj->code;
339if (count($listoftaskcontacttype) == 0) {
340 $listoftaskcontacttype[0] =
'0';
345$distinct =
'DISTINCT';
346$sql =
"SELECT ".$distinct.
" p.rowid as projectid, p.ref as projectref, p.title as projecttitle, p.fk_statut as projectstatus, p.datee as projectdatee, p.fk_opp_status, p.public, p.fk_user_creat as projectusercreate, p.usage_bill_time,";
347$sql .=
" s.nom as name, s.name_alias as alias, s.rowid as socid,";
348$sql .=
" t.datec as date_creation, t.dateo as date_start, t.datee as date_end, t.tms as date_modification,";
349$sql .=
" t.rowid as id, t.ref, t.label, t.planned_workload, t.duration_effective, t.progress, t.fk_statut as status,";
350$sql .=
" t.description, t.fk_task_parent, t.budget_amount";
352if (!empty($arrayfields[
't.tobill'][
'checked']) || !empty($arrayfields[
't.billed'][
'checked'])) {
353 $sql .=
" , SUM(tt.element_duration * ".$db->ifsql(
"invoice_id IS NULL",
"1",
"0").
") as tobill, SUM(tt.element_duration * ".$db->ifsql(
"invoice_id IS NULL",
"0",
"1").
") as billed";
356if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
357 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
358 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
362$parameters = array();
363$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters, $object, $action);
364$sql .= $hookmanager->resPrint;
365$sql = preg_replace(
'/,\s*$/',
'', $sql);
369$sql .=
" FROM ".MAIN_DB_PREFIX.
"projet as p";
370$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s on p.fk_soc = s.rowid";
371$sql .=
", ".MAIN_DB_PREFIX.
"projet_task as t";
372if (!empty($arrayfields[
't.tobill'][
'checked']) || !empty($arrayfields[
't.billed'][
'checked'])) {
373 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"element_time as tt ON (tt.fk_element = t.rowid AND tt.elementtype = 'task')";
375if (isset($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label'])) {
376 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element.
"_extrafields as ef on (t.rowid = ef.fk_object)";
378if ($search_project_user > 0) {
379 $sql .=
", ".MAIN_DB_PREFIX.
"element_contact as ecp";
381if ($search_task_user > 0) {
382 $sql .=
", ".MAIN_DB_PREFIX.
"element_contact as ect";
384$sql .=
" WHERE t.fk_projet = p.rowid";
385$sql .=
" AND p.entity IN (".getEntity(
'project').
')';
386if (!$user->hasRight(
'projet',
'all',
'lire')) {
387 $sql .=
" AND p.rowid IN (".$db->sanitize($projectsListId ? $projectsListId :
'0').
")";
389if (is_object($projectstatic) && $projectstatic->id > 0) {
390 $sql .=
" AND p.rowid = ".((int) $projectstatic->id);
394 $sql .=
" AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).
")";
396if ($search_project_ref) {
399if ($search_project_title) {
402if ($search_task_ref) {
405if ($search_task_label) {
408if ($search_task_description) {
409 $sql .=
natural_search(
't.description', $search_task_description);
411if ($search_task_ref_parent) {
412 $sql .=
' AND t.fk_task_parent IN (SELECT ipt.rowid FROM '.MAIN_DB_PREFIX.
'projet_task as ipt WHERE '.
natural_search(
'ipt.ref', $search_task_ref_parent, 0, 1).
')';
414if ($search_task_progress) {
417if ($search_task_budget_amount) {
418 $sql .=
natural_search(
't.budget_amount', $search_task_budget_amount, 1);
420if (empty($arrayfields[
's.name_alias'][
'checked']) && $search_societe) {
421 $sql .=
natural_search(array(
"s.nom",
"s.name_alias"), $search_societe);
423 if ($search_societe) {
426 if ($search_societe_alias) {
430if ($search_date_start) {
431 $sql .=
" AND t.dateo >= '".$db->idate($search_date_start).
"'";
433if ($search_date_end) {
434 $sql .=
" AND t.dateo <= '".$db->idate($search_date_end).
"'";
436if ($search_datelimit_start) {
437 $sql .=
" AND t.datee >= '".$db->idate($search_datelimit_start).
"'";
439if ($search_datelimit_end) {
440 $sql .=
" AND t.datee <= '".$db->idate($search_datelimit_end).
"'";
443 $sql .=
natural_search(array_keys($fieldstosearchall), $search_all);
445if ($search_projectstatus >= 0) {
446 if ($search_projectstatus == 99) {
447 $sql .=
" AND p.fk_statut <> 2";
449 $sql .=
" AND p.fk_statut = ".((int) $search_projectstatus);
452if ($search_project_user > 0) {
453 $sql .=
" AND ecp.fk_c_type_contact IN (".$db->sanitize(implode(
',', array_keys($listofprojectcontacttype))).
") AND ecp.element_id = p.rowid AND ecp.fk_socpeople = ".((int) $search_project_user);
455if ($search_task_user > 0) {
456 $sql .=
" AND ect.fk_c_type_contact IN (".$db->sanitize(implode(
',', array_keys($listoftaskcontacttype))).
") AND ect.element_id = t.rowid AND ect.fk_socpeople = ".((int) $search_task_user);
459$searchCategoryProjectList = array($search_categ);
460$searchCategoryProjectOperator = 0;
461if (!empty($searchCategoryProjectList)) {
462 $searchCategoryProjectSqlList = array();
463 $listofcategoryid =
'';
464 foreach ($searchCategoryProjectList as $searchCategoryProject) {
465 if (intval($searchCategoryProject) == -2) {
466 $searchCategoryProjectSqlList[] =
"NOT EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX.
"categorie_project as ck WHERE p.rowid = ck.fk_project)";
467 } elseif (intval($searchCategoryProject) > 0) {
468 if ($searchCategoryProjectOperator == 0) {
469 $searchCategoryProjectSqlList[] =
" EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX.
"categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie = ".((int) $searchCategoryProject).
")";
471 $listofcategoryid .= ($listofcategoryid ?
', ' :
'') .((
int) $searchCategoryProject);
475 if ($listofcategoryid) {
476 $searchCategoryProjectSqlList[] =
" EXISTS (SELECT ck.fk_project FROM ".MAIN_DB_PREFIX.
"categorie_project as ck WHERE p.rowid = ck.fk_project AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid).
"))";
478 if ($searchCategoryProjectOperator == 1) {
479 if (!empty($searchCategoryProjectSqlList)) {
480 $sql .=
" AND (".implode(
' OR ', $searchCategoryProjectSqlList).
")";
483 if (!empty($searchCategoryProjectSqlList)) {
484 $sql .=
" AND (".implode(
' AND ', $searchCategoryProjectSqlList).
")";
488$searchCategoryCustomerSqlList = array();
489if ($searchCategoryCustomerOperator == 1) {
490 $existsCategoryCustomerList = array();
491 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
492 if (intval($searchCategoryCustomer) == -2) {
493 $sqlCategoryCustomerNotExists =
" NOT EXISTS (";
494 $sqlCategoryCustomerNotExists .=
" SELECT cat_cus.fk_soc";
495 $sqlCategoryCustomerNotExists .=
" FROM ".$db->prefix().
"categorie_societe AS cat_cus";
496 $sqlCategoryCustomerNotExists .=
" WHERE cat_cus.fk_soc = p.fk_soc";
497 $sqlCategoryCustomerNotExists .=
" )";
498 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerNotExists;
499 } elseif (intval($searchCategoryCustomer) > 0) {
500 $existsCategoryCustomerList[] = $db->escape($searchCategoryCustomer);
503 if (!empty($existsCategoryCustomerList)) {
504 $sqlCategoryCustomerExists =
" EXISTS (";
505 $sqlCategoryCustomerExists .=
" SELECT cat_cus.fk_soc";
506 $sqlCategoryCustomerExists .=
" FROM ".$db->prefix().
"categorie_societe AS cat_cus";
507 $sqlCategoryCustomerExists .=
" WHERE cat_cus.fk_soc = p.fk_soc";
508 $sqlCategoryCustomerExists .=
" AND cat_cus.fk_categorie IN (".$db->sanitize(implode(
',', $existsCategoryCustomerList)).
")";
509 $sqlCategoryCustomerExists .=
" )";
510 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerExists;
512 if (!empty($searchCategoryCustomerSqlList)) {
513 $sql .=
" AND (".implode(
' OR ', $searchCategoryCustomerSqlList).
")";
516 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
517 if (intval($searchCategoryCustomer) == -2) {
518 $sqlCategoryCustomerNotExists =
" NOT EXISTS (";
519 $sqlCategoryCustomerNotExists .=
" SELECT cat_cus.fk_soc";
520 $sqlCategoryCustomerNotExists .=
" FROM ".$db->prefix().
"categorie_societe AS cat_cus";
521 $sqlCategoryCustomerNotExists .=
" WHERE cat_cus.fk_soc = p.fk_soc";
522 $sqlCategoryCustomerNotExists .=
" )";
523 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerNotExists;
524 } elseif (intval($searchCategoryCustomer) > 0) {
525 $searchCategoryCustomerSqlList[] =
"p.fk_soc IN (SELECT fk_soc FROM ".$db->prefix().
"categorie_societe WHERE fk_categorie = ".((int) $searchCategoryCustomer).
")";
528 if (!empty($searchCategoryCustomerSqlList)) {
529 $sql .=
" AND (".implode(
' AND ', $searchCategoryCustomerSqlList).
")";
533include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
535$parameters = array();
536$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $object, $action);
537$sql .= $hookmanager->resPrint;
538if (!empty($arrayfields[
't.tobill'][
'checked']) || !empty($arrayfields[
't.billed'][
'checked'])) {
539 $sql .=
" GROUP BY p.rowid, p.ref, p.title, p.fk_statut, p.datee, p.fk_opp_status, p.public, p.fk_user_creat,";
540 $sql .=
" s.nom, s.rowid,";
541 $sql .=
" t.datec, t.dateo, t.datee, t.tms,";
542 $sql .=
" t.rowid, t.ref, t.label, t.planned_workload, t.duration_effective, t.progress,t.budget_amount, t.fk_statut as status";
544 if (!empty($extrafields->attributes[
$object->table_element][
'label'])) {
545 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
546 $sql .= ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key :
'');
552$nbtotalofrecords =
'';
555 $sqlforcount = preg_replace(
'/^'.preg_quote($sqlfields,
'/').
'/',
'SELECT COUNT(*) as nbtotalofrecords', $sql);
556 $sqlforcount = preg_replace(
'/GROUP BY .*$/',
'', $sqlforcount);
557 $resql = $db->query($sqlforcount);
559 $objforcount = $db->fetch_object($resql);
560 $nbtotalofrecords = $objforcount->nbtotalofrecords;
565 if (($page * $limit) > $nbtotalofrecords) {
573$sql .= $db->order($sortfield, $sortorder);
575 $sql .= $db->plimit($limit + 1, $offset);
578$resql = $db->query($sql);
584$num = $db->num_rows($resql);
588if ($num == 1 &&
getDolGlobalString(
'MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
589 $obj = $db->fetch_object($resql);
591 header(
"Location: ".DOL_URL_ROOT.
'/projet/tasks/task.php?id='.$id.
'&withproject=1');
599llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs, $morecss,
'',
'bodyforlist');
601$arrayofselected = is_array($toselect) ? $toselect : array();
605 $param .=
'&mode='.urlencode($mode);
607if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
608 $param .=
'&contextpage='.urlencode($contextpage);
610if ($limit > 0 && $limit != $conf->liste_limit) {
611 $param .=
'&limit='.((int) $limit);
613if ($search_date_startday) {
614 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
616if ($search_date_startmonth) {
617 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
619if ($search_date_startyear) {
620 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
622if ($search_date_endday) {
623 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
625if ($search_date_endmonth) {
626 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
628if ($search_date_endyear) {
629 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
631if ($search_datelimit_startday) {
632 $param .=
'&search_datelimit_startday='.urlencode((
string) ($search_datelimit_startday));
634if ($search_datelimit_startmonth) {
635 $param .=
'&search_datelimit_startmonth='.urlencode((
string) ($search_datelimit_startmonth));
637if ($search_datelimit_startyear) {
638 $param .=
'&search_datelimit_startyear='.urlencode((
string) ($search_datelimit_startyear));
640if ($search_datelimit_endday) {
641 $param .=
'&search_datelimit_endday='.urlencode((
string) ($search_datelimit_endday));
643if ($search_datelimit_endmonth) {
644 $param .=
'&search_datelimit_endmonth='.urlencode((
string) ($search_datelimit_endmonth));
646if ($search_datelimit_endyear) {
647 $param .=
'&search_datelimit_endyear='.urlencode((
string) ($search_datelimit_endyear));
649if ($search_task_budget_amount) {
650 $param .=
'&search_task_budget_amount='.urlencode($search_task_budget_amount);
653 $param .=
'&socid='.urlencode($socid);
655if ($search_all !=
'') {
656 $param .=
'&search_all='.urlencode($search_all);
658if ($search_project_ref !=
'') {
659 $param .=
'&search_project_ref='.urlencode($search_project_ref);
661if ($search_project_title !=
'') {
662 $param .=
'&search_project_title='.urlencode($search_project_title);
664if ($search_task_ref !=
'') {
665 $param .=
'&search_task_ref='.urlencode($search_task_ref);
667if ($search_task_label !=
'') {
668 $param .=
'&search_task_label='.urlencode($search_task_label);
670if ($search_task_description !=
'') {
671 $param .=
'&search_task_description='.urlencode($search_task_description);
673if ($search_task_ref_parent !=
'') {
674 $param .=
'&search_task_ref_parent='.urlencode($search_task_ref_parent);
676if ($search_task_progress !=
'') {
677 $param .=
'&search_task_progress='.urlencode($search_task_progress);
679if ($search_societe !=
'') {
680 $param .=
'&search_societe='.urlencode($search_societe);
682if ($search_societe !=
'') {
683 $param .=
'&search_societe_alias='.urlencode($search_societe_alias);
685if ($search_projectstatus !=
'') {
686 $param .=
'&search_projectstatus='.urlencode($search_projectstatus);
688if ((is_numeric($search_opp_status) && $search_opp_status >= 0) || in_array($search_opp_status, array(
'all',
'none'))) {
689 $param .=
'&search_opp_status='.urlencode($search_opp_status);
691if ($search_project_user !=
'') {
692 $param .=
'&search_project_user='.urlencode((
string) ($search_project_user));
694if ($search_task_user > 0) {
695 $param .=
'&search_task_user='.urlencode($search_task_user);
697if ($optioncss !=
'') {
698 $param .=
'&optioncss='.urlencode($optioncss);
700foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
701 $param .=
"&search_category_customer_list[]=".urlencode($searchCategoryCustomer);
704include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
706$parameters = array(
'param' => &$param);
707$reshook = $hookmanager->executeHooks(
'printFieldListSearchParam', $parameters, $object, $action);
708$param .= $hookmanager->resPrint;
711$arrayofmassactions = array(
716if (!empty($permissiontodelete)) {
717 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
719if (
GETPOSTINT(
'nomassaction') || in_array($massaction, array(
'presend',
'predelete'))) {
720 $arrayofmassactions = array();
722$massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
724print
'<form method="POST" id="searchFormList" action="'.$_SERVER[
"PHP_SELF"].
'">'.
"\n";
725if ($optioncss !=
'') {
726 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
728print
'<input type="hidden" name="token" value="'.newToken().
'">';
729print
'<input type="hidden" name="action" value="list">';
730print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
731print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
732print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
733print
'<input type="hidden" name="page" value="'.$page.
'">';
735 print
'<input type="hidden" name="type" value="'.$type.
'">';
737print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
738print
'<input type="hidden" name="page_y" value="">';
739print
'<input type="hidden" name="mode" value="'.$mode.
'">';
744$newcardbutton .=
dolGetButtonTitle($langs->trans(
'ViewList'),
'',
'fa fa-bars imgforviewmode', $_SERVER[
"PHP_SELF"].
'?mode=common'.preg_replace(
'/(&|\?)*mode=[^&]+/',
'', $param),
'', ((empty($mode) || $mode ==
'common') ? 2 : 1), array(
'morecss' =>
'reposition'));
745$newcardbutton .=
dolGetButtonTitle($langs->trans(
'ViewKanban'),
'',
'fa fa-th-list imgforviewmode', $_SERVER[
"PHP_SELF"].
'?mode=kanban'.preg_replace(
'/(&|\?)*mode=[^&]+/',
'', $param),
'', ($mode ==
'kanban' ? 2 : 1), array(
'morecss' =>
'reposition'));
747$newcardbutton .=
dolGetButtonTitle($langs->trans(
'NewTask'),
'',
'fa fa-plus-circle', DOL_URL_ROOT.
'/projet/tasks.php?action=create&backtopage='.urlencode(DOL_URL_ROOT.
'/projet/tasks/list.php'),
'', $permissiontocreate);
752if ($search_task_user == $user->id) {
753 $texthelp .= $langs->trans(
"MyTasksDesc");
755 if ($user->hasRight(
'projet',
'all',
'lire') && !$socid) {
756 $texthelp .= $langs->trans(
"TasksOnProjectsDesc");
758 $texthelp .= $langs->trans(
"TasksOnProjectsPublicDesc");
762print_barre_liste($form->textwithpicto($title, $texthelp), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'projecttask', 0, $newcardbutton,
'', $limit, 0, 0, 1);
764$topicmail =
"Information";
766$objecttmp =
new Task($db);
767$trackid =
'tas'.$object->id;
768include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
772 foreach ($fieldstosearchall as $key => $val) {
773 $fieldstosearchall[$key] = $langs->trans($val);
774 $setupstring .= $key.
"=".$val.
";";
776 print
'<!-- Search done like if TASK_QUICKSEARCH_ON_FIELDS = '.$setupstring.
' -->'.
"\n";
777 print
'<div class="divsearchfieldfilter">'.$langs->trans(
"FilterOnInto", $search_all).implode(
', ', $fieldstosearchall).
'</div>'.
"\n";
783if (isModEnabled(
'category') && $user->hasRight(
'categorie',
'lire')) {
784 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
785 $moreforfilter .=
'<div class="divsearchfield">';
786 $tmptitle = $langs->trans(
'ProjectCategories');
787 $moreforfilter .=
img_picto($tmptitle,
'category',
'class="pictofixedwidth"').$formother->select_categories(
'project', $search_categ,
'search_categ', 1, $tmptitle,
'maxwidth300');
788 $moreforfilter .=
'</div>';
792$moreforfilter .=
'<div class="divsearchfield">';
793$tmptitle = $langs->trans(
'ProjectsWithThisUserAsContact');
795if (!$user->hasRight(
'user',
'user',
'lire')) {
796 $includeonly = array($user->id);
798$moreforfilter .=
img_picto($tmptitle,
'user',
'class="pictofixedwidth"').$form->select_dolusers($search_project_user ? $search_project_user :
'',
'search_project_user', $tmptitle,
'', 0, $includeonly,
'', 0, 0, 0,
'', 0,
'',
'maxwidth250');
799$moreforfilter .=
'</div>';
802$moreforfilter .=
'<div class="divsearchfield">';
803$tmptitle = $langs->trans(
'TasksWithThisUserAsContact');
805if (!$user->hasRight(
'user',
'user',
'lire')) {
806 $includeonly = array($user->id);
808$moreforfilter .=
img_picto($tmptitle,
'user',
'class="pictofixedwidth"').$form->select_dolusers($search_task_user,
'search_task_user', $tmptitle,
'', 0, $includeonly,
'', 0, 0, 0,
'', 0,
'',
'maxwidth250');
809$moreforfilter .=
'</div>';
812if (
getDolGlobalString(
'MAIN_SEARCH_CATEGORY_CUSTOMER_ON_TASK_LIST') && isModEnabled(
"category") && $user->hasRight(
'categorie',
'lire')) {
814 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_CUSTOMER, $searchCategoryCustomerList,
'minwidth300', $searchCategoryCustomerList ? $searchCategoryCustomerList : 0);
828if (!empty($moreforfilter)) {
829 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
830 print $moreforfilter;
831 $parameters = array();
832 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action);
833 print $hookmanager->resPrint;
837$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
838$htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
839$selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
840$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
842print
'<div class="div-table-responsive">';
843print
'<table class="tagtable nobottomiftotal liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'" id="tablelines3">'.
"\n";
847print
'<tr class="liste_titre_filter">';
850 print
'<td class="liste_titre center maxwidthsearch">';
851 $searchpicto = $form->showFilterButtons(
'left');
855if (!empty($arrayfields[
't.ref'][
'checked'])) {
856 print
'<td class="liste_titre">';
857 print
'<input type="text" class="flat" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).
'" size="4">';
860if (!empty($arrayfields[
't.fk_task_parent'][
'checked'])) {
861 print
'<td class="liste_titre">';
862 print
'<input type="text" class="flat" name="search_task_ref_parent" value="'.dol_escape_htmltag($search_task_ref_parent).
'" size="4">';
865if (!empty($arrayfields[
't.label'][
'checked'])) {
866 print
'<td class="liste_titre">';
867 print
'<input type="text" class="flat" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'" size="8">';
871if (!empty($arrayfields[
't.description'][
'checked'])) {
872 print
'<td class="liste_titre">';
873 print
'<input type="text" class="flat" name="search_task_description" value="'.dol_escape_htmltag($search_task_description).
'" size="8">';
877if (!empty($arrayfields[
't.dateo'][
'checked'])) {
878 print
'<td class="liste_titre center">';
879 print
'<div class="nowrapfordate">';
880 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
882 print
'<div class="nowrapfordate">';
883 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
888if (!empty($arrayfields[
't.datee'][
'checked'])) {
889 print
'<td class="liste_titre center">';
890 print
'<div class="nowrapfordate">';
891 print $form->selectDate($search_datelimit_start ? $search_datelimit_start : -1,
'search_datelimit_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
893 print
'<div class="nowrapfordate">';
894 print $form->selectDate($search_datelimit_end ? $search_datelimit_end : -1,
'search_datelimit_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
900if (!empty($arrayfields[
'p.ref'][
'checked'])) {
901 print
'<td class="liste_titre">';
902 print
'<input type="text" class="flat" name="search_project_ref" value="'.$search_project_ref.
'" size="4">';
905if (!empty($arrayfields[
'p.title'][
'checked'])) {
906 print
'<td class="liste_titre">';
907 print
'<input type="text" class="flat" name="search_project_title" value="'.$search_project_title.
'" size="6">';
910if (!empty($arrayfields[
's.nom'][
'checked'])) {
911 print
'<td class="liste_titre">';
912 print
'<input type="text" class="flat" name="search_societe" value="'.dol_escape_htmltag($search_societe).
'" size="4">';
915if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
916 print
'<td class="liste_titre">';
917 print
'<input type="text" class="flat" name="search_societe_alias" value="'.dol_escape_htmltag($search_societe_alias).
'" size="4">';
920if (!empty($arrayfields[
'p.fk_statut'][
'checked'])) {
921 print
'<td class="liste_titre center">';
922 $arrayofstatus = array();
923 foreach ($projectstatic->labelStatusShort as $key => $val) {
924 $arrayofstatus[$key] = $langs->trans($val);
926 $arrayofstatus[
'99'] = $langs->trans(
"NotClosed").
' ('.$langs->trans(
'Draft').
'+'.$langs->trans(
'Opened').
')';
927 print $form->selectarray(
'search_projectstatus', $arrayofstatus, $search_projectstatus, 1, 0, 0,
'', 0, 0, 0,
'',
'maxwidth100');
930if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
931 print
'<td class="liste_titre"></td>';
933if (!empty($arrayfields[
't.duration_effective'][
'checked'])) {
934 print
'<td class="liste_titre"></td>';
936if (!empty($arrayfields[
't.progress_calculated'][
'checked'])) {
937 print
'<td class="liste_titre"></td>';
939if (!empty($arrayfields[
't.progress'][
'checked'])) {
940 print
'<td class="liste_titre center">';
941 print
'<input type="text" class="flat" name="search_task_progress" value="'.$search_task_progress.
'" size="4">';
945if (!empty($arrayfields[
't.progress_summary'][
'checked'])) {
946 print
'<td class="liste_titre"></td>';
949if (!empty($arrayfields[
't.budget_amount'][
'checked'])) {
950 print
'<td class="liste_titre center">';
951 print
'<input type="text" class="flat" name="search_task_budget_amount" value="'.$search_task_budget_amount.
'" size="4">';
955if (!empty($arrayfields[
't.tobill'][
'checked'])) {
956 print
'<td class="liste_titre"></td>';
958if (!empty($arrayfields[
't.billed'][
'checked'])) {
959 print
'<td class="liste_titre"></td>';
962include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
964$parameters = array(
'arrayfields' => $arrayfields);
965$reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters, $object, $action);
966print $hookmanager->resPrint;
967if (!empty($arrayfields[
't.datec'][
'checked'])) {
969 print
'<td class="liste_titre">';
972if (!empty($arrayfields[
't.tms'][
'checked'])) {
974 print
'<td class="liste_titre">';
979 print
'<td class="liste_titre center maxwidthsearch">';
980 $searchpicto = $form->showFilterButtons();
990 't.planned_workload' => 0,
991 't.duration_effective' => 0,
993 't.budget_amount' => 0,
995 'totalplannedworkload' => 0,
996 'totaldurationeffective' => 0,
997 'totaldurationdeclared' => 0,
998 'totaltobillfield' => 0,
999 'totalbilledfield' => 0,
1000 'totalbudget_amountfield' => 0,
1001 'totalbudgetamount' => 0,
1005 'totalizable' => [],
1010print
'<tr class="liste_titre">';
1013 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1014 $totalarray[
'nbfield']++;
1016if (!empty($arrayfields[
't.ref'][
'checked'])) {
1017 print_liste_field_titre($arrayfields[
't.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"t.ref",
"", $param,
"", $sortfield, $sortorder);
1018 $totalarray[
'nbfield']++;
1020if (!empty($arrayfields[
't.fk_task_parent'][
'checked'])) {
1021 print_liste_field_titre($arrayfields[
't.fk_task_parent'][
'label'], $_SERVER[
"PHP_SELF"],
"t.fk_task_parent",
"", $param,
"", $sortfield, $sortorder);
1022 $totalarray[
'nbfield']++;
1024if (!empty($arrayfields[
't.label'][
'checked'])) {
1025 print_liste_field_titre($arrayfields[
't.label'][
'label'], $_SERVER[
"PHP_SELF"],
"t.label",
"", $param,
"", $sortfield, $sortorder);
1026 $totalarray[
'nbfield']++;
1028if (!empty($arrayfields[
't.description'][
'checked'])) {
1029 print_liste_field_titre($arrayfields[
't.description'][
'label'], $_SERVER[
"PHP_SELF"],
"t.description",
"", $param,
"", $sortfield, $sortorder);
1030 $totalarray[
'nbfield']++;
1032if (!empty($arrayfields[
't.dateo'][
'checked'])) {
1033 print_liste_field_titre($arrayfields[
't.dateo'][
'label'], $_SERVER[
"PHP_SELF"],
"t.dateo",
"", $param,
'', $sortfield, $sortorder,
'center ');
1034 $totalarray[
'nbfield']++;
1036if (!empty($arrayfields[
't.datee'][
'checked'])) {
1037 print_liste_field_titre($arrayfields[
't.datee'][
'label'], $_SERVER[
"PHP_SELF"],
"t.datee",
"", $param,
'', $sortfield, $sortorder,
'center ');
1038 $totalarray[
'nbfield']++;
1040if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1041 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"p.ref",
"", $param,
"", $sortfield, $sortorder);
1042 $totalarray[
'nbfield']++;
1044if (!empty($arrayfields[
'p.title'][
'checked'])) {
1045 print_liste_field_titre($arrayfields[
'p.title'][
'label'], $_SERVER[
"PHP_SELF"],
"p.title",
"", $param,
"", $sortfield, $sortorder);
1046 $totalarray[
'nbfield']++;
1048if (!empty($arrayfields[
's.nom'][
'checked'])) {
1049 print_liste_field_titre($arrayfields[
's.nom'][
'label'], $_SERVER[
"PHP_SELF"],
"s.nom",
"", $param,
"", $sortfield, $sortorder);
1050 $totalarray[
'nbfield']++;
1052if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1053 print_liste_field_titre($arrayfields[
's.name_alias'][
'label'], $_SERVER[
"PHP_SELF"],
"s.name_alias",
"", $param,
"", $sortfield, $sortorder);
1054 $totalarray[
'nbfield']++;
1056if (!empty($arrayfields[
'p.fk_statut'][
'checked'])) {
1057 print_liste_field_titre($arrayfields[
'p.fk_statut'][
'label'], $_SERVER[
"PHP_SELF"],
"p.fk_statut",
"", $param,
'', $sortfield, $sortorder,
'center ');
1058 $totalarray[
'nbfield']++;
1060if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
1061 print_liste_field_titre($arrayfields[
't.planned_workload'][
'label'], $_SERVER[
"PHP_SELF"],
"t.planned_workload",
"", $param,
'', $sortfield, $sortorder,
'center ');
1062 $totalarray[
'nbfield']++;
1064if (!empty($arrayfields[
't.duration_effective'][
'checked'])) {
1065 print_liste_field_titre($arrayfields[
't.duration_effective'][
'label'], $_SERVER[
"PHP_SELF"],
"t.duration_effective",
"", $param,
'', $sortfield, $sortorder,
'center ');
1066 $totalarray[
'nbfield']++;
1068if (!empty($arrayfields[
't.progress_calculated'][
'checked'])) {
1069 print_liste_field_titre($arrayfields[
't.progress_calculated'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
'',
'',
'',
'center ');
1070 $totalarray[
'nbfield']++;
1072if (!empty($arrayfields[
't.progress'][
'checked'])) {
1073 print_liste_field_titre($arrayfields[
't.progress'][
'label'], $_SERVER[
"PHP_SELF"],
"t.progress",
"", $param,
'', $sortfield, $sortorder,
'center ');
1074 $totalarray[
'nbfield']++;
1076if (!empty($arrayfields[
't.progress_summary'][
'checked'])) {
1077 print_liste_field_titre($arrayfields[
't.progress_summary'][
'label'], $_SERVER[
"PHP_SELF"],
"t.progress",
"", $param,
'', $sortfield, $sortorder,
'center ');
1078 $totalarray[
'nbfield']++;
1080if (!empty($arrayfields[
't.budget_amount'][
'checked'])) {
1081 print_liste_field_titre($arrayfields[
't.budget_amount'][
'label'], $_SERVER[
"PHP_SELF"],
"t.budget_amount",
"", $param,
'', $sortfield, $sortorder,
'center ');
1082 $totalarray[
'nbfield']++;
1084if (!empty($arrayfields[
't.tobill'][
'checked'])) {
1085 print_liste_field_titre($arrayfields[
't.tobill'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
'', $sortfield, $sortorder,
'center ');
1086 $totalarray[
'nbfield']++;
1088if (!empty($arrayfields[
't.billed'][
'checked'])) {
1089 print_liste_field_titre($arrayfields[
't.billed'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
'', $sortfield, $sortorder,
'center ');
1090 $totalarray[
'nbfield']++;
1093include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
1096 'arrayfields' => $arrayfields,
1098 'sortfield' => $sortfield,
1099 'sortorder' => $sortorder,
1100 'totalarray' => &$totalarray,
1102$reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters, $object, $action);
1103print $hookmanager->resPrint;
1104if (!empty($arrayfields[
't.datec'][
'checked'])) {
1105 print_liste_field_titre($arrayfields[
't.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"t.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1106 $totalarray[
'nbfield']++;
1108if (!empty($arrayfields[
't.tms'][
'checked'])) {
1109 print_liste_field_titre($arrayfields[
't.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"t.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
1110 $totalarray[
'nbfield']++;
1114 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
1115 $totalarray[
'nbfield']++;
1119$plannedworkloadoutputformat =
'allhourmin';
1120$timespentoutputformat =
'allhourmin';
1122 $plannedworkloadoutputformat =
getDolGlobalString(
'PROJECT_PLANNED_WORKLOAD_FORMAT');
1131$savnbfield = $totalarray[
'nbfield'];
1133$totalarray[
'nbfield'] = 0;
1134$imaxinloop = ($limit ? min($num, $limit) : $num);
1135while ($i < $imaxinloop) {
1136 $obj = $db->fetch_object($resql);
1145 $object->description = $obj->description;
1146 $object->status = $obj->status;
1147 $object->progress = $obj->progress;
1148 $object->budget_amount = $obj->budget_amount;
1149 $object->date_start = $db->jdate($obj->date_start);
1150 $object->date_end = $db->jdate($obj->date_end);
1151 $object->planned_workload = $obj->planned_workload;
1152 $object->duration_effective = $obj->duration_effective;
1153 $object->fk_task_parent = $obj->fk_task_parent;
1155 $projectstatic->id = $obj->projectid;
1156 $projectstatic->ref = $obj->projectref;
1157 $projectstatic->title = $obj->projecttitle;
1158 $projectstatic->public = $obj->public;
1159 $projectstatic->statut = $obj->projectstatus;
1160 $projectstatic->datee = $db->jdate($obj->projectdatee);
1163 $socstatic->id = $obj->socid;
1164 $socstatic->name = $obj->name;
1165 $socstatic->name_alias = $obj->alias;
1167 if ($mode ==
'kanban') {
1169 print
'<tr class="trkanban"><td colspan="'.$savnbfield.
'">';
1170 print
'<div class="box-flex-container kanban">';
1173 if ($massactionbutton || $massaction) {
1175 if (in_array(
$object->id, $arrayofselected)) {
1180 $arraydata = array();
1181 $arraydata[
'projectlink'] = $projectstatic->getNomUrl(1);
1182 $arraydata[
'selected'] = in_array(
$object->id, $arrayofselected);
1184 print
$object->getKanbanView(
'', $arraydata);
1185 if ($i == ($imaxinloop - 1)) {
1190 $userAccess = $projectstatic->restrictedProjectArea($user);
1191 if ($userAccess >= 0) {
1194 print
'<tr data-rowid="'.$object->id.
'" class="oddeven">';
1198 print
'<td class="nowrap center">';
1199 if ($massactionbutton || $massaction) {
1201 if (in_array(
$object->id, $arrayofselected)) {
1204 print
'<input id="cb'.$object->id.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.
$object->id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1208 $totalarray[
'nbfield']++;
1212 if (!empty($arrayfields[
't.ref'][
'checked'])) {
1213 print
'<td class="nowraponall">';
1214 print
$object->getNomUrl(1,
'withproject');
1220 $totalarray[
'nbfield']++;
1224 if (!empty($arrayfields[
't.fk_task_parent'][
'checked'])) {
1225 print
'<td class="nowraponall">';
1226 if (!empty(
$object->fk_task_parent)) {
1227 $object_parent =
new Task($db);
1228 $result = $object_parent->fetch(
$object->fk_task_parent);
1232 print $object_parent->getNomUrl(1,
'withproject');
1233 if ($object_parent->hasDelay()) {
1240 $totalarray[
'nbfield']++;
1244 if (!empty($arrayfields[
't.label'][
'checked'])) {
1245 print
'<td class="tdoverflowmax200" title="'.dol_escape_htmltag(
$object->label).
'">';
1249 $totalarray[
'nbfield']++;
1253 if (!empty($arrayfields[
't.description'][
'checked'])) {
1258 $totalarray[
'nbfield']++;
1263 if (!empty($arrayfields[
't.dateo'][
'checked'])) {
1264 print
'<td class="center">';
1268 $totalarray[
'nbfield']++;
1272 if (!empty($arrayfields[
't.datee'][
'checked'])) {
1273 print
'<td class="center">';
1277 $totalarray[
'nbfield']++;
1281 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
1282 print
'<td class="nowraponall tdoverflowmax150">';
1283 print $projectstatic->getNomUrl(1,
'task');
1284 if ($projectstatic->hasDelay()) {
1289 $totalarray[
'nbfield']++;
1293 if (!empty($arrayfields[
'p.title'][
'checked'])) {
1294 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->projecttitle).
'">';
1298 $totalarray[
'nbfield']++;
1302 if (!empty($arrayfields[
's.nom'][
'checked'])) {
1303 print
'<td class="tdoverflowmax125">';
1305 print $socstatic->getNomUrl(1,
'', 0, 0, -1, empty($arrayfields[
's.name_alias'][
'checked']) ? 0 : 1);
1311 $totalarray[
'nbfield']++;
1315 if (!empty($arrayfields[
's.name_alias'][
'checked'])) {
1318 $name_alias = $socstatic->name_alias;
1320 print
'<td class="tdoverflowmax125" title="'.dol_escape_htmltag($name_alias).
'">';
1324 $totalarray[
'nbfield']++;
1328 if (!empty($arrayfields[
'p.fk_statut'][
'checked'])) {
1329 print
'<td class="center">';
1330 print $projectstatic->getLibStatut(1);
1333 $totalarray[
'nbfield']++;
1338 if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
1339 print
'<td class="center">';
1342 if ($obj->planned_workload !=
'') {
1350 $totalarray[
'nbfield']++;
1353 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.planned_workload';
1355 if (!isset($totalarray[
'val'][
't.planned_workload'])) {
1356 $totalarray[
'val'][
't.planned_workload'] = 0;
1358 $totalarray[
'val'][
't.planned_workload'] += $obj->planned_workload;
1360 $totalarray[
'totalplannedworkloadfield'] = $totalarray[
'nbfield'];
1362 if (!isset($totalarray[
'totalplannedworkload'])) {
1363 $totalarray[
'totalplannedworkload'] = 0;
1365 $totalarray[
'totalplannedworkload'] += $obj->planned_workload;
1368 if (!empty($arrayfields[
't.duration_effective'][
'checked'])) {
1369 $showlineingray = 0;
1371 print
'<td class="center">';
1372 if ($showlineingray) {
1375 print
'<a href="'.DOL_URL_ROOT.
'/projet/tasks/time.php?id='.
$object->id.($showproject ?
'' :
'&withproject=1').
'">';
1377 if ($obj->duration_effective) {
1382 if ($showlineingray) {
1387 if (empty($arrayfields[
't.progress_calculated'][
'checked'])) {
1388 if ($obj->planned_workload || $obj->duration_effective) {
1389 if ($obj->planned_workload) {
1390 print
' <span class="opacitymedium">('.round(100 * $obj->duration_effective / $obj->planned_workload, 2).
' %)</span>';
1392 print $form->textwithpicto(
'', $langs->trans(
'WorkloadNotDefined'), 1,
'help');
1398 $totalarray[
'nbfield']++;
1401 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.duration_effective';
1403 if (!isset($totalarray[
'val'][
't.duration_effective'])) {
1404 $totalarray[
'val'][
't.duration_effective'] = 0;
1406 $totalarray[
'val'][
't.duration_effective'] += $obj->duration_effective;
1408 $totalarray[
'totaldurationeffectivefield'] = $totalarray[
'nbfield'];
1410 if (!isset($totalarray[
'totaldurationeffective'])) {
1411 $totalarray[
'totaldurationeffective'] = 0;
1413 $totalarray[
'totaldurationeffective'] += $obj->duration_effective;
1416 if (!empty($arrayfields[
't.progress_calculated'][
'checked'])) {
1417 print
'<td class="center">';
1418 if ($obj->planned_workload || $obj->duration_effective) {
1419 if ($obj->planned_workload) {
1420 print round(100 * $obj->duration_effective / $obj->planned_workload, 2).
' %';
1422 print $form->textwithpicto(
'', $langs->trans(
'WorkloadNotDefined'), 1,
'help');
1427 $totalarray[
'nbfield']++;
1430 $totalarray[
'totalprogress_calculatedfield'] = $totalarray[
'nbfield'];
1434 if (!empty($arrayfields[
't.progress'][
'checked'])) {
1435 print
'<td class="center">';
1436 if ($obj->progress !=
'') {
1441 $totalarray[
'nbfield']++;
1444 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.progress';
1446 if (!isset($totalarray[
'val'][
't.progress'])) {
1447 $totalarray[
'val'][
't.progress'] = 0;
1449 $totalarray[
'val'][
't.progress'] += ($obj->planned_workload * $obj->progress / 100);
1451 $totalarray[
'totalprogress_declaredfield'] = $totalarray[
'nbfield'];
1453 if (!isset($totalarray[
'totaldurationdeclared'])) {
1454 $totalarray[
'totaldurationdeclared'] = 0;
1456 $totalarray[
'totaldurationdeclared'] += $obj->planned_workload * $obj->progress / 100;
1459 if (!empty($arrayfields[
't.progress_summary'][
'checked'])) {
1460 print
'<td class="center">';
1466 $totalarray[
'nbfield']++;
1469 $totalarray[
'totalprogress_summary'] = $totalarray[
'nbfield'];
1473 if (!empty($arrayfields[
't.budget_amount'][
'checked'])) {
1474 print
'<td class="center">';
1476 print
'<span class="amount">'.price(
$object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).
'</span>';
1480 $totalarray[
'nbfield']++;
1483 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.budget_amount';
1485 $totalarray[
'val'][
't.budget_amount'] += $obj->budget_amount;
1487 $totalarray[
'totalbudget_amountfield'] = $totalarray[
'nbfield'];
1489 $totalarray[
'totalbudgetamount'] += $obj->budget_amount;
1492 if (!empty($arrayfields[
't.tobill'][
'checked'])) {
1493 print
'<td class="center">';
1494 if ($obj->usage_bill_time) {
1496 $totalarray[
'val'][
't.tobill'] += $obj->tobill;
1497 $totalarray[
'totaltobill'] += $obj->tobill;
1499 print
'<span class="opacitymedium">'.$langs->trans(
"NA").
'</span>';
1503 $totalarray[
'nbfield']++;
1506 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.tobill';
1509 $totalarray[
'totaltobillfield'] = $totalarray[
'nbfield'];
1513 if (!empty($arrayfields[
't.billed'][
'checked'])) {
1514 print
'<td class="center">';
1515 if ($obj->usage_bill_time) {
1517 $totalarray[
'val'][
't.billed'] += $obj->billed;
1518 $totalarray[
'totalbilled'] += $obj->billed;
1520 print
'<span class="opacitymedium">'.$langs->trans(
"NA").
'</span>';
1524 $totalarray[
'nbfield']++;
1527 $totalarray[
'pos'][$totalarray[
'nbfield']] =
't.billed';
1530 $totalarray[
'totalbilledfield'] = $totalarray[
'nbfield'];
1534 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_print_fields.tpl.php';
1536 $parameters = array(
'arrayfields' => $arrayfields,
'object' => $object,
'obj' => $obj,
'i' => $i,
'totalarray' => &$totalarray);
1537 $reshook = $hookmanager->executeHooks(
'printFieldListValue', $parameters, $object, $action);
1538 print $hookmanager->resPrint;
1540 if (!empty($arrayfields[
't.datec'][
'checked'])) {
1541 print
'<td class="center">';
1542 print
dol_print_date($db->jdate($obj->date_creation),
'dayhour',
'tzuser');
1545 $totalarray[
'nbfield']++;
1549 if (!empty($arrayfields[
't.tms'][
'checked'])) {
1550 print
'<td class="center">';
1551 print
dol_print_date($db->jdate($obj->date_modification),
'dayhour',
'tzuser');
1554 $totalarray[
'nbfield']++;
1565 print
'<td class="nowrap center">';
1566 if ($massactionbutton || $massaction) {
1568 if (in_array(
$object->id, $arrayofselected)) {
1571 print
'<input id="cb'.$object->id.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.
$object->id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1575 $totalarray[
'nbfield']++;
1587if (!empty($totalarray[
'totalizable']) && is_array($totalarray[
'totalizable'])) {
1588 foreach ($totalarray[
'totalizable'] as $keytotalizable => $valtotalizable) {
1589 $totalarray[
'pos'][$valtotalizable[
'pos']] = $keytotalizable;
1590 $totalarray[
'val'][$keytotalizable] = $valtotalizable[
'total'];
1596if (isset($totalarray[
'totaldurationeffectivefield']) || isset($totalarray[
'totalplannedworkloadfield']) || isset($totalarray[
'totalprogress_calculatedfield'])
1597 || isset($totalarray[
'totaltobill']) || isset($totalarray[
'totalbilled']) || isset($totalarray[
'totalbudget'])) {
1598 print
'<tr class="liste_total">';
1600 while ($i < $totalarray[
'nbfield']) {
1603 if ((is_null($limit) || $num < $limit) && empty($offset)) {
1604 print
'<td>'.$langs->trans(
"Total").
'</td>';
1607 if (is_object($form)) {
1608 print $form->textwithpicto($langs->trans(
"Total"), $langs->transnoentitiesnoconv(
"Totalforthispage"));
1610 print $langs->trans(
"Totalforthispage");
1620 } elseif (isset($totalarray[
'totalplannedworkloadfield']) && $totalarray[
'totalplannedworkloadfield'] == $i) {
1621 print
'<td class="center">'.convertSecondToTime($totalarray[
'totalplannedworkload'], $plannedworkloadoutputformat).
'</td>';
1622 } elseif (isset($totalarray[
'totaldurationeffectivefield']) && $totalarray[
'totaldurationeffectivefield'] == $i) {
1623 print
'<td class="center">'.convertSecondToTime($totalarray[
'totaldurationeffective'], $timespentoutputformat).
'</td>';
1624 } elseif (isset($totalarray[
'totalprogress_calculatedfield']) && $totalarray[
'totalprogress_calculatedfield'] == $i) {
1625 print
'<td class="center">'.($totalarray[
'totalplannedworkload'] > 0 ? round(100 * $totalarray[
'totaldurationeffective'] / $totalarray[
'totalplannedworkload'], 2).
' %' :
'').
'</td>';
1626 } elseif (isset($totalarray[
'totalprogress_declaredfield']) && $totalarray[
'totalprogress_declaredfield'] == $i) {
1627 print
'<td class="center">'.($totalarray[
'totalplannedworkload'] > 0 ? round(100 * $totalarray[
'totaldurationdeclared'] / $totalarray[
'totalplannedworkload'], 2).
' %' :
'').
'</td>';
1628 } elseif (isset($totalarray[
'totaltobillfield']) && $totalarray[
'totaltobillfield'] == $i) {
1629 print
'<td class="center">'.convertSecondToTime($totalarray[
'totaltobill'], $plannedworkloadoutputformat).
'</td>';
1630 } elseif (isset($totalarray[
'totalbilledfield']) && $totalarray[
'totalbilledfield'] == $i) {
1631 print
'<td class="center">'.convertSecondToTime($totalarray[
'totalbilled'], $plannedworkloadoutputformat).
'</td>';
1632 } elseif (isset($totalarray[
'totalbudget_amountfield']) && $totalarray[
'totalbudget_amountfield'] == $i) {
1633 print
'<td class="center">'.price((
float) $totalarray[
'totalbudgetamount'], 0, $langs, 1, 0, 0, $conf->currency).
'</td>';
1634 } elseif (!empty($totalarray[
'pos'][$i])) {
1635 print
'<td class="right">';
1636 if (isset($totalarray[
'type']) && $totalarray[
'type'][$i] ==
'duration') {
1637 print(!empty($totalarray[
'val'][$totalarray[
'pos'][$i]]) ?
convertSecondToTime($totalarray[
'val'][$totalarray[
'pos'][$i]],
'allhourmin') : 0);
1639 print
price(!empty($totalarray[
'val'][$totalarray[
'pos'][$i]]) ? $totalarray[
'val'][$totalarray[
'pos'][$i]] : 0);
1651$parameters = array(
'arrayfields' => $arrayfields,
'sql' => $sql);
1652$reshook = $hookmanager->executeHooks(
'printFieldListFooter', $parameters, $object, $action);
1653print $hookmanager->resPrint;
1655print
'</table>'.
"\n";
1658print
'</form>'.
"\n";
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
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...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
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.
dol_now($mode='auto')
Return date for now.
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...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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...
getTaskProgressView($task, $label=true, $progressNumber=true, $hideOnProgressNull=false, $spaced=false)
getTaskProgressBadge($task, $label='', $tooltip='')
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.