Roles atuais (src/lib/permissions.ts):
| Role | Descrição |
|---|---|
ADMIN |
Gerencia usuários e segurança. Acesso total. |
GROOM |
Noivo. Edita tudo. |
BRIDE |
Noiva. Edita tudo. |
PLANNER |
Cerimonialista. Edita conteúdo do casamento — sem acesso a finanças. |
FAMILY |
Família. Somente leitura com acesso a detalhes. |
VIEWER |
Visualiza informações básicas. |
Os checks abaixo são aplicados via requireFinanceAccess() nas pages e denyIfNoFinance() nas server actions (ambos em src/lib/finance-access.ts).
| Área | ADMIN / GROOM / BRIDE | PLANNER | FAMILY / VIEWER |
|---|---|---|---|
| Fornecedores | ✅ | ✅ | leitura¹ |
| Locais | ✅ | ✅ | leitura |
| Tarefas | ✅ | ✅ | leitura |
| Convidados | ✅ | ✅ | leitura |
| Grupos de convidados | ✅ | ✅ | 🚫 (denyIfNoEdit) |
| Presentes | ✅ | ✅ | leitura |
| QR Code PIX do gift | ✅ | ✅ (canEdit) |
🚫 redirect |
| Dia D + Seating | ✅ | ✅ | leitura |
| Mesas (criar/editar/posicionar) | ✅ | ✅ | 🚫 (denyIfNoEdit) |
| Lua de mel | ✅ | ✅ | leitura |
| Enxoval | ✅ | ✅ | leitura |
| Pagamentos | ✅ | 🚫 redirect | 🚫 redirect |
| Receitas | ✅ | 🚫 redirect | 🚫 redirect |
| Caixa (Assets) | ✅ | 🚫 redirect | 🚫 redirect |
| Metas | 🚫 | 🚫 redirect | 🚫 redirect |
| Insights / DRE | ✅ | 🚫 redirect | 🚫 redirect |
Backup (/api/backup) |
✅ | 🚫 403 | 🚫 403 |
| Ajustes | ✅ | ✅ (perfil) | perfil |
¹ A página de detalhe do fornecedor (/dashboard/vendors/[id]) sanitiza
no servidor os campos financeiros (payments, budgetItems,
contracts[].totalValue) para roles sem canViewSensitiveFinance — eles
nem chegam ao client, então DevTools não revela. Veja
seguranca.md.
Roles com 🚫 são redirecionadas para /dashboard se tentarem acessar a página diretamente (/api/backup retorna 403 JSON), e os links ficam escondidos no menu (Sidebar / MobileHeader / BottomNav usam useVisibleLinks()).
import { requireFinanceAccess } from "@/lib/finance-access";
export default async function MyFinancePage() {
await requireFinanceAccess(); // redireciona se não autorizado
// ...
}
import { denyIfNoFinance } from "@/lib/finance-access";
export async function myFinanceAction(): Promise<ActionResult> {
const denied = await denyIfNoFinance();
if (denied) return denied;
// ...
}
Estas roles também são bloqueadas das áreas financeiras (canViewSensitiveFinance cobre só ADMIN/GROOM/BRIDE). Não estão na matriz como casos diferentes do PLANNER porque o comportamento é idêntico para finanças. A diferença está em canEdit() (FAMILY/VIEWER não editam nada).
Ajustes › Time › “Convidar membro”. Defina a role na criação. Comportamento de finanças aplica imediatamente.
canManageUsers) usam
Ajustes › Time › editar membro. O updateUser valida unicidade do e-mail (campo @unique).
É a forma de corrigir o admin@admin.com placeholder criado pelo seed e de cadastrar os
e-mails reais dos noivos para que recebam lembretes e RSVPs./dashboard/profile), informando
a senha atual (updateOwnEmail em src/app/actions/profileActions.ts).id); o novo e-mail
passa a valer no próximo login. Ambas as ações gravam AuditLog (action: "UPDATE").Funções específicas em src/lib/permissions.ts:
| Função | Quem retorna true |
|---|---|
canUploadContract(role) |
ADMIN, GROOM, BRIDE, PLANNER |
canViewContract(role) |
ADMIN, GROOM, BRIDE, PLANNER |
canManageContract(role) |
ADMIN, GROOM, BRIDE |
canSignContract(role) |
ADMIN, GROOM, BRIDE |
canViewAttachmentKind(role, kind) |
varia por kind |
canUploadAttachmentKind(role, kind) |
CONTRACT exige upload-contract; demais exigem canEdit |
FAMILY e VIEWER não acessam contratos (kind CONTRACT/INVOICE/RECEIPT).
Veja anexos.md para a matriz completa.
O hub /dashboard/reports filtra cards por permissão:
canViewSensitiveFinance./dashboard/reports/activity) só para canManageUsers.Dashboard principal (/dashboard) tem versão sanitizada para
FAMILY/VIEWER (KPIs operacionais em vez de R$, esconde Pie e lista de
pagamentos, mantém RSVP/Gifts mini cards). Detalhes em
relatorios.md.