Correção Read.me e Atualização do mesmo

This commit is contained in:
2026-06-22 19:54:55 -03:00
parent 21c84bf4f4
commit 415cabc88f

136
README.md
View File

@@ -7,7 +7,12 @@ Sistema web para controle de custos de entregas hospitalares da **Gade Hospitala
---
## 📋 CONTEXTO DO PROJETO (leia antes de tudo)
> 💡 **Navegação:** as seções abaixo abrem e fecham — clique no título de cada uma.
---
<details>
<summary><strong>📋 CONTEXTO DO PROJETO (leia antes de tudo)</strong></summary>
A **Gade Hospitalar** precisa controlar o custo de cada operação de entrega
(UBS SUL, UBS LESTE, EMAD, STS, SAD, etc.).
@@ -20,9 +25,12 @@ O banco **já existe** e é atualizado a cada 1 hora por outro sistema externo:
O sistema novo cria suas próprias tabelas no mesmo PostgreSQL (schema separado ou prefixo)
e lê a tabela existente apenas para exibir e consolidar entregas.
</details>
---
## 🏗️ Estado atual — O que já foi feito (Fase 1 ✅)
<details>
<summary><strong>🏗️ Estado atual — O que já foi feito (Fase 1 ✅)</strong></summary>
```
logistica-controle-custos/
@@ -70,9 +78,12 @@ logistica-controle-custos/
└── ..._create_auditoria_logs.rb
```
</details>
---
## 🚀 Setup do zero (próximo dev)
<details>
<summary><strong>🚀 Setup do zero (próximo dev)</strong></summary>
### 1. Clone
```bash
@@ -109,9 +120,12 @@ Login: admin@gade.com
Senha: Gade@2026! ← ALTERE NO PRIMEIRO ACESSO
```
</details>
---
## 🔧 Comandos do dia a dia
<details>
<summary><strong>🔧 Comandos do dia a dia</strong></summary>
```bash
docker-compose exec app bundle exec rails db:migrate # nova migration
@@ -120,9 +134,12 @@ docker-compose logs -f app # logs em tempo real
docker-compose down # parar tudo
```
</details>
---
## 🗺️ Fases de implementação
<details>
<summary><strong>🗺️ Fases de implementação</strong></summary>
| Fase | Status | O que faz |
|------|--------|-----------|
@@ -137,9 +154,12 @@ docker-compose down # parar tudo
**🎉 PROJETO: 8 de 8 fases implementadas.**
</details>
---
## 🔧 Análise de integração (11/06/2026) — Correções aplicadas
<details>
<summary><strong>🔧 Análise de integração (11/06/2026) — Correções aplicadas</strong></summary>
As Fases 2/3 (commit `4724847`) foram desenvolvidas em paralelo às Fases 4-8 (commits `90ed705` e `8b3d4bc`), e a mesclagem gerou **conflitos que quebravam a aplicação**. Análise dos commits e correções:
@@ -302,9 +322,12 @@ docker-compose exec app bundle exec whenever --update-crontab
⚠️ Altere as senhas padrão no primeiro acesso em produção.
</details>
---
## 🧪 Auditoria + Suíte de testes (15/06/2026)
<details>
<summary><strong>🧪 Auditoria + Suíte de testes (15/06/2026)</strong></summary>
Revisão de código + criação da suíte RSpec (o projeto tinha `rspec-rails`/`factory_bot`/`capybara` no Gemfile, mas **nenhum teste** e **nenhum `spec/`**).
@@ -355,9 +378,12 @@ docker-compose exec app bundle exec rspec
> Os specs que dependem da tabela read-only `db_reem_simplerout_2026` stubam `Entrega` — o banco de teste não contém essa tabela externa.
</details>
---
## 🔧 Correções + funcionalidades (16/06/2026)
<details>
<summary><strong>🔧 Correções + funcionalidades (16/06/2026)</strong></summary>
### 🔴 Erros de runtime corrigidos (reportados em prints)
- **Logout** dava `No route matches [GET] /auth/logout` — o link usava `method: :delete` (rails-ujs), ignorado pelo Turbo. Agora usa `data-turbo-method`.
@@ -385,9 +411,12 @@ docker-compose exec app bundle exec rake reem:diagnostico
docker-compose exec app bundle exec rake reem:diagnostico INICIO=2026-02-01 FIM=2026-06-30
```
</details>
---
## 🔧 Correções + funcionalidades (16/06/2026 — sessão 2)
<details>
<summary><strong>🔧 Correções + funcionalidades (16/06/2026 — sessão 2)</strong></summary>
### 🔴 Bugs corrigidos
- **Dashboard zerado por filtro de conta:** `DB_EXISTING_ACCOUNT_ID` é uma **lista separada por vírgula**, não um trecho de SQL. Valor errado (ex.: `account_id IN ('95907', '')`) zerava tudo. Use `95907,` (vírgula no fim) para incluir também registros com conta vazia/NULL. O scope `Entrega.da_conta_gade` agora inclui `NULL` quando há token vazio na lista.
@@ -412,9 +441,12 @@ docker-compose exec app bundle exec rake reem:diagnostico INICIO=2026-02-01 FIM=
docker-compose exec app bundle exec rails db:migrate
```
</details>
---
## 🗄️ Banco existente — referência rápida
<details>
<summary><strong>🗄️ Banco existente — referência rápida</strong></summary>
| Campo | Uso |
|-------|-----|
@@ -430,9 +462,12 @@ docker-compose exec app bundle exec rails db:migrate
**Regra de pagamento:** `status = 'completed'` AND `checkout IS NOT NULL`
</details>
---
## 🎨 Design — padrão da marca
<details>
<summary><strong>🎨 Design — padrão da marca</strong></summary>
| Elemento | Cor | Hex |
|----------|-----|-----|
@@ -447,9 +482,12 @@ docker-compose exec app bundle exec rails db:migrate
- Botões mínimo 48px altura (acessibilidade touch)
- Tema escuro como padrão
</details>
---
## 👥 Perfis de acesso
<details>
<summary><strong>👥 Perfis de acesso</strong></summary>
| Perfil | Login | Acesso |
|--------|-------|--------|
@@ -458,10 +496,12 @@ docker-compose exec app bundle exec rails db:migrate
| Operador | email + senha | Consolidações (criar + validar) |
| Motorista | PIN 4 dígitos ou QR | Painel pessoal + baixar próprio PDF |
</details>
---
## 🩺 Correção (11/06): container caía mostrando ajuda do "rails new"
<details>
<summary><strong>🩺 Correção (11/06): container caía mostrando ajuda do "rails new"</strong></summary>
**Sintoma:** `docker-compose up` subia e o log mostrava o help do `rails new` em loop.
**Causa:** o repositório tinha os arquivos da aplicação (models/controllers/views) mas **não tinha o esqueleto de boot do Rails** — sem `config/application.rb` e `config.ru`, o comando `rails s` não reconhece a pasta como um app Rails e cai no modo "criar app novo".
@@ -506,15 +546,23 @@ docker-compose logs -f app # deve mostrar "Listening on http://0.0.0.0:3000"
# Acesse http://SEU_IP:3000 → admin@gade.com / Gade@2026!
```
## 🔐 Segurança
</details>
---
<details>
<summary><strong>🔐 Segurança</strong></summary>
- **NUNCA** versione `.env`, `config/master.key` ou qualquer arquivo com senha
- Repositório **PRIVADO** em git.xenserver.com.br
- Use sempre `ENV['VARIAVEL']` no código Ruby
</details>
---
## 🆕 Atualização 17/06/2026 — Pagamentos, Operações, Dashboard financeiro e UI
<details>
<summary><strong>🆕 Atualização 17/06/2026 — Pagamentos, Operações, Dashboard financeiro e UI</strong></summary>
Conjunto de melhorias para deixar o sistema pronto para entrega final.
@@ -592,9 +640,12 @@ Conjunto de melhorias para deixar o sistema pronto para entrega final.
```
Aplicar com: `docker-compose exec app bundle exec rails db:migrate`
</details>
---
## 🔧 Correções — Holerite PDF (18/06/2026)
<details>
<summary><strong>🔧 Correções — Holerite PDF (18/06/2026)</strong></summary>
### 🔴 Bugs corrigidos
- **500 ao gerar holerite** (`gerar_pdf_holerite`): `Prawn::Errors::IncompatibleStringEncoding`
@@ -636,9 +687,12 @@ Aplicar com: `docker-compose exec app bundle exec rails db:migrate`
- **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.
</details>
---
## 🆕 Atualização 19/06/2026 — Apontamento manual / Nota avulsa
<details>
<summary><strong>🆕 Atualização 19/06/2026 — Apontamento manual / Nota avulsa</strong></summary>
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 =
@@ -692,3 +746,49 @@ 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).
</details>
---
<details open>
<summary><strong>🆕 Atualização 22/06/2026 — Pilar Extraordinária, Perfil Externo, Falhadas, Relatórios e Segurança QR</strong></summary>
### 🆕 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.
- **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`.
- Novo `Entrega::STATUS_FALHA` + scope `falhadas`; o scope `pendentes` foi ajustado para não sobrepor (nem `completed` nem falha).
- **Relatórios financeiros em PDF (admin):**
- Por **consolidação**`Pdf::RelatorioFinanceiroConsolidacaoPdf` (botão "📊 Relatório financeiro" na tela da consolidação).
- Por **período**`Pdf::RelatorioFinanceiroPeriodoPdf` (botão "🖨️ Relatório" no dashboard, respeita o filtro de período/operação).
- **Novo perfil de usuário: "Externo (só dashboard)"** (`role: externo`).
- Login normal por e-mail/senha; enxerga **apenas o dashboard**. Bloqueado nas demais áreas pelas policies Pundit (`pode_consolidar?`/admin). Ideal para enviar a outras gerências visualizarem os indicadores.
- **Filtro de data re-estilizado** — calendário no tema escuro (flatpickr dark + acento laranja) e atalhos rápidos: **Hoje / 7 dias / Este mês / 30 dias**.
### 🔴 Bugs corrigidos
- **Botão "Arquivar"** não funcionava em consolidação zerada / rascunho. `Consolidacao#arquivar!` e `#reativar!` passaram a usar `update_columns` (pulam validações e o callback de recálculo) — arquivar é soft-delete administrativo e deve sempre funcionar. `turbo_confirm` movido para o `<form>` (mais confiável).
- **Caixa do filtro de data** mostrava uma data solta em vez do período. Causa: o flatpickr recebia datas em ISO (`YYYY-MM-DD`) com `dateFormat: 'd/m/Y'`. Corrigido passando objetos `Date` + separador `" até "`; seleção de **um único dia** agora aplica; re-inicialização em `turbo:load`.
- **Moeda sem separador de milhar** — padronizado **`R$ 1.234,56`** (milhar `.`, decimais `,`) em: helper `moeda` (`number_to_currency`), PDFs (`base_pdf`), `Configuracao#valor_formatado`, mensagens do `NotificacaoService` e tooltips/JS do dashboard e do wizard.
- **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.
### 🆕 Migration adicionada (rodar `db:migrate`)
```bash
docker-compose exec app bundle exec rails db:migrate
```
- `20260622000001_add_preco_extraordinaria_configuracao` — cria a config `preco_extraordinaria` (padrão `R$ 25,00`) em bancos já existentes (idempotente; não sobrescreve valor já definido).
### ⚠️ A confirmar
- Validar o valor real do status de falha gravado pelo SimpleRoute e ajustar `Entrega::STATUS_FALHA` se necessário (hoje `%w[failed]`):
```bash
docker-compose exec app bundle exec rails runner "puts Entrega.da_conta_gade.distinct.pluck(:status).inspect"
```
</details>