65 Commits

Author SHA1 Message Date
sarah.magalhaes c28a8fc40a AJustando query cateegorias ai vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-11 14:25:04 -03:00
sarah.magalhaes cd9f7b6123 Adicionado nome da coluna query lojas ia
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-11 11:40:06 -03:00
sarah.magalhaes b7aed284c4 Forçado para reprocessar tabelas is
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-11 11:38:46 -03:00
sarah.magalhaes 66ed503d5b Adicionando esqueleto dos restantes assuntos de produtos ai
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-10 17:06:05 -03:00
sarah.magalhaes 3ed227c3a1 Adicionando assuntos do deetalhe de produtos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-10 15:32:39 -03:00
sarah.magalhaes c7345dd7f1 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
Adicionando assunto flash de vendas categoria ai
2026-06-10 14:34:08 -03:00
sarah.magalhaes e107020f60 Adicionando assunto de flash de vendas por categoria ia 2026-06-10 14:00:40 -03:00
tkinaba dc81d46278 chore: bump jeff version v1.0.18
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-10 11:11:43 -03:00
sarah.magalhaes 4165185383 Ajustando query lojas ia vdm
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-09 16:26:34 -03:00
sarah.magalhaes 49917ab60e Ajustando detalhe estoque transito
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 15:49:08 -03:00
sarah.magalhaes 7d215910bc Ajustando detalhe estoque transito
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 15:24:43 -03:00
sarah.magalhaes a3a20c93de Ajustando numero de dias de 365 para 50
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 15:04:03 -03:00
sarah.magalhaes 8d11ef3365 Ajustando estoque inicial detalhe estoque disponivel
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 14:48:45 -03:00
sarah.magalhaes 311a5e8815 Ajustando estoque inicial detalhe mdv
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 14:25:53 -03:00
sarah.magalhaes 2ce6cb0807 Ajustando estoque inicial detalhe mdv
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 14:21:29 -03:00
sarah.magalhaes 01dd72adbb Ajustado vendapadrao query produtos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 13:53:39 -03:00
Sarah Magalhães 43a92aa74e Ajustado nroempresa query produtos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-09 11:16:42 -03:00
Sarah Magalhães 088a81fe6b Adicionando tabela rag de lojas vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-08 17:29:29 -03:00
Sarah Magalhães 4786c08537 Ajustado query de vendas IA loja vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-08 14:55:39 -03:00
Sarah Magalhães 437ee115f7 Ajustado query de vendas IA loja vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-08 14:50:39 -03:00
Sarah Magalhães c41dcc39a2 Adicionando query de vendas IA loja vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-08 14:39:02 -03:00
Sarah Magalhães ecf37c8402 Permissao de empresas query flash categorias
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-05 10:44:19 -03:00
Sarah Magalhães d2673d0c8a Permissao de empresas query flash
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-05 10:16:07 -03:00
Sarah Magalhães dc1aa9417e Ajustando performance query produtos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-05 10:01:36 -03:00
Sarah Magalhães d8fe335282 Ajustando agendamento vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-05 09:56:19 -03:00
Sarah Magalhães a36e6bbae2 Ajustando detalhes vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 17:01:06 -03:00
Sarah Magalhães aa308dfb95 Ajustando detalhe_mdv
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 16:43:26 -03:00
Sarah Magalhães 9abab1d722 Ajustando detalhe_mdv
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 16:40:41 -03:00
Sarah Magalhães dd4b1d4dac Ajustando detalhe_mdv
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 16:24:10 -03:00
Sarah Magalhães 728b1f0870 Ajustando detalhe_mdv
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 16:21:38 -03:00
Sarah Magalhães 471bd15fdf Adicionando demais detalhes
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 16:08:37 -03:00
Sarah Magalhães 286e10c9f3 Adicionando detalhes preco vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 15:37:04 -03:00
Sarah Magalhães 62789936f8 Ajuste detalhes do produto
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 15:29:31 -03:00
Sarah Magalhães 9a05e81e1e Ajuste detalhes do produto
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 15:28:22 -03:00
Sarah Magalhães 32d50727aa Adicionando detalhes do produto
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 15:11:06 -03:00
Sarah Magalhães b19e261a35 Adicionando detalhes do produto
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 15:05:10 -03:00
Sarah Magalhães 079df5da8a Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 14:52:10 -03:00
Sarah Magalhães 6b3284979f Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 14:49:19 -03:00
Sarah Magalhães dd36e000ce Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 14:17:40 -03:00
Sarah Magalhães c0c54543a3 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 14:14:49 -03:00
Sarah Magalhães cb155585cd Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 14:08:18 -03:00
Sarah Magalhães 4b76bddf5a Ajuste query consulta produtos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 13:54:57 -03:00
Sarah Magalhães 856556a595 Ajuste query consulta produtos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 13:31:20 -03:00
Sarah Magalhães 63e361720e Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 13:25:17 -03:00
Sarah Magalhães 73d303ac8c Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 11:28:30 -03:00
Sarah Magalhães 3ecdaedda4 Adicionando query de consulta produtos vdm
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 11:19:07 -03:00
Sarah Magalhães 44e44e0bb9 Agendamento ajuste vdm
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 11:13:03 -03:00
Sarah Magalhães f406b6eca1 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 10:56:27 -03:00
Sarah Magalhães 4af4233d60 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 10:28:31 -03:00
Sarah Magalhães 0a4bc7bd32 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 10:25:39 -03:00
Sarah Magalhães 0955861fdc Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 10:12:26 -03:00
Sarah Magalhães 75a7faee6c Ajuste agendamento verdemar
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 09:56:34 -03:00
Sarah Magalhães 8a9c439829 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-03 09:54:17 -03:00
Sarah Magalhães 7992c8d3c7 Adicionando consulta de produtos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 09:44:54 -03:00
Sarah Magalhães 79d510e0ca Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 09:20:28 -03:00
Sarah Magalhães 818715f01b Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-06-03 09:09:59 -03:00
Sarah Magalhães 0081d4b7d4 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 17:41:46 -03:00
Sarah Magalhães 5fc50f7341 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 17:39:24 -03:00
Sarah Magalhães a7cf0fb023 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 17:02:38 -03:00
Sarah Magalhães eeacc8dad3 Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 16:38:18 -03:00
Sarah Magalhães 8753baa1ce Ajuste query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 16:25:32 -03:00
Sarah Magalhães ce871f5f20 Ajuste do merge order:1
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 16:00:32 -03:00
Sarah Magalhães f1aee403ec Ajuste query flash por loja sem MVs e adicao query flash categoria
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 15:58:00 -03:00
Sarah Magalhães ad86611e9f Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-06-02 15:51:38 -03:00
Sarah Magalhães 1cf8f38886 Ajuste query flash por loja sem MVs e adicao query flash categoria 2026-06-02 15:44:46 -03:00
4 changed files with 1327 additions and 69 deletions
+4 -4
View File
@@ -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
View File
@@ -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"
+442 -62
View File
@@ -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*/``
} }
}, },
}, },
@@ -985,92 +1078,375 @@ where 1 = 0`,
flash: (args) => { flash: (args) => {
return { return {
sql: /*sql*/` sql: /*sql*/`
WITH Parametros AS ( WITH Parametros AS (
SELECT SELECT
TO_DATE(${args.data_venda}, 'YYYY-MM-DD') as dt_ref, 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, 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(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(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(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 ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12) AS dt_fim_ano_ant
FROM DUAL FROM DUAL
), ),
DadosUnificados AS ( Vendas AS (
SELECT loja, empresa_tipo, data, venda, 0 as meta SELECT n.cod_empresa AS loja,
FROM ( r.data_referencia AS data,
SELECT 1 AS empresa_tipo, loja, data, venda FROM VERDEMAR.MV_VENDAS_VERDEMAR_DIA r.valor_venda AS venda,
UNION ALL 0 AS meta
SELECT 131 AS empresa_tipo, loja, data, venda FROM VERDEMAR.MV_VENDAS_RESTAURANTE_DIA FROM VERDEMAR.TB_FLASH_NODO_RESUMO_VENDA r
) v JOIN VERDEMAR.TB_FLASH_NODO n ON n.id_nodo = r.id_nodo
CROSS JOIN Parametros p CROSS JOIN Parametros p
WHERE (v.data BETWEEN p.dt_inicio_mes AND p.dt_ref) WHERE n.tipo_nodo = 'EMPRESA'
OR (v.data BETWEEN p.dt_inicio_mes_ant AND p.dt_fim_mes_ant) AND n.ativo = 'S'
OR (v.data BETWEEN p.dt_inicio_ano_ant AND p.dt_fim_ano_ant) AND n.cod_empresa IN (${args.ctx_user_companies_for_module})
AND ( r.data_referencia BETWEEN p.dt_inicio_mes AND p.dt_ref
UNION ALL 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)
SELECT VERDEMAR.FNC_CODIGOLOJA(m.loja_ajustada), 1, m.data, 0, m.meta_diaria ),
FROM VERDEMAR.ORCADO_METAS_IMPORT m Metas AS (
CROSS JOIN Parametros p 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) 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 (
SELECT * FROM Vendas
UNION ALL
SELECT * FROM Metas
), ),
Agrupado AS ( Agrupado AS (
SELECT SELECT
d.loja, d.loja,
d.empresa_tipo, 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_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.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, d.empresa_tipo GROUP BY d.loja
) )
SELECT SELECT
CASE 'Lojas' AS canalapp,
WHEN empresa_tipo = 131 THEN 'RESTAURANTE' (loja) AS cod_empresa,
WHEN FNC_NUMEROLOJA(loja) = 0 THEN 'TOTAL' FNC_NOMEPESSOAS(loja) AS nomeempresaapp,
ELSE 'VERDEMAR' GROUPING(loja) AS is_total,
END as canalapp,
CASE SUM(m_mes) AS meta_mes,
WHEN empresa_tipo = 1 THEN FNC_NUMEROLOJA(loja) SUM(v_mes) AS mes_atual,
ELSE RESTAURANTE.FNC_NUMEROLOJA(loja) SUM(v_mes) - SUM(m_mes) AS dif_mes_atual,
END as cod_empresa, ROUND(NVL((SUM(v_mes) / NULLIF(SUM(m_mes), 0)) * 100 - 100, 0), 2) AS variacao_atual,
CASE
WHEN empresa_tipo = 1 THEN FNC_NOMEPESSOAS(loja) SUM(m_mes_ant) AS meta_mes_anterior,
ELSE RESTAURANTE.FNC_NOMEPESSOAS(loja) SUM(v_mes_ant) AS mes_anterior,
END as nomeempresaapp, SUM(v_mes) - SUM(v_mes_ant) AS dif_mes_anterior,
GROUPING(loja) as is_total, ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_mes_ant), 0)) * 100 - 100, 0), 2) AS variacao_mes_anterior,
SUM(m_mes) as meta_mes,
SUM(v_mes) as mes_atual, SUM(m_ano_ant) AS meta_ano_anterior,
SUM(v_mes) - SUM(m_mes) as dif_mes_atual, SUM(v_ano_ant) AS ano_anterior,
ROUND(NVL((SUM(v_mes) / NULLIF(SUM(m_mes), 0)) * 100 - 100, 0), 2) as variacao_atual, SUM(v_mes) - SUM(v_ano_ant) AS dif_ano_anterior,
SUM(v_mes_ant) as mes_anterior, ROUND(NVL((SUM(v_mes) / NULLIF(SUM(v_ano_ant), 0)) * 100 - 100, 0), 2) AS variacao_ano_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(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 FROM Agrupado
GROUP BY GROUPING SETS((empresa_tipo, loja), ()) GROUP BY GROUPING SETS ((loja), ())
` `
} }
}, },
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({
@@ -1127,8 +1503,12 @@ 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
END`, /* PRC_FLASH_ATUALIZA_VENDA(
cron: "0 * * * *", p_data_inicial => TRUNC(SYSDATE),
p_data_final => TRUNC(SYSDATE)
);*/
END;`,
cron: "0 */2 * * *",
timeout_seconds: 2400, timeout_seconds: 2400,
} }
] ]
+879 -1
View File
@@ -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*/ `
`
}
}
}
}); });