From 11ccd8a32829f27d2994e74cbe60ad652220fdc9 Mon Sep 17 00:00:00 2001 From: "lucas.favaro" Date: Thu, 30 Apr 2026 10:46:01 -0300 Subject: [PATCH] =?UTF-8?q?Inclus=C3=A3o=20flash=20de=20perdas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/flash_perdas/flash_perdas.module.ts | 201 ++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 src/flash_perdas/flash_perdas.module.ts diff --git a/src/flash_perdas/flash_perdas.module.ts b/src/flash_perdas/flash_perdas.module.ts new file mode 100644 index 0000000..5aa50a1 --- /dev/null +++ b/src/flash_perdas/flash_perdas.module.ts @@ -0,0 +1,201 @@ +import { createModuleFactory } from "@davinti/jeff"; + +const moduleFactory = createModuleFactory(["C5", "C5_big", "C5_mambo"]); + +export default moduleFactory + .createModule({ + id: "flash-de-perdas", + description: "Flash de Perdas", + label: "Flash de Perdas", + icon: "bar-chart", + queries: { + flash: { + name: "Flash de Perdas", + display: { + type: "flash", + settings: { + group_column: "canalapp", + total_indicator_column: "is_total", + null_label_key: "Geral", + }, + header: { + title_column: "canalapp", + value_column: "perda_dia", + value_format: "currency", + }, + rows: [ + { + label: "Meta Mês", + column: "meta_mes", + format: "currency_short", + }, + { + label: "Mês Atual", + column: "mes_atual", + format: "currency_short", + }, + { + label: "Dif ($)", + column: "dif_mes_atual", + format: "currency_short", + }, + { + label: "% Variação", + column: "variacao_atual", + format: "percentage", + }, + { + label: "Mês Anterior", + column: "mes_anterior", + format: "currency_short", + }, + { + label: "Dif ($)", + column: "dif_mes_anterior", + format: "currency_short", + }, + { + label: "% Variação", + column: "variacao_mes_anterior", + format: "percentage", + }, + { + label: "Ano Anterior", + column: "ano_anterior", + format: "currency_short", + }, + { + label: "Dif ($)", + column: "dif_ano_anterior", + format: "currency_short", + }, + { + label: "% Variação", + column: "variacao_ano_anterior", + format: "percentage", + }, + ], + }, + params: ["data_perda"], + }, + }, + entrypoint: "flash", + }) + .withImplementations({ + C5: { + flash: (args) => { + return { + sql: /*sql*/ ` +select + tes.canalapp, + tes.nomeempresaapp, + grouping(tes.canalapp) is_total, + sum(tvf.vlrvendadia) venda_dia, + sum(tvf.vlrmetames) meta_mes, + sum(tvf.vlrvendaacumulada) vda, + sum(tvf.vlrvendaacumulada - tvf.vlrmetaaculumada) dma, + sum(tvf.vlrmetadia) meta_dia, + round(avg(tvf.vlrmetamargemdiaperc), 2) meta_margem_dia, + sum(tvf.qtdclientes) qtd_clientes, + round(sum(tvf.vlrvendadia) / nullif(sum(tvf.qtdclientes), 0), 2) as ticket_medio, + round((sum(tvf.vlrlucro) / nullif(sum(tvf.vlrvendadia), 0)) * 100, 2) as margem +from mboard.tb_venda_flash tvf +inner join mboard.tb_empresa_segmento tes + on tes.nroempresa = tvf.nroempresa + and tes.nrodivisao = tvf.nrodivisao + and tes.nrosegmento = tvf.nrosegmento + and tes.codcanal = tvf.codcanal +where 1=1 + and tvf.vlrvendaacumulada > 0 + and tvf.dtavda = TO_DATE(${args.data_perda}, 'YYYY-MM-DD') + and (tvf.nroempresa in (${args.ctx_user_companies_for_module})) +group by rollup(canalapp, nomeempresaapp) +order by grouping(canalapp) desc, grouping(nomeempresaapp) desc`, + }; + }, + }, + C5_big: {flash: (args) => { + return { + sql: /*sql*/ ` + SELECT + 'Lojas' AS canalapp, + x.nomeempresaapp AS nomeempresaapp, + CASE + WHEN GROUPING(x.nomeempresaapp) = 1 THEN 1 + ELSE 0 + END AS is_total, + SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) 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 - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual, + CASE + WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva 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 = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100 + , 2) + END AS variacao_atual, + SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) 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_meta_efetiva ELSE 0 END) 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 + n.codigo, + n.nome AS nomeempresaapp, + r.valor_meta_efetiva, + r.valor_venda, + CASE + WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_perda}, 'YYYY-MM-DD') + THEN 'ATUAL' + WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -1) + AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -1) + THEN 'MES_ANTERIOR' + WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -12) + AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -12) + THEN 'ANO_ANTERIOR' + END AS periodo + FROM + tb_flash_nodo_resumo_venda r + JOIN tb_flash_nodo n + ON + n.id_nodo = r.id_nodo + WHERE + n.tipo_nodo = 'EMPRESA' + AND ( + r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_perda}, 'YYYY-MM-DD') + OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -1) + AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -1) + OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -12) + AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -12) + ) + ) x + GROUP BY + ROLLUP(x.nomeempresaapp) + `,}; + }, + }, + C5_mambo: {flash: (args) => { + return { + sql: /*sql*/ ``,}; + }, + }, + }) \ No newline at end of file