From 1ebf67afcd213a811a684270c6aa40cbf82924c8 Mon Sep 17 00:00:00 2001 From: tkinaba Date: Fri, 22 May 2026 11:43:27 -0300 Subject: [PATCH 1/3] =?UTF-8?q?fix(ai):=20adicionar=20implementa=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20query=20para=20C5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/flash/flash.module.ts | 86 +++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index fd8de3c..1ba0ebd 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -10,17 +10,24 @@ export default moduleFactory icon: "bar-chart", ai: { topics: { - flash_vendas_big: { + flash_vendas: { descricao: "Consulta e análise do relatório Flash de Vendas. Permite visualizar metas do mês, vendas do mês atual, variações e projeções, além de comparativos com o mês anterior e ano anterior. Útil para projeção de batimento de meta, ranking de lojas e comparativos de performance.", prompt: { - prompt_persona: "Especialista em dados e extrator de filtros para o Flash de Vendas. Analise a solicitação sobre desempenho de vendas, identifique filtros (data, loja) e agrupamento, e preencha o schema.", - prompt_tarefa: "1. Identifique filtros: extraia data de referência (default: hoje) e lojas se mencionadas. Apenas `data` e `loja` são suportados.\n2. Identifique agrupamento: vazio para total geral, ou \"loja\" se o usuário pediu ranking/comparação entre lojas.\n3. Identifique o propósito analítico (apenas para contexto, não preencha campo):\n - \"Vou bater a meta?\" → projeção de fechamento e gap.\n - \"Loja mais distante da meta?\" → ranking por % de atingimento.\n - Comparativos temporais → mes_anterior ou ano_anterior.", - prompt_regras_contexto: "- Refinamentos (\"e o ano passado?\") → use o histórico para manter filtros anteriores.\n- Não invente valores que não foram informados.", - prompt_regras_gerais: "- Múltiplas lojas (\"loja A e loja B\") → extraia como array.\n- Sem solicitação de agrupamento → deixe vazio.\n- Não invente filtros ou agrupamentos fora do schema (divisão, segmento, regional não são suportados).", - prompt_exemplos: "- \"Vou bater a meta do mês?\" → sem filtro de loja, sem agrupamento\n- \"Qual loja está mais distante da meta?\" → agrupamento: \"loja\"\n- \"Como estamos em relação ao mês passado?\" → sem agrupamento (comparativo temporal direto)\n- \"Como foi a loja Centro e Shopping?\" → loja: [\"Centro\", \"Shopping\"]", - prompt_outras_infos: "A query retorna colunas: mes_atual, meta_mes, mes_anterior, ano_anterior. Apenas totalizações gerais ou por loja são suportadas.", - prompt_saida: "Sua resposta deve ser uma análise detalhada e objetiva dos dados recebidos, apresentando os principais insights de forma clara e concisa." + prompt_persona: + "Especialista em dados e extrator de filtros para o Flash de Vendas. Analise a solicitação sobre desempenho de vendas, identifique filtros (data, loja) e agrupamento, e preencha o schema.", + prompt_tarefa: + '1. Identifique filtros: extraia data de referência (default: hoje) e lojas se mencionadas. Apenas `data` e `loja` são suportados.\n2. Identifique agrupamento: vazio para total geral, ou "loja" se o usuário pediu ranking/comparação entre lojas.\n3. Identifique o propósito analítico (apenas para contexto, não preencha campo):\n - "Vou bater a meta?" → projeção de fechamento e gap.\n - "Loja mais distante da meta?" → ranking por % de atingimento.\n - Comparativos temporais → mes_anterior ou ano_anterior.', + prompt_regras_contexto: + '- Refinamentos ("e o ano passado?") → use o histórico para manter filtros anteriores.\n- Não invente valores que não foram informados.', + prompt_regras_gerais: + '- Múltiplas lojas ("loja A e loja B") → extraia como array.\n- Sem solicitação de agrupamento → deixe vazio.\n- Não invente filtros ou agrupamentos fora do schema (divisão, segmento, regional não são suportados).', + prompt_exemplos: + '- "Vou bater a meta do mês?" → sem filtro de loja, sem agrupamento\n- "Qual loja está mais distante da meta?" → agrupamento: "loja"\n- "Como estamos em relação ao mês passado?" → sem agrupamento (comparativo temporal direto)\n- "Como foi a loja Centro e Shopping?" → loja: ["Centro", "Shopping"]', + prompt_outras_infos: + "A query retorna colunas: mes_atual, meta_mes, mes_anterior, ano_anterior. Apenas totalizações gerais ou por loja são suportadas.", + prompt_saida: + "Sua resposta deve ser uma análise detalhada e objetiva dos dados recebidos, apresentando os principais insights de forma clara e concisa.", }, json_params_saida: { agrupamentos: [ @@ -458,7 +465,68 @@ export default moduleFactory }, flash_vendas_ai: (args) => { return { - sql: /*sql*/ ``, + sql: /*sql*/ ` + SELECT + ${args.agrupamento} AS KEY_FIELD, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual, + CASE + WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0 + ELSE ROUND( + ((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) / + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100 + , 2) + END AS variacao_atual, + SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior, + SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) - + SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior, + CASE + WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0 + ELSE ROUND( + ((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) / + SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100 + , 2) + END AS variacao_mes_anterior, + SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior, + SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) - + SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior, + CASE + WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0 + ELSE ROUND( + ((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) / + SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100 + , 2) + END AS variacao_ano_anterior + FROM + ( + SELECT + n.codigo, + n.nome AS nomeempresaapp, + n.codigo || ' - ' || n.nome AS loja_formatada, + r.valor_meta_efetiva, + r.valor_venda, + CASE + WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD') THEN 'ATUAL' + WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1) THEN 'MES_ANTERIOR' + WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12) THEN 'ANO_ANTERIOR' + END AS periodo + FROM tb_flash_nodo_resumo_venda r + JOIN tb_flash_nodo n ON n.id_nodo = r.id_nodo + WHERE n.tipo_nodo = 'EMPRESA' + AND ( + r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD') + OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1) + OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12) + ) + ) x + WHERE 1=1 + --FILTROS-- + GROUP BY ${args.agrupamento} + ORDER BY mes_atual DESC + `, }; }, }, From b25995dfdfb93505fc01cd103eb824778faaf684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sarah=20Magalh=C3=A3es?= Date: Fri, 22 May 2026 14:08:03 -0300 Subject: [PATCH 2/3] Adicionado assunto sem assunto modulo de flash --- src/flash/flash.module.ts | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index 1ba0ebd..52ed36d 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -52,6 +52,23 @@ export default moduleFactory }, query_base: "flash_vendas_ai", }, + sem_assunto: { + descricao: "Fluxo a ser seguido quando não houver assunto definido", + prompt: { + prompt_persona: "", + prompt_tarefa: "", + prompt_regras_contexto: "", + prompt_regras_gerais: "", + prompt_exemplos: "", + prompt_outras_infos: "", + prompt_saida: "Responda que não conseguiu identificar o assunto de maneira amigável", + }, + json_params_saida: { + agrupamentos: [], + filtros: {}, + }, + query_base: "query_vazia" + } }, }, queries: { @@ -200,6 +217,13 @@ export default moduleFactory }, params: ["data_venda", "agrupamento"], }, + query_vazia: { + name: "Query Vazia", + display: { + type: "none", + }, + params: [], + } }, entrypoint: "flash" as "flash" | "flash_categorias", }) @@ -529,6 +553,12 @@ export default moduleFactory `, }; }, + query_vazia: (args)=> { + return { + sql: /*sql*/`` + + } + }, }, C5_big: { flash: (args) => { @@ -858,6 +888,12 @@ export default moduleFactory `, }; }, + query_vazia: (args)=> { + return { + sql: /*sql*/`` + + } + }, }, C5_mambo: { flash: (args) => { @@ -916,6 +952,12 @@ where 1 = 0`, sql: /*sql*/ ``, }; }, + query_vazia: (args)=> { + return { + sql: /*sql*/`` + + } + }, }, }) .withSchedules({ From 16cabd161bb8b836108bb8d9cc94402876c7a554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sarah=20Magalh=C3=A3es?= Date: Fri, 22 May 2026 14:31:57 -0300 Subject: [PATCH 3/3] Ajuste assunto sem_assunto --- src/flash/flash.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index 52ed36d..195b032 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -61,7 +61,7 @@ export default moduleFactory prompt_regras_gerais: "", prompt_exemplos: "", prompt_outras_infos: "", - prompt_saida: "Responda que não conseguiu identificar o assunto de maneira amigável", + prompt_saida: "Responda que não conseguiu identificar o assunto de maneira amigável e mostre os assuntos disponíveis para consulta.", }, json_params_saida: { agrupamentos: [],