From e001a48e1a15247eef4becf984d1588d8edc439cc4cbce0f8d206ef765754d3d Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 13 Jul 2026 19:12:07 -0300 Subject: [PATCH] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20READ.me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/README.md b/README.md index cca1391..4bd433c 100644 --- a/README.md +++ b/README.md @@ -1414,3 +1414,78 @@ visitas por tipo de material. +--- + +
+🆕 Atualização 13/07/2026 — Planilha da Operação (página + Excel do cliente), dashboard e correções + +### 📋 Planilha da Operação — página própria (`/dashboard/operacoes/planilha`) +Tabela **espelho da planilha da operação** (uma linha por NF) para pesquisar e acompanhar +ocorrências/status, acessada pelo botão **"📋 Planilha da operação"** no Dashboard de Operações +(o botão leva junto o contexto atual: operação/modo Global, período e cross-filters ativos). +- Colunas: Data, NF, Destinatário (endereço no tooltip), Unidade STS, Motorista, Veículo, + **Resultado** (badge Entregue/Falha/Pendente), **Ocorrência** (motivo do insucesso) e status + gade (RECORRENTE/NOVO). No modo Global aparece também a coluna Operação. +- **Busca textual server-side** (param `q`, qualquer campo) + **paginação server-side** + (param `pg`, 15/página, janela `« 1 … 7 8 9 … 42 »`) — aguenta as milhares de linhas do Global. +- Alternância 🏥 Operação / 🌐 Global, seletor de operação (auto-submit) e chips removíveis dos + filtros herdados. Reusa as linhas do `Analytics::OperacaoMetricas` (novo método `#buscar`) — + **nenhuma query nova**. +- Arquivos: rota `operacoes_planilha`, action `planilha` + `montar_tabela_espelho` + (`OperacoesDashboardController`), views `planilha.html.erb` + `_espelho.html.erb`. + +### ⬇️ Download do Excel do cliente — planilha Entregas preenchida +Botão **"⬇️ Baixar Excel preenchido"** na página da planilha: gera o `.xlsx` no formato do modelo +**"Entregas SUDESTE MM.AAAA_FINAL"** com as **3 abas, 1:1** — automatiza o preenchimento que era +feito manualmente para entregar ao cliente. +- **RESUMO** — mês, Total Previsto/Realizado/Performance e os quadros **EMAD** e **UBS** por + coordenadoria (CRS fixas do modelo) com **motivos de "Não Entregue"** (Óbito, Responsável + Ausente, Endereço não localizado, Recusa, Paciente não reside, Outros) classificados a partir + da `observation` do rastreio; linhas Total e Performance %. +- **ENTREGAS** — colunas A–V da própria tabela `gade_entregas_*` (ordem física de importação = + ordem da planilha original) + **W–Z preenchidas pelo rastreio**: STATUS, ENTREGA (Sim/Não), + DATA OCORRÊNCIA (data real do checkout) e OCORRÊNCIA — último status de cada NF (mesma CTE + `ROW_NUMBER` dos painéis). +- **SimpliRoute** — dump cru do rastreio com as **46 colunas exatas** do export original + (todas as visitas das NFs da operação, incluindo repetidas). +- **Estilo idêntico ao modelo** (cores extraídas do `styles.xml` do próprio arquivo): cabeçalho + ENTREGAS azul `1155CC` (A–T) + vermelho `C00000` (U–Z), quadros do RESUMO em + `002060`/`0070C0`/`C00000`/`A5A5A5`, status verde/laranja/azul, títulos 16pt, performance em + itálico %, cabeçalhos mesclados. Validado offline com caxlsx + LibreOffice. +- Arquivos: `Analytics::PlanilhaEntregas` (dados) + `Analytics::PlanilhaEntregasXlsx` (binário, + caxlsx), rota `operacoes_planilha_baixar`, action `baixar_planilha`. +- ⚠️ **Ressalvas:** nomes de coluna das tabelas `gade_entregas_*`/rastreio foram deduzidos com + fallback seguro (coluna inexistente sai **vazia**, sem quebrar o layout) — conferir o primeiro + download real e ajustar `COLUNAS_GADE`/`RASTREIO_COLUNAS` se algo sair em branco. Os 2 + **gráficos embutidos** do RESUMO não são replicados. "Conferência Documentos" é controle + manual (sai "A iniciar"). + +### 📊 Dashboard financeiro +- **Paginação nas tabelas de pagamentos** ("realizados" e "pendentes"): 10 linhas/página com + abas e contador ("1–10 de 47"), client-side (função genérica `paginarTabela`); some com ≤10 itens. +- **Novo gráfico "Pagamentos por dia"** abaixo da "Evolução do custo": barras verdes com o valor + pago por data de pagamento (`pago_em`) + linha tracejada do **acumulado** — o fluxo de caixa, + que não existia em nenhuma tela (`build_grafico_pagamentos`). Quando não há pagamento no + período mostra estado vazio (💸 + valor aguardando pagamento) em vez de gráfico zerado. + > Iterações descartadas no caminho: "Entregas por dia" (redundante — valor = qtd × preço fixo) + > e "Resultado por dia" (já existe na tela de Operações). +- O card dos gráficos virou `flex-col` e preenche toda a altura ao lado do ranking de motoristas + (sumiu o vazio embaixo da linha). + +### 🔴 Correções +- **"Rodapé quebrado" no celular:** era uma **barra de rolagem horizontal** (laranja) colada no + rodapé — a legenda dos gráficos não quebrava linha e estourava ~37px a largura em telas + <~430px. ✅ Cabeçalhos/legendas dos gráficos com `flex-wrap` + **`overflow-x-hidden` no + ``** (rede de segurança; tabelas largas continuam rolando nos próprios contêineres + `overflow-x-auto`). + +### 📌 Padrões (reforçados) +- Tabelas externas sempre read-only, nome de tabela via whitelist + `quote_table_name`, colunas + em whitelist fixa com fallback NULL (padrão `OperacaoMetricas`/`PlanilhaCarga`). +- Excel com `caxlsx` (mesmo padrão da planilha de carga SimpliRoute): serviço de linhas + + serviço de binário + `send_data` no controller. + +> **Sem migration.** Deploy normal; em produção reiniciar o Puma após o deploy. + +
+