diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index 75530ee..52c5a30 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -1354,102 +1354,95 @@ where 1 = 0`, flash_vendas_categoria_ai: (args)=> { return { sql: /*sql*/` - WITH Parametros_Base AS ( + WITH params 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 + 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 ), - 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 + 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}) ), - 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), ()) + 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 - 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, + :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 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 + 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 ` }