resolveSoggettoId($user); $tickets = Ticket::where('soggetto_richiedente_id', $soggettoId) ->with(['stabile', 'categoriaTicket', 'unitaImmobiliare']) ->orderBy('created_at', 'desc') ->paginate(10); return view('condomino.tickets.index', compact('tickets')); } public function create() { $user = Auth::user(); $unitaImmobiliari = $this->resolveUserUnita($user); $categorieTicket = CategoriaTicket::all(); return view('condomino.tickets.create', compact('unitaImmobiliari', 'categorieTicket')); } public function store(Request $request) { $user = Auth::user(); $soggettoId = $this->resolveSoggettoId($user); if (! $soggettoId) { return back()->withErrors([ 'ticket' => 'Non e stato possibile identificare il nominativo utente autenticato.', ])->withInput(); } $request->validate([ 'unita_immobiliare_id' => 'required|integer', 'categoria_ticket_id' => 'nullable|exists:categorie_ticket,id', 'titolo' => 'required|string|max:255', 'descrizione' => 'required|string', 'luogo_intervento' => 'nullable|string|max:255', 'priorita' => 'required|in:Bassa,Media,Alta,Urgente', 'allegati.*' => 'nullable|file|max:20480', // 20MB per file ]); $unitaImmobiliare = $this->resolveUserUnita($user) ->firstWhere('id', (int) $request->unita_immobiliare_id); if (! $unitaImmobiliare) { return back()->withErrors([ 'unita_immobiliare_id' => 'Unita immobiliare non accessibile per l\'utente autenticato.', ])->withInput(); } $ticket = Ticket::create([ 'stabile_id' => $unitaImmobiliare->stabile_id, 'unita_immobiliare_id' => (int) $unitaImmobiliare->id, 'soggetto_richiedente_id' => $soggettoId, 'categoria_ticket_id' => $request->categoria_ticket_id, 'aperto_da_user_id' => $user->id, 'titolo' => $request->titolo, 'descrizione' => $request->descrizione, 'luogo_intervento' => $request->luogo_intervento, 'data_apertura' => now(), 'stato' => 'Aperto', 'priorita' => $request->priorita, ]); // Gestione allegati if ($request->hasFile('allegati')) { foreach ($request->file('allegati') as $file) { if (! $file) { continue; } $path = $file->store('ticket-attachments', 'public'); $ticket->attachments()->create([ 'ticket_update_id' => null, 'user_id' => $user->id, 'file_path' => $path, 'original_file_name' => $file->getClientOriginalName(), 'mime_type' => (string) $file->getMimeType(), 'size' => (int) $file->getSize(), 'description' => 'Upload da area condomino', ]); } } TicketMessage::query()->create([ 'ticket_id' => (int) $ticket->id, 'user_id' => $user?->id, 'messaggio' => 'Ticket creato da area condomino/inquilino.', ]); return redirect()->route('condomino.tickets.index') ->with('success', 'Ticket creato con successo.'); } public function show(Ticket $ticket) { $user = Auth::user(); $soggettoId = $this->resolveSoggettoId($user); // Verifica che il ticket appartenga all'utente if (! $soggettoId || (int) $ticket->soggetto_richiedente_id !== (int) $soggettoId) { abort(403); } $ticket->load(['stabile', 'categoriaTicket', 'unitaImmobiliare', 'attachments']); return view('condomino.tickets.show', compact('ticket')); } }