master #121
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -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([
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,7 +71,11 @@ const ModalFileDocument = ({
 | 
			
		|||
    >
 | 
			
		||||
      <Group justify="flex-end" mb={'md'}>
 | 
			
		||||
        <a
 | 
			
		||||
          href={`${import.meta.env.VITE_BACKEND_URL}${selectDataRow.uri}`}
 | 
			
		||||
          href={`${import.meta.env.VITE_BACKEND_URL}${
 | 
			
		||||
            import.meta.env.VITE_BACKEND_URL?.includes('localhost')
 | 
			
		||||
              ? ''
 | 
			
		||||
              : 'image/'
 | 
			
		||||
          }${selectDataRow.uri}`}
 | 
			
		||||
          download="Document Download"
 | 
			
		||||
          target={
 | 
			
		||||
            getFileType(selectDataRow?.uri) === 'pdf' ? '_blank' : '_self'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue