Go to file

🚛 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/victor/Reem-Notas


📋 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

logistica-controle-custos/
├── Gemfile                          # Todas as gems (Devise, Pundit, Prawn, Whenever, Tailwind…)
├── Dockerfile                       # Ruby 3.2.2-slim
├── docker-compose.yml               # app (postgres externo via .env)
├── 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 db_reem_simplerout_2026
│   │   ├── user.rb                  # Devise + roles (admin/gerente/operador/motorista) + PIN
│   │   ├── configuracao.rb          # Preços configuráveis + mapa_de_precos()
│   │   ├── 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 + .registrar()
│   │
│   ├── controllers/
│   │   ├── 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/
│   │   ├── 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/
│   │   └── application_helper.rb    # moeda(), nav_link_to(), badge_status(), badge_role(), progress_bar()
│   │
│   └── views/
│       ├── 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/
    ├── seeds.rb                     # Admin/Gerente/Operador + 3 motoristas com PIN
    └── 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
        └── ..._add_fase2_fields_to_users.rb    # PIN + ativo + trackable + lockable

🚀 Setup do zero (próximo dev)

1. Clone

git clone https://git.xenserver.com.br/victor/Reem-Notas.git
cd Reem-Notas

2. Configure o .env

cp .env.example .env
nano .env   # preencha DB_HOST, DB_PASSWORD, etc.

3. Gere o SECRET_KEY_BASE

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

docker-compose up -d

5. Banco + seeds

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

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

<<<<<<< HEAD

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)


👥 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:

Execute a FASE 4 do Sistema de Controle de Custos Logística da Gade Hospitalar.

CHECKPOINT FASES 1-3 (concluídas):
- Rails 7+ com Docker, PostgreSQL 15, Tailwind (preto #0a0a0a / laranja #f97316)
- Models: Entrega (read-only), User (Devise + roles + PIN), Configuracao,
  Consolidacao, ConsolidacaoMotorista, ConsolidacaoEntrega,
  HistoricoEstimado, AuditoriaLog
- Devise com login por e-mail (admin/gerente/operador) e PIN 4 dígitos (motorista)
- Pundit: UserPolicy, ConfiguracaoPolicy, ApplicationPolicy
- Dashboard com Chart.js: cards KPI, gráfico diário, ranking motoristas, grid locais
- 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 4 deve implementar:
1. Job com Whenever: rodar a cada 1h para calcular e salvar HistoricoEstimado
2. Modelo HistoricoEstimado: snapshot do valor estimado por motorista por hora
3. Controller + view de AuditoriaLog: tabela paginada com filtro por usuário/ação
4. Indicador visual no Dashboard mostrando "última atualização" do histórico
5. Rake task manual: rails historico:calcular (para rodar fora do cron)

🗄️ 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 (toggle disponível no header)

🔐 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
  • Todas as actions protegidas por Pundit (authorize obrigatório)
Description
No description provided
Readme 27 MiB
Languages
HTML 87%
Ruby 11.5%
JavaScript 1.3%
Shell 0.2%