You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

112 lines
3.3 KiB

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class StatisticController extends Controller
{
public $map = [
'test' => 0, // The sum of all tasks that are under review
'total' => 0, // Sum of all tasks
'overdue' => 0, // The sum of all overworked tasks
'spent_time' => 0, // The sum of all the minutes spent on tasks
'estimated_time' => 0, // The sum of all the minutes spent performing tasks is estimated
'over_spent_time' => 0, // The sum of all the minutes spent overworking tasks
'under_spent_time' => 0, // The sum of all the minutes left until estimated time
];
public function index(Request $request, int $business, ?int $project = null)
{
$builder = DB::table('tasks')->where('business_id','=',$business);
if ($project) {
$builder->where('project_id', '=', $project);
}
$tasks = $builder->get();
$tags = DB::table('tag_task')
->whereIn('task_id', $tasks->pluck('id')->toArray())
->get()
->groupBy('task_id')
->toArray();
$result = [];
foreach ($tasks as $task) {
$this->addProjects($result, $task);
$this->addSprints($result, $task);
$this->addSystems($result, $task);
$this->addTags($result, $task, $tags[$task->id]);
}
return $result;
}
public function addProjects(&$result, $task)
{
$key = "projects.{$task->project_id}";
$this->subset($key, $result, $task);
}
public function addSprints(&$result, $task)
{
$key = "projects.{$task->project_id}.";
$key .= 'sprints.';
$key .= ($task->sprint_id ?? 0) . '.';
$key .= ($task->assignee_id ?? 0) . '.';
$key .= $task->workflow_id . '.';
$key .= $task->status_id;
$this->subset($key, $result, $task);
}
public function addSystems(&$result, $task)
{
$key = "projects.{$task->project_id}.";
$key .= 'systems.';
$key .= ($task->system_id ?? 0) . '.';
$key .= ($task->assignee_id ?? 0) . '.';
$key .= $task->workflow_id . '.';
$key .= $task->status_id;
$this->subset($key, $result, $task);
}
public function addTags(&$result, $task, $tags)
{
foreach ($tags as $tag) {
$key = "projects.{$task->project_id}.";
$key .= 'tags.';
$key .= $tag->id . '.';
$key .= ($task->assignee_id ?? 0) . '.';
$key .= $task->workflow_id . '.';
$key .= $task->status_id;
$this->subset($key, $result, $task);
}
}
public function subset($key , &$result, $task)
{
$node = Arr::get($result, $key, $this->map);
$node['test'] += $task->ready_to_test;
$node['total'] += 1;
$node['overdue'] += !$task->on_time;
$node['spent_time'] += $task->spent_time;
$node['estimated_time'] += $task->estimated_time;
$node['over_spent_time'] += $task->estimated_time < $task->spent_time ? $task->spent_time - $task->estimated_time : 0;
$node['under_spent_time'] += $task->estimated_time > $task->spent_time ? $task->estimated_time - $task->spent_time : 0;
Arr::set($result, $key, $node);
}
}