CRM/backend/app/Http/Controllers/Api/QualityReviewController.php

78 خطوط
3.0 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\QualityReview;
use App\Services\ActivityLogger;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class QualityReviewController extends Controller
{
public function index(Request $request): JsonResponse
{
$user = auth()->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);
}
}