=== Parte A: regras e dados === -- escolha automática do tipo -- ✅ 1 série, 4 itens, soma>0 => pizza — poucos itens (4) de uma única medida: partes de um todo ✅ rótulos são anos => linha — rótulos são períodos (evolução no tempo) ✅ rótulos AAAA-MM => linha ✅ rótulos mês/ano por extenso => linha ✅ 12 itens => barra (muitos itens) — muitos itens (12) ✅ 3 itens com rótulos longos => pizza (poucos itens vencem a regra de rótulo longo) ✅ 7 itens com rótulos longos => barra — rótulos longos ✅ 7 itens, rótulos curtos => coluna — comparação entre categorias ✅ 2 séries, não temporal => coluna (agrupada) ✅ valor negativo => nunca pizza automática -- tipo pedido pelo usuário -- ✅ pedido barra => barra, mesmo com poucos itens ✅ pizza com 2 séries => usa a 1ª e AVISA ✅ pizza com negativo => coluna e AVISA ✅ linha pedida sem eixo de tempo => respeita ✅ normalizaTipo('torta') — 'pizza' ✅ normalizaTipo('Barras') — 'barra' ✅ normalizaTipo('colunas') — 'coluna' ✅ normalizaTipo('linhas') — 'linha' ✅ normalizaTipo('pie') — 'pizza' ✅ normalizaTipo('xyz') — NULL ✅ normalizaTipo('') — NULL -- montagem dos dados -- ✅ coluna de texto ignorada; 1 série numérica ✅ rótulo nulo vira "(vazio)"; valores numéricos ✅ sem linhas => erro claro ✅ 1 coluna => erro claro ✅ sem coluna numérica => erro claro ✅ mais de 60 itens => erro pedindo TOP N ✅ título padrão -- tool com o banco (Ceon) -- ✅ retorno ok ✅ grafico_pronto: tipo=generico, subtipo e título ✅ tipo decidido pelo sistema (não foi pedido) — pizza — poucos itens (4) de uma única medida: partes de um todo ✅ soma do gráfico = soma no banco (SQL independente) — gráfico=210 banco=210 ✅ nº de itens = nº de tipos no banco ✅ valor de ROPA confere — banco=144 ✅ tipo pedido (coluna) respeitado ✅ título vazio => título padrão gerado em código — Quantidade por tipo -- validações e isolamento -- ✅ SQL de escrita rejeitado (mesmo executor do sql_query) — Consulta rejeitada: Somente consultas SELECT são permitidas. ✅ coluna sensível bloqueada ✅ tipo inválido => erro claro ✅ consulta sem linhas => erro claro (sem gráfico vazio) ✅ não-Ceon sem escopo: acesso negado, nenhum gráfico — Acesso negado: Tabela não liberada para consulta direta: inventario_scope. Use a === RESULTADO: 41 passaram, 0 falharam ===