first commit
This commit is contained in:
172
app/Http/Controllers/CustomerController.php
Normal file
172
app/Http/Controllers/CustomerController.php
Normal file
@ -0,0 +1,172 @@
|
||||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user