Documentação e exemplo de um sistema completo de gestão para ONG de…
INEMA
:\Users\neima\ong_pets
2) subir banco⌗
.\start_postgres_pets.ps1 -ContainerName postgres-pets -Port 5433 -Password senha123
3) aplicar schema⌗
.\apply_schema_pets.ps1 -SchemaPath .\schema_pets.sql -ContainerName postgres-pets
4) gerar config MCP⌗
.\make_mcp_config_pets.ps1 -DbHost localhost -Port 5433 -Database postgres -User postgres -Password senha123 -Ssl $false
## exemplos de consultas úteis (para o Painel/Claude.md)
• vacinas vencidas
```sql
SELECT p.id, p.nome, v.nome_vacina, v.data_proxima
FROM pets p
JOIN vacinacoes v ON v.pet_id = p.id
WHERE v.data_proxima < CURRENT_DATE
ORDER BY v.data_proxima ASC;```
• perdidos abertos por bairro
S```ELECT local_perdido, COUNT(*) qtd
FROM perdidos_achados
WHERE status = 'perdido'
GROUP BY local_perdido
ORDER BY qtd DESC;
• doações no mês atual
SELECT DATE_TRUNC('day', data) dia, SUM(valor) total
FROM doacoes
WHERE DATE_TRUNC('month', data) = DATE_TRUNC('month', CURRENT_DATE)
GROUP BY dia ORDER BY dia;
notificações⌗
• regra padrão: toda ação relevante gera um evento → Telegram BOTinterno recebe um resumo (novo perdido, encontrado, doação registrada, vacina vencida).
• opcional: disparo para o tutor via WhatsApp (Evolution API) com template curto.
o que já posso entregar de imediato⌗
- schema_pets.sql (acima)
- versões “pets” dos seus scripts, mantendo o padrão de mensagens/validações que você já usa
- Claude.md novo com exemplos em linguagem de pets (substitui o atual )
- checklist de variáveis de “Segredos” para colar no .env
confirme para eu ajustar os arquivos agora⌗
- quer usar p
ostgres-petsna porta 5433? - prefere o nome do produto como “ONG Pets” ou outro da lista?
- quer que eu já gere o Claude.md novo com as perguntas/SQL de exemplo acima e adapte seus scripts para os nomes “pets”?
se disser “sim, porta 5433, nome ONG Pets”, eu já te devolvo o kit completo (schema_pets.sql + scripts .ps1 ajustados + Claude.md pronto).
“ONG de Pets” com web + WhatsApp + e-mail + Telegram + RAG. Vou partir do kit que você já tem (schema.sql, Claude.md, mcp.config.json) e propor a versão “pets” mantendo o mesmo estilo de automação e validação que você usou no projeto anterior .
resumo⌗
• um login simples (e-mail ou WhatsApp) + senha • painel estilo corporativo (KPIs, listas e filtros) • integrações centralizadas em Segredos (.env e/ou tabela) • fluxo completo: cadastro pessoas/pets → perdidos/achados → vacinação → doações PIX → notificações (Telegram interno + WhatsApp/e-mail externo) • base RAG em português para dúvidas de cuidados, treinamento e medicamentos
nomes sugeridos (módulos/serviços)⌗
| área | nomes sugeridos |
|---|---|
| produto | ONG Pets, Inema Pets Hub, PetSinal, PataFácil |
| backend/api | PetsCore API, PetBridge, PataAPI |
| web app | Painel PataDesk, Console ONG Pets |
| ChatPets WA (instância Evolution), Fluxo Resgate Rápido | |
| PetMail | |
| telegram interno | PetAlert BOT |
| RAG | PetKnowledge, CuidaRAG |
| segredos | SecretsVault (tabela + .env) |
| banco Docker | postgres-pets |
| scripts | start_postgres_pets.ps1, apply_schema_pets.ps1, make_mcp_config_pets.ps1, verify_db_pets.ps1, test_pets_env.ps1 |
modelo de dados proposto (schema_pets.sql)⌗
```sql -- pessoas e autenticação CREATE TABLE IF NOT EXISTS pessoas ( id SERIAL PRIMARY KEY, nome TEXT NOT NULL, email TEXT UNIQUE, whatsapp TEXT UNIQUE, cpf TEXT, endereco TEXT, data_cadastro TIMESTAMP DEFAULT now() );
CREATE TABLE IF NOT EXISTS usuarios ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id) ON DELETE CASCADE, login TEXT UNIQUE NOT NULL, -- email OU whatsapp password_hash TEXT NOT NULL, ativo BOOLEAN DEFAULT TRUE, ultimo_login TIMESTAMP );
-- pets e status CREATE TYPE pet_status AS ENUM ('disponivel','adotado','perdido','achado','em_lar_temporario'); CREATE TABLE IF NOT EXISTS pets ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id), -- tutor atual (quando houver) nome TEXT, especie TEXT, -- cão, gato... raca TEXT, sexo TEXT, idade_anos NUMERIC, cor TEXT, microchip TEXT, status pet_status DEFAULT 'disponivel', foto_url TEXT );
-- perdidos e achados CREATE TYPE pa_status AS ENUM ('perdido','encontrado','devolvido'); CREATE TABLE IF NOT EXISTS perdidos_achados ( id SERIAL PRIMARY KEY, pet_id INT REFERENCES pets(id) ON DELETE CASCADE, status pa_status NOT NULL, data_perdido TIMESTAMP, local_perdido TEXT, data_encontrado TIMESTAMP, local_encontrado TEXT, observacao TEXT );
-- vacinação CREATE TABLE IF NOT EXISTS vacinacoes ( id SERIAL PRIMARY KEY, pet_id INT REFERENCES pets(id) ON DELETE CASCADE, nome_vacina TEXT NOT NULL, data_aplicacao DATE NOT NULL, data_proxima DATE, veterinario TEXT, observacao TEXT );
-- doações CREATE TABLE IF
Exemplo dos codigos do zip
vacinação, doações e comunicação multicanal, transformando-as em SQL auditável e texto claro.
Regras
- login é único por usuarios.login (email ou whatsapp) + password_hash
- pet “em atenção” = vacina vencida OU próxima em <= 7 dias
- perdidos abertos = registros com status = 'perdido' sem data_encontrado
- doações do mês = DATE_TRUNC('month', data) = DATE_TRUNC('month', CURRENT_DATE)
- sempre explique a lógica em 1–2 frases antes dos dados
- limitar a 100 linhas por padrão
Exemplos
Usuário: listar pets com vacina vencida SQL: SELECT p.id, p.nome, v.nome_vacina, v.data_proxima FROM pets p JOIN vacinacoes v ON v.pet_id = p.id WHERE v.data_proxima < CURRENT_DATE ORDER BY v.data_proxima ASC LIMIT 100;
Usuário: perdidos por bairro (abertos) SQL: SELECT local_perdido, COUNT(*) qtd FROM perdidos_achados WHERE status = 'perdido' GROUP BY local_perdido ORDER BY qtd DESC LIMIT 100;
Usuário: total de doações no mês atual SQL: SELECT SUM(valor) total FROM doacoes WHERE DATE_TRUNC('month', data) = DATE_TRUNC('month', CURRENT_DATE); """
env_example = r"""# .env.example — Segredos EVOLUTION_API_URL= EVOLUTION_API_TOKEN= WA_BUSINESS_NUMBER_ID= SMTP_HOST= SMTP_USER= SMTP_PASS= TELEGRAM_BOT_TOKEN= TELEGRAM_CHAT_ID_INTERNO= PIX_CHAVE= DB_HOST=localhost DB_PORT=5433 DB_USER=postgres DB_PASS=senha123 DB_NAME=postgres """
files = { "schema_pets.sql": schema_pets, "start_postgres_pets.ps1": start_ps, "apply_schema_pets.ps1": apply_ps, "make_mcp_config_pets.ps1": make_ps, "verify_db_pets.ps1": verify_ps, "test_pets_env.ps1": test_ps, "Claude.md": claude_md, ".env.example": env_example }
for name, content in files.items(): with open(os.path.join(base, name), "w", encoding="utf-8") as f: f.write(content)
base
) ===" -ForegroundColor Cyan
try { docker --version | Out-Null } catch { ERR "Docker não encontrado"; exit 1 } try { docker info | Out-Null } catch { ERR "Docker Engine não está em execução"; exit 1 }
$exists = docker ps -a --filter "name=$ContainerName" --format "{{.Names}}" if (-not $exists) { ERR "Container '$ContainerName' não encontrado"; exit 1 } $running = docker inspect -f "{{.State.Running}}" $ContainerName if ($running -ne "true") { docker start $ContainerName | Out-Null }
checar tabelas principais⌗
$tables = @" SELECT to_regclass('public.pessoas'), to_regclass('public.pets'), to_regclass('public.vacinacoes'), to_regclass('public.perdidos_achados'), to_regclass('public.doacoes'); "@ $tbl = docker exec -i $ContainerName psql -U postgres -At -c "$tables" if ($LASTEXITCODE -ne 0) { ERR "Falha ao consultar tabelas"; exit 1 } OK "Tabelas essenciais ok"
consultas de sanidade⌗
$query1 = "SELECT p.id, p.nome, v.nome_vacina, v.data_proxima FROM pets p JOIN vacinacoes v ON v.pet_id = p.id WHERE v.data_proxima < CURRENT_DATE ORDER BY v.data_proxima ASC LIMIT 50;" $query2 = "SELECT local_perdido, COUNT(*) qtd FROM perdidos_achados WHERE status = 'perdido' GROUP BY local_perdido ORDER BY qtd DESC;" $query3 = "SELECT DATE_TRUNC('day', data) dia, SUM(valor) total FROM doacoes WHERE DATE_TRUNC('month', data) = DATE_TRUNC('month', CURRENT_DATE) GROUP BY dia ORDER BY dia;"
Write-Host "`n-- Vacinas vencidas --" -ForegroundColor DarkCyan docker exec -i $ContainerName psql -U postgres -F "," -A -c "$query1"
Write-Host "`n-- Perdidos por bairro --" -ForegroundColor DarkCyan docker exec -i $ContainerName psql -U postgres -F "," -A -c "$query2"
Write-Host "`n-- Doações no mês --" -ForegroundColor DarkCyan docker exec -i $ContainerName psql -U postgres -F "," -A -c "$query3"
exportar csvs⌗
if (-not (Test-Path $OutDir)) { New-Item -Path $OutDir -ItemType Directory | Out-Null } docker exec -i $ContainerName psql -U postgres -c "COPY (SELECT * FROM pets ORDER BY id) TO '/tmp/pets.csv' WITH CSV HEADER" docker cp "${ContainerName}:/tmp/pets.csv" (Join-Path $OutDir "pets.csv") | Out-Null OK ("CSV salvo em " + (Join-Path $OutDir "pets.csv")) """
test_ps = r"""# test_pets_env.ps1 — Etapa 0 (checagem geral) Param( [switch]$AutoCreateContainer = $false, [string]$ContainerName = "postgres-pets", [string]$PostgresPassword = "senha123", [int]$Port = 5433 )
$ErrorActionPreference = "Stop" function OK($m){ Write-Host "[OK] $m" -ForegroundColor Green } function ERR($m){ Write-Host "[ERRO] $m" -ForegroundColor Red } function INFO($m){ Write-Host "[INFO] $m" -ForegroundColor Yellow }
Write-Host "===== Teste do Ambiente: ONG Pets =====" -ForegroundColor Cyan
docker⌗
try { docker --version | Out-Null; OK "Docker encontrado" } catch { ERR "Docker não encontrado"; exit 1 } try { docker info | Out-Null; OK "Docker em execução" } catch { ERR "Docker não está em execução"; exit 1 }
container⌗
$container = (docker ps -a --filter "name=$ContainerName" --format "{{.Names}}|{{.Status}}") if (-not $container) { if ($AutoCreateContainer) { INFO "Criando container $ContainerName na porta $Port..." docker run --name $ContainerName -e POSTGRES_PASSWORD=$PostgresPassword -p ${Port}:5432 -d postgres:latest | Out-Null } else { ERR "Container ausente. Rode start_postgres_pets.ps1 ou use -AutoCreateContainer"; exit 1 } } else { OK "Container encontrado: $container" }
pg pronto⌗
docker exec $ContainerName pg_isready -U postgres
arquivos locais⌗
$root = (Get-Location).Path foreach ($f in @("schema_pets.sql","make_mcp_config_pets.ps1","apply_schema_pets.ps1")) { if (Test-Path (Join-Path $root $f)) { OK "$f encontrado" } else { ERR "$f não encontrado" } }
Write-Host "===== Fim do teste =====" -ForegroundColor Cyan """
claude_md = r"""# ONG de Pets — Guia de Perguntas (Claude)
Você está conectado a um Postgres com tabelas: pessoas, usuarios, pets, perdidos_achados, vacinacoes, doacoes, notificacoes, mensagens_whatsapp, base_conhecimento, segredos.
Objetivo Responder perguntas sobre cadastro, perdidos/achados,
e.Running}}" $ContainerName if ($running -ne "true") { docker start $ContainerName | Out-Null Write-Host "[OK] Container iniciado" -ForegroundColor Green } else { Write-Host "[OK] Container já em execução" -ForegroundColor Green } } else { docker run --name $ContainerName -e POSTGRES_PASSWORD=$Password -p ${Port}:5432 -d postgres:latest | Out-Null if ($LASTEXITCODE -ne 0) { Write-Host "[ERRO] Falha ao criar container" -ForegroundColor Red; exit 1 } Write-Host "[OK] Container criado e em execução" -ForegroundColor Green }
Start-Sleep -Seconds 3 docker exec $ContainerName pg_isready -U postgres """
apply_ps = r"""# apply_schema_pets.ps1 — Etapa 2 Param( [string]$SchemaPath = ".\schema_pets.sql", [string]$ContainerName = "postgres-pets" )
$ErrorActionPreference = "Stop" function OK($m){ Write-Host "[OK] $m" -ForegroundColor Green } function ERR($m){ Write-Host "[ERRO] $m" -ForegroundColor Red } function INFO($m){ Write-Host "[INFO] $m" -ForegroundColor Yellow }
Write-Host "=== Aplicando schema_pets.sql e validando ===" -ForegroundColor Cyan
try { docker --version | Out-Null } catch { ERR "Docker não encontrado"; exit 1 } try { docker info | Out-Null } catch { ERR "Docker não está em execução"; exit 1 }
$exists = docker ps -a --filter "name=$ContainerName" --format "{{.Names}}" if (-not $exists) { ERR "Container '$ContainerName' não existe. Rode start_postgres_pets.ps1"; exit 1 }
if (-not (Test-Path $SchemaPath)) { ERR "Arquivo não encontrado: $SchemaPath"; exit 1 } OK "schema encontrado: $SchemaPath"
INFO "Copiando schema para o container..." docker cp $SchemaPath "${ContainerName}:/tmp/schema_pets.sql" | Out-Null
INFO "Aplicando schema dentro do container..." $apply = docker exec -i $ContainerName psql -U postgres -f /tmp/schema_pets.sql if ($LASTEXITCODE -ne 0) { ERR "Falha ao aplicar schema"; Write-Host $apply; exit 1 } else { OK "Schema aplicado" }
$tables = @" SELECT to_regclass('public.pessoas'), to_regclass('public.usuarios'), to_regclass('public.pets'), to_regclass('public.perdidos_achados'), to_regclass('public.vacinacoes'), to_regclass('public.doacoes'), to_regclass('public.notificacoes'), to_regclass('public.mensagens_whatsapp'), to_regclass('public.base_conhecimento'), to_regclass('public.segredos'); "@
$tbl = docker exec -i $ContainerName psql -U postgres -At -c "$tables" if ($LASTEXITCODE -ne 0) { ERR "Falha ao validar tabelas"; exit 1 } OK "Tabelas criadas/ok:" Write-Host $tbl """
make_ps = r"""# make_mcp_config_pets.ps1 — Etapa 3 Param( [string]$DbHost = "localhost", [int]$Port = 5433, [string]$Database = "postgres", [string]$User = "postgres", [string]$Password = "senha123", [bool]$Ssl = $false, [string]$OutPath = ".\mcp.config.json" )
$ErrorActionPreference = "Stop" function OK($m){ Write-Host "[OK] $m" -ForegroundColor Green } function ERR($m){ Write-Host "[ERRO] $m" -ForegroundColor Red }
Write-Host "=== Gerando mcp.config.json (pets) ===" -ForegroundColor Cyan
$jsonObj = @{ servers = @{ postgres = @{ type = "postgres" host = $DbHost port = $Port database = $Database user = $User password = $Password ssl = $Ssl } } }
try { $json = $jsonObj | ConvertTo-Json -Depth 6 $json | Out-File -FilePath $OutPath -Encoding UTF8 -Force OK ("Arquivo salvo: " + $OutPath) $check = Get-Content $OutPath -Raw | ConvertFrom-Json if ($null -eq $check.servers.postgres) { ERR "Bloco servers.postgres ausente"; exit 1 } OK ("JSON válido host=" + $check.servers.postgres.host + " port=" + $check.servers.postgres.port) } catch { ERR ("Falha: " + $_.Exception.Message); exit 1 } """
verify_ps = r"""# verify_db_pets.ps1 — Etapa 4 Param( [string]$ContainerName = "postgres-pets", [string]$OutDir = ".\out" )
$ErrorActionPreference = "Stop" function OK($m){ Write-Host "[OK] $m" -ForegroundColor Green } function ERR($m){ Write-Host "[ERRO] $m" -ForegroundColor Red } function INFO($m){ Write-Host "[INFO] $m" -ForegroundColor Yellow }
Write-Host "=== Verificando DB e exportando amostras (pets
"{{.State.R
Create project files for ONG Pets⌗
import os, textwrap, json, pathlib
base = "/mnt/data/ong_pets_kit" os.makedirs(base, exist_ok=True)
schema_pets = r"""-- schema_pets.sql — ONG de Pets (PT-BR)
-- pessoas e autenticação CREATE TABLE IF NOT EXISTS pessoas ( id SERIAL PRIMARY KEY, nome TEXT NOT NULL, email TEXT UNIQUE, whatsapp TEXT UNIQUE, cpf TEXT, endereco TEXT, data_cadastro TIMESTAMP DEFAULT now() );
CREATE TABLE IF NOT EXISTS usuarios ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id) ON DELETE CASCADE, login TEXT UNIQUE NOT NULL, -- email OU whatsapp password_hash TEXT NOT NULL, ativo BOOLEAN DEFAULT TRUE, ultimo_login TIMESTAMP );
-- pets e status DO $$ BEGIN CREATE TYPE pet_status AS ENUM ('disponivel','adotado','perdido','achado','em_lar_temporario'); EXCEPTION WHEN duplicate_object THEN NULL; END $$;
CREATE TABLE IF NOT EXISTS pets ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id), nome TEXT, especie TEXT, raca TEXT, sexo TEXT, idade_anos NUMERIC, cor TEXT, microchip TEXT, status pet_status DEFAULT 'disponivel', foto_url TEXT );
-- perdidos e achados DO $$ BEGIN CREATE TYPE pa_status AS ENUM ('perdido','encontrado','devolvido'); EXCEPTION WHEN duplicate_object THEN NULL; END $$;
CREATE TABLE IF NOT EXISTS perdidos_achados ( id SERIAL PRIMARY KEY, pet_id INT REFERENCES pets(id) ON DELETE CASCADE, status pa_status NOT NULL, data_perdido TIMESTAMP, local_perdido TEXT, data_encontrado TIMESTAMP, local_encontrado TEXT, observacao TEXT );
-- vacinação CREATE TABLE IF NOT EXISTS vacinacoes ( id SERIAL PRIMARY KEY, pet_id INT REFERENCES pets(id) ON DELETE CASCADE, nome_vacina TEXT NOT NULL, data_aplicacao DATE NOT NULL, data_proxima DATE, veterinario TEXT, observacao TEXT );
-- doações CREATE TABLE IF NOT EXISTS doacoes ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id), valor NUMERIC(12,2) NOT NULL, data TIMESTAMP DEFAULT now(), metodo TEXT DEFAULT 'PIX', tx_id TEXT, descricao TEXT );
-- notificações e mensagens DO $$ BEGIN CREATE TYPE notif_canal AS ENUM ('email','whatsapp','telegram'); EXCEPTION WHEN duplicate_object THEN NULL; END $$;
CREATE TABLE IF NOT EXISTS notificacoes ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id), canal notif_canal NOT NULL, mensagem TEXT NOT NULL, data_envio TIMESTAMP DEFAULT now(), status TEXT );
CREATE TABLE IF NOT EXISTS mensagens_whatsapp ( id SERIAL PRIMARY KEY, pessoa_id INT REFERENCES pessoas(id), conteudo TEXT, data_hora TIMESTAMP DEFAULT now(), direcao TEXT, status TEXT );
-- base de conhecimento (RAG) CREATE TABLE IF NOT EXISTS base_conhecimento ( id SERIAL PRIMARY KEY, titulo TEXT, corpo TEXT, tags TEXT[] );
-- segredos/configurações centralizadas CREATE TABLE IF NOT EXISTS segredos ( chave TEXT PRIMARY KEY, valor TEXT NOT NULL, atualizado_em TIMESTAMP DEFAULT now() );
-- índices CREATE INDEX IF NOT EXISTS idx_pessoas_nome ON pessoas(nome); CREATE INDEX IF NOT EXISTS idx_pets_status ON pets(status); CREATE INDEX IF NOT EXISTS idx_pa_status ON perdidos_achados(status); CREATE INDEX IF NOT EXISTS idx_vac_proxima ON vacinacoes(data_proxima); CREATE INDEX IF NOT EXISTS idx_doacoes_data ON doacoes(data); """
start_ps = r"""# start_postgres_pets.ps1 — Etapa 1 Param( [string]$ContainerName = "postgres-pets", [string]$Password = "senha123", [int]$Port = 5433 )
Write-Host "=== Subindo Postgres '$ContainerName' na porta $Port ===" -ForegroundColor Cyan
try { docker --version | Out-Null; Write-Host "[OK] Docker encontrado" -ForegroundColor Green } catch { Write-Host "[ERRO] Docker não encontrado" -ForegroundColor Red; exit 1 } try { docker info | Out-Null; Write-Host "[OK] Docker Engine em execução" -ForegroundColor Green } catch { Write-Host "[ERRO] Docker não está em execução" -ForegroundColor Red; exit 1 }
$exists = docker ps -a --filter "name=$ContainerName" --format "{{.Names}}" if ($exists -eq $ContainerName) { $running = docker inspect -f
Gerei um kit completo com schema, scripts e guia prontos para rodar.
download do kit baixar pasta ong_pets_kit (zip manual: clique e navegue)
o que vem no kit
- schema_pets.sql
- start_postgres_pets.ps1
- apply_schema_pets.ps1
- make_mcp_config_pets.ps1
- verify_db_pets.ps1
- test_pets_env.ps1
- Claude.md
- .env.example
como rodar (Windows PowerShell)
-
criar pasta do projeto e copiar o kit Copie o conteúdo da pasta baixada para C:\Users\neima\ong_pets
-
subir o banco
cd C:\Users\neima\ong_pets
.\start_postgres_pets.ps1 -ContainerName postgres-pets -Port 5433 -Password senha123
- aplicar o schema
.\apply_schema_pets.ps1 -SchemaPath .\schema_pets.sql -ContainerName postgres-pets
- gerar mcp.config.json
.\make_mcp_config_pets.ps1 -DbHost localhost -Port 5433 -Database postgres -User postgres -Password senha123 -Ssl $false
- validar e exportar amostras
.\verify_db_pets.ps1 -ContainerName postgres-pets -OutDir .\out
- teste rápido do ambiente
.\test_pets_env.ps1 -AutoCreateContainer
resumo • login único por email ou whatsapp + senha • painel poderá usar as consultas já prontas (vacinas vencidas, perdidos abertos, doações do mês) • segredos centralizados via .env e/ou tabela segredos • RAG em português com base_conhecimento e tags simples
projeto ONG Pets com os arquivos e scripts que montamos:
1. Estrutura do banco (schema_pets.sql)⌗
- pessoas → cadastro de voluntários, adotantes e doadores.
- usuarios → login único (email ou WhatsApp) + senha.
- pets → informações dos animais (nome, espécie, status, tutor etc.).
- perdidos_achados → registro de animais perdidos/encontrados.
- vacinacoes → controle de vacinas (data aplicada, próxima, veterinário).
- doacoes → doações via PIX (valor, data, tx_id).
- notificacoes → disparos internos/externos (email, WhatsApp, Telegram).
- mensagens_whatsapp → histórico de conversas (Evolution API).
- base_conhecimento → conteúdo para RAG (cuidados, medicamentos, treinamento em português).
- segredos → chave PIX, tokens de API, SMTP etc.
2. Scripts PowerShell⌗
- start_postgres_pets.ps1 → sobe container Docker com Postgres.
- apply_schema_pets.ps1 → aplica schema no banco e valida tabelas.
- make_mcp_config_pets.ps1 → gera
mcp.config.jsonpara integração. - verify_db_pets.ps1 → roda consultas de sanidade (vacinas vencidas, perdidos por bairro, doações do mês) e exporta CSV.
- test_pets_env.ps1 → checa se Docker, banco e arquivos estão prontos.
3. Configuração⌗
- .env.example → modelo para guardar segredos (WhatsApp Evolution API, Telegram BOT, SMTP, chave PIX).
- Claude.md → guia para transformar perguntas em SQL (ex.: “listar pets com vacina vencida”).
4. Funcionalidades principais⌗
- Login: apenas um por usuário (email ou WhatsApp).
- Painel web: estilo corporativo, com métricas (pets cadastrados, vacinas vencidas, perdidos ativos, doações do mês).
-
Integrações:
-
WhatsApp (Evolution API) → atendimento e notificações externas.
- Telegram BOT → alertas internos para equipe.
- E-mail (SMTP) → recibos e comunicações.
- PIX → registro de doações.
- RAG em português: base de conhecimento para consultas sobre saúde, cuidados e treinamento de pets.
Em resumo → você terá uma plataforma de gestão para ONG de Pets, com banco organizado, scripts para subir o ambiente em minutos, painel web de administração, integrações multicanal (WA, e-mail, Telegram) e inteligência com RAG em português.
sistema de gestão da sua ONG de Pets.
Em outras palavras, ele é um pacote completo (banco de dados + scripts + configurações + integrações) que permite você organizar e automatizar tudo que a ONG precisa:
o que ele faz⌗
- Cadastro de pessoas → voluntários, doadores, adotantes.
- Cadastro de pets → informações gerais, fotos, status (adotado, perdido, disponível).
- Controle de perdidos e achados → registrar quando um animal some ou é encontrado.
- Controle de vacinas → datas aplicadas, próximas doses, alertas de vencimento.
- Gestão de doações (PIX) → registrar valor, data, transação, gerar relatórios.
- Notificações → via WhatsApp, e-mail e Telegram (avisos internos para a equipe e externos para tutores/adotantes).
- Histórico de mensagens WhatsApp → todas as conversas ficam registradas no banco.
- Base de conhecimento (RAG em português) → repositório de informações sobre cuidados, medicamentos e treinamentos para responder dúvidas automaticamente.
- Segredos centralizados → tokens e chaves de APIs (WhatsApp Evolution API, Telegram BOT, SMTP, PIX) ficam guardados em um só lugar.
como ele funciona⌗
- scripts PowerShell sobem o banco no Docker, aplicam o schema e geram as configs (tudo automatizado).
- painel web estilo corporativo mostra KPIs (pets cadastrados, perdidos ativos, vacinas vencidas, total de doações).
- integrações multicanal:
- WhatsApp via Evolution API para comunicação com público.
- Telegram BOT para alertas internos.
- E-mail para recibos e confirmações.
- PIX para doações. 4. inteligência artificial (RAG): perguntas sobre cuidados de pets são respondidas com base na sua própria base de conhecimento em português.
em resumo⌗
É uma plataforma completa de administração da ONG de Pets, que combina banco de dados, painel web, integrações de comunicação e automação inteligente.
Exemplo de um Sistema PETS
1