Compare commits
6 Commits
dc81d46278
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cd9f7b6123 | |||
| b7aed284c4 | |||
| 66ed503d5b | |||
| 3ed227c3a1 | |||
| c7345dd7f1 | |||
| e107020f60 |
@@ -48,11 +48,45 @@ export default moduleFactory
|
|||||||
"Lista de nomes ou códigos de lojas mencionados para filtragem.",
|
"Lista de nomes ou códigos de lojas mencionados para filtragem.",
|
||||||
coluna_vtr: "x.nomeempresaapp",
|
coluna_vtr: "x.nomeempresaapp",
|
||||||
tabela_rag: "lojas",
|
tabela_rag: "lojas",
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query_base: "flash_vendas_ai",
|
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: {
|
sem_assunto: {
|
||||||
descricao: "Fluxo a ser seguido quando não houver assunto definido",
|
descricao: "Fluxo a ser seguido quando não houver assunto definido",
|
||||||
prompt: {
|
prompt: {
|
||||||
@@ -94,6 +128,7 @@ export default moduleFactory
|
|||||||
table_name: (args) => {
|
table_name: (args) => {
|
||||||
return `app_dono_cliente_${args.ctx_tenant_id}_lojas`
|
return `app_dono_cliente_${args.ctx_tenant_id}_lojas`
|
||||||
},
|
},
|
||||||
|
coluna_content: "nome"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -243,6 +278,13 @@ export default moduleFactory
|
|||||||
},
|
},
|
||||||
params: ["data_venda", "agrupamento"],
|
params: ["data_venda", "agrupamento"],
|
||||||
},
|
},
|
||||||
|
flash_vendas_categoria_ai: {
|
||||||
|
name: " Flash de vendas Categoria AI",
|
||||||
|
display: {
|
||||||
|
type: "none",
|
||||||
|
},
|
||||||
|
params: ["data_venda"],
|
||||||
|
},
|
||||||
query_vazia: {
|
query_vazia: {
|
||||||
name: "Query Vazia",
|
name: "Query Vazia",
|
||||||
display: {
|
display: {
|
||||||
@@ -600,6 +642,12 @@ export default moduleFactory
|
|||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -943,6 +991,12 @@ export default moduleFactory
|
|||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
C5_mambo: {
|
C5_mambo: {
|
||||||
flash: (args) => {
|
flash: (args) => {
|
||||||
@@ -1011,6 +1065,12 @@ where 1 = 0`,
|
|||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -1291,6 +1351,109 @@ where 1 = 0`,
|
|||||||
sql: /*sql*/` select nome, id_nodo, codigo from verdemar.tb_flash_nodo where tipo_nodo = 'EMPRESA'`
|
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({
|
.withSchedules({
|
||||||
|
|||||||
@@ -9,6 +9,201 @@ export default moduleFactory
|
|||||||
label: "Consulta de Produtos",
|
label: "Consulta de Produtos",
|
||||||
icon: "search",
|
icon: "search",
|
||||||
order: 0,
|
order: 0,
|
||||||
|
ai : {
|
||||||
|
topics : {
|
||||||
|
produtos_detalhe_geral: {
|
||||||
|
descricao: "Consulta consolidada de indicadores de um produto em todas as lojas da rede. Útil para: 'Qual loja está sem estoque?', 'Qual vende mais?', 'Qual tem maior giro?', comparativos de giro e identificação de lojas sem vendas recentes.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros especializado. Sua única tarefa: extrair os parâmetros (produto e regras de tempo) para analisar o panorama de um produto em todas as lojas da rede.",
|
||||||
|
prompt_tarefa: "1. Filtros: extraia nome, EAN ou código em 'produto'. Para lojas inativas/sem venda, extraia o número de dias em 'dias_sem_venda'.\n2. Agrupamento: use 'loja' quando a análise exigir quebra por unidade (ranking de vendas, comparação de estoques).",
|
||||||
|
prompt_regras_gerais: "- 'dias_sem_venda': apenas número inteiro.\n- Use agrupamento 'loja' para separar e ordenar unidades.",
|
||||||
|
prompt_regras_contexto: "- Em continuações, resgate o produto da mensagem anterior.",
|
||||||
|
prompt_exemplos: "Ex.1: 'Qual loja vende mais Coca-Cola?' → produto='Coca-Cola', agrupamento 'loja'.\nEx.2: 'Quais lojas não venderam nos últimos 10 dias?' → dias_sem_venda=10, agrupamento 'loja'.",
|
||||||
|
prompt_outras_infos: "A query já retorna Estoque, MDV, Margem e Última Venda por loja. Ordenações e variações % são feitas depois.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [
|
||||||
|
{ nome_parametro: "loja", coluna_vtr: "pemp.nroempresa" }
|
||||||
|
],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "O código interno, código de barras (EAN) ou nome do produto.",
|
||||||
|
coluna_vtr: "args.codproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
dias_sem_venda: {
|
||||||
|
descricao_agente: "Número de dias para filtrar lojas sem registro de vendas recentes.",
|
||||||
|
coluna_vtr: "args.dias_sem_venda"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produtos_detalhe_preco: {
|
||||||
|
descricao: "Consulta o detalhamento da composição de preço e margem de um produto em uma loja específica. Útil para verificar custo vs preço e margem de lucro pontual.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros focado em formação de preços. Sua tarefa: extrair os filtros para detalhar os preços vigentes de um produto em uma unidade.",
|
||||||
|
prompt_tarefa: "1. Filtros: extraia 'produto' e 'loja'.\n2. Agrupamento: vazio.",
|
||||||
|
prompt_regras_gerais: "- Exige obrigatoriamente 'produto' e 'loja'.",
|
||||||
|
prompt_regras_contexto: "- Em continuações (ex: 'E o preço na loja Sul?'), resgate produto ou loja do histórico.",
|
||||||
|
prompt_exemplos: "Ex.: 'Qual a margem da Heineken na loja Centro?' → produto='Heineken', loja='Centro'.",
|
||||||
|
prompt_outras_infos: "A consulta cruza args.codproduto e args.nrempresa no banco.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "mgmp.seqproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa.",
|
||||||
|
coluna_vtr: "mgmp.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
query_base: "produto_detalhe_preco_ai"
|
||||||
|
},
|
||||||
|
produtos_detalhe_mdv: {
|
||||||
|
descricao: "Consulta o histórico diário de giro (MDV - Média de Venda Diária) e quantidade vendida de um produto em uma loja específica. Útil para entender a vazão do item dia a dia.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros focado no histórico de vendas e giro diário. Sua tarefa: preparar a busca pelo histórico de MDV de um produto em uma unidade.",
|
||||||
|
prompt_tarefa: "1. Filtros: extraia 'produto' e 'loja'.\n2. Agrupamento: vazio (dados virão por dia).",
|
||||||
|
prompt_regras_gerais: "- 'produto' e 'loja' são fundamentais para não sobrecarregar o banco.",
|
||||||
|
prompt_regras_contexto: "- Se a loja for omitida, busque-a no contexto.",
|
||||||
|
prompt_exemplos: "Ex.: 'Como foi a venda diária de Picanha na loja Sul?' → produto='Picanha', loja='Sul'.",
|
||||||
|
prompt_outras_infos: "A query retorna a timeline (data, quantidade vendida, estoque inicial) limitada ao produto e loja filtrados.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "mcdia.seqproduto",
|
||||||
|
tabela_rag: "map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa.",
|
||||||
|
coluna_vtr: "mcdia.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produtos_situacao_vigente: {
|
||||||
|
descricao: "Consulta o histórico de promoções e preços vigentes (situação vigente) de um produto em uma loja específica. Útil para verificar campanhas promocionais e variações de preço ofertado.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros focado no histórico de campanhas promocionais. Sua tarefa: preparar a busca pela situação vigente de preços de um produto em uma loja.",
|
||||||
|
prompt_tarefa: "1. Extraia 'produto' e 'loja'.",
|
||||||
|
prompt_regras_gerais: "- Identifique os nomes do produto e da loja.",
|
||||||
|
prompt_regras_contexto: "- Resgate filtros de turnos anteriores se a frase atual for incompleta.",
|
||||||
|
prompt_exemplos: "Ex.: 'A Brahma esteve em promoção na loja Norte?' → produto='Brahma', loja='Norte'.",
|
||||||
|
prompt_outras_infos: "Retorna o período (data início e fim) das promoções do produto na loja.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "mrl_prodempseg.seqproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa.",
|
||||||
|
coluna_vtr: "mrl_prodempseg.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produtos_custo_liquido: {
|
||||||
|
descricao: "Consulta a evolução histórica do custo líquido, entradas e saídas de um produto em uma loja específica. Útil para análise de flutuação de custo de reposição.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros focado na evolução de custos de mercadoria. Extraia o produto e a loja alvo.",
|
||||||
|
prompt_tarefa: "1. Filtros: identifique 'produto' e 'loja'.",
|
||||||
|
prompt_regras_gerais: "- Preencha rigorosamente os filtros exigidos.",
|
||||||
|
prompt_regras_contexto: "- Em 'E na loja Leste?', resgate o produto em discussão.",
|
||||||
|
prompt_exemplos: "Ex.: 'Como variou o custo do feijão na loja Centro?' → produto='feijão', loja='Centro'.",
|
||||||
|
prompt_outras_infos: "Retorna dados linha a linha por data; sem necessidade de agrupamento.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "mrl_prodempseg.seqproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa.",
|
||||||
|
coluna_vtr: "mrl_prodempseg.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produtos_estoque_disponivel: {
|
||||||
|
descricao: "Consulta o histórico diário de movimentação do estoque (entradas, saídas e saldo) de um produto em uma loja específica nos últimos 365 dias.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros focado no fluxo contínuo de estoque. Extraia o necessário para rastrear o saldo do item.",
|
||||||
|
prompt_tarefa: "1. Extraia 'produto' e 'loja'.",
|
||||||
|
prompt_regras_gerais: "- É vital identificar a loja correta.",
|
||||||
|
prompt_regras_contexto: "- Considere o histórico; o usuário pode analisar várias lojas seguidamente sobre o mesmo produto.",
|
||||||
|
prompt_exemplos: "Ex.: 'Movimentação do estoque de Fralda Turma da Mônica na unidade Brooklin.' → produto='Fralda Turma da Mônica', loja='Brooklin'.",
|
||||||
|
prompt_outras_infos: "Timeline do estoque, cruzando entradas e saídas diárias do produto na loja escolhida.",
|
||||||
|
prompt_saida: "Responda com uma análise dos dados recebidos conforme a pergunta do usuário, de forma objetiva e direta, apenas com as informações solicitadas."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "x.seqproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa.",
|
||||||
|
coluna_vtr: "x.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_estoque_transito: {
|
||||||
|
descricao: "Consulta detalhes de notas fiscais e mercadorias em trânsito de um produto para uma loja específica. Útil para rastrear entregas pendentes, identificar fornecedores e verificar quantidades e valores de produtos a caminho.",
|
||||||
|
prompt: {
|
||||||
|
prompt_persona: "Você é um Extrator de Filtros de Logística e Recebimento. Sua tarefa: extrair os filtros para rastrear o estoque em trânsito (notas fiscais emitidas) de um item para uma loja.",
|
||||||
|
prompt_tarefa: "1. Filtros: identifique 'produto' e 'loja' (empresa) de destino.\n2. Agrupamento: vazio (dados retornam por nota fiscal).",
|
||||||
|
prompt_regras_gerais: "- Obrigatório preencher os filtros de produto e loja para execução otimizada.",
|
||||||
|
prompt_regras_contexto: "- Resgate filtros de turnos anteriores. Ex: em 'E na loja Sul, tem algo chegando?', herde o produto do histórico.",
|
||||||
|
prompt_exemplos: "Ex.: 'Tem nota de Arroz Tio João chegando na loja Norte?' → produto='Arroz Tio João', loja='Norte'.",
|
||||||
|
prompt_outras_infos: "Retorna as notas fiscais do último ano com fornecedor, datas de emissão/entrada e quantidade em trânsito do produto para a loja.",
|
||||||
|
prompt_saida: "Responda ÚNICA e EXCLUSIVAMENTE com um objeto JSON válido, aderente ao schema. Sem texto extra e sem markdown — apenas o objeto puro."
|
||||||
|
},
|
||||||
|
json_params_saida: {
|
||||||
|
agrupamentos: [],
|
||||||
|
filtros: {
|
||||||
|
produto: {
|
||||||
|
descricao_agente: "Nome, EAN ou código do produto.",
|
||||||
|
coluna_vtr: "b.seqproduto",
|
||||||
|
tabela_rag: "consinco.map_produto"
|
||||||
|
},
|
||||||
|
loja: {
|
||||||
|
descricao_agente: "Nome ou código da loja/empresa de destino.",
|
||||||
|
coluna_vtr: "a.nroempresa",
|
||||||
|
tabela_rag: "tb_flash_nodo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
queries: {
|
queries: {
|
||||||
consulta: {
|
consulta: {
|
||||||
name: "Consulta de Produtos",
|
name: "Consulta de Produtos",
|
||||||
@@ -472,6 +667,41 @@ export default moduleFactory
|
|||||||
},
|
},
|
||||||
params: ["nrempresa", "codproduto"],
|
params: ["nrempresa", "codproduto"],
|
||||||
},
|
},
|
||||||
|
produto_detalhe_preco_ai: {
|
||||||
|
name: "Detalhe Preço AI",
|
||||||
|
display: {
|
||||||
|
type: "none"
|
||||||
|
},
|
||||||
|
params: ["data"]
|
||||||
|
},
|
||||||
|
produto_detalhe_mdv_ai: {
|
||||||
|
name: "Detalhe MDV AI",
|
||||||
|
display: {
|
||||||
|
type: "none"
|
||||||
|
},
|
||||||
|
params: ["data"]
|
||||||
|
},
|
||||||
|
produto_detalhe_estoque_ai: {
|
||||||
|
name: "Detalhe Estoque AI",
|
||||||
|
display: {
|
||||||
|
type: "none"
|
||||||
|
},
|
||||||
|
params: ["data"]
|
||||||
|
},
|
||||||
|
produto_detalhe_custo_ai: {
|
||||||
|
name: "Detalhe Custo AI",
|
||||||
|
display: {
|
||||||
|
type: "none"
|
||||||
|
},
|
||||||
|
params: ["data"]
|
||||||
|
},
|
||||||
|
produto_detalhe_margem_ai: {
|
||||||
|
name: "Detalhe Margem AI",
|
||||||
|
display: {
|
||||||
|
type: "none"
|
||||||
|
},
|
||||||
|
params: ["data"]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
entrypoint: "consulta",
|
entrypoint: "consulta",
|
||||||
})
|
})
|
||||||
@@ -1299,6 +1529,57 @@ and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1)
|
|||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
produto_detalhe_preco_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
ora_hash(mgmp.SEQPRODUTO || mgmp.NROEMPRESA || mgmp.QTDEMBALAGEM || mgmp.NROSEGMENTO) chave,
|
||||||
|
mgmp.SEQPRODUTO,
|
||||||
|
mgmp.NROEMPRESA,
|
||||||
|
mgmp.NROSEGMENTO,
|
||||||
|
mgmp.QTDEMBALAGEM || ' ' || mgmp.EMBVENDA embalagem,
|
||||||
|
mgmp.PRECOVALIDNORMAL preco_embalagem,
|
||||||
|
mgmp.PRECOVALIDNORMAL / mgmp.QTDEMBALAGEM preco_unidade,
|
||||||
|
trunc(mgmp.MGMPRECOVALIDO, 2) margem
|
||||||
|
FROM consinco.maxv_mgmbaseprodseg mgmp
|
||||||
|
INNER JOIN consinco.max_empresa me
|
||||||
|
ON me.nroempresa = mgmp.NROEMPRESA
|
||||||
|
AND me.status = 'A'
|
||||||
|
AND me.dtainiciomovestoque <= trunc(sysdate) - 1
|
||||||
|
WHERE 1=1
|
||||||
|
AND mgmp.STATUSVENDA = 'A'
|
||||||
|
--FILTROS--
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_custo_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_margem_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_mdv_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_estoque_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
C5_mambo: {
|
C5_mambo: {
|
||||||
consulta: (args) => {
|
consulta: (args) => {
|
||||||
@@ -1759,6 +2040,41 @@ and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1)
|
|||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
produto_detalhe_preco_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_estoque_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_custo_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_margem_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_mdv_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
C5_big: {
|
C5_big: {
|
||||||
consulta: (args) => {
|
consulta: (args) => {
|
||||||
@@ -2622,6 +2938,41 @@ and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1)
|
|||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
produto_detalhe_preco_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_custo_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_margem_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_mdv_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_estoque_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Verdemar: {
|
Verdemar: {
|
||||||
consulta: (args) => {
|
consulta: (args) => {
|
||||||
@@ -3089,6 +3440,65 @@ and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1)
|
|||||||
ORDER BY e.dataemissao ASC, e.numeronota, e.serienota
|
ORDER BY e.dataemissao ASC, e.numeronota, e.serienota
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_preco_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
CAST(p.codigo AS VARCHAR2(15)) || CAST(l.codigo AS VARCHAR2(10)) ||
|
||||||
|
CAST(ean.quantidade AS VARCHAR2(10)) || '0' AS chave,
|
||||||
|
p.codigo AS SEQPRODUTO,
|
||||||
|
l.codigo AS NROEMPRESA,
|
||||||
|
0 AS NROSEGMENTO,
|
||||||
|
ean.quantidade || ' ' || ean.embalagem AS embalagem,
|
||||||
|
pp.precovenda AS preco_embalagem,
|
||||||
|
pp.precovenda / GREATEST(ean.quantidade, 1) AS preco_unidade,
|
||||||
|
ROUND(pp.sugestao, 2) AS margem
|
||||||
|
|
||||||
|
FROM verdemar.produtos p
|
||||||
|
INNER JOIN verdemar.produtos_loja pl
|
||||||
|
ON pl.codigo = p.codigo
|
||||||
|
INNER JOIN verdemar.loja l
|
||||||
|
ON l.codigo = pl.loja
|
||||||
|
INNER JOIN verdemar.produtos_precos pp
|
||||||
|
ON pp.codigo = p.codigo
|
||||||
|
AND pp.loja = l.codigo
|
||||||
|
INNER JOIN verdemar.produtos_ean ean
|
||||||
|
ON ean.codigo = p.codigo
|
||||||
|
AND ean.vendapadrao = 'S'
|
||||||
|
WHERE 1=1
|
||||||
|
AND p.inativo = 'N'
|
||||||
|
--FILTROS--
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_custo_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_margem_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_mdv_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
produto_detalhe_estoque_ai: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user