%# app/views/dashboard/index.html.erb %>
<%# Fase 3: Dashboard com cards, gráfico Chart.js e cálculo ao vivo %>
<%# Não cachear no Turbo: o snapshot congelava o gráfico/calendário (DOM já
<%# alterado pelo JS, sem reexecutar scripts) e só voltava com F5. %>
<% content_for :head do %>
<%# Flatpickr — CSS no
(evita flash sem estilo) + tema escuro oficial %>
<% end %>
<%# Quick-ranges no formato YYYY-MM-DD para os atalhos do filtro %>
<% hoje = Date.current %>
<% atalhos = {
'Hoje' => [hoje, hoje],
'7 dias' => [hoje - 6, hoje],
'Este mês' => [hoje.beginning_of_month, hoje],
'30 dias' => [hoje - 29, hoje]
} %>
<%# Filtro de calendário — seleciona uma faixa de datas %>
<%# CARDS GRANDES — KPIs
auto-fit + minmax em vez de `xl:grid-cols-5`: o breakpoint xl olha a JANELA
(1280px), mas com a sidebar aberta sobram ~960px de conteúdo — 5 colunas de
~176px, e "R$ 82.692,00" em text-4xl era cortado pelo overflow-hidden do
card. Com auto-fit o número de colunas cai sozinho quando o menu está
aberto e sobe quando ele é recolhido, sem depender de breakpoint. %>
<%# Card 1: Valor estimado — sempre 2 faixas: é o maior número da tela %>
<%= icone :dinheiro, cor: nil, espaco: false %> Valor Estimado
<%# break-words: se ainda faltar espaço, quebra a linha em vez de cortar %>
<%= moeda(@valor_estimado) %>
<%# "Atendidas" = concluídas + falhadas (motorista foi ao local e fechou
a visita). É a mesma base que a consolidação paga, por isso o rótulo
NÃO pode voltar a dizer "concluídas": o valor acima inclui as falhas. %>
<%# Card destacado: total consolidado e pago (consolidações finalizadas do período) %>
<% if @ver_financeiro %>
<%= icone :consolidado_pago, espaco: false %> Consolidado / Pago
<%= moeda(@fin_custo_total) %>
consolidado no período
<%= moeda(@fin_pago) %>pago
<% end %>
<%# Card 2: Total de entregas %>
<%= icone :consolidacoes, espaco: false %> Total Entregas
<%= @total_entregas %>
<%= @entregas_pagas %> entregues·
<%# Clicável: leva à lista das entregas em aberto, no MESMO recorte do card
(período + filtro de operação). O número existia sem nenhuma tela por trás. %>
<%= link_to "#{@entregas_pendentes} pendentes",
dashboard_pendentes_path(inicio: @periodo_inicio.strftime('%Y-%m-%d'),
fim: @periodo_fim.strftime('%Y-%m-%d'),
operacoes: @operacao_filtro.presence),
data: { turbo: false },
title: 'Ver quais são as entregas em aberto',
class: 'text-yellow-500 underline decoration-dotted underline-offset-4 hover:text-yellow-300' %>
·<%= @entregas_falhadas %> falhadas
<%# Conta VISITAS (é por ida ao local que o motorista recebe). O dashboard
de Operações conta NOTAS — a diferença são retentativas da mesma NF. %>
<%# KPIs FINANCEIROS (consolidações finalizadas, já com filtro de operação) %>
<% if @ver_financeiro %>
<%= icone :dinheiro, espaco: false %> Custo total
<%= moeda(@fin_custo_total) %>
<%= @fin_qtd_entregas %> entregas classificadas
<%= icone :ticket, espaco: false %> Ticket médio
<%= moeda(@fin_ticket_medio) %>
por entrega
<%= icone :sucesso, cor: 'text-green-500', espaco: false %> Pago
<%= moeda(@fin_pago) %>
já confirmado
<%= icone :relogio, cor: 'text-amber-400', espaco: false %> A pagar
<%= moeda(@fin_pendente) %>
pendente
<% end %>
<%# GRÁFICO + MOTORISTAS (lado a lado no desktop) %>
<%# Gráficos diários (Chart.js) — flex-col p/ preencher a altura do card de motoristas %>
Evolução do custo
Valor estimado por dia no período<%= ' · operação filtrada' if @operacao_filtro.present? %>
Valor (R$)
<%# Pagamentos por dia (fluxo de caixa) — quando o dinheiro saiu de fato.
É valor pago: fica atrás da mesma permissão dos demais blocos de custo. %>
<% if @ver_financeiro %>
<%# Top motoristas — DUAS ABAS sobre o mesmo ranking:
• Estimado = entregas atendidas × preço da entrega (mesma base do card
laranja do topo).
• Consolidado = o que foi REALMENTE fechado nas consolidações do período,
já com bônus/desconto/retirada aplicados, e a quantidade
exata de entregas que entrou no fechamento.
Os dois números divergem DE PROPÓSITO: o estimado cobre tudo que foi
atendido no período; o consolidado, só o que já entrou em consolidação
finalizada. Por isso cada aba diz de onde vem o seu número. %>
<%= icone :ranking, espaco: false %> Motoristas
<%# Mesmas pílulas da paginação de pagamentos (as classes estão duplicadas
no JS que troca a aba — mexeu aqui, mexa lá). %>
<%# Flatpickr — date range picker (JS via CDN; CSS já carregado no ) %>
<%# Paginação client-side das tabelas de pagamentos (10 por página) %>
<%# Abas do ranking de motoristas (Estimado × Consolidado) %>
<%# Filtro de operação — submete o form ao marcar/desmarcar %>
<%# Chart.js via CDN %>
<%# Fluxo de pagamentos: barras (pago no dia) + linha (acumulado no período).
Sem permissão de financeiro os dados não são carregados — o script sai fora. %>
<% if @ver_financeiro %>
<%# Rosca de pagamentos (pago x a pagar, por valor) — mesmo bloco de permissão. %>
<% end %>
<%# ── Gráficos financeiros por operação ───────────────────────
Sem a permissão de financeiro os dados nem chegam à página: o controller não
carrega, e este script inteiro fica de fora do HTML. %>
<% if @ver_financeiro %>
<% end %>