authorize('viewAny', LegalDocument::class); $documents = LegalDocument::orderBy('type')->orderByDesc('version')->paginate(20); return view('legal.documents.index', compact('documents')); } /** * Show the form for editing a legal document. */ public function edit(string $type) { $document = LegalDocument::where('type', $type)->latest('version')->first(); if (!$document) { $document = new LegalDocument(['type' => $type]); } $this->authorize('update', $document); return view('legal.documents.edit', compact('document')); } /** * Update or create a legal document. */ public function update(Request $request, string $type) { $this->authorize('create', LegalDocument::class); $validated = $request->validate([ 'title' => ['required', 'string', 'max:255'], 'content' => ['required', 'string'], 'version' => ['required', 'string', 'max:50'], 'published_at' => ['nullable', 'date'], ]); $document = LegalDocument::where('type', $type)->latest('version')->first(); if ($document && $document->version === $validated['version']) { $document->update([ 'title' => $validated['title'], 'content' => $validated['content'], 'published_at' => $validated['published_at'] ? now() : null, ]); } else { $document = LegalDocument::create(array_merge($validated, [ 'type' => $type, 'published_by' => Auth::id(), 'published_at' => $validated['published_at'] ?? now(), ])); } return redirect()->route('legal.documents.index')->with('success', 'Documento atualizado com sucesso.'); } /** * Display the legal document page. */ public function show(string $type): View|RedirectResponse { $document = LegalDocument::where('type', $type)->latest('version')->firstOrFail(); $pendingAcceptance = false; if (Auth::check() && Auth::user()->role !== 'superadmin') { $accepted = UserDocumentAcceptance::where('user_id', Auth::id()) ->where('legal_document_id', $document->id) ->exists(); if (!$accepted) { $pendingAcceptance = true; } } return view('legal.documents.show', compact('document', 'pendingAcceptance')); } /** * Accept a legal document. */ public function accept(string $type): RedirectResponse { $document = LegalDocument::where('type', $type)->latest('version')->firstOrFail(); if (Auth::check()) { UserDocumentAcceptance::updateOrCreate( [ 'user_id' => Auth::id(), 'legal_document_id' => $document->id, ], [ 'document_version' => $document->version, 'ip_address' => request()->ip(), 'user_agent' => request()->userAgent(), 'accepted_at' => now(), ] ); } return redirect()->route('dashboard') ->with('success', 'Documento aceito com sucesso.'); } }