has('date')) { $query->whereDate('date', $request->date); } $routes = $query->orderBy('date', 'desc')->get(); $formattedRoutes = $routes->map(function ($route) { return [ 'id' => (string) $route->id, 'salesId' => $route->user->employee_id ?? 'UNKNOWN', 'salesName' => $route->user->name ?? 'Unknown', 'date' => $route->date->format('Y-m-d'), 'waypoints' => $route->waypoints->map(function ($wp) { return [ 'lat' => (float) $wp->latitude, 'lng' => (float) $wp->longitude, 'time' => Carbon::parse($wp->recorded_at)->format('H:i'), 'type' => $wp->type, ]; }), ]; }); return response()->json([ 'success' => true, 'data' => $formattedRoutes ]); } /** * POST /api/v1/routes/waypoints * Add waypoint to active route */ public function storeWaypoint(Request $request): JsonResponse { $request->validate([ 'lat' => 'required|numeric', 'lng' => 'required|numeric', 'employee_id' => 'required|string', // Required to identify who is moving 'type' => 'nullable|in:gps,visit,checkin,checkout' ]); // Find user $user = User::where('employee_id', $request->employee_id)->first(); if (!$user) { return response()->json(['success' => false, 'error' => 'User (Employee) not found'], 404); } $today = Carbon::today(); // Get or create today's route $route = SalesRoute::firstOrCreate( ['user_id' => $user->id, 'date' => $today], ['status' => 'active', 'started_at' => now()] ); // Create waypoint $waypoint = Waypoint::create([ 'sales_route_id' => $route->id, 'type' => $request->type ?? 'gps', 'latitude' => $request->lat, 'longitude' => $request->lng, 'recorded_at' => now(), 'location_name' => 'API Integration', ]); return response()->json([ 'success' => true, 'message' => 'Waypoint recorded successfully', 'data' => [ 'id' => $waypoint->id, 'lat' => $waypoint->latitude, 'lng' => $waypoint->longitude, 'recorded_at' => $waypoint->recorded_at ] ]); } }