Implantação da area de Arquivamento Visualizar, Excluir e Restaurar

This commit is contained in:
2026-06-17 15:29:17 -03:00
parent 5b2de23cfe
commit 292ac31c66
7 changed files with 116 additions and 6 deletions

View File

@@ -3,7 +3,7 @@ class ConsolidacoesController < ApplicationController
include Auditavel
before_action :set_consolidacao,
only: %i[show edit update destroy finalizar arquivar wizard
only: %i[show edit update destroy finalizar arquivar reativar wizard
preview_holerite gerar_pdf_relatorio gerar_pdf_holerite]
# GET /consolidacoes — lista com filtros
@@ -122,6 +122,28 @@ class ConsolidacoesController < ApplicationController
redirect_to consolidacoes_path, notice: 'Consolidação arquivada.'
end
# GET /consolidacoes/arquivadas — histórico de consolidações arquivadas
def arquivadas
authorize Consolidacao
@consolidacoes = Consolidacao.arquivadas.recentes.includes(:criador, :arquivador)
end
# POST /consolidacoes/:id/reativar — restaura uma consolidação arquivada
def reativar
authorize @consolidacao, :destroy?
@consolidacao.reativar!(current_user)
auditar!(:reativar, @consolidacao)
redirect_to consolidacoes_path, notice: 'Consolidação reativada.'
end
# DELETE /consolidacoes/:id — exclui PERMANENTEMENTE (apenas arquivadas)
def destroy
authorize @consolidacao, :destroy?
@consolidacao.destroy!
auditar!(:excluir, @consolidacao)
redirect_to arquivadas_consolidacoes_path, notice: 'Consolidação excluída permanentemente.'
end
# ── FASE 7 — PDFs ────────────────────────────────────────────
# GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X

View File

@@ -41,6 +41,18 @@ class Consolidacao < ApplicationRecord
)
end
# Restaura uma consolidação arquivada. Como o status original não é guardado,
# inferimos: se já tinha sido finalizada (finalizado_em presente) volta para
# :finalizada, senão para :rascunho. Limpa os campos de arquivamento.
def reativar!(_user)
update!(
deleted_at: nil,
status: finalizado_em? ? :finalizada : :rascunho,
arquivado_por: nil,
arquivado_em: nil
)
end
def finalizar!(user)
return false unless todas_entregas_classificadas?

View File

@@ -1,6 +1,7 @@
# app/policies/consolidacao_policy.rb
class ConsolidacaoPolicy < ApplicationPolicy
def index? = user.pode_consolidar?
def arquivadas? = user.pode_consolidar?
def show? = user.pode_consolidar?
def create? = user.pode_consolidar?
def update? = user.pode_consolidar? && !record_finalizada_para_operador?

View File

@@ -0,0 +1,68 @@
<%# app/views/consolidacoes/arquivadas.html.erb %>
<% content_for :title, 'Consolidações arquivadas' %>
<div class="flex items-center justify-between mb-6">
<h1 class="text-2xl font-bold text-white">📁 Consolidações arquivadas</h1>
<%= link_to '← Voltar às ativas', consolidacoes_path,
class: 'text-gray-400 hover:text-white border border-[#2a2a2a] px-4 py-3 rounded-lg min-h-[48px] flex items-center' %>
</div>
<p class="text-gray-500 text-sm mb-6">
Histórico de consolidações arquivadas. Você pode <span class="text-orange-400">reativar</span>
uma consolidação para voltar a editá-la, ou <span class="text-red-400">excluí-la</span>
permanentemente — esta ação não pode ser desfeita.
</p>
<%# ── Lista ────────────────────────────────────────────── %>
<% if @consolidacoes.any? %>
<div class="space-y-3">
<% @consolidacoes.each do |c| %>
<div class="bg-[#1a1a1a] border border-[#2a2a2a] rounded-xl p-5">
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-3">
<div>
<div class="flex items-center gap-3 mb-1">
<%= link_to c.nome, consolidacao_path(c),
class: 'text-white font-bold text-lg hover:text-orange-500' %>
<%= badge_status(c.status) %>
</div>
<p class="text-gray-400 text-sm">
📅 <%= l c.data_inicio, format: :short %> → <%= l c.data_fim, format: :short %>
· 👤 <%= c.consolidacao_motoristas.count %> motorista(s)
· Criada por <%= c.criador.nome_display %>
</p>
<p class="text-gray-500 text-xs mt-1">
📁 Arquivada
<% if c.arquivado_em.present? %>em <%= l c.arquivado_em, format: :short %><% end %>
<% if c.arquivador.present? %>por <%= c.arquivador.nome_display %><% end %>
</p>
</div>
<div class="flex flex-col items-end gap-3">
<div class="text-right">
<p class="text-orange-500 font-black text-2xl"><%= moeda(c.valor_total) %></p>
<p class="text-gray-500 text-xs"><%= c.consolidacao_entregas.count %> entregas classificadas</p>
</div>
<% if policy(c).destroy? %>
<div class="flex gap-2">
<%= button_to '♻️ Reativar', reativar_consolidacao_path(c), method: :post,
data: { turbo_confirm: 'Reativar esta consolidação? Ela voltará para a lista de ativas.' },
class: 'bg-orange-500 hover:bg-orange-600 text-black font-bold px-4 py-2.5 rounded-lg text-sm min-h-[44px]' %>
<%= button_to '🗑️ Excluir', consolidacao_path(c), method: :delete,
data: { turbo_confirm: 'EXCLUIR PERMANENTEMENTE esta consolidação e todas as suas classificações? Esta ação NÃO pode ser desfeita.' },
class: 'text-red-400 hover:text-white hover:bg-red-600 border border-red-900 px-4 py-2.5 rounded-lg text-sm min-h-[44px]' %>
</div>
<% end %>
</div>
</div>
</div>
<% end %>
</div>
<% else %>
<div class="bg-[#1a1a1a] border border-[#2a2a2a] rounded-xl p-12 text-center">
<p class="text-5xl mb-4">🗂️</p>
<p class="text-gray-400 mb-4">Nenhuma consolidação arquivada.</p>
<%= link_to 'Ver consolidações ativas', consolidacoes_path,
class: 'inline-block bg-orange-500 hover:bg-orange-600 text-black font-bold px-5 py-3 rounded-lg' %>
</div>
<% end %>

View File

@@ -3,9 +3,13 @@
<div class="flex items-center justify-between mb-6">
<h1 class="text-2xl font-bold text-white">📦 Consolidações</h1>
<div class="flex gap-2">
<%= link_to '📁 Arquivadas', arquivadas_consolidacoes_path,
class: 'text-gray-400 hover:text-white border border-[#2a2a2a] px-4 py-3 rounded-lg min-h-[48px] flex items-center transition-colors' %>
<%= link_to '+ Nova Consolidação', new_consolidacao_path,
class: 'bg-orange-500 hover:bg-orange-600 text-black font-bold px-5 py-3 rounded-lg min-h-[48px] flex items-center transition-colors' %>
</div>
</div>
<%# ── Filtros ──────────────────────────────────────────── %>
<%= form_with url: consolidacoes_path, method: :get,

View File

@@ -40,6 +40,7 @@
<% unless current_user.motorista? %>
<%= nav_link_to '📊 Dashboard', dashboard_path %>
<%= nav_link_to '📦 Consolidações', consolidacoes_path %>
<%= nav_link_to '📁 Arquivadas', arquivadas_consolidacoes_path %>
<% end %>
<%# Motorista %>

View File

@@ -27,12 +27,14 @@ Rails.application.routes.draw do
resources :consolidacoes do
collection do
get :veiculos_disponiveis # JSON — veículos do(s) motorista(s) no período (form nova consolidação)
get :arquivadas # Histórico — consolidações arquivadas
end
member do
get :wizard # Passo 1 — selecionar motorista
post :finalizar
post :arquivar
post :reativar # Restaura uma consolidação arquivada
get :preview_holerite
get :gerar_pdf_relatorio
get :gerar_pdf_holerite