Implantação da area de Arquivamento Visualizar, Excluir e Restaurar
This commit is contained in:
@@ -3,7 +3,7 @@ class ConsolidacoesController < ApplicationController
|
|||||||
include Auditavel
|
include Auditavel
|
||||||
|
|
||||||
before_action :set_consolidacao,
|
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]
|
preview_holerite gerar_pdf_relatorio gerar_pdf_holerite]
|
||||||
|
|
||||||
# GET /consolidacoes — lista com filtros
|
# GET /consolidacoes — lista com filtros
|
||||||
@@ -122,6 +122,28 @@ class ConsolidacoesController < ApplicationController
|
|||||||
redirect_to consolidacoes_path, notice: 'Consolidação arquivada.'
|
redirect_to consolidacoes_path, notice: 'Consolidação arquivada.'
|
||||||
end
|
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 ────────────────────────────────────────────
|
# ── FASE 7 — PDFs ────────────────────────────────────────────
|
||||||
|
|
||||||
# GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X
|
# GET /consolidacoes/:id/gerar_pdf_relatorio?motorista=X
|
||||||
|
|||||||
@@ -41,6 +41,18 @@ class Consolidacao < ApplicationRecord
|
|||||||
)
|
)
|
||||||
end
|
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)
|
def finalizar!(user)
|
||||||
return false unless todas_entregas_classificadas?
|
return false unless todas_entregas_classificadas?
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# app/policies/consolidacao_policy.rb
|
# app/policies/consolidacao_policy.rb
|
||||||
class ConsolidacaoPolicy < ApplicationPolicy
|
class ConsolidacaoPolicy < ApplicationPolicy
|
||||||
def index? = user.pode_consolidar?
|
def index? = user.pode_consolidar?
|
||||||
def show? = user.pode_consolidar?
|
def arquivadas? = user.pode_consolidar?
|
||||||
def create? = user.pode_consolidar?
|
def show? = user.pode_consolidar?
|
||||||
|
def create? = user.pode_consolidar?
|
||||||
def update? = user.pode_consolidar? && !record_finalizada_para_operador?
|
def update? = user.pode_consolidar? && !record_finalizada_para_operador?
|
||||||
def destroy? = user.admin? || user.gerente?
|
def destroy? = user.admin? || user.gerente?
|
||||||
|
|
||||||
|
|||||||
68
app/views/consolidacoes/arquivadas.html.erb
Normal file
68
app/views/consolidacoes/arquivadas.html.erb
Normal 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 %>
|
||||||
@@ -3,8 +3,12 @@
|
|||||||
|
|
||||||
<div class="flex items-center justify-between mb-6">
|
<div class="flex items-center justify-between mb-6">
|
||||||
<h1 class="text-2xl font-bold text-white">📦 Consolidações</h1>
|
<h1 class="text-2xl font-bold text-white">📦 Consolidações</h1>
|
||||||
<%= link_to '+ Nova Consolidação', new_consolidacao_path,
|
<div class="flex gap-2">
|
||||||
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' %>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%# ── Filtros ──────────────────────────────────────────── %>
|
<%# ── Filtros ──────────────────────────────────────────── %>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
<% unless current_user.motorista? %>
|
<% unless current_user.motorista? %>
|
||||||
<%= nav_link_to '📊 Dashboard', dashboard_path %>
|
<%= nav_link_to '📊 Dashboard', dashboard_path %>
|
||||||
<%= nav_link_to '📦 Consolidações', consolidacoes_path %>
|
<%= nav_link_to '📦 Consolidações', consolidacoes_path %>
|
||||||
|
<%= nav_link_to '📁 Arquivadas', arquivadas_consolidacoes_path %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%# Motorista %>
|
<%# Motorista %>
|
||||||
|
|||||||
@@ -27,12 +27,14 @@ Rails.application.routes.draw do
|
|||||||
resources :consolidacoes do
|
resources :consolidacoes do
|
||||||
collection do
|
collection do
|
||||||
get :veiculos_disponiveis # JSON — veículos do(s) motorista(s) no período (form nova consolidação)
|
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
|
end
|
||||||
|
|
||||||
member do
|
member do
|
||||||
get :wizard # Passo 1 — selecionar motorista
|
get :wizard # Passo 1 — selecionar motorista
|
||||||
post :finalizar
|
post :finalizar
|
||||||
post :arquivar
|
post :arquivar
|
||||||
|
post :reativar # Restaura uma consolidação arquivada
|
||||||
get :preview_holerite
|
get :preview_holerite
|
||||||
get :gerar_pdf_relatorio
|
get :gerar_pdf_relatorio
|
||||||
get :gerar_pdf_holerite
|
get :gerar_pdf_holerite
|
||||||
|
|||||||
Reference in New Issue
Block a user