data = $collection['reportCharts']; $this->reportData = $collection['reportData']; $this->user = $userId; $this->userName = $userName; $this->periodDates = $periodDates; $this->countDate = count($this->periodDates); } public function columnWidths(): array { $columnWidths = ['A' => 45]; $currentColumn = 2; while ($currentColumn <= $this->countDate + 1) { $columnWidths[Coordinate::stringFromColumnIndex($currentColumn)] = 25; $currentColumn++; } return $columnWidths; } public function array(): array { if (isset($this->data['total_spent_time_day']['datasets'])) { foreach ($this->data['total_spent_time_day']['datasets'] as $userId => $user) { if ($userId !== $this->user) continue; $resultRow = []; $resultRow[] = $user['label'] ?? ''; $this->userName = $user['label'] ?? ''; if (isset($user['data'])) { foreach ($user['data'] as $date => $time) { $resultRow[] = $this->formatDuration($time); } } $result[] = $resultRow; } } if (isset($this->data['total_spent_time_day_and_tasks']['datasets'])) { $resultRow = []; $resultRow[] = 'task name'; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $result[] = $resultRow; foreach ($this->data['total_spent_time_day_and_tasks']['datasets'] as $userId => $userTasks) { if ($userId !== $this->user) continue; foreach ($userTasks as $taskId => $task) { $resultRow = []; $resultRow[] = $task['label'] ?? ''; if (isset($task['data'])) { foreach ($task['data'] as $date => $time) { $resultRow[] = $this->formatDuration($time); } } $result[] = $resultRow; } } } if (isset($this->data['total_spent_time_day_and_projects']['datasets'])) { $resultRow = []; $resultRow[] = 'task project'; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $resultRow[] = ' '; $result[] = $resultRow; foreach ($this->data['total_spent_time_day_and_projects']['datasets'] as $userId => $userTasks) { if ($userId !== $this->user) continue; foreach ($userTasks as $taskId => $task) { $resultRow = []; $resultRow[] = $task['label'] ?? ''; if (isset($task['data'])) { foreach ($task['data'] as $date => $time) { $resultRow[] = $this->formatDuration($time); } } $result[] = $resultRow; } } } if (isset($this->reportData)) { $resultRow = []; $resultRow[] = 'User Name'; $resultRow[] = 'User Email'; $resultRow[] = 'Project Name'; $resultRow[] = 'Project created at'; $resultRow[] = 'Task name'; $resultRow[] = 'Task priority'; $resultRow[] = 'Task status'; $resultRow[] = 'Task due date'; $resultRow[] = 'Task description'; $result[] = $resultRow; foreach ($this->reportData as $userId => $user) { if ($userId !== $this->user) continue; if (isset($user['projects'])) { foreach ($user['projects'] as $projectId => $project) { if (isset($project['tasks'])) { foreach ($project['tasks'] as $taskId => $task) { $resultRow = []; $resultRow[] = $user['full_name'] ?? ''; $resultRow[] = $user['email'] ?? ''; $resultRow[] = $project['name'] ?? ''; $resultRow[] = $project['created_at'] ?? ''; $resultRow[] = $task['task_name'] ?? ''; $resultRow[] = $task['priority'] ?? ''; $resultRow[] = $task['status'] ?? ''; $resultRow[] = $task['due_date'] ?? ''; $resultRow[] = $task['description'] ?? ''; $result[] = $resultRow; } } } } } } return $result; } public function charts() { $createDataSeries = function ($label, $categories, $values) { return new DataSeries( DataSeries::TYPE_LINECHART, DataSeries::GROUPING_STANDARD, [0], $label, $categories, $values ); }; $createChart = function ($name, $title, $position, $offset, $startColumn, $endColumn, $rowCount, $columnLast) use ($createDataSeries) { $series = []; if (empty($rowCount)) { $label = [new DataSeriesValues('String', "'" . $this->title() . "'" . '!A2', null, 1)]; $categories = [new DataSeriesValues('String', "'" . $this->title() . "'" . "!{$startColumn}1:{$endColumn}1", null, $columnLast)]; $values = [new DataSeriesValues('Number', "'" . $this->title() . "'" . "!{$startColumn}2:{$endColumn}2", null, $columnLast)]; $series[] = $createDataSeries($label, $categories, $values); } else { for ($i = $rowCount[0]; $i < $rowCount[1]; $i++) { $label = [new DataSeriesValues('String', "'" . $this->title() . "'" . '!A' . $i, null, $i)]; $categories = [new DataSeriesValues('String', "'" . $this->title() . "'" . "!{$startColumn}1:{$endColumn}1", null, $columnLast)]; $values = [new DataSeriesValues('Number', "'" . $this->title() . "'" . "!{$startColumn}" . $i . ":!{$endColumn}" . $i, null, $columnLast)]; $series[] = $createDataSeries($label, $categories, $values); } } $plot = new PlotArea(null, $series); $legend = new Legend(); $chart = new Chart($name, new Title($title), $legend, $plot); $chart->setTopLeftPosition($position[0]); $chart->setTopLeftOffset($offset[0], $offset[0]); $chart->setBottomRightPosition($position[1]); $chart->setBottomRightOffset($offset[1], $offset[1]); return $chart; }; $columnNumber = $this->countDate; $charts = []; $columnLast = Coordinate::stringFromColumnIndex($columnNumber + 1); $charts[] = $createChart(static::TEXT_USER, static::TEXT_USER, static::POSITIONS_CHART[0], static::OFFSET_CHART, static::COLUMN_FIRST, $columnLast, [], $columnNumber); $charts[] = $createChart(static::TEXT_TASK, static::TEXT_TASK, static::POSITIONS_CHART[1], static::OFFSET_CHART, static::COLUMN_FIRST, $columnLast, [4, $this->rowCount() + 4], $columnNumber); $charts[] = $createChart(static::TEXT_PROJECT, static::TEXT_PROJECT, static::POSITIONS_CHART[2], static::OFFSET_CHART, static::COLUMN_FIRST, $columnLast, [$this->rowCount() + 5, $this->rowCountProject() + $this->rowCount() + 5], $columnNumber); return $charts; } public function headings(): array { return [ 'User Name', ...collect($this->periodDates)->map(fn($date) => Carbon::parse($date)->format('y-m-d')) ]; } /** * @return string */ public function title(): string { return \Str::limit("$this->userName", 10); } protected function rowCount() { $count = 0; if (isset($this->data['total_spent_time_day_and_tasks']['datasets'])) { foreach ($this->data['total_spent_time_day_and_tasks']['datasets'] as $userId => $userTasks) { if ($userId !== $this->user) continue; $count += count($userTasks); } } return $count; } protected function rowCountProject() { $count = 0; if (isset($this->data['total_spent_time_day_and_projects']['datasets'])) { foreach ($this->data['total_spent_time_day_and_projects']['datasets'] as $userId => $userTasks) { if ($userId !== $this->user) continue; $count += count($userTasks); } } return $count; } }