' . t(
'Overview of number of cases for each project') .
'
' ;
break ;
case 'admin/content/casetracker/dashboard':
return '' . t('Adminster dashboard') . '
' ;
break ;
}
}
/**
* Implementation of hook_perm().
*/
function casetracker_dashboard_perm() {
return array(
'access case tracker dashboard'
) ;
}
/**
* Implementation of hook_menu().
*/
function casetracker_dashboard_menu($may_cache) {
global $user ;
$items = array(
) ;
if ($may_cache) {
/* -- user accessible menu items ---------------------------------------- */
$items[] = array(
'access' => user_access(
'access case tracker dashboard'),
'callback' => 'casetracker_dashboard_overview',
'path' => 'casetracker/dashboard',
'title' => t('Dashboard'),
'weight' => 2
) ;
$items[] = array(
'access' => user_access(
'administer case tracker'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'casetracker_dashboard_admin_form'
),
'description' => t(
'Configure the Case Tracker dashboard options with these settings.'),
'path' => 'admin/settings/casetracker/dashboard',
'title' => t('Dashboard'),
'type' => MENU_LOCAL_TASK
) ;
}
return $items ;
}
/**
* Menu callback
* Displays a list of all projects and a count of all their states.
*
* @param void
* @return string
*/
function casetracker_dashboard_overview() {
drupal_set_breadcrumb(
array(
l(t('Home'), NULL),
l(t('Case Tracker'),
'casetracker'),
l(t('Dashboard'),
'casetracker/dashboard')
)) ;
drupal_add_css(
drupal_get_path('module', 'casetracker') . '/casetracker.css') ;
$output = array(
) ;
// first we create an overview of all projects and their states counts
$output[] = _casetracker_dashboard_states() ;
return implode("\n\n", $output) ;
}
/**
* Form callback
* Configure the CaseTracker dashboard
*
* @param void
* @return string
*/
function casetracker_dashboard_admin_form() {
$form = array(
) ;
$form['casetracker_dashboard_admin'] = array(
'#type' => 'fieldset',
'#title' => t('Dashboard settings'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#description' => t(
'Assign the case status that need to be counted as Done')
) ;
$states = casetracker_case_state_load('status') ;
$statesChecked = variable_get('casetracker_dashboard_states_done',
array(
)) ;
foreach ($states as $csid => $title) {
$checked = isset($statesChecked[$csid]) ? $statesChecked[$csid] : false ;
$form['casetracker_dashboard_admin'][$csid] = array(
'#type' => 'checkbox',
'#title' => t($title),
'#default_value' => $checked
) ;
}
$form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
return $form;
}
/**
* Form submit hook
*
* @param string
* @param array
* @return void
*/
function casetracker_dashboard_admin_form_submit($_formId, $_formValues) {
if ($_formValues['op'] == t('Save configuration')) {
// get the states
$states = casetracker_case_state_load('status') ;
$settings = array();
foreach ($states as $csid => $title) {
$settings[$csid] = (isset($_formValues[$csid])) ? (bool)$_formValues[$csid] : false ;
}
variable_set('casetracker_dashboard_states_done', $settings) ;
drupal_set_message(t('The configuration options have been saved.'));
}
}
/**
* Function to get an overview of all projects and their states count
*
* @param void
* @return string
*/
function _casetracker_dashboard_states() {
$output = array(
) ;
// first we get all the possible projects
$projects = _casetracker_dashboard_getProjects() ;
// we get the possible states
$states = casetracker_case_state_load('status') ;
// we get the project - cases count
$caseCount = _casetracker_dashboard_projectCasesCount() ;
// create the table array
$projectCaseCount = _casetracker_dashboard_createProjectCountArray(
$projects, $states, $caseCount) ;
// create the overview table
$headers = array(
array(
'data' => t('Project'),
'class' => 'project'
)
) ;
foreach ($states as $state) {
$headers[] = t($state) ;
}
$headers[] = array(
'data' => t('Todo'),
'class' => 'devider'
) ;
$headers[] = t('Done') ;
$headers[] = array(
'data' => t('Total'),
'class' => 'devider'
) ;
$headers[] = array(
'data' => t('Completed
%'),
'class' => 'percent'
) ;
// theme the array
$output[] = theme('table', $headers, $projectCaseCount,
array(
'id' => 'casetracker-dashboard'
)) ;
return implode("\n", $output) ;
}
/**
* Function to get all the projects
*
* @param void
* @return array
*/
function _casetracker_dashboard_getProjects() {
static $projects ;
if (!is_array($projects)) {
$filter_sql = NULL ;
$filter_args = array_filter(
variable_get(
'casetracker_project_node_types',
array(
'casetracker_basic_project'
))) ;
// this is an interisting feature
if ($project_filter == 'my') {
global $user ;
$filter_sql = 'AND n.uid = %d' ;
$filter_args[] = $user->uid ;
}
// build the query
$sql = db_rewrite_sql(
'SELECT n.nid, n.title, cp.project_number ' .
'FROM {node} n ' . 'LEFT JOIN {casetracker_project} cp ON (n.vid = cp.vid) ' .
'WHERE n.type ' . 'IN (\'' .
implode('\',\'',
$filter_args) .
'\') ' . 'AND n.status = 1 ' .
$filter_sql) ;
$sql .= 'ORDER BY n.title ASC' ;
$results = db_query($sql) ;
$projects = array(
) ;
while ($row = db_fetch_object($results)) {
$projects[$row->nid] = array(
'project_number' => $row->project_number,
'title' => $row->title
) ;
}
}
return $projects ;
}
/**
* Function to get an array of projects, case status count
*
* @param void
* @return array
*/
function _casetracker_dashboard_projectCasesCount() {
$filter_args = array_filter(
variable_get('casetracker_project_node_types',
array(
'casetracker_basic_project'
))) ;
$sql = db_rewrite_sql(
'SELECT ' . ' n.nid, c.csid, Count(1) AS number_of_cases ' .
'FROM ' . ' {node} AS n ' . ' Inner Join {casetracker_case} AS b ON (n.nid = b.pid) ' .
' Inner Join {node} AS d ON (b.vid = d.vid)' .
' Inner Join {casetracker_case_states} AS c ON (b.case_status_id = c.csid) ' .
'WHERE ' . ' n.type IN (\'' . implode(
'\',\'',
$filter_args) .
'\') ' . ' AND n.status = 1 ') ;
$sql .= 'GROUP BY n.nid, c.csid ' ;
$sql .= 'ORDER BY n.nid ASC, c.csid ASC ' ;
$results = db_query($sql) ;
$caseCounter = array(
) ;
while ($row = db_fetch_object($results)) {
$caseCounter[] = $row ;
}
return $caseCounter ;
}
/**
* Function to combine project - states and case count to one big array
*
* @param array projects
* @param array states
* @param array count
* @return array
*/
function _casetracker_dashboard_createProjectCountArray($_projects, $_states,
$_caseCount) {
$overview = array(
) ;
// init vars
$info = array(
) ;
$completedKeys = array(
) ;
// get the state keys that have to be counted as done
$statesDone = variable_get(
'casetracker_dashboard_states_done',
array(
)) ;
foreach ($statesDone as $key => $done) {
if (true === $done) {
$completedKeys[] = $key ;
}
}
// create the states count array
// && the total array
$totals = array(
'project' => array(
'data' => t('Total'),
'class' => 'project'
)
) ;
foreach ($_states as $key => $value) {
$totals['state_' . $key] = $info['state_' . $key] = array(
'data' => 0
) ;
}
$totals['todo'] = $info['todo'] = array(
'data' => 0,
'class' => 'devider'
) ;
$totals['done'] = $info['done'] = array(
'data' => 0
) ;
$totals['total'] = $info['total'] = array(
'data' => 0,
'class' => 'devider'
) ;
$totals['completed'] = $info['completed'] = array(
'data' => 0,
'class' => 'percent'
) ;
// first add all possible projects as an extra array to the projects array
foreach ($_projects as $key => $project) {
$link = l($project['title'],
'casetracker/cases/' . $key . '/all') ;
$overview[$key]['project'] = array(
'data' => $link,
'class' => 'project'
) ;
$overview[$key] = array_merge($overview[$key], $info) ;
}
// loop through the counts and add the counts to the array
foreach ($_caseCount as $count) {
$nid = (int)$count->nid ;
$csid = (int)$count->csid ;
$overview[$nid]['state_' . $csid]['data'] = (int)$count->number_of_cases ;
$totals['state_' . $csid]['data'] += (int)$count->number_of_cases ;
if (in_array($csid, $completedKeys)) {
$overview[$nid]['done']['data'] += (int)$count->number_of_cases ;
$totals['done']['data'] += (int)$count->number_of_cases ;
} else {
$overview[$nid]['todo']['data'] += (int)$count->number_of_cases ;
$totals['todo']['data'] += (int)$count->number_of_cases ;
}
$overview[$nid]['total']['data'] += (int)$count->number_of_cases ;
$totals['total']['data'] += (int)$count->number_of_cases ;
}
// loop through the projects and count the percentage of completed cases
foreach ($overview as $key => $project) {
if (0 < $project['total']['data']) {
$overview[$key]['completed']['data'] = round(
($project['done']['data'] / $project['total']['data']) *
100) ;
} else {
$overview[$key]['completed']['data'] = 100 ;
}
}
// calculate the overview %
if (0 < $totals['todo'] && 0 < $totals['total']['data']) {
$totals['completed']['data'] = round(
($totals['done']['data'] / $totals['total']['data']) *
100) ;
} else {
$totals['completed']['data'] = 100 ;
}
$overview['totals'] = array(
'data' => $totals,
'class' => 'totals'
) ;
return $overview ;
}