first commit

This commit is contained in:
furen81
2026-01-23 19:18:52 +07:00
commit 6e681c4ad3
80 changed files with 13874 additions and 0 deletions

View 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(),
];
}
}