# 🚛 Gade Logística — Sistema de Controle de Custos 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) **Repositório:** https://git.xenserver.com.br/Cludio-code/logistica-controle-custos --- ## 📋 CONTEXTO DO PROJETO (leia antes de tudo) A **Gade Hospitalar** precisa controlar o custo de cada operação de entrega (UBS SUL, UBS LESTE, EMAD, STS, SAD, etc.). O banco **já existe** e é atualizado a cada 1 hora por outro sistema externo: - Tabela: `public.db_reem_simplerout_2026` - Account: Gade Hospitalar (account_id: 95907) - **NUNCA** fazer `DROP TABLE`, `TRUNCATE`, `DELETE` ou migration nessa tabela. 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. --- ## 🏗️ Estado atual — O que já foi feito (Fase 1 ✅) ``` logistica-controle-custos/ ├── Gemfile # Todas as gems (Devise, Pundit, Prawn, Whenever, Tailwind…) ├── Dockerfile # Ruby 3.2.2-slim ├── docker-compose.yml # app + db (postgres:15) ├── tailwind.config.js # Paleta preto #0a0a0a / laranja #f97316 / branco ├── .env.example # Template de variáveis — copiar para .env ├── .gitignore # Protege .env, master.key, credenciais │ ├── config/ │ ├── database.yml # 100% via ENV — nunca hardcode │ └── routes.rb # Rotas completas para todas as 8 fases │ ├── app/ │ ├── models/ │ │ ├── entrega.rb # ⚠️ READ-ONLY — tabela existente db_reem_simplerout_2026 │ │ ├── user.rb # Devise + roles (admin/gerente/operador/motorista) + PIN │ │ ├── configuracao.rb # Preços configuráveis (entrega, retirada, bonus, desconto) │ │ ├── consolidacao.rb # Soft delete, enum status, cálculo de progresso │ │ ├── consolidacao_motorista.rb │ │ ├── consolidacao_entrega.rb # Enum tipo: normal/retirada/bonus/desconto │ │ ├── historico_estimado.rb # Job 1h + cálculo ao vivo │ │ └── auditoria_log.rb # Log de ações críticas │ │ │ ├── controllers/ │ │ └── application_controller.rb # Auth + Pundit + tema │ ├── policies/ │ │ └── application_policy.rb # Base Pundit │ ├── helpers/ │ │ └── application_helper.rb # nav_link_to, moeda(), badge_status(), progress_bar() │ └── views/layouts/ │ ├── application.html.erb # Layout base dark theme laranja/preto/branco │ └── _navbar.html.erb # Sidebar responsiva com hamburguer mobile │ └── db/ ├── seeds.rb # Admin: admin@gade.com / Gade@2026! + configs de preço └── migrate/ ├── ..._create_users.rb ├── ..._create_configuracoes.rb ├── ..._create_consolidacoes.rb ├── ..._create_consolidacao_motoristas.rb ├── ..._create_consolidacao_entregas.rb ├── ..._create_historico_estimados.rb └── ..._create_auditoria_logs.rb ``` --- ## 🚀 Setup do zero (próximo dev) ### 1. Clone ```bash git clone https://git.xenserver.com.br/Cludio-code/logistica-controle-custos.git cd logistica-controle-custos ``` ### 2. Configure o .env ```bash cp .env.example .env nano .env # preencha DB_HOST, DB_PASSWORD, etc. ``` ### 3. Gere o SECRET_KEY_BASE ```bash 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=... ``` ### 4. Suba os containers ```bash docker-compose up -d ``` ### 5. Banco + seeds ```bash docker-compose exec app bundle exec rails db:create db:migrate db:seed ``` ### 6. Acesse ``` http://localhost:3000 Login: admin@gade.com Senha: Gade@2026! ← ALTERE NO PRIMEIRO ACESSO ``` --- ## 🔧 Comandos do dia a dia ```bash docker-compose exec app bundle exec rails db:migrate # nova migration docker-compose exec app bundle exec rails console # console Rails docker-compose logs -f app # logs em tempo real docker-compose down # parar tudo ``` --- ## 🗺️ Fases de implementação | Fase | Status | O que 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 + sidebar | | **3** | ✅ **CONCLUÍDA** | Dashboard: cards grandes laranja/preto/branco + gráfico Chart.js + cálculo ao vivo | | **4** | ⏳ Próxima | Job Whenever (1h) + HistoricoEstimado + 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 | ### ▶️ Para continuar da Fase 2 Cole este contexto no início da conversa com o Claude: ``` Execute a FASE 2 do Sistema de Controle de Custos Logística da Gade Hospitalar. CHECKPOINT FASE 1 (concluída): - Rails 7+ com Docker, PostgreSQL 15, Tailwind (preto #0a0a0a / laranja #f97316) - Models criados: Entrega (read-only, tabela db_reem_simplerout_2026), User (Devise + roles), Configuracao, Consolidacao, ConsolidacaoMotorista, ConsolidacaoEntrega, HistoricoEstimado, AuditoriaLog - 7 migrations criadas (ainda não rodadas — rodar com db:migrate) - Seeds: admin@gade.com / Gade@2026! + preços padrão - Layout base dark com sidebar responsiva (laranja/preto/branco) - Rotas completas em config/routes.rb FASE 2 deve implementar: 1. Login Devise com redirecionamento por role (admin/gerente/operador → /dashboard, motorista → /motorista) 2. Login por PIN de 4 dígitos para motoristas 3. Tela de Configurações: CRUD de usuários com roles 4. CRUD de Pilares de Preço (entrega, retirada, bonus, desconto) com máscara R$ 5. Toggle tema claro/escuro no header 6. Validar permissões com Pundit (operador não vê config, motorista não vê admin) ``` --- ## 🗄️ Banco existente — referência rápida | Campo | Uso | |-------|-----| | `tracking_id` | PK lógico da entrega | | `reference_id` | Número da NF | | `planned_date` | Data da entrega (filtro principal) | | `driver` | Nome do motorista | | `status` | `'completed'` = entrega paga | | `checkin` | NULL = motorista não registrou chegada | | `route_id` | UUID da operação (UBS SUL, EMAD, etc.) | | `contact_name` | Nome do local (UBS SACOMA, EMAD VELEIROS…) | **Regra de pagamento:** `status = 'completed'` AND `checkin IS NOT NULL` --- ## 🎨 Design — padrão da marca | Elemento | Cor | Hex | |----------|-----|-----| | Fundo | Preto | `#0a0a0a` | | Cards | Cinza escuro | `#1a1a1a` | | Destaque / botões | Laranja | `#f97316` | | Textos | Branco | `#ffffff` | | Sucesso | Verde | `#22c55e` | | Erro/desconto | Vermelho | `#ef4444` | - Fonte mínima 16px desktop / 18px mobile - Botões mínimo 48px altura (acessibilidade touch) - Tema escuro como padrão --- ## 👥 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 | --- ## 🔐 Segurança - **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