diff --git a/app/controllers/consolidacoes_controller.rb b/app/controllers/consolidacoes_controller.rb index 305c076..8545a6d 100644 --- a/app/controllers/consolidacoes_controller.rb +++ b/app/controllers/consolidacoes_controller.rb @@ -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 diff --git a/app/models/consolidacao.rb b/app/models/consolidacao.rb index 35dd818..f2946c1 100644 --- a/app/models/consolidacao.rb +++ b/app/models/consolidacao.rb @@ -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? diff --git a/app/policies/consolidacao_policy.rb b/app/policies/consolidacao_policy.rb index 0cf7214..cbbca0f 100644 --- a/app/policies/consolidacao_policy.rb +++ b/app/policies/consolidacao_policy.rb @@ -1,8 +1,9 @@ # app/policies/consolidacao_policy.rb class ConsolidacaoPolicy < ApplicationPolicy - def index? = user.pode_consolidar? - def show? = user.pode_consolidar? - def create? = user.pode_consolidar? + 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? def destroy? = user.admin? || user.gerente? diff --git a/app/views/consolidacoes/arquivadas.html.erb b/app/views/consolidacoes/arquivadas.html.erb new file mode 100644 index 0000000..d25fadc --- /dev/null +++ b/app/views/consolidacoes/arquivadas.html.erb @@ -0,0 +1,68 @@ +<%# app/views/consolidacoes/arquivadas.html.erb %> +<% content_for :title, 'Consolidações arquivadas' %> + +
+

📁 Consolidações arquivadas

+ <%= 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' %> +
+ +

+ Histórico de consolidações arquivadas. Você pode reativar + uma consolidação para voltar a editá-la, ou excluí-la + permanentemente — esta ação não pode ser desfeita. +

+ +<%# ── Lista ────────────────────────────────────────────── %> +<% if @consolidacoes.any? %> +
+ <% @consolidacoes.each do |c| %> +
+
+
+
+ <%= link_to c.nome, consolidacao_path(c), + class: 'text-white font-bold text-lg hover:text-orange-500' %> + <%= badge_status(c.status) %> +
+

+ 📅 <%= l c.data_inicio, format: :short %> → <%= l c.data_fim, format: :short %> + · 👤 <%= c.consolidacao_motoristas.count %> motorista(s) + · Criada por <%= c.criador.nome_display %> +

+

+ 📁 Arquivada + <% if c.arquivado_em.present? %>em <%= l c.arquivado_em, format: :short %><% end %> + <% if c.arquivador.present? %>por <%= c.arquivador.nome_display %><% end %> +

+
+ +
+
+

<%= moeda(c.valor_total) %>

+

<%= c.consolidacao_entregas.count %> entregas classificadas

+
+ + <% if policy(c).destroy? %> +
+ <%= 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]' %> +
+ <% end %> +
+
+
+ <% end %> +
+<% else %> +
+

🗂️

+

Nenhuma consolidação arquivada.

+ <%= 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' %> +
+<% end %> diff --git a/app/views/consolidacoes/index.html.erb b/app/views/consolidacoes/index.html.erb index cc8d776..b334499 100644 --- a/app/views/consolidacoes/index.html.erb +++ b/app/views/consolidacoes/index.html.erb @@ -3,8 +3,12 @@

📦 Consolidações

- <%= 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' %> +
+ <%= 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' %> +
<%# ── Filtros ──────────────────────────────────────────── %> diff --git a/app/views/layouts/_navbar.html.erb b/app/views/layouts/_navbar.html.erb index 85a7d0f..eb61e45 100644 --- a/app/views/layouts/_navbar.html.erb +++ b/app/views/layouts/_navbar.html.erb @@ -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 %> diff --git a/config/routes.rb b/config/routes.rb index f6dde4d..87b7dae 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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