---
type: acceptance-criteria
---

# Critérios de aceite — Vendas Executivo

- [ ] Receita Líquida do dashboard bate com SUM manual em TGFITE filtrado por
      STATUSNOTA='L' e TIPMOV≠'B' (tolerância ≤ 0,5%)
      → verificar: `lumo app query app:vendas-executivo --fields receita_liquida:SUM`
        vs `lumo credential query credential:sankhya "SELECT SUM(VALOR_LIQUIDO) FROM TGFITE ..."`
- [ ] Ticket Médio bate com Receita Líquida ÷ COUNT DISTINCT(NUNOTA), mesmo filtro
      → verificar: `lumo app query app:vendas-executivo --fields X<expr_ticket_medio>:EXPR` (razão é expression, nunca `:AVG` — ver `metricas/ticket-medio.md`)
- [ ] Dado disponível até 07:00 (D-1)
      → verificar: `lumo flow logs flow:fact-pedido-item`
      (pré-requisito: linha de evidência de `defasagem_atual` da fonte —
      ver `tabelas/fact_pedido_item.md`, query 4 do profiling)
- [ ] Grain permanece 1:1 no destino: COUNT(*) = COUNT(DISTINCT NUNOTA, SEQUENCIA)
      na tabela fact_pedido_item já carregada no DW (uniqueness não é só decisão
      de Fase 1 — um bug de dedupe reintroduz duplicidade)
      → verificar: `lumo credential query credential:horus-dw "SELECT COUNT(*), COUNT(DISTINCT CONCAT(NUNOTA,'-',SEQUENCIA)) FROM fact_pedido_item"`
- [ ] Layout confere com wireframe aprovado (`wireframes/vendas-executivo.html`)
      → verificar: `lumo app export app:vendas-executivo --image-format png`
- [ ] <a id="papeis-com-acesso"></a>Papéis com acesso ao dashboard: Marcos Aurélio, Camila Duarte, diretoria comercial;
      SEM acesso: vendedores individuais (RLS restritiva por padrão — detalhamento fino
      de papéis/filiais fica `a-perguntar`, ver `incognitas.md#rls-vendedor-detalhamento`)
- [ ] Modelo do app sem fanout: razão relationships/tabela ≤ 1,5 (`apps/vendas.md`
      calcula 0,83 — 5 relationships ÷ 6 tabelas: 1 fato + 5 dims) E toda dimensão
      comum a 2+ fatos é conformada (não aplicável nesta fase — só 1 fato ativo no
      bus matrix, ver `projeto.md`)
      → verificar: `lumo info app:vendas-executivo --full`
