validate(['date_from' => 'nullable|date', 'date_to' => 'nullable|date']); $leads = Lead::query() ->with('customer:id,uuid,fullname,email') ->search($request->input('filter')) ->when($request->filled('status'), fn ($query) => $query->where('status', $request->input('status'))) ->when($request->filled('source'), fn ($query) => $query->where('source', $request->input('source'))) ->when($request->input('linked') === '1', fn ($query) => $query->whereNotNull('customer_id')) ->when($request->input('linked') === '0', fn ($query) => $query->whereNull('customer_id')) ->when($request->filled('date_from'), fn ($query) => $query->whereDate('created_at', '>=', $request->input('date_from'))) ->when($request->filled('date_to'), fn ($query) => $query->whereDate('created_at', '<=', $request->input('date_to'))) ->orderByDesc('id') ->paginate(min(max((int) $request->input('per_page', 20), 1), 100)); return response()->json([ 'error' => false, 'data' => [ 'items' => LeadResource::collection($leads->items()), 'total' => $leads->total(), 'per_page' => $leads->perPage(), 'current_page' => $leads->currentPage(), 'last_page' => $leads->lastPage(), ], ]); } public function show(string $uuid): JsonResponse { return response()->json(['error' => false, 'data' => new LeadResource($this->find($uuid)->load('customer:id,uuid,fullname,email'))]); } public function store(LeadRequest $request): JsonResponse { $lead = Lead::create($request->validated()); return response()->json(['error' => false, 'message' => 'Đã thêm khách tiềm năng.', 'data' => new LeadResource($lead->load('customer:id,uuid,fullname,email'))], 201); } public function update(string $uuid, LeadRequest $request): JsonResponse { $lead = $this->find($uuid); $lead->update($request->validated()); return response()->json(['error' => false, 'message' => 'Đã cập nhật khách tiềm năng.', 'data' => new LeadResource($lead->load('customer:id,uuid,fullname,email'))]); } public function destroy(string $uuid): JsonResponse { $this->find($uuid)->delete(); return response()->json(['error' => false, 'message' => 'Đã xoá khách tiềm năng.']); } public function bulkDestroy(Request $request): JsonResponse { $uuids = $this->bulkUuids($request); $deleted = Lead::query()->whereIn('uuid', $uuids)->delete(); return response()->json(['error' => false, 'message' => "Đã xoá {$deleted} khách tiềm năng.", 'data' => ['affected' => $deleted]]); } public function bulkStatus(Request $request): JsonResponse { $status = $request->validate(['status' => ['required', Rule::in(Lead::STATUSES)]])['status']; $updated = Lead::query()->whereIn('uuid', $this->bulkUuids($request))->update(['status' => $status, 'updated_at' => now()]); return response()->json(['error' => false, 'message' => "Đã cập nhật trạng thái cho {$updated} khách tiềm năng.", 'data' => ['affected' => $updated]]); } /** * @return array */ private function bulkUuids(Request $request): array { return $request->validate([ 'uuids' => ['required', 'array', 'min:1', 'max:500'], 'uuids.*' => ['required', 'string', 'max:36'], ])['uuids']; } private function find(string $uuid): Lead { return Lead::query()->where('uuid', $uuid)->firstOrFail(); } }