78 خطوط
3.0 KiB
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);
|
|
}
|
|
}
|