Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
CRM por workflow para corretores de imóveis (produto by Navis). Kanban de imóveis e clientes, motor de matching com score ponderado, gestão de equipe com papéis, autenticação e banco de dados reais. O frontend fala diretamente com o Supabase via SDK — não há servidor de aplicação próprio para manter no ar. Decisões de arquitetura registradas em MIGRACAO.md (histórico da migração mockup → produção). Destaques:查看完整 README ↗
CRM por workflow para corretores de imóveis (produto by Navis). Kanban de imóveis e clientes, motor de matching com score ponderado, gestão de equipe com papéis, autenticação e banco de dados reais.
Produção: https://navis-crm.vercel.app
O frontend fala diretamente com o Supabase via SDK — não há servidor de aplicação próprio para manter no ar.
flowchart LR
subgraph client["Navegador do corretor"]
UI["React SPA<br/>Vite · TanStack Query · Zustand"]
end
subgraph vercel["Vercel"]
CDN["Build estático + CDN<br/>deploy automático a cada push"]
end
subgraph supabase["Supabase (São Paulo)"]
AUTH["Auth<br/>login por corretor"]
API["PostgREST<br/>API automática com RLS"]
FN["Edge Functions<br/>'equipe' (convites/papéis) · 'matching' (score) · 'ranking-corretores' (admin) · 'link-preview' (capa do anúncio)"]
DB[("Postgres<br/>14 tabelas · 5 migrações")]
end
SENTRY["Sentry<br/>erros de produção"]
RESEND["Resend<br/>SMTP de e-mails de auth"]
UI --> CDN
UI -->|supabase-js| AUTH
UI -->|supabase-js| API
UI -->|supabase-js| FN
API --> DB
FN --> DB
AUTH -.-> RESEND
UI -.->|erros| SENTRY
Decisões de arquitetura registradas em MIGRACAO.md (histórico da migração mockup → produção). Destaques:
domain/normalizacao.ts
reconhece o mesmo bairro escrito de formas diferentes ("Jardim Botânico" = "Jd. Botanico"
= "jd botanico"; "Olhos d'Água" = "Olhos dagua"). Os cadastros ainda sugerem os nomes já
usados pela equipe, para a base não se encher de variações.corretores; escrita em corretores e exclusões são exclusivas de admin;
corretor suspenso é banido do login e perde acesso aos dados..env.local, o app roda 100% offline (MSW + localStorage) —
útil para desenvolvimento e testes.flowchart TD
A["Admin abre Equipe → Adicionar corretor"] --> B{"Como?"}
B -->|"Convite por e-mail"| C["Edge Function cria conta<br/>e envia link via Resend"]
C --> D["Corretor clica no link →<br/>página Criar sua senha"]
B -->|"Senha provisória"| E["Edge Function gera senha forte;<br/>admin envia por WhatsApp"]
D --> F["Sessão ativa"]
E --> F
G["Login com e-mail e senha"] --> F
F --> H{"E-mail existe em corretores<br/>e status ≠ suspenso?"}
H -->|sim| I["App libera; RLS libera os dados"]
H -->|não| J["Desconectado — sem acesso"]
flowchart LR
a["Novo"] --> b["Análise e Estudo"] --> c["Produção"] --> d["Publicado"]
d -->|"gate: exige cliente vinculado"| e["Em negociação"] --> f["Vendido"]
flowchart LR
1["Novo Cliente"] --> 2["Em contato"] --> 3["Visita agendada"]
3 -->|"gate: exige imóveis da negociação"| 4["Em negociação"] --> 5["Negócio Fechado"] --> 6["Finalizado"]
2 -.-> 7["Standby"]
2 -.-> 8["Perdidos"]
As transições têm gates (validações por etapa em src/domain/gatesImovel.ts e
gatesLead.ts). O matching (src/domain/matching.ts) cruza o perfil de busca de cada
cliente com os imóveis e calcula um score 0–100 com pesos configuráveis por corretor.
Os diferenciais têm duas naturezas: a lista padrão (elevador, mobiliado, lazer…) pesa no score; os diferenciais livres, escritos pelo corretor, não entram no cálculo — cada um usa seus próprios termos — mas aparecem no detalhe do imóvel e são sugeridos aos colegas.
npm install
npm run dev
.env.local → modo mock: dados fictícios no navegador, sem login (útil pra
desenvolver offline)..env.local → banco real + login obrigatório:VITE_SUPABASE_URL=https://<projeto>.supabase.co
VITE_SUPABASE_ANON_KEY=<anon key>
VITE_SENTRY_DSN=<dsn> # opcional
| Comando | O quê |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build | typecheck + build de produção |
npm test | testes (vitest) |
npm run lint | eslint |
npx vite-node scripts/seed.ts --confirmar | carga dos dados de demonstração num banco novo (usa SUPABASE_SERVICE_ROLE_KEY, nunca a anon key — RLS exige dono/admin pra escrever) |
npx supabase db push | aplica migrações pendentes no banco remoto |
npx supabase functions deploy equipe | publica a Edge Function de gestão de equipe |
npx supabase functions deploy matching | publica a Edge Function que calcula os contadores/drill-down de match |
npx supabase functions deploy ranking-corretores | publica a Edge Function do ranking (admin-only) |
npx supabase functions deploy link-preview | publica a Edge Function que busca a imagem de capa (og:image) de um link de anúncio |
npx supabase migration list | confere paridade migrações local × remoto |
Automático: push na main → Vercel builda e publica. Variáveis de ambiente ficam em
Vercel → Settings → Environments → Production. Migrações de banco são aplicadas manualmente
via npx supabase db push (exige CLI logado e senha do banco).
src/
app/ rotas, layout, guardas (RequireAuth/RequireAdmin)
components/ UI por domínio (imovel, lead, kanban, match, equipe…)
domain/ tipos, etapas, gates e motor de matching (puro, testado)
hooks/ TanStack Query — fala com Supabase (ou MSW no modo mock)
lib/ supabase, mapeadores snake↔camel, sentry, formatação
mocks/ modo demonstração (MSW + localStorage) e dados de seed
pages/ telas
stores/ zustand (auth, notificações, score, ui)
supabase/
migrations/ schema versionado (fonte da verdade do banco)
functions/ Edge Functions 'equipe' (service role; cria/gerencia contas),
'matching' (JWT de quem chama; contadores e drill-down de match) e
'ranking-corretores' (JWT + checagem de papel admin) e
'link-preview' (JWT; busca a og:image de um link, com proteção SSRF)
scripts/seed.ts dados de demonstração
Convidar corretor (e-mail ou senha provisória) · promover/rebaixar admin · desativar/reativar · redefinir senha · excluir convite não usado. Travas: ninguém desativa a si mesmo nem remove o próprio papel de admin (o sistema nunca fica sem administrador).
E-mails de convite/redefinição usam Resend. Sem domínio verificado, entregam apenas para o e-mail do dono da conta Resend — para a equipe real, verificar um domínio próprio no Resend.