尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Plataforma de gestão condominial com transparência total: ordens de serviço com registro visual de antes e depois, validação do zelador, aprovação do síndico e feed público para moradores. Status: MVP da Fase 1 (núcleo de OS, dashboards, feed, usuários, multi-condomínio, auditoria). Banco: PostgreSQL no Neon, provisionado pela integração Neon do Vercel Marketplace (projeto Vercel kreativae-projetos/condtrack).檢視完整 README ↗
Plataforma de gestão condominial com transparência total: ordens de serviço com registro visual de antes e depois, validação do zelador, aprovação do síndico e feed público para moradores.
Status: MVP da Fase 1 (núcleo de OS, dashboards, feed, usuários, multi-condomínio, auditoria).
Banco: PostgreSQL no Neon, provisionado pela integração Neon do Vercel Marketplace
(projeto Vercel kreativae-projetos/condtrack).
npm install
vercel env pull .env.local --yes # traz DATABASE_URL / DATABASE_URL_UNPOOLED do Neon
npm run db:migrate # aplica prisma/migrations
npm run db:seed # dados de demonstração
npm run dev # http://localhost:3000
Os scripts db:* leem .env.local e .env (via dotenv-cli), porque o Prisma CLI não lê .env.local.
Alterou o schema? npm run db:migrate:dev -- --name descricao cria uma nova migração.
No deploy, npm run build roda prisma migrate deploy antes do next build.
Variáveis de ambiente do projeto:
| Variável | Obrigatória | Observação |
|---|---|---|
DATABASE_URL | sim | PostgreSQL (Neon). A integração Neon da Vercel cria automaticamente. |
DATABASE_URL_UNPOOLED | não | Conexão direta para migrações; se ausente, usa DATABASE_URL. |
AUTH_SECRET | sim | openssl rand -base64 32. Sem ela o login não funciona. |
BLOB_STORE_ID ou BLOB_READ_WRITE_TOKEN | sim, em produção | Fotos e vídeos das OS no Vercel Blob (privado). Criado ao conectar um Blob store ao projeto (Storage → Create → Blob); o formato novo usa BLOB_STORE_ID + OIDC. Sem ele, usa o disco local (./storage), que não persiste na Vercel. |
SETUP_TOKEN | só na instalação | Código (mín. 12 caracteres) para criar a conta de superadmin em /primeiro-acesso quando o banco não tem nenhum. Remova depois. |
SEED_ON_DEPLOY | não | true roda o seed de demonstração apenas se o banco estiver sem usuários. Remova após o primeiro deploy. |
O build (npm run build) aplica as migrações pendentes via scripts/migrate.mjs.
Contas de demonstração (senha condtrack123):
| Perfil | |
|---|---|
| Superadmin | [email protected] |
| Síndico | [email protected] |
| Zelador | [email protected] |
| Prestador (pintura) | [email protected] |
| Prestador (elétrica) | [email protected] |
| Conselho | [email protected] |
| Morador (somente visualização) | [email protected] |
| Perfil | Código | O que faz |
|---|---|---|
| Superadmin | superadmin | Tudo, em todos os condomínios |
| Síndico | syndic | Gestão completa do condomínio, atribui e aprova OS |
| Zelador | caretaker | Registra ocorrências e valida serviços |
| Prestador | provider | Executa OS atribuídas, anexa antes/depois |
| Conselho | council | Abre solicitações, acompanha as suas, comunicados e feed |
| Morador | resident | Somente visualização: dashboard e feed de serviços entregues |
Next.js 16 (App Router, Server Actions, proxy.ts) · React 19 · Tailwind CSS 4 · Prisma 6 + PostgreSQL (Neon) ·
Zod · jose (JWT em cookie httpOnly) · bcryptjs · Recharts · Lucide.
open ─► assigned ─► in_progress ─► completed ─► validated ─► approved (feed)
(síndico) (prestador, (prestador, (zelador) (síndico)
exige ANTES) exige DEPOIS)
│ │
└── rejected ◄─┘ (devolvida com motivo → prestador retoma)
Todas as regras de transição e visibilidade ficam em src/lib/workflow.ts (can() / canView()),
usadas tanto pela UI quanto pelas server actions — a UI nunca é a única barreira.
prisma/schema.prisma modelo de dados (Condomínio, Torre, Unidade, Usuário, OS, Mídia, Evento, …)
prisma/seed.ts dados de demonstração
src/proxy.ts redireciona não autenticados (checagem otimista)
src/lib/auth.ts sessão, requireUser(), "visualizar como" (impersonate)
src/lib/workflow.ts máquina de estados da OS + permissões por papel
src/lib/notify.ts notificações in-app (ponto de extensão p/ push/e-mail)
src/lib/audit.ts log de auditoria (IP, user-agent, antes/depois)
src/lib/storage.ts mídias: Vercel Blob privado (produção) ou disco local (dev)
src/app/actions/* server actions (auth, OS, admin, comunicados)
src/app/api/upload upload de mídia (1 arquivo/req, com checagem de permissão)
src/app/api/media entrega de mídia autenticada
src/app/(app)/… páginas autenticadas por perfil
src/components/ design system (ui.tsx), slider antes/depois, uploader, gráficos
Cobrança recorrente por condomínio, em BRL, via Stripe (integração do Vercel Marketplace).
lookup_key condtrack_<plano>_<month|year>)./assinatura): assinar via Stripe Checkout, trocar de plano/periodicidade (com proration), cancelar no fim do período ou reativar, trocar cartão e dados de cobrança no Portal do Cliente, histórico de faturas com PDF./admin/assinaturas): MRR, ARR, recebido em 30 dias, pagantes / em teste / inadimplentes / cancelados, receita mensal, condomínios por plano, lista completa com último pagamento e próxima cobrança; detalhe por condomínio com troca de plano, cancelamento e link para o Stripe./api/stripe/webhook (idempotente). Eventos: checkout.session.completed, customer.subscription.created|updated|deleted|trial_will_end, invoice.finalized|paid|payment_failed|voided|marked_uncollectible. Falha de pagamento notifica síndico e superadmins.Em dev, para receber webhooks: stripe listen --forward-to localhost:3000/api/stripe/webhook e use o segredo exibido em STRIPE_WEBHOOK_SECRET.
/admin/configuracoes centraliza as APIs da plataforma. Valores ficam na tabela Setting, cifrados com AES-256-GCM (SETTINGS_ENCRYPTION_KEY ou derivado do AUTH_SECRET). Ordem de leitura: valor salvo → variável de ambiente → padrão.
after()), e convite/redefinição de senha com a senha provisória.pg_stat_activity (por estado, por aplicação, sessões mais longas, uso vs. max_connections).@simplewebauthn): ativar/desativar, nome exibido, domínio (RP ID) e origens. Cada usuário cadastra aparelhos em Meu perfil; o login mostra "Entrar com Face ID / biometria". Exige HTTPS em produção.| Item | Observação |
|---|---|
| 2FA síndico/superadmin | Fase 1 restante. |
| Push / e-mail / WhatsApp | Plugar em src/lib/notify.ts. |
| Fase 2 | Documentos, reservas de áreas comuns, chat, inspeções/rondas persistidas, manutenção preventiva, relatórios PDF/Excel. |
| Fase 3 | App mobile (Expo), modo offline. |
| Logo por condomínio | Hoje só a cor de destaque é configurável. |
| Testes E2E | Playwright cobrindo o fluxo completo da OS. |