29require 
"../../main.inc.php";
 
   30require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
 
   31require_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
 
   32require_once DOL_DOCUMENT_ROOT.
'/core/lib/project.lib.php';
 
   33require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
 
   34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
 
   35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
 
   36require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
 
   37require_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
 
   49$langs->loadLangs(array(
'projects', 
'users', 
'companies'));
 
   51$action = 
GETPOST(
'action', 
'aZ09');
 
   52$mode = 
GETPOST(
"mode", 
'alpha');
 
   56$contextpage = 
GETPOST(
'contextpage', 
'aZ') ? 
GETPOST(
'contextpage', 
'aZ') : 
'timespent';
 
   65$hookmanager->initHooks(array(
'timesheetperdaycard'));
 
   83$search_usertoprocessid = 
GETPOSTINT(
'search_usertoprocessid');
 
   84$search_task_ref = 
GETPOST(
'search_task_ref', 
'alpha');
 
   85$search_task_label = 
GETPOST(
'search_task_label', 
'alpha');
 
   86$search_project_ref = 
GETPOST(
'search_project_ref', 
'alpha');
 
   87$search_thirdparty = 
GETPOST(
'search_thirdparty', 
'alpha');
 
   88$search_declared_progress = 
GETPOST(
'search_declared_progress', 
'alpha');
 
   90$sortfield = 
GETPOST(
'sortfield', 
'aZ09comma');
 
   91$sortorder = 
GETPOST(
'sortorder', 
'aZ09comma');
 
   93$monthofday = 
GETPOST(
'addtimemonth');
 
   94$dayofday = 
GETPOST(
'addtimeday');
 
   95$yearofday = 
GETPOST(
'addtimeyear');
 
  102if ($year && $month && $day) {
 
  103  $daytoparse = 
dol_mktime(0, 0, 0, $month, $day, $year); 
 
  104} elseif ($yearofday && $monthofday && $dayofday) {
 
  105  $daytoparse = 
dol_mktime(0, 0, 0, $monthofday, $dayofday, $yearofday); 
 
  108$daytoparsegmt = 
dol_now(
'gmt');
 
  109if ($yearofday && $monthofday && $dayofday) {
 
  110  $daytoparsegmt = 
dol_mktime(0, 0, 0, $monthofday, $dayofday, $yearofday, 
'gmt');
 
  111} elseif ($year && $month && $day) { 
 
  112  $daytoparsegmt = 
dol_mktime(0, 0, 0, $month, $day, $year, 
'gmt');
 
  115if (empty($search_usertoprocessid) || $search_usertoprocessid == $user->id) {
 
  116  $usertoprocess = $user;
 
  117  $search_usertoprocessid = $usertoprocess->id;
 
  118} elseif ($search_usertoprocessid > 0) {
 
  119  $usertoprocess = 
new User($db);
 
  120  $usertoprocess->fetch($search_usertoprocessid);
 
  121  $search_usertoprocessid = $usertoprocess->id;
 
  123  $usertoprocess = 
new User($db);
 
  133$extrafields->fetch_name_optionals_label(
$object->table_element);
 
  136$arrayfields = array();
 
  137$arrayfields[
't.planned_workload'] = array(
'label' => 
'PlannedWorkload', 
'checked' => 1, 
'enabled' => 1, 
'position' => 0);
 
  138$arrayfields[
't.progress'] = array(
'label' => 
'ProgressDeclared', 
'checked' => 1, 
'enabled' => 1, 
'position' => 0);
 
  139$arrayfields[
'timeconsumed'] = array(
'label' => 
'TimeConsumed', 
'checked' => 1, 
'enabled' => 1, 
'position' => 15);
 
  150if (!empty($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
 
  151  foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
 
  152    if (!empty($extrafields->attributes[
$object->table_element][
'list'][$key])) {
 
  153      $arrayfields[
"efpt.".$key] = array(
'label' => $extrafields->attributes[
$object->table_element][
'label'][$key], 
'checked' => (($extrafields->attributes[
$object->table_element][
'list'][$key] < 0) ? 0 : 1), 
'position' => $extrafields->attributes[
$object->table_element][
'pos'][$key], 
'enabled' => (abs((int) $extrafields->attributes[
$object->table_element][
'list'][$key]) != 3 && $extrafields->attributes[
$object->table_element][
'perms'][$key]));
 
  160$search_array_options_project = $extrafields->getOptionalsFromPost($project->table_element, 
'', 
'search_');
 
  161$search_array_options_task = $extrafields->getOptionalsFromPost(
$object->table_element, 
'', 
'search_task_');
 
  168$parameters = array(
'id' => $id, 
'taskid' => $taskid, 
'projectid' => $projectid);
 
  169$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action); 
 
  174if (
GETPOST(
'button_removefilter_x', 
'alpha') || 
GETPOST(
'button_removefilter.x', 
'alpha') || 
GETPOST(
'button_removefilter', 
'alpha')) { 
 
  177  $search_usertoprocessid = $user->id;
 
  178  $search_task_ref = 
'';
 
  179  $search_task_label = 
'';
 
  180  $search_project_ref = 
'';
 
  181  $search_thirdparty = 
'';
 
  182  $search_declared_progress = 
'';
 
  184  $search_array_options_project = array();
 
  185  $search_array_options_task = array();
 
  188  $usertoprocess = $user;
 
  190if (
GETPOST(
"button_search_x", 
'alpha') || 
GETPOST(
"button_search.x", 
'alpha') || 
GETPOST(
"button_search", 
'alpha')) {
 
  194if (
GETPOST(
'submitdateselect')) {
 
  202include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
 
  204if ($action == 
'addtime' && $user->hasRight(
'projet', 
'lire') && 
GETPOST(
'assigntask') && 
GETPOST(
'formfilteraction') != 
'listafterchangingselectedfields') {
 
  205  $action = 
'assigntask';
 
  208    $result = 
$object->fetch($taskid, $ref);
 
  213    setEventMessages($langs->transnoentitiesnoconv(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Task")), 
null, 
'errors');
 
  217    setEventMessages($langs->transnoentitiesnoconv(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")), 
null, 
'errors');
 
  221    $idfortaskuser = $usertoprocess->id;
 
  222    $result = 
$object->add_contact($idfortaskuser, 
GETPOST(
"type"), 
'internal');
 
  224    if ($result >= 0 || $result == -2) {  
 
  226      $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';
 
  227      $sql .= 
' AND ec.fk_socpeople = '.((int) $idfortaskuser).
" AND ec.element_id = ".((int) 
$object->fk_project).
" AND tc.element = 'project' AND source = 'internal'";
 
  228      $resql = $db->query($sql);
 
  230        $obj = $db->fetch_object($resql);
 
  233          $project->fetch(
$object->fk_project);
 
  235          $listofprojcontact = $project->liste_type_contact(
'internal');
 
  237          if (count($listofprojcontact)) {
 
  238            $tmparray = array_keys($listofprojcontact);
 
  239            $typeforprojectcontact = reset($tmparray);
 
  240            $result = $project->add_contact($idfortaskuser, $typeforprojectcontact, 
'internal');
 
  251    if (
$object->error == 
'DB_ERROR_RECORD_ALREADY_EXISTS') {
 
  252      $langs->load(
"errors");
 
  253      setEventMessages($langs->trans(
"ErrorTaskAlreadyAssigned"), 
null, 
'warnings');
 
  267if ($action == 
'addtime' && $user->hasRight(
'projet', 
'lire') && 
GETPOST(
'formfilteraction') != 
'listafterchangingselectedfields') {
 
  268  $timespent_duration = array();
 
  270  if (is_array($_POST)) {
 
  271    foreach ($_POST as $key => $time) {
 
  272      if (intval($time) > 0) {
 
  275        if (preg_match(
"/([0-9]+)duration(hour|min)/", $key, $matches)) {
 
  279            if ($matches[2] == 
'hour') {
 
  280              $timespent_duration[
$id] += (int) $time * 60 * 60;
 
  284            if ($matches[2] == 
'min') {
 
  285              $timespent_duration[
$id] += (int) $time * 60;
 
  293  if (count($timespent_duration) > 0) {
 
  294    foreach ($timespent_duration as $key => $val) {
 
  298      if (GETPOSTISSET($taskid.
'progress')) {
 
  304      $object->timespent_duration = $val;
 
  305      $object->timespent_fk_user = $usertoprocess->id;
 
  309        $object->timespent_withhour = 1;
 
  311        $object->timespent_datehour = 
dol_mktime(12, 0, 0, $monthofday, $dayofday, $yearofday);
 
  315      if (
$object->timespent_date > 0) {
 
  316        $result = 
$object->addTimeSpent($user);
 
  334      header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?'.($projectid ? 
'id='.$projectid : 
'').($search_usertoprocessid ? 
'&search_usertoprocessid='.urlencode((string) $search_usertoprocessid) : 
'').($mode ? 
'&mode='.$mode : 
'').
'&year='.$yearofday.
'&month='.$monthofday.
'&day='.$dayofday);
 
  348$form = 
new Form($db);
 
  352$projectstatic = 
new Project($db);
 
  354$taskstatic = 
new Task($db);
 
  355$thirdpartystatic = 
new Societe($db);
 
  359$prev_year  = $prev[
'year'];
 
  360$prev_month = $prev[
'mon'];
 
  361$prev_day   = $prev[
'mday'];
 
  364$next_year  = $next[
'year'];
 
  365$next_month = $next[
'mon'];
 
  366$next_day   = $next[
'mday'];
 
  368$title = $langs->trans(
"TimeSpent");
 
  370$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess, (empty($usertoprocess->id) ? 2 : 0), 1); 
 
  373  $project->fetch($id);
 
  374  $project->fetch_thirdparty();
 
  377$onlyopenedproject = 1; 
 
  378$morewherefilter = 
'';
 
  380if ($search_project_ref) {
 
  381  $morewherefilter .= 
natural_search(array(
"p.ref", 
"p.title"), $search_project_ref);
 
  383if ($search_task_ref) {
 
  386if ($search_task_label) {
 
  387  $morewherefilter .= 
natural_search(array(
"t.ref", 
"t.label"), $search_task_label);
 
  389if ($search_thirdparty) {
 
  392if ($search_declared_progress) {
 
  393  $morewherefilter .= 
natural_search(
"t.progress", $search_declared_progress, 1);
 
  396$sql = &$morewherefilter;
 
  404$search_array_options = $search_array_options_task;
 
  405$extrafieldsobjectprefix = 
'efpt.';
 
  406$search_options_pattern = 
'search_task_options_';
 
  407$extrafieldsobjectkey = 
'projet_task';
 
  408include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
 
  410$tasksarray = $taskstatic->getTasksArray(
null, 
null, ($project->id ? $project->id : 0), $socid, 0, $search_project_ref, $onlyopenedproject, $morewherefilter, ($search_usertoprocessid ? $search_usertoprocessid : 0), 0, $extrafields); 
 
  412$tasksarraywithoutfilter = array();
 
  413if ($morewherefilter) { 
 
  414  $tasksarraywithoutfilter = $taskstatic->getTasksArray(
null, 
null, ($project->id ? $project->id : 0), $socid, 0, 
'', $onlyopenedproject, 
'', ($search_usertoprocessid ? $search_usertoprocessid : 0)); 
 
  416$projectsrole = $taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, 
null, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
 
  417$tasksrole = $taskstatic->getUserRolesForProjectsOrTasks(
null, $usertoprocess, ($project->id ? $project->id : 0), 0, $onlyopenedproject);
 
  419llxHeader(
'', $title, 
'', 
'', 0, 0, array(
'/core/js/timesheet.js'), 
'', 
'', 
'mod-project project-activity page-activity_perday');
 
  424$param .= ($mode ? 
'&mode='.urlencode($mode) : 
'');
 
  425$param .= ($search_project_ref ? 
'&search_project_ref='.urlencode($search_project_ref) : 
'');
 
  426$param .= ($search_usertoprocessid > 0 ? 
'&search_usertoprocessid='.urlencode((
string) $search_usertoprocessid) : 
'');
 
  427$param .= ($search_thirdparty ? 
'&search_thirdparty='.urlencode($search_thirdparty) : 
'');
 
  428$param .= ($search_task_ref ? 
'&search_task_ref='.urlencode($search_task_ref) : 
'');
 
  429$param .= ($search_task_label ? 
'&search_task_label='.urlencode($search_task_label) : 
'');
 
  437$search_array_options = $search_array_options_task;
 
  438$search_options_pattern = 
'search_task_options_';
 
  439include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
 
  442$nav = 
'<a class="inline-block valignmiddle" href="?year='.$prev_year.
"&month=".$prev_month.
"&day=".$prev_day.$param.
'">'.
img_previous($langs->trans(
"Previous")).
"</a>\n";
 
  444$nav .= 
' <span id="month_name">'.dol_print_date(
dol_mktime(0, 0, 0, $month, $day, $year), 
"day").
" </span>\n";
 
  445$nav .= 
'<a class="inline-block valignmiddle" href="?year='.$next_year.
"&month=".$next_month.
"&day=".$next_day.$param.
'">'.
img_next($langs->trans(
"Next")).
"</a>\n";
 
  446$nav .= 
' '.$form->selectDate(-1, 
'', 0, 0, 2, 
"addtime", 1, (
$conf->dol_optimize_smallscreen ? 0 : 1)).
' ';
 
  447$nav .= 
' <button type="submit" name="button_search_x" value="x" class="bordertransp nobordertransp button_search"><span class="fa fa-search"></span></button>';
 
  451print 
'<form name="addtime" method="POST" action="'.$_SERVER[
"PHP_SELF"].($project->id > 0 ? 
'?id='.$project->id : 
'').
'">';
 
  452print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
  453print 
'<input type="hidden" name="action" value="addtime">';
 
  454print 
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
 
  455print 
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
 
  456print 
'<input type="hidden" name="mode" value="'.$mode.
'">';
 
  458print 
'<input type="hidden" name="addtimeyear" value="'.$tmp[
'year'].
'">';
 
  459print 
'<input type="hidden" name="addtimemonth" value="'.$tmp[
'mon'].
'">';
 
  460print 
'<input type="hidden" name="addtimeday" value="'.$tmp[
'mday'].
'">';
 
  463print 
dol_get_fiche_head($head, 
'inputperday', $langs->trans(
'TimeSpent'), -1, $picto);
 
  466print 
'<div class="hideonsmartphone opacitymedium">';
 
  467if ($mine || ($usertoprocess->id == $user->id)) {
 
  468  print $langs->trans(
"MyTasksDesc").
'.'.($onlyopenedproject ? 
' '.$langs->trans(
"OnlyOpenedProject") : 
'').
'<br>';
 
  470  if (empty($usertoprocess->id) || $usertoprocess->id < 0) {
 
  471    if ($user->hasRight(
'projet', 
'all', 
'lire') && !$socid) {
 
  472      print $langs->trans(
"ProjectsDesc").
'.'.($onlyopenedproject ? 
' '.$langs->trans(
"OnlyOpenedProject") : 
'').
'<br>';
 
  474      print $langs->trans(
"ProjectsPublicTaskDesc").
'.'.($onlyopenedproject ? 
' '.$langs->trans(
"OnlyOpenedProject") : 
'').
'<br>';
 
  478if ($mine || ($usertoprocess->id == $user->id)) {
 
  479  print $langs->trans(
"OnlyYourTaskAreVisible").
'<br>';
 
  481  print $langs->trans(
"AllTaskVisibleButEditIfYouAreAssigned").
'<br>';
 
  488print 
'<div class="'.($conf->dol_optimize_smallscreen ? 
'center centpercent' : 
'floatright right').
'">'.$nav.
'</div>'; 
 
  490print 
'<div class="colorbacktimesheet valignmiddle'.($conf->dol_optimize_smallscreen ? 
' center' : 
' float').
'">';
 
  491$titleassigntask = $langs->transnoentities(
"AssignTaskToMe");
 
  492if ($usertoprocess->id != $user->id) {
 
  493  $titleassigntask = $langs->transnoentities(
"AssignTaskToUser", $usertoprocess->getFullName($langs));
 
  495print 
'<div class="taskiddiv inline-block">';
 
  496print 
img_picto(
'', 
'projecttask', 
'class="pictofixedwidth"');
 
  497$formproject->selectTasks($socid ? $socid : -1, $taskid, 
'taskid', 32, 0, 
'-- '.$langs->trans(
"ChooseANotYetAssignedTask").
' --', 1, 0, 0, 
'widthcentpercentminusx', 
'', 
'all', $usertoprocess);
 
  500print $formcompany->selectTypeContact($object, 
'', 
'type', 
'internal', 
'position', 0, 
'maxwidth150onsmartphone');
 
  501print 
'<input type="submit" class="button valignmiddle smallonsmartphone small" name="assigntask" value="'.dol_escape_htmltag($titleassigntask).
'">';
 
  504print 
'<div class="clearboth" style="padding-bottom: 20px;"></div>';
 
  519$includeonly = 
'hierarchyme';
 
  520if (!$user->hasRight(
'user', 
'user', 
'lire')) {
 
  521  $includeonly = array($user->id);
 
  523$selecteduser = $search_usertoprocessid ? $search_usertoprocessid : $usertoprocess->id;
 
  524$moreforfiltertmp = $form->select_dolusers($selecteduser, 
'search_usertoprocessid', 0, 
null, 0, $includeonly, 
'', 0, 0, 0, 
'', 0, 
'', 
'maxwidth200');
 
  525if ($form->num > 1 || empty(
$conf->dol_optimize_smallscreen)) {
 
  526  $moreforfilter .= 
'<div class="divsearchfield">';
 
  527  $moreforfilter .= 
'<div class="inline-block hideonsmartphone"></div>';
 
  528  $moreforfilter .= 
img_picto($langs->trans(
'Filter').
' '.$langs->trans(
'User'), 
'user', 
'class="paddingright pictofixedwidth"');
 
  529  $moreforfilter .= $moreforfiltertmp;
 
  530  $moreforfilter .= 
'</div>';
 
  532  $moreforfilter .= 
'<input type="hidden" name="search_usertoprocessid" value="'.$selecteduser.
'">';
 
  536  $moreforfilter .= 
'<div class="divsearchfield">';
 
  537  $moreforfilter .= 
'<div class="inline-block"></div>';
 
  538  $moreforfilter .= 
img_picto($langs->trans(
'Filter').
' '.$langs->trans(
'Project'), 
'project', 
'class="paddingright pictofixedwidth"').
'<input type="text" name="search_project_ref" class="maxwidth100" value="'.
dol_escape_htmltag($search_project_ref).
'">';
 
  539  $moreforfilter .= 
'</div>';
 
  541  $moreforfilter .= 
'<div class="divsearchfield">';
 
  542  $moreforfilter .= 
'<div class="inline-block"></div>';
 
  543  $moreforfilter .= 
img_picto($langs->trans(
'Filter').
' '.$langs->trans(
'ThirdParty'), 
'company', 
'class="paddingright pictofixedwidth"').
'<input type="text" name="search_thirdparty" class="maxwidth100" value="'.
dol_escape_htmltag($search_thirdparty).
'">';
 
  544  $moreforfilter .= 
'</div>';
 
  547if (!empty($moreforfilter)) {
 
  548  print 
'<div class="liste_titre liste_titre_bydiv centpercent">';
 
  549  print $moreforfilter;
 
  550  $parameters = array();
 
  551  $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters, $object, $action); 
 
  552  print $hookmanager->resPrint;
 
  556$varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
 
  557$selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage); 
 
  561if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
 
  564if (!empty($arrayfields[
't.progress'][
'checked'])) {
 
  567foreach ($arrayfields as $key => $val) {
 
  568  if ($val[
'checked'] && substr($key, 0, 5) == 
'efpt.') {
 
  573print 
'<div class="div-table-responsive">';
 
  574print 
'<table class="tagtable liste'.($moreforfilter ? 
" listwithfilterbefore" : 
"").
'" id="tablelines3">'.
"\n";
 
  576print 
'<tr class="liste_titre_filter">';
 
  578  print 
'<td class="liste_titre"><input type="text" size="4" name="search_project_ref" value="'.dol_escape_htmltag($search_project_ref).
'"></td>';
 
  581  print 
'<td class="liste_titre"><input type="text" size="4" name="search_thirdparty" value="'.dol_escape_htmltag($search_thirdparty).
'"></td>';
 
  583print 
'<td class="liste_titre"><input type="text" size="4" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).
'"></td>';
 
  585$search_options_pattern = 
'search_task_options_';
 
  586$extrafieldsobjectkey = 
'projet_task';
 
  587$extrafieldsobjectprefix = 
'efpt.';
 
  588include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
 
  589if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
 
  590  print 
'<td class="liste_titre"></td>';
 
  592if (!empty($arrayfields[
't.progress'][
'checked'])) {
 
  593  print 
'<td class="liste_titre right"><input type="text" size="4" name="search_declared_progress" value="'.dol_escape_htmltag($search_declared_progress).
'"></td>';
 
  595if (!empty($arrayfields[
'timeconsumed'][
'checked'])) {
 
  596  print 
'<td class="liste_titre"></td>';
 
  597  print 
'<td class="liste_titre"></td>';
 
  599print 
'<td class="liste_titre"></td>';
 
  600print 
'<td class="liste_titre"></td>';
 
  601print 
'<td class="liste_titre"></td>';
 
  603print 
'<td class="liste_titre nowrap right">';
 
  604$searchpicto = $form->showFilterAndCheckAddButtons(0);
 
  609print 
'<tr class="liste_titre">';
 
  611  print 
'<th>'.$langs->trans(
"Project").
'</th>';
 
  614  print 
'<th>'.$langs->trans(
"ThirdParty").
'</th>';
 
  616print 
'<th>'.$langs->trans(
"Task").
'</th>';
 
  618$extrafieldsobjectkey = 
'projet_task';
 
  619$extrafieldsobjectprefix = 
'efpt.';
 
  620include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
 
  621if (!empty($arrayfields[
't.planned_workload'][
'checked'])) {
 
  622  print 
'<th class="leftborder plannedworkload minwidth75 maxwidth100 right" title="'.dol_escape_htmltag($langs->trans(
"PlannedWorkload")).
'">'.$form->textwithpicto($langs->trans(
"PlannedWorkloadShort"), $langs->trans(
"PlannedWorkload")).
'</th>';
 
  624if (!empty($arrayfields[
't.progress'][
'checked'])) {
 
  625  print 
'<th class="right minwidth75 maxwidth100 title="'.dol_escape_htmltag($langs->trans(
"ProgressDeclared")).
'">'.$langs->trans(
"ProgressDeclared").
'</th>';
 
  627if (!empty($arrayfields[
'timeconsumed'][
'checked'])) {
 
  628  print 
'<th class="right maxwidth100">'.$langs->trans(
"TimeSpentSmall").
'<br>';
 
  629  print 
'<span class="nowraponall">';
 
  630  print 
'<span class="opacitymedium nopadding userimg"><img alt="Photo" class="photouserphoto userphoto" src="'.DOL_URL_ROOT.
'/theme/common/everybody.png"></span>';
 
  631  print 
'<span class="opacitymedium paddingleft">'.$langs->trans(
"EverybodySmall").
'</span>';
 
  634  print 
'<th class="right maxwidth75 maxwidth100">'.$langs->trans(
"TimeSpentSmall").($usertoprocess->firstname ? 
'<br><span class="nowraponall">'.$usertoprocess->getNomUrl(-2).
'<span class="opacitymedium paddingleft">'.
dol_trunc($usertoprocess->firstname, 10).
'</span></span>' : 
'').
'</th>';
 
  636print 
'<th class="center leftborder">'.$langs->trans(
"HourStart").
'</td>';
 
  639$restrictviewformytask = 
getDolGlobalInt(
'PROJECT_TIME_SHOW_TASK_NOT_ASSIGNED', 2);
 
  641$numendworkingday = 0;
 
  642$numstartworkingday = 0;
 
  644$isavailable = array();
 
  647$numstartworkingday = 1;
 
  648$numendworkingday = 5;
 
  652  if (count($tmparray) >= 2) {
 
  653    $numstartworkingday = $tmparray[0];
 
  654    $numendworkingday = $tmparray[1];
 
  659$isavailablefordayanduser = $holiday->verifDateHolidayForTimestamp($usertoprocess->id, $daytoparse, $statusofholidaytocheck); 
 
  660$isavailable[$daytoparse] = $isavailablefordayanduser; 
 
  662$test = 
num_public_holiday($daytoparsegmt, $daytoparsegmt + 86400, $mysoc->country_code);
 
  664  $isavailable[$daytoparse] = array(
'morning' => 
false, 
'afternoon' => 
false, 
'morning_reason' => 
'public_holiday', 
'afternoon_reason' => 
'public_holiday');
 
  672if ((($idw + 1) < $numstartworkingday) || (($idw + 1) > $numendworkingday)) { 
 
  673  $cssweekend = 
'weekend';
 
  679if (!$isavailable[$daytoparse][
'morning'] && !$isavailable[$daytoparse][
'afternoon']) {
 
  680  $cssonholiday .= 
'onholidayallday ';
 
  681} elseif (!$isavailable[$daytoparse][
'morning']) {
 
  682  $cssonholiday .= 
'onholidaymorning ';
 
  683} elseif (!$isavailable[$daytoparse][
'afternoon']) {
 
  684  $cssonholiday .= 
'onholidayafternoon ';
 
  687print 
'<th class="center'.($cssonholiday ? 
' '.$cssonholiday : 
'').($cssweekend ? 
' '.$cssweekend : 
'').
'">'.$langs->trans(
"Duration").
'</th>';
 
  688print 
'<th class="center">'.$langs->trans(
"Note").
'</th>';
 
  690print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"], 
"", 
'', 
'', 
'', $sortfield, $sortorder, 
'center maxwidthsearch ');
 
  694$colspan = 2 + (!
getDolGlobalString(
'PROJECT_TIMESHEET_DISABLEBREAK_ON_PROJECT') ? 0 : 2);
 
  696if (
$conf->use_javascript_ajax && count($tasksarray) >= 
getDolGlobalInt(
'NBLINES_TO_DUPLICATE_TOTAL_TIMESPENT_ON_TOP', 10)) {
 
  697  print 
'<tr class="liste_total hideonsmartphone">';
 
  698  print 
'<td class="liste_total" colspan="'.($colspan - 1 + $addcolspan).
'">';
 
  699  print $langs->trans(
"Total");
 
  701  if (!empty($arrayfields[
'timeconsumed'][
'checked'])) {
 
  702    print 
'<td class="liste_total"></td>';
 
  703    print 
'<td class="liste_total"></td>';
 
  705  print 
'<td class="liste_total leftborder">';
 
  709  print 
'<td class="liste_total center'.($cssonholiday ? 
' '.$cssonholiday : 
'').($cssweekend ? 
' '.$cssweekend : 
'').
'"><div class="totalDay0"> </div></td>';
 
  711  print 
'<td class="liste_total"></td>';
 
  712  print 
'<td class="liste_total"></td>';
 
  717if (count($tasksarray) > 0) {
 
  724  $totalforvisibletasks = 
projectLinesPerDay($j, 0, $usertoprocess, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restrictviewformytask, $daytoparse, $isavailable, 0, $arrayfields, $extrafields);
 
  730  $listofdistinctprojectid = array(); 
 
  731  if (!empty($tasksarraywithoutfilter) && is_array($tasksarraywithoutfilter) && count($tasksarraywithoutfilter)) {
 
  732    foreach ($tasksarraywithoutfilter as $tmptask) {
 
  733      $listofdistinctprojectid[$tmptask->fk_project] = $tmptask->fk_project;
 
  737  $totalforeachday = array();
 
  738  foreach ($listofdistinctprojectid as $tmpprojectid) {
 
  739    $projectstatic->id = $tmpprojectid;
 
  740    $projectstatic->loadTimeSpent($daytoparse, 0, $usertoprocess->id); 
 
  741    for ($idw = 0; $idw < 7; $idw++) {
 
  743      $totalforeachday[$tmpday] += $projectstatic->weekWorkLoad[$tmpday];
 
  750  if (count($totalforeachday)) {
 
  751    $timeonothertasks = ($totalforeachday[$daytoparse] - $totalforvisibletasks[$daytoparse]);
 
  752    if ($timeonothertasks) {
 
  759    print 
'<tr class="oddeven othertaskwithtime">';
 
  760    print 
'<td colspan="'.($colspan - 1).
'" class="opacitymedium">';
 
  761    print $langs->trans(
"OtherFilteredTasks");
 
  763    if (!empty($arrayfields[
'timeconsumed'][
'checked'])) {
 
  764      print 
'<td class="liste_total"></td>';
 
  765      print 
'<td class="liste_total"></td>';
 
  767    print 
'<td class="leftborder"></td>';
 
  768    print 
'<td class="right">';
 
  769    $timeonothertasks = ($totalforeachday[$daytoparse] - $totalforvisibletasks[$daytoparse]);
 
  772    print 
'<span class="timesheetalreadyrecorded" title="texttoreplace"><input type="text" class="center width40" disabled="" id="timespent[-1][0]" name="task[-1][0]" value="';
 
  773    if ($timeonothertasks) {
 
  779    print 
' <td class="liste_total borderleft"></td>';
 
  780    print 
' <td class="liste_total"></td>';
 
  784  if (
$conf->use_javascript_ajax) {
 
  785    print 
'<tr class="liste_total">';
 
  786    print 
'<td class="liste_total" colspan="'.($colspan - 1 + $addcolspan).
'">';
 
  787    print $langs->trans(
"Total");
 
  789    if (!empty($arrayfields[
'timeconsumed'][
'checked'])) {
 
  790      print 
'<td class="liste_total"></td>';
 
  791      print 
'<td class="liste_total"></td>';
 
  793    print 
'<td class="liste_total leftborder borderleft">';
 
  797    print 
'<td class="liste_total center'.($cssonholiday ? 
' '.$cssonholiday : 
'').($cssweekend ? 
' '.$cssweekend : 
'').
'"><div class="totalDay0"> </div></td>';
 
  799    print 
'<td class="liste_total"></td> 
  800                <td class="liste_total"></td> 
  804  print 
'<tr><td colspan="14"><span class="opacitymedium">'.$langs->trans(
"NoAssignedTasks").
'</span></td></tr>';
 
  809print 
'<input type="hidden" id="numberOfLines" name="numberOfLines" value="'.count($tasksarray).
'"/>'.
"\n";
 
  811print 
'<div class="center">';
 
  812print 
'<input type="submit" name="button_addtime" class="button button-save"'.(!empty($disabledtask) ? 
' disabled' : 
'').
' value="'.$langs->trans(
"Save").
'">';
 
  817if (!empty(
$conf->use_javascript_ajax)) {
 
  818  $modeinput = 
'hours';
 
  819  print 
"\n<!-- JS CODE TO ENABLE Tooltips on all object with class classfortooltip -->\n";
 
  820  print 
'<script type="text/javascript">'.
"\n";
 
  821  print 
"jQuery(document).ready(function () {\n";
 
  822  print 
"   updateTotal(0, '".dol_escape_js($modeinput).
"');\n";
 
  823  print 
'   jQuery(".timesheetalreadyrecorded").tooltip({ 
  824          show: { collision: "flipfit", effect:\'toggle\', delay:50 }, 
  825          hide: { effect:\'toggle\', delay: 50 }, 
  826          tooltipClass: "mytooltip", 
  827          content: function () { 
  828            return \''.dol_escape_js($langs->trans(
"TimeAlreadyRecorded", $usertoprocess->getFullName($langs))).
'\';
 
  831  print "   jQuery('.inputhour, .inputminute
').bind('keyup
', function(e) { updateTotal(0, '".dol_escape_js($modeinput)."') });"; 
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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
 
Class of the module paid holiday.
 
const STATUS_APPROVED
Approved.
 
Class to manage projects.
 
Class to manage third parties objects (customers, suppliers, prospects...)
 
Class to manage Dolibarr users.
 
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
 
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
 
num_public_holiday($timestampStart, $timestampEnd, $country_code='', $lastday=0, $includesaturday=-1, $includesunday=-1, $includefriday=-1, $includemonday=-1)
Return the number of non working days including Friday, Saturday and Sunday (or not) between 2 dates ...
 
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...
 
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
 
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.
 
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
 
dol_get_fiche_end($notab=0)
Return tab footer of a card.
 
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...
 
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.
 
img_previous($titlealt='default', $moreatt='')
Show previous logo.
 
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
 
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
 
img_next($titlealt='default', $moreatt='')
Show next logo.
 
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
 
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
 
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
 
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
 
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
 
projectLinesPerDay(&$inc, $parent, $fuser, $lines, &$level, &$projectsrole, &$tasksrole, $mine, $restricteditformytask, $preselectedday, &$isavailable, $oldprojectforbreak=0, $arrayfields=array(), $extrafields=null)
Output a task line into a pertime input mode.
 
project_timesheet_prepare_head($mode, $fuser=null)
Prepare array with list of tabs.
 
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.