has('q') && !empty($request->q)) { $search = $request->q; $query->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('owner_name', 'like', "%{$search}%") ->orWhere('city', 'like', "%{$search}%") ->orWhere('phone', 'like', "%{$search}%"); }); } // Filter by sales PIC if ($request->has('salesId')) { $query->whereHas('sales', function ($q) use ($request) { $q->where('employee_id', $request->salesId); }); } $customers = $query->orderBy('name', 'asc')->get(); return response()->json([ 'success' => true, 'customers' => $customers->map(fn($c) => $this->formatCustomer($c)), ]); } /** * POST /api/customers * Create new customer (Backend & Mobile Prospect) */ public function store(Request $request): JsonResponse { $request->validate([ 'name' => 'required|string|max:255', 'latitude' => 'nullable|numeric', 'longitude' => 'nullable|numeric', ]); $picSalesId = null; if ($request->has('pic_sales_id')) { // backend sends ID $picSalesId = $request->pic_sales_id; } elseif ($request->has('user_id')) { // mobile sends employee_id $user = User::where('employee_id', $request->user_id)->first(); if ($user) $picSalesId = $user->id; } $customer = Customer::create([ 'name' => $request->name, 'address' => $request->address, 'owner_name' => $request->owner_name, 'phone' => $request->phone, 'latitude' => $request->latitude, 'longitude' => $request->longitude, 'city' => $request->city, 'pic_sales_id' => $picSalesId, ]); return response()->json([ 'success' => true, 'data' => $this->formatCustomer($customer), 'message' => 'Customer created successfully', ], 201); } /** * GET /api/customers/{id} */ public function show(string $id): JsonResponse { $customer = Customer::with('sales')->find($id); if (!$customer) { return response()->json(['success' => false, 'error' => 'Customer not found'], 404); } return response()->json([ 'success' => true, 'customer' => $this->formatCustomer($customer), ]); } /** * PUT /api/customers/{id} */ public function update(Request $request, string $id): JsonResponse { $customer = Customer::find($id); if (!$customer) { return response()->json(['success' => false, 'error' => 'Customer not found'], 404); } $request->validate([ 'name' => 'sometimes|required|string|max:255', 'latitude' => 'nullable|numeric', 'longitude' => 'nullable|numeric', ]); $data = $request->all(); // Handle PIC Sales update if ($request->has('pic_sales_id')) { $data['pic_sales_id'] = $request->pic_sales_id; } $customer->update($data); return response()->json([ 'success' => true, 'data' => $this->formatCustomer($customer), 'message' => 'Customer updated successfully', ]); } /** * DELETE /api/customers/{id} */ public function destroy(string $id): JsonResponse { $customer = Customer::find($id); if (!$customer) { return response()->json(['success' => false, 'error' => 'Customer not found'], 404); } $customer->delete(); return response()->json([ 'success' => true, 'message' => 'Customer deleted successfully', ]); } // Helper format private function formatCustomer($c) { return [ 'id' => (string) $c->id, 'name' => $c->name, 'address' => $c->address, 'owner_name' => $c->owner_name, 'phone' => $c->phone, 'latitude' => (float) $c->latitude, 'longitude' => (float) $c->longitude, 'city' => $c->city, 'pic_sales_id' => $c->pic_sales_id ? (string) $c->pic_sales_id : null, 'pic_sales_name' => $c->sales ? $c->sales->name : null, 'pic_sales_employee_id' => $c->sales ? $c->sales->employee_id : null, 'created_at' => $c->created_at->toISOString(), ]; } }