From 9f6201f0af68732100f69ffbedbe2e1448befa1d Mon Sep 17 00:00:00 2001 From: "lucas.favaro" Date: Wed, 22 Apr 2026 15:17:14 -0300 Subject: [PATCH] Primeiro commit do projeto --- .../20260407140549_seq_flash_perdas.sql | 26 ++ migrations/20260407140705_tb_flash_perdas.sql | 52 +++ .../20260407140808_trg_flash_perdas_bi.sql | 32 ++ .../20260407140853_idx_flash_perdas_01.sql | 28 ++ ...20260407140949_comment_tb_flash_perdas.sql | 25 ++ ...0260407154505_prc_carrega_flash_perdas.sql | 300 ++++++++++++++++++ .../20260420175525_seq_flash_vendas.sql | 26 ++ .../20260420175721_idx_flash_vendas_01.sql | 26 ++ migrations/20260420175846_tb_flash_vendas.sql | 52 +++ .../20260420175946_tgr_flash_vendas.sql | 32 ++ .../20260420180059_idx_flahs_vendas_02.sql | 16 + ...20260420180210_comment_tb_flash_vendas.sql | 15 + src/flash/flash.module.ts | 9 + src/flashperdas/flashperdas.module.ts | 117 +++++++ 14 files changed, 756 insertions(+) create mode 100644 migrations/20260407140549_seq_flash_perdas.sql create mode 100644 migrations/20260407140705_tb_flash_perdas.sql create mode 100644 migrations/20260407140808_trg_flash_perdas_bi.sql create mode 100644 migrations/20260407140853_idx_flash_perdas_01.sql create mode 100644 migrations/20260407140949_comment_tb_flash_perdas.sql create mode 100644 migrations/20260407154505_prc_carrega_flash_perdas.sql create mode 100644 migrations/20260420175525_seq_flash_vendas.sql create mode 100644 migrations/20260420175721_idx_flash_vendas_01.sql create mode 100644 migrations/20260420175846_tb_flash_vendas.sql create mode 100644 migrations/20260420175946_tgr_flash_vendas.sql create mode 100644 migrations/20260420180059_idx_flahs_vendas_02.sql create mode 100644 migrations/20260420180210_comment_tb_flash_vendas.sql create mode 100644 src/flashperdas/flashperdas.module.ts diff --git a/migrations/20260407140549_seq_flash_perdas.sql b/migrations/20260407140549_seq_flash_perdas.sql new file mode 100644 index 0000000..9e19331 --- /dev/null +++ b/migrations/20260407140549_seq_flash_perdas.sql @@ -0,0 +1,26 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_SEQUENCES + WHERE SEQUENCE_NAME = 'SEQ_FLASH_PERDAS'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_FLASH_PERDAS + START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_SEQUENCES + WHERE SEQUENCE_NAME = 'SEQ_FLASH_PERDAS'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_FLASH_PERDAS'; + END IF; +END; \ No newline at end of file diff --git a/migrations/20260407140705_tb_flash_perdas.sql b/migrations/20260407140705_tb_flash_perdas.sql new file mode 100644 index 0000000..0ce49b1 --- /dev/null +++ b/migrations/20260407140705_tb_flash_perdas.sql @@ -0,0 +1,52 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TABLES + WHERE TABLE_NAME = 'TB_FLASH_PERDAS'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE TABLE TB_FLASH_PERDAS ( + ID NUMBER NOT NULL + CONSTRAINT PK_FLASH_PERDAS PRIMARY KEY, + NUMERO_LOJA NUMBER(10) NOT NULL, + NOME_LOJA VARCHAR2(200) NOT NULL, + CODIGO_CATEGORIA_N1 VARCHAR2(50), + NOME_CATEGORIA_N1 VARCHAR2(200), + CODIGO_CATEGORIA_N2 VARCHAR2(50), + NOME_CATEGORIA_N2 VARCHAR2(200), + CODIGO_CATEGORIA_N3 VARCHAR2(50), + NOME_CATEGORIA_N3 VARCHAR2(200), + CODIGO_CATEGORIA_N4 VARCHAR2(50), + NOME_CATEGORIA_N4 VARCHAR2(200), + CODIGO_CATEGORIA_N5 VARCHAR2(50), + NOME_CATEGORIA_N5 VARCHAR2(200), + CODIGO_PRODUTO VARCHAR2(50), + NOME_PRODUTO VARCHAR2(400), + DATA_PERDA DATE NOT NULL, + ANO NUMBER(4) NOT NULL, + MES NUMBER(2) NOT NULL, + DIA NUMBER(2) NOT NULL, + DIA_SEMANA NUMBER(1), + VALOR_PERDA NUMBER(18,4), + CUSTO NUMBER(18,4), + QTD_PERDA NUMBER(10), + DATAINC DATE DEFAULT SYSDATE NOT NULL, + DATAALT DATE DEFAULT SYSDATE NOT NULL + )'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TABLES + WHERE TABLE_NAME = 'TB_FLASH_PERDAS'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_PERDAS CASCADE CONSTRAINTS PURGE'; + END IF; +END; \ No newline at end of file diff --git a/migrations/20260407140808_trg_flash_perdas_bi.sql b/migrations/20260407140808_trg_flash_perdas_bi.sql new file mode 100644 index 0000000..4e65df7 --- /dev/null +++ b/migrations/20260407140808_trg_flash_perdas_bi.sql @@ -0,0 +1,32 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TRIGGERS + WHERE TRIGGER_NAME = 'TRG_FLASH_PERDAS_BI'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER TRG_FLASH_PERDAS_BI + BEFORE INSERT ON TB_FLASH_PERDAS + FOR EACH ROW + BEGIN + IF :NEW.ID IS NULL THEN + :NEW.ID := SEQ_FLASH_PERDAS.NEXTVAL; + END IF; + END;'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TRIGGERS + WHERE TRIGGER_NAME = 'TRG_FLASH_PERDAS_BI'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP TRIGGER TRG_FLASH_PERDAS_BI'; + END IF; +END; \ No newline at end of file diff --git a/migrations/20260407140853_idx_flash_perdas_01.sql b/migrations/20260407140853_idx_flash_perdas_01.sql new file mode 100644 index 0000000..0015563 --- /dev/null +++ b/migrations/20260407140853_idx_flash_perdas_01.sql @@ -0,0 +1,28 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_INDEXES + WHERE INDEX_NAME = 'IDX_FLASH_PERDAS_01'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE INDEX IDX_FLASH_PERDAS_01 + ON TB_FLASH_PERDAS (NUMERO_LOJA, DATA_PERDA)'; + END IF; +END; +/ + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_INDEXES + WHERE INDEX_NAME = 'IDX_FLASH_PERDAS_01'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP INDEX IDX_FLASH_PERDAS_01'; + END IF; +END; +/ \ No newline at end of file diff --git a/migrations/20260407140949_comment_tb_flash_perdas.sql b/migrations/20260407140949_comment_tb_flash_perdas.sql new file mode 100644 index 0000000..291ecba --- /dev/null +++ b/migrations/20260407140949_comment_tb_flash_perdas.sql @@ -0,0 +1,25 @@ +-- +goose Up +BEGIN + EXECUTE IMMEDIATE 'COMMENT ON TABLE TB_FLASH_PERDAS IS ''Flash de perdas por loja, produto e data'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.ID IS ''Chave primária surrogate — populada via SEQ_FLASH_PERDAS'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.NUMERO_LOJA IS ''Código numérico da loja'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATA_PERDA IS ''Data do registro de perda'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.VALOR_PERDA IS ''Valor monetário da perda (4 casas decimais)'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.QTD_PERDA IS ''Quantidade perdida (inteiro)'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.CUSTO IS ''Custo unitário do produto no momento da perda'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATAINC IS ''Data/hora de inclusão do registro'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATAALT IS ''Data/hora da última alteração do registro'''; +END; + +-- +goose Down +BEGIN + EXECUTE IMMEDIATE 'COMMENT ON TABLE TB_FLASH_PERDAS IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.ID IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.NUMERO_LOJA IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATA_PERDA IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.VALOR_PERDA IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.QTD_PERDA IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.CUSTO IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATAINC IS '''''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_PERDAS.DATAALT IS '''''; +END; \ No newline at end of file diff --git a/migrations/20260407154505_prc_carrega_flash_perdas.sql b/migrations/20260407154505_prc_carrega_flash_perdas.sql new file mode 100644 index 0000000..7756230 --- /dev/null +++ b/migrations/20260407154505_prc_carrega_flash_perdas.sql @@ -0,0 +1,300 @@ +-- +goose Up +-- +goose StatementBegin +CREATE OR REPLACE PROCEDURE PRC_CARREGA_FLASH_PERDAS ( + p_data_inicial IN DATE, + p_data_final IN DATE, + p_reprocessar IN VARCHAR2 DEFAULT 'S' +) +IS +BEGIN + IF p_reprocessar = 'S' THEN + DELETE FROM TB_FLASH_PERDAS + WHERE DATA_PERDA BETWEEN p_data_inicial AND p_data_final; + END IF; + + INSERT INTO TB_FLASH_PERDAS ( + ID, + NUMERO_LOJA, + NOME_LOJA, + CODIGO_CATEGORIA_N1, + NOME_CATEGORIA_N1, + CODIGO_CATEGORIA_N2, + NOME_CATEGORIA_N2, + CODIGO_CATEGORIA_N3, + NOME_CATEGORIA_N3, + CODIGO_CATEGORIA_N4, + NOME_CATEGORIA_N4, + CODIGO_CATEGORIA_N5, + NOME_CATEGORIA_N5, + CODIGO_PRODUTO, + NOME_PRODUTO, + DATA_PERDA, + ANO, + MES, + DIA, + DIA_SEMANA, + VALOR_PERDA, + CUSTO, + QTD_PERDA, + DATAINC, + DATAALT + ) + WITH cat_base AS ( + SELECT + pc.seqproduto, + MAX(CASE WHEN cc.nivelhierarquia = 1 THEN dc.seqcategoria END) AS codcatn1, + MAX(CASE WHEN cc.nivelhierarquia = 1 THEN cc.categoria END) AS nomecatn1, + MAX(CASE WHEN cc.nivelhierarquia = 2 THEN dc.seqcategoria END) AS codcatn2, + MAX(CASE WHEN cc.nivelhierarquia = 2 THEN cc.categoria END) AS nomecatn2, + MAX(CASE WHEN cc.nivelhierarquia = 3 THEN dc.seqcategoria END) AS codcatn3, + MAX(CASE WHEN cc.nivelhierarquia = 3 THEN cc.categoria END) AS nomecatn3, + MAX(CASE WHEN cc.nivelhierarquia = 4 THEN dc.seqcategoria END) AS codcatn4, + MAX(CASE WHEN cc.nivelhierarquia = 4 THEN cc.categoria END) AS nomecatn4, + MAX(CASE WHEN cc.nivelhierarquia = 5 THEN dc.seqcategoria END) AS codcatn5, + MAX(CASE WHEN cc.nivelhierarquia = 5 THEN cc.categoria END) AS nomecatn5 + FROM consinco.map_produto pc + JOIN consinco.map_familia fc + ON fc.seqfamilia = pc.seqfamilia + JOIN consinco.map_famdivcateg dc + ON dc.seqfamilia = fc.seqfamilia + AND dc.nrodivisao = 1 + AND dc.status = 'A' + JOIN consinco.map_categoria cc + ON cc.nrodivisao = dc.nrodivisao + AND cc.seqcategoria = dc.seqcategoria + AND cc.tipcategoria = 'M' + AND cc.statuscategor = 'A' + AND cc.nivelhierarquia BETWEEN 1 AND 5 + GROUP BY pc.seqproduto + ), + custo_base AS ( + SELECT + cd.seqproduto, + cd.nroempresa, + cd.dtaentradasaida, + (cd.cmdiavlrnf + + cd.cmdiaipi + + cd.cmdiaicmsst + + cd.cmdiadespnf + + cd.cmdiadespforanf + - cd.cmdiacredicms + - cd.cmdiacredicmspresum + - cd.cmdiacredicmsantecip + - cd.cmdiacredpis + - cd.cmdiacredcofins + - cd.cmdiadctoforanf) AS custo_dia + FROM consinco.mrl_custodia cd + ), + inner_query AS ( + SELECT + e.nroempresa AS empresa, + e.nomereduzido AS nomeempresa, + cat.codcatn1, + cat.nomecatn1, + cat.codcatn2, + cat.nomecatn2, + cat.codcatn3, + cat.nomecatn3, + cat.codcatn4, + cat.nomecatn4, + cat.codcatn5, + cat.nomecatn5, + c.seqproduto AS cod_produto, + a.desccompleta AS descricao, + a.seqprodutobase, + vw.dtaentradasaida AS data_venda, + SUM(vw.vlrctoliquido) AS custo_liq_na_loja, + SUM(vw.valorlancto) AS perda, + SUM(vw.qtdlancto) AS qtde_perda_unit, + ( + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal * + (e.pericmsestimativa + e.peroutroimposto + e.percpmf + e.perir + + DECODE(e.indfaturaiss, 'S', e.perciss, 0) + + DECODE(e.indfaturaipi || b.indcalcipisaida, 'SS', b.peraliquotaipi, 0)) / 100) + + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal * + (t3.peraliquota * t3.pertributado / 100) / 100) + + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal * + DECODE(b.indisentopis, 'S', 0, + DECODE(b.indisentodebpiscofins, 'S', 0, e.perpis)) / 100) + + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal * + DECODE(b.indisentopis, 'S', 0, + DECODE(b.indisentodebpiscofins, 'S', 0, e.percofins)) / 100) + ) AS vlrimpostovda, + CASE + WHEN cat.codcatn2 IN (15458, 18080) + AND cat.codcatn3 NOT IN (17696, 18007, 17182) + THEN + SUM( + vw.qtdlancto * ( + SELECT cx.custo_dia + FROM custo_base cx + WHERE cx.seqproduto = COALESCE(a.seqprodutobase, c.seqproduto) + AND cx.nroempresa = 301 + AND cx.dtaentradasaida = ( + SELECT MAX(cx2.dtaentradasaida) + FROM custo_base cx2 + WHERE cx2.seqproduto = cx.seqproduto + AND cx2.nroempresa = 301 + AND cx2.dtaentradasaida <= vw.dtaentradasaida + ) + ) + ) + ELSE SUM(vw.valorlancto) + END AS perda_novo + FROM + maxv_categoria gs, + map_famdivcateg us, + map_famdivcateg w, + map_famdivisao d, + max_empresa e, + max_divisao i2, + map_classifabc z2, + maxv_abcperdabase vw, + map_tributacaouf t3, + map_familia b, + mad_famsegmento h, + map_famembalagem k, + mrl_produtoempresa c, + mrl_prodempseg c3, + map_produto a, + mad_segmento se, + map_produto pr, + cat_base cat, + ( + SELECT + a.seqproduto, + a.nroempresa, + SUM(a.estqloja) AS estqloja, + SUM(a.estqdeposito) AS estqdeposito, + SUM(a.estqtroca) AS estqtroca, + SUM(a.estqalmoxarifado) AS estqalmoxarifado, + SUM(a.estqoutro) AS estqoutro, + SUM( + NVL(a.cmultvlrdescpistransf, 0) + + NVL(a.cmultvlrdesccofinstransf, 0) + + NVL(a.cmultvlrdescicmstransf, 0) + + NVL(a.cmultvlrdescipitransf, 0) + + NVL(a.cmultvlrdesclucrotransf, 0) + + NVL(a.cmultvlrdescverbatransf, 0) + + NVL(a.cmultvlrdescdiferencatransf, 0) + ) AS vlrdesctransfcb + FROM mrl_produtoempresa a + GROUP BY a.seqproduto, a.nroempresa + ) sx, + ( + SELECT MAX(dx.utilacresccustprodrelac) AS utilacresccustprodrelac + FROM max_divisao dx + JOIN max_empresa ex + ON ex.nrodivisao = dx.nrodivisao + ) i3 + WHERE + e.nroempresa = vw.nroempresa + AND e.nrodivisao = d.nrodivisao + AND h.seqfamilia = vw.seqfamilia + AND h.nrosegmento = e.nrosegmentoprinc + AND h.nrosegmento = se.nrosegmento + AND d.seqfamilia = vw.seqfamilia + AND d.nrodivisao IN (1) + AND b.seqfamilia = vw.seqfamilia + AND i2.nrodivisao = d.nrodivisao + AND z2.nrosegmento = h.nrosegmento + AND z2.classifcomercabc = h.classifcomercabc + AND k.seqfamilia = h.seqfamilia + AND a.seqproduto = c.seqproduto + AND k.qtdembalagem = h.padraoembvenda + AND c.seqproduto = vw.seqproduto + AND c.nroempresa = NVL(e.nroempcustoabc, e.nroempresa) + AND c3.nroempresa = vw.nroempresa + AND c3.seqproduto = vw.seqproduto + AND c3.nrosegmento = e.nrosegmentoprinc + AND c3.qtdembalagem = h.padraoembvenda + AND t3.nrotributacao = d.nrotributacao + AND t3.ufempresa = e.uf + AND t3.ufclientefornec = e.uf + AND t3.tiptributacao = DECODE(i2.tipdivisao, 'V', 'SN', 'SC') + AND t3.nroregtributacao = NVL(e.nroregtributacao, 0) + AND pr.seqproduto = vw.seqproduto + AND sx.seqproduto = vw.seqproduto + AND sx.nroempresa = vw.nroempresa + AND cat.seqproduto = vw.seqproduto + AND vw.dtaentradasaida BETWEEN p_data_inicial AND p_data_final + AND vw.nroempresa IN ( + SELECT CODIGO + FROM VITRUVIO.vi_lojas + WHERE codigo NOT IN (301, 401, 500) + ) + AND vw.tipclassinterno IN ('P', 'R', 'C', 'A') + AND vw.tiplancto IN ('S') + AND gs.nrodivisao = us.nrodivisao + AND gs.nivelhierarquia = 2 + AND gs.tipcategoria = 'M' + AND gs.statuscategor != 'I' + AND us.seqfamilia = d.seqfamilia + AND us.nrodivisao = d.nrodivisao + AND us.seqcategoria = gs.seqcategoria + AND us.status = 'A' + AND w.seqfamilia = d.seqfamilia + AND w.nrodivisao = d.nrodivisao + AND w.status = 'A' + AND w.seqcategoria IN (14772, 15450) + GROUP BY + e.nroempresa, + e.nomereduzido, + gs.seqcategoria, + gs.caminhocompleto, + SUBSTR(e.nomereduzido || ' : ' || gs.caminhocompleto, 1, 250), + c.seqproduto, + a.seqprodutobase, + a.desccompleta, + vw.dtaentradasaida, + cat.codcatn1, cat.nomecatn1, + cat.codcatn2, cat.nomecatn2, + cat.codcatn3, cat.nomecatn3, + cat.codcatn4, cat.nomecatn4, + cat.codcatn5, cat.nomecatn5, + TO_NUMBER(NULL), + NULL + ) + SELECT + SEQ_FLASH_PERDAS.NEXTVAL, + iq.empresa, + iq.nomeempresa, + TO_CHAR(iq.codcatn1), + iq.nomecatn1, + TO_CHAR(iq.codcatn2), + iq.nomecatn2, + TO_CHAR(iq.codcatn3), + iq.nomecatn3, + TO_CHAR(iq.codcatn4), + iq.nomecatn4, + TO_CHAR(iq.codcatn5), + iq.nomecatn5, + TO_CHAR(iq.cod_produto), + iq.descricao, + iq.data_venda, + EXTRACT(YEAR FROM iq.data_venda), + EXTRACT(MONTH FROM iq.data_venda), + EXTRACT(DAY FROM iq.data_venda), + (TRUNC(iq.data_venda) - TRUNC(iq.data_venda, 'IW') + 1), + iq.perda_novo, + iq.custo_liq_na_loja, + iq.qtde_perda_unit, + SYSDATE, + SYSDATE + FROM inner_query iq; + + COMMIT; +END; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +BEGIN + EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_CARREGA_FLASH_PERDAS'; +EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -4043 THEN + RAISE; + END IF; +END; +-- +goose StatementEnd \ No newline at end of file diff --git a/migrations/20260420175525_seq_flash_vendas.sql b/migrations/20260420175525_seq_flash_vendas.sql new file mode 100644 index 0000000..66486e7 --- /dev/null +++ b/migrations/20260420175525_seq_flash_vendas.sql @@ -0,0 +1,26 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_SEQUENCES + WHERE SEQUENCE_NAME = 'SEQ_FLASH_VENDAS'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_FLASH_VENDAS + START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TRIGGERS + WHERE TRIGGER_NAME = 'TRG_FLASH_VENDAS_BI'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP TRIGGER TRG_FLASH_VENDAS_BI'; + END IF; +END; diff --git a/migrations/20260420175721_idx_flash_vendas_01.sql b/migrations/20260420175721_idx_flash_vendas_01.sql new file mode 100644 index 0000000..f6072cd --- /dev/null +++ b/migrations/20260420175721_idx_flash_vendas_01.sql @@ -0,0 +1,26 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_INDEXES + WHERE INDEX_NAME = 'IDX_FLASH_VENDAS_01'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE INDEX IDX_FLASH_VENDAS_01 + ON TB_FLASH_VENDAS (NUMERO_LOJA, DATA_VENDA)'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_INDEXES + WHERE INDEX_NAME = 'IDX_FLASH_VENDAS_01'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP INDEX IDX_FLASH_VENDAS_01'; + END IF; +END; diff --git a/migrations/20260420175846_tb_flash_vendas.sql b/migrations/20260420175846_tb_flash_vendas.sql new file mode 100644 index 0000000..c234a74 --- /dev/null +++ b/migrations/20260420175846_tb_flash_vendas.sql @@ -0,0 +1,52 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TABLES + WHERE TABLE_NAME = 'TB_FLASH_VENDAS'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE TABLE TB_FLASH_VENDAS ( + ID NUMBER NOT NULL + CONSTRAINT PK_FLASH_VENDAS PRIMARY KEY, + NUMERO_LOJA NUMBER(10) NOT NULL, + NOME_LOJA VARCHAR2(200) NOT NULL, + CODIGO_CATEGORIA_N1 VARCHAR2(50), + NOME_CATEGORIA_N1 VARCHAR2(200), + CODIGO_CATEGORIA_N2 VARCHAR2(50), + NOME_CATEGORIA_N2 VARCHAR2(200), + CODIGO_CATEGORIA_N3 VARCHAR2(50), + NOME_CATEGORIA_N3 VARCHAR2(200), + CODIGO_CATEGORIA_N4 VARCHAR2(50), + NOME_CATEGORIA_N4 VARCHAR2(200), + CODIGO_CATEGORIA_N5 VARCHAR2(50), + NOME_CATEGORIA_N5 VARCHAR2(200), + CODIGO_PRODUTO VARCHAR2(50), + NOME_PRODUTO VARCHAR2(400), + DATA_VENDA DATE NOT NULL, + ANO NUMBER(4) NOT NULL, + MES NUMBER(2) NOT NULL, + DIA NUMBER(2) NOT NULL, + DIA_SEMANA NUMBER(1), + VALOR_VENDA NUMBER(18,4), + CUSTO NUMBER(18,4), + QTD_VENDA NUMBER(10), + DATAINC DATE DEFAULT SYSDATE NOT NULL, + DATAALT DATE DEFAULT SYSDATE NOT NULL + )'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TABLES + WHERE TABLE_NAME = 'TB_FLASH_VENDAS'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_VENDAS CASCADE CONSTRAINTS PURGE'; + END IF; +END; diff --git a/migrations/20260420175946_tgr_flash_vendas.sql b/migrations/20260420175946_tgr_flash_vendas.sql new file mode 100644 index 0000000..686f659 --- /dev/null +++ b/migrations/20260420175946_tgr_flash_vendas.sql @@ -0,0 +1,32 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TRIGGERS + WHERE TRIGGER_NAME = 'TRG_FLASH_VENDAS_BI'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER TRG_FLASH_VENDAS_BI + BEFORE INSERT ON TB_FLASH_VENDAS + FOR EACH ROW + BEGIN + IF :NEW.ID IS NULL THEN + :NEW.ID := SEQ_FLASH_VENDAS.NEXTVAL; + END IF; + END;'; + END IF; +END; + +-- +goose Down +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_TRIGGERS + WHERE TRIGGER_NAME = 'TRG_FLASH_VENDAS_BI'; + + IF v_count > 0 THEN + EXECUTE IMMEDIATE 'DROP TRIGGER TRG_FLASH_VENDAS_BI'; + END IF; +END; diff --git a/migrations/20260420180059_idx_flahs_vendas_02.sql b/migrations/20260420180059_idx_flahs_vendas_02.sql new file mode 100644 index 0000000..9b4c469 --- /dev/null +++ b/migrations/20260420180059_idx_flahs_vendas_02.sql @@ -0,0 +1,16 @@ +-- +goose Up +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(*) INTO v_count + FROM USER_INDEXES + WHERE INDEX_NAME = 'IDX_FLASH_VENDAS_01'; + + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE INDEX IDX_FLASH_VENDAS_01 + ON TB_FLASH_VENDAS (NUMERO_LOJA, DATA_VENDA)'; + END IF; +END; + +-- +goose Down +SELECT 'down SQL query'; diff --git a/migrations/20260420180210_comment_tb_flash_vendas.sql b/migrations/20260420180210_comment_tb_flash_vendas.sql new file mode 100644 index 0000000..51ec58d --- /dev/null +++ b/migrations/20260420180210_comment_tb_flash_vendas.sql @@ -0,0 +1,15 @@ +-- +goose Up +BEGIN + EXECUTE IMMEDIATE 'COMMENT ON TABLE TB_FLASH_VENDAS IS ''Flash de vendas por loja, produto e data'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.ID IS ''Chave primária surrogate — populada via SEQ_FLASH_VENDAS'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.NUMERO_LOJA IS ''Código numérico da loja'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.DATA_VENDA IS ''Data do registro de venda'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.VALOR_VENDA IS ''Valor monetário da venda (4 casas decimais)'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.QTD_VENDA IS ''Quantidade vendida (inteiro)'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.CUSTO IS ''Custo unitário do produto no momento da venda'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.DATAINC IS ''Data/hora de inclusão do registro'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN TB_FLASH_VENDAS.DATAALT IS ''Data/hora da última alteração do registro'''; +END; + +-- +goose Down +SELECT 'down SQL query'; diff --git a/src/flash/flash.module.ts b/src/flash/flash.module.ts index fc22804..b768199 100644 --- a/src/flash/flash.module.ts +++ b/src/flash/flash.module.ts @@ -105,4 +105,13 @@ order by grouping(canalapp) desc, grouping(nomeempresaapp) desc`, }; }, }, + }).withSchedules({ + C5: [ + { + command: 'exec procedure', + cron: 'expressao cron', + name: 'Teste identificador da query', + timeout_seconds: 30 + } + ] }); diff --git a/src/flashperdas/flashperdas.module.ts b/src/flashperdas/flashperdas.module.ts new file mode 100644 index 0000000..67935f1 --- /dev/null +++ b/src/flashperdas/flashperdas.module.ts @@ -0,0 +1,117 @@ +import { createModuleFactory } from "@davinti/jeff"; + +const moduleFactory = createModuleFactory(["C5BIG"]); + +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: "venda_dia", + value_format: "currency", + }, + rows: [ + { + label: "Meta Mês", + column: "meta_mes", + format: "currency_short", + }, + { + label: "VDA", + column: "vda", + format: "currency_short", + }, + { + label: "DMA", + column: "dma", + format: "currency_short", + }, + { + label: "Meta Dia", + column: "meta_dia", + format: "currency_short", + }, + { + label: "Meta Margem Dia", + column: "meta_margem_dia", + format: "percentage", + }, + { + label: "Qtd Clientes", + column: "qtd_clientes", + format: "integer", + }, + { + label: "Ticket Médio", + column: "ticket_medio", + format: "currency", + }, + { + label: "Margem", + column: "margem", + format: "percentage", + accent: true, + }, + ], + }, + params: ["data_venda"], + }, + }, + entrypoint: "flash", + }) + .withImplementations({ + C5BIG: { + 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_venda}, '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`, + }; + }, + }, + }).withSchedules({ + C5BIG: [ + { + command: 'exec procedure', + cron: 'expressao cron', + name: 'Teste identificador da query', + timeout_seconds: 30 + } + ] + });