<%# 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] } %>
<%# 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 %>
📅
<%# Atalhos rápidos de período %>
<% atalhos.each do |label, (ini, fim)| %> <% ativo = @periodo_inicio == ini && @periodo_fim == fim %> <%= link_to label, dashboard_path(inicio: ini.strftime('%Y-%m-%d'), fim: fim.strftime('%Y-%m-%d'), operacoes: @operacao_filtro), data: { turbo: false }, class: "px-3 py-2.5 rounded-xl text-sm whitespace-nowrap border #{ativo ? 'bg-orange-500 text-black border-orange-500 font-bold' : 'bg-[#1a1a1a] text-gray-300 border-white/10 hover:border-orange-500'}" %> <% end %>
<%# Filtro de operação — multi-seleção; submete o form ao mudar %> <% if @operacoes.any? %>
🗂️ <%= @operacao_filtro.present? ? "#{@operacao_filtro.size} operação(ões)" : 'Todas as operações' %>
<%# Limpar seleção — recarrega o dashboard sem filtro de operação %>
Operações <% if @operacao_filtro.present? %> <%= link_to '✕ Limpar', dashboard_path(inicio: @periodo_inicio.strftime('%Y-%m-%d'), fim: @periodo_fim.strftime('%Y-%m-%d')), data: { turbo: false }, class: 'text-xs text-orange-400 hover:text-orange-300 font-semibold' %> <% end %>
<% @operacoes_agrupadas.each do |titulo, ops| %>

<%= titulo %>

<% ops.each do |op| %> <% end %> <% end %>
<% end %> <%# Imprimir relatório financeiro do período/operação atuais %> <%= link_to '🖨️ Relatório', dashboard_relatorio_financeiro_path( inicio: @periodo_inicio.strftime('%Y-%m-%d'), fim: @periodo_fim.strftime('%Y-%m-%d'), operacoes: @operacao_filtro), data: { turbo: false }, class: 'pl-4 pr-4 py-2.5 bg-orange-500 hover:bg-orange-600 text-black font-bold rounded-xl text-sm whitespace-nowrap' %>
<%# CARDS GRANDES — KPIs %>
<%# Card 1: Valor estimado %>

💰 Valor Estimado

<%= moeda(@valor_estimado) %>

<%= @entregas_pagas %> entregas concluídas

<%# Card destacado: total consolidado e pago (consolidações finalizadas do período) %>

💼 Consolidado / Pago

<%= moeda(@fin_custo_total) %>

consolidado no período

<%= moeda(@fin_pago) %> pago
<%# Card 2: Total de entregas %>

📦 Total Entregas

<%= @total_entregas %>

<%= @entregas_pagas %> entregues · <%= @entregas_pendentes %> pendentes · <%= @entregas_falhadas %> falhadas
<%# 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 %>

🏆 Motoristas

<% if @motoristas.any? %>
<% @motoristas.each_with_index do |m, i| %>
<%= i + 1 %>
<%= m[:nome] %> <%= moeda(m[:valor]) %>
<%# Barra de progresso %>
<% max = @motoristas.first[:entregas].to_f %>
<%= m[:entregas] %> entregas
<% end %>
<% else %>
🚚

Nenhuma entrega concluída 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 %>
🏷️

Sem dados no período

<% end %>
<%# Composição por tipo (rosca) %>

🧩 Composição do custo

Por tipo de lançamento

<% if @fin_por_tipo.any? %>
<% else %>
🧩

Sem dados no período

<% end %>
<%# Custo por motorista (barra) %>

👤 Custo por motorista

Por motorista no período

<% if @fin_por_motorista.any? %>
<% else %>
👤

Sem dados no período

<% 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? %>
<% @pagamentos_feitos.each do |cm| %> <% end %>
Pago em Motorista Consolidação Forma Valor
<%= 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) %>
<% else %>

Nenhum pagamento realizado neste período.

<% end %>
<%# Pendentes (consolidações finalizadas do período sem pagamento) %>

🕗 Pagamentos pendentes

<% if @pagamentos_pendentes.any? %>
<% @pagamentos_pendentes.each do |cm| %> <% end %>
Motorista Consolidação Valor
<%= cm.motorista_nome %> <%= link_to cm.consolidacao.nome, consolidacao_path(cm.consolidacao), class: 'text-gray-300 hover:text-orange-500' %> <%= moeda(cm.valor_total) %>
<% 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 (JS via CDN; CSS já carregado no ) %> <%# Filtro de operação — submete o form ao marcar/desmarcar %> <%# Chart.js via CDN %> <%# Rosca de pagamentos (pago x a pagar, por valor) %> <%# ── Gráficos financeiros por operação ─────────────────────── %>