diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 4731f9cf58e..92e44f63f02 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -262,13 +262,13 @@ function project_timesheet_prepare_head($mode, $fuser=null) $h++; } - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) + /*if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { $head[$h][0] = DOL_URL_ROOT."/projet/activity/perline.php".($param?'?'.$param:''); $head[$h][1] = $langs->trans("InputDetail"); $head[$h][2] = 'inputperline'; $h++; - } + }*/ complete_head_from_modules($conf,$langs,null,$head,$h,'project_timesheet'); diff --git a/htdocs/projet/activity/perline.php b/htdocs/projet/activity/perline.php deleted file mode 100644 index 523457ad8e4..00000000000 --- a/htdocs/projet/activity/perline.php +++ /dev/null @@ -1,612 +0,0 @@ - - * Copyright (C) 2004-2016 Laurent Destailleur - * Copyright (C) 2005-2010 Regis Houssin - * Copyright (C) 2010 François Legastelois - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/projet/activity/perline.php - * \ingroup projet - * \brief List activities of tasks (per line) - */ - -require ("../../main.inc.php"); -require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; -require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php'; - -$langs->load('projects'); -$langs->load('users'); - -$action=GETPOST('action','aZ09'); -$mode=GETPOST("mode"); -$id=GETPOST('id','int'); -$taskid=GETPOST('taskid'); - -$mine=0; -if ($mode == 'mine') $mine=1; - -$projectid=''; -$projectid=isset($_GET["id"])?$_GET["id"]:$_POST["projectid"]; - -// Security check -$socid=0; -if ($user->societe_id > 0) $socid=$user->societe_id; -$result = restrictedArea($user, 'projet', $projectid); - -$now=dol_now(); -$nowtmp=dol_getdate($now); -$nowday=$nowtmp['mday']; -$nowmonth=$nowtmp['mon']; -$nowyear=$nowtmp['year']; - -$year=GETPOST('reyear')?GETPOST('reyear'):(GETPOST("year","int")?GETPOST("year","int"):(GETPOST("addtimeyear","int")?GETPOST("addtimeyear","int"):date("Y"))); -$month=GETPOST('remonth')?GETPOST('remonth'):(GETPOST("month","int")?GETPOST("month","int"):(GETPOST("addtimemonth","int")?GETPOST("addtimemonth","int"):date("m"))); -$day=GETPOST('reday')?GETPOST('reday'):(GETPOST("day","int")?GETPOST("day","int"):(GETPOST("addtimeday","int")?GETPOST("addtimeday","int"):date("d"))); -$day = (int) $day; -$week=GETPOST("week","int")?GETPOST("week","int"):date("W"); - -$search_categ=GETPOST("search_categ",'alpha'); -$search_usertoprocessid=GETPOST('search_usertoprocessid', 'int'); -$search_task_ref=GETPOST('search_task_ref', 'alpha'); -$search_task_label=GETPOST('search_task_label', 'alpha'); -$search_project_ref=GETPOST('search_project_ref', 'alpha'); -$search_thirdparty=GETPOST('search_thirdparty', 'alpha'); - -$monthofday=GETPOST('addtimemonth'); -$dayofday=GETPOST('addtimeday'); -$yearofday=GETPOST('addtimeyear'); - -$daytoparse = $now; -if ($yearofday && $monthofday && $dayofday) $daytoparse=dol_mktime(0, 0, 0, $monthofday, $dayofday, $yearofday); // xxxofday is value of day after submit action 'addtime' -else if ($year && $month && $day) $daytoparse=dol_mktime(0, 0, 0, $month, $day, $year); // this are value submited after submit of action 'submitdateselect' - - -if (empty($search_usertoprocessid) || $search_usertoprocessid == $user->id) -{ - $usertoprocess=$user; - $search_usertoprocessid=$usertoprocess->id; -} -elseif ($search_usertoprocessid > 0) -{ - $usertoprocess=new User($db); - $usertoprocess->fetch($search_usertoprocessid); - $search_usertoprocessid=$usertoprocess->id; -} -else -{ - $usertoprocess=new User($db); -} - -$object=new Task($db); - - -/* - * Actions - */ - -// Purge criteria -if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers -{ - $action = ''; - $search_categ=''; - $search_usertoprocessid = $user->id; - $search_task_ref = ''; - $search_task_label = ''; - $search_project_ref = ''; - $search_thirdparty = ''; -} -if (GETPOST("button_search_x",'alpha') || GETPOST("button_search.x",'alpha') || GETPOST("button_search",'alpha')) -{ - $action = ''; -} - -if (GETPOST('submitdateselect')) -{ - if (GETPOST('remonth','int') && GETPOST('reday','int') && GETPOST('reyear','int')) - { - $daytoparse = dol_mktime(0, 0, 0, GETPOST('remonth','int'), GETPOST('reday','int'), GETPOST('reyear','int')); - } - - $action = ''; -} - - -/*if ($action == 'addtime' && $user->rights->projet->lire && GETPOST('assigntask')) -{ - $action = 'assigntask'; - - if ($taskid > 0) - { - $result = $object->fetch($taskid, $ref); - if ($result < 0) $error++; - } - else - { - setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Task")), '', 'errors'); - $error++; - } - if (! GETPOST('type')) - { - setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), '', 'errors'); - $error++; - } - if (! $error) - { - $idfortaskuser=$usertoprocess->id; - $result = $object->add_contact($idfortaskuser, GETPOST("type"), 'internal'); - - if ($result >= 0 || $result == -2) // Contact add ok or already contact of task - { - // Test if we are already contact of the project (should be rare but sometimes we can add as task contact without being contact of project, like when admin user has been removed from contact of project) - $sql='SELECT ec.rowid FROM '.MAIN_DB_PREFIX.'element_contact as ec, '.MAIN_DB_PREFIX.'c_type_contact as tc WHERE tc.rowid = ec.fk_c_type_contact'; - $sql.=' AND ec.fk_socpeople = '.$idfortaskuser." AND ec.element_id = '.$object->fk_project.' AND tc.element = 'project' AND source = 'internal'"; - $resql=$db->query($sql); - if ($resql) - { - $obj=$db->fetch_object($resql); - if (! $obj) // User is not already linked to project, so we will create link to first type - { - $project = new Project($db); - $project->fetch($object->fk_project); - // Get type - $listofprojcontact=$project->liste_type_contact('internal'); - - if (count($listofprojcontact)) - { - $typeforprojectcontact=reset(array_keys($listofprojcontact)); - $result = $project->add_contact($idfortaskuser, $typeforprojectcontact, 'internal'); - } - } - } - else - { - dol_print_error($db); - } - } - } - - if ($result < 0) - { - $error++; - if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') - { - $langs->load("errors"); - setEventMessages($langs->trans("ErrorTaskAlreadyAssigned"), null, 'warnings'); - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - } - } - - if (! $error) - { - setEventMessages("TaskAssignedToEnterTime", null); - $taskid=0; - } - - $action=''; -}*/ - -/*if ($action == 'addtime' && $user->rights->projet->lire) -{ - $timespent_duration=array(); - - if (is_array($_POST)) - { - foreach($_POST as $key => $time) - { - if (intval($time) > 0) - { - // Hours or minutes of duration - if (preg_match("/([0-9]+)duration(hour|min)/",$key,$matches)) - { - $id = $matches[1]; - if ($id > 0) - { - // We store HOURS in seconds - if($matches[2]=='hour') $timespent_duration[$id] += $time*60*60; - - // We store MINUTES in seconds - if($matches[2]=='min') $timespent_duration[$id] += $time*60; - } - } - } - } - } - - if (count($timespent_duration) > 0) - { - foreach($timespent_duration as $key => $val) - { - $object->fetch($key); - $object->progress = GETPOST($key.'progress', 'int'); - $object->timespent_duration = $val; - $object->timespent_fk_user = $usertoprocess->id; - $object->timespent_note = GETPOST($key.'note'); - if (GETPOST($key."hour") != '' && GETPOST($key."hour") >= 0) // If hour was entered - { - $object->timespent_datehour = dol_mktime(GETPOST($key."hour"),GETPOST($key."min"),0,$monthofday,$dayofday,$yearofday); - $object->timespent_withhour = 1; - } - else - { - $object->timespent_datehour = dol_mktime(12,0,0,$monthofday,$dayofday,$yearofday); - } - $object->timespent_date = $object->timespent_datehour; - - if ($object->timespent_date > 0) - { - $result=$object->addTimeSpent($user); - } - else - { - setEventMessages("ErrorBadDate", null, 'errors'); - $error++; - break; - } - - if ($result < 0) - { - setEventMessages($object->error, $object->errors, 'errors'); - $error++; - break; - } - } - - if (! $error) - { - setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); - - // Redirect to avoid submit twice on back - header('Location: '.$_SERVER["PHP_SELF"].'?'.($projectid?'id='.$projectid:'').($search_usertoprocessid?'&search_usertoprocessid='.$search_usertoprocessid:'').($mode?'&mode='.$mode:'').'&year='.$yearofday.'&month='.$monthofday.'&day='.$dayofday); - exit; - } - } - else - { - setEventMessages($langs->trans("ErrorTimeSpentIsEmpty"), null, 'errors'); - } -}*/ - - - -/* - * View - */ - -$form=new Form($db); -$formother = new FormOther($db); -$formcompany=new FormCompany($db); -$formproject=new FormProjets($db); -$projectstatic=new Project($db); -$project = new Project($db); -$taskstatic = new Task($db); -$thirdpartystatic = new Societe($db); - - -$prev = dol_getdate($daytoparse - (24 * 3600)); -$prev_year = $prev['year']; -$prev_month = $prev['mon']; -$prev_day = $prev['mday']; - -$next = dol_getdate($daytoparse + (24 * 3600)); -$next_year = $next['year']; -$next_month = $next['mon']; -$next_day = $next['mday']; - -$title=$langs->trans("TimeSpent"); - -$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,(empty($usertoprocess->id)?2:0),1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project - -if ($id) -{ - $project->fetch($id); - $project->fetch_thirdparty(); -} - -$onlyopenedproject=1; // or -1 -$morewherefilter=''; -if ($search_task_ref) $morewherefilter.=natural_search("pt.ref", $search_task_ref); -if ($search_task_label) $morewherefilter.=natural_search(array("pt.ref", "pt.label"), $search_task_label); -if ($search_thirdparty) $morewherefilter.=natural_search("s.nom", $search_thirdparty); - - -$tasktimearray=$taskstatic->fetchAllTimeSpent($usertoprocess, $morewherefilter); -//$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 task of opened 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 with no filter so we can show total of time spent for not visible tasks -{ - $tasktimearraywithoutfilter=$taskstatic->fetchAllTimeSpent($usertoprocess); - //$tasksarraywithoutfilter=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, '', $onlyopenedproject, '', ($search_usertoprocessid?$search_usertoprocessid:0)); // We want to see all task of opened project i am allowed to see and that match filter, not only my tasks. Later only mine will be editable later. -} -$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, 0, ($project->id?$project->id:0), 0, $onlyopenedproject); -$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0, $usertoprocess, ($project->id?$project->id:0), 0, $onlyopenedproject); -//var_dump($tasksarray); -//var_dump($projectsrole); -//var_dump($taskrole); - -llxHeader("",$title,"",'','','',array('/core/js/timesheet.js')); - -print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num, '', 'title_project'); - -$param=''; -$param.=($mode?'&mode='.$mode:''); -$param.=($search_project_ref?'&search_project_ref='.$search_project_ref:''); -$param.=($search_usertoprocessid?'&search_usertoprocessid='.$search_usertoprocessid:''); -$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:''); - -// Show navigation bar -$nav=''; -/* -$nav =''.img_previous($langs->trans("Previous"))."\n"; -$nav.=" ".dol_print_date(dol_mktime(0,0,0,$month,$day,$year),"day")." \n"; -$nav.=''.img_next($langs->trans("Next"))."\n"; -$nav.="   (".$langs->trans("Today").")"; -$nav.='
'.$form->select_date(-1,'',0,0,2,"addtime",1,0,1).' '; -$nav.=' '; -*/ - -$picto='calendar'; - - -print '
id > 0 ? '?id='.$project->id : '').'">'; -print ''; -print ''; -print ''; -$tmp = dol_getdate($daytoparse); -print ''; -print ''; -print ''; - -$head=project_timesheet_prepare_head($mode, $usertoprocess); -dol_fiche_head($head, 'inputperline', '', -1, 'task'); - -// Show description of content -print '
'; -if ($mine || ($usertoprocess->id == $user->id)) print $langs->trans("MyTasksDesc").'.'.($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; -else -{ - if (empty($usertoprocess->id) || $usertoprocess->id < 0) - { - if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").'.'.($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; - else print $langs->trans("ProjectsPublicTaskDesc").'.'.($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; - } -} -/*if ($mine || ($usertoprocess->id == $user->id)) -{ - print $langs->trans("OnlyYourTaskAreVisible").'
'; -} -else -{ - print $langs->trans("AllTaskVisibleButEditIfYouAreAssigned").'
'; -}*/ -print '
'; - -dol_fiche_end(); - -print '
'.$nav.'
'; // We move this before the assign to components so, the default submit button is not the assign to. - -/*print '
'; -$titleassigntask = $langs->transnoentities("AssignTaskToMe"); -if ($usertoprocess->id != $user->id) $titleassigntask = $langs->transnoentities("AssignTaskToUser", $usertoprocess->getFullName($langs)); -print '
'; -$formproject->selectTasks($socid?$socid:-1, $taskid, 'taskid', 32, 0, 1, 1); -print '
'; -print ' '; -print $formcompany->selectTypeContact($object, '', 'type','internal','rowid', 0, 'maxwidth200'); -print ''; -print '
'; -*/ - -print '
'; - -print 'TODO - Use ajax dropdown of detail on the tab per week and per day instead of this page'; -print '
'; - -$moreforfilter=''; - -// Filter on categories -/*if (! empty($conf->categorie->enabled)) -{ - require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; - $moreforfilter.='
'; - $moreforfilter.=$langs->trans('ProjectCategories'). ': '; - $moreforfilter.=$formother->select_categories('project', $search_categ, 'search_categ', 1, 1, 'maxwidth300'); - $moreforfilter.='
'; -}*/ - -// If the user can view user other than himself -$moreforfilter.='
'; -$moreforfilter.=$langs->trans('TimeSpentBy'). ': '; -$includeonly='hierachyme'; -if (empty($user->rights->user->user->lire)) $includeonly=array($user->id); -$moreforfilter.=$form->select_dolusers($search_usertoprocessid?$search_usertoprocessid:$usertoprocess->id, 'search_usertoprocessid', $user->rights->user->user->lire?0:0, null, 0, $includeonly, null, 0, 0, 0, '', 0, '', 'maxwidth200'); -$moreforfilter.='
'; - -if (! empty($moreforfilter)) -{ - print '
'; - print $moreforfilter; - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print '
'; -} - - -print '
'; -print ''."\n"; - -print ''; -print ''; -print ''; -//print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -// Action column -print ''; -print "\n"; - -print ''; -print ''; -print ''; -//print ''; -print ''; -print ''; -/*print ''; -if ($usertoprocess->id == $user->id) print ''; -else print '';*/ -print ''; -print ''; -print ''; -print ''; -print "\n"; - - -// By default, we can edit only tasks we are assigned to -$restrictviewformytask=(empty($conf->global->PROJECT_TIME_SHOW_TASK_NOT_ASSIGNED)?1:0); - -// Get if user is available or not for each day -$holiday = new Holiday($db); -$isavailable=array(); - -$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $daytoparse); // $daytoparse is a date with hours = 0 -$isavailable[$daytoparse]=$isavailablefordayanduser; // in projectLinesPerWeek later, we are using $firstdaytoshow and dol_time_plus_duree to loop on each day - -if (count($tasktimearray) > 0) -{ - //var_dump($tasktimearray); - $j=0; - $totalforvisibletasks = projectLinesPerAction($j, 0, $usertoprocess, $tasktimearray, $level, $projectsrole, $tasksrole, $mine, $restrictviewformytask, $daytoparse, $isavailable, -1); - //var_dump($totalforvisibletasks); - - // Show total for all other tasks - - // Calculate total for all lines - $listofdistinctprojectid=array(); // List of all distinct projects - if (is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) - { - foreach($tasksarraywithoutfilter as $tmptask) - { - $listofdistinctprojectid[$tmptask->fk_project]=$tmptask->fk_project; - } - } - //var_dump($listofdistinctprojectid); - $totalforeachday=array(); - foreach($listofdistinctprojectid as $tmpprojectid) - { - $lineother=''; - $projectstatic->id=$tmpprojectid; - $projectstatic->loadTimeSpent($daytoparse, 0, $usertoprocess->id); // Load time spent from table projet_task_time for the project into this->weekWorkLoad and this->weekWorkLoadPerTask for all days of a week - for ($idw = 0; $idw < 7; $idw++) - { - $tmpday=dol_time_plus_duree($daytoparse, $idw, 'd'); - $totalforeachday[$tmpday]+=$projectstatic->weekWorkLoad[$tmpday]; - } - } - $lineother=''; - //var_dump($totalforeachday); - - $colspan = 5; - - // There is a diff between total shown on screen and total spent by user, so we add a line with all other cumulated time of user - if (count($totalforeachday)) - { - print ''; - print ''; - print ''; - print ' '; - print ' '; - print ''; - } - - if ($conf->use_javascript_ajax) - { - print ' - - - - - '; - } -} -else -{ - print ''; -} -print "
'; -$searchpicto=$form->showFilterAndCheckAddButtons(0); -print $searchpicto; -print '
'.$langs->trans("Project").''.$langs->trans("ThirdParty").''.$langs->trans("RefTask").''.$langs->trans("Task").''.$langs->trans("Date").''.$langs->trans("TimeSpent").''.$langs->trans("TimeSpentByYou").''.$langs->trans("TimeSpentByUser").''.$langs->trans("HourStart").''.$langs->trans("Duration").''.$langs->trans("Note").'
'; - print $langs->trans("OtherFilteredTasks"); - print ''; - $timeonothertasks=($totalforeachday[$daytoparse] - $totalforvisibletasks[$daytoparse]); - //if ($timeonothertasks) - //{ - print ''; - //} - print '
'; - print $langs->trans("Total"); - //print ' - '.$langs->trans("ExpectedWorkedHours").': '.price($usertoprocess->weeklyhours, 1, $langs, 0, 0).''; - print '
 
'.$langs->trans("NoTasks").'
"; -print '
'; - -print ''."\n"; - -print '
'; -print ''; -print '
'; - -print '
'; - -$modeinput='hours'; - -if ($conf->use_javascript_ajax) -{ - print "\n\n"; - print ''; -} - -llxFooter(); - -$db->close();