You are here

protected function DashboardForm::buildTrainingsProgress in Opigno statistics 3.x

Same name and namespace in other branches
  1. 8 src/Form/DashboardForm.php \Drupal\opigno_statistics\Form\DashboardForm::buildTrainingsProgress()

Builds trainings progress.

Parameters

\Drupal\Core\Datetime\DrupalDateTime $datetime: Date.

array $lp_ids: LP IDs.

Return value

array Render array.

Throws

\Exception

1 call to DashboardForm::buildTrainingsProgress()
DashboardForm::buildForm in src/Form/DashboardForm.php
Form constructor.

File

src/Form/DashboardForm.php, line 231

Class

DashboardForm
Implements the statistics dashboard.

Namespace

Drupal\opigno_statistics\Form

Code

protected function buildTrainingsProgress(DrupalDateTime $datetime, array $lp_ids = []) : array {
  $progress = $completion = 0;
  $time_str = $datetime
    ->format(DrupalDateTime::FORMAT);
  $query = $this->database
    ->select('opigno_learning_path_achievements', 'a');
  $query
    ->addExpression('SUM(a.progress) / COUNT(a.progress) / 100', 'progress');
  $query
    ->addExpression('COUNT(a.completed) / COUNT(a.registered)', 'completion');
  $query
    ->fields('a', [
    'name',
  ])
    ->groupBy('a.name')
    ->orderBy('a.name')
    ->condition('a.registered', $time_str, '<');
  if ($lp_ids) {
    $query
      ->condition('a.gid', $lp_ids, 'IN');
    $query
      ->leftJoin('group_content_field_data', 'g_c_f_d', 'a.uid = g_c_f_d.entity_id AND g_c_f_d.gid = a.gid');
    $query
      ->condition('g_c_f_d.type', 'learning_path-group_membership');
  }
  $query
    ->condition('a.uid', 0, '<>');
  $or_group = $query
    ->orConditionGroup();
  $or_group
    ->condition('a.completed', $time_str, '<');
  $or_group
    ->isNull('a.completed');
  $data = $query
    ->execute()
    ->fetchAll();
  $count = count($data);
  if ($count > 0) {
    foreach ($data as $row) {
      $progress += $row->progress;
      $completion += $row->completion;
    }
    $progress /= $count;
    $completion /= $count;
  }
  return [
    'drupalSettings' => [
      'opignoCharts' => [
        'trainingsProgress' => $this
          ->buildDonutChart((double) $progress, '#trainings-progress-chart'),
        'trainingsCompletion' => $this
          ->buildDonutChart((double) $completion, '#trainings-completion-chart'),
        'usersPerDay' => $this
          ->buildUsersPerDay($datetime, $lp_ids),
      ],
    ],
  ];
}