🚛 PROMPT: Sistema de Controle de Custos - Logística

⚠️ INSTRUÇÃO INICIAL OBRIGATÓRIA:
Antes de começar, pergunte ao usuário: "Qual fase devo executar? Informe o número da fase (1 a 8)."
Se o usuário informar uma fase, execute APENAS essa fase. Se informar "TUDO", execute sequencialmente parando a cada fase para confirmação.
Ao final de CADA fase, gere um CHECKPOINT com: (1) O que foi feito, (2) Próxima fase, (3) Arquivos criados/modificados.
ATENÇÃO: O banco de dados EXISTE e tem dados reais. NUNCA execute DROP TABLE, TRUNCATE ou DELETE em massa nas tabelas existentes.

📋 RESUMO EXECUTIVO (Contexto)

Empresa de logística Gade Hospitalar precisa controlar custos por operação (ex: UBS SUL, UBS LESTE, EMAD, STS, SAD).
Sistema web em Ruby on Rails + PostgreSQL 15 (banco JÁ EXISTE com dados reais) + Docker.
Público: administradores, gerentes, motoristas e operadores (baixo nível tech).
Design: moderno, minimalista, cores padrão PRETO + LARANJA + BRANCO, ícones grandes, poucos cliques, feedback visual claro.

🗄️ DADOS REAIS DO BANCO EXISTENTE REAL

📡 Tabela existente: public.db_reem_simplerout_2026
🔄 Atualização: Automática a cada 1 hora (dados sobem de outro sistema)
🏢 Account: Gade Hospitalar (account_id: 95907)

📊 Estrutura da Tabela Existente (46 colunas)

ColunaTipoUso no Sistema
tracking_idstringID único da entrega (PK lógico)
reference_idintegerNúmero da NF (Nota Fiscal)
planned_datedateData planejada da entrega
driverstringNome do motorista
codriversstringAjudante (geralmente NULL)
vehiclestringPlaca/ID do veículo (ex: GADE_037)
titlestringTítulo da entrega (ex: "NF 46497 - ELISABETH ROCHA FERREIRA")
addressstringEndereço completo da entrega
etatimeHora estimada de chegada
etdtimeHora estimada de saída
checkindatetimeHorário real de chegada (pode ser NULL)
checkoutdatetimeHorário real de saída
responsible_personstringQuem fez a entrega (mesmo que driver)
estimated_service_timeintervalTempo estimado de serviço (fixo 00:10:00)
real_service_timeintervalTempo real de serviço (checkout - checkin)
advanceintervalQuanto chegou antes do planejado
delayintervalQuanto atrasou (geralmente 00:00)
latitude / longitudedecimalCoordenadas de chegada
checkout_latitude / checkout_longitudedecimalCoordenadas de saída
load / load_2 / load_3integerQuantidade de cargas (geralmente 1/0/0)
statusstringStatus da entrega (completed, pending, etc.)
commentstextComentários do motorista
observationstringObservações internas
start_of_time_window_1 / end_of_time_window_1timeJanela de horário 1 (08:00-18:00)
start_of_time_window_2 / end_of_time_window_2timeJanela de horário 2 (23:59-23:59)
required_skills / optional_skillsstringHabilidades necessárias
notesstringComplementos (ex: "COMPL: CASA 1", "TEL: (11) 99999-9999")
contact_namestringNome do local (ex: UBS SACOMA, EMAD VELEIROS, STS BUTANTA)
contact_phonestringTelefone do local
contact_emailstringEmail do local (geralmente NULL)
route_iduuidID da rota/operacao (ex: UBS SUL, UBS LESTE)
account_idintegerID da conta (95907 = Gade Hospitalar)
account_namestringNome da conta
nota_fiscalurlFoto da NF (URL S3)
protocolo_de_entregaurlFoto do protocolo (URL S3)
termo_de_recebimentourlFoto do termo (URL S3)
foto_da_fachadaurlFoto da fachada (URL S3)
relatorio_de_visitaurlFoto do relatório (URL S3)
numero_de_serie_da_base_aparelhostringNúmero de série do equipamento

📈 Dados de Exemplo (Extraídos do Banco Real)

🔑 Regras de Negócio Baseadas nos Dados Reais

🔧 MELHORIAS SUGERIDAS NO DESIGN E LÓGICA

✨ MELHORIA 1 — Cards Visuais Grandes no Dashboard NOVO

Cards com cores da marca (preto/laranja/branco):

✨ MELHORIA 2 — Modo "Revisão Rápida" com Ações em Massa NOVO

Botões de ação em massa na consolidação:

✨ MELHORIA 3 — Preview do Holerite Antes de Gerar PDF NOVO

Modal de preview HTML antes de gerar PDF — evita erros e re-trabalho.

✨ MELHORIA 4 — Notificações WhatsApp/E-mail NOVO

Ao finalizar consolidação, enviar para motoristas: "Sua consolidação [Período] está pronta. Valor: R$ [X]. Baixe: [link]"

✨ MELHORIA 5 — Comparativo Estimado vs Consolidado NOVO

Gráfico de barras lado a lado no Dashboard: Estimado (cinza) vs Consolidado (laranja) vs Diferença (preto).

✨ MELHORIA 6 — Filtro Avançado nas Consolidações NOVO

Busca por nome da operação, período, motorista, status, route_id.

✨ MELHORIA 7 — Soft Delete + Auditoria NOVO

Consolidações finalizadas NUNCA excluídas — apenas arquivadas. Log completo de quem fez o quê.

✨ MELHORIA 8 — Tema Escuro/Claro NOVO

Toggle ☀️/🌙 no header. Tema escuro como padrão (preto + laranja fica incrível).

🔁 MUDANÇA 1 — Checkboxes → Toggle Switches Visuais MUDANÇA

Toggle switches grandes coloridos: 🟠 laranja = Entrega Normal | ⚫ preto = Desconto | ⚪ branco = Bônus | 🟠 laranja escuro = Retirada

🔁 MUDANÇA 2 — Validação em Wizard de 3 Passos MUDANÇA

Passo 1: Selecionar motorista | Passo 2: Classificar entregas com toggles + ações em massa | Passo 3: Revisar resumo → Próximo ou Finalizar

🔁 MUDANÇA 3 — Job de 1h + Cálculo em Tempo Real MUDANÇA

Job persiste histórico, mas Dashboard calcula na hora ao abrir. Sem esperar 1h.

🔁 MUDANÇA 4 — Login por PIN de 4 Dígitos + QR Code MUDANÇA

Motoristas usam PIN numérico ou escaneiam QR do holerite. Sem senha complexa.

🏗️ ARQUITETURA

CamadaTecnologia
BackendRuby on Rails 7+ (API + Views)
FrontendRails Views + Hotwire (Turbo + Stimulus)
CSSTailwind CSS (tema customizado preto/laranja/branco)
Banco ExistentePostgreSQL 15 — tabela db_reem_simplerout_2026 (apenas leitura)
Banco NovoPostgreSQL 15 — tabelas do sistema (mesma instância, schema separado ou prefixo)
AuthDevise + Pundit (roles: admin, gerente, operador, motorista)
PDFPrawn (mais leve que WickedPDF)
Job/CronWhenever gem
NotificaçõesTwilio (WhatsApp) ou ActionMailer — opcional Fase 8
DockerDocker + docker-compose.yml
Config.env (NUNCA versionar)
GitServidor privado: https://git.xenserver.com.br

🔒 REPOSITÓRIO GIT SEGURANÇA

⚠️ AVISO DE SEGURANÇA:
NUNCA armazene credenciais de login (usuário/senha) em arquivos de código, prompts ou documentação.
Sempre use variáveis de ambiente, CI/CD secrets ou gerenciadores de credenciais.

📡 Servidor Git Privado

URL: https://git.xenserver.com.br (servidor próprio, privado)

Repositório: logistica-controle-custos (criar como PRIVADO)

🔐 Configuração Segura

  1. Acesse https://git.xenserver.com.br e faça login com credenciais pessoais
  2. Crie repositório privado: logistica-controle-custos
  3. Configure remote local (SEM credenciais no URL):
git init
git add .
git commit -m "Initial commit - Fase 1"

# Adicionar remote sem credenciais
git remote add origin https://git.xenserver.com.br/[USUARIO]/logistica-controle-custos.git

# Cache de credenciais (pede senha uma vez)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'

# Primeiro push (digitar usuário/senha manualmente)
git push -u origin main

📝 .gitignore Obrigatório

# CREDENCIAIS — NUNCA versionar
.env
.env.local
.env.*.local
config/application.yml
config/database.yml
docker-compose.override.yml
*.pem
*.key
*.p12

# Rails
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
/storage/*
!/storage/.keep
/public/assets
/node_modules
/yarn-error.log
.byebug_history
/config/master.key
/config/credentials/*.key

# Docker
.env.docker

# IDEs
.idea/
.vscode/
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db

📋 Checklist de Segurança do Repositório

👥 PERFIL DE USUÁRIOS E PERMISSÕES

PerfilAcesso
AdminTudo: Dashboard, Consolidação, Configurações, Motoristas, Auditoria
GerenteDashboard, Consolidação, gerar PDFs/holerites, visualizar arquivadas
OperadorApenas Consolidação (criar, validar entregas, toggles), ver próprias consolidações
MotoristaDashboard pessoal: valores estimados + consolidados validados, baixar próprio PDF

💰 PILARES DE PREÇO (Configuráveis na tela Configurações)

PilarDescriçãoTipoQuando Aplicar
Entrega Bem-SucedidaValor pago por entrega concluídaValor fixo (R$)status = 'completed' E checkin IS NOT NULL
Retirada de EquipamentoValor pago por retirada/devoluçãoValor fixo (R$)Quando o operador marcar como "Retirada" na consolidação
BônusValor adicional por meta/critérioValor fixo (R$)Quando o operador marcar como "Bônus" na consolidação
DescontoValor descontado por problemaValor fixo (R$)Quando o operador marcar como "Desconto" na consolidação

📐 ESTRUTURA DE TELAS

🔐 TELA DE LOGIN

🖥️ PAINEL ADMIN / GERENTE / OPERADOR

1. DASHBOARD

2. CONSOLIDAÇÃO

3. CONFIGURAÇÕES

🛵 PAINEL MOTORISTA

🗄️ MODELO DE DADOS

📡 TABELAS EXISTENTES (APENAS LEITURA — NUNCA MODIFICAR)

-- Já existe no PostgreSQL 15, atualizada a cada 1h
-- Nome: public.db_reem_simplerout_2026
-- Colunas principais usadas pelo sistema:
--   tracking_id (PK lógico)
--   reference_id (número da NF)
--   planned_date (data da entrega)
--   driver (nome do motorista)
--   vehicle (placa/ID veículo)
--   title (descrição da entrega)
--   checkin, checkout (horários reais)
--   status ('completed', 'pending', 'cancelled', etc.)
--   route_id (UUID da operação/rota)
--   contact_name (nome do local: UBS, EMAD, STS, SAD)
--   load, load_2, load_3 (quantidade de cargas)
--   nota_fiscal, relatorio_de_visita (URLs S3)
--   latitude, longitude, checkout_latitude, checkout_longitude

🆕 TABELAS NOVAS DO SISTEMA (criar no mesmo PostgreSQL, schema separado ou prefixo)

users (id, email, encrypted_password, pin_code, role, nome, telefone, ativo, tema_preferido, created_at, updated_at)
  role: enum [admin, gerente, operador, motorista]
  pin_code: string (4 dígitos, apenas motoristas)

configuracoes (id, chave, valor, descricao, updated_at, updated_by)
  chaves: 'preco_entrega', 'preco_retirada', 'preco_bonus', 'preco_desconto',
         'notificacao_whatsapp', 'notificacao_email', 'empresa_nome'

consolidacoes (id, nome, data_inicio, data_fim, status, valor_total,
               created_by, finalizado_por, finalizado_em, created_at, updated_at, deleted_at)
  status: enum [rascunho, finalizada, arquivada]

consolidacao_motoristas (id, consolidacao_id, motorista_nome, valor_total, created_at, updated_at)
  -- motorista_nome = driver do banco existente

consolidacao_entregas (id, consolidacao_id, tracking_id, motorista_nome,
                       tipo, valor_aplicado, created_at, created_by)
  tipo: enum [entrega_normal, retirada, bonus, desconto]
  -- tracking_id referencia db_reem_simplerout_2026.tracking_id

historico_estimados (id, data_hora, valor_total_estimado, entregas_contadas, created_at)
  -- atualizado a cada 1h pelo job

auditoria_logs (id, user_id, acao, entidade, entidade_id, dados_anteriores, dados_novos, created_at)
  -- log de todas as ações críticas

🐳 DOCKER + CONFIGURAÇÃO (YAML)

# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports: ["3000:3000"]
    env_file: .env
    environment:
      DATABASE_URL: ${DATABASE_URL}
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_NAME: ${DB_NAME}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      REDIS_URL: ${REDIS_URL}
    volumes: [".:/app"]
    depends_on: [db, redis]
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - "pg_data:/var/lib/postgresql/data"
      # Se o banco existente estiver em outro servidor, remover esta seção
      # e apontar DB_HOST para o servidor correto
  redis:
    image: redis:alpine
volumes:
  pg_data:

# .env (NUNCA versionar — adicionar no .gitignore)
# ================================================
DATABASE_URL="postgresql://user:pass@host:5432/db"
DB_HOST="db"                    # ou IP do servidor PostgreSQL existente
DB_PORT="5432"
DB_NAME="logistica_db"
DB_USER="postgres"
DB_PASSWORD="senha_segura"
SECRET_KEY_BASE="gerar_com_rails_secret"
REDIS_URL="redis://redis:6379/0"

# Twilio (opcional — Fase 8)
TWILIO_ACCOUNT_SID=""
TWILIO_AUTH_TOKEN=""
TWILIO_WHATSAPP_FROM=""

# Configuração do banco existente
DB_EXISTING_TABLE="db_reem_simplerout_2026"
DB_EXISTING_SCHEMA="public"

🎨 DIRETRIZES DE DESIGN (UX para baixo nível tech)

🎨 Paleta de Cores da Marca

ElementoCorHex
Fundo principal (tema escuro)Preto#0a0a0a ou #111111
Fundo cardsCinza escuro#1a1a1a ou #1e1e1e
Cor primária (botões, destaques)Laranja#f97316 ou #ea580c
Cor secundária (textos, ícones)Branco#ffffff
Cor de alerta/sucessoVerde#22c55e
Cor de erro/descontoVermelho#ef4444
Cor de info/bônusAzul claro#38bdf8

📐 Regras de UX

📊 JOB DE ATUALIZAÇÃO ESTIMADA (a cada 1h)

# Gemfile: gem 'whenever', require: false
# config/schedule.rb
every 1.hour do
  runner "HistoricoEstimado.atualizar!"
end

# app/models/historico_estimado.rb
class HistoricoEstimado < ApplicationRecord
  def self.atualizar!
    preco = Configuracao.valor('preco_entrega').to_f
    # Buscar entregas do dia com status 'completed' e checkin IS NOT NULL
    entregas = DbReemSimplerout2026
      .where(status: 'completed')
      .where.not(checkin: nil)
      .where(planned_date: Date.current)
      .count
    total = entregas * preco
    create!(
      data_hora: Time.current,
      valor_total_estimado: total,
      entregas_contadas: entregas
    )
  end
end

# O Dashboard calcula em tempo real na hora do acesso:
# SELECT COUNT(*) FROM db_reem_simplerout_2026
# WHERE status = 'completed' AND checkin IS NOT NULL
# AND planned_date BETWEEN :inicio AND :fim
# O job serve apenas para manter histórico de gráficos.

📄 GERADOR DE PDF (Holerite)

🔧 FASES DE IMPLEMENTAÇÃO (Checkpoint obrigatório ao final de cada uma)

🟠 FASE 1 — Setup Inicial + Docker + Git

  1. Criar estrutura Rails 7+ com docker-compose.yml
  2. Configurar conexão com PostgreSQL 15 existente (tabela db_reem_simplerout_2026 — APENAS LEITURA)
  3. Criar model DbReemSimplerout2026 com self.table_name = 'db_reem_simplerout_2026' e self.primary_key = 'tracking_id'
  4. Criar tabelas novas: users, configuracoes, consolidacoes, consolidacao_motoristas, consolidacao_entregas, historico_estimados, auditoria_logs
  5. Configurar gem Figaro ou dotenv para variáveis em .env (NUNCA versionar .env)
  6. Instalar e configurar Devise + Pundit (roles: admin, gerente, operador, motorista)
  7. Seed: criar usuário admin padrão (admin@gade.com / senha123)
  8. Testar docker-compose up e acesso ao Rails
  9. Inicializar repositório Git: git init, criar .gitignore completo, primeiro commit
  10. Adicionar remote para servidor privado git.xenserver.com.br
  11. Push inicial para o servidor Git privado
CHECKPOINT FASE 1: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 2 — Autenticação + Perfis + Configurações

  1. Implementar login com redirecionamento por role
  2. Login por PIN de 4 dígitos para motoristas (alternativa a senha)
  3. Criar tela de Configurações com CRUD de usuários (admin/gerente/operador/motorista)
  4. Criar CRUD de Pilares de Preço (entrega, retirada, bônus, desconto) com máscara de moeda
  5. Validar permissões: operador não vê config, motorista não vê admin
  6. Layout base com navegação lateral responsiva (Tailwind + tema preto/laranja/branco)
  7. Toggle tema claro/escuro no header
  8. Commit e push para o Git privado
CHECKPOINT FASE 2: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 3 — Dashboard Admin/Gerente

  1. Criar controller Dashboard com métricas consolidadas
  2. Cards coloridos grandes (preto/laranja/branco): Entregas OK, Pendentes, Descontos, Bônus
  3. Gráfico comparativo Estimado vs Consolidado (Chart.js simples, cores da marca)
  4. Lista últimas 5 consolidações com link para detalhe
  5. Barra de progresso "% do mês consolidado"
  6. Cálculo em tempo real (SQL rápido) ao carregar a página — buscar de db_reem_simplerout_2026
  7. Commit e push para o Git privado
CHECKPOINT FASE 3: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 4 — Job de Atualização Automática (1h) + Auditoria

  1. Implementar job com Whenever gem para rodar a cada 1 hora
  2. Lógica: contar entregas status='completed' + checkin IS NOT NULL do dia, multiplicar por preco_entrega, salvar em historico_estimados
  3. Criar modelo AuditoriaLog para registrar ações críticas (criar, editar, finalizar, arquivar consolidação)
  4. Expor valor na API interna para o Dashboard
  5. Testar execução manual e confirmar persistência no banco
  6. Commit e push para o Git privado
CHECKPOINT FASE 4: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 5 — Consolidação (Criar + Selecionar + Wizard Passo 1)

  1. Tela "Nova Consolidação": formulário com nome, período (2 date pickers), multi-select de motoristas (busca de driver do banco), multi-select de rotas (route_id)
  2. Ao salvar: criar registro em consolidacoes (status: rascunho) + consolidacao_motoristas
  3. Listar consolidações com filtros (status, período, nome, motorista, route_id)
  4. Wizard Passo 1: Selecionar motorista da lista (com total de entregas no período)
  5. Commit e push para o Git privado
CHECKPOINT FASE 5: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 6 — Validação de Entregas + Toggles + Ações em Massa

  1. Wizard Passo 2: Buscar entregas do período para o motorista selecionado (de db_reem_simplerout_2026)
  2. Toggle switches coloridos grandes (laranja=normal, preto=desconto, branco=bônus, laranja escuro=retirada)
  3. Ações em massa: "Marcar todos como Normal", "Marcar selecionados como..."
  4. Filtro "Mostrar apenas não classificadas"
  5. Barra de progresso "X de Y entregas classificadas"
  6. Resumo lateral com total por tipo (Stimulus para atualização em tempo real)
  7. Wizard Passo 3: Revisar resumo do motorista → "Próximo Motorista" ou "Salvar Rascunho"
  8. Validação: não permitir finalizar sem classificar todas as entregas
  9. Commit e push para o Git privado
CHECKPOINT FASE 6: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 7 — Geração de PDFs (Preview + Relatório + Holerite)

  1. Instalar e configurar Prawn (mais leve que WickedPDF)
  2. Layout de PDF: logo preto/laranja, nome consolidação, período, tabela de entregas, total
  3. Modal de Preview HTML antes de gerar PDF (modal com botão Confirmar/Voltar)
  4. Botão "Gerar Relatório Individual" por motorista (PDF com detalhe das entregas)
  5. Botão "Gerar Holerite" (PDF resumido com valor total a pagar — estilo holerite)
  6. QR code no holerite para login rápido do motorista
  7. Soft delete: consolidações finalizadas vão para status "arquivada", nunca excluídas
  8. Commit e push para o Git privado
CHECKPOINT FASE 7: Liste todos os arquivos criados/modificados. Pare. Aguarde próxima fase.

🟠 FASE 8 — Painel do Motorista + Notificações + Finalização

  1. Tela do motorista após login: 2 cards grandes (Valor Estimado laranja | Valor Consolidado branco)
  2. Lista de consolidações em que ele aparece com link para baixar próprio PDF
  3. Login por PIN ou QR Code (escaneia holerite para acessar)
  4. Notificações: integração Twilio (WhatsApp) ou ActionMailer (email) — ao finalizar consolidação, enviar mensagem automática para motoristas
  5. Ajustes finais de responsividade (mobile)
  6. Revisar todas as permissões (Pundit)
  7. Revisar textos/labels para clareza (público baixo nível tech)
  8. README.md com instruções de deploy Docker e configuração do .env
  9. Teste end-to-end: login → criar consolidação → validar → gerar PDF → notificar → logout → login motorista → ver valores
  10. Commit final e push para o Git privado
CHECKPOINT FASE 8 (FINAL): Liste todos os arquivos do projeto. Status: ✅ COMPLETO.

💡 DICAS PARA O CLAUDE (Instruções de Otimização)

📝 EXEMPLO DE COMANDO PARA INICIAR CADA FASE

# No início de cada conversa com o Claude, cole:
"Execute a FASE [NÚMERO] do prompt de Sistema de Controle de Custos Logística.
A fase anterior foi concluída. Aqui está o CHECKPOINT da fase anterior: [COLE AQUI]"

# Comandos Git a cada fase:
git add .
git commit -m "Fase X - [descricao]"
git push origin main
⚠️ IMPORTANTE: Se em alguma fase o Claude atingir o limite de tokens/contexto, peça para ele gerar o CHECKPOINT incompleto e continue na próxima conta free com: "Continue a FASE X a partir deste CHECKPOINT: [cole]".
🔐 LEMBRETE FINAL DE SEGURANÇA: