# 🚛 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)

Coluna | Tipo | Uso no Sistema
--- | --- | ---
tracking_id | string | ID único da entrega (PK lógico)
reference_id | integer | Número da NF (Nota Fiscal)
planned_date | date | Data planejada da entrega
driver | string | Nome do motorista
codrivers | string | Ajudante (geralmente NULL)
vehicle | string | Placa/ID do veículo (ex: GADE_037)
title | string | Título da entrega (ex: "NF 46497 - ELISABETH ROCHA FERREIRA")
address | string | Endereço completo da entrega
eta | time | Hora estimada de chegada
etd | time | Hora estimada de saída
checkin | datetime | Horário real de chegada (pode ser NULL)
checkout | datetime | Horário real de saída
responsible_person | string | Quem fez a entrega (mesmo que driver)
estimated_service_time | interval | Tempo estimado de serviço (fixo 00:10:00)
real_service_time | interval | Tempo real de serviço (checkout - checkin)
advance | interval | Quanto chegou antes do planejado
delay | interval | Quanto atrasou (geralmente 00:00)
latitude / longitude | decimal | Coordenadas de chegada
checkout_latitude / checkout_longitude | decimal | Coordenadas de saída
load / load_2 / load_3 | integer | Quantidade de cargas (geralmente 1/0/0)
status | string | Status da entrega (completed, pending, etc.)
comments | text | Comentários do motorista
observation | string | Observações internas
start_of_time_window_1 / end_of_time_window_1 | time | Janela de horário 1 (08:00-18:00)
start_of_time_window_2 / end_of_time_window_2 | time | Janela de horário 2 (23:59-23:59)
required_skills / optional_skills | string | Habilidades necessárias
notes | string | Complementos (ex: "COMPL: CASA 1", "TEL: (11) 99999-9999")
contact_name | string | Nome do local (ex: UBS SACOMA, EMAD VELEIROS, STS BUTANTA)
contact_phone | string | Telefone do local
contact_email | string | Email do local (geralmente NULL)
route_id | uuid | ID da rota/operacao (ex: UBS SUL, UBS LESTE)
account_id | integer | ID da conta (95907 = Gade Hospitalar)
account_name | string | Nome da conta
nota_fiscal | url | Foto da NF (URL S3)
protocolo_de_entrega | url | Foto do protocolo (URL S3)
termo_de_recebimento | url | Foto do termo (URL S3)
foto_da_fachada | url | Foto da fachada (URL S3)
relatorio_de_visita | url | Foto do relatório (URL S3)
numero_de_serie_da_base_aparelho | string | Número de série do equipamento

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

- Motoristas: Bruno Corgozinho, Carlos Matheus Pimentel, Edson Vinicius Pereira, Gregori Karenkvic, Steferson Lucas, Thiago Rabello Bittencourt, Henderson Estevam
- Veículos: GADE_001 a GADE_123 (14 veículos diferentes)
- Locais (contact_name): UBS SACOMA, UBS JD SELMA, EMAD SANTA CECILIA, EMAD VELEIROS, STS BUTANTA, EMAD GUARANI VARGAS, UBS JD ELIANE, SAD SANTO AMARO, UBS UNIAO DAS VLS DE TAIPAS, UBS ALMIRANTE DELLAMARE, UBS JD AEROPORTO, UBS JD PARANAPANEMA, UBS SANTA LUCIA
- Rotas (route_id): UUIDs que agrupam entregas por operação
- Status: completed (entregas concluídas), pode haver pending, cancelled, etc.
- Checkin: Pode ser NULL (entrega sem registro de chegada)
- Load: Geralmente 1 (uma carga por entrega)

### 🔑 Regras de Negócio Baseadas nos Dados Reais

- Uma entrega = um `tracking_id` único
- Cada entrega tem um `reference_id` = número da NF
- O `driver` é o motorista principal (codrivers geralmente NULL)
- O `contact_name` identifica o local/UBS de destino
- O `route_id` agrupa entregas da mesma operação (ex: UBS SUL, UBS LESTE)
- `status = 'completed'` = entrega bem-sucedida (paga)
- `status != 'completed'` = pode ser desconto, pendente, cancelada
- `checkin IS NULL` = motorista não registrou chegada (possível desconto)
- `real_service_time = '00:00:00'` = chegou e saiu no mesmo minuto (possível problema)

# 🔧 MELHORIAS SUGERIDAS NO DESIGN E LÓGICA

### ✨ MELHORIA 1 — Cards Visuais Grandes no Dashboard NOVO

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

- 🟠 Card Entregas OK — laranja, contador grande e % de sucesso
- ⚫ Card Pendentes — preto, entregas não consolidadas
- ⚪ Card Descontos — branco com borda laranja, total de descontos
- 🟠 Card Bônus — laranja claro, total de bônus

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

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

- "Marcar Todos como Entrega Normal"
- "Marcar Selecionados como..." (Shift+click para selecionar múltiplas)
- Filtro: "Mostrar apenas não classificadas"
- Barra de progresso: "340 de 400 entregas classificadas (85%)"

### ✨ MELHORIA 3 — Preview do Extrato 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 extrato. Sem senha complexa.

## 🏗️ ARQUITETURA

Camada | Tecnologia
--- | ---
Backend | Ruby on Rails 7+ (API + Views)
Frontend | Rails Views + Hotwire (Turbo + Stimulus)
CSS | Tailwind CSS (tema customizado preto/laranja/branco)
Banco Existente | PostgreSQL 15 — tabela `db_reem_simplerout_2026` (apenas leitura)
Banco Novo | PostgreSQL 15 — tabelas do sistema (mesma instância, schema separado ou prefixo)
Auth | Devise + Pundit (roles: admin, gerente, operador, motorista)
PDF | Prawn (mais leve que WickedPDF)
Job/Cron | Whenever gem
Notificações | Twilio (WhatsApp) ou ActionMailer — opcional Fase 8
Docker | Docker + docker-compose.yml
Config | .env (NUNCA versionar)
Git | Servidor 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

- ✅ Repositório marcado como PRIVADO
- ✅ Arquivo `.env` no `.gitignore`
- ✅ Nenhuma senha, token ou chave em código
- ✅ `config/database.yml` usa variáveis de ambiente
- ✅ `docker-compose.yml` usa `env_file: .env`
- ✅ Secret Key Base gerada via `rails secret` e armazenada em variável de ambiente

## 👥 PERFIL DE USUÁRIOS E PERMISSÕES

Perfil | Acesso
--- | ---
Admin | Tudo: Dashboard, Consolidação, Configurações, Motoristas, Auditoria
Gerente | Dashboard, Consolidação, gerar PDFs/extratos, visualizar arquivadas
Operador | Apenas Consolidação (criar, validar entregas, toggles), ver próprias consolidações
Motorista | Dashboard pessoal: valores estimados + consolidados validados, baixar próprio PDF

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

Pilar | Descrição | Tipo | Quando Aplicar
--- | --- | --- | ---
Entrega Bem-Sucedida | Valor pago por entrega concluída | Valor fixo (R$) | status = 'completed' E checkin IS NOT NULL
Retirada de Equipamento | Valor pago por retirada/devolução | Valor fixo (R$) | Quando o operador marcar como "Retirada" na consolidação
Bônus | Valor adicional por meta/critério | Valor fixo (R$) | Quando o operador marcar como "Bônus" na consolidação
Desconto | Valor descontado por problema | Valor fixo (R$) | Quando o operador marcar como "Desconto" na consolidação

## 📐 ESTRUTURA DE TELAS

### 🔐 TELA DE LOGIN

- Campos: email, senha (admin/gerente/operador)
- Alternativa motorista: PIN de 4 dígitos ou QR Code
- Botão grande "Entrar" com ícone
- Esqueci minha senha → link mágico por email
- Fundo preto, botão laranja, texto branco

### 🖥️ PAINEL ADMIN / GERENTE / OPERADOR

### 1. DASHBOARD

- Cards grandes (preto/laranja/branco):
  - 🟠 Entregas OK — total de entregas completed no período
  - ⚫ Pendentes — entregas não consolidadas ainda
  - ⚪ Descontos — total de descontos aplicados
  - 🟠 Bônus — total de bônus concedidos
- Gráfico comparativo: barras lado a lado Estimado (cinza) vs Consolidado (laranja) por operação/route_id
- Lista últimas 5 consolidações com status e link
- Barra de progresso: "% do mês consolidado"
- Atualização em tempo real ao carregar + job de 1h para histórico

### 2. CONSOLIDAÇÃO

- Lista de consolidações com filtros (nome, período, motorista, status, route_id)
- Botão "Nova Consolidação" → modal:
  - Nome (ex: UBS SUL e LESTE Junho 2026)
  - Período (date range: planned_date)
  - Selecionar Motoristas (multi-select com busca — lista única de `driver` do banco)
  - Selecionar Rotas/Operações (multi-select de `route_id`)
- Wizard de Validação (3 passos):
  1. Passo 1: Selecionar motorista da lista (com foto/nome e total de entregas no período)
  2. Passo 2: Classificar entregas com Toggle Switches coloridos:
     - 🟠 Laranja = Entrega Normal (padrão)
     - ⚫ Preto = Desconto
     - ⚪ Branco = Bônus
     - 🟠 Laranja Escuro = Retirada de Equipamento
     + Ações em massa + filtro "não classificadas"
  3. Passo 3: Revisar resumo do motorista → "Próximo Motorista" ou "Finalizar Tudo"
- Barra de progresso: "85% classificado — 340 de 400 entregas"
- Botões: "Salvar Rascunho" | "Finalizar Consolidação" (modal de confirmação)
- Após finalizar: Preview do Extrato em modal HTML → "Gerar PDF"

### 3. CONFIGURAÇÕES

- Usuários: CRUD de logins com foto, role, status ativo/inativo
- Pilares de Preço: campos editáveis com máscara de moeda (R$), cores da marca
- Notificações: ligar/desligar WhatsApp/email, configurar Twilio
- Geral: nome da empresa, upload de logo, tema padrão
- Auditoria: log de quem criou/editou/finalizou o quê e quando

### 🛵 PAINEL MOTORISTA

- 2 Cards grandes:
  - 🟠 Valor Estimado (laranja) — cálculo ao vivo: entregas completed × preço_entrega
  - ⚪ Valor Consolidado (branco com borda laranja) — validado pelo operador
- Lista de consolidações em que o motorista aparece (nome, período, valor, botão PDF)
- Botão de tema: ☀️/🌙 no canto superior
- Design mobile-first: cards empilhados, fonte grande (min 18px), botões de dedo (min 48px)
- Fundo preto, cards cinza escuro, destaques em laranja

## 🗄️ 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

Elemento | Cor | Hex
--- | --- | ---
Fundo principal (tema escuro) | Preto | #0a0a0a ou #111111
Fundo cards | Cinza escuro | #1a1a1a ou #1e1e1e
Cor primária (botões, destaques) | Laranja | #f97316 ou #ea580c
Cor secundária (textos, ícones) | Branco | #ffffff
Cor de alerta/sucesso | Verde | #22c55e
Cor de erro/desconto | Vermelho | #ef4444
Cor de info/bônus | Azul claro | #38bdf8

### 📐 Regras de UX

- Fonte mínima 18px no mobile, 16px no desktop
- Botões mínimo 48px de altura, cantos arredondados (rounded-lg)
- Toggle switches em vez de checkboxes — área maior, feedback visual
- Modais de confirmação para ações destrutivas (finalizar, arquivar)
- Toast notifications no canto superior direito, cor laranja para sucesso
- Wizard em passos — uma ação por tela, sem abas aninhadas
- Mobile-first — muitos motoristas acessarão pelo celular
- Tema escuro como padrão — preto + laranja é a identidade da marca
- Ícones + texto — nunca ícone sozinho
- Placeholders explicativos nos campos (ex: "Ex: UBS SUL e LESTE Junho 2026")
- Loading states — spinner laranja ao carregar dados
- Empty states — mensagem amigável quando não há dados (ex: "Nenhuma entrega neste período")

## 📊 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 (Extrato)

- Cabeçalho: logo da empresa (preto + laranja), nome da consolidação, período, data de geração
- Dados do motorista: nome, período trabalhado, total de entregas
- Corpo: tabela com entregas (data, NF, local/contact_name, tipo, valor unitário, valor total)
- Resumo: total de entregas normais, retiradas, bônus, descontos, valor final a pagar
- Rodapé: "Documento gerado automaticamente em [data]", QR code para validação
- Estilo: limpo, fonte legível, cores preto/laranja/branco

# 🔧 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 + Extrato)

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 Extrato" (PDF resumido com valor total a pagar — estilo extrato)
6. QR code no extrato 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 extrato 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)

- Use Rails 7+ com importmap — evite Webpack para reduzir complexidade
- Use Tailwind via CDN durante desenvolvimento, depois compile se necessário
- Para o banco existente: use `self.table_name = 'db_reem_simplerout_2026'` e `self.primary_key = 'tracking_id'` — NUNCA crie migration para essa tabela
- Para toggles: use Stimulus para atualizar totais em tempo real sem recarregar página
- Para o job de 1h: use Whenever gem (mais simples que Sidekiq para cron)
- Para PDF: Prawn é mais leve que WickedPDF (sem dependência de wkhtmltopdf)
- Para mobile: use CSS Grid/Flexbox com breakpoints Tailwind (`md:`, `lg:`)
- Para tema escuro: use `dark:` prefix do Tailwind + `class` strategy — tema escuro como padrão
- Para cores da marca: configure no `tailwind.config.js` — preto `#0a0a0a`, laranja `#f97316`, branco `#ffffff`
- Seja verboso nos CHECKPOINTS — liste arquivo por arquivo para continuidade
- A cada fase: `git add . && git commit -m "Fase X completa" && git push`
- Se o banco existente estiver em servidor separado, configure `DB_HOST` no .env apontando para o IP correto

## 📝 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:

- NUNCA commit arquivos .env, application.yml, ou qualquer arquivo com senha
- NUNCA exponha SECRET_KEY_BASE, senhas de banco, ou tokens de API
- Sempre use `ENV['VARIAVEL']` no código Rails
- Configure o repositório Git como PRIVADO no servidor `git.xenserver.com.br`
- Use HTTPS com credential helper ou SSH keys para autenticação no Git
- NUNCA execute DROP TABLE, TRUNCATE ou DELETE em massa na tabela `db_reem_simplerout_2026` existente