CRM/backend/app/Http/Controllers/Api/CampaignController.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' => 'کمپین حذف شد']);
}
}