diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/EvaluationController.php b/BACKEND/Modules/Admin/app/Http/Controllers/EvaluationController.php index e893521..2023d29 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/EvaluationController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/EvaluationController.php @@ -30,12 +30,17 @@ class EvaluationController extends Controller ]); $userEmail = User::findOrFail($request->input('userID'))->email; - - $projects = $this->jiraService->getAllProjects(); - $startDate = $request->input('fromDate'); $endDate = $request->input('toDate'); + $projectsData = self::getProjectReviewByParams($startDate, $endDate, $userEmail); + // Trả về kết quả + return AbstractController::ResultSuccess($projectsData); + } + + public function getProjectReviewByParams($startDate, $endDate, $userEmail) + { + $projects = $this->jiraService->getAllProjects(); $userCriterias = UserCriteria::with([ 'sprint' => function ($query) use ($startDate, $endDate) { if ($startDate && $endDate) { @@ -58,8 +63,6 @@ class EvaluationController extends Controller } }) ->get(); - // dd($userCriterias); - // Xử lý dữ liệu thành cấu trúc mong muốn $projectsData = $userCriterias->groupBy('sprint.project_id')->map(function ($userCriteriasByProject, $projectId) use ($projects) { $result = self::getProjectById($projects, $projectId); return [ @@ -82,11 +85,11 @@ class EvaluationController extends Controller })->values() ]; })->values(); - - // Trả về kết quả - return AbstractController::ResultSuccess($projectsData); + return $projectsData; } + + public function getProjectById($projects, $inputId) { $filteredProjects = array_filter($projects, function ($project) use ($inputId) { @@ -145,49 +148,10 @@ class EvaluationController extends Controller // Query User $user = User::findOrFail($request->input('userID')); $userEmail = $user->email; - - // Query User Criteria - $query = UserCriteria::where('user_email', $userEmail); - - if ($request->filled('fromDate')) { - $fromDate = Carbon::parse($request->input('fromDate')); - $query->where('created_at', '>=', $fromDate); - } - - if ($request->filled('toDate')) { - $toDate = Carbon::parse($request->input('toDate')); - $query->where('created_at', '<=', $toDate); - } - - $userCriterias = $query->with(['sprint', 'criteria'])->get(); - - - // Structure projects data - $projects = $this->jiraService->getAllProjects(); - - $projectsData = $userCriterias->groupBy('sprint.project_id')->map(function ($userCriteriasByProject, $projectId) use ($projects) { - $result = self::getProjectById($projects, $projectId); - - return [ - 'name' => $result['name'], - 'sprints' => $userCriteriasByProject->groupBy('sprint.id')->map(function ($userCriteriasBySprint) { - $sprint = $userCriteriasBySprint->first()->sprint; - return [ - 'name' => $sprint->name, - 'criterias' => $userCriteriasBySprint->map(function ($userCriteria) { - $criteria = $userCriteria->criteria; - return [ - 'criteria' => $criteria->name, - 'note' => $userCriteria->note ?? '', - 'createdBy' => $userCriteria->created_by ?? '', - 'point' => $userCriteria->point ?? '', - ]; - }) - ]; - })->values() - ]; - })->values(); - + $startDate = $request->input('fromDate'); + $endDate = $request->input('toDate'); + $projectsData = self::getProjectReviewByParams($startDate, $endDate, $userEmail); + $technicalData = TechnicalController::getDataTechnicalsByUserId($request->input('userID')); // Generate Word document $phpWord = new PhpWord(); $phpWord->setDefaultFontName('Times New Roman'); @@ -221,6 +185,7 @@ class EvaluationController extends Controller 'spaceAfter' => 400, ]); + //ProjectsData foreach ($projectsData as $project) { $section->addText("Project: {$project['name']}", ['bold' => true, 'size' => 14, 'color' => '000080']); @@ -234,17 +199,17 @@ class EvaluationController extends Controller ]); $table->addRow(); - $table->addCell(2000)->addText('Criteria', ['bold' => true]); - $table->addCell(2000)->addText('Note', ['bold' => true]); - $table->addCell(2000)->addText('Created By', ['bold' => true]); - $table->addCell(2000)->addText('Points', ['bold' => true]); + $table->addCell(2500)->addText('Criteria', ['bold' => true]); + $table->addCell(2500)->addText('Note', ['bold' => true]); + $table->addCell(2500)->addText('Created By', ['bold' => true]); + $table->addCell(2500)->addText('Point', ['bold' => true]); foreach ($sprint['criterias'] as $criteria) { $table->addRow(); - $table->addCell(2000)->addText($criteria['criteria']); - $table->addCell(2000)->addText($criteria['note']); - $table->addCell(2000)->addText($criteria['createdBy']); - $table->addCell(2000)->addText($criteria['point']); + $table->addCell(2500)->addText($criteria['criteria']); + $table->addCell(2500)->addText($criteria['note']); + $table->addCell(2500)->addText($criteria['createdBy']); + $table->addCell(2500)->addText($criteria['point']); } $section->addText(' ', [], [ @@ -256,6 +221,36 @@ class EvaluationController extends Controller 'spaceAfter' => 600, ]); } + if ($technicalData) + $section->addPageBreak(); + //Technical + $section->addText("Technicals", ['bold' => true, 'size' => 14, 'color' => '000080'], [ + 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER + ]); + $table = $section->addTable([ + 'borderColor' => '000000', + 'borderSize' => 6, + 'cellMargin' => 80, + ]); + $table->addRow(); + $table->addCell(2500)->addText('Level', ['bold' => true]); + $table->addCell(2500)->addText('Name', ['bold' => true]); + $table->addCell(2500)->addText('Point', ['bold' => true]); + $table->addCell(2500)->addText('Last Update', ['bold' => true]); + + foreach ($technicalData as $technical) { + $updated_at = $technical['updated_at'] ? Carbon::parse($technical['updated_at'])->format('d/m/Y H:i:s') : null; + $table->addRow(); + $table->addCell(2500)->addText($technical['level']); + $table->addCell(2500)->addText($technical['name']); + $table->addCell(2500)->addText($technical['point']); + $table->addCell(2500)->addText($updated_at); + } + + $section->addText(' ', [], [ + 'spaceAfter' => 600, + ]); + $tempFile = tempnam(sys_get_temp_dir(), 'word'); $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007'); diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php index 68ac93d..46a6f79 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php @@ -83,13 +83,86 @@ class TechnicalController extends Controller } public function getTechnicalsByUserId($userId) + { + $technicalData = self::getDataTechnicalsByUserId($userId); + return AbstractController::ResultSuccess($technicalData); + + // // Lấy tất cả các technical + // $allTechnicals = Technical::all(); + + // if ($technicals->isEmpty() && $allTechnicals->isEmpty()) { + // return AbstractController::ResultError("No technicals found."); + // } + + // // Chuẩn bị dữ liệu để trả về + // $technicalData = $allTechnicals->map(function ($technical) use ($technicals) { + // // Tìm kiếm kỹ thuật từ bảng technical_users + // $technicalUser = $technicals->firstWhere('technical_id', $technical->id); + + // return [ + // 'id' => $technical->id, + // 'name' => $technical->name, + // 'level' => $technical->level, + // 'point' => $technicalUser ? $technicalUser->point : 0, // Nếu không tồn tại, điểm mặc định là 0 + // 'updated_at' => $technicalUser ? $technicalUser->updated_at : null // Nếu không tồn tại, updated_at là null + // ]; + // }); + // $sortedTechnicalData = $technicalData->sortByDesc('point')->values(); // values() để giữ lại chỉ số + + + // return AbstractController::ResultSuccess($sortedTechnicalData); + } + + public static function getDataTechnicalsByUserId($userId) { $technicals = TechnicalUser::with('technical') ->where('user_id', $userId) + ->where('point', '>', 0) ->orderBy('point', 'desc') ->get(); + if ($technicals->isEmpty()) { + return AbstractController::ResultError("No technicals found for this user."); + } + + // Chuẩn bị dữ liệu để trả về + $technicalData = $technicals->map(function ($technicalUser) { + return [ + 'id' => $technicalUser->technical->id, + 'name' => $technicalUser->technical->name, + 'level' => $technicalUser->technical->level, + 'point' => $technicalUser->point, + 'updated_at' => $technicalUser->updated_at + ]; + }); + return $technicalData; + } + + + public function getTechnicalsOfUser() + { + $userInfo = auth('admins')->user(); + $userId = $userInfo->id; + $technicals = TechnicalUser::with('technical') + ->where('user_id', $userId) + ->get(); + + // if ($technicals->isEmpty()) { + // return AbstractController::ResultError("No technicals found for this user."); + // } + + // // Chuẩn bị dữ liệu để trả về + // $technicalData = $technicals->map(function ($technicalUser) { + // return [ + // 'id' => $technicalUser->technical->id, + // 'name' => $technicalUser->technical->name, + // 'level' => $technicalUser->technical->level, + // 'point' => $technicalUser->point, + // 'updated_at' => $technicalUser->updated_at + // ]; + // }); + // return AbstractController::ResultSuccess($technicalData); + - // Lấy tất cả các technical $allTechnicals = Technical::all(); if ($technicals->isEmpty() && $allTechnicals->isEmpty()) { @@ -115,32 +188,6 @@ class TechnicalController extends Controller return AbstractController::ResultSuccess($sortedTechnicalData); } - - public function getTechnicalsOfUser() - { - $userInfo = auth('admins')->user(); - $userId = $userInfo->id; - $technicals = TechnicalUser::with('technical') - ->where('user_id', $userId) - ->get(); - - if ($technicals->isEmpty()) { - return AbstractController::ResultError("No technicals found for this user."); - } - - // Chuẩn bị dữ liệu để trả về - $technicalData = $technicals->map(function ($technicalUser) { - return [ - 'id' => $technicalUser->technical->id, - 'name' => $technicalUser->technical->name, - 'level' => $technicalUser->technical->level, - 'point' => $technicalUser->point, - 'updated_at' => $technicalUser->updated_at - ]; - }); - return AbstractController::ResultSuccess($technicalData); - } - public function getListUserByTechnicalId($technicalId) { $users = TechnicalUser::with('user') diff --git a/FRONTEND/src/pages/StaffEvaluation/StaffEvaluation.tsx b/FRONTEND/src/pages/StaffEvaluation/StaffEvaluation.tsx index 7385685..996ae61 100644 --- a/FRONTEND/src/pages/StaffEvaluation/StaffEvaluation.tsx +++ b/FRONTEND/src/pages/StaffEvaluation/StaffEvaluation.tsx @@ -81,11 +81,18 @@ const StaffEvaluation = () => { return `${year}${month}${day}${hours}${minutes}${seconds}` } - const downloadFile = async () => { + const downloadFile = async (filterSearch: Filter) => { try { const params = { - userID: filter.userID, + userID: filterSearch.userID ?? '', + fromDate: filterSearch.fromDate + ? moment(filterSearch.fromDate).format('YYYY-MM-DD') + : null, + toDate: filterSearch.toDate + ? moment(filterSearch.toDate).format('YYYY-MM-DD') + : null, } + const res = await getDownloadFile(evaluation, params) if (res.status) { @@ -312,7 +319,7 @@ const StaffEvaluation = () => {