From e107020f60a7de22cc0425016fb3baf2a742690e Mon Sep 17 00:00:00 2001 From: "sarah.magalhaes" Date: Wed, 10 Jun 2026 14:00:40 -0300 Subject: [PATCH] Adicionando assunto de flash de vendas por categoria ia --- src/flash/flash.module.ts | 164 +++++++++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 1 deletion(-) diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index fbb87de..b635d6f 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -48,11 +48,45 @@ export default moduleFactory "Lista de nomes ou códigos de lojas mencionados para filtragem.", coluna_vtr: "x.nomeempresaapp", tabela_rag: "lojas", + }, }, }, query_base: "flash_vendas_ai", }, + flash_vendas_categorais : { + descricao: "Consulta e análise do Flash de Vendas por Categorias do Verdemar. Visualiza metas, vendas, variações e comparativos temporais (mês anterior e ano anterior) por categorias e subcategorias de produtos, de forma hierárquica. Permite filtrar por loja e por categoria pai.", + prompt: { + prompt_persona: "Você é um Extrator de Filtros especializado. Sua única tarefa: analisar a solicitação do usuário sobre vendas por categorias (Flash de Categorias) da rede Verdemar, identificar as informações desejadas (data de referência, loja ou categoria pai) e preencher as variáveis exatas do sistema de relatórios.", + prompt_tarefa: "1. Filtros: extraia a data em 'data_venda' (default: hoje, YYYY-MM-DD), a loja em 'cod_empresa' e a categoria pai em 'codigo_categoria_pai'.\n2. Agrupamento: esta query não exige quebra dinâmica; mantenha o agrupamento vazio.\n3. Propósito analítico:\n - Categoria/subcategoria específica (ex: Bebidas, Padaria, Açougue) → extraia o código/nome para 'codigo_categoria_pai'.\n - Visão geral sem detalhar nenhuma categoria → deixe 'codigo_categoria_pai' vazio.", + prompt_regras_gerais: "- Filtro de data obrigatório (default: hoje, YYYY-MM-DD).\n- Loja específica → extraia o código em 'cod_empresa'.\n- 'codigo_categoria_pai' recebe a categoria/seção pai cujas subcategorias o usuário quer detalhar.", + prompt_regras_contexto: "- Em mensagens incompletas ou de continuação (ex: 'E na loja Sion?'), use o histórico para manter data base, loja e categorias anteriores.\n- Não invente valores de filtro não citados claramente.", + prompt_exemplos: "Ex.1 (Visão Geral/Raiz): 'Como foram as vendas por categoria ontem?' → data_venda='ontem', sem cod_empresa, sem codigo_categoria_pai (raiz nível 2).\nEx.2 (Categoria + Loja): 'Vendas de Bebidas na loja Sion hoje.' → data_venda='hoje', cod_empresa='Sion', codigo_categoria_pai='Bebidas'.\nEx.3 (Drill-Down): 'Quero detalhar a seção de Cervejas.' → codigo_categoria_pai='Cervejas'; mantém data e loja do contexto, se houver.", + prompt_outras_infos: "A query fornece vendas e comparativos por categoria de produtos (mes_atual, mes_anterior, ano_anterior). Suporta filtros por loja (cod_empresa) e categoria pai (codigo_categoria_pai) para navegação hierárquica.", + prompt_saida: "Responda ÚNICA e EXCLUSIVAMENTE com um objeto JSON válido, aderente ao schema de filtros e agrupamentos. Sem texto extra e sem markdown — apenas o JSON puro." + }, + json_params_saida: { + agrupamentos: [], + filtros: { + data_venda: { + descricao_agente: "A data base para a consulta de vendas (YYYY-MM-DD). Caso não seja informada explicitamente pelo usuário, use a data de hoje.", + coluna_vtr: "args.data_venda", + // tabela_rag: null + }, + cod_empresa: { + descricao_agente: "Código ou nome da loja (empresa) do Verdemar para filtrar as vendas por categoria.", + coluna_vtr: "args.cod_empresa", + //tabela_rag: "tb_flash_nodo" + }, + codigo_categoria_pai: { + descricao_agente: "Código ou nome da categoria pai para detalhamento (drill-down) das subcategorias. Se não especificado, retorna as categorias principais.", + coluna_vtr: "args.codigo_categoria_pai", + // tabela_rag: "tb_flash_nodo" + } + } + }, + query_base: "flash_vendas_categoria_ai", + }, sem_assunto: { descricao: "Fluxo a ser seguido quando não houver assunto definido", prompt: { @@ -243,6 +277,13 @@ export default moduleFactory }, params: ["data_venda", "agrupamento"], }, + flash_vendas_categoria_ai: { + name: " Flash de vendas Categoria AI", + display: { + type: "none", + }, + params: ["data_venda"], + }, query_vazia: { name: "Query Vazia", display: { @@ -600,6 +641,12 @@ export default moduleFactory return { sql: /*sql*/`` + } + }, + flash_vendas_categoria_ai: (args)=> { + return { + sql: /*sql*/`` + } }, }, @@ -943,7 +990,13 @@ export default moduleFactory } }, - }, + flash_vendas_categoria_ai: (args)=> { + return { + sql: /*sql*/`` + + } + } + }, C5_mambo: { flash: (args) => { return { @@ -1011,6 +1064,12 @@ where 1 = 0`, return { sql: /*sql*/`` + } + }, + flash_vendas_categoria_ai: (args)=> { + return { + sql: /*sql*/`` + } }, }, @@ -1291,6 +1350,109 @@ where 1 = 0`, sql: /*sql*/` select nome, id_nodo, codigo from verdemar.tb_flash_nodo where tipo_nodo = 'EMPRESA'` } }, + flash_vendas_categoria_ai: (args)=> { + return { + sql: /*sql*/` + WITH Parametros_Base AS ( + SELECT + TO_DATE(\${args.data_venda}, 'YYYY-MM-DD') AS data_venda, + \${args.codigo_categoria_pai} AS codigo_categoria_pai, + \${args.cod_empresa} AS cod_empresa + FROM DUAL + ), + Parametros AS ( + SELECT + data_venda, + TRUNC(data_venda, 'MM') AS dt_inicio_mes, + ADD_MONTHS(TRUNC(data_venda, 'MM'), -1) AS dt_inicio_mes_ant, + ADD_MONTHS(data_venda, -1) AS dt_fim_mes_ant, + ADD_MONTHS(TRUNC(data_venda, 'MM'), -12) AS dt_inicio_ano_ant, + ADD_MONTHS(data_venda, -12) AS dt_fim_ano_ant, + codigo_categoria_pai, + cod_empresa + FROM Parametros_Base + ), + filhos AS ( + SELECT + n.id_nodo, + CASE + WHEN p.cod_empresa IS NULL THEN + MIN(n.ID_NODO) OVER (PARTITION BY n.nome) + ELSE + n.ID_NODO + END AS codigo, + n.nome, n.tipo_nodo, n.nivel, + n.cod_empresa, n.ordem_exibicao + FROM VERDEMAR.TB_FLASH_NODO n + CROSS JOIN Parametros p + WHERE n.ativo = 'S' + AND n.cod_empresa IN (\${args.ctx_user_companies_for_module}) + AND ( (p.codigo_categoria_pai IS NULL AND n.tipo_nodo = 'CATEGORIA' AND n.NIVEL = 2) + OR (p.codigo_categoria_pai IS NOT NULL AND n.id_nodo_pai IN ( + SELECT pai.id_nodo + FROM VERDEMAR.TB_FLASH_NODO pai + WHERE pai.nome = (SELECT nome FROM VERDEMAR.TB_FLASH_NODO WHERE id_nodo = p.codigo_categoria_pai) + )) ) + AND (p.cod_empresa IS NULL OR n.cod_empresa = p.cod_empresa) + ), + Vendas_Metas AS ( + SELECT + f.id_nodo, f.codigo, f.nome, f.tipo_nodo, f.nivel, + f.cod_empresa, f.ordem_exibicao, + r.data_referencia AS data, + r.valor_venda AS venda, + 0 AS meta + FROM filhos f + JOIN VERDEMAR.TB_FLASH_NODO_RESUMO_VENDA r ON r.id_nodo = f.id_nodo + CROSS JOIN Parametros p + WHERE ( r.data_referencia BETWEEN p.dt_inicio_mes AND p.data_venda + OR r.data_referencia BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant + OR r.data_referencia BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant) + ), + Agrupado AS ( + SELECT + v.codigo AS codigo, + MAX(v.nome) AS nome, + MAX(v.tipo_nodo) AS tipo_nodo, + MAX(v.nivel) AS nivel, + MAX(v.ordem_exibicao) AS ordem_exibicao, + GROUPING(v.codigo) AS is_total, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_mes AND p.data_venda THEN v.venda ELSE 0 END) AS v_mes, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN v.venda ELSE 0 END) AS v_mes_ant, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN v.venda ELSE 0 END) AS v_ano_ant, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_mes AND p.data_venda THEN v.meta ELSE 0 END) AS m_mes, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN v.meta ELSE 0 END) AS m_mes_ant, + SUM(CASE WHEN v.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN v.meta ELSE 0 END) AS m_ano_ant + FROM Vendas_Metas v + CROSS JOIN Parametros p + GROUP BY GROUPING SETS ((v.codigo, p.cod_empresa), ()) + ) + SELECT + nome AS nomeempresaapp, + tipo_nodo AS canalapp, + codigo AS cod_empresa, + is_total, + m_mes AS meta_mes, + v_mes AS mes_atual, + (v_mes - m_mes) AS dif_mes_atual, + CASE + WHEN m_mes = 0 THEN 0 + ELSE ROUND(((v_mes / m_mes) * 100) - 100, 2) + END AS variacao_atual, + m_mes_ant AS meta_mes_anterior, + v_mes_ant AS mes_anterior, + (v_mes - v_mes_ant) AS dif_mes_anterior, + ROUND(NVL((v_mes / NULLIF(v_mes_ant, 0)) * 100 - 100, 0), 2) AS variacao_mes_anterior, + m_ano_ant AS meta_ano_anterior, + v_ano_ant AS ano_anterior, + (v_mes - v_ano_ant) AS dif_ano_anterior, + ROUND(NVL((v_mes / NULLIF(v_ano_ant, 0)) * 100 - 100, 0), 2) AS variacao_ano_anterior + FROM Agrupado + ORDER BY is_total, ordem_exibicao NULLS LAST, nomeempresaapp + + ` + } + }, } }) .withSchedules({