Files
tiagoandClaude Sonnet 5 7daaa16935 Etapa 6 — Vendas, parcelas e dashboards
Adiciona o módulo sales: vendas com itens/parcelas em transação, transições
de status controladas (orçamento→confirmada→concluída, cancelamento em
cascata pras parcelas), edição só em orçamento, recebimentos (marcar-pago,
atualizar-atrasadas) e dashboards semanal/mensal/financeiro do tenant.

Corrige uma falha de isolamento entre tenants nas views de dashboard
(rodavam com privilégio do dono, ignorando RLS) via
security_invoker = true nas views, coberta por teste e2e dedicado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 22:07:00 -03:00

16 lines
979 B
SQL

-- Correção de segurança: as views de dashboard criadas na migration
-- `20260812161100_rls_views_constraints` (dono = role bootstrap
-- `seconectai`, superuser) rodam, por padrão, com os privilégios do
-- *dono da view* — não de quem consulta. Como o dono é superuser, ele
-- ignora Row Level Security, então qualquer role com apenas `SELECT` na
-- view (ex: `app_tenant`) conseguiria ler dados de *todos* os tenants
-- através dela, mesmo com as policies de RLS corretas nas tabelas por
-- trás (`sales`, `sale_payments`). `security_invoker = true` (Postgres
-- 15+, disponível na imagem `postgres:16-alpine` do docker-compose) faz a
-- view rodar com os privilégios de quem a consultou, restaurando o
-- isolamento por tenant também através das views.
ALTER VIEW "vw_resumo_vendas_semanal" SET (security_invoker = true);
ALTER VIEW "vw_resumo_vendas_mensal" SET (security_invoker = true);
ALTER VIEW "vw_recebimentos" SET (security_invoker = true);