WhatsApp ↔ GLPI
Integration between WhatsApp support and GLPI, unifying support channels into a single flow.
Hi, I'm
Fullstack Developer · Frontend · AI
I build systems and solutions that solve real problems, from backend to interface, with care for design and a layer of intelligence where it truly matters.
01 · about
I'm a developer from Campo Grande, Brazil, with a degree in Information Systems. Frontend is my foundation: it's where I have the most experience, joining development with design, UI/UX and visual identity. On top of that I built a fullstack profile that today reaches from backend to infra.
I work at UFMS (Federal University of Mato Grosso do Sul), where I moved from technical support to the innovation team at DIDIA (Directorate of Innovation and Artificial Intelligence), and from there became deputy manager of GERIA, the AI management office within DIDIA. Along the way I built entire systems (some of them on my own) that are in production and used every day.
In parallel, I build my own projects and provide services to companies: websites, custom systems and AI solutions. I have shipped live sites for real clients, and I like delivering things that genuinely work, with tests, security and honest care for the people using them.
complete systems delivered so far
years building software professionally
current focus on automation, integrations and smart systems
02 · experience
From hardware maintenance to managing an AI team. Each phase helped build what I know today.
※ The systems listed are just a sample of what I built; I picked the ones I find most relevant.
Jul 2022 to Feb 2023
Positivo Tecnologia (outsourced)
Where it all started: equipment maintenance. I learned hardware and support hands-on, fixing computers, laptops and phones, and providing on-site support at public agencies and private companies that used Positivo technology.
Feb 2023 to mid 2024
UFMS · Federal University of Mato Grosso do Sul
A year and a half in support, but beyond just answering tickets, I started automating what slowed down our day-to-day and building what could help us. Even though Agetic (UFMS's technology agency, where I worked) had its own development team, its focus on students kept it from building systems for other areas. This is where I first got the chance to build working systems and flows for the university.
Integration between WhatsApp support and GLPI, unifying support channels into a single flow.
System deployed for the university's radio station, making it easier for the team to use and giving them the freedom to broadcast an event from anywhere through secure channels.
Smart forms that resolved GLPI support tickets automatically, with no human in the loop.
mid 2024 to 2025
DIDIA · Directorate of Innovation and AI (UFMS)
Out of a drive to build systems that could solve real problems (and here I'm truly grateful to those who helped me get that chance), I took part in forming a new team: the innovation team, whose goal was to create innovative solutions for the university and for society. Here I built entire systems, sometimes on my own, from design to deploy. On this team my experience grew a lot: we built scripts, software, plugins and AI, using modern tools and sometimes even creating new ones, making it possible to build complete systems that didn't exist anywhere else (real innovation). In this period alone there were 12 systems in 1 year! Along with them came logos, visual identities and frontends for several other projects. Below are a few of the ones I find most relevant.
A plugin adding AI layers to GLPI: automatic ticket classification, workload balancing across technicians, smart reply suggestions, a knowledge-base chatbot and sentiment analysis. Built by me, with input from colleagues more experienced in AI.
It led to articles for the IT community and became the subject of a talk (which I presented myself) at an inter-institutional technology event.
Intelligent security center: virtual guards, smart alerts, camera mosaics and computer vision.
Electronic lock management across the whole university: access permissions, logs, NFC keys and more.
UFMS's institutional e-commerce.
A game-like system for welcoming freshmen, with prizes, rankings and a map-guided flow.
Games in various formats for university events, including Unity development.
2025 · present
GERIA · AI Management Office (within DIDIA · UFMS)
Today I serve as deputy manager of GERIA, the AI management office within DIDIA, where we create innovative systems and solutions for the university. I combine what I learned as a builder with the responsibility of helping to guide a team.
03 · projects
Personal and client projects, from zero to deploy, each one born from a real problem.
A team of AI agents that builds software from idea to code
An open source plugin for Claude Code that takes a project from idea to running code through specialized agents: idea analyst, innovation developer, plan writer, designer, backend/database/frontend/AI devs, infra and security. It right-sizes to the project, uses only the agents it needs, designs security in from the start and is resumable across sessions: multi-agent orchestration and prompt engineering in practice.
Um plugin do Claude Code que conduz um software da ideia ao código executável,
através de um time de papéis seniores — sem cerimônia a mais nem segurança a menos.
analista de ideias · desenvolvedor de ideias · escritor de plano ·
designer · dev backend · dev banco · dev frontend ·
dev IA · analista de infra · analista de segurança
Você descreve uma ideia. O plugin conversa para entendê-la de verdade, escreve um plano de implementação dimensionado ao porte do projeto e então constrói o sistema — com testes, segurança em todas as camadas e um caminho claro de “como rodar”. Tudo em português, registrado em arquivos no seu repositório, e retomável em outra sessão.
Pensado tanto para uso real quanto como peça de portfólio: demonstra orquestração de múltiplos agentes, engenharia de prompt e práticas modernas de engenharia de software.
1. Instale (no Claude Code, dentro de qualquer projeto):
/plugin marketplace add enzoterra/claude-project-builder
/plugin install project-builder@claude-project-builder
2. Construa — no projeto onde quer o sistema, descreva a ideia:
/construir-projeto um app para a fila de espera do meu consultório
Pronto. O orquestrador assume a partir daí e conduz as fases, parando para sua aprovação ao fim de cada uma. Você não precisa saber de stack, infra ou arquitetura — ele pergunta o que precisar e recomenda quando você não souber.
Só quer planejar? Use um papel isolado:
/analista-de-ideias(brainstorming) ou/escritor-de-plano(documentação técnica). Retomar mais tarde? É só rodar/construir-projetode novo no mesmo projeto — ele lê o progresso e continua de onde parou.
docker compose up + seed de
demonstração (com usuários de exemplo) + README de como rodar localmente.O plugin funciona como uma empresa de software atendendo você: cada papel é um profissional sênior, e você é o cliente que aprova as decisões que importam.
Os pontos de aprovação são proporcionais: num protótipo enxuto o time confirma só o essencial; num produto de produção há mais checkpoints. Você é incomodado onde sua opinião muda o resultado — não mais.
O orquestrador construir-projeto conduz quatro fases, delegando a cada especialista:
💡 Descoberta → 📝 Planejamento → 🏗️ Implementação (por sprints) → ✅ Validação
(entender) (documentar) (infra → banco → backend → IA → design → frontend → segurança) (UAT: validar com o cliente)
A trilha de implementação se adapta à forma do projeto: papéis sem camada correspondente (design e frontend num projeto sem UI, banco num projeto sem persistência, IA quando não há inteligência no produto) simplesmente não entram.
O estado não vive na conversa — vive em arquivos docs/projeto/ do seu repositório. É isso que
permite aos subagentes (que começam sem contexto) e a sessões futuras retomarem o trabalho:
| Arquivo | O que guarda |
|---|---|
00-descoberta.md | A ideia entendida: necessidade real, perfil, usuários, restrições |
01-plano.md … 09-operacao-e-deploy.md | Plano completo (conforme o porte e a forma): requisitos, arquitetura, banco, sprints, user stories, testes, segurança, operação |
10-design.md (+ design/mockup.html) | Sistema de design, quando há interface: tipografia, cores/tokens, ícones, componentes, estados |
PADROES.md | Os padrões transversais adaptados ao projeto |
PROGRESSO.md | Checkpoint vivo: status de cada sprint e passos concluídos |
| Papel | Tipo | O que faz |
|---|---|---|
analista-de-ideias | skill | Brainstorming interativo: necessidade real, porte, tipo/forma do projeto, usuários, dados, segurança, infra, design, inovações. Confirma o entendimento e recomenda quando você não sabe. |
desenvolvedor-de-ideias | subagente | Pesquisa o que projetos parecidos fazem e propõe ideias inovadoras — para o produto e para cada fluxo — com impacto e complexidade medidos. Trabalha junto da analista; você decide o que entra. |
escritor-de-plano | skill | Plano dimensionado ao porte e à forma: objetivos, requisitos (F/NF), arquitetura e stack (versões pesquisadas), banco, sprints, user stories, testes, segurança e operação. Consulta os especialistas para avaliar viabilidade e alternativas antes de fixar. |
designer | subagente | Sistema de design (só se houver interface): tipografia, cores/tokens, ícones, botões, cards, border-radius, estados — e um mockup de referência. O design desenha; o frontend desenvolve. |
dev-backend | subagente | API, regras de negócio, authn/authz e segurança rota a rota, testes. |
dev-banco-de-dados | subagente | Schema, migrações, índices e seed de demonstração. |
dev-frontend | subagente | UI moderna, limpa e responsiva, acessível, fiel ao sistema de design, com validação de entradas, integração com a API e testes. |
dev-ia | subagente | Camada de inteligência quando há IA central: seleção de modelo, prompts versionados, RAG/agentes, evals, guardrails, custo/latência e segurança de IA (prompt injection, vazamento, OWASP LLM). Também lidera pipeline de ML quando o projeto desenvolve modelo. |
analista-de-infra | subagente | Esqueleto, Docker/compose, config por env, CI e o caminho “como rodar”. |
analista-de-seguranca | subagente | Auditoria adversária de backend e frontend contra todas as vulnerabilidades da stack (pesquisando ameaças atuais), conduzindo a correção até zerar falhas altas/críticas. |
construir-projeto | skill (orquestrador) | Conduz todas as fases, dimensiona ao porte e delega aos especialistas. |
Todos atuam como seniores na linguagem e framework que você pedir.
O porte é decidido com você na descoberta e respeitado por todos os papéis:
| Perfil | Para quê | O que entrega |
|---|---|---|
| Enxuto | Script, protótipo, ferramenta pessoal, trabalho de faculdade, MVP de validação | Roda local direto, plano leve (1 doc), sem cerimônia. Foco em funcionar rápido. |
| Padrão | Produto real com usuários, vai a produção | Docker + seed demo, CI, testes, segurança sólida, plano dividido. |
| Robusto | Sistema empresarial ou de missão crítica | Tudo: observabilidade, SLO, DR, DevSecOps, compliance, multi-ambiente. |
.claude-plugin/
plugin.json # manifesto do plugin
marketplace.json # catálogo (permite adicionar este repo como marketplace)
skills/
construir-projeto/ # orquestrador + referencia/padroes.md (padrões transversais)
analista-de-ideias/ # descoberta interativa
escritor-de-plano/ # planejamento + templates/
agents/
desenvolvedor-de-ideias.md designer.md
dev-backend.md dev-banco-de-dados.md dev-frontend.md dev-ia.md
analista-de-infra.md analista-de-seguranca.md
Via marketplace (recomendado) — funciona em qualquer projeto após adicionado:
/plugin marketplace add enzoterra/claude-project-builder
/plugin install project-builder@claude-project-builder
(ou aponte para a URL: /plugin marketplace add https://github.com/enzoterra/claude-project-builder)
Importante: Se os comandos desse plugin não aparecerem no Claude Code Desktop App após a instalação, pode ser necessário encerrar o Claude (inclusive pelo ícone da bandeja do sistema, no Windows) e iniciar novamente.
Clonando localmente — útil para inspecionar ou ajustar antes:
git clone https://github.com/enzoterra/claude-project-builder
/plugin marketplace add ./caminho/para/claude-project-builder
/plugin install project-builder@claude-project-builder
git init se não houver).Enzo Andrade Terra · enzoterra18@gmail.com
Digital memorials to honor those who passed
A platform where families create memorials with a biography, photos, a timeline and other important information. Friends pay tribute by purchasing digital flower wreaths, and 90% of the value goes to a charity chosen by the family. Funeral homes display the memorials on TVs and tablets, showing who paid tribute without exposing amounts. Everything designed with care, conveying hope and calm in a difficult moment.
Community network reuniting lost pets with their owners
A geospatial platform that centralizes what today gets lost across dozens of WhatsApp groups: a regional radius-based feed (PostGIS), automatic matching between lost and found pets, mediated contact to prevent scams, QR-code posters and privacy by architecture (EXIF stripped, addresses never exposed). ~95 backend tests, Playwright E2E and k6 load testing.

Plataforma web comunitária para reunir animais perdidos com seus donos, usando a própria vizinhança como rede de busca — pensada para o Mato Grosso do Sul e desenhada mobile-first, para quem cadastra na rua, com uma mão e pressa.
Projeto full-stack completo (backend geoespacial, SPA, infra, CI e testes), construído do zero em sprints. A visão, o modelo de dados e o detalhamento de cada sprint estão em
PLANO_ACHEI_MEU_PET.md.
Quando um animal some, o tempo é tudo — e a informação está fragmentada em dezenas de grupos de WhatsApp. O Achei Meu Pet centraliza isso num feed regional e tenta fechar o ciclo perdido → encontrado com o mínimo de fricção.
A métrica-norte (North Star) do produto é o tempo médio até o primeiro contato qualificado: quanto tempo, depois de um pet ser publicado, até alguém abrir uma conversa sobre ele. O sistema instrumenta essa métrica de ponta a ponta.
O que torna o projeto interessante além da lista de telas:
ST_DWithin sobre coluna geography indexada (GIST) —
comparação em metros, sem trazer a tabela inteira para a aplicação.httpOnly + SameSite + CSRF) em vez de JWT no
localStorage — imune a roubo de token por XSS.axe).| Camada | Tecnologia |
|---|---|
| Backend | Django 5 + DRF + GeoDjango/PostGIS (Python 3.12) |
| Banco | PostgreSQL 16 + PostGIS |
| Frontend | React 19 + Vite + TypeScript, Tailwind v4, shadcn/ui |
| Assíncrono | Celery + Redis (matching, e-mails, expiração) |
| Storage | Cloudflare R2 (S3-compatível) |
| Edge | Caddy (TLS automático, reverse proxy, headers de segurança/CSP) |
| Infra | Docker Compose (single-host) |
| CI / Erros | GitHub Actions · Sentry |
Internet
│
┌──┴──┐
│Caddy│ TLS automático, reverse proxy, CSP
└──┬──┘
┌───────────┼───────────────┐
app (SPA estático) api (Django/gunicorn)
│
┌────────────────┼─────────────────┐
PostgreSQL+PostGIS Redis Celery worker + beat
│
Cloudflare R2 (imagens)
User (com localizacao/endereco privados) · Pet + PetFoto (UUID, coordenada
real indexada vs. rótulo exibível) · Match (auditável) · Conversa + Mensagem
(contato intermediado) · Notificacao · PrimeiroContato (North Star). Detalhes
no plano.
backend/ Django + DRF (API, settings base/dev/prod, Celery, ~95 testes)
frontend/ React 19 + Vite SPA (Tailwind v4, tokens de design, Playwright e2e)
infra/ Caddy (edge), backup/restore do Postgres, testes de carga k6
.github/ GitHub Actions (CI + E2E manual)
Docker + Docker Compose, ou Python 3.12 + Node 24 para rodar fora de container.
Sobe a stack completa em modo de desenvolvimento (HTTP puro, hot-reload, sem
TLS) já populada com dados de exemplo — nenhum .env necessário:
docker compose -f docker-compose.local.yml up --build
Na subida, o comando manage.py seed_demo cria usuários, posts de perdidos e
encontrados (com fotos geradas), matches, notificações e uma conversa
intermediada. Login sugerido para explorar tudo:
| senha | |
|---|---|
ana@demo.acheimeu.pet | demoAcheiPet1 |
O seed é idempotente: rode
docker compose -f docker-compose.local.yml exec api python manage.py seed_demoquando quiser recriar os dados. E-mails (ex.: verificação, match) saem no console do containerapi.
cp backend/.env.example backend/.env # ajuste SECRET_KEY etc.
cp .env.example .env
docker compose --env-file backend/.env up --build
cd backend
python -m venv .venv && . .venv/Scripts/activate # Windows
pip install -r requirements-dev.txt
cp .env.example .env
python manage.py migrate
python manage.py runserver # http://localhost:8000/api/health
GeoDjango exige as libs GDAL/GEOS/PROJ instaladas no sistema.
cd frontend
npm install
npm run dev # http://localhost:5173 (proxy /api -> :8000)
# Backend
cd backend && pytest && ruff check . && black --check .
# Frontend (unit + componentes + acessibilidade)
cd frontend && npm test && npm run lint && npm run build
frontend/e2e/README.md.infra/load/README.md..github/workflows/ci.yml roda em cada push/PR (lint, testes, build). Os testes
E2E rodam sob demanda em .github/workflows/e2e.yml. Nenhum merge sem CI verde.
GET /api/health (banco + cache/Redis).GET /api/metrics/north-star
(staff) + log estruturado. Logs em JSON via LOG_FORMAT=json.GET /api/auth/me/exportar. Exclusão: DELETE /api/auth/me./privacidade, linkada do cadastro.Camada de IA, sempre como assistente e nunca como autoridade em casos sensíveis: moderação de imagens/texto com revisão humana, similaridade visual por embeddings, coleira QR preventiva, parceiros verificados (clínicas/ONGs) e mapa interativo com pontos ofuscados por jitter. Detalhes na §10 do plano.
Scripts em infra/backup/; o procedimento de restauração —
que deve ser testado, não só configurado — está em
RESTORE_RUNBOOK.md. Nunca commitar .env;
veja *.env.example para a lista de variáveis.
Civic platform to map and manage pothole repairs
From an anonymous citizen report (under 15 seconds, Waze-style) to the city confirming the repair, with a public transparency dashboard. Geospatial deduplication with PostGIS, a status machine with immutable history, transactional batch repairs with staging, and 141 automated tests.

Plataforma colaborativa para mapear e gerir o conserto de buracos em vias públicas — do relato anônimo do cidadão à confirmação do conserto pela prefeitura, com transparência pública. Caso de uso: Campo Grande/MS.
Stack: Django 5 · DRF · GeoDjango/PostGIS · React 18 · Vite · MapLibre · Docker Qualidade: 141 testes automatizados (96 backend / 45 frontend) · revisão de segurança §9/OWASP · CI-ready Status: MVP completo (Sprints 0–7) · pronto para deploy
Identidade visual “asfalto” — grafite escuro + âmbar de marca (Tailwind v4 + shadcn/ui). O app do cidadão é mobile-first: mapa em tela cheia, pins por forma + cor segundo o status, e relato de baixo atrito — posicionar o pino e confirmar.
Cidadão — mapa com clusters por status · arraste o pino até o buraco e confirme.
Painel da prefeitura (desktop), com a visão certa por papel:
Gestão — mapa, filtros e lista priorizada por urgência. |
Conserto com staging — polígono, rua ou clusters → revisão. |
Login da prefeitura — acesso restrito por papel (JWT).
Capturas da stack de demonstração (compose.local.yml) com dados de
exemplo em Campo Grande/MS.
Buracos em vias públicas são reportados de forma dispersa (redes sociais, telefone, ouvidoria), sem geolocalização agregada. A prefeitura não tem um canal único para visualizar, priorizar e acompanhar consertos. O Buraco Zero centraliza esse ciclo de vida em uma plataforma só, com três públicos:
| Público | O que faz |
|---|---|
| 👤 Cidadão (anônimo) | Registra um buraco em < 15s, sem cadastro (UX referência: alerta do Waze). Foto opcional. |
| 📊 Analista (prefeitura) | Prioriza por urgência, filtra, avança status, exporta dados. |
| 🛠️ Funcionário de campo | Marca consertos (polígono/rua/clusters), revisa e confirma em lote. |
| 🌐 População | Painel público de transparência (consertos, tempo médio, por bairro). |
Pré-requisito: Docker + Docker Compose. Na raiz do repositório:
docker compose -f compose.local.yml up --build
Sobe a stack inteira (PostGIS + Django + PWA atrás do nginx), migra o banco e popula dados de demonstração automaticamente. Depois abra:
| Rota | O que ver |
|---|---|
/ | App do cidadão: mapa com clusters coloridos por status, botão “Relatar buraco”. |
/painel | Transparência: métricas e recorte por bairro. |
/admin | Painel da prefeitura (login abaixo). |
Credenciais de demonstração (papéis distintos mudam a experiência):
| Papel | Login | Senha | Vê |
|---|---|---|---|
| Admin | admin@cg.ms.gov.br | demo12345 | gestão + conserto + arquivar |
| Analista | analista@cg.ms.gov.br | demo12345 | mapa, lista, filtros, status, exportar |
| Campo | campo@cg.ms.gov.br | demo12345 | conserto com staging (3 métodos) |
Encerrar: docker compose -f compose.local.yml down -v.
Diferente do
backend/docker-compose.yml(só backend, para desenvolvimento), ocompose.local.ymlentrega o sistema completo em uma URL, como em produção, mas sem TLS e com dados de exemplo.
O que este projeto demonstra além de CRUD:
distance_lte/intersects
sobre campos geography, índice GIST, e testes rodando contra PostGIS real
(não SQLite — queries espaciais não têm equivalente e dariam falso verde).StatusHistory é append-only; MaintenanceZone nasce como rascunho.prefers-reduced-motion.Um bug real encontrado e corrigido durante o desenvolvimento: o
?format=do endpoint de exportação colidia com a negociação de conteúdo do DRF, devolvendo 404 antes da view rodar — resolvido comURL_FORMAT_OVERRIDE=None. Documentado no código.
┌─────────────────────────── nginx ───────────────────────────┐
Cidadão ─────────│ / → PWA (React/Vite, estático) │
Prefeitura ──────│ /api, /admin → proxy → gunicorn + Django/DRF │
│ /static,/media → volumes │
└───────────────────────────────┬──────────────────────────────┘
│
┌─────────────▼─────────────┐
│ Django + GeoDjango │
│ (dedup, staging, auth, │
│ stats, jobs de cron) │
└─────────────┬─────────────┘
│
┌─────────────▼─────────────┐
│ PostgreSQL 16 + PostGIS │
└───────────────────────────┘
Decisões registradas em DOCUMENTACAO_SISTEMA.md (a fonte
de verdade do produto): por que cluster é a entidade central, dedup em duas
camadas, staging no servidor, expiração como flag visual, e mais.
| Camada | Tecnologias |
|---|---|
| Backend | Django 5, DRF, GeoDjango, simplejwt, django-ratelimit, Pillow |
| Banco | PostgreSQL 16 + PostGIS 3.4 |
| Frontend | React 18, Vite, TypeScript, Tailwind v4, shadcn/ui, MapLibre GL, Supercluster, TanStack Query |
| Infra | Docker Compose, nginx, gunicorn, Let’s Encrypt, Sentry (opcional) |
| Testes | pytest + pytest-django (PostGIS real), Vitest + Testing Library, Locust |
tapa-buraco/
├── backend/ Django + DRF + GeoDjango (API, painel, staging, jobs)
├── frontend/ PWA React (cidadão, analista, campo, painel público)
├── deploy/ produção: nginx+TLS, gunicorn, backups, Let's Encrypt
├── loadtest/ teste de carga (Locust) da superfície pública
├── compose.local.yml demo da stack completa (este README)
├── DEPLOY.md guia de deploy e operação
├── SECURITY_REVIEW.md revisão §9 + OWASP Top 10
└── DOCUMENTACAO_SISTEMA.md especificação do produto (fonte de verdade)
# Backend (roda via Docker por causa do GeoDjango/GDAL)
cd backend && cp .env.example .env && docker compose up -d --build
docker compose run --rm web pytest # 96 testes (PostGIS real)
# Frontend
cd frontend && npm install && npm run dev # http://localhost:5173
npm test # 45 testes
Detalhes em backend/README.md e frontend/README.md.
Deploy num VPS único via Docker Compose (nginx + TLS + gunicorn + PostGIS +
backups + Sentry) — passo a passo em DEPLOY.md. Segurança em
SECURITY_REVIEW.md. Teste de carga em loadtest/.
| Sprint | Entrega | Status |
|---|---|---|
| 0–1 | Fundação + API pública de relatos (dedup geoespacial, EXIF strip) | ✅ |
| 2 | Frontend do cidadão (mapa + relato) PWA | ✅ |
| 3 | Auth JWT + API admin (filtros, paginação, transições) | ✅ |
| 4 | Painel do analista (mapa + lista + filtros + detalhe + status) | ✅ |
| 5 | Conserto com staging (polígono/rua/clusters → revisão → commit) | ✅ |
| 6 | Exportação, painel público e expiração (jobs via cron) | ✅ |
| 7 | Endurecimento e deploy (TLS, backups, Sentry, carga, docs) | ✅ |
| 5.5 | Importação CSV de consertos (opcional; depende de OSM + pg_trgm) | ⏳ |
Projeto desenvolvido como estudo de uma plataforma cívica real, priorizando domínio geoespacial, integridade transacional, segurança e testes. Construído por sprints, cada uma entregando algo verificável e testado.
White-label SaaS for digital marketing agencies
Built under contract: an admin panel for the agency and an exclusive client portal. Automatic Google Calendar sync, monthly performance reports with computed ROI, payments with PIX QR codes, a Google Drive media library and granular permissions. In production, actively used by an agency.
Plataforma SaaS white-label para agências de marketing digital gerenciarem clientes, entregas, finanças e resultados, em um único lugar.
O Portal de Clientes é um sistema web desenvolvido em Laravel 11 para centralizar a gestão de clientes de uma agência de marketing digital. Ele oferece dois ambientes distintos: um painel administrativo para a equipe da agência e um portal exclusivo para os clientes.
A plataforma conecta-se à conta Google da agência para sincronizar automaticamente eventos de reuniões e entregas, permite o envio de relatórios mensais de performance com dados reais de campanhas e redes sociais, e oferece uma área financeira completa com geração de cobranças, QR Code PIX e controle de inadimplência.
super_admin, admin e clientrascunho → publicado → arquivadoInvoice) e cobranças individuais (Payment)pending, under_review, paid, overduevideo, image, document, link
Dashboard do Cliente |
Calendário de Eventos |
Gestão de Pagamentos |
Configurações (Painel Admin) |
O projeto segue uma arquitetura organizada em domains, separando as responsabilidades por contexto de negócio:
app/
├── Console/
│ └── Commands/
│ └── SyncCalendarCommand.php # Comando artisan: calendar:sync
├── Domain/
│ ├── Calendar/ # Integração com Google Agenda
│ ├── Client/ # Gestão de clientes
│ ├── Financial/ # Pagamentos e faturas
│ ├── Media/ # Links de entregáveis
│ ├── Report/ # Relatórios de performance
│ └── Setting/ # Configurações do sistema
├── Http/
│ ├── Controllers/
│ │ ├── Admin/ # Controllers do painel da agência
│ │ └── Client/ # Controllers do portal do cliente
│ └── Middleware/
└── Models/ # User, GoogleOAuthToken, AuditLog
| Camada | Tecnologia |
|---|---|
| Backend | Laravel 11, PHP 8.2 |
| Banco de dados | PostgreSQL |
| Frontend | Blade + Tailwind CSS |
| Permissões | Spatie Laravel Permission |
| Google APIs | google/apiclient (Calendar + Drive) |
| barryvdh/laravel-dompdf | |
| QR Code PIX | chillerlan/php-qrcode |
| Ícones (UI) | Heroicons, Solar Icons, Remix Icons |
| Logs de atividade | Spatie Laravel Activitylog |
| Deploy | Hostinger (shared hosting) |
# Clone o repositório
git clone https://github.com/enzoterra/portal-agencia.git
cd portal-agencia
# Instale as dependências PHP
composer install
# Instale as dependências JS
npm install
# Configure o ambiente
cp .env.example .env
php artisan key:generate
# Rode as migrations
php artisan migrate --seed
# Inicie o servidor de desenvolvimento
composer run dev
Configure as seguintes entradas no .env:
# Banco de dados
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=portal_agencia
DB_USERNAME=seu_usuario
DB_PASSWORD=sua_senha
# Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=
GOOGLE_CALENDAR_ID=
O sistema depende de um Cron Job configurado no servidor para funcionar corretamente. Adicione a seguinte linha ao cron do servidor:
* * * * * /usr/bin/php /caminho/para/artisan schedule:run >> /dev/null 2>&1
O Laravel gerencia internamente os intervalos de cada tarefa:
| Tarefa | Frequência | Descrição |
|---|---|---|
calendar:sync | A cada 5 minutos | Sincroniza eventos do Google Agenda |
| Marcar vencidos | Diário às 00:05 | Atualiza status de pagamentos vencidos |
Este projeto foi desenvolvido para uso interno e fins de portfólio.
Self-managed infrastructure for AI assistants
The VPS running my AI assistant services for clients: provisioning, Docker, reverse proxy, TLS, monitoring and deploys. It is the foundation that keeps projects and services online, where I enjoy owning the full cycle, from code to operations and a smooth experience for the client.
04 · skills
The stack changes with the problem; these are the tools I usually work with.
Where I am strongest: modern, responsive, accessible interfaces, joining code and design. I care about UI/UX and visual identity, not only the implementation.
Where I have been steering my career: systems with intelligence layers that truly solve problems.
Scalable APIs and architectures, with security and tests from day one.
From code to operations: containers, CI/CD and well-modeled databases.
When the problem calls for a different tool.
05 · services
Besides my own projects, I provide services to companies and people who need to turn an idea into working software.
Websites built from scratch and design refreshes for existing ones: fast, beautiful and with real SEO.
Complete systems for your business: solving problems and streamlining workflows to boost your team’s productivity.
AI assistants, system integrations and process automation that save your team real hours.
06 · contact
I'm always open to good conversations, whether about a role, a project, or an idea that doesn't have a name yet.
enzoterra18@gmail.com
Enzo's assistant
ask about projects, stack and experience
Demo mode: I answer from a local knowledge base.