ManagementSystem/BACKEND/Modules/Admin/app/Http/Controllers/CriteriasController.php

313 lines
12 KiB
PHP

<?php
namespace Modules\Admin\app\Http\Controllers;
use App\Helper\Cache\UserJiraCacheHelper;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\JiraService;
use App\Traits\AnalyzeData;
use App\Traits\HasFilterRequest;
use App\Traits\HasOrderByRequest;
use App\Traits\HasSearchRequest;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Modules\Admin\app\Models\Criteria;
use Modules\Admin\app\Models\Sprint;
use Modules\Admin\app\Models\SprintCriteria;
use Modules\Admin\app\Models\UserCriteria;
class CriteriasController extends Controller
{
use HasOrderByRequest;
use HasFilterRequest;
use HasSearchRequest;
use AnalyzeData;
protected $jiraService;
public function __construct(JiraService $jiraService)
{
$this->jiraService = $jiraService;
}
public function getAllUserJira()
{
$all_users = User::all();
$users = $this->jiraService->getUsersByEmails($all_users);
return $users;
}
/**
* Get all criterias of a sprint
*
* @param int $sprintId The id of the sprint
* @return \Illuminate\Database\Eloquent\Collection|null A collection of Criteria models or null if the sprint is not found
*/
public function getCriteriasForSprint($sprintId)
{
$userInfo = auth('admins')->user();
$sprint = Sprint::with('criterias')->find($sprintId);
if (!$sprint) {
// $allUser = self::getAllUserJira();
$allUser = UserJiraCacheHelper::getCacheSetting();
$issues = $this->jiraService->getAllIssueByIdSprint($sprintId);
// Collect unique assignees
$uniqueUsers = [];
if ($issues) {
$issues = $issues["issues"];
foreach ($issues as $issue) {
$assignee = $issue["fields"]["assignee"];
if ($assignee && !in_array($assignee["accountId"], $uniqueUsers)) {
$uniqueUsers[] = $assignee["accountId"];
}
}
}
// Filter users based on unique assignees
$filteredObjects = array_filter($allUser, function ($user) use ($uniqueUsers) {
// return in_array($user[0]['accountId'], $uniqueUsers);
return in_array($user[0]->accountId, $uniqueUsers);
});
// Map filtered users to desired format
$arrayUsers = array_map(function ($item) {
// return [
// 'accountId' => $item[0]['accountId'],
// 'emailAddress' => $item[0]['emailAddress'],
// 'displayName' => $item[0]['displayName'],
// ];
return [
'accountId' => $item[0]->accountId,
'emailAddress' => $item[0]->emailAddress,
'displayName' => $item[0]->displayName,
];
}, $filteredObjects);
// Get criteria for sprint and member
$criteriasSprint = Criteria::where('type', "SPRINT")->get()->toArray();
$members = Criteria::where('type', "MEMBER")->get()->toArray();
// Merge user information with criteria
$result = [];
foreach ($arrayUsers as $user) {
foreach ($members as $member) {
$result[] = array_merge($user, $member);
}
}
// Map result to final format
$users = array_map(function ($item) use ($userInfo) {
return [
"user_id" => $item['accountId'],
"user" => $item['displayName'],
"user_email" => $item['emailAddress'],
"criteria_id" => $item['id'],
"point" => "",
"note" => "",
"created_by" => $userInfo->name,
"name" => $item['name'],
"description" => $item['description'],
"criteria_description" => $item['description'],
];
}, $result);
$criterias = array_map(function ($item) {
$item["expect"] = "";
$item["actual"] = "";
$item["note"] = "";
$item["point"] = "";
return $item;
}, $criteriasSprint);
$data = [
"criterias" => $criterias,
"users" => $users
];
} else {
$users = $sprint->users()->get();
// echo json_encode($sprint);
// dd();
$criterias = array_map(function ($item) {
$item["expect"] = $item["pivot"]["expect_result"];
$item["actual"] = $item["pivot"]["actual_result"];
$item["note"] = $item["pivot"]["note"];
$item["point"] = $item["pivot"]["point"];
unset($item["pivot"]); // Use unset() instead of delete
return $item;
}, $sprint->criterias->toArray());
$data = [
"id" => $sprint->id,
"name" => $sprint->name,
"point" => $sprint->point,
"project_id" => $sprint->project_id,
"start_date" => $sprint->start_date,
"end_date" => $sprint->end_date,
"complete_date" => $sprint->complete_date,
"criterias" => $criterias,
"users" => $users
];
}
return AbstractController::ResultSuccess($data);
}
public function convertDataReponse($criterias)
{
$data = [];
foreach ($criterias as $key => $criteria) {
$data[$key]["criteria_name"] = $criteria->name;
$data[$key]["description"] = $criteria->description;
$data[$key]["type"] = $criteria->type;
foreach ($criteria->users as $keyChild => $user) {
$dataChild[$keyChild]["user_id"] = $user->id;
$dataChild[$keyChild]["user_name"] = $user->name;
$dataChild[$keyChild]["email"] = $user->email;
$dataChild[$keyChild]["point"] = $user->pivot->point;
$dataChild[$keyChild]["note"] = $user->pivot->note;
$dataChild[$keyChild]["sprint_id"] = $user->pivot->sprint_id;
}
$data[$key]['users'] = $dataChild;
}
return $data;
}
/**
* Get all criterias of a user
*
* @param int $userId The id of the user
* @return \Illuminate\Database\Eloquent\Collection|null A collection of Criteria models or null if the user is not found
*/
public function getCriteriasForUser($userId)
{
$criterias = Criteria::whereHas('users', function ($query) use ($userId) {
$query->where('user_id', $userId);
})->with(['users' => function ($query) use ($userId) {
$query->where('user_id', $userId);
}])->get();
$data = self::convertDataReponse($criterias);
return AbstractController::ResultSuccess($data);
}
/**
* Get all criterias of a user for a sprint
*
* @param int $userId The id of the user
* @param int $sprintId The id of the sprint
* @return \Illuminate\Database\Eloquent\Collection|null A collection of Criteria models or null if the user or sprint is not found
*/
public function getCriteriasForUserBySprint($userId, $sprintId)
{
$criterias = Criteria::whereHas('users', function ($query) use ($userId, $sprintId) {
$query->where('user_id', $userId)->where('sprint_id', $sprintId);
})->with(['users' => function ($query) use ($userId, $sprintId) {
$query->where('user_id', $userId)->where('sprint_id', $sprintId);
}])->get();
$data = self::convertDataReponse($criterias);
return AbstractController::ResultSuccess($data);
}
/**
* Get all criterias
*
* @return \Illuminate\Database\Eloquent\Collection A collection of Criteria models
*/
public function getAllCriterias(Request $request)
{
if ($request->type) {
$responseData = Criteria::where('type', $request->type)->get();
} else {
$responseData = Criteria::all();
}
return AbstractController::ResultSuccess($responseData);
}
public function updateCriteriasForSprint($sprintId, Request $request)
{
$userInfo = auth('admins')->user();
// Validate dữ liệu đầu vào
$validated = $request->validate([
'name' => 'required|string',
'project_id' => 'required|integer',
'criterias' => 'required|array',
'users' => 'required|array',
]);
$sprintId = (int)$sprintId;
// Sử dụng transaction để đảm bảo tính toàn vẹn dữ liệu
DB::beginTransaction();
try {
// Kiểm tra xem Sprint có tồn tại không
$sprint = Sprint::find($sprintId);
if ($sprint) {
// Nếu tồn tại, xóa các liên kết hiện tại
$sprint->sprintsCriterias()->delete();
$sprint->usersCriterias()->delete();
// Cập nhật thông tin Sprint nếu cần
$sprint->update([
'name' => $validated['name'],
'project_id' => $validated['project_id'],
'point' => $request->finalPoint ?? "",
'start_date' => $request->start_date,
'end_date' => $request->end_date,
'complete_date' => $request->complete_date,
]);
} else {
// Nếu không tồn tại, tạo mới Sprint
$sprint = Sprint::create([
'id' => $sprintId,
'name' => $validated['name'],
'project_id' => $validated['project_id'],
'point' => $request->finalPoint ?? "",
'start_date' => $request->start_date,
'end_date' => $request->end_date,
'complete_date' => $request->complete_date,
]);
}
// Thêm lại các liên kết sprints_criterias
foreach ($validated['criterias'] as $criteria) {
SprintCriteria::create([
'sprint_id' => $sprintId,
'criteria_id' => $criteria['id'],
'point' => $criteria['point'] ?? "",
'expect_result' => $criteria['expect'] ?? "",
'actual_result' => $criteria['actual'] ?? "",
'note' => $criteria['note'] ?? "",
'created_by' => $userInfo->name ?? "",
]);
}
// Thêm lại các liên kết users_criterias
foreach ($validated['users'] as $userCriteria) {
UserCriteria::create([
'user_email' => $userCriteria['user_email'],
'criteria_id' => $userCriteria['criteria_id'],
'sprint_id' => $sprintId,
'point' => $userCriteria['point'] ?? "",
'note' => $userCriteria['note'] ?? "",
'created_by' => $userCriteria['created_by'] ?? "",
]);
}
DB::commit();
return AbstractController::ResultSuccess("Update sprint success");
} catch (\Exception $e) {
DB::rollBack();
return AbstractController::ResultError("Update sprint failed: " . $e->getMessage());
}
}
}