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

81 lines
2.4 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 AssignTechnicians extends Action
{
use InteractsWithQueue, Queueable;
public $name = 'Assign Technicians';
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $model) {
// Clear previous assignments if requested
if ($fields->clear_previous) {
$model->technicians()->detach();
}
// Assign selected technicians
foreach ($fields->technicians as $techId) {
// Check if already assigned
if (!$model->technicians->contains($techId)) {
$model->technicians()->attach($techId, [
'is_lead' => in_array($techId, $fields->lead_technicians) ? true : false
]);
}
}
// Update status if needed
if ($model->status === 'pending') {
$model->status = 'in_progress';
$model->assigned_at = Carbon::now();
$model->started_at = Carbon::now();
// Update vehicle status
$vehicle = $model->vehicle;
$vehicle->status = 'in_repair';
$vehicle->save();
}
$model->save();
}
return Action::message('Technicians have been assigned successfully.');
}
public function fields(NovaRequest $request): array
{
return [
BelongsToMany::make('Technicians')
->rules('required'),
BelongsToMany::make('Lead Technicians', 'technicians', 'App\Nova\Technician')
->help('Select technicians who will lead this repair'),
Boolean::make('Clear Previous Assignments', 'clear_previous')
->help('Remove all previously assigned technicians')
->default(false),
];
}
}