diff --git a/app/Events/TruckLoadBroadcast.php b/app/Events/TruckLoadBroadcast.php new file mode 100644 index 0000000..a73b065 --- /dev/null +++ b/app/Events/TruckLoadBroadcast.php @@ -0,0 +1,44 @@ +trip; + $capacityKg = $trip->truck?->capacity_kg; + $currentLoad = $trip->current_load_kg ?? 0; + + return [ + 'trip_id' => $trip->uuid, + 'team_id' => $trip->team_id, + 'truck_id' => $trip->truck?->uuid, + 'current_load_kg' => $trip->current_load_kg, + 'capacity_kg' => $capacityKg, + 'is_full' => $capacityKg && $currentLoad >= $capacityKg, + 'updated_at' => now()->toIso8601String(), + ]; + } +} diff --git a/app/Http/Controllers/Api/V1/Driver/DriverTripController.php b/app/Http/Controllers/Api/V1/Driver/DriverTripController.php index 504cc0c..e289b09 100644 --- a/app/Http/Controllers/Api/V1/Driver/DriverTripController.php +++ b/app/Http/Controllers/Api/V1/Driver/DriverTripController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\V1\Driver; use App\Http\Controllers\Api\V1\ApiController; use App\Http\Resources\TripResource; +use App\Events\TruckLoadBroadcast; use App\Models\Trip; use App\Models\TripStop; use App\Services\Trip\TripExecutor; @@ -153,6 +154,27 @@ class DriverTripController extends ApiController return $this->ok(new TripResource($trip), 'Arrived at dumpsite'); } + public function updateLoad(Request $request, Trip $trip): JsonResponse + { + $this->authorizeDriver($request, $trip); + $data = $request->validate([ + 'current_load_kg' => ['required', 'integer', 'min:0', 'max:100000'], + ]); + + if ($trip->status !== Trip::STATUS_IN_PROGRESS) { + return $this->fail('Load can only be updated while a trip is in progress', null, 422); + } + + $trip->forceFill(['current_load_kg' => $data['current_load_kg']])->save(); + $trip->loadMissing('truck'); + + TruckLoadBroadcast::dispatch($trip); + + return $this->ok([ + 'current_load_kg' => $trip->current_load_kg, + ], 'Truck load updated'); + } + public function releaseLoad(Request $request, Trip $trip): JsonResponse { $this->authorizeDriver($request, $trip); diff --git a/app/Http/Resources/CollectionTeamResource.php b/app/Http/Resources/CollectionTeamResource.php index 5e3afc5..25ff228 100644 --- a/app/Http/Resources/CollectionTeamResource.php +++ b/app/Http/Resources/CollectionTeamResource.php @@ -30,14 +30,12 @@ class CollectionTeamResource extends JsonResource 'is_full' => $this->is_full, 'truck_is_full' => $this->whenLoaded('currentTrip', function () { $trip = $this->currentTrip; - if (! $trip) { - return false; - } - $atDumpsite = $trip->status === Trip::STATUS_AT_DUMPSITE; - $atCapacity = $this->truck?->capacity_kg > 0 - && $trip->total_load_kg >= $this->truck->capacity_kg; - - return $atDumpsite || $atCapacity; + if (! $trip) return false; + $capacity = $this->truck?->capacity_kg; + // Prefer driver's live estimate; fall back to dumpsite-scale total + $effectiveLoad = $trip->current_load_kg ?? $trip->total_load_kg ?? 0; + return ($capacity && $effectiveLoad >= $capacity) + || $trip->status === 'at_dumpsite'; }, false), 'performance_stats' => $this->getPerformanceStats(), 'current_trip' => TripResource::make($this->whenLoaded('currentTrip')), diff --git a/app/Models/Trip.php b/app/Models/Trip.php index e2f5d25..b2747ad 100644 --- a/app/Models/Trip.php +++ b/app/Models/Trip.php @@ -32,7 +32,7 @@ class Trip extends Model 'scheduled_date', 'scheduled_start_time', 'actual_start_time', 'actual_end_time', 'dumpsite_arrival_time', 'dumpsite_departure_time', - 'status', 'is_detouring', 'total_load_kg', 'notes', 'created_by_admin_id', + 'status', 'is_detouring', 'total_load_kg', 'current_load_kg', 'notes', 'created_by_admin_id', ]; protected function casts(): array @@ -44,6 +44,7 @@ class Trip extends Model 'dumpsite_arrival_time' => 'datetime', 'dumpsite_departure_time' => 'datetime', 'is_detouring' => 'boolean', + 'current_load_kg' => 'integer', ]; } diff --git a/database/migrations/2026_07_02_064118_add_current_load_kg_to_trips_table.php b/database/migrations/2026_07_02_064118_add_current_load_kg_to_trips_table.php new file mode 100644 index 0000000..c1dee91 --- /dev/null +++ b/database/migrations/2026_07_02_064118_add_current_load_kg_to_trips_table.php @@ -0,0 +1,23 @@ +unsignedInteger('current_load_kg')->nullable()->after('total_load_kg'); + }); + } + + public function down(): void + { + Schema::table('trips', function (Blueprint $table) { + $table->dropColumn('current_load_kg'); + }); + } +}; + diff --git a/resources/views/admin/teams.blade.php b/resources/views/admin/teams.blade.php index e5cdab6..975f493 100644 --- a/resources/views/admin/teams.blade.php +++ b/resources/views/admin/teams.blade.php @@ -217,7 +217,7 @@ : 0; return ` -