diff --git a/app/models/consolidacao.rb b/app/models/consolidacao.rb
index 4152a71..d2705b3 100644
--- a/app/models/consolidacao.rb
+++ b/app/models/consolidacao.rb
@@ -60,24 +60,31 @@ class Consolidacao < ApplicationRecord
# ── Métodos ─────────────────────────────────────────────────
+ # Arquivar é um soft-delete administrativo: deve SEMPRE funcionar, mesmo numa
+ # consolidação zerada ou em rascunho com dados incompletos. Por isso usamos
+ # update_columns — pula validações (periodo_valido, presença) e o callback
+ # recalcular_valor_total, que não fazem sentido ao apenas mover para o arquivo.
def arquivar!(user)
- update!(
+ update_columns(
deleted_at: Time.current,
- status: :arquivada,
+ status: self.class.statuses[:arquivada],
arquivado_por: user&.id,
- arquivado_em: Time.current
+ arquivado_em: Time.current,
+ updated_at: Time.current
)
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.
+ # Também via update_columns para não depender da validade do conteúdo.
def reativar!(_user)
- update!(
+ update_columns(
deleted_at: nil,
- status: finalizado_em? ? :finalizada : :rascunho,
+ status: self.class.statuses[finalizado_em? ? :finalizada : :rascunho],
arquivado_por: nil,
- arquivado_em: nil
+ arquivado_em: nil,
+ updated_at: Time.current
)
end
diff --git a/app/views/consolidacoes/arquivadas.html.erb b/app/views/consolidacoes/arquivadas.html.erb
index d25fadc..2a97621 100644
--- a/app/views/consolidacoes/arquivadas.html.erb
+++ b/app/views/consolidacoes/arquivadas.html.erb
@@ -46,10 +46,10 @@
<% 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.' },
+ form: { 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.' },
+ form: { 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 %>
diff --git a/app/views/consolidacoes/show.html.erb b/app/views/consolidacoes/show.html.erb
index aa6cfbc..4a5a916 100644
--- a/app/views/consolidacoes/show.html.erb
+++ b/app/views/consolidacoes/show.html.erb
@@ -40,7 +40,7 @@
class: 'bg-[#1a1a1a] hover:bg-[#2a2a2a] text-white border border-orange-500 font-semibold px-4 py-3 rounded-lg min-h-[48px] flex items-center' %>
<% if policy(@consolidacao).destroy? && !@consolidacao.arquivada? %>
<%= button_to '📁 Arquivar', arquivar_consolidacao_path(@consolidacao), method: :post,
- data: { turbo_confirm: 'Arquivar esta consolidação? Ela não será excluída, apenas movida para o arquivo.' },
+ form: { data: { turbo_confirm: 'Arquivar esta consolidação? Ela não será excluída, apenas movida para o arquivo.' } },
class: 'text-gray-400 hover:text-white border border-[#2a2a2a] px-4 py-3 rounded-lg min-h-[48px]' %>
<% end %>
diff --git a/db/migrate/20260622000001_add_preco_extraordinaria_configuracao.rb b/db/migrate/20260622000001_add_preco_extraordinaria_configuracao.rb
new file mode 100644
index 0000000..7e63ed6
--- /dev/null
+++ b/db/migrate/20260622000001_add_preco_extraordinaria_configuracao.rb
@@ -0,0 +1,18 @@
+# Cria a configuração de preço "Entrega Extraordinária" (pilar coringa) em bancos
+# já existentes, para que apareça na tela de Configurações. Idempotente — não
+# sobrescreve se o admin já tiver definido um valor.
+class AddPrecoExtraordinariaConfiguracao < ActiveRecord::Migration[7.1]
+ def up
+ return if Configuracao.exists?(chave: 'preco_extraordinaria')
+
+ Configuracao.create!(
+ chave: 'preco_extraordinaria',
+ valor: '25.00',
+ descricao: 'Valor coringa para entregas fora do planejamento (R$)'
+ )
+ end
+
+ def down
+ Configuracao.where(chave: 'preco_extraordinaria').delete_all
+ end
+end