diff --git a/.env.example b/.env.example index 77d798d8..4591aa9c 100644 --- a/.env.example +++ b/.env.example @@ -14,6 +14,10 @@ APP_URL=http://chamados # Definir o parâmetro em MB, o padrão aqui é 16MB (se não estiver definido valor algum) UPLOAD_MAX_FILESIZE=16 +# Timeout padrão em horas para edição de comentários próprios nas filas que habilitarem essa opção. +# Cada fila pode sobrescrever esse valor nas suas configurações. Use 0 para permitir edição sem limite de tempo. +EDITAR_COMENTARIOS_TIMEOUT_HORAS=12 + # Se a aplicação está atrás de um proxy que conecta com o usuário por https # mas conecta com a aplicação por http, você deve habilitar essa flag ######## Deprecado em favor de LARAVEL_TOOLS_FORCAR_HTTPS (2/2023) ############ @@ -220,4 +224,3 @@ WS_FOTO_FAKE_PATH= DUSK_DRIVER_URL='http://selenium:4444/wd/hub' DUSK_START_MAXIMIZED=true DUSK_HEADLESS_DISABLED=true - diff --git a/app/Http/Controllers/ComentarioController.php b/app/Http/Controllers/ComentarioController.php index b09901b6..e9e40db3 100644 --- a/app/Http/Controllers/ComentarioController.php +++ b/app/Http/Controllers/ComentarioController.php @@ -6,6 +6,7 @@ use App\Models\Comentario; use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; class ComentarioController extends Controller { @@ -59,4 +60,44 @@ public function store(Request $request, Chamado $chamado) $request->session()->flash('alert-info', 'Comentário enviado com sucesso'); return redirect("chamados/$chamado->id"); } + + public function update(Request $request, Comentario $comentario) + { + $this->authorize('chamados.view', $comentario->chamado); + + if (!$comentario->podeSerEditadoPor(\Auth::user())) { + abort(403); + } + + $request->validate([ + 'comentario' => ['required'], + ]); + + $comentarioOriginal = $comentario->comentario; + $comentarioEditado = $request->comentario; + + if ($comentarioOriginal == $comentarioEditado) { + $request->session()->flash('alert-info', 'Nenhuma alteração realizada'); + return redirect("chamados/{$comentario->chamado->id}"); + } + + $comentario->comentario = $comentarioEditado; + $comentario->save(); + + Log::info('Comentário editado', [ + 'comentario_id' => $comentario->id, + 'chamado_id' => $comentario->chamado_id, + 'user_id' => \Auth::user()->id, + 'comentario_original' => $comentarioOriginal, + 'comentario_editado' => $comentarioEditado, + ]); + + Comentario::criarSystem( + $comentario->chamado, + 'O comentário de ' . e($comentario->user->name) . ' foi editado.' + ); + + $request->session()->flash('alert-info', 'Comentário editado com sucesso'); + return redirect("chamados/{$comentario->chamado->id}"); + } } diff --git a/app/Http/Controllers/FilaController.php b/app/Http/Controllers/FilaController.php index 6090a987..4bebf29d 100644 --- a/app/Http/Controllers/FilaController.php +++ b/app/Http/Controllers/FilaController.php @@ -104,6 +104,10 @@ public function update(Request $request, Fila $fila) } if ($request->card == 'config') { + $request->validate([ + 'config.editar_comentarios_timeout_horas' => 'required|integer|min:0', + ]); + $settings = $request->settings; $fila->settings()->set('instrucoes', $settings['instrucoes']); diff --git a/app/Models/Comentario.php b/app/Models/Comentario.php index c8303ac4..ff8d144b 100644 --- a/app/Models/Comentario.php +++ b/app/Models/Comentario.php @@ -5,6 +5,7 @@ use App\Models\Chamado; use App\Models\User; use App\Observers\ComentarioObserver; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -51,6 +52,33 @@ public static function tipos() return ['user', 'system']; } + public function podeSerEditadoPor(User $user) + { + if ($this->tipo != 'user') { + return false; + } + + if ($this->user_id != $user->id) { + return false; + } + + if (!$this->chamado->fila->config->editar_comentarios) { + return false; + } + + $timeout = $this->chamado->fila->config->editar_comentarios_timeout_horas; + if ($timeout == 0) { + return true; + } + + return $this->created_at->greaterThanOrEqualTo(Carbon::now()->subHours($timeout)); + } + + public function foiEditado() + { + return $this->created_at && $this->updated_at && $this->updated_at->greaterThan($this->created_at); + } + /** * relacionamento com user */ diff --git a/app/Models/Fila.php b/app/Models/Fila.php index 161ebc78..31271875 100644 --- a/app/Models/Fila.php +++ b/app/Models/Fila.php @@ -190,6 +190,9 @@ public function getConfigAttribute($value) $out = new \StdClass; $out->triagem = $value->triagem ?? config('filas.config.triagem'); $out->patrimonio = $value->patrimonio ?? config('filas.config.patrimonio'); + $out->editar_comentarios = $value->editar_comentarios ?? config('filas.config.editar_comentarios'); + $out->editar_comentarios_timeout_horas = $value->editar_comentarios_timeout_horas + ?? config('filas.config.editar_comentarios_timeout_horas'); $out->visibilidade = $v; $out->status = $value->status ?? config('filas.config.status'); return $out; @@ -219,6 +222,9 @@ public function setConfigAttribute($value) $config = new \StdClass; $config->triagem = $value['triagem']; $config->patrimonio = $value['patrimonio']; + $config->editar_comentarios = $value['editar_comentarios'] ?? 0; + $config->editar_comentarios_timeout_horas = $value['editar_comentarios_timeout_horas'] + ?? config('filas.config.editar_comentarios_timeout_horas'); $config->visibilidade = $v; $config->status = $value['status']; diff --git a/config/chamados.php b/config/chamados.php index be829fd0..ab658170 100644 --- a/config/chamados.php +++ b/config/chamados.php @@ -11,6 +11,7 @@ 'usar_foto' => env('USAR_FOTO', false), 'upload_max_filesize' => (int) env('UPLOAD_MAX_FILESIZE', '16') * 1024, + 'editar_comentarios_timeout_horas' => (int) env('EDITAR_COMENTARIOS_TIMEOUT_HORAS', 12), // deprecado em 2/23. Remover no próximo release 'forcar_https' => env('FORCAR_HTTPS', false), diff --git a/config/filas.php b/config/filas.php index 0145bd6d..dfa288e2 100644 --- a/config/filas.php +++ b/config/filas.php @@ -11,6 +11,8 @@ 'setores' => 'todos', # todos ou interno ], 'patrimonio' => 0, + 'editar_comentarios' => 0, + 'editar_comentarios_timeout_horas' => config('chamados.editar_comentarios_timeout_horas'), ]; $template = '{}'; diff --git a/readme.md b/readme.md index c2485d2a..16644edf 100644 --- a/readme.md +++ b/readme.md @@ -151,6 +151,8 @@ Cadastre uma nova URL no configurador de senha única utilizando o caminho `http Há várias opções que precisam ser ajustadas nesse arquivo. Faça com atenção para não deixar passar nada. O arquivo está todo documentado. +A variável `EDITAR_COMENTARIOS_TIMEOUT_HORAS` define o timeout padrão, em horas, para edição de comentários próprios nas filas que habilitarem essa opção. Cada fila pode sobrescrever esse valor nas suas configurações; use `0` para permitir edição sem limite de tempo. + ### Popular banco de dados php artisan migrate diff --git a/resources/views/chamados/show/card-comentarios-user.blade.php b/resources/views/chamados/show/card-comentarios-user.blade.php index 15083a9f..9cce7504 100644 --- a/resources/views/chamados/show/card-comentarios-user.blade.php +++ b/resources/views/chamados/show/card-comentarios-user.blade.php @@ -19,10 +19,48 @@ @forelse ($chamado->comentarios->where('tipo','user')->sortByDesc('created_at') as $comentario)
{!! nl2br($comentario->comentario) !!}
+{!! nl2br($comentario->comentario) !!}