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

172 lines
4.9 KiB
PHP

<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\Currency;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\File;
use Laravel\Nova\Fields\MorphMany;
use Laravel\Nova\Http\Requests\NovaRequest;
use App\Nova\Metrics\VehiclesPerStatus;
use App\Nova\Metrics\RepairsPerMonth;
use App\Nova\Metrics\AverageRepairCost;
use App\Nova\Metrics\PartsInventoryValue;
use App\Nova\Actions\GenerateRepairReport;
use App\Nova\Actions\CompleteRepair;
use App\Nova\Actions\AssignTechnicians;
use App\Nova\Actions\OrderParts;
use App\Nova\Filters\VehicleStatusFilter;
use App\Nova\Filters\RepairStatusFilter;
use App\Nova\Filters\TechnicianSpecializationFilter;
use App\Nova\Lenses\VehiclesDueForMaintenance;
use App\Nova\Lenses\LowInventoryParts;
class RepairOrder extends Resource
{
public static string $model = \App\Models\RepairOrder::class;
public static $title = 'order_number';
public static $search = ['order_number', 'issue_description', 'diagnosis', 'resolution'];
public function fields(NovaRequest $request)
{
return [
ID::make()->sortable(),
Text::make('Order Number')
->sortable()
->rules('required')
->creationRules('unique:repair_orders,order_number')
->updateRules('unique:repair_orders,order_number,{{resourceId}}'),
BelongsTo::make('Vehicle')
->searchable()
->rules('required'),
Badge::make('Status')
->map([
'pending' => 'info',
'in_progress' => 'warning',
'parts_ordered' => 'info',
'on_hold' => 'danger',
'completed' => 'success',
'cancelled' => 'danger',
])
->sortable(),
Badge::make('Priority')
->map([
'low' => 'info',
'medium' => 'warning',
'high' => 'danger',
'critical' => 'danger',
])
->sortable(),
DateTime::make('Reported At')
->sortable()
->rules('required'),
DateTime::make('Assigned At')
->sortable()
->hideFromIndex()
->nullable(),
DateTime::make('Started At')
->sortable()
->hideFromIndex()
->nullable(),
DateTime::make('Completed At')
->sortable()
->nullable(),
Textarea::make('Issue Description')
->rules('required')
->alwaysShow(),
Textarea::make('Diagnosis')
->hideFromIndex()
->alwaysShow()
->nullable(),
Textarea::make('Resolution')
->hideFromIndex()
->alwaysShow()
->nullable(),
Number::make('Mileage At Repair')
->rules('required', 'numeric', 'min:0'),
Number::make('Labor Hours')
->rules('nullable', 'numeric', 'min:0')
->hideFromIndex(),
Currency::make('Labor Cost')
->rules('nullable', 'numeric', 'min:0'),
Currency::make('Parts Cost')
->rules('nullable', 'numeric', 'min:0'),
Currency::make('Total Cost')
->rules('nullable', 'numeric', 'min:0')
->sortable(),
BelongsToMany::make('Technicians')
->fields(function () {
return [
Boolean::make('Is Lead'),
];
}),
BelongsToMany::make('Parts')
->fields(function () {
return [
Number::make('Quantity Used')
->rules('required', 'min:1'),
Currency::make('Unit Cost')
->rules('required'),
];
}),
HasMany::make('Repair Tasks'),
MorphMany::make('Documents'),
];
}
public function cards(NovaRequest $request)
{
return [
new RepairsPerMonth,
new AverageRepairCost,
];
}
public function filters(NovaRequest $request)
{
return [
new RepairStatusFilter,
];
}
public function actions(NovaRequest $request)
{
return [
new AssignTechnicians,
new CompleteRepair,
new GenerateRepairReport,
];
}
}