Feature: Financial Role Access Control — Phase 3 (P1 MVP)
Stories: US1 (GERENTE retains access) + US2 (non-GERENTE blocked)
Update src/utils/supabase/middleware.ts inside updateSession:
- Add
const FINANCIAL_ROUTES = ['/dashboard/financeiro', '/dashboard/planos'] as const at module scope
- Add
const isFinancialRoute = FINANCIAL_ROUTES.some(r => pathname.startsWith(r))
- When
isFuncionario && isFinancialRoute: query supabase.from('funcionarios').select('role').eq('id', user.id).maybeSingle() and redirect to /dashboard if data?.role !== 'GERENTE' or if query errors (fail-closed)
Independent test: GERENTE → financeiro renders ✅, RECEPCIONISTA → redirected to /dashboard ✅
Feature: Financial Role Access Control — Phase 3 (P1 MVP)
Stories: US1 (GERENTE retains access) + US2 (non-GERENTE blocked)
Update
src/utils/supabase/middleware.tsinsideupdateSession:const FINANCIAL_ROUTES = ['/dashboard/financeiro', '/dashboard/planos'] as constat module scopeconst isFinancialRoute = FINANCIAL_ROUTES.some(r => pathname.startsWith(r))isFuncionario && isFinancialRoute: querysupabase.from('funcionarios').select('role').eq('id', user.id).maybeSingle()and redirect to/dashboardifdata?.role !== 'GERENTE'or if query errors (fail-closed)Independent test: GERENTE → financeiro renders ✅, RECEPCIONISTA → redirected to /dashboard ✅