Files
Verde-Web/app/Http/Requests/Route/UpdateRouteRequest.php
admin de77503cdd feat(backend): complete Module 8 (routes)
routes + route_stops tables. Admin CRUD with stops submitted as an
ordered array (drag-reorder is client-side; sequence is array-index).
Cloning produces an inactive copy with -COPY-XXXX suffix. RouteCalculator
recomputes total_distance_km via ST_Distance_Sphere across stop
coordinates + dumpsite, and estimated_duration_minutes from dwell time
+ travel time at config-driven avg speed (default 25 km/h).
default_team_id stays nullable bigint until Module 9 adds the FK.

139 feature tests passing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 02:25:04 +08:00

37 lines
1.3 KiB
PHP

<?php
namespace App\Http\Requests\Route;
use App\Models\Route;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateRouteRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
$id = $this->route('route')?->id;
return [
'name' => ['sometimes', 'required', 'string', 'max:191'],
'code' => [
'sometimes', 'required', 'string', 'max:32',
Rule::unique('routes', 'code')->whereNull('deleted_at')->ignore($id),
],
'area_id' => ['sometimes', 'nullable', 'integer', 'exists:service_areas,id'],
'default_dumpsite_id' => ['sometimes', 'nullable', 'integer', 'exists:dumpsites,id'],
'default_team_id' => ['sometimes', 'nullable', 'integer'],
'status' => ['sometimes', Rule::in([Route::STATUS_ACTIVE, Route::STATUS_INACTIVE])],
'notes' => ['sometimes', 'nullable', 'string', 'max:1000'],
'stops' => ['sometimes', 'array', 'min:1'],
'stops.*.drop_off_point_id' => ['required_with:stops', 'integer', 'exists:drop_off_points,id'],
'stops.*.estimated_duration_minutes' => ['nullable', 'integer', 'min:1', 'max:240'],
];
}
}