/** * Get a combined array with time recordings and expenses to export. * * @param int $start Time from which to take entries into account. * @param int $end Time until which to take entries into account. * @param array $users Array of user IDs to filter by. * @param array $customers Array of customer IDs to filter by. * @param array $projects Array of project IDs to filter by. * @param array $events Array of event IDs to filter by. * @param bool $limit sbould the amount of entries be limited * @param bool $reverse_order should the entries be put out in reverse order * @param string $default_location use this string if no location is set for the entry * @param int $filter_cleared (-1: show all, 0:only cleared 1: only not cleared) entries * @param int $filter_type (-1 show time and expenses, 0: only show time entries, 1: only show expenses) * @param int $limitCommentSize should comments be cut off, when they are too long * @return array with time recordings and expenses chronologically sorted */ function xp_get_arr($start, $end, $users = null, $customers = null, $projects = null, $events = null, $limit = false, $reverse_order = false, $default_location = '', $filter_cleared = -1, $filter_type = -1, $limitCommentSize = true, $filter_refundable = -1) { global $expense_ext_available; $zef_arr = array(); $exp_arr = array(); if ($filter_type != 1) { $zef_arr = get_arr_zef($start, $end, $users, $customers, $projects, $events, $limit, $reverse_order, $filter_cleared); } if ($filter_type != 0 && $expense_ext_available) { $exp_arr = get_arr_exp($start, $end, $users, $customers, $projects, $limit, $reverse_order, $filter_refundable, $filter_cleared); } $result_arr = array(); $zef_arr_index = 0; $exp_arr_index = 0; while ($zef_arr_index < count($zef_arr) && $exp_arr_index < count($exp_arr)) { $arr = array(); if (!$reverse_order && $zef_arr[$zef_arr_index]['zef_in'] > $exp_arr[$exp_arr_index]['exp_timestamp'] || $reverse_order && $zef_arr[$zef_arr_index]['zef_in'] < $exp_arr[$exp_arr_index]['exp_timestamp']) { if ($zef_arr[$zef_arr_index]['zef_out'] != 0) { // active recordings will be omitted $arr['type'] = 'zef'; $arr['id'] = $zef_arr[$zef_arr_index]['zef_ID']; $arr['time_in'] = $zef_arr[$zef_arr_index]['zef_in']; $arr['time_out'] = $zef_arr[$zef_arr_index]['zef_out']; $arr['zef_time'] = $zef_arr[$zef_arr_index]['zef_time']; $arr['zef_duration'] = $zef_arr[$zef_arr_index]['zef_duration']; $arr['dec_zef_time'] = sprintf("%01.2f", $zef_arr[$zef_arr_index]['zef_time'] / 3600); $arr['zef_rate'] = $zef_arr[$zef_arr_index]['zef_rate']; $arr['wage'] = $zef_arr[$zef_arr_index]['wage']; $arr['wage_decimal'] = $zef_arr[$zef_arr_index]['wage_decimal']; $arr['pct_kndID'] = $zef_arr[$zef_arr_index]['pct_kndID']; $arr['knd_name'] = $zef_arr[$zef_arr_index]['knd_name']; $arr['pct_ID'] = $zef_arr[$zef_arr_index]['pct_ID']; $arr['pct_name'] = $zef_arr[$zef_arr_index]['pct_name']; $arr['pct_comment'] = $zef_arr[$zef_arr_index]['pct_comment']; $arr['zef_evtID'] = $zef_arr[$zef_arr_index]['zef_evtID']; $arr['evt_name'] = $zef_arr[$zef_arr_index]['evt_name']; if ($limitCommentSize) { $arr['comment'] = addEllipsis($zef_arr[$zef_arr_index]['zef_comment'], 150); } else { $arr['comment'] = $zef_arr[$zef_arr_index]['zef_comment']; } $arr['comment_type'] = $zef_arr[$zef_arr_index]['zef_comment_type']; $arr['location'] = $zef_arr[$zef_arr_index]['zef_location']; if (empty($arr['location'])) { $arr['location'] = $default_location; } $arr['trackingnr'] = $zef_arr[$zef_arr_index]['zef_trackingnr']; $arr['username'] = $zef_arr[$zef_arr_index]['usr_name']; $arr['cleared'] = $zef_arr[$zef_arr_index]['zef_cleared']; } $zef_arr_index++; } else { $arr['type'] = 'exp'; $arr['id'] = $exp_arr[$exp_arr_index]['exp_ID']; $arr['time_in'] = $exp_arr[$exp_arr_index]['exp_timestamp']; $arr['time_out'] = $exp_arr[$exp_arr_index]['exp_timestamp']; $arr['zef_time'] = null; $arr['zef_apos'] = null; $arr['dec_zef_time'] = null; $arr['zef_rate'] = null; $arr['wage'] = sprintf("%01.2f", $exp_arr[$exp_arr_index]['exp_value'] * $exp_arr[$exp_arr_index]['exp_multiplier']); $arr['pct_kndID'] = $exp_arr[$exp_arr_index]['pct_kndID']; $arr['knd_name'] = $exp_arr[$exp_arr_index]['knd_name']; $arr['pct_ID'] = $exp_arr[$exp_arr_index]['pct_ID']; $arr['pct_name'] = $exp_arr[$exp_arr_index]['pct_name']; if ($limitCommentSize) { $arr['comment'] = addEllipsis($exp_arr[$exp_arr_index]['exp_comment'], 150); } else { $arr['comment'] = $exp_arr[$exp_arr_index]['exp_comment']; } $arr['evt_name'] = $exp_arr[$exp_arr_index]['exp_designation']; $arr['comment'] = $exp_arr[$exp_arr_index]['exp_comment']; $arr['comment_type'] = $exp_arr[$exp_arr_index]['exp_comment_type']; $arr['location'] = $default_location; $arr['trackingnr'] = null; $arr['username'] = $exp_arr[$exp_arr_index]['usr_name']; $arr['cleared'] = $exp_arr[$exp_arr_index]['exp_cleared']; $exp_arr_index++; } $result_arr[] = $arr; } while ($zef_arr_index < count($zef_arr)) { if ($zef_arr[$zef_arr_index]['zef_out'] != 0) { // active recordings will be omitted $arr = array(); $arr['type'] = 'zef'; $arr['id'] = $zef_arr[$zef_arr_index]['zef_ID']; $arr['time_in'] = $zef_arr[$zef_arr_index]['zef_in']; $arr['time_out'] = $zef_arr[$zef_arr_index]['zef_out']; $arr['zef_time'] = $zef_arr[$zef_arr_index]['zef_time']; $arr['zef_duration'] = $zef_arr[$zef_arr_index]['zef_duration']; $arr['dec_zef_time'] = sprintf("%01.2f", $zef_arr[$zef_arr_index]['zef_time'] / 3600); $arr['zef_rate'] = $zef_arr[$zef_arr_index]['zef_rate']; $arr['wage'] = $zef_arr[$zef_arr_index]['wage']; $arr['wage_decimal'] = $zef_arr[$zef_arr_index]['wage_decimal']; $arr['pct_kndID'] = $zef_arr[$zef_arr_index]['pct_kndID']; $arr['knd_name'] = $zef_arr[$zef_arr_index]['knd_name']; $arr['pct_ID'] = $zef_arr[$zef_arr_index]['pct_ID']; $arr['pct_name'] = $zef_arr[$zef_arr_index]['pct_name']; $arr['pct_comment'] = $zef_arr[$zef_arr_index]['pct_comment']; $arr['zef_evtID'] = $zef_arr[$zef_arr_index]['zef_evtID']; $arr['evt_name'] = $zef_arr[$zef_arr_index]['evt_name']; if ($limitCommentSize) { $arr['comment'] = addEllipsis($zef_arr[$zef_arr_index]['zef_comment'], 150); } else { $arr['comment'] = $zef_arr[$zef_arr_index]['zef_comment']; } $arr['comment_type'] = $zef_arr[$zef_arr_index]['zef_comment_type']; $arr['location'] = $zef_arr[$zef_arr_index]['zef_location']; if (empty($arr['location'])) { $arr['location'] = $default_location; } $arr['trackingnr'] = $zef_arr[$zef_arr_index]['zef_trackingnr']; $arr['username'] = $zef_arr[$zef_arr_index]['usr_name']; $arr['cleared'] = $zef_arr[$zef_arr_index]['zef_cleared']; $result_arr[] = $arr; } $zef_arr_index++; } while ($exp_arr_index < count($exp_arr)) { $arr = array(); $arr['type'] = 'exp'; $arr['id'] = $exp_arr[$exp_arr_index]['exp_ID']; $arr['time_in'] = $exp_arr[$exp_arr_index]['exp_timestamp']; $arr['time_out'] = $exp_arr[$exp_arr_index]['exp_timestamp']; $arr['zef_time'] = null; $arr['zef_apos'] = null; $arr['dec_zef_time'] = null; $arr['zef_rate'] = null; $arr['wage'] = sprintf("%01.2f", $exp_arr[$exp_arr_index]['exp_value'] * $exp_arr[$exp_arr_index]['exp_multiplier']); $arr['pct_kndID'] = $exp_arr[$exp_arr_index]['pct_kndID']; $arr['knd_name'] = $exp_arr[$exp_arr_index]['knd_name']; $arr['pct_ID'] = $exp_arr[$exp_arr_index]['pct_ID']; $arr['pct_name'] = $exp_arr[$exp_arr_index]['pct_name']; if ($limitCommentSize) { $arr['comment'] = addEllipsis($exp_arr[$exp_arr_index]['exp_comment'], 150); } else { $arr['comment'] = $exp_arr[$exp_arr_index]['exp_comment']; } $arr['evt_name'] = $exp_arr[$exp_arr_index]['exp_designation']; $arr['comment'] = $exp_arr[$exp_arr_index]['exp_comment']; $arr['comment_type'] = $exp_arr[$exp_arr_index]['exp_comment_type']; $arr['username'] = $exp_arr[$exp_arr_index]['usr_name']; $arr['cleared'] = $exp_arr[$exp_arr_index]['exp_cleared']; $exp_arr_index++; $result_arr[] = $arr; } return $result_arr; }
/** * Create an array of arrays which hold the size of the pie chart elements * for every projects. * The first element in the inner arrays represents the unused budget costs, * the second element in the inner arrays represents the expense costs, * the third and all other elements in the inner arrays represents the * costs for individual events. * * An visual example for two projects with the ID 2 and 5: * $array = { * 2 => array (budget left , expenses cost, task1, task2 ), * 5 => array (budget left , expenses cost, task1, task2 ), * }; * * @param array $projects IDs of all projects to include in the plot data * @param array $usedEvents array of all used events (each as an array of its data) * @return array containing arrays for every project which hold the size of the pie chart elements * */ function budget_plot_data($projects, &$usedEvents, &$expensesOccured) { $wages = array(); $eventUsage = array(); // track what events are used $usedEvents = array(); $expensesOccured = false; $events = get_arr_evt("all"); /* * sum up expenses */ foreach ($projects as $project) { $pctId = $project['pct_ID']; $wages[$pctId]['budget'] = $project['pct_budget']; $wages[$pctId]['expenses'] = calculate_expenses_sum($project['pct_ID']); if ($wages[$pctId]['expenses'] != 0) { $expensesOccured = true; } if ($wages[$pctId]['budget'] < 0) { //Costs over budget, set remaining budget to 0. $wages[$pctId]['budget'] = 0; } // initialize entries for every event using its ID foreach ($events as $event) { $wages[$pctId][$event['evt_ID']] = 0; } } /* * sum up wages for every project and every event */ foreach ($projects as $project) { $projectId = $project['pct_ID']; $zef_arr = get_arr_zef(0, time(), null, null, array($projectId)); foreach ($zef_arr as $zef) { $pctId = $zef['zef_pctID']; if ($zef['wage_decimal'] == 0.0) { continue; } if (key_exists($zef['zef_evtID'], $wages[$pctId])) { $eventUsage[$zef['zef_evtID']] = true; $wages[$pctId][$zef['zef_evtID']] += $zef['wage_decimal']; $wages[$pctId]['budget'] -= $zef['wage_decimal']; } if ($wages[$pctId]['budget'] < 0) { //Costs over budget, set remaining budget to 0. $wages[$pctId]['budget'] = 0; } } } /* * Delete unused events. */ foreach ($events as $event) { if (isset($eventUsage[$event['evt_ID']])) { $usedEvents[] = $event; continue; } foreach ($wages as $projectData) { unset($projectData[$event['evt_ID']]); } } /* * Convert array of wages to javascript array for every project. */ $plot_data = array(); foreach ($wages as $project_id => $wage_array) { $plot_data[$project_id] = '[' . implode(',', $wage_array) . ']'; } return $plot_data; }
} else { $filterPct = explode(':', $filters[2]); } if ($filters[3] == "") { $filterEvt = array(); } else { $filterEvt = explode(':', $filters[3]); } // if no userfilter is set, set it to current user if (isset($kga['usr']) && count($filterUsr) == 0) { array_push($filterUsr, $kga['usr']['usr_ID']); } if (isset($kga['customer'])) { $filterKnd = array($kga['customer']['knd_ID']); } $arr_zef = get_arr_zef($in, $out, $filterUsr, $filterKnd, $filterPct, $filterEvt, 1); if (count($arr_zef) > 0) { $tpl->assign('arr_zef', $arr_zef); } else { $tpl->assign('arr_zef', 0); } $tpl->assign('total', formatDuration(get_zef_time($in, $out, $filterUsr, $filterKnd, $filterPct, $filterEvt))); $ann = get_arr_time_usr($in, $out, $filterUsr, $filterKnd, $filterPct, $filterEvt); formatAnnotations($ann); $tpl->assign('usr_ann', $ann); $ann = get_arr_time_knd($in, $out, $filterUsr, $filterKnd, $filterPct, $filterEvt); formatAnnotations($ann); $tpl->assign('knd_ann', $ann); $ann = get_arr_time_pct($in, $out, $filterUsr, $filterKnd, $filterPct, $filterEvt); formatAnnotations($ann); $tpl->assign('pct_ann', $ann);
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); // Get the total time displayed in the table. if (isset($kga['customer'])) { $total = formatDuration(get_zef_time($in, $out, null, array($kga['customer']['knd_ID']), null)); } else { $total = formatDuration(get_zef_time($in, $out, array($kga['usr']['usr_ID']), null, null)); } $tpl->assign('total', $total); // Get the array of timesheet entries. if (isset($kga['customer'])) { $arr_zef = get_arr_zef($in, $out, null, array($kga['customer']['knd_ID']), null, 1); } else { $arr_zef = get_arr_zef($in, $out, array($kga['usr']['usr_ID']), null, null, 1); } if (count($arr_zef) > 0) { $tpl->assign('arr_zef', $arr_zef); } else { $tpl->assign('arr_zef', 0); } // Get the annotations for the user sub list. if (isset($kga['customer'])) { $ann = get_arr_time_usr($in, $out, null, array($kga['customer']['knd_ID'])); } else { $ann = get_arr_time_usr($in, $out, array($kga['usr']['usr_ID'])); } formatAnnotations($ann); $tpl->assign('usr_ann', $ann); // Get the annotations for the customer sub list.
{ $precision = $prec; // suppress division by zero errror if ($precision == 0.0) { $precision = 1.0; } return floor($value / $precision + 0.5) * $precision; } // insert KSPI $isCoreProcessor = 0; $dir_templates = "templates/"; $usr = checkUser(); $timespace = get_timespace(); $in = $timespace[0]; $out = $timespace[1]; $timeArray = get_arr_zef($in, $out, null, null, array($_REQUEST['pct_ID']), 1); /* $timeArray now contains: zef_ID, zef_in, zef_out, zef_time, zef_rate, zef_pctID, zef_evtID, zef_usrID, pct_ID, knd_name, pct_kndID, evt_name, pct_comment, pct_name, zef_location, zef_trackingnr, zef_comment, zef_comment_type, usr_name, usr_alias, zef_cleared */ $date = date("m-d-Y"); $month = $kga['lang']['months'][date("n", $out) - 1]; $year = date("Y", $out); if (count($timeArray) > 0) { // customer data $kndArray = get_entry_knd($timeArray[0]['knd_name']); $project = html_entity_decode($timeArray[0]['pct_name']); $customerName = html_entity_decode($timeArray[0]['knd_name']); $companyName = $kndArray['knd_company']; $customerStreet = $kndArray['knd_street'];