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.
Translation pending
Central de pendências — Processos, Empresa BFF, E-mails e Viagens.
Translation pending
BusinessJavaScript · TypeScriptGitHub @barrofelipe-gifOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Sistema web com login que centraliza pendências de trabalho por categoria (Processos, Empresa BFF, E-mails, Viagens), com quadro estilo Kanban de colunas totalmente customizáveis (criar, renomear, reordenar e excluir), filtros, ditado por voz (inclusive um "ditado inteligente" que organiza uma frase falada nos campos certos) e sincronização automática de e-mails pendentes do Gmail.
Fase 1: uso individual, um único login (painel pessoal — Processos,
Empresa BFF, E-mails, Viagens).
Fase 2 (em construção): aba BFF Fitness — mapa da empresa por setor
(Financeiro, Marketing/Vendas, Estoque/Logística, Clientes, Suporte,
Jurídico, Desenvolvimento de Produto), com login por pessoa e acesso
configurável por setor (/admin/usuarios). Ver seção 9.
@anthropic-ai/sdk, modelo claude-opus-5) — organiza o
texto ditado nos campos certos da pendência ("ditado inteligente")npm install
cp .env.example .env
Preencha o .env:
| Variável | Como gerar |
|---|---|
DATABASE_URL | URL de um Postgres (local, Neon ou Supabase — veja seção 2) |
AUTH_SECRET | npx auth secret ou openssl rand -base64 32 |
TOKEN_ENCRYPTION_KEY | openssl rand -base64 32 |
SEED_USER_EMAIL / SEED_USER_PASSWORD | o e-mail e senha que você vai usar pra logar |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | veja seção 4 (Gmail) — pode deixar em branco por enquanto |
CRON_SECRET | openssl rand -hex 32 |
ANTHROPIC_API_KEY | console.anthropic.com/settings/keys — opcional; sem ela o app funciona normal, só o "Ditar pendência" fica desativado |
Depois:
npx prisma db push # cria as tabelas no banco
npm run seed # cria seu usuário de login
npm run dev # http://localhost:3000
Neon (recomendado, mais simples pra Postgres puro):
postgresql://...) — já vem com
?sslmode=require, mantenha assim.DATABASE_URL no .env (local) e depois nas variáveis de
ambiente da Vercel (produção).Supabase (alternativa, se já usa Supabase por outro motivo):
?sslmode=require.Depois de configurar, rode npx prisma db push para criar as tabelas.
barrofelipe-gif/dream, branch claude/painel-pendencias-jcv4lq — dá
pra abrir um PR pra main/produção quando estiver satisfeito)..env
(menos as que são só de seed, se preferir rodar o seed uma vez local
apontando pro banco de produção) — inclusive TRAY_STORE_URL,
TRAY_CONSUMER_KEY, TRAY_CONSUMER_SECRET e TRAY_CALLBACK_URL (essa
última só depois do passo 4, quando você já souber a URL final).painel-pendencias.vercel.app.DATABASE_URL="<url de produção>" npm run seed
O vercel.json já configura o cron job de sincronização do Gmail (roda 1x
por dia, às 11h UTC / 8h em Brasília — plano Hobby da Vercel só permite cron
diário; pra sincronizar de hora em hora precisa do plano Pro) — a Vercel
ativa automaticamente ao detectar o arquivo. Enquanto isso, o botão
"Sincronizar agora" em /conectar-gmail sempre funciona na hora.
AUTH_SECRET, TOKEN_ENCRYPTION_KEY,
CRON_SECRET) — nunca reaproveite os valores do .env local/dev.TRAY_CONSUMER_SECRET, TOKEN_ENCRYPTION_KEY, AUTH_SECRET e
DATABASE_URL ao ambiente Production apenas (desmarque Preview/
Development na hora de criar) — assim nenhuma preview branch de PR expõe
segredo de produção.?sslmode=require na DATABASE_URL (Neon já
vem assim por padrão) — nunca conexão sem TLS em produção.TRAY_CALLBACK_URL e GOOGLE_REDIRECT_URI de produção têm que ser
https:// — ambas as plataformas recusam callback sem TLS.painel.seudominio.com.br).CNAME
apontando pro subdomínio, ou um A se for o domínio raiz).Decisão em aberto: qual domínio/subdomínio exato usar — me diga quando for configurar essa parte.
Critério adotado para "e-mail pendente": o próprio Gmail com uma label chamada "Pendente". Você marca manualmente (ou com um filtro automático do Gmail) os e-mails que quer ver no painel, e o sistema cria essa label sozinho na primeira sincronização, se ela ainda não existir.
Passo a passo pra criar as credenciais OAuth:
gmail.readonly e gmail.labels.http://localhost:3000/api/gmail/callback (para testar local)https://SEU_DOMINIO/api/gmail/callback (produção)GOOGLE_CLIENT_ID e GOOGLE_CLIENT_SECRET (local e na Vercel), e
ajuste GOOGLE_REDIRECT_URI para a URL de produção.Se você reconectar depois de já ter autorizado uma vez, o Google às vezes não reenvia o
refresh_token. Se isso acontecer, revogue o acesso em myaccount.google.com/permissions e conecte de novo.
Cada categoria (Processos, Empresa BFF, E-mails, Viagens) tem seu próprio conjunto de colunas — nascem 3 padrão (Pendente / Em andamento / Concluído) na primeira vez que você abre a categoria, e dali pra frente:
Como colunas são por categoria, a visão "Todas as categorias" não dá pra misturar quadros diferentes num só — ela vira um resumo somente-leitura em 2 grupos (Em aberto / Concluído). Pra arrastar cards e editar colunas, escolhe uma categoria no menu lateral.
Dois níveis, os dois grátis de usar (só o segundo depende da chave da Anthropic):
Aba separada do painel pessoal, pra acompanhar a saúde da empresa por setor (Financeiro, Marketing/Vendas, Estoque, Logística, Clientes, Suporte e Pós-venda, Jurídico, Desenvolvimento de Produto — RH ainda não entrou).
Visão Central (/empresa): visual de "central de comando" — os
setores aparecem como nós conectados ao redor do núcleo BFF, cada um com
semáforo (verde/amarelo/vermelho/cinza-sem-dado); um setor em vermelho
pulsa, e o núcleo assume a pior cor entre os setores visíveis. Clica num
nó pra abrir o detalhe daquele setor.
Detalhe de setor e preenchimento manual (/empresa/[sector],
src/lib/sectorMetrics.ts): cada setor tem uma lista de blocos esperados
(ex: Financeiro → fluxo de caixa, DRE, chargebacks...). Clica num bloco
pra abrir um formulário — status (dentro do esperado/na borda/precisa de
atenção), valor livre ("R$ -3.200", "18 dias") e observação. Isso
funciona sem depender de nenhuma API externa — é como o app fica
utilizável hoje, antes da Tray (ou qualquer outra fonte) estar ligada de
verdade. getStatusBySector() calcula o pior status por setor a partir
desses blocos e alimenta a Visão Central — quando a Tray (ou outra fonte)
começar a escrever nessa mesma tabela (SectorMetric) automaticamente, a
tela não muda nada, só passa a atualizar sozinha em vez de manual.
Acesso por setor: /admin/usuarios (só visível pra quem é role=admin)
— cria login pra cada pessoa e marca quais setores ela vê. Admin sempre vê
todos os setores; membro só vê o que foi liberado. A Visão Central mostra
só os setores daquele usuário.
Fonte de dado — Tray Commerce (src/lib/tray.ts): integração OAuth2
direta com a API REST da Tray (confirmada contra developers.tray.com.br).
Fluxo: /conectar-tray (admin-only) → /api/tray/connect redireciona pro
auth.php da loja → depois de autorizar, /api/tray/callback troca o
code por access_token/refresh_token (guardados criptografados em
TrayConnection, uma única linha — é conexão da empresa, não por usuário).
getValidAccessToken() renova sozinho quando o token expira. Falta
testar o handshake completo de verdade — só dá pra fechar o login
clicando num navegador de verdade, com HTTPS (o app precisa estar
publicado; não rola de dentro da sandbox de dev). Assim que estiver
conectado, tudo que consome a API (CRM de Clientes abaixo, e depois os
outros setores) passa a puxar dado real sem precisar mudar nada de código.
Manter a conexão viva (/api/cron/sync-tray, agendado em
vercel.json): o access_token da Tray dura só algumas horas e o
refresh_token só é renovado quando algo de fato chama a API — sem uso,
ele fica parado até vencer e a conexão morre sem avisar ninguém. Esse
cron roda 1x/dia só pra manter o uso constante (chama getValidAccessToken()
e atualiza lastSyncAt), independente de alguém abrir as telas que
dependem da Tray. A tela /conectar-tray mostra um aviso quando o
refresh_token está perto de vencer; se vencer de vez, a correção é
sempre desconectar e reautorizar por ali — nunca colar token manualmente.
CRM de Clientes (/empresa/clientes, src/lib/trayCustomers.ts):
lista de clientes com busca, e ao clicar abre o histórico de pedidos,
ticket médio, total gasto e recência (Ativo ≤30d / Esfriando 31–90d /
Sumido 90+d), tudo calculado a partir de /customers e /orders da
Tray (campos confirmados contra a doc oficial). Sem a Tray conectada,
mostra um aviso claro com CTA pra /conectar-tray em vez de tela de erro.
Ainda não ligado: os outros setores (Estoque, Logística, Marketing/Vendas)
que também vão consumir trayGet() depois.
No painel pessoal, ao criar uma pendência aparece "Atribuir para" quando existe mais de um usuário no sistema. Escolhendo outra pessoa:
createdAt) e quando foi concluída (completedAt, marcado
sozinho ao mover o card pra uma coluna "concluído").Serve pra não perder pendência delegada no meio do trabalho — o pedido original foi justamente esse: "toda vez que ele entrar, vai aparecer alerta [...] isso cria um histórico de trabalho e hora de envio e hora de execução".
prisma/schema.prisma modelo de dados (User, Item, Column, SectorAccess, SectorMetric, GmailConnection, TrayConnection)
prisma/seed.ts cria o usuário inicial
src/auth.ts configuração do NextAuth (credentials)
src/proxy.ts protege as rotas (redireciona pra /login)
src/lib/gmail.ts OAuth + sincronização do Gmail
src/lib/tray.ts OAuth + client REST da Tray Commerce
src/lib/trayCustomers.ts CRM: lista/detalhe de clientes e pedidos, cálculo de recência/ticket médio
src/lib/crypto.ts criptografia de tokens (AES-256-GCM) — Gmail e Tray
src/lib/columns.ts colunas padrão criadas sob demanda por categoria
src/lib/anthropic.ts ditado inteligente (Claude API)
src/lib/sectors.ts setores da aba BFF Fitness (nomes/descrições/ícones)
src/lib/sectorStatus.ts paleta do semáforo (verde/amarelo/vermelho/sem-dado)
src/lib/sectorMetrics.ts blocos de cada setor: ler/gravar status manual, status consolidado por setor
src/lib/permissions.ts quem vê qual setor (admin = tudo, membro = SectorAccess)
src/components/EmpresaHub.tsx visual de rede/central de comando da Visão Central
src/app/painel/ painel pessoal (Kanban)
src/app/empresa/ Visão Central + detalhe de cada setor (BFF Fitness)
src/app/admin/usuarios/ criar usuário e marcar acesso por setor
src/app/conectar-gmail/ tela de conexão com o Gmail
src/app/conectar-tray/ tela de conexão com a Tray (admin-only)
src/app/empresa/clientes/ CRM de clientes (lista + histórico de pedidos, puxado da Tray)
src/app/api/items/ CRUD de pendências + ditado inteligente + atribuição
src/app/api/columns/ CRUD de colunas do Kanban (própria + de quem você atribui)
src/app/api/admin/users/ CRUD de usuários e acesso por setor
src/app/api/gmail/ conectar/sincronizar/desconectar Gmail
src/app/api/tray/ conectar/status/desconectar Tray + CRM (customers)
src/app/api/cron/sync-gmail/ endpoint chamado pelo cron da Vercel
vercel.json agenda do cron (a cada hora)
Item.due e Column.isDone).