From e174146678e2573d6fbbcbcc98a12592af806cd2 Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 14 Mar 2025 14:40:34 +0700 Subject: [PATCH 1/4] test --- .../app/Http/Controllers/JiraController.php | 23 ++++++++++++++- BACKEND/Modules/Admin/routes/api.php | 2 ++ BACKEND/app/Services/JiraService.php | 29 ++++++++++++++----- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/JiraController.php b/BACKEND/Modules/Admin/app/Http/Controllers/JiraController.php index 1dac3ff..c84c089 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/JiraController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/JiraController.php @@ -178,6 +178,27 @@ class JiraController extends Controller } } + public function getWeeklyReport() + { + try { + $startOfWeek = Carbon::now()->startOfWeek()->format('Y-m-d'); // Mặc định là Thứ Hai + $endOfWeek = Carbon::now()->endOfWeek()->format('Y-m-d'); // Mặc định là Chủ Nhật + // dd($startOfWeek); + $results = []; + $workLogs = $this->jiraService->getAllUserWorkLogs($startOfWeek, $endOfWeek); + foreach($workLogs as $data){ + $results[$data['username']] = $data['information']['issues']; + } + + + return response()->json([ + $results + ], 200); + } catch (\Exception $e) { + return response()->json(['error' => $e->getMessage()], 500); + } + } + public function sendReport() { $dateFormatted = Carbon::yesterday()->setTimezone(env('TIME_ZONE'))->format('Y-m-d'); @@ -186,7 +207,7 @@ class JiraController extends Controller $tasksByUser = $this->formatWorkLogsByUser($workLogs); // Mail::to(['luanlt632000@gmail.com'])->send(new WorklogReport($tasksByUser)); - Mail::to(['luanlt632000@gmail.com', 'admin@apactech.io'])->send(new WorklogReport($tasksByUser)); + Mail::to(['joseph@apactech.io', 'admin@apactech.io'])->send(new WorklogReport($tasksByUser)); // return "Email sent successfully!"; return response()->json([ diff --git a/BACKEND/Modules/Admin/routes/api.php b/BACKEND/Modules/Admin/routes/api.php index e2b0c51..b561918 100755 --- a/BACKEND/Modules/Admin/routes/api.php +++ b/BACKEND/Modules/Admin/routes/api.php @@ -114,6 +114,8 @@ Route::middleware('api') Route::get('/get-all-sprint-by-id-board', [JiraController::class, 'getAllSprintByIdBoard'])->middleware('check.permission:admin.tester'); Route::get('/get-all-issue-by-id-sprint', [JiraController::class, 'getAllIssueByIdSprint']); + Route::get('/export-weekly-report', [JiraController::class, 'getWeeklyReport']); + Route::get('/all-issue-by-project', [JiraController::class, 'fetchIssuesByProject']); Route::get('/worklogs', [JiraController::class, 'getAllUserWorkLogs'])->middleware('check.permission:admin.staff'); Route::get('/allocation', [JiraController::class, 'getAllUserDoing'])->middleware('check.permission:admin.staff'); diff --git a/BACKEND/app/Services/JiraService.php b/BACKEND/app/Services/JiraService.php index ac8f21a..96abb3d 100644 --- a/BACKEND/app/Services/JiraService.php +++ b/BACKEND/app/Services/JiraService.php @@ -23,7 +23,9 @@ class JiraService 'Authorization' => $this->authHeader, 'Accept' => 'application/json', 'Content-Type' => 'application/json' - ] + ], + 'timeout' => 60, // Tăng thời gian timeout lên 60 giây + 'connect_timeout' => 30 // Tăng thời gian chờ kết nối lên 30 giây ]); } @@ -253,7 +255,7 @@ class JiraService $issues = json_decode($response->getBody()->getContents(), true); - // Lọc các issue không thuộc các project bị ignore + // Lọc các issue không thuộc các project bị ignore $filtered_issues = array_filter($issues['issues'], function ($issue) use ($ignore_projects) { return !in_array($issue['fields']['project']['name'], $ignore_projects); }); @@ -266,29 +268,28 @@ class JiraService foreach ($issues['issues'] as $issue) { $projectName = $issue['fields']['project']['name']; - if(!in_array($projectName, $ignore_projects)) { + if (!in_array($projectName, $ignore_projects)) { $username = $issue['fields']['assignee']['displayName']; $issue['fields']['assignee']['emailAddress'] = $user['emailAddress']; if (!isset($groupedIssues[$projectName])) { $groupedIssues[$projectName] = []; $groupedIssues[$projectName]['project'] = $issue['fields']['project']; } - + if (!isset($groupedIssues[$projectName]['users'][$username])) { $groupedIssues[$projectName]['users'][$username] = []; $groupedIssues[$projectName]['users'][$username]['user'] = $issue['fields']['assignee']; $groupedIssues[$projectName]['users'][$username]['p_total_spent'] = 0; $groupedIssues[$projectName]['users'][$username]['p_total_est'] = 0; } - + $groupedIssues[$projectName]['users'][$username]['issues'][] = $issue; $groupedIssues[$projectName]['users'][$username]['p_total_spent'] = $groupedIssues[$projectName]['users'][$username]['p_total_spent'] + $issue['fields']['timespent']; $groupedIssues[$projectName]['users'][$username]['p_total_est'] = $groupedIssues[$projectName]['users'][$username]['p_total_est'] + ($issue['fields']['timeoriginalestimate'] ?? 0); - + $users_data[$user['displayName']]['total_spent'] = $users_data[$user['displayName']]['total_spent'] + $issue['fields']['timespent']; $users_data[$user['displayName']]['total_est'] = $users_data[$user['displayName']]['total_est'] + ($issue['fields']['timeoriginalestimate'] ?? 0); } - } } @@ -325,4 +326,18 @@ class JiraService $response = $this->client->get('/rest/agile/1.0/sprint/' . $id . '/issue'); return json_decode($response->getBody()->getContents(), true); } + + public function getWeeklyReport() + { + $body = [ + 'fields' => ['summary', 'status', 'timeoriginalestimate', 'timespent', 'assignee', 'project', 'worklog'], + 'jql' => 'worklogDate >= startOfWeek() AND worklogDate < startOfWeek(1) order by created DESC', + 'maxResults' => 1000 + ]; + + $response = $this->client->post('/rest/api/3/search', [ + 'body' => json_encode($body) + ]); + return json_decode($response->getBody()->getContents(), true); + } } -- 2.39.2 From d1f889c996e4a75709ba694a785f57a663c73208 Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 14 Mar 2025 15:16:04 +0700 Subject: [PATCH 2/4] update search datatable --- FRONTEND/src/components/DataTable/DataTable.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/FRONTEND/src/components/DataTable/DataTable.tsx b/FRONTEND/src/components/DataTable/DataTable.tsx index 06c80fb..ff20b12 100755 --- a/FRONTEND/src/components/DataTable/DataTable.tsx +++ b/FRONTEND/src/components/DataTable/DataTable.tsx @@ -250,12 +250,7 @@ export const DataTableAll = ({ if (query !== '') { setTData( data.filter((obj) => - Object.values(obj).some( - (value: any) => - value !== null && - value.toString().toLowerCase().includes(query.toLowerCase()), - ), - ), + Object.values(obj)?.find((c: any) => c.toString().normalize('NFC').toLowerCase().includes(query.normalize('NFC').toLowerCase()))) ) } else { if (pagination) { -- 2.39.2 From d803d69b72c4eecb53b476cd6afc7532f5019e40 Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 14 Mar 2025 15:29:58 +0700 Subject: [PATCH 3/4] update download link --- FRONTEND/src/pages/Document/ModalFileDocument.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FRONTEND/src/pages/Document/ModalFileDocument.tsx b/FRONTEND/src/pages/Document/ModalFileDocument.tsx index 358ced5..087a2e1 100644 --- a/FRONTEND/src/pages/Document/ModalFileDocument.tsx +++ b/FRONTEND/src/pages/Document/ModalFileDocument.tsx @@ -71,7 +71,11 @@ const ModalFileDocument = ({ > Date: Fri, 14 Mar 2025 15:32:13 +0700 Subject: [PATCH 4/4] update download link --- FRONTEND/src/pages/Document/ModalFileDocument.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FRONTEND/src/pages/Document/ModalFileDocument.tsx b/FRONTEND/src/pages/Document/ModalFileDocument.tsx index 087a2e1..506db99 100644 --- a/FRONTEND/src/pages/Document/ModalFileDocument.tsx +++ b/FRONTEND/src/pages/Document/ModalFileDocument.tsx @@ -73,8 +73,8 @@ const ModalFileDocument = ({