Alteração Para uso dos Usuarios
This commit is contained in:
50
README.md
50
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 `<select>` de forma);
|
||||
estorno. Ações `registrar_pagamento`/`cancelar_pagamento` (admin/gerente).
|
||||
- Helper `badge_pagamento`; filtro pago/pendente na **index**; selo no **holerite**.
|
||||
- Helper `badge_pagamento`; filtro pago/pendente na **index**; selo no **extrato**.
|
||||
- **Notificação de pagamento**: `NotificacaoService.notificar_pagamento` (WhatsApp + e-mail
|
||||
`ConsolidacaoMailer#pagamento_efetuado`) — falhas só logam.
|
||||
- **Aviso in-app no painel do motorista**: faixa "Pagamento confirmado" (últimos 7 dias) + selo
|
||||
@@ -604,11 +604,11 @@ Conjunto de melhorias para deixar o sistema pronto para entrega final.
|
||||
- Aplicado em `contar_pagas`, elegibilidade do wizard, gráfico principal (`DATE(checkout)`) e na
|
||||
exibição da data das entregas.
|
||||
|
||||
### 🧾 PDFs (Relatório e Holerite)
|
||||
### 🧾 PDFs (Relatório e Extrato)
|
||||
- **Relatório**: endereço completo com quebra de linha, larguras de coluna fixas, quebra de
|
||||
página antes do RESUMO. **Rodapé via `canvas`** (na margem inferior — não sobrepõe mais o
|
||||
conteúdo); margem inferior 72.
|
||||
- **Holerite**: coluna **Unit.**, os 4 pilares sempre exibidos, **total de entregas + veículos**,
|
||||
- **Extrato**: coluna **Unit.**, os 4 pilares sempre exibidos, **total de entregas + veículos**,
|
||||
**selo de pagamento** (PAGO/PENDENTE) e **garantia de espaço para o QR Code**
|
||||
(`start_new_page` se faltar espaço — o Prawn não pagina imagem sozinho).
|
||||
|
||||
@@ -645,24 +645,24 @@ Aplicar com: `docker-compose exec app bundle exec rails db:migrate`
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary><strong>🔧 Correções — Holerite PDF (18/06/2026)</strong></summary>
|
||||
<summary><strong>🔧 Correções — Extrato PDF (18/06/2026)</strong></summary>
|
||||
|
||||
### 🔴 Bugs corrigidos
|
||||
- **500 ao gerar holerite** (`gerar_pdf_holerite`): `Prawn::Errors::IncompatibleStringEncoding`
|
||||
- **500 ao gerar extrato** (`gerar_pdf_extrato`): `Prawn::Errors::IncompatibleStringEncoding`
|
||||
(`Encoding::UndefinedConversionError`). Os PDFs usavam a fonte **embutida** do Prawn
|
||||
(Helvetica/AFM), que só aceita o charset **Windows-1252** — o caractere **`✓`** do selo
|
||||
"✓ PAGO" não existe nesse charset e derrubava a geração.
|
||||
✅ **Corrigido:** `BasePdf` agora registra a família **DejaVu Sans (TTF)** e a define como
|
||||
fonte padrão (`registrar_fonte_utf8`), com suporte total a **UTF-8**. Vale para todos os PDFs
|
||||
(holerite e relatório) — qualquer caractere Unicode passa a funcionar.
|
||||
(extrato e relatório) — qualquer caractere Unicode passa a funcionar.
|
||||
- Fontes versionadas em `app/assets/fonts/DejaVuSans.ttf` e `DejaVuSans-Bold.ttf`
|
||||
(a imagem Docker `ruby:3.2.2-slim` não traz fontes do sistema; o `COPY . .` do Dockerfile e
|
||||
o volume `.:/app` garantem que estejam disponíveis em runtime).
|
||||
- **Assinaturas do holerite caíam na 2ª página:** após o QR Code o cursor ficava abaixo do
|
||||
- **Assinaturas do extrato caíam na 2ª página:** após o QR Code o cursor ficava abaixo do
|
||||
limite de quebra (`start_new_page if cursor < 120`), empurrando o bloco de assinaturas para
|
||||
uma página nova. ✅ **Corrigido:** espaçamentos compactados com segurança (padding das
|
||||
tabelas `[4,8]`, QR Code menor) + folga antes das assinaturas reduzida (`BasePdf#assinaturas`,
|
||||
60 → 36, limite de quebra 120 → 100) — **o holerite agora cabe em uma única página**.
|
||||
60 → 36, limite de quebra 120 → 100) — **o extrato agora cabe em uma única página**.
|
||||
- **QR Code sobrepondo / sumindo:** o posicionamento por `move_up`/`move_down` era frágil e,
|
||||
com a fonte nova, fazia o QR se sobrepor ao texto/assinaturas. ✅ **Corrigido:**
|
||||
`desenhar_qrcode` agora desenha a imagem com **posição absoluta (`at:`)** — que não move o
|
||||
@@ -678,9 +678,9 @@ Aplicar com: `docker-compose exec app bundle exec rails db:migrate`
|
||||
(dado externo) e `users.nome` (digitado no admin). ✅ `ConsolidacoesController#buscar_user_motorista`
|
||||
agora tenta o match exato e, se falhar, compara nomes **normalizados** (sem espaços
|
||||
extras/duplos, case-insensitive).
|
||||
- **Motorista sem conta:** ✅ em vez de omitir, o holerite agora desenha um **aviso**
|
||||
- **Motorista sem conta:** ✅ em vez de omitir, o extrato agora desenha um **aviso**
|
||||
("Cadastro de acesso ainda não disponível… solicite ao administrador") no lugar do QR
|
||||
(`HoleritePdf#desenhar_aviso_sem_acesso`). O QR só existe para motoristas **com cadastro**
|
||||
(`ExtratoPdf#desenhar_aviso_sem_acesso`). O QR só existe para motoristas **com cadastro**
|
||||
no site — comportamento esperado, já que sem conta não há painel para acessar.
|
||||
|
||||
### 📌 Padrão (novo)
|
||||
@@ -757,7 +757,7 @@ docker-compose exec app bundle exec rails db:migrate
|
||||
### 🆕 Funcionalidades
|
||||
- **Pilar "Entrega Extraordinária"** — preço coringa para entregas fora do planejamento.
|
||||
- Novo valor `extraordinaria` no `enum tipo` de `ConsolidacaoEntrega` (soma positiva, como Bônus). Sem migration de enum (coluna `integer`).
|
||||
- Aparece em **todas** as telas dos pilares: wizard (passo 1), validação, revisão, nota avulsa, holerite, PDFs e composição do dashboard.
|
||||
- Aparece em **todas** as telas dos pilares: wizard (passo 1), validação, revisão, nota avulsa, extrato, PDFs e composição do dashboard.
|
||||
- **Preço padrão configurável** em *Configurações* (`preco_extraordinaria`) **e** **valor customizável por entrega**: ao marcar "Extra" no wizard abre um prompt já preenchido com o padrão (`valor_classificacao` no controller + `pedirValor()` no Stimulus).
|
||||
- **Card "Consolidado / Pago"** no topo do dashboard (total consolidado + total já pago do período; reusa `@fin_custo_total` / `@fin_pago`).
|
||||
- **Entregas falhadas no dashboard** — o card "Total Entregas" agora separa `entregues · pendentes · falhadas`.
|
||||
@@ -776,7 +776,7 @@ docker-compose exec app bundle exec rails db:migrate
|
||||
- **R$ "quebrado" no painel do motorista** (celular) — os valores grandes quebravam "R$" e o número em linhas separadas. Adicionado `whitespace-nowrap` + fonte responsiva (`text-4xl sm:text-5xl`) nos cards.
|
||||
|
||||
### 🔐 Segurança
|
||||
- **QR Code do holerite não loga mais direto.** Antes, ler o QR (`/motorista/acesso/:token`) autenticava o motorista sem PIN. Agora o QR apenas **identifica** o motorista e leva à tela de PIN; ele precisa digitar o **PIN de 4 dígitos** para entrar — e o PIN tem que ser **do mesmo motorista do QR** (impede usar o QR de outra pessoa). A tela saúda pelo nome quando vem do QR.
|
||||
- **QR Code do extrato não loga mais direto.** Antes, ler o QR (`/motorista/acesso/:token`) autenticava o motorista sem PIN. Agora o QR apenas **identifica** o motorista e leva à tela de PIN; ele precisa digitar o **PIN de 4 dígitos** para entrar — e o PIN tem que ser **do mesmo motorista do QR** (impede usar o QR de outra pessoa). A tela saúda pelo nome quando vem do QR.
|
||||
|
||||
### 🆕 Migration adicionada (rodar `db:migrate`)
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user