Compare commits
63 Commits
ad86611e9f
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c28a8fc40a | |||
| cd9f7b6123 | |||
| b7aed284c4 | |||
| 66ed503d5b | |||
| 3ed227c3a1 | |||
| c7345dd7f1 | |||
| e107020f60 | |||
| dc81d46278 | |||
| 4165185383 | |||
| 49917ab60e | |||
| 7d215910bc | |||
| a3a20c93de | |||
| 8d11ef3365 | |||
| 311a5e8815 | |||
| 2ce6cb0807 | |||
| 01dd72adbb | |||
| 43a92aa74e | |||
| 088a81fe6b | |||
| 4786c08537 | |||
| 437ee115f7 | |||
| c41dcc39a2 | |||
| ecf37c8402 | |||
| d2673d0c8a | |||
| dc1aa9417e | |||
| d8fe335282 | |||
| a36e6bbae2 | |||
| aa308dfb95 | |||
| 9abab1d722 | |||
| dd4b1d4dac | |||
| 728b1f0870 | |||
| 471bd15fdf | |||
| 286e10c9f3 | |||
| 62789936f8 | |||
| 9a05e81e1e | |||
| 32d50727aa | |||
| b19e261a35 | |||
| 079df5da8a | |||
| 6b3284979f | |||
| dd36e000ce | |||
| c0c54543a3 | |||
| cb155585cd | |||
| 4b76bddf5a | |||
| 856556a595 | |||
| 63e361720e | |||
| 73d303ac8c | |||
| 3ecdaedda4 | |||
| 44e44e0bb9 | |||
| f406b6eca1 | |||
| 4af4233d60 | |||
| 0a4bc7bd32 | |||
| 0955861fdc | |||
| 75a7faee6c | |||
| 8a9c439829 | |||
| 7992c8d3c7 | |||
| 79d510e0ca | |||
| 818715f01b | |||
| 0081d4b7d4 | |||
| 5fc50f7341 | |||
| a7cf0fb023 | |||
| eeacc8dad3 | |||
| 8753baa1ce | |||
| ce871f5f20 | |||
| f1aee403ec |
Generated
+4
-4
@@ -9,16 +9,16 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@davinti/jeff": "^1.0.17"
|
"@davinti/jeff": "^1.0.18"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tsx": "^4.21.0"
|
"tsx": "^4.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@davinti/jeff": {
|
"node_modules/@davinti/jeff": {
|
||||||
"version": "1.0.17",
|
"version": "1.0.18",
|
||||||
"resolved": "https://git.davinti.com.br/api/packages/davinTI/npm/%40davinti%2Fjeff/-/1.0.17/jeff-1.0.17.tgz",
|
"resolved": "https://git.davinti.com.br/api/packages/davinTI/npm/%40davinti%2Fjeff/-/1.0.18/jeff-1.0.18.tgz",
|
||||||
"integrity": "sha512-xrqCCy4XI6BBgW2ORUaHwaBF1viPdbSYE0a73SGBd5274QSmSKbOhU1cFtP4DPTmP0ajG+/ie5Y65rMMaOMXGA==",
|
"integrity": "sha512-xRUhKQ4hQ8ojouQ1S/hBZ/pZiNYhyTHDCw71EHXd06SVCRAIwqLL5K+nbTGsPrlG+dF42tJshp+TU1V0Y/ULGA==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/glob": "^8.1.0",
|
"@types/glob": "^8.1.0",
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"description": "",
|
"description": "",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@davinti/jeff": "^1.0.17"
|
"@davinti/jeff": "^1.0.18"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tsx": "^4.21.0"
|
"tsx": "^4.21.0"
|
||||||
|
|||||||
+389
-14
@@ -47,12 +47,46 @@ export default moduleFactory
|
|||||||
descricao_agente:
|
descricao_agente:
|
||||||
"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: "tb_flash_nodo",
|
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: {
|
||||||
@@ -88,6 +122,15 @@ export default moduleFactory
|
|||||||
query_base: "query_vazia"
|
query_base: "query_vazia"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
tabelas_rag : {
|
||||||
|
lojas: {
|
||||||
|
query: "query_lojas",
|
||||||
|
table_name: (args) => {
|
||||||
|
return `app_dono_cliente_${args.ctx_tenant_id}_lojas`
|
||||||
|
},
|
||||||
|
coluna_content: "nome"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
queries: {
|
queries: {
|
||||||
flash: {
|
flash: {
|
||||||
@@ -235,12 +278,26 @@ 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: {
|
||||||
type: "none",
|
type: "none",
|
||||||
},
|
},
|
||||||
params: [],
|
params: [],
|
||||||
|
},
|
||||||
|
query_lojas: {
|
||||||
|
name: " Query Lojas",
|
||||||
|
display: {
|
||||||
|
type: "none",
|
||||||
|
},
|
||||||
|
params: [],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
entrypoint: "flash" as "flash" | "flash_categorias",
|
entrypoint: "flash" as "flash" | "flash_categorias",
|
||||||
@@ -579,6 +636,18 @@ export default moduleFactory
|
|||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
query_lojas: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -916,7 +985,19 @@ export default moduleFactory
|
|||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
query_lojas: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
C5_mambo: {
|
C5_mambo: {
|
||||||
flash: (args) => {
|
flash: (args) => {
|
||||||
return {
|
return {
|
||||||
@@ -978,6 +1059,18 @@ where 1 = 0`,
|
|||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
query_lojas: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
flash_vendas_categoria_ai: (args)=> {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/``
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -996,7 +1089,6 @@ where 1 = 0`,
|
|||||||
FROM DUAL
|
FROM DUAL
|
||||||
),
|
),
|
||||||
Vendas AS (
|
Vendas AS (
|
||||||
-- Venda diaria por loja (lê só os nos EMPRESA do resumo, que já vem com rollup)
|
|
||||||
SELECT n.cod_empresa AS loja,
|
SELECT n.cod_empresa AS loja,
|
||||||
r.data_referencia AS data,
|
r.data_referencia AS data,
|
||||||
r.valor_venda AS venda,
|
r.valor_venda AS venda,
|
||||||
@@ -1006,12 +1098,12 @@ where 1 = 0`,
|
|||||||
CROSS JOIN Parametros p
|
CROSS JOIN Parametros p
|
||||||
WHERE n.tipo_nodo = 'EMPRESA'
|
WHERE n.tipo_nodo = 'EMPRESA'
|
||||||
AND n.ativo = 'S'
|
AND n.ativo = 'S'
|
||||||
|
AND n.cod_empresa IN (${args.ctx_user_companies_for_module})
|
||||||
AND ( r.data_referencia BETWEEN p.dt_inicio_mes AND p.dt_ref
|
AND ( r.data_referencia BETWEEN p.dt_inicio_mes AND p.dt_ref
|
||||||
OR r.data_referencia BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant
|
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)
|
OR r.data_referencia BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant)
|
||||||
),
|
),
|
||||||
Metas AS (
|
Metas AS (
|
||||||
-- Metas em tempo real, igual antes
|
|
||||||
SELECT FNC_CODIGOLOJA(m.loja_ajustada) AS loja,
|
SELECT FNC_CODIGOLOJA(m.loja_ajustada) AS loja,
|
||||||
m.data,
|
m.data,
|
||||||
0 AS venda,
|
0 AS venda,
|
||||||
@@ -1019,6 +1111,7 @@ where 1 = 0`,
|
|||||||
FROM VERDEMAR.ORCADO_METAS_IMPORT m
|
FROM VERDEMAR.ORCADO_METAS_IMPORT m
|
||||||
CROSS JOIN Parametros p
|
CROSS JOIN Parametros p
|
||||||
WHERE m.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref)
|
WHERE m.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref)
|
||||||
|
AND FNC_CODIGOLOJA(m.loja_ajustada) IN (${args.ctx_user_companies_for_module})
|
||||||
),
|
),
|
||||||
DadosUnificados AS (
|
DadosUnificados AS (
|
||||||
SELECT * FROM Vendas
|
SELECT * FROM Vendas
|
||||||
@@ -1031,24 +1124,30 @@ where 1 = 0`,
|
|||||||
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND p.dt_ref THEN d.venda ELSE 0 END) AS v_mes,
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND p.dt_ref THEN d.venda ELSE 0 END) AS v_mes,
|
||||||
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref) THEN d.meta ELSE 0 END) AS m_mes,
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref) THEN d.meta ELSE 0 END) AS m_mes,
|
||||||
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN d.venda ELSE 0 END) AS v_mes_ant,
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN d.venda ELSE 0 END) AS v_mes_ant,
|
||||||
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN d.venda ELSE 0 END) AS v_ano_ant
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN d.meta ELSE 0 END) AS m_mes_ant,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN d.venda ELSE 0 END) AS v_ano_ant,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN d.meta ELSE 0 END) AS m_ano_ant
|
||||||
FROM DadosUnificados d
|
FROM DadosUnificados d
|
||||||
CROSS JOIN Parametros p
|
CROSS JOIN Parametros p
|
||||||
GROUP BY d.loja
|
GROUP BY d.loja
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
'Lojas' AS canalapp,
|
'Lojas' AS canalapp,
|
||||||
FNC_NUMEROLOJA(loja) AS cod_empresa,
|
(loja) AS cod_empresa,
|
||||||
FNC_NOMEPESSOAS(loja) AS nomeempresaapp,
|
FNC_NOMEPESSOAS(loja) AS nomeempresaapp,
|
||||||
GROUPING(loja) AS is_total,
|
GROUPING(loja) AS is_total,
|
||||||
-- Calculos
|
|
||||||
SUM(m_mes) AS meta_mes,
|
SUM(m_mes) AS meta_mes,
|
||||||
SUM(v_mes) AS mes_atual,
|
SUM(v_mes) AS mes_atual,
|
||||||
SUM(v_mes) - SUM(m_mes) AS dif_mes_atual,
|
SUM(v_mes) - SUM(m_mes) AS dif_mes_atual,
|
||||||
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(m_mes), 0)) * 100 - 100, 0), 2) AS variacao_atual,
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(m_mes), 0)) * 100 - 100, 0), 2) AS variacao_atual,
|
||||||
|
|
||||||
|
SUM(m_mes_ant) AS meta_mes_anterior,
|
||||||
SUM(v_mes_ant) AS mes_anterior,
|
SUM(v_mes_ant) AS mes_anterior,
|
||||||
SUM(v_mes) - SUM(v_mes_ant) AS dif_mes_anterior,
|
SUM(v_mes) - SUM(v_mes_ant) AS dif_mes_anterior,
|
||||||
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_mes_ant), 0)) * 100 - 100, 0), 2) AS variacao_mes_anterior,
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_mes_ant), 0)) * 100 - 100, 0), 2) AS variacao_mes_anterior,
|
||||||
|
|
||||||
|
SUM(m_ano_ant) AS meta_ano_anterior,
|
||||||
SUM(v_ano_ant) AS ano_anterior,
|
SUM(v_ano_ant) AS ano_anterior,
|
||||||
SUM(v_mes) - SUM(v_ano_ant) AS dif_ano_anterior,
|
SUM(v_mes) - SUM(v_ano_ant) AS dif_ano_anterior,
|
||||||
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_ano_ant), 0)) * 100 - 100, 0), 2) AS variacao_ano_anterior
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_ano_ant), 0)) * 100 - 100, 0), 2) AS variacao_ano_anterior
|
||||||
@@ -1059,19 +1158,295 @@ where 1 = 0`,
|
|||||||
},
|
},
|
||||||
flash_categorias: (args) => {
|
flash_categorias: (args) => {
|
||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
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
|
||||||
|
`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
flash_vendas_ai: (args) => {
|
flash_vendas_ai: (args) => {
|
||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/`
|
||||||
|
SELECT * FROM (
|
||||||
|
WITH Parametros AS (
|
||||||
|
SELECT
|
||||||
|
TO_DATE(${args.data_venda}, 'YYYY-MM-DD') AS dt_ref,
|
||||||
|
TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AS dt_inicio_mes,
|
||||||
|
ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1) AS dt_inicio_mes_ant,
|
||||||
|
ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1) AS dt_fim_mes_ant,
|
||||||
|
ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12) AS dt_inicio_ano_ant,
|
||||||
|
ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12) AS dt_fim_ano_ant
|
||||||
|
FROM DUAL
|
||||||
|
),
|
||||||
|
Vendas AS (
|
||||||
|
SELECT n.cod_empresa AS loja,
|
||||||
|
r.data_referencia AS data,
|
||||||
|
r.valor_venda AS venda,
|
||||||
|
0 AS meta
|
||||||
|
FROM VERDEMAR.TB_FLASH_NODO_RESUMO_VENDA r
|
||||||
|
JOIN VERDEMAR.TB_FLASH_NODO n ON n.id_nodo = r.id_nodo
|
||||||
|
CROSS JOIN Parametros p
|
||||||
|
WHERE n.tipo_nodo = 'EMPRESA'
|
||||||
|
AND n.ativo = 'S'
|
||||||
|
AND ( r.data_referencia BETWEEN p.dt_inicio_mes AND p.dt_ref
|
||||||
|
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)
|
||||||
|
),
|
||||||
|
Metas AS (
|
||||||
|
SELECT FNC_CODIGOLOJA(m.loja_ajustada) AS loja,
|
||||||
|
m.data,
|
||||||
|
0 AS venda,
|
||||||
|
m.meta_diaria AS meta
|
||||||
|
FROM VERDEMAR.ORCADO_METAS_IMPORT m
|
||||||
|
CROSS JOIN Parametros p
|
||||||
|
WHERE m.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref)
|
||||||
|
),
|
||||||
|
DadosUnificados AS (
|
||||||
|
SELECT * FROM Vendas
|
||||||
|
UNION ALL
|
||||||
|
SELECT * FROM Metas
|
||||||
|
),
|
||||||
|
Agrupado AS (
|
||||||
|
SELECT
|
||||||
|
d.loja,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND p.dt_ref THEN d.venda ELSE 0 END) AS v_mes,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes AND LAST_DAY(p.dt_ref) THEN d.meta ELSE 0 END) AS m_mes,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN d.venda ELSE 0 END) AS v_mes_ant,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant THEN d.meta ELSE 0 END) AS m_mes_ant,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN d.venda ELSE 0 END) AS v_ano_ant,
|
||||||
|
SUM(CASE WHEN d.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant THEN d.meta ELSE 0 END) AS m_ano_ant
|
||||||
|
FROM DadosUnificados d
|
||||||
|
CROSS JOIN Parametros p
|
||||||
|
GROUP BY d.loja
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
'Lojas' AS canalapp,
|
||||||
|
(loja) AS cod_empresa,
|
||||||
|
FNC_NOMEPESSOAS(loja) AS nomeempresaapp,
|
||||||
|
GROUPING(loja) AS is_total,
|
||||||
|
|
||||||
|
SUM(m_mes) AS meta_mes,
|
||||||
|
SUM(v_mes) AS mes_atual,
|
||||||
|
SUM(v_mes) - SUM(m_mes) AS dif_mes_atual,
|
||||||
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(m_mes), 0)) * 100 - 100, 0), 2) AS variacao_atual,
|
||||||
|
|
||||||
|
SUM(m_mes_ant) AS meta_mes_anterior,
|
||||||
|
SUM(v_mes_ant) AS mes_anterior,
|
||||||
|
SUM(v_mes) - SUM(v_mes_ant) AS dif_mes_anterior,
|
||||||
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_mes_ant), 0)) * 100 - 100, 0), 2) AS variacao_mes_anterior,
|
||||||
|
|
||||||
|
SUM(m_ano_ant) AS meta_ano_anterior,
|
||||||
|
SUM(v_ano_ant) AS ano_anterior,
|
||||||
|
SUM(v_mes) - SUM(v_ano_ant) AS dif_ano_anterior,
|
||||||
|
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_ano_ant), 0)) * 100 - 100, 0), 2) AS variacao_ano_anterior
|
||||||
|
FROM Agrupado
|
||||||
|
GROUP BY GROUPING SETS ((loja), ())
|
||||||
|
) x
|
||||||
|
WHERE 1=1
|
||||||
|
--FILTROS--
|
||||||
|
`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
query_vazia : (args) => {
|
query_vazia : (args) => {
|
||||||
return {
|
return {
|
||||||
sql: /*sql*/``
|
sql: /*sql*/``
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
query_lojas: (args)=> {
|
||||||
|
return {
|
||||||
|
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 params AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(TO_DATE(NULLIF('{{DATA_VENDA}}', ${args.data_venda}), 'YYYY-MM-DD'), TRUNC(SYSDATE)) AS data_venda,
|
||||||
|
NULLIF('{{CATEGORIA_PAI}}', null) AS codigo_categoria_pai
|
||||||
|
FROM dual
|
||||||
|
),
|
||||||
|
nodo_pai_param AS (
|
||||||
|
SELECT n.*
|
||||||
|
FROM tb_flash_nodo n
|
||||||
|
CROSS JOIN params p
|
||||||
|
WHERE p.codigo_categoria_pai IS NOT NULL
|
||||||
|
AND n.tipo_nodo = 'CATEGORIA'
|
||||||
|
AND n.codigo = p.codigo_categoria_pai
|
||||||
|
AND n.cod_empresa IN (${args.ctx_user_companies_for_module})
|
||||||
|
),
|
||||||
|
nodos_filtrados AS (
|
||||||
|
SELECT filho.*
|
||||||
|
FROM tb_flash_nodo filho
|
||||||
|
JOIN nodo_pai_param pai_param
|
||||||
|
ON pai_param.id_nodo = filho.id_nodo_pai
|
||||||
|
WHERE filho.tipo_nodo IN ('CATEGORIA', 'PRODUTO')
|
||||||
|
AND filho.ativo = 'S'
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT n.*
|
||||||
|
FROM tb_flash_nodo n
|
||||||
|
CROSS JOIN params p
|
||||||
|
WHERE p.codigo_categoria_pai IS NULL
|
||||||
|
AND n.tipo_nodo = 'CATEGORIA'
|
||||||
|
AND n.ativo = 'S'
|
||||||
|
AND n.cod_empresa IN (${args.ctx_user_companies_for_module})
|
||||||
|
AND n.nivel = (
|
||||||
|
SELECT MIN(n2.nivel)
|
||||||
|
FROM tb_flash_nodo n2
|
||||||
|
WHERE n2.tipo_nodo = 'CATEGORIA'
|
||||||
|
AND n2.ativo = 'S'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
:agrupamento AS KEY_FIELD,
|
||||||
|
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) * 1.02 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 ELSE 0 END) - SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) * 1.02 AS dif_mes_atual,
|
||||||
|
CASE
|
||||||
|
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) * 1.02 = 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_venda ELSE 0 END) * 1.02)) * 100) - 100, 2)
|
||||||
|
END AS variacao_atual,
|
||||||
|
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) * 1.02 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_venda ELSE 0 END) * 1.02 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
|
||||||
|
cat.codigo AS codigo,
|
||||||
|
cat.nome AS nomeempresaapp,
|
||||||
|
cat.codigo || ' - ' || cat.nome AS categoria_formatada,
|
||||||
|
cat.tipo_nodo,
|
||||||
|
cat.cod_empresa,
|
||||||
|
r.valor_meta_efetiva,
|
||||||
|
r.valor_venda,
|
||||||
|
CASE
|
||||||
|
WHEN r.data_referencia BETWEEN TRUNC(p.data_venda, 'MM') AND p.data_venda THEN 'ATUAL'
|
||||||
|
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -1) AND ADD_MONTHS(p.data_venda, -1) THEN 'MES_ANTERIOR'
|
||||||
|
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -12) AND ADD_MONTHS(p.data_venda, -12) THEN 'ANO_ANTERIOR'
|
||||||
|
END AS periodo
|
||||||
|
FROM tb_flash_nodo_resumo_venda r
|
||||||
|
JOIN nodos_filtrados cat ON cat.id_nodo = r.id_nodo
|
||||||
|
CROSS JOIN params p
|
||||||
|
WHERE (
|
||||||
|
r.data_referencia BETWEEN TRUNC(p.data_venda, 'MM') AND p.data_venda
|
||||||
|
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -1) AND ADD_MONTHS(p.data_venda, -1)
|
||||||
|
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -12) AND ADD_MONTHS(p.data_venda, -12)
|
||||||
|
)
|
||||||
|
) x
|
||||||
|
WHERE 1=1
|
||||||
|
--FILTROS--
|
||||||
|
GROUP BY :agrupamento
|
||||||
|
ORDER BY mes_atual DESC
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.withSchedules({
|
.withSchedules({
|
||||||
@@ -1128,10 +1503,10 @@ where 1 = 0`,
|
|||||||
{
|
{
|
||||||
name: 'Procedure que atualiza os dados do flash',
|
name: 'Procedure que atualiza os dados do flash',
|
||||||
command: /*sql*/ `BEGIN
|
command: /*sql*/ `BEGIN
|
||||||
PRC_FLASH_ATUALIZA_VENDA(
|
/* PRC_FLASH_ATUALIZA_VENDA(
|
||||||
p_data_inicial => TRUNC(SYSDATE) -1,
|
p_data_inicial => TRUNC(SYSDATE),
|
||||||
p_data_final => TRUNC(SYSDATE)
|
p_data_final => TRUNC(SYSDATE)
|
||||||
);
|
);*/
|
||||||
END;`,
|
END;`,
|
||||||
cron: "0 */2 * * *",
|
cron: "0 */2 * * *",
|
||||||
timeout_seconds: 2400,
|
timeout_seconds: 2400,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createModuleFactory } from "@davinti/jeff";
|
import { createModuleFactory } from "@davinti/jeff";
|
||||||
|
|
||||||
const moduleFactory = createModuleFactory(["C5", "C5_mambo", "C5_big"]);
|
const moduleFactory = createModuleFactory(["C5", "C5_mambo", "C5_big", "Verdemar"]);
|
||||||
|
|
||||||
export default moduleFactory
|
export default moduleFactory
|
||||||
.createModule({
|
.createModule({
|
||||||
@@ -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,5 +2938,567 @@ 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) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
CAST(p.codigo AS NUMBER(15)) AS code,
|
||||||
|
p.nome AS title
|
||||||
|
FROM produtos p
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND p.inativo = 'N'
|
||||||
|
AND (
|
||||||
|
(
|
||||||
|
${args.filtro} IS NOT NULL
|
||||||
|
AND (
|
||||||
|
CAST(p.codigo AS VARCHAR2(15)) LIKE '%' || ${args.filtro} || '%'
|
||||||
|
OR UPPER(p.nome) LIKE UPPER('%' || ${args.filtro} || '%')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
OR (
|
||||||
|
${args.ean} IS NOT NULL
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM produtos_ean ean
|
||||||
|
WHERE ean.CODIGO = p.codigo
|
||||||
|
AND ean.CODBARRA = ${args.ean}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
OR (
|
||||||
|
${args.filtro} IS NULL
|
||||||
|
AND ${args.ean} IS NULL
|
||||||
|
)
|
||||||
|
)
|
||||||
|
ORDER BY p.nome
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
WITH CTE_UltimaEntrada AS (
|
||||||
|
SELECT
|
||||||
|
/*+ MATERIALIZE */
|
||||||
|
eit.codigo AS produto_codigo,
|
||||||
|
ent.loja AS loja_codigo,
|
||||||
|
ean2.quantidade AS quantidadecompra,
|
||||||
|
ent.dataentrada AS dataultimaentrada,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
|
||||||
|
PARTITION BY eit.codigo,
|
||||||
|
ent.loja
|
||||||
|
ORDER BY
|
||||||
|
ent.dataentrada DESC,
|
||||||
|
ent.chave DESC
|
||||||
|
) AS rn
|
||||||
|
FROM
|
||||||
|
verdemar.entradas ent
|
||||||
|
INNER JOIN verdemar.entradas_itens eit ON
|
||||||
|
ent.chave = eit.chaveentrada
|
||||||
|
INNER JOIN verdemar.operacoes_entradas op ON
|
||||||
|
ent.operacao = op.codigo
|
||||||
|
INNER JOIN verdemar.produtos_ean ean2 ON
|
||||||
|
eit.embalagem = ean2.chave
|
||||||
|
WHERE
|
||||||
|
ent.status = 'S'
|
||||||
|
AND op.atualizacusto = 'S'
|
||||||
|
AND op.tiponota NOT IN ('B', 'T', 'L')
|
||||||
|
AND ent.dataentrada <= TRUNC(SYSDATE)
|
||||||
|
AND eit.quantidade * ean2.quantidade > NVL(eit.quantidadedevolvida,
|
||||||
|
0)
|
||||||
|
AND eit.codigo = ${args.codproduto}
|
||||||
|
AND ent.loja IN (${args.ctx_user_companies_for_module})
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
l.codigo AS idempresa,
|
||||||
|
l.codigo AS nroempresa,
|
||||||
|
FNC_NOMEPESSOAS(l.codigo) AS nomeempresa,
|
||||||
|
cat.nome AS categoria,
|
||||||
|
ult_ent.dataultimaentrada AS dataultimaentrada,
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
MAX(pm.data)
|
||||||
|
FROM
|
||||||
|
verdemar.produtos_movimento pm
|
||||||
|
WHERE
|
||||||
|
pm.codigo = p.codigo
|
||||||
|
AND pm.loja = l.codigo
|
||||||
|
AND pm.data >= TRUNC(SYSDATE) - 50
|
||||||
|
-- limita o scan
|
||||||
|
|
||||||
|
) AS dataultimavenda,
|
||||||
|
NULL AS precoatacado,
|
||||||
|
pp.precovenda AS precovarejo,
|
||||||
|
COALESCE(prom.precopromocao,
|
||||||
|
0) AS precopromoc,
|
||||||
|
pp.precovenda AS preconormal,
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
pf.precofidelidade
|
||||||
|
FROM
|
||||||
|
verdemar.produtos_fidelidade pf
|
||||||
|
WHERE
|
||||||
|
pf.codigo = p.codigo
|
||||||
|
AND TRUNC(SYSDATE) BETWEEN pf.datainicial AND pf.datafinal
|
||||||
|
AND (pf.codigo_tipo = 0
|
||||||
|
OR pf.codigo_tipo = 2)
|
||||||
|
AND pf.loja = l.codigo
|
||||||
|
AND ROWNUM = 1
|
||||||
|
|
||||||
|
) AS precomeuMambo,
|
||||||
|
0 AS vlrprecovenctoprox,
|
||||||
|
pp.custoliquido AS custoliquido,
|
||||||
|
pp.sugestao AS margem,
|
||||||
|
0 AS margematacado,
|
||||||
|
pp.lucro AS margemnormal,
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
api.margemprecopromocao_clubevm
|
||||||
|
FROM
|
||||||
|
verdemar.produtos_fidelidade pf
|
||||||
|
INNER JOIN verdemar.autorizacao_promocao_itens api
|
||||||
|
|
||||||
|
ON
|
||||||
|
api.codigo = pf.codigo
|
||||||
|
AND api.chave = pf.chaveorigem
|
||||||
|
WHERE
|
||||||
|
pf.codigo = p.codigo
|
||||||
|
AND api.datafinal >= SYSDATE
|
||||||
|
AND api.datainicial <= SYSDATE
|
||||||
|
AND pf.loja = l.codigo
|
||||||
|
AND ROWNUM = 1
|
||||||
|
|
||||||
|
) AS margemmeuMambo,
|
||||||
|
subg.sugestao AS margemlucrodivisao,
|
||||||
|
est.quantidade AS estoqueDisponivel,
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
est2.quantidade
|
||||||
|
FROM
|
||||||
|
verdemar.produtos_estoque est2
|
||||||
|
INNER JOIN verdemar.loja l2 ON
|
||||||
|
l2.codigo = est2.loja
|
||||||
|
WHERE
|
||||||
|
est2.codigo = p.codigo
|
||||||
|
AND l2.lojanota = l.codigo
|
||||||
|
AND l2.statusloja = 3
|
||||||
|
AND ROWNUM = 1
|
||||||
|
|
||||||
|
) AS estoquetroca,
|
||||||
|
FNC_QTD_EMTRANSITO(p.codigo,
|
||||||
|
l.codigo) AS estoquetransito,
|
||||||
|
0 AS estoquefuturo,
|
||||||
|
0 AS estoquereservado,
|
||||||
|
0 AS reserva,
|
||||||
|
pew.estoque AS estoquedisponivelcd,
|
||||||
|
0 AS estoquefuturocd,
|
||||||
|
pvm.mediasempromocao AS mdv,
|
||||||
|
pvm.mediacompromocao AS mdvpromoc,
|
||||||
|
pvm.diasestoque AS ddv,
|
||||||
|
NULL AS ddvminimo,
|
||||||
|
NULL AS ddvmaximo,
|
||||||
|
NULL AS dtavalidade,
|
||||||
|
p.numerodiasvalidade AS validadedias,
|
||||||
|
NULL AS classeabastecimento,
|
||||||
|
p.tipoabastecimento AS formaabastecimento,
|
||||||
|
ean.embalagem AS descricaoembalagem,
|
||||||
|
ean.quantidade AS quantidadeembalagem,
|
||||||
|
ult_ent.quantidadecompra AS quantidadecompra,
|
||||||
|
0 AS qtdeatacado,
|
||||||
|
CASE
|
||||||
|
WHEN COALESCE(prom.precopromocao,
|
||||||
|
0) > 0 THEN 'PROMOCAO'
|
||||||
|
ELSE 'NORMAL'
|
||||||
|
END AS situacao,
|
||||||
|
CASE
|
||||||
|
WHEN p.inativo = 'N' THEN 'A'
|
||||||
|
ELSE 'I'
|
||||||
|
END AS statusvenda,
|
||||||
|
NULL AS statuscompra,
|
||||||
|
p.paicomposto AS idbase,
|
||||||
|
NULL AS tipotroca,
|
||||||
|
p.codigo AS seqproduto,
|
||||||
|
p.nome AS Descricao
|
||||||
|
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
|
||||||
|
LEFT JOIN verdemar.produtos_estoque est
|
||||||
|
|
||||||
|
ON
|
||||||
|
est.codigo = p.codigo
|
||||||
|
AND est.loja = l.codigo
|
||||||
|
LEFT JOIN verdemar.produtos_venda_media pvm
|
||||||
|
|
||||||
|
ON
|
||||||
|
pvm.codigo = p.codigo
|
||||||
|
AND pvm.loja = l.codigo
|
||||||
|
LEFT JOIN CTE_UltimaEntrada ult_ent
|
||||||
|
|
||||||
|
ON
|
||||||
|
ult_ent.produto_codigo = p.codigo
|
||||||
|
AND ult_ent.loja_codigo = l.codigo
|
||||||
|
AND ult_ent.rn = 1
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
pr.codigo,
|
||||||
|
pr.loja,
|
||||||
|
pr.precopromocao
|
||||||
|
FROM
|
||||||
|
verdemar.promocao pr
|
||||||
|
WHERE
|
||||||
|
(pr.datafinal >= TRUNC(SYSDATE)
|
||||||
|
OR pr.indeterminada = 'S')
|
||||||
|
|
||||||
|
) prom
|
||||||
|
|
||||||
|
ON
|
||||||
|
prom.codigo = p.codigo
|
||||||
|
AND prom.loja = l.codigo
|
||||||
|
LEFT JOIN verdemar.produtos_ean ean
|
||||||
|
|
||||||
|
ON
|
||||||
|
ean.codigo = p.codigo
|
||||||
|
AND ean.vendapadrao = 'S'
|
||||||
|
LEFT JOIN verdemar.categoria cat
|
||||||
|
|
||||||
|
ON
|
||||||
|
cat.codigo = p.categoria
|
||||||
|
LEFT JOIN verdemar.subgrupo subg
|
||||||
|
|
||||||
|
ON
|
||||||
|
subg.codigo = p.subgrupo
|
||||||
|
AND subg.setor = p.setor
|
||||||
|
AND subg.grupo = p.grupo
|
||||||
|
LEFT JOIN verdemar.produtos_estoque_wms pew
|
||||||
|
|
||||||
|
ON
|
||||||
|
pew.produto = p.codigo
|
||||||
|
AND pew.cd = 892605
|
||||||
|
WHERE
|
||||||
|
p.codigo = ${args.codproduto}
|
||||||
|
AND l.participageradorlojas = 'S'
|
||||||
|
AND p.inativo = 'N'
|
||||||
|
AND l.codigo IN (${args.ctx_user_companies_for_module})`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_preco: (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 p.codigo = ${args.codproduto}
|
||||||
|
AND l.codigo = ${args.nrempresa}
|
||||||
|
AND p.inativo = 'N'
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_mdv: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
WITH cte_extrato AS (
|
||||||
|
SELECT /*+ MATERIALIZE */
|
||||||
|
TRUNC(pe.datamovimento) AS dia,
|
||||||
|
MAX(pe.saldo + pe.quantidade)
|
||||||
|
KEEP (DENSE_RANK FIRST ORDER BY pe.integradorflaginc) AS estoque_inicial
|
||||||
|
FROM verdemar.produtos_extrato pe
|
||||||
|
WHERE pe.codigo = :codproduto
|
||||||
|
AND pe.loja = :nrempresa
|
||||||
|
AND pe.tipoorigem = 0
|
||||||
|
AND pe.datamovimento >= TRUNC(SYSDATE) - 365 -- mesma janela do movimento
|
||||||
|
GROUP BY
|
||||||
|
TRUNC(pe.datamovimento)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
TRUNC(pm.data) AS data,
|
||||||
|
pm.loja AS nroempresa,
|
||||||
|
pm.codigo AS seqproduto,
|
||||||
|
DECODE(TO_CHAR(TRUNC(pm.data), 'D'),
|
||||||
|
'1', 'Domingo',
|
||||||
|
'2', 'Segunda',
|
||||||
|
'3', 'Terça',
|
||||||
|
'4', 'Quarta',
|
||||||
|
'5', 'Quinta',
|
||||||
|
'6', 'Sexta',
|
||||||
|
'7', 'Sábado'
|
||||||
|
) AS diasemana,
|
||||||
|
SUM(pm.quantidade) AS qtd,
|
||||||
|
NVL(ext.estoque_inicial, 0) AS qtd_inicial
|
||||||
|
|
||||||
|
FROM verdemar.produtos_movimento pm
|
||||||
|
LEFT JOIN cte_extrato ext
|
||||||
|
ON ext.dia = TRUNC(pm.data)
|
||||||
|
|
||||||
|
WHERE pm.quantidade > 0
|
||||||
|
AND TRUNC(pm.data) >= TRUNC(SYSDATE) - 365
|
||||||
|
AND pm.loja = :nrempresa
|
||||||
|
AND pm.codigo = :codproduto
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
TRUNC(pm.data),
|
||||||
|
pm.loja,
|
||||||
|
pm.codigo,
|
||||||
|
NVL(ext.estoque_inicial, 0)
|
||||||
|
|
||||||
|
ORDER BY TRUNC(pm.data) DESC
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_situacao_vigente: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
l.codigo AS nroempresa,
|
||||||
|
p.codigo AS seqproduto,
|
||||||
|
prom.datainicial AS dtainicio,
|
||||||
|
prom.datafinal AS dtafim,
|
||||||
|
ean.quantidade || ' ' || ean.embalagem AS embalagem,
|
||||||
|
prom.precopromocao AS preco
|
||||||
|
|
||||||
|
FROM promocao prom
|
||||||
|
INNER JOIN produtos p
|
||||||
|
ON p.codigo = prom.codigo
|
||||||
|
INNER JOIN produtos_loja pl
|
||||||
|
ON pl.codigo = p.codigo
|
||||||
|
INNER JOIN loja l
|
||||||
|
ON l.codigo = pl.loja
|
||||||
|
AND l.codigo = prom.loja
|
||||||
|
LEFT JOIN produtos_ean ean
|
||||||
|
ON ean.codigo = p.codigo
|
||||||
|
AND ean.vendapadrao = 'S'
|
||||||
|
|
||||||
|
WHERE prom.datainicial >= TRUNC(SYSDATE) - 90
|
||||||
|
AND prom.loja = ${args.nrempresa}
|
||||||
|
AND prom.codigo = ${args.codproduto}
|
||||||
|
ORDER BY prom.datainicial DESC
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_custo_liquido: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
e.dataentrada AS dtaentradasaida,
|
||||||
|
e.loja AS nroempresa,
|
||||||
|
ei.codigo AS SEQPRODUTO,
|
||||||
|
0 AS seqfamilia,
|
||||||
|
0 AS estqinicial,
|
||||||
|
0 AS estqfinal,
|
||||||
|
ei.custoliquido AS custo
|
||||||
|
|
||||||
|
FROM entradas e
|
||||||
|
INNER JOIN entradas_itens ei
|
||||||
|
ON ei.chaveentrada = e.chave
|
||||||
|
INNER JOIN operacoes_entradas oe
|
||||||
|
ON oe.codigo = e.operacao
|
||||||
|
WHERE e.dataentrada >= TRUNC(SYSDATE) - 50
|
||||||
|
AND e.status = 'S'
|
||||||
|
AND e.loja = ${args.nrempresa}
|
||||||
|
AND ei.codigo = ${args.codproduto}
|
||||||
|
ORDER BY e.dataentrada DESC
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_estoque_disponivel: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
WITH cte_extrato AS (
|
||||||
|
SELECT /*+ MATERIALIZE */
|
||||||
|
TRUNC(pe.datamovimento) AS dia,
|
||||||
|
MAX(pe.saldo + pe.quantidade)
|
||||||
|
KEEP (DENSE_RANK FIRST ORDER BY pe.integradorflaginc) AS estoque_inicial,
|
||||||
|
MAX(pe.saldo)
|
||||||
|
KEEP (DENSE_RANK LAST ORDER BY pe.integradorflaginc) AS estoque_final,
|
||||||
|
SUM(CASE WHEN pe.tipoorigem IN (1, 3, 4, 5)
|
||||||
|
THEN pe.quantidade ELSE 0 END) AS qtdentrada,
|
||||||
|
SUM(CASE WHEN pe.tipoorigem IN (0, 2)
|
||||||
|
THEN pe.quantidade ELSE 0 END) AS qtdsaida
|
||||||
|
FROM verdemar.produtos_extrato pe
|
||||||
|
WHERE pe.codigo = ${args.codproduto}
|
||||||
|
AND pe.loja = ${args.nrempresa}
|
||||||
|
AND pe.datamovimento >= TRUNC(SYSDATE) - 50
|
||||||
|
GROUP BY
|
||||||
|
TRUNC(pe.datamovimento)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
ext.dia AS dtaentradasaida,
|
||||||
|
${args.nrempresa} AS nroempresa,
|
||||||
|
${args.codproduto} AS seqproduto,
|
||||||
|
NVL(ext.qtdentrada, 0) AS qtdentrada,
|
||||||
|
NVL(ext.qtdsaida, 0) AS qtdsaida,
|
||||||
|
NVL(ext.estoque_final, 0) AS qtdsaldo
|
||||||
|
|
||||||
|
FROM cte_extrato ext
|
||||||
|
|
||||||
|
ORDER BY ext.dia DESC
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
detalhe_estoque_transito: (args) => {
|
||||||
|
return {
|
||||||
|
sql: /*sql*/ `
|
||||||
|
SELECT
|
||||||
|
e.loja AS nroempresa,
|
||||||
|
ei.codigo AS seqproduto,
|
||||||
|
FNC_NOMEPESSOAS(e.codigo) AS fornecedor,
|
||||||
|
e.numeronota AS numeronf,
|
||||||
|
e.serienota AS serienf,
|
||||||
|
e.dataemissao AS dtaemissao,
|
||||||
|
e.dataentrada AS dtaentrada,
|
||||||
|
ei.quantidade * ean.quantidade AS quantidade,
|
||||||
|
ei.custoliquido * ei.quantidade AS valor
|
||||||
|
|
||||||
|
FROM verdemar.entradas e
|
||||||
|
INNER JOIN verdemar.entradas_itens ei
|
||||||
|
ON ei.chaveentrada = e.chave
|
||||||
|
INNER JOIN verdemar.operacoes_entradas oe
|
||||||
|
ON oe.codigo = e.operacao
|
||||||
|
INNER JOIN verdemar.produtos_ean ean
|
||||||
|
ON ean.chave = ei.embalagem
|
||||||
|
|
||||||
|
WHERE e.status <> 'S'
|
||||||
|
AND e.dataentrada >= ADD_MONTHS(TRUNC(SYSDATE), -3)
|
||||||
|
AND e.loja = ${args.nrempresa}
|
||||||
|
AND ei.codigo = ${args.codproduto}
|
||||||
|
AND e.codigo IN (SELECT codigo FROM verdemar.vi_loja_estoque)
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM verdemar.pedidos ped
|
||||||
|
WHERE ped.chave = e.pedidoorigem
|
||||||
|
)
|
||||||
|
|
||||||
|
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