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()
|
public function sendReport()
|
||||||
{
|
{
|
||||||
$dateFormatted = Carbon::yesterday()->setTimezone(env('TIME_ZONE'))->format('Y-m-d');
|
$dateFormatted = Carbon::yesterday()->setTimezone(env('TIME_ZONE'))->format('Y-m-d');
|
||||||
|
|
@ -186,7 +207,7 @@ class JiraController extends Controller
|
||||||
|
|
||||||
$tasksByUser = $this->formatWorkLogsByUser($workLogs);
|
$tasksByUser = $this->formatWorkLogsByUser($workLogs);
|
||||||
// Mail::to(['luanlt632000@gmail.com'])->send(new WorklogReport($tasksByUser));
|
// 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 "Email sent successfully!";
|
||||||
return response()->json([
|
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-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('/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('/all-issue-by-project', [JiraController::class, 'fetchIssuesByProject']);
|
||||||
Route::get('/worklogs', [JiraController::class, 'getAllUserWorkLogs'])->middleware('check.permission:admin.staff');
|
Route::get('/worklogs', [JiraController::class, 'getAllUserWorkLogs'])->middleware('check.permission:admin.staff');
|
||||||
Route::get('/allocation', [JiraController::class, 'getAllUserDoing'])->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,
|
'Authorization' => $this->authHeader,
|
||||||
'Accept' => 'application/json',
|
'Accept' => 'application/json',
|
||||||
'Content-Type' => '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);
|
$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) {
|
$filtered_issues = array_filter($issues['issues'], function ($issue) use ($ignore_projects) {
|
||||||
return !in_array($issue['fields']['project']['name'], $ignore_projects);
|
return !in_array($issue['fields']['project']['name'], $ignore_projects);
|
||||||
});
|
});
|
||||||
|
|
@ -266,29 +268,28 @@ class JiraService
|
||||||
|
|
||||||
foreach ($issues['issues'] as $issue) {
|
foreach ($issues['issues'] as $issue) {
|
||||||
$projectName = $issue['fields']['project']['name'];
|
$projectName = $issue['fields']['project']['name'];
|
||||||
if(!in_array($projectName, $ignore_projects)) {
|
if (!in_array($projectName, $ignore_projects)) {
|
||||||
$username = $issue['fields']['assignee']['displayName'];
|
$username = $issue['fields']['assignee']['displayName'];
|
||||||
$issue['fields']['assignee']['emailAddress'] = $user['emailAddress'];
|
$issue['fields']['assignee']['emailAddress'] = $user['emailAddress'];
|
||||||
if (!isset($groupedIssues[$projectName])) {
|
if (!isset($groupedIssues[$projectName])) {
|
||||||
$groupedIssues[$projectName] = [];
|
$groupedIssues[$projectName] = [];
|
||||||
$groupedIssues[$projectName]['project'] = $issue['fields']['project'];
|
$groupedIssues[$projectName]['project'] = $issue['fields']['project'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($groupedIssues[$projectName]['users'][$username])) {
|
if (!isset($groupedIssues[$projectName]['users'][$username])) {
|
||||||
$groupedIssues[$projectName]['users'][$username] = [];
|
$groupedIssues[$projectName]['users'][$username] = [];
|
||||||
$groupedIssues[$projectName]['users'][$username]['user'] = $issue['fields']['assignee'];
|
$groupedIssues[$projectName]['users'][$username]['user'] = $issue['fields']['assignee'];
|
||||||
$groupedIssues[$projectName]['users'][$username]['p_total_spent'] = 0;
|
$groupedIssues[$projectName]['users'][$username]['p_total_spent'] = 0;
|
||||||
$groupedIssues[$projectName]['users'][$username]['p_total_est'] = 0;
|
$groupedIssues[$projectName]['users'][$username]['p_total_est'] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
$groupedIssues[$projectName]['users'][$username]['issues'][] = $issue;
|
$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_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);
|
$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_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);
|
$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');
|
$response = $this->client->get('/rest/agile/1.0/sprint/' . $id . '/issue');
|
||||||
return json_decode($response->getBody()->getContents(), true);
|
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 !== '') {
|
if (query !== '') {
|
||||||
setTData(
|
setTData(
|
||||||
data.filter((obj) =>
|
data.filter((obj) =>
|
||||||
Object.values(obj).some(
|
Object.values(obj)?.find((c: any) => c.toString().normalize('NFC').toLowerCase().includes(query.normalize('NFC').toLowerCase())))
|
||||||
(value: any) =>
|
|
||||||
value !== null &&
|
|
||||||
value.toString().toLowerCase().includes(query.toLowerCase()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
if (pagination) {
|
if (pagination) {
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,11 @@ const ModalFileDocument = ({
|
||||||
>
|
>
|
||||||
<Group justify="flex-end" mb={'md'}>
|
<Group justify="flex-end" mb={'md'}>
|
||||||
<a
|
<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"
|
download="Document Download"
|
||||||
target={
|
target={
|
||||||
getFileType(selectDataRow?.uri) === 'pdf' ? '_blank' : '_self'
|
getFileType(selectDataRow?.uri) === 'pdf' ? '_blank' : '_self'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue