diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php
index 92df28d9922..ad2385c3be3 100644
--- a/htdocs/core/lib/project.lib.php
+++ b/htdocs/core/lib/project.lib.php
@@ -1160,9 +1160,12 @@ function projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsr
* @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is assigned to me, 2=Enable add time only if tasks is assigned to me and hide others
* @param array $isavailable Array with data that say if user is available for several days for morning and afternoon
* @param int $oldprojectforbreak Old project id of last project break
+ * @param array $arrayfields Array of additional column
+ * @param array $extrafields Array of additional column
+ * @param array $extralabels Array of additional column
* @return array Array with time spent for $fuser for each day of week on tasks in $lines and substasks
*/
-function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask, &$isavailable, $oldprojectforbreak = 0)
+function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask, &$isavailable, $oldprojectforbreak = 0, $arrayfields=array(), $extrafields='', $extralabels=array())
{
global $conf, $db, $user, $bc, $langs;
global $form, $formother, $projectstatic, $taskstatic, $thirdpartystatic;
@@ -1196,6 +1199,8 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
if ($lines[$i]->fk_task_parent == $parent)
{
+ $obj = &$lines[$i]; // To display extrafields
+
// If we want all or we have a role on task, we show it
if (empty($mine) || ! empty($tasksrole[$lines[$i]->id]))
{
@@ -1241,8 +1246,14 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
if (empty($oldprojectforbreak) || ($oldprojectforbreak != -1 && $oldprojectforbreak != $projectstatic->id))
{
+ $addcolspan=0;
+ foreach ($arrayfields as $key => $val)
+ {
+ if ($val['checked'] && substr($key, 0, 5) == 'efpt.') $addcolspan++;
+ }
+
print '
';
if ($lines[$i]->planned_workload) print convertSecondToTime($lines[$i]->planned_workload, 'allhourmin');
else print '--:--';
@@ -1402,7 +1479,7 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$
{
//var_dump('totalforeachday after taskid='.$lines[$i]->id.' and previous one on level '.$level);
//var_dump($totalforeachday);
- $ret = projectLinesPerWeek($inc, $firstdaytoshow, $fuser, $lines[$i]->id, ($parent == 0 ? $lineswithoutlevel0 : $lines), $level, $projectsrole, $tasksrole, $mine, $restricteditformytask, $isavailable, $oldprojectforbreak);
+ $ret = projectLinesPerWeek($inc, $firstdaytoshow, $fuser, $lines[$i]->id, ($parent == 0 ? $lineswithoutlevel0 : $lines), $level, $projectsrole, $tasksrole, $mine, $restricteditformytask, $isavailable, $oldprojectforbreak, $arrayfields, $extrafields, $extralabels);
//var_dump('ret with parent='.$lines[$i]->id.' level='.$level);
//var_dump($ret);
foreach($ret as $key => $val)
diff --git a/htdocs/core/tpl/extrafields_list_print_fields.tpl.php b/htdocs/core/tpl/extrafields_list_print_fields.tpl.php
index f94c96f0da1..1dad8a6739d 100644
--- a/htdocs/core/tpl/extrafields_list_print_fields.tpl.php
+++ b/htdocs/core/tpl/extrafields_list_print_fields.tpl.php
@@ -14,9 +14,11 @@ if (! empty($extrafieldsobjectkey)) // $extrafieldsobject is the $object->table_
{
if (is_array($extrafields->attributes[$extrafieldsobjectkey]['label']) && count($extrafields->attributes[$extrafieldsobjectkey]['label']))
{
- foreach($extrafields->attributes[$extrafieldsobjectkey]['label'] as $key => $val)
+ if (empty($extrafieldsobjectprefix)) $extrafieldsobjectprefix = 'ef.';
+
+ foreach($extrafields->attributes[$extrafieldsobjectkey]['label'] as $key => $val)
{
- if (! empty($arrayfields["ef.".$key]['checked']))
+ if (! empty($arrayfields[$extrafieldsobjectprefix.$key]['checked']))
{
$align=$extrafields->getAlignFlag($key, $extrafieldsobjectkey);
print '
table_
print ' data-key="'.$key.'"';
print '>';
$tmpkey='options_'.$key;
+
if (in_array($extrafields->attributes[$extrafieldsobjectkey]['type'][$key], array('date', 'datetime', 'timestamp')) && !is_numeric($obj->$tmpkey))
{
$datenotinstring = $obj->$tmpkey;
@@ -51,8 +54,8 @@ if (! empty($extrafieldsobjectkey)) // $extrafieldsobject is the $object->table_
}
if (! empty($val['isameasure']))
{
- if (! $i) $totalarray['pos'][$totalarray['nbfield']]='ef.'.$tmpkey;
- $totalarray['val']['ef.'.$tmpkey] += $obj->$tmpkey;
+ if (! $i) $totalarray['pos'][$totalarray['nbfield']]=$extrafieldsobjectprefix.$tmpkey;
+ $totalarray['val'][$extrafieldsobjectprefix.$tmpkey] += $obj->$tmpkey;
}
}
}
diff --git a/htdocs/core/tpl/extrafields_list_search_input.tpl.php b/htdocs/core/tpl/extrafields_list_search_input.tpl.php
index 021ca06aeb5..6a9d32bc226 100644
--- a/htdocs/core/tpl/extrafields_list_search_input.tpl.php
+++ b/htdocs/core/tpl/extrafields_list_search_input.tpl.php
@@ -14,27 +14,30 @@ if (! empty($extrafieldsobjectkey)) // $extrafieldsobject is the $object->table_
{
if (is_array($extrafields->attributes[$extrafieldsobjectkey]['label']) && count($extrafields->attributes[$extrafieldsobjectkey]['label']))
{
+ if (empty($extrafieldsobjectprefix)) $extrafieldsobjectprefix = 'ef.';
+ if (empty($search_options_pattern)) $search_options_pattern='search_options_';
+
foreach($extrafields->attributes[$extrafieldsobjectkey]['label'] as $key => $val)
{
- if (! empty($arrayfields["ef.".$key]['checked'])) {
+ if (! empty($arrayfields[$extrafieldsobjectprefix.$key]['checked'])) {
$align=$extrafields->getAlignFlag($key);
$typeofextrafield=$extrafields->attributes[$extrafieldsobjectkey]['type'][$key];
print '
';
if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attributes[$extrafieldsobjectkey]['computed'][$key]))
{
$crit=$val;
- $tmpkey=preg_replace('/search_options_/', '', $key);
+ $tmpkey=preg_replace('/'.$search_options_pattern.'/', '', $key);
$searchclass='';
if (in_array($typeofextrafield, array('varchar', 'select'))) $searchclass='searchstring';
if (in_array($typeofextrafield, array('int', 'double'))) $searchclass='searchnum';
- print '';
+ print '';
}
elseif (! in_array($typeofextrafield, array('datetime','timestamp')))
{
// for the type as 'checkbox', 'chkbxlst', 'sellist' we should use code instead of id (example: I declare a 'chkbxlst' to have a link with dictionnairy, I have to extend it with the 'code' instead 'rowid')
$morecss='';
if ($typeofextrafield == 'sellist') $morecss='maxwidth200';
- echo $extrafields->showInputField($key, $search_array_options['search_options_'.$key], '', '', 'search_', $morecss);
+ echo $extrafields->showInputField($key, $search_array_options[$search_options_pattern.$key], '', '', 'search_', $morecss);
}
elseif (in_array($typeofextrafield, array('datetime','timestamp')))
{
diff --git a/htdocs/core/tpl/extrafields_list_search_param.tpl.php b/htdocs/core/tpl/extrafields_list_search_param.tpl.php
index d514fdf6acd..c6657326ec9 100644
--- a/htdocs/core/tpl/extrafields_list_search_param.tpl.php
+++ b/htdocs/core/tpl/extrafields_list_search_param.tpl.php
@@ -10,10 +10,12 @@ if (empty($conf) || ! is_object($conf))
// Loop to complete $param for extrafields
if (! empty($search_array_options)) // $extrafieldsobject is the $object->table_element like 'societe', 'socpeople', ...
{
+ if (empty($search_options_pattern)) $search_options_pattern='search_options_';
+
foreach ($search_array_options as $key => $val)
{
$crit=$val;
- $tmpkey=preg_replace('/search_options_/', '', $key);
- if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val);
+ $tmpkey=preg_replace('/'.$search_options_pattern.'/', '', $key);
+ if ($val != '') $param.='&'.$search_options_pattern.$tmpkey.'='.urlencode($val);
}
}
diff --git a/htdocs/core/tpl/extrafields_list_search_sql.tpl.php b/htdocs/core/tpl/extrafields_list_search_sql.tpl.php
index e0233bbe96a..f8370efefaf 100644
--- a/htdocs/core/tpl/extrafields_list_search_sql.tpl.php
+++ b/htdocs/core/tpl/extrafields_list_search_sql.tpl.php
@@ -12,15 +12,18 @@ if (empty($extrafieldsobjectkey) && is_object($object)) $extrafieldsobjectkey=$o
// Loop to complete the sql search criterias from extrafields
if (! empty($extrafieldsobjectkey) && ! empty($search_array_options) && is_array($search_array_options)) // $extrafieldsobject is the $object->table_element like 'societe', 'socpeople', ...
{
- foreach ($search_array_options as $key => $val)
+ if (empty($extrafieldsobjectprefix)) $extrafieldsobjectprefix = 'ef.';
+ if (empty($search_options_pattern)) $search_options_pattern='search_options_';
+
+ foreach ($search_array_options as $key => $val)
{
$crit=$val;
- $tmpkey=preg_replace('/search_options_/', '', $key);
+ $tmpkey=preg_replace('/'.$search_options_pattern.'/', '', $key);
$typ=$extrafields->attributes[$extrafieldsobjectkey]['type'][$tmpkey];
if ($crit != '' && in_array($typ, array('date', 'datetime', 'timestamp')))
{
- $sql .= " AND ef.".$tmpkey." = '".$db->idate($crit)."'";
+ $sql .= " AND ".$extrafieldsobjectprefix.$tmpkey." = '".$db->idate($crit)."'";
}
elseif ($crit != '' && (! in_array($typ, array('select','sellist')) || $crit != '0') && (! in_array($typ, array('link')) || $crit != '-1'))
{
@@ -29,7 +32,7 @@ if (! empty($extrafieldsobjectkey) && ! empty($search_array_options) && is_array
if (in_array($typ, array('sellist','link')) && $crit != '0' && $crit != '-1') $mode_search=2; // Search on a foreign key int
if (in_array($typ, array('chkbxlst','checkbox'))) $mode_search=4; // Search on a multiselect field with sql type = text
- $sql .= natural_search('ef.'.$tmpkey, $crit, $mode_search);
+ $sql .= natural_search($extrafieldsobjectprefix.$tmpkey, $crit, $mode_search);
}
}
}
diff --git a/htdocs/core/tpl/extrafields_list_search_title.tpl.php b/htdocs/core/tpl/extrafields_list_search_title.tpl.php
index bfae5faa944..5772f3fc989 100644
--- a/htdocs/core/tpl/extrafields_list_search_title.tpl.php
+++ b/htdocs/core/tpl/extrafields_list_search_title.tpl.php
@@ -14,12 +14,14 @@ if (! empty($extrafieldsobjectkey)) // $extrafieldsobject is the $object->table_
{
if (is_array($extrafields->attributes[$extrafieldsobjectkey]['label']) && count($extrafields->attributes[$extrafieldsobjectkey]['label']))
{
+ if (empty($extrafieldsobjectprefix)) $extrafieldsobjectprefix = 'ef.';
+
foreach($extrafields->attributes[$extrafieldsobjectkey]['label'] as $key => $val)
{
- if (! empty($arrayfields["ef.".$key]['checked']))
+ if (! empty($arrayfields[$extrafieldsobjectprefix.$key]['checked']))
{
$align=$extrafields->getAlignFlag($key);
- $sortonfield = "ef.".$key;
+ $sortonfield = $extrafieldsobjectprefix.$key;
if (! empty($extrafields->attributes[$extrafieldsobjectkey]['computed'][$key])) $sortonfield='';
if ($extrafields->attributes[$extrafieldsobjectkey]['type'][$key] == 'separate') print '
';
else print getTitleFieldOfList($langs->trans($extralabels[$key]), 0, $_SERVER["PHP_SELF"], $sortonfield, "", $param, ($align?'align="'.$align.'" data-titlekey="'.$key.'"':'data-titlekey="'.$key.'"'), $sortfield, $sortorder)."\n";
diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php
index b1b6fbf352f..6d6c8cb046a 100644
--- a/htdocs/projet/activity/perweek.php
+++ b/htdocs/projet/activity/perweek.php
@@ -43,6 +43,8 @@ $mode=GETPOST("mode", 'alpha');
$id=GETPOST('id', 'int');
$taskid=GETPOST('taskid', 'int');
+$contextpage=GETPOST('contextpage', 'aZ')?GETPOST('contextpage', 'aZ'):'perweekcard';
+
$mine=0;
if ($mode == 'mine') $mine=1;
@@ -113,6 +115,38 @@ else
$object=new Task($db);
+$arrayfields=array(
+ // Project
+ 'p.opp_amount'=>array('label'=>$langs->trans("OpportunityAmountShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>103),
+ 'p.fk_opp_status'=>array('label'=>$langs->trans("OpportunityStatusShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>104),
+ 'p.opp_percent'=>array('label'=>$langs->trans("OpportunityProbabilityShort"), 'checked'=>0, 'enabled'=>($conf->global->PROJECT_USE_OPPORTUNITIES?1:0), 'position'=>105),
+ 'p.budget_amount'=>array('label'=>$langs->trans("Budget"), 'checked'=>0, 'position'=>110),
+ 'p.bill_time'=>array('label'=>$langs->trans("BillTimeShort"), 'checked'=>0, 'position'=>115),
+);
+// Extra fields
+$extrafields = new ExtraFields($db);
+
+// fetch optionals attributes and labels
+$extralabels = $extrafields->fetch_name_optionals_label('projet');
+if (!empty($extrafields->attributes['projet']['label']))
+{
+ foreach($extrafields->attributes['projet']['label'] as $key => $val)
+ {
+ if (! empty($extrafields->attributes['projet']['list'][$key])) $arrayfields["efp.".$key]=array('label'=>$extrafields->attributes['projet']['label'][$key], 'checked'=>(($extrafields->attributes['projet']['list'][$key]<0)?0:1), 'position'=>$extrafields->attributes['projet']['pos'][$key], 'enabled'=>(abs($extrafields->attributes['projet']['list'][$key])!=3 && $extrafields->attributes['projet']['perms'][$key]));
+ }
+}
+$extralabels+= $extrafields->fetch_name_optionals_label('projet_task', true);
+if (!empty($extrafields->attributes['projet_task']['label']))
+{
+ foreach($extrafields->attributes['projet_task']['label'] as $key => $val)
+ {
+ if (! empty($extrafields->attributes['projet_task']['list'][$key])) $arrayfields["efpt.".$key]=array('label'=>$extrafields->attributes['projet_task']['label'][$key], 'checked'=>(($extrafields->attributes['projet_task']['list'][$key]<0)?0:1), 'position'=>$extrafields->attributes['projet_task']['pos'][$key], 'enabled'=>(abs($extrafields->attributes['projet_task']['list'][$key])!=3 && $extrafields->attributes['projet_task']['perms'][$key]));
+ }
+}
+
+$search_array_options=array();
+$search_array_options_project=$extrafields->getOptionalsFromPost('projet', '', 'search_');
+$search_array_options_task=$extrafields->getOptionalsFromPost('projet_task', '', 'search_task_');
/*
* Actions
@@ -130,6 +164,9 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x'
$search_thirdparty = '';
$search_declared_progress = '';
+ $search_array_options_project = array();
+ $search_array_options_task = array();
+
// We redefine $usertoprocess
$usertoprocess=$user;
}
@@ -145,6 +182,8 @@ if (GETPOST('submitdateselect'))
$action = '';
}
+include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
if ($action == 'addtime' && $user->rights->projet->lire && GETPOST('assigntask'))
{
$action = 'assigntask';
@@ -302,6 +341,14 @@ if ($action == 'addtime' && $user->rights->projet->lire)
$param.=($search_task_ref?'&search_task_ref='.$search_task_ref:'');
$param.=($search_task_label?'&search_task_label='.$search_task_label:'');
+ $search_array_options=$search_array_options_project;
+ $search_options_pattern='search_options_';
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
+ $search_array_options=$search_array_options_task;
+ $search_options_pattern='search_task_options_';
+ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
// Redirect to avoid submit twice on back
header('Location: '.$_SERVER["PHP_SELF"].'?'.$param);
exit;
@@ -344,7 +391,21 @@ if ($search_task_label) $morewherefilter.=natural_search(array("t.ref", "t.labe
if ($search_thirdparty) $morewherefilter.=natural_search("s.nom", $search_thirdparty);
if ($search_declared_progress) $morewherefilter.=natural_search("t.progress", $search_declared_progress, 1);
-$tasksarray=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid?$search_usertoprocessid:0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
+$sql = &$morewherefilter;
+
+$search_array_options = $search_array_options_project;
+$extrafieldsobjectprefix='efp.';
+$search_options_pattern='search_options_';
+$extrafieldsobjectkey='projet';
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
+
+$search_array_options = $search_array_options_task;
+$extrafieldsobjectprefix='efpt.';
+$search_options_pattern='search_task_options_';
+$extrafieldsobjectkey='projet_task';
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
+
+$tasksarray=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid?$search_usertoprocessid:0), 0, $extrafields, $extralabels); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
if ($morewherefilter) // Get all task without any filter, so we can show total of time spent for not visible tasks
{
$tasksarraywithoutfilter=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid?$search_usertoprocessid:0)); // We want to see all tasks of open project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later.
@@ -368,6 +429,21 @@ $param.=($search_thirdparty?'&search_thirdparty='.$search_thirdparty:'');
$param.=($search_task_ref?'&search_task_ref='.$search_task_ref:'');
$param.=($search_task_label?'&search_task_label='.$search_task_label:'');
+$search_array_options=$search_array_options_project;
+$search_options_pattern='search_options_';
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
+$search_array_options=$search_array_options_task;
+$search_options_pattern='search_task_options_';
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
+
+// Project
+//$search_pattern='search_options_';
+//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
+// Task
+$search_options_pattern='search_task_options_';
+include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
+
// Show navigation bar
$nav =''.img_previous($langs->trans("Previous"))."\n";
$nav.=" ".dol_print_date(dol_mktime(0, 0, 0, $first_month, $first_day, $first_year), "%Y").", ".$langs->trans("WeekShort")." ".$week." \n";
@@ -381,6 +457,8 @@ $picto='calendarweek';
print '