user(); $query = QualityReview::with('call:id,lead_id,created_at', 'agent:id,name', 'reviewer:id,name'); if ($user->hasRole('agent')) { $query->where('agent_id', $user->id); } elseif ($user->hasRole('supervisor')) { $teamIds = $user->teams->pluck('id')->toArray(); $agentIds = \App\Models\Team::whereIn('id', $teamIds)->with('members')->get()->pluck('members.*.id')->flatten(); $query->whereIn('agent_id', $agentIds); } return response()->json($query->orderBy('created_at', 'desc')->paginate($request->per_page ?? 15)); } public function store(Request $request): JsonResponse { $validated = $request->validate([ 'call_id' => 'required|exists:calls,id', 'agent_id' => 'required|exists:users,id', 'greeting_score' => 'required|integer|min:0|max:100', 'product_intro_score' => 'required|integer|min:0|max:100', 'needs_discovery_score' => 'required|integer|min:0|max:100', 'objection_handling_score' => 'required|integer|min:0|max:100', 'closing_score' => 'required|integer|min:0|max:100', 'crm_accuracy_score' => 'required|integer|min:0|max:100', 'follow_up_quality_score' => 'required|integer|min:0|max:100', 'feedback' => 'nullable|string', 'tag' => 'nullable|string|max:30', ]); $validated['reviewer_id'] = auth()->id(); $validated['overall_score'] = (int) round(collect([ $validated['greeting_score'], $validated['product_intro_score'], $validated['needs_discovery_score'], $validated['objection_handling_score'], $validated['closing_score'], $validated['crm_accuracy_score'], $validated['follow_up_quality_score'], ])->avg()); $review = QualityReview::create($validated); ActivityLogger::log('quality_review_created', "Quality review for agent {$validated['agent_id']} created", $review); return response()->json($review->load('agent:id,name', 'reviewer:id,name'), 201); } public function show(QualityReview $qualityReview): JsonResponse { return response()->json($qualityReview->load('call.lead', 'agent', 'reviewer')); } public function update(Request $request, QualityReview $qualityReview): JsonResponse { $validated = $request->validate([ 'feedback' => 'nullable|string', 'tag' => 'nullable|string|max:30', 'is_shared_with_agent' => 'nullable|boolean', ]); $qualityReview->update($validated); return response()->json($qualityReview); } }