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>
16 lines
979 B
SQL
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);
|