Atualização README - Fase 2 e 3

This commit is contained in:
2026-06-10 23:31:20 -03:00
parent bd60e4c49c
commit b77fc0122c
2 changed files with 123 additions and 65 deletions

1
Projeto-Reem-Custo Submodule

Submodule Projeto-Reem-Custo added at 8e66a9718d

187
README.md
View File

@@ -2,8 +2,8 @@
Sistema web para controle de custos de entregas hospitalares da **Gade Hospitalar**. Sistema web para controle de custos de entregas hospitalares da **Gade Hospitalar**.
**Stack:** Ruby on Rails 7+ · PostgreSQL 15 · Docker · Tailwind CSS · Hotwire (Turbo + Stimulus) **Stack:** Ruby on Rails 7+ · PostgreSQL 15 · Docker · Tailwind CSS · Hotwire (Turbo + Stimulus)
**Repositório:** https://git.xenserver.com.br/Cludio-code/logistica-controle-custos **Repositório:** <https://git.xenserver.com.br/victor/Reem-Notas>
--- ---
@@ -13,6 +13,7 @@ A **Gade Hospitalar** precisa controlar o custo de cada operação de entrega
(UBS SUL, UBS LESTE, EMAD, STS, SAD, etc.). (UBS SUL, UBS LESTE, EMAD, STS, SAD, etc.).
O banco **já existe** e é atualizado a cada 1 hora por outro sistema externo: O banco **já existe** e é atualizado a cada 1 hora por outro sistema externo:
- Tabela: `public.db_reem_simplerout_2026` - Tabela: `public.db_reem_simplerout_2026`
- Account: Gade Hospitalar (account_id: 95907) - Account: Gade Hospitalar (account_id: 95907)
- **NUNCA** fazer `DROP TABLE`, `TRUNCATE`, `DELETE` ou migration nessa tabela. - **NUNCA** fazer `DROP TABLE`, `TRUNCATE`, `DELETE` ou migration nessa tabela.
@@ -22,13 +23,13 @@ e lê a tabela existente apenas para exibir e consolidar entregas.
--- ---
## 🏗️ Estado atual — O que já foi feito (Fase 1 ✅) ## 🏗️ Estado atual — O que já foi feito
``` ```text
logistica-controle-custos/ logistica-controle-custos/
├── Gemfile # Todas as gems (Devise, Pundit, Prawn, Whenever, Tailwind…) ├── Gemfile # Todas as gems (Devise, Pundit, Prawn, Whenever, Tailwind…)
├── Dockerfile # Ruby 3.2.2-slim ├── Dockerfile # Ruby 3.2.2-slim
├── docker-compose.yml # app + db (postgres:15) ├── docker-compose.yml # app (postgres externo via .env)
├── tailwind.config.js # Paleta preto #0a0a0a / laranja #f97316 / branco ├── tailwind.config.js # Paleta preto #0a0a0a / laranja #f97316 / branco
├── .env.example # Template de variáveis — copiar para .env ├── .env.example # Template de variáveis — copiar para .env
├── .gitignore # Protege .env, master.key, credenciais ├── .gitignore # Protege .env, master.key, credenciais
@@ -39,27 +40,44 @@ logistica-controle-custos/
├── app/ ├── app/
│ ├── models/ │ ├── models/
│ │ ├── entrega.rb # ⚠️ READ-ONLY — tabela existente db_reem_simplerout_2026 │ │ ├── entrega.rb # ⚠️ READ-ONLY — tabela db_reem_simplerout_2026
│ │ ├── user.rb # Devise + roles (admin/gerente/operador/motorista) + PIN │ │ ├── user.rb # Devise + roles (admin/gerente/operador/motorista) + PIN
│ │ ├── configuracao.rb # Preços configuráveis (entrega, retirada, bonus, desconto) │ │ ├── configuracao.rb # Preços configuráveis + mapa_de_precos()
│ │ ├── consolidacao.rb # Soft delete, enum status, cálculo de progresso │ │ ├── consolidacao.rb # Soft delete, enum status, cálculo de progresso
│ │ ├── consolidacao_motorista.rb │ │ ├── consolidacao_motorista.rb
│ │ ├── consolidacao_entrega.rb # Enum tipo: normal/retirada/bonus/desconto │ │ ├── consolidacao_entrega.rb # Enum tipo: normal/retirada/bonus/desconto
│ │ ├── historico_estimado.rb # Job 1h + cálculo ao vivo │ │ ├── historico_estimado.rb # Job 1h + cálculo ao vivo
│ │ └── auditoria_log.rb # Log de ações críticas │ │ └── auditoria_log.rb # Log de ações críticas + .registrar()
│ │ │ │
│ ├── controllers/ │ ├── controllers/
│ │ ── application_controller.rb # Auth + Pundit + tema │ │ ── application_controller.rb # Auth + Pundit + tema
│ │ ├── users/sessions_controller.rb # PIN login + redirect por role
│ │ ├── dashboard_controller.rb # Cálculos ao vivo (Fase 3)
│ │ ├── usuarios_controller.rb # CRUD usuários
│ │ ├── configuracoes_controller.rb # Preços + toggle tema
│ │ └── motorista_controller.rb # Painel do motorista
│ │
│ ├── policies/ │ ├── policies/
│ │ ── application_policy.rb # Base Pundit │ │ ── application_policy.rb # Base Pundit + helpers admin?/gerente?/operador?
│ │ ├── user_policy.rb # Admin vê tudo; gerente não vê admins
│ │ └── configuracao_policy.rb # Apenas admin edita preços
│ │
│ ├── helpers/ │ ├── helpers/
│ │ └── application_helper.rb # nav_link_to, moeda(), badge_status(), progress_bar() │ │ └── application_helper.rb # moeda(), nav_link_to(), badge_status(), badge_role(), progress_bar()
└── views/layouts/
├── application.html.erb # Layout base dark theme laranja/preto/branco └── views/
── _navbar.html.erb # Sidebar responsiva com hamburguer mobile ── devise/sessions/new.html.erb # Login com teclado PIN + abas E-mail/PIN
│ ├── layouts/
│ │ ├── application.html.erb # Layout dark/light + sidebar responsiva
│ │ └── _sidebar.html.erb # Navegação condicional por role
│ ├── dashboard/index.html.erb # Cards grandes + Chart.js + ranking
│ ├── usuarios/ # index, new, edit, _form
│ ├── configuracoes/ # index (cards de preço), edit
│ ├── motorista/index.html.erb # Painel simplificado do motorista
│ └── shared/_flash.html.erb
└── db/ └── db/
├── seeds.rb # Admin: admin@gade.com / Gade@2026! + configs de preço ├── seeds.rb # Admin/Gerente/Operador + 3 motoristas com PIN
└── migrate/ └── migrate/
├── ..._create_users.rb ├── ..._create_users.rb
├── ..._create_configuracoes.rb ├── ..._create_configuracoes.rb
@@ -67,7 +85,8 @@ logistica-controle-custos/
├── ..._create_consolidacao_motoristas.rb ├── ..._create_consolidacao_motoristas.rb
├── ..._create_consolidacao_entregas.rb ├── ..._create_consolidacao_entregas.rb
├── ..._create_historico_estimados.rb ├── ..._create_historico_estimados.rb
── ..._create_auditoria_logs.rb ── ..._create_auditoria_logs.rb
└── ..._add_fase2_fields_to_users.rb # PIN + ativo + trackable + lockable
``` ```
--- ---
@@ -75,35 +94,41 @@ logistica-controle-custos/
## 🚀 Setup do zero (próximo dev) ## 🚀 Setup do zero (próximo dev)
### 1. Clone ### 1. Clone
```bash ```bash
git clone https://git.xenserver.com.br/Cludio-code/logistica-controle-custos.git git clone https://git.xenserver.com.br/victor/Reem-Notas.git
cd logistica-controle-custos cd Reem-Notas
``` ```
### 2. Configure o .env ### 2. Configure o .env
```bash ```bash
cp .env.example .env cp .env.example .env
nano .env # preencha DB_HOST, DB_PASSWORD, etc. nano .env # preencha DB_HOST, DB_PASSWORD, etc.
``` ```
### 3. Gere o SECRET_KEY_BASE ### 3. Gere o SECRET_KEY_BASE
```bash ```bash
docker run --rm ruby:3.2.2-slim bash -c "gem install rails --no-doc -q && rails secret" docker run --rm ruby:3.2.2-slim bash -c "gem install rails --no-doc -q && rails secret"
# Cole o resultado no .env → SECRET_KEY_BASE=... # Cole o resultado no .env → SECRET_KEY_BASE=...
``` ```
### 4. Suba os containers ### 4. Suba os containers
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
### 5. Banco + seeds ### 5. Banco + seeds
```bash ```bash
docker-compose exec app bundle exec rails db:create db:migrate db:seed docker-compose exec app bundle exec rails db:create db:migrate db:seed
``` ```
### 6. Acesse ### 6. Acesse
```
```text
http://localhost:3000 http://localhost:3000
Login: admin@gade.com Login: admin@gade.com
Senha: Gade@2026! ← ALTERE NO PRIMEIRO ACESSO Senha: Gade@2026! ← ALTERE NO PRIMEIRO ACESSO
@@ -124,6 +149,7 @@ docker-compose down # parar tudo
## 🗺️ Fases de implementação ## 🗺️ Fases de implementação
<<<<<<< HEAD
| Fase | Status | O que fazer | | Fase | Status | O que fazer |
|------|--------|-------------| |------|--------|-------------|
| **1** | ✅ **CONCLUÍDA** | Setup + Docker + Models + Migrations + Seeds + Layout base | | **1** | ✅ **CONCLUÍDA** | Setup + Docker + Models + Migrations + Seeds + Layout base |
@@ -134,46 +160,87 @@ docker-compose down # parar tudo
| **6** | ⏳ | Toggle switches coloridos + ações em massa + barra de progresso (Stimulus) | | **6** | ⏳ | Toggle switches coloridos + ações em massa + barra de progresso (Stimulus) |
| **7** | ⏳ | PDFs com Prawn: relatório individual + holerite com QR code | | **7** | ⏳ | PDFs com Prawn: relatório individual + holerite com QR code |
| **8** | ⏳ | Painel motorista + notificações WhatsApp/email + responsividade final | | **8** | ⏳ | Painel motorista + notificações WhatsApp/email + responsividade final |
=======
| Fase | Status | O que foi feito / fazer |
| ----- | ---------------- | ------------------------------------------------------------------------------------------- |
| **1** | ✅ **CONCLUÍDA** | Setup + Docker + Models + Migrations + Seeds + Layout base |
| **2** | ✅ **CONCLUÍDA** | Login por role + PIN motorista + CRUD usuários + pilares de preço + toggle tema + Pundit |
| **3** | ✅ **CONCLUÍDA** | Dashboard: cards laranja/preto/branco + gráfico Chart.js + ranking motoristas + cálculo ao vivo |
| **4** | ⏳ Próxima | Job Whenever (1h) + HistoricoEstimado + UI de AuditoriaLog |
| **5** | ⏳ | Nova Consolidação + Wizard Passo 1 (selecionar motorista) |
| **6** | ⏳ | Toggle switches coloridos + ações em massa + barra de progresso (Stimulus) |
| **7** | ⏳ | PDFs com Prawn: relatório individual + holerite com QR code |
| **8** | ⏳ | Painel motorista + notificações WhatsApp/email + responsividade final |
>>>>>>> 63b7f4d (Atualização README - Fase 2 e 3)
### ▶️ Para continuar da Fase 2 ---
## 👥 Perfis de acesso
| Perfil | Login | Acesso | Vai para |
| --------- | ------------------- | ----------------------------------- | --------------- |
| Admin | email + senha | Tudo | `/dashboard` |
| Gerente | email + senha | Dashboard + Consolidações + PDFs | `/dashboard` |
| Operador | email + senha | Consolidações (criar + validar) | `/dashboard` |
| Motorista | PIN 4 dígitos | Painel pessoal + baixar próprio PDF | `/motorista` |
### Credenciais de teste (seeds)
| Usuário | Login | Senha / PIN |
| ---------------- | ------------------ | ------------ |
| Admin | admin@gade.com | Gade@2026! |
| Gerente | gerente@gade.com | Gade@2026! |
| Operador | operador@gade.com | Gade@2026! |
| Motorista João | PIN | 1234 |
| Motorista Maria | PIN | 5678 |
| Motorista Carlos | PIN | 9012 |
> ⚠️ **Altere todas as senhas no primeiro acesso em produção.**
---
### ▶️ Para continuar da Fase 4
Cole este contexto no início da conversa com o Claude: Cole este contexto no início da conversa com o Claude:
``` ```text
Execute a FASE 2 do Sistema de Controle de Custos Logística da Gade Hospitalar. Execute a FASE 4 do Sistema de Controle de Custos Logística da Gade Hospitalar.
CHECKPOINT FASE 1 (concluída): CHECKPOINT FASES 1-3 (concluídas):
- Rails 7+ com Docker, PostgreSQL 15, Tailwind (preto #0a0a0a / laranja #f97316) - Rails 7+ com Docker, PostgreSQL 15, Tailwind (preto #0a0a0a / laranja #f97316)
- Models criados: Entrega (read-only, tabela db_reem_simplerout_2026), User (Devise + roles), - Models: Entrega (read-only), User (Devise + roles + PIN), Configuracao,
Configuracao, Consolidacao, ConsolidacaoMotorista, ConsolidacaoEntrega, Consolidacao, ConsolidacaoMotorista, ConsolidacaoEntrega,
HistoricoEstimado, AuditoriaLog HistoricoEstimado, AuditoriaLog
- 7 migrations criadas (ainda não rodadas — rodar com db:migrate) - Devise com login por e-mail (admin/gerente/operador) e PIN 4 dígitos (motorista)
- Seeds: admin@gade.com / Gade@2026! + preços padrão - Pundit: UserPolicy, ConfiguracaoPolicy, ApplicationPolicy
- Layout base dark com sidebar responsiva (laranja/preto/branco) - Dashboard com Chart.js: cards KPI, gráfico diário, ranking motoristas, grid locais
- Rotas completas em config/routes.rb - CRUD de usuários com toggle ativo/inativo e formulário dinâmico por role
- Configurações de preço (entrega, retirada, bonus, desconto) com cards editáveis
- Toggle tema claro/escuro salvo na sessão
- Sidebar responsiva (desktop fixa + drawer mobile) com navegação por role
- Seeds: admin/gerente/operador com e-mail + 3 motoristas com PIN
FASE 2 deve implementar: FASE 4 deve implementar:
1. Login Devise com redirecionamento por role (admin/gerente/operador → /dashboard, motorista → /motorista) 1. Job com Whenever: rodar a cada 1h para calcular e salvar HistoricoEstimado
2. Login por PIN de 4 dígitos para motoristas 2. Modelo HistoricoEstimado: snapshot do valor estimado por motorista por hora
3. Tela de Configurações: CRUD de usuários com roles 3. Controller + view de AuditoriaLog: tabela paginada com filtro por usuário/ação
4. CRUD de Pilares de Preço (entrega, retirada, bonus, desconto) com máscara R$ 4. Indicador visual no Dashboard mostrando "última atualização" do histórico
5. Toggle tema claro/escuro no header 5. Rake task manual: rails historico:calcular (para rodar fora do cron)
6. Validar permissões com Pundit (operador não vê config, motorista não vê admin)
``` ```
--- ---
## 🗄️ Banco existente — referência rápida ## 🗄️ Banco existente — referência rápida
| Campo | Uso | | Campo | Uso |
|-------|-----| | -------------- | ------------------------------------------ |
| `tracking_id` | PK lógico da entrega | | `tracking_id` | PK lógico da entrega |
| `reference_id` | Número da NF | | `reference_id` | Número da NF |
| `planned_date` | Data da entrega (filtro principal) | | `planned_date` | Data da entrega (filtro principal) |
| `driver` | Nome do motorista | | `driver` | Nome do motorista |
| `status` | `'completed'` = entrega paga | | `status` | `'completed'` = entrega paga |
| `checkin` | NULL = motorista não registrou chegada | | `checkin` | NULL = motorista não registrou chegada |
| `route_id` | UUID da operação (UBS SUL, EMAD, etc.) | | `route_id` | UUID da operação (UBS SUL, EMAD, etc.) |
| `contact_name` | Nome do local (UBS SACOMA, EMAD VELEIROS…) | | `contact_name` | Nome do local (UBS SACOMA, EMAD VELEIROS…) |
**Regra de pagamento:** `status = 'completed'` AND `checkin IS NOT NULL` **Regra de pagamento:** `status = 'completed'` AND `checkin IS NOT NULL`
@@ -182,29 +249,18 @@ FASE 2 deve implementar:
## 🎨 Design — padrão da marca ## 🎨 Design — padrão da marca
| Elemento | Cor | Hex | | Elemento | Cor | Hex |
|----------|-----|-----| | ----------------- | ------------ | --------- |
| Fundo | Preto | `#0a0a0a` | | Fundo | Preto | `#0a0a0a` |
| Cards | Cinza escuro | `#1a1a1a` | | Cards | Cinza escuro | `#1a1a1a` |
| Destaque / botões | Laranja | `#f97316` | | Destaque / botões | Laranja | `#f97316` |
| Textos | Branco | `#ffffff` | | Textos | Branco | `#ffffff` |
| Sucesso | Verde | `#22c55e` | | Sucesso | Verde | `#22c55e` |
| Erro/desconto | Vermelho | `#ef4444` | | Erro/desconto | Vermelho | `#ef4444` |
- Fonte mínima 16px desktop / 18px mobile - Fonte mínima 16px desktop / 18px mobile
- Botões mínimo 48px altura (acessibilidade touch) - Botões mínimo 48px altura (acessibilidade touch)
- Tema escuro como padrão - Tema escuro como padrão (toggle disponível no header)
---
## 👥 Perfis de acesso
| Perfil | Login | Acesso |
|--------|-------|--------|
| Admin | email + senha | Tudo |
| Gerente | email + senha | Dashboard + Consolidações + PDFs |
| Operador | email + senha | Consolidações (criar + validar) |
| Motorista | PIN 4 dígitos ou QR | Painel pessoal + baixar próprio PDF |
--- ---
@@ -213,3 +269,4 @@ FASE 2 deve implementar:
- **NUNCA** versione `.env`, `config/master.key` ou qualquer arquivo com senha - **NUNCA** versione `.env`, `config/master.key` ou qualquer arquivo com senha
- Repositório **PRIVADO** em git.xenserver.com.br - Repositório **PRIVADO** em git.xenserver.com.br
- Use sempre `ENV['VARIAVEL']` no código Ruby - Use sempre `ENV['VARIAVEL']` no código Ruby
- Todas as actions protegidas por Pundit (`authorize` obrigatório)