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