Compare commits

...

2 Commits

Author SHA256 Message Date
aad167873f Atualiza README: fixes Passo 3 e tela de usuários 2026-06-16 03:12:33 -03:00
44843351ae Corrige tela branca no Passo 3 + erros na tela de usuários
- Passo 3 (revisar): GROUP BY tipo + ORDER BY created_at é inválido no
  PostgreSQL (PG::GroupingError → 500/tela branca). reorder(nil) no count.
  Só ficou acessível depois de corrigir o new? da consolidação.
- Usuários: helper badge_status_usuario criado; rota toggle_ativo corrigida
  para toggle_ativo_admin_usuario_path (PATCH); confirms via turbo_confirm.
- Passo 3: contagem mostra entregas distintas + nº de pilares (multi-pilar).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 03:11:55 -03:00
5 changed files with 15 additions and 5 deletions

View File

@@ -365,6 +365,8 @@ docker-compose exec app bundle exec rspec
- **Listagem de usuários** chamava o helper inexistente `badge_role` — criado em `ApplicationHelper`. - **Listagem de usuários** chamava o helper inexistente `badge_role` — criado em `ApplicationHelper`.
- **Nova consolidação** estourava `NoMethodError: new?``ApplicationPolicy` agora define `new? = create?` e `edit? = update?`. - **Nova consolidação** estourava `NoMethodError: new?``ApplicationPolicy` agora define `new? = create?` e `edit? = update?`.
- **Login do motorista (PIN)** derrubava `/motorista` com `PG::UndefinedTable: relation "consolidacao_motorista" does not exist` — o inflector pt-BR resolvia o composto no singular. `self.table_name` fixado explicitamente em `Consolidacao`, `ConsolidacaoMotorista`, `ConsolidacaoEntrega` e `Configuracao`. - **Login do motorista (PIN)** derrubava `/motorista` com `PG::UndefinedTable: relation "consolidacao_motorista" does not exist` — o inflector pt-BR resolvia o composto no singular. `self.table_name` fixado explicitamente em `Consolidacao`, `ConsolidacaoMotorista`, `ConsolidacaoEntrega` e `Configuracao`.
- **Listagem de usuários** faltava o helper `badge_status_usuario` e a rota `toggle_ativo` estava sem o prefixo `admin_` (verbo errado também) — corrigidos.
- **Passo 3 (revisão) da consolidação** ficava em branco: `GROUP BY tipo` combinado com `ORDER BY created_at` é inválido no PostgreSQL (`PG::GroupingError`, vira 500/tela branca em produção). Corrigido com `reorder(nil)` no count agrupado.
### 🆕 Funcionalidades ### 🆕 Funcionalidades
- **Dashboard com filtro de faixa de datas** (Flatpickr, modo range) no lugar da navegação por mês; o controller passou a consultar por período e a respeitar `.da_conta_gade`. - **Dashboard com filtro de faixa de datas** (Flatpickr, modo range) no lugar da navegação por mês; o controller passou a consultar por período e a respeitar `.da_conta_gade`.

View File

@@ -129,7 +129,8 @@ class ConsolidacaoEntregasController < ApplicationController
.where(motorista_nome: @motorista) .where(motorista_nome: @motorista)
.order(:created_at) .order(:created_at)
@resumo = @classificacoes.group(:tipo).count # reorder(nil): GROUP BY tipo + ORDER BY created_at é inválido no PostgreSQL
@resumo = @classificacoes.reorder(nil).group(:tipo).count
@total = @classificacoes.sum do |c| @total = @classificacoes.sum do |c|
c.tipo == 'desconto' ? -c.valor_aplicado : c.valor_aplicado c.tipo == 'desconto' ? -c.valor_aplicado : c.valor_aplicado
end end

View File

@@ -43,6 +43,13 @@ module ApplicationHelper
tag.span label, class: "inline-flex items-center px-2.5 py-1 rounded-full text-xs font-bold #{cfg[:cor]}" tag.span label, class: "inline-flex items-center px-2.5 py-1 rounded-full text-xs font-bold #{cfg[:cor]}"
end end
# Badge de status ativo/inativo do usuário
def badge_status_usuario(ativo)
cor = ativo ? 'bg-green-600 text-white' : 'bg-red-600 text-white'
label = ativo ? 'Ativo' : 'Inativo'
tag.span label, class: "inline-flex items-center px-2.5 py-1 rounded-full text-xs font-bold #{cor}"
end
# Barra de progresso laranja # Barra de progresso laranja
def progress_bar(percentual, label: nil) def progress_bar(percentual, label: nil)
pct = percentual.to_i.clamp(0, 100) pct = percentual.to_i.clamp(0, 100)

View File

@@ -73,10 +73,10 @@
<% end %> <% end %>
<% if policy(usuario).toggle_ativo? %> <% if policy(usuario).toggle_ativo? %>
<%= button_to toggle_ativo_usuario_path(usuario), method: :post, <%= button_to toggle_ativo_admin_usuario_path(usuario), method: :patch,
class: "p-2 rounded-lg transition-colors #{usuario.ativo? ? 'text-green-400 hover:bg-green-900/30' : 'text-red-400 hover:bg-red-900/30'}", class: "p-2 rounded-lg transition-colors #{usuario.ativo? ? 'text-green-400 hover:bg-green-900/30' : 'text-red-400 hover:bg-red-900/30'}",
title: usuario.ativo? ? 'Desativar' : 'Ativar', title: usuario.ativo? ? 'Desativar' : 'Ativar',
data: { confirm: "#{usuario.ativo? ? 'Desativar' : 'Ativar'} #{usuario.nome}?" } do %> form: { data: { turbo_confirm: "#{usuario.ativo? ? 'Desativar' : 'Ativar'} #{usuario.nome}?" } } do %>
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"/> d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"/>
@@ -88,7 +88,7 @@
<%= button_to admin_usuario_path(usuario), method: :delete, <%= button_to admin_usuario_path(usuario), method: :delete,
class: 'p-2 text-gray-600 hover:text-red-400 hover:bg-red-900/20 rounded-lg transition-colors', class: 'p-2 text-gray-600 hover:text-red-400 hover:bg-red-900/20 rounded-lg transition-colors',
title: 'Excluir', title: 'Excluir',
data: { confirm: "Excluir #{usuario.nome} permanentemente?" } do %> form: { data: { turbo_confirm: "Excluir #{usuario.nome} permanentemente?" } } do %>
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/>

View File

@@ -30,7 +30,7 @@
<div class="bg-[#1a1a1a] border border-orange-500 rounded-xl p-6 mb-6 text-center"> <div class="bg-[#1a1a1a] border border-orange-500 rounded-xl p-6 mb-6 text-center">
<p class="text-gray-400 text-sm mb-1">Total a pagar — <%= @motorista %></p> <p class="text-gray-400 text-sm mb-1">Total a pagar — <%= @motorista %></p>
<p class="text-orange-500 font-black text-4xl"><%= moeda(@total) %></p> <p class="text-orange-500 font-black text-4xl"><%= moeda(@total) %></p>
<p class="text-gray-500 text-xs mt-1"><%= @classificacoes.size %> entregas classificadas</p> <p class="text-gray-500 text-xs mt-1"><%= @classificacoes.map(&:tracking_id).uniq.size %> entregas classificadas (<%= @classificacoes.size %> pilares)</p>
</div> </div>
<%# Detalhe das classificações %> <%# Detalhe das classificações %>