Alteração de alguns arquivos para retirar do yaml o container Postgres pois ja tem um
This commit is contained in:
24
.env.example
24
.env.example
@@ -6,38 +6,36 @@
|
|||||||
# Ambiente Rails
|
# Ambiente Rails
|
||||||
RAILS_ENV=development
|
RAILS_ENV=development
|
||||||
|
|
||||||
# Banco de dados principal (novo sistema)
|
# ── Banco de dados (seu PostgreSQL já existente) ─────────────
|
||||||
DATABASE_URL=postgresql://postgres:senha_segura@db:5432/logistica_db
|
# Aponte DB_HOST para o IP ou hostname do seu servidor PostgreSQL
|
||||||
DB_HOST=db
|
DATABASE_URL=postgresql://postgres:senha_segura@SEU_IP:5432/logistica_db
|
||||||
|
DB_HOST=SEU_IP # ex: 192.168.1.100 ou db.gade.com.br
|
||||||
DB_PORT=5432
|
DB_PORT=5432
|
||||||
DB_NAME=logistica_db
|
DB_NAME=logistica_db # nome do banco NOVO que o sistema vai criar
|
||||||
DB_USER=postgres
|
DB_USER=postgres
|
||||||
DB_PASSWORD=senha_segura
|
DB_PASSWORD=senha_segura
|
||||||
|
|
||||||
# Banco de dados existente (Gade Hospitalar — APENAS LEITURA)
|
# ── Tabela existente (apenas leitura — NÃO modificar) ────────
|
||||||
# Se estiver em servidor separado, altere DB_HOST acima para o IP correto
|
|
||||||
DB_EXISTING_TABLE=db_reem_simplerout_2026
|
DB_EXISTING_TABLE=db_reem_simplerout_2026
|
||||||
DB_EXISTING_SCHEMA=public
|
DB_EXISTING_SCHEMA=public
|
||||||
DB_EXISTING_ACCOUNT_ID=95907
|
DB_EXISTING_ACCOUNT_ID=95907
|
||||||
|
|
||||||
# Rails Security — gere com: bundle exec rails secret
|
# ── Rails Security ────────────────────────────────────────────
|
||||||
|
# Gere com: docker-compose exec app bundle exec rails secret
|
||||||
SECRET_KEY_BASE=gere_com_rails_secret_e_cole_aqui
|
SECRET_KEY_BASE=gere_com_rails_secret_e_cole_aqui
|
||||||
|
|
||||||
# Devise — gere com: bundle exec rails secret
|
# ── Twilio — WhatsApp (opcional, Fase 8) ─────────────────────
|
||||||
DEVISE_SECRET_KEY=gere_com_rails_secret_e_cole_aqui
|
|
||||||
|
|
||||||
# Twilio — WhatsApp (opcional, Fase 8)
|
|
||||||
TWILIO_ACCOUNT_SID=
|
TWILIO_ACCOUNT_SID=
|
||||||
TWILIO_AUTH_TOKEN=
|
TWILIO_AUTH_TOKEN=
|
||||||
TWILIO_WHATSAPP_FROM=whatsapp:+14155238886
|
TWILIO_WHATSAPP_FROM=whatsapp:+14155238886
|
||||||
|
|
||||||
# E-mail (opcional, Fase 8)
|
# ── E-mail (opcional, Fase 8) ────────────────────────────────
|
||||||
SMTP_ADDRESS=smtp.gmail.com
|
SMTP_ADDRESS=smtp.gmail.com
|
||||||
SMTP_PORT=587
|
SMTP_PORT=587
|
||||||
SMTP_USERNAME=
|
SMTP_USERNAME=
|
||||||
SMTP_PASSWORD=
|
SMTP_PASSWORD=
|
||||||
SMTP_DOMAIN=gade.com.br
|
SMTP_DOMAIN=gade.com.br
|
||||||
|
|
||||||
# App
|
# ── App ───────────────────────────────────────────────────────
|
||||||
APP_HOST=localhost:3000
|
APP_HOST=localhost:3000
|
||||||
APP_NAME=Gade Logística
|
APP_NAME=Gade Logística
|
||||||
|
|||||||
222
README.md
222
README.md
@@ -2,29 +2,94 @@
|
|||||||
|
|
||||||
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
|
**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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Setup rápido (Docker)
|
## 📋 CONTEXTO DO PROJETO (leia antes de tudo)
|
||||||
|
|
||||||
### 1. Clone o repositório
|
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
|
```bash
|
||||||
git clone https://git.xenserver.com.br/[USUARIO]/logistica-controle-custos.git
|
git clone https://git.xenserver.com.br/Cludio-code/logistica-controle-custos.git
|
||||||
cd logistica-controle-custos
|
cd logistica-controle-custos
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Configure o ambiente
|
### 2. Configure o .env
|
||||||
```bash
|
```bash
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# Edite .env com suas credenciais reais
|
nano .env # preencha DB_HOST, DB_PASSWORD, etc.
|
||||||
nano .env
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Gere o SECRET_KEY_BASE
|
### 3. Gere o SECRET_KEY_BASE
|
||||||
```bash
|
```bash
|
||||||
docker run --rm ruby:3.2.2-slim bundle exec rails secret
|
docker run --rm ruby:3.2.2-slim bash -c "gem install rails --no-doc -q && rails secret"
|
||||||
# Cole o valor gerado no .env → SECRET_KEY_BASE=...
|
# Cole o resultado no .env → SECRET_KEY_BASE=...
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Suba os containers
|
### 4. Suba os containers
|
||||||
@@ -32,7 +97,7 @@ docker run --rm ruby:3.2.2-slim bundle exec rails secret
|
|||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Crie o banco e rode as migrations
|
### 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
|
||||||
```
|
```
|
||||||
@@ -41,73 +106,110 @@ docker-compose exec app bundle exec rails db:create db:migrate db:seed
|
|||||||
```
|
```
|
||||||
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
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ⚠️ Banco de dados existente
|
## 🔧 Comandos do dia a dia
|
||||||
|
|
||||||
A tabela `public.db_reem_simplerout_2026` **já existe** no PostgreSQL da Gade Hospitalar
|
|
||||||
e é atualizada automaticamente a cada 1 hora por outro sistema.
|
|
||||||
|
|
||||||
**NUNCA execute:** `DROP TABLE`, `TRUNCATE`, `DELETE` ou migrations nessa tabela.
|
|
||||||
|
|
||||||
Se o banco existente estiver em servidor separado, configure `DB_HOST` no `.env`
|
|
||||||
apontando para o IP/hostname correto.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Comandos úteis
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Rodar migrations
|
docker-compose exec app bundle exec rails db:migrate # nova migration
|
||||||
docker-compose exec app bundle exec rails db:migrate
|
docker-compose exec app bundle exec rails console # console Rails
|
||||||
|
docker-compose logs -f app # logs em tempo real
|
||||||
# Rodar seeds
|
docker-compose down # parar tudo
|
||||||
docker-compose exec app bundle exec rails db:seed
|
|
||||||
|
|
||||||
# Console Rails
|
|
||||||
docker-compose exec app bundle exec rails console
|
|
||||||
|
|
||||||
# Logs da app
|
|
||||||
docker-compose logs -f app
|
|
||||||
|
|
||||||
# Parar containers
|
|
||||||
docker-compose down
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🏗️ Fases de implementação
|
## 🗺️ Fases de implementação
|
||||||
|
|
||||||
| Fase | Status | Descrição |
|
| Fase | Status | O que fazer |
|
||||||
|------|--------|-----------|
|
|------|--------|-------------|
|
||||||
| 1 | ✅ | Setup + Docker + Git + Models + Migrations |
|
| **1** | ✅ **CONCLUÍDA** | Setup + Docker + Models + Migrations + Seeds + Layout base |
|
||||||
| 2 | ⏳ | Auth (Devise/Pundit) + Perfis + Configurações |
|
| **2** | ⏳ Próxima | Login por role + PIN motorista + CRUD usuários + pilares de preço + sidebar |
|
||||||
| 3 | ⏳ | Dashboard com métricas e gráficos |
|
| **3** | ⏳ | Dashboard: cards grandes laranja/preto/branco + gráfico Chart.js + cálculo ao vivo |
|
||||||
| 4 | ⏳ | Job de atualização automática (1h) + Auditoria |
|
| **4** | ⏳ | Job Whenever (1h) + HistoricoEstimado + AuditoriaLog |
|
||||||
| 5 | ⏳ | Consolidação — wizard Passo 1 |
|
| **5** | ⏳ | Nova Consolidação + Wizard Passo 1 (selecionar motorista) |
|
||||||
| 6 | ⏳ | Validação de entregas + toggles + ações em massa |
|
| **6** | ⏳ | Toggle switches coloridos + ações em massa + barra de progresso (Stimulus) |
|
||||||
| 7 | ⏳ | Geração de PDFs (relatório + holerite) |
|
| **7** | ⏳ | PDFs com Prawn: relatório individual + holerite com QR code |
|
||||||
| 8 | ⏳ | Painel motorista + notificações + finalização |
|
| **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)
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔐 Segurança
|
## 🗄️ Banco existente — referência rápida
|
||||||
|
|
||||||
- **NUNCA** versione o arquivo `.env`
|
| Campo | Uso |
|
||||||
- **NUNCA** commite `config/master.key` ou credenciais
|
|-------|-----|
|
||||||
- Repositório deve ser marcado como **PRIVADO**
|
| `tracking_id` | PK lógico da entrega |
|
||||||
- Use `ENV['VARIAVEL']` no código — nunca hardcode senhas
|
| `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
|
## 👥 Perfis de acesso
|
||||||
|
|
||||||
| Perfil | Acesso |
|
| Perfil | Login | Acesso |
|
||||||
|--------|--------|
|
|--------|-------|--------|
|
||||||
| Admin | Tudo |
|
| Admin | email + senha | Tudo |
|
||||||
| Gerente | Dashboard + Consolidações + PDFs |
|
| Gerente | email + senha | Dashboard + Consolidações + PDFs |
|
||||||
| Operador | Consolidações (criar + validar) |
|
| Operador | email + senha | Consolidações (criar + validar) |
|
||||||
| Motorista | Painel pessoal + baixar próprio PDF |
|
| 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
|
||||||
|
|||||||
@@ -20,30 +20,9 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ".:/app"
|
- ".:/app"
|
||||||
- "bundle_cache:/usr/local/bundle"
|
- "bundle_cache:/usr/local/bundle"
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0"
|
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0"
|
||||||
|
# O banco PostgreSQL já existe externamente.
|
||||||
db:
|
# Configure DB_HOST no .env com o IP/hostname do seu servidor PostgreSQL.
|
||||||
image: postgres:15-alpine
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: ${DB_NAME}
|
|
||||||
POSTGRES_USER: ${DB_USER}
|
|
||||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
||||||
volumes:
|
|
||||||
- "pg_data:/var/lib/postgresql/data"
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
# NOTA: Se o banco existente (db_reem_simplerout_2026) estiver em servidor
|
|
||||||
# separado, remova este serviço e configure DB_HOST no .env apontando para
|
|
||||||
# o IP/hostname correto do servidor PostgreSQL existente.
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
pg_data:
|
|
||||||
bundle_cache:
|
bundle_cache:
|
||||||
|
|||||||
13
setup_git.sh
Executable file → Normal file
13
setup_git.sh
Executable file → Normal file
@@ -19,11 +19,6 @@ echo ""
|
|||||||
git config user.name "Cludio-code"
|
git config user.name "Cludio-code"
|
||||||
git config user.email "claudio@gade.com.br"
|
git config user.email "claudio@gade.com.br"
|
||||||
|
|
||||||
# Inicializa o repositório
|
|
||||||
git init -b main
|
|
||||||
git add .
|
|
||||||
git commit -m "🚀 Fase 1 — Setup inicial: Rails + Docker + Models + Migrations + Seeds"
|
|
||||||
|
|
||||||
# Configura remote SEM credenciais na URL
|
# Configura remote SEM credenciais na URL
|
||||||
git remote add origin "${REMOTE}" 2>/dev/null || git remote set-url origin "${REMOTE}"
|
git remote add origin "${REMOTE}" 2>/dev/null || git remote set-url origin "${REMOTE}"
|
||||||
|
|
||||||
@@ -31,9 +26,13 @@ git remote add origin "${REMOTE}" 2>/dev/null || git remote set-url origin "${RE
|
|||||||
git config credential.helper 'cache --timeout=14400'
|
git config credential.helper 'cache --timeout=14400'
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "✅ Repositório configurado!"
|
echo "✅ Remote configurado: ${REMOTE}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "▶️ Agora execute para subir o código:"
|
echo "▶️ Quando estiver pronto, faça o commit e push manualmente:"
|
||||||
|
echo ""
|
||||||
|
echo " git init -b main"
|
||||||
|
echo " git add ."
|
||||||
|
echo " git commit -m 'Fase 1 — Setup inicial'"
|
||||||
echo " git push -u origin main"
|
echo " git push -u origin main"
|
||||||
echo ""
|
echo ""
|
||||||
echo " Quando solicitado, digite:"
|
echo " Quando solicitado, digite:"
|
||||||
|
|||||||
Reference in New Issue
Block a user