<%# app/views/admin/romaneios/index.html.erb %>

Romaneio de entrega

Monta o "CONTROLE DE ENTREGA" — uma folha por veículo, assinada pelo motorista na retirada

<%= render 'shared/flash' %>
ℹ️

A coluna APARELHO é marcada sozinha para quem está como NOVO na operação do mês, e o telefone vem da própria operação — não é preciso subir uma segunda planilha. Tudo continua editável na tela antes de imprimir.

<%# Logo do cabeçalho — zona "Arquivos" do programa original. Fica ANTES da importação porque é configuração que vale para todos os romaneios, não escolha por plano: quem troca de contratante troca uma vez. %>
<%= form_with url: atualizar_logo_admin_romaneios_path, method: :post, multipart: true, data: { turbo: false }, class: 'flex flex-col sm:flex-row sm:items-end gap-3' do %>

Em uso: <%= @logo_atual.presence || 'logo-gade.png (padrão)' %>

<%# O logo está configurado mas o ARQUIVO sumiu do disco. Antes isto era mudo: a tela dizia o nome do logo novo e o PDF saía com o antigo. Agora aparece aqui, que é onde a pessoa está olhando quando troca. %> <% if @logo_problema == :sumiu %>

O arquivo deste logo não está mais no servidor — os PDFs estão saindo com o logo padrão. Envie o arquivo de novo.

<% end %>

PNG ou JPG, até 2 MB — é o que o PDF consegue embutir. Vale para os próximos PDFs gerados.

<% end %>
<%# Importação %>

Importar plano

<%# UM formulário com DUAS actions: "Buscar no SimpliRoute" usa a action do
e "Enviar planilha" a troca por `formaction`, para não repetir data, operação e rótulo em dois formulários que sairiam de sincronia. `authenticity_token: form_authenticity_token` é o que faz o segundo botão funcionar. Com `load_defaults 7.1` o Rails liga `per_form_csrf_tokens`: o token embutido vale só para o par (action, method) do , então o POST que o `formaction` manda para /importar_planilha era recusado SEMPRE, com a tela "A ação foi recusada por uma verificação de segurança" e volta ao início — enquanto o botão de buscar, na action original, passava. O helper sem argumentos devolve o token GLOBAL, válido para as duas actions. %> <%# ── Período dos planos ──────────────────────────────────────────────── Form SEPARADO e em GET: filtra a LISTA de planos, não importa nada. Fica antes do formulário de importação porque é o que se mexe primeiro quando o plano procurado não está entre os 5. Por que período e não data: período é aproximado por natureza — "agosto" a pessoa sabe; "20/08" ela não sabia, e era esse chute que a tela veio eliminar. É também o recorte que a própria tela do SimpliRoute usa, então não há tradução a fazer entre as duas. %> <%= form_with url: admin_romaneios_path, method: :get, class: 'flex flex-wrap items-end gap-3 mb-4 pb-4 border-b border-white/5' do %>
<%# Rótulo que diz o que o controle FAZ (diretriz 2): limpa o período e devolve os 5 mais recentes — não "limpa a tela". %> <% if @planos_filtrados %> <%= link_to 'Voltar aos 5 mais recentes', admin_romaneios_path, class: 'px-4 py-2.5 text-gray-400 hover:text-white border border-[#2a2a2a] rounded-xl min-h-[48px] inline-flex items-center whitespace-nowrap' %> <% end %> <% end %> <%= form_with url: admin_romaneios_path, method: :post, multipart: true, authenticity_token: form_authenticity_token, data: { turbo: false }, class: 'space-y-4' do %>
<%# ── Plano ──────────────────────────────────────────────────────── Antes aqui se pedia a DATA do plano, e era o passo que mais errava: o operador pensa por operação ("lançou a UBS Sudeste"), e a data nem estava ao alcance dele — o plano tem uma JANELA e o dia das rotas ora é o começo dela, ora o fim (EMAD SETEMBRO 2026 vai de 31/08 a 08/09 e roda em 31/08; UBS OESTE AGOSTO vai de 18 a 20/08 e roda em 20/08). Agora ele escolhe pelo NOME e quem descobre o dia é a API. Cinco planos porque a ferramenta é usada logo depois de lançar uma operação — o que ele quer está sempre entre os últimos. A lista vazia (API fora, token vencido) NÃO tranca a tela: cai no campo de data, que é o comportamento antigo inteiro. %>
<% if @planos.present? %>

<% if @planos_filtrados %> <%= pluralize(@planos.size, 'plano', plural: 'planos') %> no período. <% else %> Os 5 mais recentes. O dia é descoberto pelo plano. <% end %>

<% else %>

<% if @planos_filtrados %> Nenhum plano nesse período — amplie a faixa ou limpe o filtro. <% else %> Não consegui listar os planos do SimpliRoute agora — informe a data. <% end %>

<% end %> <%# A data solta só aparece quando NÃO há lista de planos: ela é a rede para a API fora do ar, e voltar a oferecê-la de graça reintroduziria justamente o chute que esta tela existe para eliminar. Para alcançar um plano antigo o caminho é o filtro de período, logo abaixo. %> <% if @planos.blank? %> <% end %>

<% if @planos.present? %> Em branco, usa o nome do plano escolhido — é por ele que a operação do mês (quem é NOVO) é encontrada. Preencha só para imprimir um texto diferente no canto do PDF. <% else %> Cole o nome do plano como está no SimpliRoute — é por ele que a operação do mês (quem é NOVO) é encontrada. <% end %>

<%# Reserva: o plano do dia pode ainda não estar publicado. %>
Ou enviar a planilha do plano (.xlsx)

Use quando o plano do dia ainda não estiver publicado no SimpliRoute. O arquivo é lido na hora e não fica guardado no sistema.

<% end %>
<%# Romaneios já importados %>
<% if @romaneios.empty? %>

Nenhum romaneio ainda.

Escolha a data do plano acima e clique em “Buscar no SimpliRoute”.

<% else %> <% @romaneios.each do |r| %> <% end %>
Data Plano Operação Veículos Origem
<%= l r.planned_date, format: '%d/%m/%Y' %> <%= r.rotulo_plano.presence || '—' %> <%= r.operacao_label || '—' %> <%= r.romaneio_veiculos.size %> <%= r.origem %> <%= link_to rotulo(:editar, 'Abrir'), admin_romaneio_path(r), class: 'text-orange-400 hover:text-orange-300 font-medium' %> <%# button_to em BLOCO: sem bloco ele vira , que não aceita o SVG do ícone dentro (ver ApplicationHelper#rotulo). %> <%= button_to admin_romaneio_path(r), method: :delete, form: { data: { turbo_confirm: 'Excluir este romaneio e todas as edições feitas nele?' }, class: 'inline-block ml-3' }, class: 'text-gray-500 hover:text-red-400' do %> <%= icone :excluir, cor: nil %> Excluir <% end %>
<% end %>