%# 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 %>
<% end %>
<%# Header + filtro por faixa de datas %>
Dashboard
<%= @periodo_inicio.strftime('%d/%m/%Y') %> – <%= @periodo_fim.strftime('%d/%m/%Y') %>
· Atualizado às <%= Time.now.strftime('%H:%M') %>
<%# Filtro de calendário — seleciona uma faixa de datas %>
<%# CARDS GRANDES — KPIs %>
<%# Card 1: Valor estimado %>
💰 Valor Estimado
<%= moeda(@valor_estimado) %>
<%= @entregas_pagas %> entregas pagas
<%# Card 2: Total de entregas %>
📦 Total Entregas
<%= @total_entregas %>
<%= @entregas_pagas %> pagas
·
<%= @entregas_pendentes %> pendentes
<%# Card 3: Consolidações %>
📋 Consolidações
<%= @consolidacoes_mes.count %>
<%= @consolidacoes_abertas %> abertas
·
<%= @consolidacoes_fechadas %> fechadas
<%# Card 4: Motoristas ativos %>
🚗 Motoristas
<%= @motoristas.count %>
com entregas no período
<%# KPIs FINANCEIROS (consolidações finalizadas, já com filtro de operação) %>
💰 Custo total
<%= moeda(@fin_custo_total) %>
<%= @fin_qtd_entregas %> entregas classificadas
🎫 Ticket médio
<%= moeda(@fin_ticket_medio) %>
por entrega
✅ Pago
<%= moeda(@fin_pago) %>
já confirmado
🕗 A pagar
<%= moeda(@fin_pendente) %>
pendente
<%# GRÁFICO + MOTORISTAS (lado a lado no desktop) %>
<%# Gráfico de linha diário (Chart.js) %>
Evolução do custo
Valor estimado por dia no período<%= ' · operação filtrada' if @operacao_filtro.present? %>
Valor (R$)
<%# Top motoristas %>
🏆 Top Motoristas
<% if @motoristas.any? %>
<% @motoristas.each_with_index do |m, i| %>
<%= i + 1 %>
<%= m[:nome].split.first %>
<%= moeda(m[:valor]) %>
<%# Barra de progresso %>
<% max = @motoristas.first[:entregas].to_f %>
<%= m[:entregas] %> entregas
<% end %>
<% else %>
🚚
Nenhuma entrega paga neste período
<% end %>
<%# ── FINANCEIRO POR OPERAÇÃO ───────────────────────────── %>
<%# Custo por operação (barra) %>
🏷️ Custo por operação
Valor consolidado no período
<% if @fin_por_operacao.any? %>
<% else %>
<% end %>
<%# Composição por tipo (rosca) %>
🧩 Composição do custo
Por tipo de lançamento
<% if @fin_por_tipo.any? %>
<% else %>
<% end %>
<%# Custo por motorista (barra) %>
👤 Custo por motorista
Top 10 no período
<% if @fin_por_motorista.any? %>
<% else %>
<% end %>
<%# ── PAGAMENTOS (pago x pendente) ──────────────────────── %>
<%# Rosca pago vs a pagar (por valor) %>
💵 Pagamentos
Pagos por data de pagamento · pendentes no período
<% if (@pag_pago_qtd + @pag_pend_qtd).zero? %>
🧾
Nenhum pagamento ou pendência no período
<% else %>
● Pago no período
<%= moeda(@pag_pago_valor) %> · <%= @pag_pago_qtd %> pagamento(s)
● A pagar
<%= moeda(@pag_pend_valor) %> · <%= @pag_pend_qtd %> motorista(s)
<% end %>
<%# Tabelas: pagamentos realizados (com data) + pendentes %>
<%# Pagamentos realizados no período (filtrados por pago_em) %>
✅ Pagamentos realizados no período
<% if @pagamentos_feitos.any? %>
| Pago em |
Motorista |
Consolidação |
Forma |
Valor |
<% @pagamentos_feitos.each do |cm| %>
| <%= l cm.pago_em.to_date, format: :short %> |
<%= cm.motorista_nome %> |
<%= link_to cm.consolidacao.nome, consolidacao_path(cm.consolidacao),
class: 'text-gray-300 hover:text-orange-500' %>
|
<%= cm.forma_pagamento&.humanize || '—' %> |
<%= moeda(cm.valor_total) %> |
<% end %>
<% else %>
Nenhum pagamento realizado neste período.
<% end %>
<%# Pendentes (consolidações finalizadas do período sem pagamento) %>
🕗 Pagamentos pendentes
<% if @pagamentos_pendentes.any? %>
| Motorista |
Consolidação |
Valor |
<% @pagamentos_pendentes.each do |cm| %>
| <%= cm.motorista_nome %> |
<%= link_to cm.consolidacao.nome, consolidacao_path(cm.consolidacao),
class: 'text-gray-300 hover:text-orange-500' %>
|
<%= moeda(cm.valor_total) %> |
<% end %>
<% else %>
Nenhuma pendência no período. 🎉
<% end %>
<%# Por operação %>
<% if @por_operacao.any? %>
🏥 Entregas por Local
<% total_op = @por_operacao.values.sum.to_f %>
<% @por_operacao.each do |local, qtd| %>
<%= qtd %>
<%= local.to_s.truncate(20) %>
<%= ((qtd / total_op) * 100).round %>%
<% end %>
<% end %>
<%# Flatpickr — date range picker (CDN, mesmo padrão do Chart.js) %>