organization = getenv('GITEA_ORGANIZATION'); $this->giteaClient = new Client(null, null, getenv('GITEA_URL')); $this->giteaClient->authenticate(getenv('GITEA_TOKEN'), null, Client::AUTH_ACCESS_TOKEN); } private function get_repositories() { $repositories = $this->giteaClient->organizations()->repositories($this->organization, 1, 9999); return $repositories; } private function get_issues(string $repository, array $parameters = array()) { return $issues = $this->giteaClient->repositories()->issues()->all($this->organization, $repository, $parameters); } private function get_issue_total_time(string $repository, int $id) { $times = $this->giteaClient->repositories()->issues()->times($this->organization, $repository, $id); $count = 0; foreach ($times as $time) { $count += (int) $time['time']; } return $count; } private function get_issue_labels(array $issue) { $labels = ''; foreach ($issue['labels'] as $label) { $labels .= $label['name'] . ','; } return $labels; } private function create_columns(array $issue) { $array = array( 'Progetto' => $issue['repository']['name'], '#' => $issue['number'], 'Titolo' => $issue['title'], 'URL' => $issue['html_url'], 'Aperto_il' => $issue['created_at'], 'Chiuso_il' => $issue['closed_at'], 'Etichette' => $this->get_issue_labels($issue), 'Kind' => '', 'Request By' => '', 'Priority' => '', 'Tempo' => gmdate('H:i:s', $this->get_issue_total_time($issue['repository']['name'], $issue['number'])), ); foreach ($issue['labels'] as $key => $label) { if (strpos($label['name'],'Kind') !== false) { $array['Kind'] = $label['name']; } if (strpos($label['name'],'RequestBy') !== false) { $array['Request By'] = $label['name']; } if (strpos($label['name'],'Priority') !== false) { $array['Priority'] = $label['name']; } } return $array; } private function create_csv(string $file_name, array $data) { $reader = new Spreadsheet(); $spreadsheet = $reader->getActiveSheet(); $headers = array_keys($data[0]); $data_new = array_unshift($data, $headers); $spreadsheet->fromArray( $data, null, 'A1' ); //dd($spreadsheet); $filename = $file_name . '.xls'; $writer = new Xls($reader); $writer->save($filename); //Define header information header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Cache-Control: no-cache, must-revalidate"); header("Expires: 0"); header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); header('Content-Length: ' . filesize($filename)); header('Pragma: public'); //Clear system output buffer flush(); //Read the size of the file readfile($filename); unlink($filename); //Terminate from the script die(); } private function date_to_datetime(string $date) { $date = str_replace('/', '-', $date); $datetime = new DateTime($date); return $datetime->format('Y-m-d H:i:s'); } private function export_issues(string $from_date, string $to_date, array $issues_params) { $data = array(); $repositories = $this->get_repositories(); foreach ($repositories as $repository) { $issues = $this->get_issues($repository['name'], $issues_params); foreach ($issues as $issue) { $from_datetime = $this->date_to_datetime($from_date); $to_datetime = $this->date_to_datetime($to_date); if (substr($issue['closed_at'], 0, 19) > $from_datetime && substr($issue['closed_at'], 0, 19) <= $to_datetime) { $data[] = $this->create_columns($issue); } } } if (count($data) > 0) { $file_name = $issues_params['state'] . "_issues_from_" . $from_date . "_to_" . $to_date; $this->create_csv($file_name, $data); return true; } return false; } public function export_closed_issues(Request $req) { if ($req->input('token') != getenv('GITEA_TOKEN')) { return redirect('/'); } $from = $req->input('from_year') . '-' . $req->input('from_month') . '-01'; $to = $req->input('to_year') . '-' . $req->input('to_month') . '-31'; $res = $this->export_issues($from, $to, ['state' => $req->input('issues_type')]); return view('backend', [ 'token' => getenv('GITEA_TOKEN'), 'download' => $res ]); } }