From 5d4d8151c14a384cb77aaa1025675db0edbfb6d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@destailleur.fr> Date: Wed, 18 Mar 2015 11:04:50 +0100 Subject: [PATCH] Work on new timesheet input pages. --- htdocs/core/js/timesheet.js | 41 ++++- htdocs/core/lib/project.lib.php | 45 +++-- htdocs/core/menus/init_menu_auguria.sql | 4 +- htdocs/core/menus/standard/eldy.lib.php | 4 +- .../install/mysql/migration/3.7.0-3.8.0.sql | 3 + htdocs/langs/en_US/projects.lang | 3 +- htdocs/projet/activity/perday.php | 164 ++++++++--------- .../activity/{pertime.php => perweek.php} | 173 ++++++++++-------- htdocs/projet/class/project.class.php | 33 ++-- htdocs/projet/class/task.class.php | 6 +- htdocs/projet/tasks/task.php | 6 +- 11 files changed, 276 insertions(+), 206 deletions(-) rename htdocs/projet/activity/{pertime.php => perweek.php} (53%) diff --git a/htdocs/core/js/timesheet.js b/htdocs/core/js/timesheet.js index 7c85cb1afd0..c36c03f55ff 100644 --- a/htdocs/core/js/timesheet.js +++ b/htdocs/core/js/timesheet.js @@ -122,7 +122,28 @@ function updateTotal(days,mode) var nbline = document.getElementById('numberOfLines').value; for (var i=0;i<nbline;i++) { - var id='task['+i+']['+days+']'; + var id='timespent['+i+']['+days+']'; + var taskTime= new Date(0); + var element=document.getElementById(id); + if(element) + { + /* alert(element.value);*/ + if (element.value) + { + result=parseTime(element.value,taskTime); + } + else + { + result=parseTime(element.innerHTML,taskTime); + } + if (result >= 0) + { + total.setHours(total.getHours()+taskTime.getHours()); + total.setMinutes(total.getMinutes()+taskTime.getMinutes()); + } + } + + var id='timeadded['+i+']['+days+']'; var taskTime= new Date(0); var element=document.getElementById(id); if(element) @@ -152,7 +173,23 @@ function updateTotal(days,mode) var nbline = document.getElementById('numberOfLines').value; for (var i=0;i<nbline;i++) { - var id='task['+i+']['+days+']'; + var id='timespent['+i+']['+days+']'; + var taskTime= new Date(0); + var element=document.getElementById(id); + if(element) + { + if (element.value) + { + total+=parseInt(element.value); + + } + else + { + total+=parseInt(element.innerHTML); + } + } + + var id='timeadded['+i+']['+days+']'; var taskTime= new Date(0); var element=document.getElementById(id); if(element) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index f744508d9bf..d353fea2af0 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -177,7 +177,15 @@ function project_timesheet_prepare_head($mode) $h = 0; - if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERDAY)) + if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERWEEK)) + { + $head[$h][0] = DOL_URL_ROOT."/projet/activity/perweek.php".($mode?'?mode='.$mode:''); + $head[$h][1] = $langs->trans("InputPerWeek"); + $head[$h][2] = 'inputperweek'; + $h++; + } + + if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERTIME)) { $head[$h][0] = DOL_URL_ROOT."/projet/activity/perday.php".($mode?'?mode='.$mode:''); $head[$h][1] = $langs->trans("InputPerDay"); @@ -185,11 +193,11 @@ function project_timesheet_prepare_head($mode) $h++; } - if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERTIME)) + if (empty($conf->global->PROJECT_DISABLE_TIMESHEET_PERACTION)) { - $head[$h][0] = DOL_URL_ROOT."/projet/activity/pertime.php".($mode?'?mode='.$mode:''); - $head[$h][1] = $langs->trans("InputPerTime"); - $head[$h][2] = 'inputpertime'; + $head[$h][0] = DOL_URL_ROOT."/projet/activity/peraction.php".($mode?'?mode='.$mode:''); + $head[$h][1] = $langs->trans("InputPerAction"); + $head[$h][2] = 'inputperaction'; $h++; } @@ -649,6 +657,8 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ * Output a task line into a perday intput mode * * @param string $inc Line number (start to 0, then increased by recursive call) + * @param int $firstdaytoshow First day to show + * @param User|null $fuser Restrict list to user if defined * @param string $parent Id of parent project to show (0 to show all) * @param Task[] $lines Array of lines * @param int $level Level (start to 0, then increased/decrease by recursive call) @@ -658,7 +668,7 @@ function projectLinesPerTime(&$inc, $parent, $lines, &$level, &$projectsrole, &$ * @param int $restricteditformytask 0=No restriction, 1=Enable add time only if task is a task i am affected to * @return $inc */ -function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask=0) +function projectLinesPerDay(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask=0) { global $db, $user, $bc, $langs; global $form, $formother, $projectstatic, $taskstatic; @@ -687,7 +697,7 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t $lastprojectid=$lines[$i]->fk_project; $projectstatic->id = $lines[$i]->fk_project; - $projectstatic->loadTimeSpent($datestart, $lines[$i]->id, $fuser->id); + $projectstatic->loadTimeSpent($firstdaytoshow, 0, $fuser->id); // Load time spent into this->weekWorkLoad and this->weekWorkLoadPerTaks for all day of a week } // If we want all or we have a role on task, we show it @@ -708,17 +718,18 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t print '<td class="nowrap">'; $taskstatic->id=$lines[$i]->id; $taskstatic->ref=($lines[$i]->ref?$lines[$i]->ref:$lines[$i]->id); - print $taskstatic->getNomUrl(1); + print $taskstatic->getNomUrl(1, 'withproject', 'time'); print '</td>'; // Label task print "<td>"; + print '<!-- Task id = '.$lines[$i]->id.' -->'; for ($k = 0 ; $k < $level ; $k++) print " "; $taskstatic->id=$lines[$i]->id; $taskstatic->ref=$lines[$i]->label; $taskstatic->date_start=$lines[$i]->date_start; $taskstatic->date_end=$lines[$i]->date_end; - print $taskstatic->getNomUrl(0); + print $taskstatic->getNomUrl(0, 'withproject', 'time'); //print "<br>"; //for ($k = 0 ; $k < $level ; $k++) print " "; //print get_date_range($lines[$i]->date_start,$lines[$i]->date_end,'',$langs,0); @@ -770,18 +781,22 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t $disabledtask=1; } - //var_dump($projectstatic->weekWorkLoad); + //var_dump($projectstatic->weekWorkLoadPerTask); // Fields to show current time $tableCell=''; $modeinput='hours'; for ($idw = 0; $idw < 7; $idw++) { - $dayWorkLoad = 0; + $tmpday=dol_time_plus_duree($firstdaytoshow, $idw, 'd'); + $dayWorkLoad = $projectstatic->weekWorkLoadPerTask[$tmpday][$lines[$i]->id]; + $alreadyspent=''; + if ($dayWorkLoad > 0) $alreadyspent=convertSecondToTime($dayWorkLoad,'allhourmin'); $tableCell ='<td align="center">'; - $tableCell.='<span class="timesheetalreadyrecorded"><input type="text" class="center" size="2" disabled="disabled" value="'.convertSecondToTime($dayWorkLoad,'allhourmin').'"></span>+'; - $tableCell.='<input type="text" class="center" size="2" id="task['.$inc.']['.$idw.']" name="task['.$lines[$i]->id.']['.$idw.']" value="" cols="2" maxlength="5"'; + $tableCell.='<span class="timesheetalreadyrecorded"><input type="text" class="center" size="2" disabled="disabled" id="timespent['.$inc.']['.$idw.']" name="task['.$lines[$i]->id.']['.$idw.']" value="'.$alreadyspent.'"></span>'; + $tableCell.='+'; + $tableCell.='<input type="text" class="center" size="2" id="timeadded['.$inc.']['.$idw.']" name="task['.$lines[$i]->id.']['.$idw.']" value="" cols="2" maxlength="5"'; $tableCell.=' onkeypress="return regexEvent(this,event,\'timeChar\')"'; - $tableCell.= 'onblur="regexEvent(this,event,\''.$modeinput.'\');updateTotal('.$idw.',\''.$modeinput.'\')" />'; + $tableCell.= 'onblur="regexEvent(this,event,\''.$modeinput.'\'); updateTotal('.$idw.',\''.$modeinput.'\')" />'; $tableCell.='</td>'; print $tableCell; } @@ -790,7 +805,7 @@ function projectLinesPerDay(&$inc, $parent, $lines, &$level, &$projectsrole, &$t $inc++; $level++; - if ($lines[$i]->id) projectLinesPerDay($inc, $lines[$i]->id, $lines, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); + if ($lines[$i]->id) projectLinesPerDay($inc, $firstdaytoshow, $lines[$i]->id, $lines, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); $level--; } else diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index b2f81ed1769..ec265cd4d3f 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -244,12 +244,12 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3700__+MAX_llx_menu__, 'project', '', 7__+MAX_llx_menu__, '/projet/activity/index.php?leftmenu=projects', 'Activities', 0, 'projects', '$user->rights->projet->lire', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3701__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/tasks.php?leftmenu=projects&action=create', 'NewTask', 1, 'projects', '$user->rights->projet->creer', '', 2, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3702__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/tasks/index.php?leftmenu=projects', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3703__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/activity/perday.php?leftmenu=projects', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3703__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/activity/perweek.php?leftmenu=projects', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3800__+MAX_llx_menu__, 'project', '', 7__+MAX_llx_menu__, '/projet/activity/index.php?leftmenu=projects&mode=mine', 'MyActivities', 0, 'projects', '$user->rights->projet->lire', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3801__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/tasks.php?leftmenu=projects&action=create&mode=mine', 'NewTask', 1, 'projects', '$user->rights->projet->creer', '', 2, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3802__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/tasks/index.php?leftmenu=projects&mode=mine', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3803__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/activity/perday.php?leftmenu=projects&mode=mine', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3803__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/activity/perweek.php?leftmenu=projects&mode=mine', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); -- Tools insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->mailing->enabled', __HANDLER__, 'left', 3900__+MAX_llx_menu__, 'tools', 'mailing', 8__+MAX_llx_menu__, '/comm/mailing/index.php?leftmenu=mailing', 'EMailings', 0, 'mails', '$user->rights->mailing->lire', '', 0, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->mailing->enabled', __HANDLER__, 'left', 3901__+MAX_llx_menu__, 'tools', '', 3900__+MAX_llx_menu__, '/comm/mailing/card.php?leftmenu=mailing&action=create', 'NewMailing', 1, 'mails', '$user->rights->mailing->creer', '', 0, 0, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 24af20ea4af..7c6ef944f7c 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1148,13 +1148,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add("/projet/activity/index.php?mode=mine", $langs->trans("MyActivities"), 0, $user->rights->projet->lire); $newmenu->add("/projet/tasks.php?action=create&mode=mine", $langs->trans("NewTask"), 1, $user->rights->projet->creer); $newmenu->add("/projet/tasks/index.php?mode=mine", $langs->trans("List"), 1, $user->rights->projet->lire); - $newmenu->add("/projet/activity/perday.php?mode=mine", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer); + $newmenu->add("/projet/activity/perweek.php?mode=mine", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer); // All project i have permission on $newmenu->add("/projet/activity/index.php", $langs->trans("Activities"), 0, $user->rights->projet->lire && $user->rights->projet->lire); $newmenu->add("/projet/tasks.php?action=create", $langs->trans("NewTask"), 1, $user->rights->projet->creer && $user->rights->projet->creer); $newmenu->add("/projet/tasks/index.php", $langs->trans("List"), 1, $user->rights->projet->lire && $user->rights->projet->lire); - $newmenu->add("/projet/activity/perday.php", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer && $user->rights->projet->creer); + $newmenu->add("/projet/activity/perweek.php", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer && $user->rights->projet->creer); } } } diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index b7475d88f91..d4e56a980a6 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -27,6 +27,9 @@ ALTER TABLE llx_payment_salary ADD COLUMN salary real after datev; UPDATE llx_projet_task_time SET task_datehour = task_date where task_datehour IS NULL; ALTER TABLE llx_projet_task_time ADD COLUMN task_date_withhour integer DEFAULT 0 after task_datehour; +ALTER TABLE llx_projet_task MODIFY COLUMN duration_effective real DEFAULT 0 NULL; +ALTER TABLE llx_projet_task MODIFY COLUMN planned_workload real DEFAULT 0 NULL; + ALTER TABLE llx_commande_fournisseur MODIFY COLUMN date_livraison datetime; diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 8e7e29f7278..ef270909120 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -138,6 +138,7 @@ SearchAProject=Search a project ProjectMustBeValidatedFirst=Project must be validated first ProjectDraft=Draft projects FirstAddRessourceToAllocateTime=Associate a ressource to allocate time -InputPerTime=Input per time InputPerDay=Input per day +InputPerWeek=Input per week +InputPerAction=Input per action TimeAlreadyRecorded=Time spent already recorded for this task/day and user %s diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index abec2e8cf7c..5dc873cfccc 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -19,9 +19,9 @@ */ /** - * \file htdocs/projet/activity/pertime.php + * \file htdocs/projet/activity/perday.php * \ingroup projet - * \brief List activities of tasks (per time entry) + * \brief List activities of tasks (per day entry) */ require ("../../main.inc.php"); @@ -29,7 +29,6 @@ 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'; $langs->load('projects'); @@ -48,13 +47,6 @@ $socid=0; if ($user->societe_id > 0) $socid=$user->societe_id; $result = restrictedArea($user, 'projet', $projectid); -$now=dol_now(); - -$year=GETPOST("year","int")?GETPOST("year","int"):date("Y"); -$month=GETPOST("month","int")?GETPOST("month","int"):date("m"); -$week=GETPOST("week","int")?GETPOST("week","int"):date("W"); -$day=GETPOST("day","int")?GETPOST("day","int"):date("d"); - /* * Actions @@ -64,8 +56,68 @@ if ($action == 'addtime' && $user->rights->projet->creer) { $task = new Task($db); - - + $timespent_duration=array(); + + 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) + { + $task->fetch($key); + $task->progress = GETPOST($key . 'progress', 'int'); + $task->timespent_duration = $val; + $task->timespent_fk_user = $user->id; + if (GETPOST($key."hour") != '' && GETPOST($key."hour") >= 0) // If hour was entered + { + $task->timespent_date = dol_mktime(GETPOST($key."hour"),GETPOST($key."min"),0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); + $task->timespent_withhour = 1; + } + else + { + $task->timespent_date = dol_mktime(12,0,0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); + } + + $result=$task->addTimeSpent($user); + if ($result < 0) + { + setEventMessages($task->error, $task->errors, 'errors'); + $error++; + break; + } + } + + if (! $error) + { + setEventMessage($langs->trans("RecordSaved")); + + // Redirect to avoid submit twice on back + header('Location: '.$_SERVER["PHP_SELF"].($projectid?'?id='.$projectid:'?').($mode?'&mode='.$mode:'')); + exit; + } + } + else + { + setEventMessage($langs->trans("ErrorTimeSpentIsEmpty"), 'errors'); + } } @@ -75,7 +127,6 @@ if ($action == 'addtime' && $user->rights->projet->creer) */ $form=new Form($db); -$formother=new FormOther($db); $projectstatic=new Project($db); $project = new Project($db); $taskstatic = new Task($db); @@ -83,9 +134,8 @@ $taskstatic = new Task($db); $title=$langs->trans("TimeSpent"); if ($mine) $title=$langs->trans("MyTimeSpent"); -$usertoprocess=$user; +$usertoprocess = $user; -//$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,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) @@ -103,50 +153,15 @@ $tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($projec //var_dump($taskrole); -llxHeader("",$title,"",'','','',array('/core/js/timesheet.js')); +llxHeader("",$title,""); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num); -$startdayarray=dol_get_first_day_week($day, $month, $year); - -$prev = $startdayarray; -$prev_year = $prev['prev_year']; -$prev_month = $prev['prev_month']; -$prev_day = $prev['prev_day']; -$first_day = $prev['first_day']; -$first_month= $prev['first_month']; -$first_year = $prev['first_year']; -$week = $prev['week']; - -$day = (int) $day; -$next = dol_get_next_week($first_day, $week, $first_month, $first_year); -$next_year = $next['year']; -$next_month = $next['month']; -$next_day = $next['day']; - -// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) -$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); -$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd'); - -$tmpday = $first_day; - -// Show navigation bar -$nav ="<a href=\"?year=".$prev_year."&month=".$prev_month."&day=".$prev_day.$param."\">".img_previous($langs->trans("Previous"))."</a>\n"; -$nav.=" <span id=\"month_name\">".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; -$nav.=" </span>\n"; -$nav.="<a href=\"?year=".$next_year."&month=".$next_month."&day=".$next_day.$param."\">".img_next($langs->trans("Next"))."</a>\n"; -$nav.=" (<a href=\"?year=".$nowyear."&month=".$nowmonth."&day=".$nowday.$param."\">".$langs->trans("Today")."</a>)"; -$picto='calendarweek'; - - -print '<form name="addtime" method="POST" action="'.$_SERVER["PHP_SELF"].'">'; +print '<form name="addtime" method="POST" action="'.$_SERVER["PHP_SELF"].'?id='.$project->id.'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; print '<input type="hidden" name="action" value="addtime">'; print '<input type="hidden" name="mode" value="'.$mode.'">'; -print '<input type="hidden" name="day" value="'.$day.'">'; -print '<input type="hidden" name="month" value="'.$month.'">'; -print '<input type="hidden" name="year" value="'.$year.'">'; $head=project_timesheet_prepare_head($mode); dol_fiche_head($head, 'inputperday', '', 0, 'task'); @@ -158,7 +173,7 @@ else if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'<br><br>'; else print $langs->trans("ProjectsPublicTaskDesc").($onlyopened?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'<br><br>'; } -print "\n"; + // Filter on user /* dol_fiche_head(''); @@ -180,10 +195,6 @@ print "\n"; dol_fiche_end(); */ - -print '<div align="right">'.$nav.'</div>'; - - print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; print '<td>'.$langs->trans("Project").'</td>'; @@ -194,14 +205,8 @@ print '<td align="right">'.$langs->trans("ProgressDeclared").'</td>'; print '<td align="right">'.$langs->trans("TimeSpent").'</td>'; if ($usertoprocess->id == $user->id) print '<td align="right">'.$langs->trans("TimeSpentByYou").'</td>'; else print '<td align="right">'.$langs->trans("TimeSpentByUser").'</td>'; - -$startday=dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['first_day'], $startdayarray['first_year']); - -for($i=0;$i<7;$i++) -{ - print '<td width="7%" align="center">'.dol_print_date($startday + ($i * 3600 * 24), '%a').'<br>'.dol_print_date($startday + ($i * 3600 * 24), 'day').'</td>'; -} - +print '<td align="center">'.$langs->trans("DateAndHour").'</td>'; +print '<td align="center" colspan="2">'.$langs->trans("Duration").'</td>'; print "</tr>\n"; // By default, we can edit only tasks we are assigned to @@ -210,18 +215,7 @@ $restricteditformytask=(empty($conf->global->PROJECT_TIME_ON_ALL_TASKS_MY_PROJEC if (count($tasksarray) > 0) { $j=0; - projectLinesPerDay($j, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); - - print '<tr class="liste_total"> - <td class="liste_total" colspan="7" align="right">'.$langs->trans("Total").'</td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[0]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[1]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[2]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[3]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[4]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[5]"> </div></td> - <td class="liste_total" width="7%" align="center"><div id="totalDay[6]"> </div></td> - </tr>'; + projectLinesPerTime($j, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); } else { @@ -229,23 +223,9 @@ else } print "</table>"; -print '<input type="hidden" name="timestamp" value="1425423513"/>'."\n"; -print '<input type="hidden" id="numberOfLines" name="numberOfLines" value="'.count($tasksarray).'"/>'."\n"; - dol_fiche_end(); -print '<div class="center">'; -print '<input type="submit" class="button" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">'; -print '</div>'; - -print '</form>'."\n\n"; - - -print '<script type="text/javascript">'; -print "jQuery(document).ready(function () {\n"; -print ' jQuery(".timesheetalreadyrecorded").tipTip({ maxWidth: "600px", edgeOffset: 10, delay: 50, fadeIn: 50, fadeOut: 50, content: \''.dol_escape_js($langs->trans("TimeAlreadyRecorded", $user->getFullName($langs))).'\'});'; -print "});"; -print '</script>'; +print '</form>'; llxFooter(); diff --git a/htdocs/projet/activity/pertime.php b/htdocs/projet/activity/perweek.php similarity index 53% rename from htdocs/projet/activity/pertime.php rename to htdocs/projet/activity/perweek.php index 9f2dc3e99ca..8a9adc04f17 100644 --- a/htdocs/projet/activity/pertime.php +++ b/htdocs/projet/activity/perweek.php @@ -19,9 +19,9 @@ */ /** - * \file htdocs/projet/activity/perday.php + * \file htdocs/projet/activity/perweek.php * \ingroup projet - * \brief List activities of tasks (per day entry) + * \brief List activities of tasks (per week entry) */ require ("../../main.inc.php"); @@ -29,6 +29,7 @@ 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'; $langs->load('projects'); @@ -47,6 +48,13 @@ $socid=0; if ($user->societe_id > 0) $socid=$user->societe_id; $result = restrictedArea($user, 'projet', $projectid); +$now=dol_now(); + +$year=GETPOST("year","int")?GETPOST("year","int"):date("Y"); +$month=GETPOST("month","int")?GETPOST("month","int"):date("m"); +$week=GETPOST("week","int")?GETPOST("week","int"):date("W"); +$day=GETPOST("day","int")?GETPOST("day","int"):date("d"); + /* * Actions @@ -56,68 +64,8 @@ if ($action == 'addtime' && $user->rights->projet->creer) { $task = new Task($db); - $timespent_duration=array(); - - 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) - { - $task->fetch($key); - $task->progress = GETPOST($key . 'progress', 'int'); - $task->timespent_duration = $val; - $task->timespent_fk_user = $user->id; - if (GETPOST($key."hour") != '' && GETPOST($key."hour") >= 0) // If hour was entered - { - $task->timespent_date = dol_mktime(GETPOST($key."hour"),GETPOST($key."min"),0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); - $task->timespent_withhour = 1; - } - else - { - $task->timespent_date = dol_mktime(12,0,0,GETPOST($key."month"),GETPOST($key."day"),GETPOST($key."year")); - } - - $result=$task->addTimeSpent($user); - if ($result < 0) - { - setEventMessages($task->error, $task->errors, 'errors'); - $error++; - break; - } - } - - if (! $error) - { - setEventMessage($langs->trans("RecordSaved")); - - // Redirect to avoid submit twice on back - header('Location: '.$_SERVER["PHP_SELF"].($projectid?'?id='.$projectid:'?').($mode?'&mode='.$mode:'')); - exit; - } - } - else - { - setEventMessage($langs->trans("ErrorTimeSpentIsEmpty"), 'errors'); - } + + } @@ -127,6 +75,7 @@ if ($action == 'addtime' && $user->rights->projet->creer) */ $form=new Form($db); +$formother=new FormOther($db); $projectstatic=new Project($db); $project = new Project($db); $taskstatic = new Task($db); @@ -134,8 +83,9 @@ $taskstatic = new Task($db); $title=$langs->trans("TimeSpent"); if ($mine) $title=$langs->trans("MyTimeSpent"); -$usertoprocess = $user; +$usertoprocess=$user; +//$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,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) @@ -153,18 +103,53 @@ $tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($projec //var_dump($taskrole); -llxHeader("",$title,""); +llxHeader("",$title,"",'','','',array('/core/js/timesheet.js')); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, "", $num); -print '<form name="addtime" method="POST" action="'.$_SERVER["PHP_SELF"].'?id='.$project->id.'">'; +$startdayarray=dol_get_first_day_week($day, $month, $year); + +$prev = $startdayarray; +$prev_year = $prev['prev_year']; +$prev_month = $prev['prev_month']; +$prev_day = $prev['prev_day']; +$first_day = $prev['first_day']; +$first_month= $prev['first_month']; +$first_year = $prev['first_year']; +$week = $prev['week']; + +$day = (int) $day; +$next = dol_get_next_week($first_day, $week, $first_month, $first_year); +$next_year = $next['year']; +$next_month = $next['month']; +$next_day = $next['day']; + +// Define firstdaytoshow and lastdaytoshow (warning: lastdaytoshow is last second to show + 1) +$firstdaytoshow=dol_mktime(0,0,0,$first_month,$first_day,$first_year); +$lastdaytoshow=dol_time_plus_duree($firstdaytoshow, 7, 'd'); + +$tmpday = $first_day; + +// Show navigation bar +$nav ="<a href=\"?year=".$prev_year."&month=".$prev_month."&day=".$prev_day.$param."\">".img_previous($langs->trans("Previous"))."</a>\n"; +$nav.=" <span id=\"month_name\">".dol_print_date(dol_mktime(0,0,0,$first_month,$first_day,$first_year),"%Y").", ".$langs->trans("Week")." ".$week; +$nav.=" </span>\n"; +$nav.="<a href=\"?year=".$next_year."&month=".$next_month."&day=".$next_day.$param."\">".img_next($langs->trans("Next"))."</a>\n"; +$nav.=" (<a href=\"?year=".$nowyear."&month=".$nowmonth."&day=".$nowday.$param."\">".$langs->trans("Today")."</a>)"; +$picto='calendarweek'; + + +print '<form name="addtime" method="POST" action="'.$_SERVER["PHP_SELF"].'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; print '<input type="hidden" name="action" value="addtime">'; print '<input type="hidden" name="mode" value="'.$mode.'">'; +print '<input type="hidden" name="day" value="'.$day.'">'; +print '<input type="hidden" name="month" value="'.$month.'">'; +print '<input type="hidden" name="year" value="'.$year.'">'; $head=project_timesheet_prepare_head($mode); -dol_fiche_head($head, 'inputpertime', '', 0, 'task'); +dol_fiche_head($head, 'inputperweek', '', 0, 'task'); // Show description of content if ($mine) print $langs->trans("MyTasksDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'<br><br>'; @@ -173,7 +158,7 @@ else if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'<br><br>'; else print $langs->trans("ProjectsPublicTaskDesc").($onlyopened?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'<br><br>'; } - +print "\n"; // Filter on user /* dol_fiche_head(''); @@ -195,6 +180,10 @@ else dol_fiche_end(); */ + +print '<div align="right">'.$nav.'</div>'; + + print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; print '<td>'.$langs->trans("Project").'</td>'; @@ -205,8 +194,14 @@ print '<td align="right">'.$langs->trans("ProgressDeclared").'</td>'; print '<td align="right">'.$langs->trans("TimeSpent").'</td>'; if ($usertoprocess->id == $user->id) print '<td align="right">'.$langs->trans("TimeSpentByYou").'</td>'; else print '<td align="right">'.$langs->trans("TimeSpentByUser").'</td>'; -print '<td align="center">'.$langs->trans("DateAndHour").'</td>'; -print '<td align="center" colspan="2">'.$langs->trans("Duration").'</td>'; + +$startday=dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['first_day'], $startdayarray['first_year']); + +for($i=0;$i<7;$i++) +{ + print '<td width="7%" align="center">'.dol_print_date($startday + ($i * 3600 * 24), '%a').'<br>'.dol_print_date($startday + ($i * 3600 * 24), 'day').'</td>'; +} + print "</tr>\n"; // By default, we can edit only tasks we are assigned to @@ -215,7 +210,18 @@ $restricteditformytask=(empty($conf->global->PROJECT_TIME_ON_ALL_TASKS_MY_PROJEC if (count($tasksarray) > 0) { $j=0; - projectLinesPerTime($j, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); + projectLinesPerDay($j, $firstdaytoshow, $usertoprocess, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restricteditformytask); + + print '<tr class="liste_total"> + <td class="liste_total" colspan="7" align="right">'.$langs->trans("Total").'</td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[0]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[1]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[2]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[3]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[4]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[5]"> </div></td> + <td class="liste_total" width="7%" align="center"><div id="totalDay[6]"> </div></td> + </tr>'; } else { @@ -223,9 +229,30 @@ else } print "</table>"; +print '<input type="hidden" name="timestamp" value="1425423513"/>'."\n"; +print '<input type="hidden" id="numberOfLines" name="numberOfLines" value="'.count($tasksarray).'"/>'."\n"; + dol_fiche_end(); -print '</form>'; +print '<div class="center">'; +print '<input type="submit" class="button" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">'; +print '</div>'; + +print '</form>'."\n\n"; + +$modeinput='hours'; + +print '<script type="text/javascript">'; +print "jQuery(document).ready(function () {\n"; +print ' jQuery(".timesheetalreadyrecorded").tipTip({ maxWidth: "600px", edgeOffset: 10, delay: 50, fadeIn: 50, fadeOut: 50, content: \''.dol_escape_js($langs->trans("TimeAlreadyRecorded", $user->getFullName($langs))).'\'});'; +$i=0; +while ($i < 7) +{ + print ' updateTotal('.$i.',\''.$modeinput.'\');'; + $i++; +} +print "});"; +print '</script>'; llxFooter(); diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 21293fac121..681abb411ce 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -63,6 +63,9 @@ class Project extends CommonObject var $oldcopy; + var $weekWorkLoad; // Used to store workload details of a projet + var $weekWorkLoadPerTask; // Used to store workload details of tasks of a projet + /** * Constructor @@ -1442,23 +1445,29 @@ class Project extends CommonObject /** - * load time spent into this->weekWorkLoad for all day of a week and task id + * Load time spent into this->weekWorkLoad and this->weekWorkLoadPerTask for all day of a week of project * * @param int $datestart First day of week (use dol_get_first_day to find this date) - * @param int $taskid Task id - * @param int $userid Time consumed per a particular user + * @param int $taskid Filter on a task id + * @param int $userid Time spent by a particular user * @return int <0 if OK, >0 if KO */ - public function loadTimeSpent($datestart,$taskid,$userid=0) + public function loadTimeSpent($datestart,$taskid=0,$userid=0) { $error=0; - $sql = "SELECT ptt.rowid, ptt.task_duration, ptt.task_date"; - $sql.= " FROM ".MAIN_DB_PREFIX."projet_task_time AS ptt"; - $sql.= " WHERE ptt.fk_task='".$taskid."'"; - $sql.= " AND ptt.fk_user='".$userid."'"; - $sql .= "AND (ptt.task_date >= '".$this->db->idate($datestart)."' "; - $sql .= "AND (ptt.task_date < '".$this->db->idate($datestart + 7 * 24 * 3600)."' "; + if (empty($datestart)) dol_print_error('','Error datestart parameter is empty'); + + $sql = "SELECT ptt.rowid as taskid, ptt.task_duration, ptt.task_date, ptt.fk_task"; + $sql.= " FROM ".MAIN_DB_PREFIX."projet_task_time AS ptt, ".MAIN_DB_PREFIX."projet_task as pt"; + $sql.= " WHERE ptt.fk_task = pt.rowid"; + $sql.= " AND pt.fk_projet = ".$this->id; + $sql.= " AND (ptt.task_date >= '".$this->db->idate($datestart)."' "; + $sql.= " AND ptt.task_date <= '".$this->db->idate($datestart + (7 * 24 * 3600) - 1)."')"; + if ($task_id) $sql.= " AND ptt.fk_task=".$taskid; + if (is_numeric($userid)) $sql.= " AND ptt.fk_user=".$userid; + + //print $sql; $resql=$this->db->query($sql); if ($resql) { @@ -1470,10 +1479,8 @@ class Project extends CommonObject { $obj=$this->db->fetch_object($resql); $day=$this->db->jdate($obj->task_date); - //$day=(intval(date('w',strtotime($obj->task_date)))+1)%6; - // if several tasktime in one day then only the last is used $this->weekWorkLoad[$day] += $obj->task_duration; - $this->taskTimeId[$day]= ($obj->rowid)?($obj->rowid):0; + $this->weekWorkLoadPerTask[$day][$obj->fk_task] += $obj->task_duration; $i++; } $this->db->free($resql); diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 84888484d2c..5e02efe6463 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -287,7 +287,7 @@ class Task extends CommonObject $sql.= " label=".(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").","; $sql.= " description=".(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").","; $sql.= " duration_effective=".(isset($this->duration_effective)?$this->duration_effective:"null").","; - $sql.= " planned_workload=".(isset($this->planned_workload)?$this->planned_workload:"0").","; + $sql.= " planned_workload=".((isset($this->planned_workload) && $this->planned_workload != '')?$this->planned_workload:"null").","; $sql.= " dateo=".($this->date_start!=''?"'".$this->db->idate($this->date_start)."'":'null').","; $sql.= " datee=".($this->date_end!=''?"'".$this->db->idate($this->date_end)."'":'null').","; $sql.= " progress=".$this->progress.","; @@ -497,8 +497,8 @@ class Task extends CommonObject * Return clicable name (with picto eventually) * * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto - * @param int $option Sur quoi pointe le lien - * @param int $mode Mode 'task', 'time', 'contact', 'note', document' define page to link to. + * @param string $option 'withproject' or '' + * @param string $mode Mode 'task', 'time', 'contact', 'note', document' define page to link to. * @return string Chaine avec URL */ function getNomUrl($withpicto=0,$option='',$mode='task') diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index b6c35b2d73c..8dd7bac68d8 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -1,6 +1,6 @@ <?php /* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> - * Copyright (C) 2006-2014 Laurent Destailleur <eldy@users.sourceforge.net> + * Copyright (C) 2006-2015 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2010-2012 Regis Houssin <regis.houssin@capnetworks.com> * * This program is free software; you can redistribute it and/or modify @@ -42,7 +42,7 @@ $action=GETPOST('action','alpha'); $confirm=GETPOST('confirm','alpha'); $withproject=GETPOST('withproject','int'); $project_ref=GETPOST('project_ref','alpha'); -$planned_workload=GETPOST('planned_workloadhour')*3600+GETPOST('planned_workloadmin')*60; +$planned_workload=((GETPOST('planned_workloadhour')!='' && GETPOST('planned_workloadmin')!='')?GETPOST('planned_workloadhour')*3600+GETPOST('planned_workloadmin')*60:''); // Security check $socid=0; @@ -457,7 +457,7 @@ if ($id > 0 || ! empty($ref)) if ($object->planned_workload != '') { $tmparray=$object->getSummaryOfTimeSpent(); - if ($tmparray['total_duration'] > 0) print round($tmparray['total_duration'] / $object->planned_workload * 100, 2).' %'; + if ($tmparray['total_duration'] > 0 && ! empty($object->planned_workload)) print round($tmparray['total_duration'] / $object->planned_workload * 100, 2).' %'; else print '0 %'; } else print ''; -- GitLab