Example #1
0
 public function getResultsTable(Report $report)
 {
     $rawResults = Result::whereHas('report', function ($query) use($report) {
         $query->where('id', $report->id);
     })->get();
     $headers = array('indicators' => array(), 'components' => array());
     foreach ($report['indicators'] as $indicator) {
         array_push($headers['indicators'], array('name' => $indicator->name, 'description' => $indicator->description, 'visible' => $indicator->pivot->show_value || $indicator->pivot->show_points, 'colspan' => $indicator->pivot->show_value && $indicator->pivot->show_points ? 2 : 1));
         array_push($headers['components'], array('id' => $indicator->id, 'type' => 'value', 'displayName' => 'Wartość', 'visible' => $indicator->pivot->show_value));
         array_push($headers['components'], array('id' => $indicator->id, 'type' => 'points', 'displayName' => 'Punkty', 'visible' => $indicator->pivot->show_points));
     }
     $results = [];
     $resultsByIndicator = [];
     foreach ($rawResults as $result) {
         $userId = $result->user_id;
         if (!array_key_exists($userId, $results)) {
             $results[$userId] = array('displayName' => $result->user->name . ' ' . $result->user->surname, 'indicators' => [], 'sum' => 0);
         }
         $indicatorId = $result->indicator_id;
         $results[$userId]['indicators'][$indicatorId] = array('value' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_value, 'data' => $result->value), 'points' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_points, 'data' => $result->points));
         if ($report->indicators()->find($indicatorId)->pivot->show_points) {
             $results[$userId]['sum'] += $result->points;
         }
         // results by indicator
         if (!array_key_exists($indicatorId, $resultsByIndicator)) {
             $resultsByIndicator[$indicatorId] = [];
         }
         $resultsByIndicator[$indicatorId][$userId] = $result;
     }
     $results = array_values($results);
     $statistics = array('min' => array('indicators' => [], 'sum' => min(array_map(function ($user) {
         return $user['sum'];
     }, $results))), 'max' => array('indicators' => [], 'sum' => max(array_map(function ($user) {
         return $user['sum'];
     }, $results))), 'avg' => array('indicators' => [], 'sum' => array_sum(array_map(function ($user) {
         return $user['sum'];
     }, $results)) / count($results)));
     foreach ($resultsByIndicator as $indicatorId => $indicatorResults) {
         $statistics['min']['indicators'][$indicatorId] = array('value' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_value, 'data' => min(array_map(function ($result) {
             return $result->value;
         }, $indicatorResults))), 'points' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_points, 'data' => min(array_map(function ($result) {
             return $result->points;
         }, $indicatorResults))));
         $statistics['max']['indicators'][$indicatorId] = array('value' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_value, 'data' => max(array_map(function ($result) {
             return $result->value;
         }, $indicatorResults))), 'points' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_points, 'data' => max(array_map(function ($result) {
             return $result->points;
         }, $indicatorResults))));
         $statistics['avg']['indicators'][$indicatorId] = array('value' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_value, 'data' => array_sum(array_map(function ($result) {
             return $result->value;
         }, $indicatorResults)) / count($indicatorResults)), 'points' => array('visible' => $report->indicators()->find($indicatorId)->pivot->show_points, 'data' => array_sum(array_map(function ($result) {
             return $result->value;
         }, $indicatorResults)) / count($indicatorResults)));
     }
     return array('headers' => $headers, 'results' => $results, 'statistics' => $statistics);
 }
Example #2
0
 public function evaluate($id)
 {
     if (Gate::denies('managerOnly')) {
         abort(403);
     }
     $result = DB::transaction(function ($id) use($id) {
         $report = Report::find($id);
         if ($report) {
             if ($report->evaluated_at) {
                 Result::whereHas('report', function ($report) use($id) {
                     $report->where('id', $id);
                 })->delete();
                 $report->evaluated_at = null;
             }
             $coefficients = array();
             $organizationIndicators = $report->owner->organization->indicators;
             foreach ($organizationIndicators as $organizationIndicator) {
                 $coefficients[$organizationIndicator->id] = $organizationIndicator->pivot->coefficient;
             }
             $faker = Faker::create();
             foreach ($report->users as $user) {
                 foreach ($report->indicators as $indicator) {
                     $value = $indicator->type == 'value' ? $faker->randomNumber(2) : $faker->randomNumber(3, 0, 1);
                     $points = $value * $coefficients[$indicator->id];
                     $result = new Result();
                     $result->report_id = $report->id;
                     $result->user_id = $user->id;
                     $result->indicator_id = $indicator->id;
                     $result->value = $value;
                     $result->points = $points;
                     $result->save();
                 }
             }
             $report->evaluated_at = Carbon::now();
             $report->save();
         }
         return $report;
     });
     return $result;
 }