117 خطوط
4.0 KiB
PHP
117 خطوط
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Campaign;
|
|
use App\Services\ActivityLogger;
|
|
use App\Support\AccessControl;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Gate;
|
|
|
|
class CampaignController extends Controller
|
|
{
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$query = Campaign::withCount('leads')->with('assignedAgents:id,name', 'assignedSupervisors:id,name');
|
|
Gate::authorize('viewAny', Campaign::class);
|
|
AccessControl::scopeCampaigns($query, auth()->user());
|
|
|
|
if ($request->search) {
|
|
$query->where('name', 'like', "%{$request->search}%");
|
|
}
|
|
|
|
if ($request->status) {
|
|
$query->where('status', $request->status);
|
|
}
|
|
|
|
return response()->json($query->orderBy('created_at', 'desc')->paginate($request->per_page ?? 15));
|
|
}
|
|
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
Gate::authorize('create', Campaign::class);
|
|
|
|
$validated = $request->validate([
|
|
'name' => 'required|string|max:255',
|
|
'description' => 'nullable|string',
|
|
'product_service' => 'nullable|string|max:255',
|
|
'start_date' => 'nullable|date',
|
|
'end_date' => 'nullable|date|after_or_equal:start_date',
|
|
'target' => 'nullable|integer|min:0',
|
|
'status' => 'nullable|string|in:draft,active,paused,completed,archived',
|
|
'agent_ids' => 'nullable|array',
|
|
'agent_ids.*' => 'exists:users,id',
|
|
'supervisor_ids' => 'nullable|array',
|
|
'supervisor_ids.*' => 'exists:users,id',
|
|
]);
|
|
|
|
$campaign = Campaign::create($validated);
|
|
|
|
if ($request->agent_ids) {
|
|
$campaign->assignedAgents()->sync($request->agent_ids);
|
|
}
|
|
if ($request->supervisor_ids) {
|
|
$campaign->assignedSupervisors()->sync($request->supervisor_ids);
|
|
}
|
|
|
|
ActivityLogger::log('campaign_created', "Campaign {$campaign->name} created", $campaign);
|
|
|
|
return response()->json($campaign->load('assignedAgents', 'assignedSupervisors'), 201);
|
|
}
|
|
|
|
public function show(Campaign $campaign): JsonResponse
|
|
{
|
|
Gate::authorize('view', $campaign);
|
|
|
|
return response()->json(
|
|
$campaign->load([
|
|
'assignedAgents', 'assignedSupervisors', 'salesScript',
|
|
'leads' => fn($q) => $q->with('leadStatus'),
|
|
])
|
|
);
|
|
}
|
|
|
|
public function update(Request $request, Campaign $campaign): JsonResponse
|
|
{
|
|
Gate::authorize('update', $campaign);
|
|
|
|
$validated = $request->validate([
|
|
'name' => 'sometimes|string|max:255',
|
|
'description' => 'nullable|string',
|
|
'product_service' => 'nullable|string|max:255',
|
|
'start_date' => 'nullable|date',
|
|
'end_date' => 'nullable|date|after_or_equal:start_date',
|
|
'target' => 'nullable|integer|min:0',
|
|
'status' => 'nullable|string|in:draft,active,paused,completed,archived',
|
|
'agent_ids' => 'nullable|array',
|
|
'agent_ids.*' => 'exists:users,id',
|
|
'supervisor_ids' => 'nullable|array',
|
|
'supervisor_ids.*' => 'exists:users,id',
|
|
]);
|
|
|
|
$campaign->update($validated);
|
|
|
|
if ($request->has('agent_ids')) {
|
|
$campaign->assignedAgents()->sync($request->agent_ids);
|
|
}
|
|
if ($request->has('supervisor_ids')) {
|
|
$campaign->assignedSupervisors()->sync($request->supervisor_ids);
|
|
}
|
|
|
|
ActivityLogger::log('campaign_updated', "Campaign {$campaign->name} updated", $campaign);
|
|
|
|
return response()->json($campaign->load('assignedAgents', 'assignedSupervisors'));
|
|
}
|
|
|
|
public function destroy(Campaign $campaign): JsonResponse
|
|
{
|
|
Gate::authorize('delete', $campaign);
|
|
|
|
$campaign->delete();
|
|
ActivityLogger::log('campaign_deleted', "Campaign {$campaign->name} deleted");
|
|
return response()->json(['message' => 'کمپین حذف شد']);
|
|
}
|
|
}
|