workshop_lara_nova/app/Nova/Actions/CompleteRepair.php
2025-03-22 10:19:15 +00:00

67 lines
1.9 KiB
PHP

<?php
namespace App\Nova\Actions;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Collection;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Currency;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Models\RepairOrder;
use App\Models\Vehicle;
use Carbon\Carbon;
class CompleteRepair extends Action
{
use InteractsWithQueue, Queueable;
public $name = 'Mark as Completed';
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $model) {
if (!in_array($model->status, ['completed', 'cancelled'])) {
$model->status = 'completed';
$model->completed_at = Carbon::now();
$model->resolution = $fields->resolution;
$model->calculateCosts();
$model->save();
// Update vehicle status
$vehicle = $model->vehicle;
$vehicle->status = 'active';
$vehicle->mileage = $fields->final_mileage;
$vehicle->save();
return Action::message('Repair has been marked as completed.');
}
}
return Action::danger('Cannot complete repairs that are already completed or cancelled.');
}
public function fields(NovaRequest $request): array
{
return [
Textarea::make('Resolution')
->rules('required')
->help('Describe what was done to resolve the issue'),
Number::make('Final Mileage')
->rules('required', 'numeric', 'min:0')
->help('Update the current mileage of the vehicle'),
];
}
}