diff --git a/src/products/products.module.ts b/src/products/products.module.ts index 41214b5..d41d6e4 100644 --- a/src/products/products.module.ts +++ b/src/products/products.module.ts @@ -64,144 +64,145 @@ export default moduleFactory tabela_rag: "tb_flash_nodo" } } - } - }, - 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" - } - } - } + query_base: "produto_detalhe_preco_ai" }, - 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." + 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" + } + } + } }, - 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." + 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" + } + } + } }, - 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." + 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" + } + } + } }, - 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." + 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" + } + } + } }, - 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" - } - } + 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: { consulta: { @@ -666,6 +667,41 @@ export default moduleFactory }, 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", }) @@ -1493,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: { consulta: (args) => { @@ -1953,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: { consulta: (args) => { @@ -2816,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: { consulta: (args) => { @@ -3283,6 +3440,65 @@ and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1) 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*/ ` + + ` + } } } });