diff --git a/README.md b/README.md index 81d1a81..78def01 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ docker-compose down # parar tudo | **4** | ✅ Concluída | Job Whenever (1h) + HistoricoEstimado + AuditoriaLog + API métricas | | **5** | ✅ Concluída | Nova Consolidação + filtros + Wizard Passo 1 | | **6** | ✅ Concluída | Toggles coloridos + ações em massa + Wizard Passos 2 e 3 (Stimulus) | -| **7** | ✅ Concluída | PDFs Prawn: relatório + holerite com QR code + modal preview | +| **7** | ✅ Concluída | PDFs Prawn: relatório + extrato com QR code + modal preview | | **8** | ✅ Concluída | Painel motorista + login PIN/QR + notificações WhatsApp/email | **🎉 PROJETO: 8 de 8 fases implementadas.** @@ -197,7 +197,7 @@ As Fases 2/3 (commit `4724847`) foram desenvolvidas em paralelo às Fases 4-8 (c - Seeds dos 3 motoristas de teste (João/1234, Maria/5678, Carlos/9012) restaurados — tinham sido sobrescritos ### ⚠️ Observação sobre login PIN duplicado -Existem **dois fluxos de login por PIN** funcionais: a aba PIN na tela Devise (`/auth/login`, Fase 2) e a tela dedicada (`/motorista/login`, Fase 8 — usada pelo QR Code do holerite). Ambos usam `pin_code` e funcionam; recomenda-se manter os dois (a tela dedicada é melhor para mobile) ou unificar futuramente. +Existem **dois fluxos de login por PIN** funcionais: a aba PIN na tela Devise (`/auth/login`, Fase 2) e a tela dedicada (`/motorista/login`, Fase 8 — usada pelo QR Code do extrato). Ambos usam `pin_code` e funcionam; recomenda-se manter os dois (a tela dedicada é melhor para mobile) ou unificar futuramente. ### 📂 Arquivos das Fases 4, 5 e 6 @@ -248,10 +248,10 @@ Gemfile # + rqrcode, chunky_png db/migrate/20260101000009_add_login_token_to_users.rb # token para QR — rodar db:migrate! app/services/pdf/base_pdf.rb # layout base: cabeçalho preto/laranja + rodapé app/services/pdf/relatorio_motorista_pdf.rb # tabela detalhada de entregas + resumo + total -app/services/pdf/holerite_pdf.rb # estilo contracheque + QR Code de login rápido -app/controllers/consolidacoes_controller.rb # ATUALIZADO: gerar_pdf_relatorio/gerar_pdf_holerite/preview_holerite +app/services/pdf/extrato_pdf.rb # estilo contracheque + QR Code de login rápido +app/controllers/consolidacoes_controller.rb # ATUALIZADO: gerar_pdf_relatorio/gerar_pdf_extrato/preview_extrato app/views/consolidacoes/show.html.erb # botões por motorista + modal de preview -app/views/consolidacoes/preview_holerite.html.erb # preview HTML antes de confirmar o PDF +app/views/consolidacoes/preview_extrato.html.erb # preview HTML antes de confirmar o PDF app/models/user.rb # ATUALIZADO: regenerar_login_token! ``` Soft delete já implementado: consolidações finalizadas vão para "arquivada", nunca são excluídas. @@ -262,7 +262,7 @@ Gemfile # + twilio-ruby app/controllers/motorista/sessoes_controller.rb # login PIN 4 dígitos + acesso via QR (/motorista/acesso/:token) app/controllers/motorista/dashboard_controller.rb # 2 cards: estimado (mês) + consolidado (finalizadas) app/views/motorista/sessoes/new.html.erb # teclado numérico gigante mobile-first (envia no 4º dígito) -app/views/motorista/dashboard/index.html.erb # cards laranja/branco + lista com download do próprio holerite +app/views/motorista/dashboard/index.html.erb # cards laranja/branco + lista com download do próprio extrato app/services/notificacao_service.rb # WhatsApp (Twilio) + email — falha nunca quebra a finalização app/mailers/application_mailer.rb app/mailers/consolidacao_mailer.rb # pagamento_fechado @@ -279,18 +279,18 @@ config/routes.rb # ATUALIZADO: /motorista/log **Fluxo do motorista (público de baixo nível técnico):** - Acessa `/motorista/login` → digita PIN de 4 números num teclado gigante (envia sozinho no 4º dígito) -- OU escaneia o QR Code impresso no holerite → entra direto sem digitar nada +- OU escaneia o QR Code impresso no extrato → entra direto sem digitar nada - Vê 2 cards: 🟧 valor estimado do mês ("aproximado") e ⬜ valor fechado para pagamento -- Baixa o próprio holerite das consolidações finalizadas +- Baixa o próprio extrato das consolidações finalizadas ### 🧪 Teste end-to-end sugerido 1. Login admin → criar consolidação (nome + período + motoristas) 2. Wizard Passo 1 → escolher motorista → Passo 2: classificar entregas com os toggles 3. Usar "Marcar todos como Normal" → Passo 3: revisar → próximo motorista 4. Com tudo classificado → Finalizar (motoristas notificados) -5. Na tela da consolidação → "Ver antes de gerar" → Confirmar → baixar Holerite PDF +5. Na tela da consolidação → "Ver antes de gerar" → Confirmar → baixar Extrato PDF 6. Logout → `/motorista/login` → entrar com PIN do motorista -7. Conferir cards de valores → baixar próprio holerite → sair +7. Conferir cards de valores → baixar próprio extrato → sair ### ▶️ Próximos passos (deploy) @@ -423,13 +423,13 @@ docker-compose exec app bundle exec rake reem:diagnostico INICIO=2026-02-01 FIM= - **Dashboard travava ao voltar (só com F5):** era o cache de preview do Turbo servindo um snapshot congelado. Adicionado `turbo-cache-control: no-cache` na página e o gráfico Chart.js virou idempotente (`Chart.getChart(ctx)?.destroy()`). - **500 ao criar motorista:** `users.email` era `NOT NULL` com índice único e default `""` — o 2º motorista sem e-mail colidia em `""` (`RecordNotUnique`). Agora a coluna permite `NULL` e e-mail em branco vira `nil` (`User#normalizar_email_em_branco`); no Postgres vários `NULL` convivem no índice único. - **500 ao gerar relatório PDF** (`gerar_pdf_relatorio`): `@entregas.group(:tipo).count` com `.order(:created_at)` gerava `GROUP BY ... ORDER BY created_at` → `PG::GroupingError`. Corrigido com `reorder(nil)`. Também removidas as opções `color:` passadas ao `Prawn#text` (não suportadas — uso de `fill_color`). -- **Motorista não baixava o próprio holerite** ("sem permissão"): `ConsolidacaoPolicy#show?` exige `pode_consolidar?` (falso para motorista). Novo `autorizar_holerite!` no `ConsolidacoesController` — staff baixa qualquer um; motorista baixa só o próprio (PDF já filtrado pelo nome dele). -- **QR code do holerite não abria:** URL estava fixa em `https://`, mas o servidor roda em **http** (IP:porta). Novo `url_acesso` respeita o esquema do `APP_HOST` (sem esquema = http). Defina `APP_HOST` com o IP/host acessível pelo celular. +- **Motorista não baixava o próprio extrato** ("sem permissão"): `ConsolidacaoPolicy#show?` exige `pode_consolidar?` (falso para motorista). Novo `autorizar_extrato!` no `ConsolidacoesController` — staff baixa qualquer um; motorista baixa só o próprio (PDF já filtrado pelo nome dele). +- **QR code do extrato não abria:** URL estava fixa em `https://`, mas o servidor roda em **http** (IP:porta). Novo `url_acesso` respeita o esquema do `APP_HOST` (sem esquema = http). Defina `APP_HOST` com o IP/host acessível pelo celular. ### 🆕 Funcionalidades - **NF + Endereço no relatório PDF:** colunas separadas; a coluna **Tracking** foi substituída por **Veículo** (relatório e tela de revisão / passo 3). - **Endereço nas telas da consolidação:** linha de endereço nos cards do passo 2 (validação) e coluna Endereço no passo 3 (revisão, paginado 20/50/100). -- **Campos de assinatura nos PDFs:** bloco com assinatura do **Motorista** e do **Administrador** (Reem Transporte) no relatório e no holerite (`BasePdf#assinaturas`). +- **Campos de assinatura nos PDFs:** bloco com assinatura do **Motorista** e do **Administrador** (Reem Transporte) no relatório e no extrato (`BasePdf#assinaturas`). - **Selecionar todos** no passo 2: checkbox que marca/desmarca todas as entregas de uma vez. - **Desselecionar em massa:** toggle "Modo remover" — os botões Normal/Retirada/Bônus/Desconto (e "marcar todos") passam a **remover** o pilar das entregas selecionadas (`classificar_em_massa` aceita `acao: remover`). - **Botões de voltar** entre os passos do wizard (2→1, 3→2) viraram botões visíveis (antes eram texto cinza discreto). @@ -575,7 +575,7 @@ Conjunto de melhorias para deixar o sistema pronto para entrega final. scopes `pagamento_pago`/`pagamento_pendente`/`pagamento_parcial` (filtro da lista). - Tela **show**: marcar motorista individual **ou a operação inteira** (com `