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' => 'کمپین حذف شد']); } }