173 lines
5.1 KiB
PHP
173 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Customer;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
class CustomerController extends Controller
|
|
{
|
|
/**
|
|
* GET /api/customers
|
|
* List all customers with searching/filtering
|
|
*/
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$query = Customer::with('sales:id,employee_id,name,color');
|
|
|
|
// Search by name, owner, phone, city
|
|
if ($request->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(),
|
|
];
|
|
}
|
|
}
|