diff --git a/package-lock.json b/package-lock.json index 97166a1..3bf4355 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,16 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@davinti/jeff": "^1.0.9" + "@davinti/jeff": "^1.0.10" }, "devDependencies": { "tsx": "^4.21.0" } }, "node_modules/@davinti/jeff": { - "version": "1.0.9", - "resolved": "https://git.davinti.com.br/api/packages/davinTI/npm/%40davinti%2Fjeff/-/1.0.9/jeff-1.0.9.tgz", - "integrity": "sha512-qrpcShdzY/xUlUCXzcgmRAMWIlEkA4zXhhgdBKPULYxU1l8gS6jKA1h1Bf/omIdE8NTATBC2aTRbgew8NsBv5g==", + "version": "1.0.10", + "resolved": "https://git.davinti.com.br/api/packages/davinTI/npm/%40davinti%2Fjeff/-/1.0.10/jeff-1.0.10.tgz", + "integrity": "sha512-feJnWYr175fW6GQHhf+J7/ivfydRb85+6TgC3Qe/3Z+OWOLNxl1jgP4uJC8csi0eeWwu1/8sJ/RE97BIKeADVw==", "license": "ISC", "dependencies": { "@types/glob": "^8.1.0", diff --git a/package.json b/package.json index 8ca8299..df86dfd 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "license": "ISC", "description": "", "dependencies": { - "@davinti/jeff": "^1.0.9" + "@davinti/jeff": "^1.0.10" }, "devDependencies": { "tsx": "^4.21.0" diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index 5944f46..0988e3d 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -8,6 +8,102 @@ export default moduleFactory description: "Flash de Vendas", label: "Flash de Vendas", icon: "bar-chart", + ai : { + topics : { + flash_vendas_big : { + 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: "Você é um Especialista em Dados e Extrator de Filtros de alto nível. Sua única tarefa é analisar a solicitação do usuário sobre desempenho de vendas (Flash de Vendas), identificar quais informações ele deseja buscar (como data de referência ou loja) e como deseja visualizar esses dados (agrupamento), preparando as variáveis exatas para o sistema de relatórios.", + prompt_tarefa: "1. Identificação de Filtros: Extraia a data de referência (geralmente hoje) e identifique se o usuário quer ver dados de uma loja específica. A fonte de dados apenas suporta filtro de 'data' e 'loja'.\n2. Identificação de Agrupamento: Verifique se o usuário deseja visualizar o total geral (agrupamento vazio) ou agrupar por loja (ex: 'Qual loja está mais distante da meta?'). A query não suporta agrupamentos por divisão, segmento ou categoria.\n3. Identificação do Propósito Analítico:\n - Se perguntar 'Vou bater a meta do mês?', a IA final deverá calcular a média de venda diária (realizado / dias corridos), projetar o fechamento (média * dias do mês), comparar com a meta e exibir o gap.\n - Se perguntar 'Qual loja está mais distante da meta?', a IA final deverá criar um ranking ordenando as lojas pelo percentual de atingimento.\n - Se perguntar comparativos temporais ('mês passado' ou 'ano passado'), a IA final fará o comparativo direto em valor e percentual.", + prompt_regras_gerais: "- Extraia listas de lojas se múltiplas forem solicitadas (ex: 'loja A e loja B').\n- Se não houver solicitação explícita ou implícita de agrupamento por loja, não preencha a chave de agrupamento, mantendo-a vazia.\n- Não invente filtros ou agrupamentos (como divisão, segmento) que não existem na configuração.", + prompt_regras_contexto: "- Nunca analise a mensagem de forma isolada se ela for um refinamento (ex: 'E como foi o ano passado?'). Use o histórico para resgatar os filtros anteriores.\n- Não invente valores para os filtros se não forem fornecidos na conversa.", + prompt_exemplos: "*Exemplo 1:*\n- Usuário: 'Vou bater a meta do mês?'\n- Raciocínio: Não há filtro de loja explícito (visão global). Nenhum agrupamento solicitado. A IA apenas extrairá os totais para calcular a projeção e gap com a meta.\n\n*Exemplo 2:*\n- Usuário: 'Qual loja está mais distante da meta?'\n- Raciocínio: Há um pedido implícito de agrupamento por 'loja'. O sistema irá consolidar os dados de todas as lojas para montar o ranking das mais distantes (menor atingimento percentual).\n\n*Exemplo 3:*\n- Usuário: 'Como estamos em relação ao mês passado?'\n- Raciocínio: Nenhuma quebra solicitada, exceto se for contexto anterior. O foco é a comparação de mes_atual vs mes_anterior em valor e percentual.", + prompt_outras_infos: "Atenção: A query subjacente fornece apenas totalizações gerais ou por loja. Qualquer pedido de quebra por divisão, regional ou segmento não pode ser atendido. A lógica de projeção (diária * total dias), gap de valor e ranking de percentual ficam a cargo do processamento final baseado nas colunas mes_atual, meta_mes, mes_anterior e ano_anterior retornadas.", + 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: [ + { + "nome_parametro": "loja", + coluna_vtr: "x.codigo" + } + ], + filtros: { + data_venda: { + descricao_agente: "A data base para a consulta das vendas. Caso não informada explicitamente, usar a data de hoje no formato YYYY-MM-DD.", + coluna_vtr: "args.data_venda", + tabela_rag: " " + }, + loja: { + descricao_agente: "Lista de nomes ou códigos de lojas mencionados para filtragem.", + coluna_vtr: "x.nomeempresaapp", + tabela_rag: "tb_flash_nodo" + } + } + }/*, + sql: `SELECT + ${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 ${agrupamento} + ORDER BY mes_atual DESC`*/ + } + } + }, queries: { flash: { name: "Flash de Vendas",