hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore']); } public function mount(): void { $this->getSchema('form')?->fill([ 'priorita' => 'Media', ]); } public function form(Schema $schema): Schema { return $schema ->statePath('data') ->components([ TextInput::make('titolo') ->label('Titolo') ->required() ->maxLength(255), Textarea::make('descrizione') ->label('Descrizione') ->required() ->rows(8), Select::make('priorita') ->label('Priorità') ->options([ 'Bassa' => 'Bassa', 'Media' => 'Media', 'Alta' => 'Alta', 'Urgente' => 'Urgente', ]) ->required(), FileUpload::make('allegati') ->label('Foto / allegati') ->helperText('Da smartphone puoi scattare una foto al momento o selezionarla dalla galleria.') ->disk('public') ->directory('ticket-allegati') ->multiple() ->preserveFilenames() ->acceptedFileTypes([ 'image/jpeg', 'image/png', 'image/webp', 'image/heic', 'image/heif', ]) ->maxFiles(8) ->maxSize(12288), ]); } public function submit(): void { $user = Auth::user(); if (! $user instanceof User) { abort(403); } $stabileId = StabileContext::resolveActiveStabileId($user); if (! $stabileId) { Notification::make() ->title('Seleziona prima uno stabile') ->danger() ->send(); return; } $state = $this->getSchema('form')?->getState() ?? []; $categoria = CategoriaTicket::query()->firstOrCreate( ['nome' => 'Supporto'], ['descrizione' => 'Richieste help, bug e supporto operativo'] ); $ticket = Ticket::create([ 'stabile_id' => $stabileId, 'aperto_da_user_id' => $user->id, 'categoria_ticket_id' => $categoria->id, 'titolo' => (string) ($state['titolo'] ?? ''), 'descrizione' => (string) ($state['descrizione'] ?? ''), 'priorita' => (string) ($state['priorita'] ?? 'Media'), 'stato' => 'Aperto', ]); $allegati = $state['allegati'] ?? []; if (is_array($allegati)) { foreach ($allegati as $path) { if (! is_string($path) || trim($path) === '') { continue; } $disk = Storage::disk('public'); $mime = $disk->exists($path) ? $disk->mimeType($path) : null; $size = $disk->exists($path) ? $disk->size($path) : null; TicketAttachment::query()->create([ 'ticket_id' => $ticket->id, 'ticket_update_id' => null, 'user_id' => $user->id, 'file_path' => $path, 'original_file_name' => basename($path), 'mime_type' => is_string($mime) ? $mime : null, 'size' => is_numeric($size) ? (int) $size : null, 'description' => 'Caricato in apertura ticket da Richiedi Help', ]); } } $this->getSchema('form')?->fill([ 'titolo' => null, 'descrizione' => null, 'priorita' => 'Media', 'allegati' => [], ]); Notification::make() ->title('Richiesta inviata') ->success() ->send(); } }