diff --git a/README.md b/README.md index 22e187d..a9c438d 100644 --- a/README.md +++ b/README.md @@ -635,3 +635,60 @@ Aplicar com: `docker-compose exec app bundle exec rails db:migrate` ### 📌 Padrão (novo) - **PDFs com Prawn**: usar **sempre** a fonte TTF registrada no `BasePdf` (DejaVu, UTF-8). Nunca contar com a fonte embutida — ela quebra em qualquer caractere fora do Windows-1252. + +--- + +## 🆕 Atualização 19/06/2026 — Apontamento manual / Nota avulsa + +Permite incluir numa consolidação uma **entrega que chegou por fora** (ex.: nota que entrou +depois e não está no banco mensal das operações). O usuário digita o **número da nota (NF = +`reference_id`)**, o sistema busca os dados direto na `db_reem_simplerout_2026` (atualizada a cada +hora pela SimpleRoute) e adiciona a entrega ao fechamento do motorista. + +> A tabela externa continua **read-only** — o apontamento só **lê** dela (`Entrega.por_nf`, +> sem filtro de período, restrito à conta Gade via `da_conta_gade`). + +### 🆕 Funcionalidades +- **Apontamento dentro de uma consolidação existente** (wizard Passo 1): botão **"➕ Apontamento + manual"** → modal busca a NF → confere os dados (motorista/veículo/data) → escolhe **um ou + vários pilares** (Normal/Retirada/Bônus/Desconto) → adiciona. +- **"Nota avulsa"** (tela de Consolidações): botão **"➕ Nota avulsa"** → busca a NF → ao + prosseguir **cria já a consolidação** (nome `Avulsa nf`, período = data da entrega → fim do + mês, motorista vindo do `driver` da entrega) com o apontamento, e abre a tela da consolidação. +- **Múltiplas classificações** por apontamento: cria um pilar (`ConsolidacaoEntrega`) por tipo + escolhido, somando os valores (mesmo modelo multi-pilar das entregas normais). +- **Motorista automático**: vem do `driver` da entrega; se ainda não estiver na consolidação, é + incluído. +- **Gestão na tela da consolidação (show)**: seção **"➕ Apontamentos manuais"** lista NF, + motorista, pilares e valor, com botão de **remover** (a nota inteira). Na revisão (Passo 3) os + apontamentos aparecem com o selo **"➕ Apontamento"** e botão de remover (por pilar). + +### ⚙️ Como funciona (técnico) +- Coluna **`manual` (boolean, default false)** em `consolidacao_entregas` distingue apontamento de + entrega elegível do período. `Consolidacao#classificadas_count` ignora os `manual: true` para + **não estourar a barra de progresso** nem o gate de finalização (`>= 100%`). +- Lógica centralizada em **`Consolidacao#adicionar_apontamento!(entrega, tipos, user)`** e + **`Consolidacao#recalcular_motorista!`** — reusadas pelos dois fluxos (wizard e avulsa). Preço por + pilar via `ConsolidacaoEntrega.valor_para(tipo)` (fonte única). Dados da entrega via + `Entrega#resumo_apontamento`. +- Rotas novas: + - `consolidacoes` (coleção): `GET buscar_nf` (JSON), `POST avulsa`. + - `consolidacao_entregas` (coleção): `GET buscar_nf`, `POST apontar`, `DELETE remover_apontamento` + (aceita `?id=` para um pilar ou `?tracking_id=&motorista=` para a nota toda). +- Stimulus: `apontamento_controller.js` (modal do wizard) e `nota_avulsa_controller.js` (modal da + index). ⚠️ Identificador do Stimulus segue o nome do arquivo em **dash-case**: `nota_avulsa_controller.js` + → `data-controller="nota-avulsa"` / `data-action="nota-avulsa#..."` (e o elemento da ação precisa + estar **dentro** da `div` do controller). + +### 🆕 Migration adicionada (rodar `db:migrate`) +``` +20260619000001_add_manual_to_consolidacao_entregas.rb +``` + +```bash +docker-compose exec app bundle exec rails db:migrate +``` + +### 🧪 Testes +- `spec/models/consolidacao_spec.rb`: `classificadas_count` ignora apontamentos manuais e + `adicionar_apontamento!` (multi-tipo, idempotente, inclui o motorista e soma o valor).