File: /home/dmstechonline/crm.dmstech.online/modules/resource_workload/models/Resource_workload_model.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');
/**
* This class describes a resource workload model.
*/
class Resource_workload_model extends App_Model
{
public function __construct()
{
parent::__construct();
}
/**
* Gets the data workload.
*
* @param object $data_fill The data fill
*
* @return array The data workload.
*/
public function get_data_workload($data_fill, $only_data = false)
{
if($data_fill['to_date'] == ''){
$from_date = date('Y-m-d');
}else{
$from_date = $data_fill['from_date'];
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($data_fill['from_date']);
}
}
if($data_fill['to_date'] == ''){
$to_date = date('Y-m-d');
}else{
$to_date = $data_fill['to_date'];
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($data_fill['to_date']);
}
}
$staffsTasksWhere = '';
$where_project = '';
if (isset($data_fill['project'])) {
foreach ($data_fill['project'] as $key => $value) {
if ($where_project == '') {
$where_project = '(rel_type = "project" and rel_id = ' . $value . ')';
} else {
$where_project .= ' or (rel_type = "project" and rel_id = ' . $value . ')';
}
}
if ($where_project != '') {
$staffsTasksWhere .= ' and (' . $where_project . ') ';
}
}
$list_staffids = $this->get_staff_workload($data_fill, true);
$staffsTasks = $this->get_staff_task_workload($data_fill, $staffsTasksWhere);
$staffsTasks_recurring = $this->get_staff_workload_recurring($data_fill, $staffsTasksWhere);
$staffsTasks_recurring_ids = [];
foreach ($staffsTasks_recurring as $key => $task) {
if(in_array($task['taskid'], $staffsTasks_recurring_ids)){
continue;
}
$node = [];
$type = $task['recurring_type'];
$repeat_every = $task['repeat_every'];
$last_recurring_date = $task['last_recurring_date'];
$task_date = $task['startdate'];
$cycles = $task['cycles'];
$total_cycles = $task['total_cycles'];
// Current date
$date = new DateTime(date('Y-m-d'));
while ($total_cycles <= $cycles) {
// Check if is first recurring
if (!$last_recurring_date) {
$last_recurring_date = date('Y-m-d', strtotime($task_date));
} else {
$last_recurring_date = date('Y-m-d', strtotime($last_recurring_date));
}
$re_create_at = date('Y-m-d', strtotime('+' . $repeat_every . ' ' . strtoupper($type), strtotime($last_recurring_date)));
if ($to_date >= $re_create_at) {
$node = $task;
$node['startdate'] = $re_create_at;
$last_recurring_date = $node['startdate'];
$node['taskid'] = 0;
$overwrite_params = [
'startdate' => $re_create_at,
'status' => hooks()->apply_filters('recurring_task_status', 1),
'recurring_type' => null,
'repeat_every' => 0,
'cycles' => 0,
'recurring' => 0,
'custom_recurring' => 0,
'last_recurring_date' => null,
'is_recurring_from' => $task['taskid'],
];
if (!empty($task['duedate'])) {
$dStart = new DateTime($task['startdate']);
$dEnd = new DateTime($task['duedate']);
$dDiff = $dStart->diff($dEnd);
$node['duedate'] = date('Y-m-d', strtotime('+' . $dDiff->days . ' days', strtotime($re_create_at)));
}
$staffsTasks[] = $node;
}else{
$total_cycles++;
}
if($cycles != 0){
$total_cycles++;
}
}
$staffsTasks_recurring_ids[] = $task['taskid'];
}
$data = [];
$data_overload = [];
$data_timesheets_return = [];
$data_tooltip_2 = [];
$data_tooltip = [];
$total_capacity = 0;
$total_estimate = 0;
$total_spent_time = 0;
$task_from_date = $from_date;
$task_to_date = $to_date;
$data_array = [];
$data_assigned = [];
foreach ($staffsTasks as $key => $value) {
if(strtotime($task_from_date) > strtotime($value['startdate']) && $value['startdate'] != ''){
$task_from_date = $value['startdate'];
}
if(strtotime($task_to_date) < strtotime($value['duedate']) && $value['duedate'] != ''){
$task_to_date = $value['duedate'];
}
$data_assigned[$value['taskid']][] = $value['staffid'];
$data_assigned[$value['taskid']] = array_unique($data_assigned[$value['taskid']]);
if(isset($data_array[$value['staffid'].'_'.$value['taskid']]) && $value['taskid'] != 0){
if(isset($value['total_logged_time'])){
$data_array[$value['staffid'].'_'.$value['taskid']]['taskstimers'][] = ['total_logged_time' => $value['total_logged_time'], 'start_time' => date('Y-m-d', strtotime(to_sql_date(_dt($value['start_time'], true), true))), 'end_time' => date('Y-m-d', strtotime(to_sql_date(_dt($value['end_time'], true), true)))];
}
}else{
$node = [];
$node['staffid'] = $value['staffid'];
$node['full_name'] = $value['full_name'];
$node['role_name'] = $value['role_name'];
$node['name'] = $value['name'];
$node['department_name'] = $value['department_name'];
$node['taskid'] = $value['taskid'];
$node['startdate'] = $value['startdate'];
$node['duedate'] = $value['duedate'];
$node['datefinished'] = $value['datefinished'];
$node['estimate_hour'] = $value['estimate_hour'];
if(isset($value['total_logged_time']) && $value['taskid'] != 0){
$node['taskstimers'][] = ['total_logged_time' => $value['total_logged_time'], 'start_time' => date('Y-m-d', strtotime(to_sql_date(_dt($value['start_time'], true), true))), 'end_time' => date('Y-m-d', strtotime(to_sql_date(_dt($value['end_time'], true), true)))];
}
if($value['taskid'] != 0){
$data_array[$value['staffid'].'_'.$value['taskid']] = $node;
}else{
$data_array[$value['taskid'].'_'.$key] = $node;
}
}
}
$standard_workload_by_list_staff = $this->get_standard_workload_by_list_staff($list_staffids, $task_from_date, $task_to_date);
$standard_workload = $standard_workload_by_list_staff['standard_workload'];
$data_timesheets = $standard_workload_by_list_staff['data_timesheets'];
$date_working = $this->check_range_date_working($list_staffids, $task_from_date, $task_to_date);
foreach ($data_array as $key => $value) {
$staffid = $value['staffid'];
if (!isset($data[$staffid]['capacity'])) {
$data[$staffid]['staff_id'] = $value['staffid'];
$data[$staffid]['staff_name'] = $value['full_name'];
$data[$staffid]['staff_role'] = $value['role_name'];
$data[$staffid]['capacity'] = $this->get_total_standard_workload($standard_workload, $date_working[$staffid], $value['staffid'], $from_date, $to_date);
$total_capacity += $data[$staffid]['capacity'];
$data[$staffid]['staff_department'] = $value['department_name'];
$data[$staffid] = $this->create_array_data_workload($from_date, $to_date, $data[$staffid]);
if ($only_data == false) {
$data_tooltip_2[$staffid] = $this->create_array_data_tooltip_workload($data_timesheets, $value['staffid'], $from_date, $to_date, []);
}
}
if(!is_numeric($value['taskid'])){
continue;
}
if ($value['duedate'] == '') {
if ($value['datefinished'] == '') {
$value['duedate'] = date('Y-m-d');
} else {
$value['duedate'] = date('Y-m-d', strtotime($value['datefinished']));
}
}
$note = [];
$taskstimers = [];
$total_time = [];
if(isset($value['taskstimers'])){
$total_time = $value['taskstimers'];
foreach ($total_time as $t) {
if ($t['end_time'] == $t['start_time']) {
if (isset($taskstimers[$t['end_time']])) {
$taskstimers[$t['end_time']] += $t['total_logged_time'];
} else {
$taskstimers[$t['end_time']] = $t['total_logged_time'];
}
} else {
$n_day = $this->get_number_day($date_working[$staffid], $t['start_time'], $t['end_time']);
if($n_day == 0){
continue;
}
$s_date = $t['start_time'];
$e_date = $t['end_time'];
while (strtotime($s_date) <= strtotime($e_date)) {
if (isset($taskstimers[$s_date])) {
$taskstimers[$s_date] += $t['total_logged_time'] / $n_day;
} else {
$taskstimers[$s_date] = $t['total_logged_time'] / $n_day;
}
$s_date = date('Y-m-d', strtotime('+1 day', strtotime($s_date)));
}
}
}
}
foreach ($taskstimers as $keytaskstimers => $taskstimer) {
if (isset($data[$staffid][date('d_m_Y', strtotime($keytaskstimers)) . '_s'])) {
$data[$staffid][date('d_m_Y', strtotime($keytaskstimers)) . '_s'] += round($taskstimer, 2);
if ($taskstimer > 0 && $only_data == false) {
$data_tooltip_2[$staffid][$value['staffid'] . '_' . date('d_m_Y', strtotime($keytaskstimers)) . '_s'] .= $value['name'] . ': ' . round($taskstimer, 2) . ' ' . _l('hours') . "\n";
$total_spent_time += $taskstimer;
}
}
}
if(isset($data_assigned[$value['taskid']]) && count($data_assigned[$value['taskid']]) > 0){
$note['estimate_hour'] = $value['estimate_hour'] / count($data_assigned[$value['taskid']]);
}else{
$note['estimate_hour'] = $value['estimate_hour'];
}
if ($note['estimate_hour'] > 0 || $total_time != []) {
$number_day = $this->get_number_day($date_working[$staffid], $value['startdate'], $value['duedate']);
if ($number_day > 0) {
$f_date = $value['startdate'];
$t_date = $value['duedate'];
$estimate_hour = $note['estimate_hour'];
$_estimate_hour = 0;
while (strtotime($f_date) <= strtotime($t_date)) {
$total_time = 0;
if (isset($taskstimers[$f_date])) {
$total_time = $taskstimers[$f_date];
}
if ($estimate_hour > 0 || $total_time > 0) {
if (isset($date_working[$staffid][$f_date]) && $date_working[$staffid][$f_date] == '1') {
if ($this->get_total_standard_workload($standard_workload, $date_working[$staffid], $value['staffid'], $value['startdate'], $value['duedate']) < $note['estimate_hour']) {
$_estimate_hour = round($note['estimate_hour'] / ($number_day), 2);
} else {
if ($estimate_hour >= $standard_workload[$value['staffid']][$f_date]) {
$_estimate_hour = $standard_workload[$value['staffid']][$f_date];
$estimate_hour = $estimate_hour - $standard_workload[$value['staffid']][$f_date];
} else {
$_estimate_hour = $estimate_hour;
$estimate_hour = 0;
}
}
if (isset($data[$staffid][date('d_m_Y', strtotime($f_date)) . '_e'])) {
$data[$staffid][date('d_m_Y', strtotime($f_date)) . '_e'] += round($_estimate_hour, 2);
if ($_estimate_hour > 0 && $only_data == false) {
$data_tooltip_2[$staffid][$value['staffid'] . '_' . date('d_m_Y', strtotime($f_date)) . '_e'] .= $value['name'] . ': ' . round($_estimate_hour, 2) . ' ' . _l('hours') . "\n";
$total_estimate += $_estimate_hour;
}
}
}
} else {
$f_date = $t_date;
}
$f_date = date('Y-m-d', strtotime('+1 day', strtotime($f_date)));
}
} else {
if (isset($data[$staffid][date('d_m_Y', strtotime($value['startdate'])) . '_e'])) {
$data[$staffid][date('d_m_Y', strtotime($value['startdate'])) . '_e'] += round($note['estimate_hour'], 2);
if ($note['estimate_hour'] > 0 && $only_data == false) {
$data_tooltip_2[$staffid][$value['staffid'] . '_' . date('d_m_Y', strtotime($value['startdate'])) . '_e'] .= $value['name'] . ': ' . round($note['estimate_hour'], 2) . ' ' . _l('hours') . "\n";
$total_estimate += $note['estimate_hour'];
}
}
}
}
}
$data_return2 = [];
$row = 0;
foreach ($data as $val) {
$int = 5;
if ($only_data == false) {
foreach ($data_tooltip_2[$val['staff_id']] as $key_tooltip => $tooltip) {
$n = [];
$n['row'] = $row;
$n['col'] = $int;
$n['comment'] = ['value' => $tooltip];
array_push($data_tooltip, $n);
$int++;
}
}
$row++;
$overload = [];
$leave = [];
foreach ($val as $key => $value) {
if ($only_data == false) {
if (!(strpos($key, '_e') === false) || !(strpos($key, '_s') === false)) {
$k = explode('_', $key);
if ($standard_workload[$val['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]] < $value && $value > 0) {
$overload[$key] = 1;
}
if (isset($data_timesheets[$val['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]])) {
$leave[$key] = 1;
}
}
}
if (!is_array($value) && $value > 0) {
$val[$key] = $value . '';
}
}
$data_return2[] = $val;
$data_overload[] = $overload;
$data_timesheets_return[] = $leave;
}
$data_return = [];
$data_return['data'] = $data_return2;
$data_return['data_total'] = ['capacity' => round($total_capacity, 2), 'estimate' => round($total_estimate, 2), 'spent_time' => round($total_spent_time, 2)];
$data_return['data_tooltip'] = $data_tooltip;
$data_return['data_overload'] = $data_overload;
$data_return['data_timesheets'] = $data_timesheets_return;
return $data_return;
}
/**
* Gets the data timeline.
*
* @param object $data_fill The data fill
*
* @return array The data timeline.
*/
public function get_data_timeline($data_fill)
{
$from_date = $data_fill['from_date'];
$to_date = $data_fill['to_date'];
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($data_fill['from_date']);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($data_fill['to_date']);
}
$staffs = $this->get_staff_workload($data_fill);
$staffsTasksWhere = [];
if ($from_date != '' && $to_date != '') {
$staffsTasksWhere = 'IF(duedate IS NOT NULL,((startdate <= "' . $from_date . '" and duedate >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and duedate >= "' . $to_date . '") or (startdate > "' . $from_date . '" and duedate < "' . $to_date . '")), IF(datefinished IS NOT NULL,((startdate <= "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $to_date . '") or (startdate > "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") < "' . $to_date . '")),(startdate <= "' . $from_date . '" or (startdate > "' . $from_date . '" and startdate <= "' . $to_date . '"))))';
} elseif ($from_date != '') {
$staffsTasksWhere = '(startdate >= "' . $from_date . '" or IF(duedate IS NOT NULL, duedate >= "' . $from_date . '", IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '", 1=1)))';
} elseif ($to_date != '') {
$staffsTasksWhere = '(startdate <= "' . $to_date . '" or IF(duedate IS NOT NULL,duedate <= "' . $to_date . '",IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") <= "' . $to_date . '", 1=1)))';
}
if (isset($data_fill['project'])) {
$where_project = '';
foreach ($data_fill['project'] as $key => $value) {
if ($where_project == '') {
$where_project = '(rel_type = "project" and rel_id = ' . $value . ')';
} else {
$where_project .= ' or (rel_type = "project" and rel_id = ' . $value . ')';
}
}
if ($where_project != '') {
$staffsTasksWhere .= ' and (' . $where_project . ') ';
}
}
$data = [];
$data_tooltip = [];
$data_color = [];
$data_check = [];
foreach ($staffs as $key => $value) {
$row = [];
$row['id'] = 'staff_' . $value['staffid'];
$row['start'] = $from_date;
$row['end'] = $to_date;
$row['name'] = $value['full_name'];
$data[] = $row;
$staff_task = $this->tasks_model->get_tasks_by_staff_id($value['staffid'], $staffsTasksWhere);
foreach ($staff_task as $key_task => $task) {
$note = [];
$note['start'] = $task['startdate'];
$note['progress'] = 100;
$status = get_task_status_by_id($task['status']);
$note['name'] = $task['name'] . ' - ' . $status['name'];
$note['id'] = $task['id'];
$note['dependencies'] = 'staff_' . $value['staffid'];
if ($task['duedate'] != null) {
$note['end'] = $task['duedate'];
} else {
if ($task['datefinished'] == '') {
$note['end'] = $to_date;
} else {
$note['end'] = date('Y-m-d', strtotime($task['datefinished']));
}
}
$note['total_time'] = round(($this->tasks_model->calc_task_total_time($task['id'], ' AND staff_id=' . $value['staffid']) / 60) / 60, 2);
$note['estimate_hour'] = round($this->get_estimate_hour($task['id']), 2);
switch ($task['rel_type']) {
case 'project':
$note['custom_class'] = 'br_project';
break;
case 'ticket':
$note['custom_class'] = 'br_ticket';
break;
case 'lead':
$note['custom_class'] = 'br_lead';
break;
case 'customer':
$note['custom_class'] = 'br_customer';
break;
case 'contract':
$note['custom_class'] = 'br_contract';
break;
case 'invoice':
$note['custom_class'] = 'br_invoice';
break;
case 'estimate':
$note['custom_class'] = 'br_estimate';
break;
case 'proposal':
$note['custom_class'] = 'br_proposal';
break;
}
$data[] = $note;
}
$int = 4;
}
if ($data == []) {
$data[][] = [];
}
return $data;
}
/**
* Creates an array data workload.
*
* @param String $from_date The from date format dd/mm/YYYY
* @param String $to_date To date format dd/mm/YYYY
* @param array $array The array
*
* @return array
*/
public function create_array_data_workload($from_date, $to_date, $array)
{
$visible = [];
$visible[1] = get_option('staff_workload_monday_visible');
$visible[2] = get_option('staff_workload_tuesday_visible');
$visible[3] = get_option('staff_workload_thursday_visible');
$visible[4] = get_option('staff_workload_wednesday_visible');
$visible[5] = get_option('staff_workload_friday_visible');
$visible[6] = get_option('staff_workload_saturday_visible');
$visible[7] = get_option('staff_workload_sunday_visible');
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
while (strtotime($from_date) <= strtotime($to_date)) {
if($visible[date('N', strtotime($from_date))] == 1){
$array[date('d_m_Y', strtotime($from_date)) . '_e'] = 0;
$array[date('d_m_Y', strtotime($from_date)) . '_s'] = 0;
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $array;
}
/**
* Creates an array data timeline.
*
* @param String $from_date The from date format dd/mm/YYYY
* @param String $to_date To date format dd/mm/YYYY
* @param array $array The array
*
* @return array
*/
public function create_array_data_timeline($from_date, $to_date, $array)
{
$from_date = to_sql_date($from_date);
$to_date = to_sql_date($to_date);
while (strtotime($from_date) <= strtotime($to_date)) {
$array[date('d_m', strtotime($from_date))] = [];
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $array;
}
/**
* Creates an array data tooltip workload.
*
* @param string $staffid The staffid
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
* @param array $array The array
*
* @return array
*/
public function create_array_data_tooltip_workload($data_timesheets, $staffid, $from_date, $to_date, $array)
{
$visible = [];
$visible[1] = get_option('staff_workload_monday_visible');
$visible[2] = get_option('staff_workload_tuesday_visible');
$visible[3] = get_option('staff_workload_thursday_visible');
$visible[4] = get_option('staff_workload_wednesday_visible');
$visible[5] = get_option('staff_workload_friday_visible');
$visible[6] = get_option('staff_workload_saturday_visible');
$visible[7] = get_option('staff_workload_sunday_visible');
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
while (strtotime($from_date) <= strtotime($to_date)) {
if($visible[date('N', strtotime($from_date))] == 1){
if(isset($data_timesheets[$staffid][$from_date])){
$array[$staffid . '_' . date('d_m_Y', strtotime($from_date)) . '_e'] = _l('leave').': '.$data_timesheets[$staffid][$from_date]. ' ' . _l('hours'). "\n".'-------------------------------------------------------'. "\n";
$array[$staffid . '_' . date('d_m_Y', strtotime($from_date)) . '_s'] = _l('leave').': '.$data_timesheets[$staffid][$from_date]. ' ' . _l('hours'). "\n".'-------------------------------------------------------------'. "\n";
}else{
$array[$staffid . '_' . date('d_m_Y', strtotime($from_date)) . '_e'] = '';
$array[$staffid . '_' . date('d_m_Y', strtotime($from_date)) . '_s'] = '';
}
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $array;
}
/**
* Creates an array data tooltip timeline.
*
* @param string $staffid The staffid
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
* @param array $array The array
*
* @return array
*/
public function create_array_data_tooltip_timeline($staffid, $from_date, $to_date, $array)
{
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
while (strtotime($from_date) <= strtotime($to_date)) {
$array[$staffid . '_' . date('d_m', strtotime($from_date))] = '';
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $array;
}
/**
* Gets the nestedheaders workload.
*
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
*
* @return array The nestedheaders workload.
*/
public function get_nestedheaders_workload($from_date, $to_date)
{
$visible = [];
$visible[1] = get_option('staff_workload_monday_visible');
$visible[2] = get_option('staff_workload_tuesday_visible');
$visible[3] = get_option('staff_workload_thursday_visible');
$visible[4] = get_option('staff_workload_wednesday_visible');
$visible[5] = get_option('staff_workload_friday_visible');
$visible[6] = get_option('staff_workload_saturday_visible');
$visible[7] = get_option('staff_workload_sunday_visible');
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
$nestedheaders = [];
$nestedheaders[0] = [['label' => _l('staff'), 'colspan' => 5]];
$nestedheaders[1] = [_l('name'), '', _l('capacity'), _l('department'), _l('role')];
while (strtotime($from_date) <= strtotime($to_date)) {
if($visible[date('N', strtotime($from_date))] == 1){
array_push($nestedheaders[0], ['label' => _l('wd_'.strtolower(date('l', strtotime($from_date)))).' '.date('d/m', strtotime($from_date)), 'colspan' => 2]);
array_push($nestedheaders[1], 'E');
array_push($nestedheaders[1], 'S');
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $nestedheaders;
}
/**
* Gets the nestedheaders timeline.
*
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
*
* @return array The nestedheaders timeline.
*/
public function get_nestedheaders_timeline($from_date, $to_date)
{
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
$nestedheaders = [];
$nestedheaders[0] = [['label' => _l('staff'), 'colspan' => 4]];
$nestedheaders[1] = [_l('name'), '', _l('department'), _l('role')];
while (strtotime($from_date) <= strtotime($to_date)) {
array_push($nestedheaders[1], date('l d/m', strtotime($from_date)));
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $nestedheaders;
}
/**
* Gets the columns workload.
*
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
*
* @return array The columns workload.
*/
public function get_columns_workload($from_date, $to_date)
{
$visible = [];
$visible[1] = get_option('staff_workload_monday_visible');
$visible[2] = get_option('staff_workload_tuesday_visible');
$visible[3] = get_option('staff_workload_thursday_visible');
$visible[4] = get_option('staff_workload_wednesday_visible');
$visible[5] = get_option('staff_workload_friday_visible');
$visible[6] = get_option('staff_workload_saturday_visible');
$visible[7] = get_option('staff_workload_sunday_visible');
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($from_date);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($to_date);
}
$columns = [['data' => 'staff_name', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_id', 'type' => 'text', 'readOnly' => true],
['data' => 'capacity', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_department', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_role', 'type' => 'text', 'readOnly' => true]];
while (strtotime($from_date) <= strtotime($to_date)) {
if($visible[date('N', strtotime($from_date))] == 1){
array_push($columns, ['data' => date('d_m_Y', strtotime($from_date)) . '_e', 'type' => 'numeric', 'readOnly' => true, 'numericFormat' => [
'pattern' => '0.00',
]]);
array_push($columns, ['data' => date('d_m_Y', strtotime($from_date)) . '_s', 'type' => 'numeric', 'readOnly' => true, 'numericFormat' => [
'pattern' => '0.00',
]]);
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $columns;
}
/**
* Gets the columns timeline.
*
* @param string $from_date The from date format dd/mm/YYYY
* @param string $to_date To date format dd/mm/YYYY
*
* @return array The columns timeline.
*/
public function get_columns_timeline($from_date, $to_date)
{
$from_date = to_sql_date($from_date);
$to_date = to_sql_date($to_date);
$columns = [['data' => 'staff_name', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_id', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_department', 'type' => 'text', 'readOnly' => true],
['data' => 'staff_role', 'type' => 'text', 'readOnly' => true]];
while (strtotime($from_date) <= strtotime($to_date)) {
array_push($columns, ['data' => date('d_m', strtotime($from_date)), 'type' => 'numeric', 'readOnly' => true, 'numericFormat' => [
'pattern' => '0.0',
]]);
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $columns;
}
/**
* Gets the staff workload.
*
* @param object $data The data
*
* @return array The staff workload.
*/
public function get_staff_workload($data, $only_id = false)
{
if (isset($data['project']) && !is_array($data['project']) && $data['project'] != '') {
$data['project'] = explode(',', $data['project']);
}
if (isset($data['department']) && !is_array($data['department']) && $data['department'] != '') {
$data['department'] = explode(',', $data['department']);
}
if (isset($data['role']) && !is_array($data['role']) && $data['role'] != '') {
$data['role'] = explode(',', $data['role']);
}
if (isset($data['staff']) && !is_array($data['staff']) && $data['staff'] != '') {
$data['staff'] = explode(',', $data['staff']);
}
$where_project = '';
if (!empty($data['project'])) {
foreach ($data['project'] as $key => $value) {
if ($where_project == '') {
$where_project .= '(('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
} else {
$where_project .= ' or ('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
}
}
$where_project .= ')';
}
$where_department = '';
if (!empty($data['department'])) {
foreach ($data['department'] as $key => $value) {
if ($where_department == '') {
$where_department .= '(('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
} else {
$where_department .= ' or ('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
}
}
$where_department .= ')';
}
$where_role = '';
if (!empty($data['role'])) {
foreach ($data['role'] as $key => $value) {
if ($where_role == '') {
$where_role .= '(' . db_prefix() . 'staff.role = ' . $value;
} else {
$where_role .= ' or ' . db_prefix() . 'staff.role = ' . $value;
}
}
$where_role .= ')';
}
$where_staff = '';
if (!empty($data['staff'])) {
foreach ($data['staff'] as $key => $value) {
if ($where_staff == '') {
$where_staff .= '(' . db_prefix() . 'staff.staffid = ' . $value;
} else {
$where_staff .= ' or ' . db_prefix() . 'staff.staffid = ' . $value;
}
}
$where_staff .= ')';
}
$staff_exception = get_option('staff_workload_exception');
$where_staff_exception = '';
if($staff_exception != ''){
$list_staff_exception = explode(',', $staff_exception);
foreach ($list_staff_exception as $key => $value) {
if($where_staff_exception == ''){
$where_staff_exception .= ' '.db_prefix().'staff.staffid != '.$value;
}else{
$where_staff_exception .= ' and '.db_prefix().'staff.staffid != '.$value;
}
}
}
$this->db->select('*, CONCAT(firstname, \' \', lastname) as full_name,' . db_prefix() . 'staff.staffid as staffid, ' . db_prefix() . 'roles.name as role_name, (SELECT GROUP_CONCAT('.db_prefix().'departments.name SEPARATOR " ,") FROM '.db_prefix().'staff_departments JOIN '.db_prefix().'departments ON '.db_prefix().'departments.departmentid = '.db_prefix().'staff_departments.departmentid WHERE '.db_prefix().'staff_departments.staffid='.db_prefix().'staff.staffid ORDER BY '.db_prefix().'staff.staffid) as department_name');
$this->db->join(db_prefix() . 'roles', db_prefix() . 'staff.role=' . db_prefix() . 'roles.roleid', 'left');
if ($where_role !== '') {
$this->db->where($where_role);
}
if ($where_department !== '') {
$this->db->where($where_department);
}
if ($where_project !== '') {
$this->db->where($where_project);
}
if ($where_staff !== '') {
$this->db->where($where_staff);
}
if ($where_staff_exception !== '') {
$this->db->where($where_staff_exception);
}
$this->db->where('active', 1);
$list_staffs = $this->db->get(db_prefix() . 'staff')->result_array();
if($only_id){
$list_ids = [];
foreach ($list_staffs as $key => $value) {
$list_ids[] = $value['staffid'];
}
return $list_ids;
}
return $list_staffs;
}
/**
* Gets the staff workload.
*
* @param object $data The data
*
* @return array The staff workload.
*/
public function get_staff_task_workload($data, $where = [])
{
$from_date = $data['from_date'];
$to_date = $data['to_date'];
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($data['from_date']);
}
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($data['to_date']);
}
if (isset($data['project']) && !is_array($data['project']) && $data['project'] != '') {
$data['project'] = explode(',', $data['project']);
}
if (isset($data['department']) && !is_array($data['department']) && $data['department'] != '') {
$data['department'] = explode(',', $data['department']);
}
if (isset($data['role']) && !is_array($data['role']) && $data['role'] != '') {
$data['role'] = explode(',', $data['role']);
}
if (isset($data['staff']) && !is_array($data['staff']) && $data['staff'] != '') {
$data['staff'] = explode(',', $data['staff']);
}
$where_project = '';
if (!empty($data['project'])) {
foreach ($data['project'] as $key => $value) {
if ($where_project == '') {
$where_project .= ' and (('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
} else {
$where_project .= ' or ('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
}
}
$where_project .= ')';
}
$where_department = '';
if (!empty($data['department'])) {
foreach ($data['department'] as $key => $value) {
if ($where_department == '') {
$where_department .= ' and (('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
} else {
$where_department .= ' or ('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
}
}
$where_department .= ')';
}
$where_role = '';
if (!empty($data['role'])) {
foreach ($data['role'] as $key => $value) {
if ($where_role == '') {
$where_role .= ' and (' . db_prefix() . 'staff.role = ' . $value;
} else {
$where_role .= ' or ' . db_prefix() . 'staff.role = ' . $value;
}
}
$where_role .= ')';
}
$where_staff = '';
if (!empty($data['staff'])) {
foreach ($data['staff'] as $key => $value) {
if ($where_staff == '') {
$where_staff .= ' and (' . db_prefix() . 'staff.staffid = ' . $value;
} else {
$where_staff .= ' or ' . db_prefix() . 'staff.staffid = ' . $value;
}
}
$where_staff .= ')';
}
$staffsTasksWhere = '';
if ($from_date != '' && $to_date != '') {
$staffsTasksWhere = 'IF(duedate IS NOT NULL,((startdate <= "' . $from_date . '" and duedate >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and duedate >= "' . $to_date . '") or (startdate > "' . $from_date . '" and duedate < "' . $to_date . '")), IF(datefinished IS NOT NULL,((startdate <= "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $to_date . '") or (startdate > "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") < "' . $to_date . '")),(startdate <= "' . $from_date . '" or (startdate > "' . $from_date . '" and startdate <= "' . $to_date . '"))))';
} elseif ($from_date != '') {
$staffsTasksWhere = '(startdate >= "' . $from_date . '" or IF(duedate IS NOT NULL, duedate >= "' . $from_date . '", IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '", 1=1)))';
} elseif ($to_date != '') {
$staffsTasksWhere = '(startdate <= "' . $to_date . '" or IF(duedate IS NOT NULL,duedate <= "' . $to_date . '",IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") <= "' . $to_date . '", 1=1)))';
}
$taskstimesWhere = '';
if ($from_date != '' && $to_date != '') {
$taskstimesWhere = 'IF(end_time IS NOT NULL,(((from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $from_date . '") and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $from_date . '") or (from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '" and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $to_date . '") or (from_unixtime(start_time, \'%Y-%m-%d\') > "' . $from_date . '" and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') < "' . $to_date . '")), (from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $from_date . '" or (from_unixtime(start_time, \'%Y-%m-%d\') > "' . $from_date . '" and from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '")))';
} elseif ($from_date != '') {
$taskstimesWhere = '(from_unixtime(start_time, \'%Y-%m-%d\') >= "' . $from_date . '" or IF(FROM_UNIXTIME(end_time, \'%Y-%m-%d\') IS NOT NULL, FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $from_date . '", 1=1))';
} elseif ($to_date != '') {
$taskstimesWhere = '(from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '" or IF(FROM_UNIXTIME(end_time, \'%Y-%m-%d\') IS NOT NULL,FROM_UNIXTIME(end_time, \'%Y-%m-%d\') <= "' . $to_date . '", 1=1))';
}
if ((is_array($where) && count($where) > 0) || (is_string($where) && $where != '')) {
}else{
$where = '';
}
$staff_exception = get_option('staff_workload_exception');
$where_staff_exception = '';
if($staff_exception != ''){
$list_staff_exception = explode(',', $staff_exception);
foreach ($list_staff_exception as $key => $value) {
$where_staff_exception .= ' and '.db_prefix().'staff.staffid != '.$value;
}
}
$list_staffs = $this->db->query('SELECT CASE
WHEN end_time is NULL THEN (' . time() . '-start_time) / 60 / 60
ELSE (end_time-start_time) / 60 / 60
END as total_logged_time, start_time, end_time ,firstname, lastname, CONCAT(firstname, \' \', lastname) as full_name, `' . db_prefix() . 'staff`.`staffid` as `staffid`, `' . db_prefix() . 'roles`.`name` as `role_name`, `' . db_prefix() . 'tasks`.`id` as `taskid`, `' . db_prefix() . 'tasks`.`name` as `name`, `' . db_prefix() . 'customfieldsvalues`.`value` as estimate_hour, recurring_type, repeat_every, last_recurring_date, startdate, duedate, cycles, total_cycles, datefinished, rel_type, rel_id, (SELECT GROUP_CONCAT('.db_prefix().'departments.name SEPARATOR " ,") FROM '.db_prefix().'staff_departments JOIN '.db_prefix().'departments ON '.db_prefix().'departments.departmentid = '.db_prefix().'staff_departments.departmentid WHERE '.db_prefix().'staff_departments.staffid='.db_prefix().'staff.staffid ORDER BY '.db_prefix().'staff.staffid) as department_name FROM `' . db_prefix() . 'staff`
LEFT JOIN `' . db_prefix() . 'roles` ON `' . db_prefix() . 'staff`.`role`=`' . db_prefix() . 'roles`.`roleid`
LEFT JOIN `' . db_prefix() . 'task_assigned` ON `' . db_prefix() . 'staff`.`staffid`=`' . db_prefix() . 'task_assigned`.`staffid` and ' . db_prefix() . 'task_assigned.taskid in (select ' . db_prefix() . 'tasks.id from ' . db_prefix() . 'tasks where (' .$staffsTasksWhere.' OR ' .db_prefix() . 'tasks.id IN (select task_id FROM ' . db_prefix() . 'taskstimers where ' . $taskstimesWhere . ')) '.$where.')
LEFT JOIN `' . db_prefix() . 'tasks` ON `' . db_prefix() . 'tasks`.`id`=`' . db_prefix() . 'task_assigned`.`taskid`
LEFT JOIN `' . db_prefix() . 'customfields` ON `' . db_prefix() . 'customfields`.`fieldto` = "tasks" and `' . db_prefix() . 'customfields`.`slug` = "tasks_estimate_hour"
LEFT JOIN `' . db_prefix() . 'customfieldsvalues` ON `' . db_prefix() . 'customfieldsvalues`.`relid`=`' . db_prefix() . 'tasks`.`id` and `' . db_prefix() . 'customfieldsvalues`.`fieldid` = `' . db_prefix() . 'customfields`.`id`
LEFT JOIN `' . db_prefix() . 'taskstimers` ON `' . db_prefix() . 'staff`.`staffid`=`' . db_prefix() . 'taskstimers`.`staff_id` and `' . db_prefix() . 'taskstimers`.`task_id` = `' . db_prefix() . 'tasks`.`id`
WHERE `' . db_prefix() . 'staff`.`active` = 1 ' .$where_role.$where_department.$where_project.$where_staff.$where_staff_exception)->result_array();
return $list_staffs;
}
/**
* Gets the staff workload.
*
* @param object $data The data
*
* @return array The staff workload.
*/
public function get_staff_workload_recurring($data, $where_task = [])
{
if (isset($data['project']) && !is_array($data['project']) && $data['project'] != '') {
$data['project'] = explode(',', $data['project']);
}
if (isset($data['department']) && !is_array($data['department']) && $data['department'] != '') {
$data['department'] = explode(',', $data['department']);
}
if (isset($data['role']) && !is_array($data['role']) && $data['role'] != '') {
$data['role'] = explode(',', $data['role']);
}
if (isset($data['staff']) && !is_array($data['staff']) && $data['staff'] != '') {
$data['staff'] = explode(',', $data['staff']);
}
$where_project = '';
if (!empty($data['project'])) {
foreach ($data['project'] as $key => $value) {
if ($where_project == '') {
$where_project .= '(('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
} else {
$where_project .= ' or ('.$value . ' in (select project_id from '.db_prefix() . 'project_members where '.db_prefix() . 'project_members.staff_id = '.db_prefix().'staff.staffid))';
}
}
$where_project .= ')';
}
$where_department = '';
if (!empty($data['department'])) {
foreach ($data['department'] as $key => $value) {
if ($where_department == '') {
$where_department .= '(('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
} else {
$where_department .= ' or ('.$value . ' in (select departmentid from '.db_prefix() . 'staff_departments where '.db_prefix() . 'staff_departments.staffid = '.db_prefix().'staff.staffid))';
}
}
$where_department .= ')';
}
$where_role = '';
if (!empty($data['role'])) {
foreach ($data['role'] as $key => $value) {
if ($where_role == '') {
$where_role .= '(' . db_prefix() . 'staff.role = ' . $value;
} else {
$where_role .= ' or ' . db_prefix() . 'staff.role = ' . $value;
}
}
$where_role .= ')';
}
$where_staff = '';
if (!empty($data['staff'])) {
foreach ($data['staff'] as $key => $value) {
if ($where_staff == '') {
$where_staff .= '(' . db_prefix() . 'staff.staffid = ' . $value;
} else {
$where_staff .= ' or ' . db_prefix() . 'staff.staffid = ' . $value;
}
}
$where_staff .= ')';
}
$staff_exception = get_option('staff_workload_exception');
$where_staff_exception = '';
if($staff_exception != ''){
$list_staff_exception = explode(',', $staff_exception);
foreach ($list_staff_exception as $key => $value) {
if($where_staff_exception == ''){
$where_staff_exception .= ' '.db_prefix().'staff.staffid != '.$value;
}else{
$where_staff_exception .= ' and '.db_prefix().'staff.staffid != '.$value;
}
}
}
if ((is_array($where_task) && count($where_task) > 0) || (is_string($where_task) && $where_task != '')) {
}else{
$where_task = '';
}
$this->db->select('CASE
WHEN end_time is NULL THEN (' . time() . '-start_time) / 60 / 60
ELSE (end_time-start_time) / 60 / 60
END as total_logged_time, start_time, end_time, CONCAT(firstname, \' \', lastname) as full_name,' . db_prefix() . 'staff.staffid as staffid, ' . db_prefix() . 'roles.name as role_name, ' . db_prefix() . 'tasks.id as taskid, `' . db_prefix() . 'tasks`.`name` as `name`, `' . db_prefix() . 'customfieldsvalues`.`value` as estimate_hour, recurring_type, repeat_every, last_recurring_date, startdate, duedate, cycles, total_cycles, datefinished, rel_type, rel_id, (SELECT GROUP_CONCAT('.db_prefix().'departments.name SEPARATOR " ,") FROM '.db_prefix().'staff_departments JOIN '.db_prefix().'departments ON '.db_prefix().'departments.departmentid = '.db_prefix().'staff_departments.departmentid WHERE '.db_prefix().'staff_departments.staffid='.db_prefix().'staff.staffid ORDER BY '.db_prefix().'staff.staffid) as department_name');
$this->db->join(db_prefix() . 'roles', db_prefix() . 'staff.role=' . db_prefix() . 'roles.roleid', 'left');
$this->db->join(db_prefix() . 'task_assigned', db_prefix() . 'staff.staffid=' . db_prefix() . 'task_assigned.staffid ', 'left');
$this->db->join(db_prefix() . 'tasks', db_prefix() . 'tasks.id=' . db_prefix() . 'task_assigned.taskid ' . $where_task, 'left');
$this->db->join(db_prefix() . 'customfields', '`' . db_prefix() . 'customfields`.`fieldto` = "tasks" and `' . db_prefix() . 'customfields`.`slug` = "tasks_estimate_hour"', 'left');
$this->db->join(db_prefix() . 'customfieldsvalues', '`' . db_prefix() . 'customfieldsvalues`.`relid`=`' . db_prefix() . 'tasks`.`id` and `' . db_prefix() . 'customfieldsvalues`.`fieldid` = `' . db_prefix() . 'customfields`.`id`', 'left');
$this->db->join(db_prefix() . 'taskstimers', '`' . db_prefix() . 'staff`.`staffid`=`' . db_prefix() . 'taskstimers`.`staff_id` and `' . db_prefix() . 'taskstimers`.`task_id` = `' . db_prefix() . 'tasks`.`id`', 'left');
if ($where_role !== '') {
$this->db->where($where_role);
}
if ($where_department !== '') {
$this->db->where($where_department);
}
if ($where_project !== '') {
$this->db->where($where_project);
}
if ($where_staff !== '') {
$this->db->where($where_staff);
}
if ($where_staff_exception !== '') {
$this->db->where($where_staff_exception);
}
$this->db->where(db_prefix() . 'staff.active', 1);
$this->db->where('`recurring` = 1 and (`cycles` != `total_cycles` OR `cycles`=0)');
$list_staffs = $this->db->get(db_prefix() . 'staff')->result_array();
return $list_staffs;
}
/**
* Gets the name relative type.
*
* @param int $id The identifier
* @param string $rel_type The relative type
*
* @return string The name relative type.
*/
public function get_name_rel_type($id, $rel_type)
{
switch ($rel_type) {
case 'project':
$this->load->model('Projects_model');
return $this->Projects_model->get($id)->name;
break;
case 'ticket':
$this->load->model('Tickets_model');
return $this->Tickets_model->get($id)->subject;
break;
case 'lead':
$this->load->model('Leads_model');
return $this->Leads_model->get($id)->name;
break;
case 'customer':
$this->load->model('Clients_model');
return $this->Clients_model->get($id)->company;
break;
case 'contract':
$this->load->model('Contracts_model');
return $this->Contracts_model->get($id)->subject;
break;
case 'invoice':
return format_invoice_number($id);
break;
case 'estimate':
$this->load->model('Estimates_model');
return $this->Estimates_model->get($id)->category_name;
break;
case 'proposal':
return format_proposal_number($id);
break;
case 'account_planning':
$this->db->where('id', $id);
return $this->db->get(db_prefix() . 'account_planning')->row()->subject;
break;
default:
return '';
break;
}
}
/**
* Gets the color relative type.
*
* @param string $rel_type The relative type
*
* @return string The color relative type.
*/
public function get_color_rel_type($rel_type)
{
switch ($rel_type) {
case 'project':
return '84C529';
break;
case 'ticket':
return '8085E9';
break;
case 'lead':
return 'cc66ff';
break;
case 'customer':
return '03a9f4';
break;
case 'contract':
return 'ff6f00';
break;
case 'invoice':
return 'ff9900';
break;
case 'estimate':
return 'ff5050';
break;
case 'proposal':
return '3333cc';
break;
case 'account_planning':
return '993333';
break;
case 'expense':
return '2af509';
break;
default:
return '';
break;
}
}
/**
* get data estimate stats
*
* @return object
*/
public function estimate_stats($data, $standard_workload)
{
$total_normal = 0;
$total_overload = 0;
foreach ($data['data'] as $workload) {
foreach ($workload as $key => $value) {
if (!(strpos($key, '_e') === false)) {
$key = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$key[2] . '-' . $key[1] . '-' . $key[0]];
if ($overload > 0) {
$total_overload += $overload;
$total_normal += $standard_workload[$workload['staff_id']][$key[2] . '-' . $key[1] . '-' . $key[0]];
} else {
$total_normal += $value;
}
}
}
}
$chart = [];
$status_1 = ['name' => _l('overload'), 'color' => '#fc2d42', 'y' => 0];
$status_2 = ['name' => _l('normal'), 'color' => '#84c529', 'y' => 0];
$status_1['y'] = round($total_overload, 1);
$status_2['y'] = round($total_normal, 1);
if ($status_1['y'] > 0) {
array_push($chart, $status_1);
}
if ($status_2['y'] > 0) {
array_push($chart, $status_2);
}
return $chart;
}
/**
* Gets the estimate hour.
*
* @param int $task_id The task identifier
*
* @return integer The estimate hour.
*/
public function get_estimate_hour($task_id)
{
$this->db->where('fieldto', 'tasks');
$this->db->where('slug', 'tasks_estimate_hour');
$customfield_estimate_hour = $this->db->get(db_prefix() . 'customfields')->row();
$value = 0;
if (isset($customfield_estimate_hour->id)) {
$this->db->where('fieldid', $customfield_estimate_hour->id);
$this->db->where('relid', $task_id);
$customfieldsvalues = $this->db->get(db_prefix() . 'customfieldsvalues')->row();
if (isset($customfieldsvalues->id)) {
$value = $customfieldsvalues->value;
}
}
return $value;
}
/**
* get data spent stats
*
* @return object
*/
public function spent_stats($data, $standard_workload)
{
$total_normal = 0;
$total_overload = 0;
foreach ($data['data'] as $workload) {
foreach ($workload as $key => $value) {
if (!(strpos($key, '_s') === false)) {
$key = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$key[2] . '-' . $key[1] . '-' . $key[0]];
if ($overload > 0) {
$total_overload += $overload;
$total_normal += $standard_workload[$workload['staff_id']][$key[2] . '-' . $key[1] . '-' . $key[0]];
} else {
$total_normal += $value;
}
}
}
}
$chart = [];
$status_1 = ['name' => _l('overload'), 'color' => '#ff9900', 'y' => 0];
$status_2 = ['name' => _l('normal'), 'color' => '#66ccff', 'y' => 0];
$status_1['y'] = round($total_overload, 1);
$status_2['y'] = round($total_normal, 1);
if ($status_1['y'] > 0) {
array_push($chart, $status_1);
}
if ($status_2['y'] > 0) {
array_push($chart, $status_2);
}
return $chart;
}
/**
* get data department stats
*
* @return object
*/
public function department_stats($data,$standard_workload)
{
$not_in_department = _l('not_in_department');
$total_normal = 0;
$total_overload = 0;
$department = array();
foreach ($data['data'] as $workload) {
$dept_text = $not_in_department;
foreach ($workload as $key => $value) {
if (!(strpos($key, 'staff_department') === false)) {
if (trim($value) != '') {
$dept_text = explode(',', $value);
foreach ($dept_text as $department_name) {
if (!isset($department[$department_name])) {
$department[$department_name] = array();
$department[$department_name]['estimate_overload'] = 0;
$department[$department_name]['estimate_normal'] = 0;
$department[$department_name]['spent_overload'] = 0;
$department[$department_name]['spent_normal'] = 0;
}
}
}else{
if (!isset($department[$dept_text])) {
$department[$dept_text] = array();
$department[$dept_text]['estimate_overload'] = 0;
$department[$dept_text]['estimate_normal'] = 0;
$department[$dept_text]['spent_overload'] = 0;
$department[$dept_text]['spent_normal'] = 0;
}
}
}
if(is_array($dept_text)){
foreach ($dept_text as $department_name) {
if (!(strpos($key, '_e') === false)) {
$k = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
if ($overload > 0) {
$department[$department_name]['estimate_overload'] += $overload;
$department[$department_name]['estimate_normal'] += $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
} else {
$department[$department_name]['estimate_normal'] += $value;
}
}
if (!(strpos($key, '_s') === false)) {
$k = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
if ($overload > 0) {
$department[$department_name]['spent_overload'] += $overload;
$department[$department_name]['spent_normal'] += $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
} else {
$department[$department_name]['spent_normal'] += $value;
}
}
}
}else{
if (!(strpos($key, '_e') === false)) {
$k = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
if ($overload > 0) {
$department[$dept_text]['estimate_overload'] += $overload;
$department[$dept_text]['estimate_normal'] += $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
} else {
$department[$dept_text]['estimate_normal'] += $value;
}
}
if (!(strpos($key, '_s') === false)) {
$k = explode('_', $key);
$overload = $value - $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
if ($overload > 0) {
$department[$dept_text]['spent_overload'] += $overload;
$department[$dept_text]['spent_normal'] += $standard_workload[$workload['staff_id']][$k[2] . '-' . $k[1] . '-' . $k[0]];
} else {
$department[$dept_text]['spent_normal'] += $value;
}
}
}
}
}
$chart = [];
$status_1 = ['name' => _l('estimate_overload'), 'data' => [], 'stack' => 'male', 'color' => '#fc2d42'];
$status_2 = ['name' => _l('estimate_normal'), 'data' => [], 'stack' => 'male', 'color' => '#84c529'];
$status_3 = ['name' => _l('spent_normal'), 'data' => [], 'stack' => 'female', 'color' => '#66ccff'];
$status_4 = ['name' => _l('spent_overload'), 'data' => [], 'stack' => 'female', 'color' => '#ff9900'];
$columns = array();
foreach ($department as $key => $dept) {
array_push($status_1['data'], round($dept['estimate_overload'], 1));
array_push($status_2['data'], round($dept['estimate_normal'], 1));
array_push($status_4['data'], round($dept['spent_overload'], 1));
array_push($status_3['data'], round($dept['spent_normal'], 1));
array_push($columns, $key);
}
array_push($chart, $status_1);
array_push($chart, $status_2);
array_push($chart, $status_4);
array_push($chart, $status_3);
$result = array();
$result['department_stats'] = $chart;
$result['column_department'] = $columns;
return $result;
}
/**
* Gets the column department statistics.
*
* @return object
*/
public function get_column_department_stats()
{
$departments = $this->departments_model->get();
$department = [];
foreach ($departments as $key => $value) {
array_push($department, $value['name']);
}
return $department;
}
/**
* check format date Y-m-d
*
* @param String $date The date
*
* @return boolean
*/
public function check_format_date($date)
{
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date)) {
return true;
} else {
return false;
}
}
/**
* Gets the number day.
*
* @param string $from_date The from date
* @param string $to_date To date
*
* @return integer The number day.
*/
public function get_number_day($date_working, $from_date, $to_date)
{
$count = 0;
if ($to_date == '') {
$to_date = date('Y-m-d');
}
for ($i = 0; $i < 5; $i++) {
if (strtotime($from_date) <= strtotime($to_date)) {
if(isset($date_working[$from_date])){
if ($date_working[$from_date] == 1) {
$count++;
}
}
$from_date = date('Y-m-d', strtotime($from_date . ' + 1 days'));
$i = 0;
} else {
$i = 10;
}
}
return $count;
}
/**
* check date working
*
* @param array $list_staffids The list staff id
* @param String $from_date The from date
* @param String $to_date The to date
*
* @return array
*/
public function check_range_date_working($list_staffids, $from_date, $to_date)
{
$date_working = [];
$working_days = [];
$working_days[1] = get_option('staff_workload_monday');
$working_days[2] = get_option('staff_workload_tuesday');
$working_days[3] = get_option('staff_workload_wednesday');
$working_days[4] = get_option('staff_workload_thursday');
$working_days[5] = get_option('staff_workload_friday');
$working_days[6] = get_option('staff_workload_saturday');
$working_days[7] = get_option('staff_workload_sunday');
if(get_option('integrated_timesheet_holiday') == 1 && $this->get_status_modules_all('timesheets')){
$this->db->select('*, (SELECT GROUP_CONCAT('.db_prefix().'staff_departments.departmentid SEPARATOR " ,") FROM '.db_prefix().'staff_departments WHERE '.db_prefix().'staff_departments.staffid='.db_prefix().'staff.staffid ORDER BY '.db_prefix().'staff.staffid) as department_ids');
$this->db->where('active', 1);
$this->db->join(db_prefix() . 'day_off', '('.db_prefix() . 'day_off.department = "" and ' . db_prefix() . 'day_off.position = "") or (find_in_set(role,'. db_prefix() . 'day_off.position) or ('. db_prefix() . 'day_off.position = ""))', 'left');
$staff_dayoff = $this->db->get(db_prefix() . 'staff')->result_array();
foreach ($staff_dayoff as $key => $value) {
$check_department = false;
if($value['department'] == ''){
$check_department = true;
}else{
$department_ids = explode(',', $value['department_ids']);
$department = explode(',', $value['department']);
foreach ($department_ids as $department_id) {
foreach ($department as $val) {
if($department_id == $val){
$check_department = true;
break;
}
}
if($check_department == true){
break;
}
}
}
if($check_department){
if(isset($date_working[$value['staffid']])){
$date_working[$value['staffid']][$value['break_date']] = '0';
}else{
$date_working[$value['staffid']] = [];
$date_working[$value['staffid']][$value['break_date']] = '0';
}
}
}
}else{
$this->db->where('date >= "'. $from_date.'"');
$this->db->where('date <= "'. $to_date.'"');
$workload_dayoff = $this->db->get(db_prefix() . 'workload_dayoff')->result_array();
foreach ($workload_dayoff as $key => $value) {
foreach ($list_staffids as $staffid) {
$date_working[$staffid][$value['date']] = '0';
}
}
}
while (strtotime($from_date) <= strtotime($to_date)) {
foreach ($list_staffids as $staffid) {
if(!isset($date_working[$staffid][$from_date])){
$date_working[$staffid][$from_date] = $working_days[date('N',strtotime($from_date))];
}
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return $date_working;
}
/**
* task date change
*
* @param object $data The data
*
* @return boolean
*/
public function task_date_change($data)
{
$this->load->model('tasks_model');
$list_staffids = $this->get_staff_workload([], true);
$date_working = $this->check_range_date_working($list_staffids, $data['start_date'], $data['end_date']);
$this->db->where('fieldto', 'tasks');
$this->db->where('name', 'Estimate hour');
$estimate_fields = $this->db->get(db_prefix() . 'customfields')->row();
$affectedRows = 0;
$estimate = 0;
if ($estimate_fields) {
$task_assignees = $this->tasks_model->get_task_assignees($data['task_id']);
$staffid = '';
if (isset($task_assignees[0]['assigneeid'])) {
$staffid = $task_assignees[0]['assigneeid'];
}
if ($staffid == '') {
$number_day = $this->get_number_day($date_working[$staffid], $data['start_date'], $data['end_date']);
$standard_workload = get_option('standard_workload');
if ($standard_workload == '') {
$standard_workload = 0;
}
$estimate = $number_day * $standard_workload;
} else {
$f_date = $data['start_date'];
$t_date = $data['end_date'];
while (strtotime($f_date) <= strtotime($t_date)) {
if ($date_working[$staffid][$f_date]) {
$standard_workload = $this->get_standard_workload_by_staff($staffid, $f_date);
$estimate += $standard_workload;
}
$f_date = date('Y-m-d', strtotime('+1 day', strtotime($f_date)));
}
}
$this->db->where('relid', $data['task_id']);
$this->db->where('fieldid', $estimate_fields->id);
$this->db->where('fieldto', 'tasks');
$_fields = $this->db->get(db_prefix() . 'customfieldsvalues')->row();
if ($_fields) {
$this->db->where('relid', $data['task_id']);
$this->db->where('fieldid', $estimate_fields->id);
$this->db->where('fieldto', 'tasks');
$this->db->update(db_prefix() . 'customfieldsvalues', ['value' => $estimate]);
if ($this->db->affected_rows() > 0) {
$affectedRows++;
}
} else {
$this->db->where('relid', $data['task_id']);
$this->db->where('fieldid', $estimate_fields->id);
$this->db->where('fieldto', 'tasks');
$this->db->insert(db_prefix() . 'customfieldsvalues', ['relid' => $data['task_id'],
'fieldto' => 'tasks',
'fieldid' => $estimate_fields->id,
'value' => $estimate]);
$insert_id = $this->db->insert_id();
if ($insert_id) {
$affectedRows++;
}
}
}
$this->db->where('id', $data['task_id']);
$this->db->update(db_prefix() . 'tasks', ['startdate' => $data['start_date'], 'duedate' => $data['end_date']]);
if ($this->db->affected_rows() > 0) {
$affectedRows++;
}
if ($affectedRows > 0) {
return true;
}
return false;
}
/**
* Does a workload kanban query.
*
* @param int $staff_id The staff identifier
* @param integer $page The page
* @param array $where The where
* @param boolean $count The count
*
* @return object
*/
public function do_workload_kanban_query($staff_id, $page = 1, $where = [], $count = false)
{
if ($count == false) {
if ($page > 1) {
$page--;
$position = ($page * 10);
$this->db->limit(10, $position);
} else {
$this->db->limit(10);
}
}
return $this->get_tasks($staff_id, $where, true, $count);
}
/**
* Gets the tasks.
*
* @param string $staff_id The staff identifier
* @param array $where The where
* @param boolean $apply_restrictions The apply restrictions
* @param boolean $count The count
*
* @return array The tasks.
*/
public function get_tasks($staff_id = '', $where = [], $apply_restrictions = false, $count = false)
{
$select = implode(', ', prefixed_table_fields_array(db_prefix() . 'tasks')) . ',
(SELECT SUM(CASE
WHEN end_time is NULL THEN ' . time() . '-start_time
ELSE end_time-start_time
END) FROM ' . db_prefix() . 'taskstimers WHERE task_id=' . db_prefix() . 'tasks.id) as total_logged_time,
' . get_sql_select_task_assignees_ids() . ' as assignees_ids
';
$select .= ',(SELECT staffid FROM ' . db_prefix() . 'task_assigned WHERE taskid=' . db_prefix() . 'tasks.id AND staffid=' . get_staff_user_id() . ') as current_user_is_assigned, billable, (SELECT '.db_prefix().'projects.name FROM '.db_prefix().'projects WHERE '.db_prefix().'projects.id='.db_prefix().'tasks.rel_id and '.db_prefix().'tasks.rel_type = "project") as project_name';
$this->db->select($select);
if ($staff_id != '') {
$this->db->where('(' . db_prefix() . 'tasks.id IN (SELECT taskid FROM ' . db_prefix() . 'task_assigned WHERE staffid = ' . $staff_id . '))');
}
$this->db->where($where);
$this->db->order_by('FIELD(status, 5), duedate IS NULL ASC, duedate', '', false);
if ($count == false) {
$tasks = $this->db->get(db_prefix() . 'tasks')->result_array();
} else {
$tasks = $this->db->count_all_results(db_prefix() . 'tasks');
}
return $tasks;
}
/**
* Gets the dayoff.
*
* @return array The dayoff.
*/
public function get_dayoff()
{
return $this->db->get(db_prefix() . 'workload_dayoff')->result_array();
}
/**
* Adds a dayoff.
*
* @param object $data The data
*
* @return boolean
*/
public function add_dayoff($data)
{
$data['addedfrom'] = get_staff_user_id();
$data['datecreated'] = date('Y-m-d H:i:s');
if (!$this->check_format_date($data['date'])) {
$data['date'] = to_sql_date($data['date']);
}
$this->db->insert(db_prefix() . 'workload_dayoff', $data);
$insert_id = $this->db->insert_id();
if ($insert_id) {
return true;
}
return false;
}
/**
* update dayoff
*
* @param object $data The data
* @param int $id The identifier
*
* @return boolean
*/
public function update_dayoff($data, $id)
{
if (!$this->check_format_date($data['date'])) {
$data['date'] = to_sql_date($data['date']);
}
$this->db->where('id', $id);
$this->db->update(db_prefix() . 'workload_dayoff', $data);
if ($this->db->affected_rows() > 0) {
return true;
}
return false;
}
/**
* Gets the department name.
*
* @param int $departmentid The departmentid
*
* @return string The department name.
*/
public function get_department_name($departmentid)
{
$department = $this->db->query('select ' . db_prefix() . 'departments.name from ' . db_prefix() . 'departments where departmentid = ' . $departmentid)->row();
if ($department) {
return $department->name;
}
return '';
}
/**
* delete day off
*
* @param int $id The identifier
*
* @return boolean
*/
public function delete_dayoff($id)
{
$this->db->where('id', $id);
$this->db->delete(db_prefix() . 'workload_dayoff');
if ($this->db->affected_rows() > 0) {
return true;
}
return false;
}
/**
* Gets the list standard workload.
*
* @return array The list standard workload.
*/
public function get_list_standard_workload()
{
$this->load->model('staff_model');
$staff = $this->staff_model->get('', ['active' => 1]);
$standard_workload = $this->db->get(db_prefix() . 'standard_workload')->result_array();
$working_days = [];
$working_days[1] = get_option('staff_workload_monday');
$working_days[2] = get_option('staff_workload_tuesday');
$working_days[3] = get_option('staff_workload_wednesday');
$working_days[4] = get_option('staff_workload_thursday');
$working_days[5] = get_option('staff_workload_friday');
$working_days[6] = get_option('staff_workload_saturday');
$working_days[7] = get_option('staff_workload_sunday');
$list_staff = [];
foreach ($standard_workload as $key => $value) {
$list_staff[] = $value['staffid'];
}
$st = get_option('standard_workload');
foreach ($staff as $key => $value) {
if (!in_array($value['staffid'], $list_staff)) {
$node = [];
$node['staffid'] = $value['staffid'];
if ($working_days[1] == 1) {
$node['monday'] = $st;
}
if ($working_days[2] == 1) {
$node['tuesday'] = $st;
}
if ($working_days[3] == 1) {
$node['wednesday'] = $st;
}
if ($working_days[4] == 1) {
$node['thursday'] = $st;
}
if ($working_days[5] == 1) {
$node['friday'] = $st;
}
if ($working_days[6] == 1) {
$node['saturday'] = $st;
}
if ($working_days[7] == 1) {
$node['sunday'] = $st;
}
$standard_workload[] = $node;
}
}
return $standard_workload;
}
/**
* Gets the staff standard workload.
*
* @return array The staff standard workload.
*/
public function get_staff_standard_workload()
{
$this->db->where('(select count(*) from ' . db_prefix() . 'standard_workload where staffid = ' . db_prefix() . 'staff.staffid) = 0');
$data = $this->db->get(db_prefix() . 'staff')->result_array();
$list_staff = [];
foreach ($data as $key => $value) {
$list_staff[] = $value['staffid'];
}
$staffs = $this->staff_model->get('', ['active' => 1]);
foreach ($staffs as $key => $value) {
if (is_array($value['staffid'], $list_staff)) {
}
}
}
/**
* Adds a standard workload.
*
* @return boolean
*/
public function add_standard_workload($data)
{
$affectedRows = 0;
foreach ($data as $key => $value) {
if ($value[0] != '' && $value[0] != null) {
$this->db->where('id', $value[0]);
$this->db->update(db_prefix() . 'standard_workload',
[
'staffid' => $value[1],
'monday' => $value[2],
'tuesday' => $value[3],
'wednesday' => $value[4],
'thursday' => $value[5],
'friday' => $value[6],
'saturday' => $value[7],
'sunday' => $value[8],
]);
if ($this->db->affected_rows() > 0) {
$affectedRows++;
}
} else {
$this->db->insert(db_prefix() . 'standard_workload', [
'staffid' => $value[1],
'monday' => $value[2],
'tuesday' => $value[3],
'wednesday' => $value[4],
'thursday' => $value[5],
'friday' => $value[6],
'saturday' => $value[7],
'sunday' => $value[8],
]);
$insert_id = $this->db->insert_id();
if ($insert_id) {
$affectedRows++;
}
}
}
if ($affectedRows > 0) {
return true;
}
return false;
}
/**
* delete standard workload
*
* @param int $id The identifier
*
* @return boolean
*/
public function delete_standard_workload($id)
{
$this->db->where('id', $id);
$this->db->delete(db_prefix() . 'standard_workload');
if ($this->db->affected_rows() > 0) {
return true;
}
return false;
}
/**
* update general setting
*
* @param array $data The data
*
* @return boolean
*/
public function update_setting($data)
{
$affectedRows = 0;
if (!isset($data['staff_workload_monday'])) {
$data['staff_workload_monday'] = 0;
}
if (!isset($data['staff_workload_tuesday'])) {
$data['staff_workload_tuesday'] = 0;
}
if (!isset($data['staff_workload_thursday'])) {
$data['staff_workload_thursday'] = 0;
}
if (!isset($data['staff_workload_wednesday'])) {
$data['staff_workload_wednesday'] = 0;
}
if (!isset($data['staff_workload_friday'])) {
$data['staff_workload_friday'] = 0;
}
if (!isset($data['staff_workload_saturday'])) {
$data['staff_workload_saturday'] = 0;
}
if (!isset($data['staff_workload_sunday'])) {
$data['staff_workload_sunday'] = 0;
}
if (!isset($data['staff_workload_monday_visible'])) {
$data['staff_workload_monday_visible'] = 0;
}
if (!isset($data['staff_workload_tuesday_visible'])) {
$data['staff_workload_tuesday_visible'] = 0;
}
if (!isset($data['staff_workload_thursday_visible'])) {
$data['staff_workload_thursday_visible'] = 0;
}
if (!isset($data['staff_workload_wednesday_visible'])) {
$data['staff_workload_wednesday_visible'] = 0;
}
if (!isset($data['staff_workload_friday_visible'])) {
$data['staff_workload_friday_visible'] = 0;
}
if (!isset($data['staff_workload_saturday_visible'])) {
$data['staff_workload_saturday_visible'] = 0;
}
if (!isset($data['staff_workload_sunday_visible'])) {
$data['staff_workload_sunday_visible'] = 0;
}
if (!isset($data['integrated_timesheet_holiday'])) {
$data['integrated_timesheet_holiday'] = 0;
}
if (!isset($data['integrated_timesheet_leave'])) {
$data['integrated_timesheet_leave'] = 0;
}
if (!isset($data['staff_workload_exception'])) {
$data['staff_workload_exception'] = '';
}else{
$data['staff_workload_exception'] = implode(',', $data['staff_workload_exception']);
}
foreach ($data as $key => $value) {
$this->db->where('name', $key);
$this->db->update(db_prefix() . 'options', [
'value' => $value,
]);
if ($this->db->affected_rows() > 0) {
$affectedRows++;
}
}
if ($affectedRows > 0) {
return true;
}
return false;
}
/**
* Gets the standard workload by staff.
*
* @param int $staffid The staffid
*
* @return float The standard workload by staff.
*/
public function get_standard_workload_by_staff($staffid, $date)
{
if (!$this->check_format_date($date)) {
$date = to_sql_date($date);
}
if(get_option('integrated_timesheet_leave') == 1 && $this->get_status_modules_all('timesheets')){
}else{
$this->db->where('staffid', $staffid);
$standard_workload = $this->db->get(db_prefix() . 'standard_workload')->row();
if ($standard_workload) {
$working_days = [];
$working_days[1] = $standard_workload->monday;
$working_days[2] = $standard_workload->tuesday;
$working_days[3] = $standard_workload->wednesday;
$working_days[4] = $standard_workload->thursday;
$working_days[5] = $standard_workload->friday;
$working_days[6] = $standard_workload->saturday;
$working_days[7] = $standard_workload->sunday;
return $working_days[date('N', strtotime($date))];
} else {
return get_option('standard_workload');
}
}
}
/**
* Gets the standard workload by list staff.
*
* @param int $list_staff The list staff id
* @param string $from_date
* @param string $to_date
*
* @return array The standard workload by list staff.
*/
public function get_standard_workload_by_list_staff($list_staff, $from_date, $to_date)
{
$from_date_filter = $from_date;
if (!$this->check_format_date($from_date)) {
$from_date_filter = to_sql_date($from_date);
}
$to_date_filter = $to_date;
if (!$this->check_format_date($to_date)) {
$to_date_filter = to_sql_date($to_date);
}
$where_staff = '';
if(count($list_staff) > 0){
$where_staff = 'find_in_set(staffid, "'.implode(',', $list_staff).'")';
}
if($where_staff != ''){
$this->db->where($where_staff);
}
$standard_workload = $this->db->get(db_prefix() . 'standard_workload')->result_array();
$standard_workload_default = get_option('standard_workload');
$working_days = [];
$from_date = $from_date_filter;
$to_date = $to_date_filter;
while (strtotime($from_date) <= strtotime($to_date)) {
foreach ($standard_workload as $key => $value) {
switch (date('N', strtotime($from_date))) {
case 1:
$working_days[$value['staffid']][$from_date] = $value['monday'] ? $value['monday'] : 0;;
break;
case 2:
$working_days[$value['staffid']][$from_date] = $value['tuesday'] ? $value['tuesday'] : 0;;
break;
case 3:
$working_days[$value['staffid']][$from_date] = $value['wednesday'] ? $value['wednesday'] : 0;;
break;
case 4:
$working_days[$value['staffid']][$from_date] = $value['thursday'] ? $value['thursday'] : 0;;
break;
case 5:
$working_days[$value['staffid']][$from_date] = $value['friday'] ? $value['friday'] : 0;;
break;
case 6:
$working_days[$value['staffid']][$from_date] = $value['saturday'] ? $value['saturday'] : 0;
break;
case 7:
$working_days[$value['staffid']][$from_date] = $value['sunday'] ? $value['sunday'] : 0;
break;
default:
break;
}
}
foreach ($list_staff as $staffid) {
if(!isset($working_days[$staffid][$from_date])){
$working_days[$staffid][$from_date] = $standard_workload_default;
}
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
$from_date = $from_date_filter;
$to_date = $to_date_filter;
$data_timesheets = [];
if(get_option('integrated_timesheet_leave') == 1 && $this->get_status_modules_all('timesheets')){
$whereStaff = '';
if(count($list_staff) > 0){
$whereStaff = 'find_in_set(staff_id, "'.implode(',', $list_staff).'")';
}
if($whereStaff != ''){
$this->db->where($whereStaff);
}
$timesheetsWhere = [];
if ($from_date != '' && $to_date != '') {
$timesheetsWhere = 'IF(end_time IS NOT NULL,(((start_time <= "' . $from_date . '") and end_time >= "' . $from_date . '") or (start_time <= "' . $to_date . '" and end_time >= "' . $to_date . '") or (start_time > "' . $from_date . '" and end_time < "' . $to_date . '")), (start_time <= "' . $from_date . '" or (start_time > "' . $from_date . '" and start_time <= "' . $to_date . '")))';
} elseif ($from_date != '') {
$timesheetsWhere = '(start_time >= "' . $from_date . '" or IF(end_time IS NOT NULL, end_time >= "' . $from_date . '", 1=1))';
} elseif ($to_date != '') {
$timesheetsWhere = '(start_time <= "' . $to_date . '" or IF(end_time IS NOT NULL,end_time <= "' . $to_date . '", 1=1))';
}
$this->db->where($timesheetsWhere);
$this->db->where('status', '1');
$this->db->where('rel_type', '1');
$timesheets = $this->db->get(db_prefix() . 'timesheets_requisition_leave')->result_array();
foreach ($timesheets as $key => $value) {
$date_leave = $value['start_time'];
$number_of_leaving_day = $value['number_of_leaving_day'];
while ($number_of_leaving_day > 0 && strtotime($date_leave) <= strtotime($value['end_time'])) {
if(isset($working_days[$value['staff_id']][$date_leave]) && $working_days[$value['staff_id']][$date_leave] > 0){
if($number_of_leaving_day == 0.5){
if(isset($data_timesheets[$value['staff_id']][$date_leave])){
$data_timesheets[$value['staff_id']][$date_leave] += $working_days[$value['staff_id']][$date_leave] * 0.5;
}else{
if(!isset($data_timesheets[$value['staff_id']])){
$data_timesheets[$value['staff_id']] = [];
}
$data_timesheets[$value['staff_id']][$date_leave] = $working_days[$value['staff_id']][$date_leave] * 0.5;
}
}else{
if(isset($data_timesheets[$value['staff_id']][$date_leave])){
$data_timesheets[$value['staff_id']][$date_leave] += $working_days[$value['staff_id']][$date_leave];
}else{
if(!isset($data_timesheets[$value['staff_id']])){
$data_timesheets[$value['staff_id']] = [];
}
$data_timesheets[$value['staff_id']][$date_leave] = $working_days[$value['staff_id']][$date_leave];
}
}
$number_of_leaving_day--;
}
$date_leave = date('Y-m-d', strtotime('+1 day', strtotime($date_leave)));
}
}
}
$from_date = $from_date_filter;
$to_date = $to_date_filter;
while (strtotime($from_date) <= strtotime($to_date)) {
foreach ($list_staff as $staffid) {
if(isset($data_timesheets[$staffid][$from_date])){
if($working_days[$staffid][$from_date] > $data_timesheets[$staffid][$from_date]){
$working_days[$staffid][$from_date] = $working_days[$staffid][$from_date] - $data_timesheets[$staffid][$from_date];
}else{
$working_days[$staffid][$from_date] = 0;
}
}
}
$from_date = date('Y-m-d', strtotime('+1 day', strtotime($from_date)));
}
return ['standard_workload' => $working_days, 'data_timesheets' => $data_timesheets];
}
/**
* Gets the staff select.
*
* @return array The staff select.
*/
public function get_staff_select()
{
$staff = $this->staff_model->get('', ['active' => 1]);
$list_staff = [];
foreach ($staff as $key => $value) {
$note = [];
$note['id'] = $value['staffid'];
$note['label'] = trim($value['firstname'] . ' ' . $value['lastname']);
$list_staff[] = $note;
}
return $list_staff;
}
/**
* Gets the total standard workload.
*
* @param int $staffid The staffid
* @param Date $f_date The f date
* @param Date $t_date The t date
*
* @return array The staff select.
*/
public function get_total_standard_workload($standard_workload, $date_working, $staffid, $f_date, $t_date)
{
$total = 0;
while (strtotime($f_date) <= strtotime($t_date)) {
if(isset($date_working[$f_date])){
if ($date_working[$f_date] == 1) {
$total += $standard_workload[$staffid][$f_date];
}
}
$f_date = date('Y-m-d', strtotime('+1 day', strtotime($f_date)));
}
return $total;
}
/**
* update task assigned
*
* @param object $data The data
*/
public function update_task_assigned($data)
{
$this->db->where('taskid', $data['task_id']);
$this->db->delete(db_prefix() . 'task_assigned');
$this->db->insert(db_prefix() . 'task_assigned', [
'taskid' => $data['task_id'],
'staffid' => $data['staff_id'],
'assigned_from' => get_staff_user_id(),
]);
}
/**
* get tasks by staff id
* @param integer $staffid
* @param string $from_date
* @param string $to_date
* @param array $where
* @return array
*/
public function get_tasks_by_staff_id($staffid, $from_date, $to_date, $where = [])
{
$staffsTasksWhere = [];
if ($from_date != '' && $to_date != '') {
$staffsTasksWhere = 'IF(duedate IS NOT NULL,((startdate <= "' . $from_date . '" and duedate >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and duedate >= "' . $to_date . '") or (startdate > "' . $from_date . '" and duedate < "' . $to_date . '")), IF(datefinished IS NOT NULL,((startdate <= "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $to_date . '") or (startdate > "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") < "' . $to_date . '")),(startdate <= "' . $from_date . '" or (startdate > "' . $from_date . '" and startdate <= "' . $to_date . '"))))';
} elseif ($from_date != '') {
$staffsTasksWhere = '(startdate >= "' . $from_date . '" or IF(duedate IS NOT NULL, duedate >= "' . $from_date . '", IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '", 1=1)))';
} elseif ($to_date != '') {
$staffsTasksWhere = '(startdate <= "' . $to_date . '" or IF(duedate IS NOT NULL,duedate <= "' . $to_date . '",IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") <= "' . $to_date . '", 1=1)))';
}
$taskstimesWhere = [];
if ($from_date != '' && $to_date != '') {
$taskstimesWhere = 'IF(end_time IS NOT NULL,(((from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $from_date . '") and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $from_date . '") or (from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '" and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $to_date . '") or (from_unixtime(start_time, \'%Y-%m-%d\') > "' . $from_date . '" and FROM_UNIXTIME(end_time, \'%Y-%m-%d\') < "' . $to_date . '")), (from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $from_date . '" or (from_unixtime(start_time, \'%Y-%m-%d\') > "' . $from_date . '" and from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '")))';
} elseif ($from_date != '') {
$taskstimesWhere = '(from_unixtime(start_time, \'%Y-%m-%d\') >= "' . $from_date . '" or IF(FROM_UNIXTIME(end_time, \'%Y-%m-%d\') IS NOT NULL, FROM_UNIXTIME(end_time, \'%Y-%m-%d\') >= "' . $from_date . '", 1=1))';
} elseif ($to_date != '') {
$taskstimesWhere = '(from_unixtime(start_time, \'%Y-%m-%d\') <= "' . $to_date . '" or IF(FROM_UNIXTIME(end_time, \'%Y-%m-%d\') IS NOT NULL,FROM_UNIXTIME(end_time, \'%Y-%m-%d\') <= "' . $to_date . '", 1=1))';
}
$this->db->select('duedate, datefinished, id, name, startdate, rel_type');
if ((is_array($where) && count($where) > 0) || (is_string($where) && $where != '')) {
$this->db->where($where);
}
$this->db->where('(' . $staffsTasksWhere . ' OR id IN (select task_id FROM ' . db_prefix() . 'taskstimers where ' . $taskstimesWhere . ' and staff_id = ' . $staffid . '))');
$this->db->where('(id IN (SELECT taskid FROM ' . db_prefix() . 'task_assigned WHERE staffid=' . $staffid . '))');
return $this->db->get(db_prefix() . 'tasks')->result_array();
}
/**
* get status modules for all
* @param string $module_name
* @return boolean
*/
function get_status_modules_all($module_name)
{
$sql = 'select * from ' . db_prefix() . 'modules where module_name = "' . $module_name . '" AND active =1 ';
$module = $this->db->query($sql)->row();
if ($module) {
return true;
} else {
return false;
}
}
/**
* Gets the data workload.
*
* @param object $data_fill The data fill
*
* @return array The data workload.
*/
public function get_data_capacity($data_fill){
if($data_fill['to_date'] == ''){
$from_date = date('Y-m-d');
}else{
$from_date = $data_fill['from_date'];
if (!$this->check_format_date($from_date)) {
$from_date = to_sql_date($data_fill['from_date']);
}
}
if($data_fill['to_date'] == ''){
$to_date = date('Y-m-d');
}else{
$to_date = $data_fill['to_date'];
if (!$this->check_format_date($to_date)) {
$to_date = to_sql_date($data_fill['to_date']);
}
}
$where_project = '';
if (!empty($data_fill['project'])) {
foreach ($data_fill['project'] as $key => $value) {
if ($where_project == '') {
$where_project .= ' and (rel_id = '.$value;
} else {
$where_project .= ' or rel_id = '.$value;
}
}
$where_project .= ')';
}
$tasksWhere = ' rel_type = "project"'. $where_project;
if ($from_date != '' && $to_date != '') {
$tasksWhere .= ' and IF(duedate IS NOT NULL,((startdate <= "' . $from_date . '" and duedate >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and duedate >= "' . $to_date . '") or (startdate > "' . $from_date . '" and duedate < "' . $to_date . '")), IF(datefinished IS NOT NULL,((startdate <= "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '") or (startdate <= "' . $to_date . '" and date_format(datefinished, "%Y-%m-%d") >= "' . $to_date . '") or (startdate > "' . $from_date . '" and date_format(datefinished, "%Y-%m-%d") < "' . $to_date . '")),(startdate <= "' . $from_date . '" or (startdate > "' . $from_date . '" and startdate <= "' . $to_date . '"))))';
} elseif ($from_date != '') {
$tasksWhere .= ' and (startdate >= "' . $from_date . '" or IF(duedate IS NOT NULL, duedate >= "' . $from_date . '", IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") >= "' . $from_date . '", 1=1)))';
} elseif ($to_date != '') {
$tasksWhere .= ' and (startdate <= "' . $to_date . '" or IF(duedate IS NOT NULL,duedate <= "' . $to_date . '",IF(datefinished IS NOT NULL, date_format(datefinished, "%Y-%m-%d") <= "' . $to_date . '", 1=1)))';
}
$tasks = $this->get_tasks('', $tasksWhere);
$total_capacity = 0;
$list_staffids = $this->get_staff_workload($data_fill, true);
$standard_workload_by_list_staff = $this->get_standard_workload_by_list_staff($list_staffids, $from_date, $to_date);
$standard_workload = $standard_workload_by_list_staff['standard_workload'];
$data_timesheets = $standard_workload_by_list_staff['data_timesheets'];
$date_working = $this->check_range_date_working($list_staffids, $from_date, $to_date);
foreach ($list_staffids as $key => $value) {
$total_capacity += $this->get_total_standard_workload($standard_workload, $date_working[$value], $value, $from_date, $to_date);
}
$data = ['billable' => [], 'unbillable' => []];
$total_billable = 0;
$total_unbillable = 0;
foreach ($tasks as $key => $value) {
if($value['billable'] == 1){
if (isset($data['billable'][$value['rel_id']])) {
$data['billable'][$value['rel_id']]['total'] += $value['total_logged_time'];
}else{
$data['billable'][$value['rel_id']]['project'] = $value['project_name'];
$data['billable'][$value['rel_id']]['total'] = $value['total_logged_time'];
}
$total_billable += $value['total_logged_time'];
}else{
if (isset($data['unbillable'][$value['rel_id']])) {
$data['unbillable'][$value['rel_id']]['total'] += $value['total_logged_time'];
}else{
$data['unbillable'][$value['rel_id']]['project'] = $value['project_name'];
$data['unbillable'][$value['rel_id']]['total'] = $value['total_logged_time'];
}
$total_unbillable += $value['total_logged_time'];
}
}
$billable = [];
$unbillable = [];
foreach ($data['billable'] as $key => $value) {
$node = [];
$node['project'] = $value['project'];
$node['total'] = round($value['total'] / 60 / 60, 2).' '._l('hours');
$billable[] = $node;
}
foreach ($data['unbillable'] as $key => $value) {
$node = [];
$node['project'] = $value['project'];
$node['total'] = round($value['total'] / 60 / 60, 2).' '._l('hours');
$unbillable[] = $node;
}
$total = round($total_billable / 60 / 60, 2) + round($total_unbillable / 60 / 60, 2);
if($total == 0){
$billable_percent = 0;
$unbillable_percent = 0;
}else{
$billable_percent = round((round($total_billable / 60 / 60, 2)/ $total) * 100, 2);
$unbillable_percent = round((round($total_unbillable / 60 / 60, 2)/ $total) * 100, 2);
}
$data_return = [];
$data_return['billable'] = $billable;
$data_return['unbillable'] = $unbillable;
$data_return['total']['billable'] = round($total_billable / 60 / 60, 2).' '._l('hours').' ('.$billable_percent.'%)';
$data_return['total']['unbillable'] = round($total_unbillable / 60 / 60, 2).' '._l('hours').' ('.$unbillable_percent.'%)';
$data_return['total']['total_capacity'] = round($total_capacity, 2).' '._l('hours');
return $data_return;
}
}