-- +goose Up -- +goose StatementBegin CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO ( p_data_inicial IN DATE, p_data_final IN DATE ) AS BEGIN DELETE FROM TB_FLASH_NODO_RESUMO_CONTRIBUICAO WHERE data_referencia BETWEEN TRUNC(p_data_inicial) AND TRUNC(p_data_final); INSERT /*+ APPEND */ INTO TB_FLASH_NODO_RESUMO_CONTRIBUICAO ( id_resumo, id_nodo, data_referencia, ano_referencia, mes_referencia, dia_referencia, nro_tickets, vlr_imp_contribuicao, qtde_contribuicao, vlr_contribuicao, vl_ticket_medio, valor_meta_propria, valor_meta_filhos, valor_meta_efetiva, percentual_meta_propria, percentual_meta_filhos, percentual_meta_efetiva, desvio, percentual_atingimento, data_apuracao, nro_segmento, nome_segmento ) WITH hierarquia AS ( SELECT /*+ MATERIALIZE */ CONNECT_BY_ROOT n.id_nodo AS id_nodo_ancestral, n.id_nodo AS id_nodo_descendente FROM TB_FLASH_NODO n CONNECT BY PRIOR n.id_nodo = n.id_nodo_pai ), contribuicao_direta AS ( SELECT /*+ MATERIALIZE */ f.id_nodo, TRUNC(f.data_referencia) AS data_referencia, f.ano_referencia, f.mes_referencia, f.dia_referencia, f.nrosegmento, f.nome_segmento, SUM(f.nro_tickets) AS nro_tickets, SUM(f.vlr_imp_contribuicao) AS vlr_imp_contribuicao, SUM(f.qtde_contribuicao) AS qtde_contribuicao, SUM(f.vlr_contribuicao) AS vlr_contribuicao FROM TB_FLASH_FATO_CONTRIBUICAO f WHERE f.data_referencia BETWEEN TRUNC(p_data_inicial) AND TRUNC(p_data_final) GROUP BY f.id_nodo, TRUNC(f.data_referencia), f.ano_referencia, f.mes_referencia, f.dia_referencia, f.nrosegmento, f.nome_segmento ), contribuicao_hierarquia AS ( SELECT h.id_nodo_ancestral AS id_nodo, cd.data_referencia, cd.ano_referencia, cd.mes_referencia, cd.dia_referencia, cd.nrosegmento, cd.nome_segmento, SUM(cd.nro_tickets) AS nro_tickets, SUM(cd.vlr_imp_contribuicao) AS vlr_imp_contribuicao, SUM(cd.qtde_contribuicao) AS qtde_contribuicao, SUM(cd.vlr_contribuicao) AS vlr_contribuicao FROM hierarquia h JOIN contribuicao_direta cd ON cd.id_nodo = h.id_nodo_descendente GROUP BY h.id_nodo_ancestral, cd.data_referencia, cd.ano_referencia, cd.mes_referencia, cd.dia_referencia, cd.nrosegmento, cd.nome_segmento ), meta_propria_diaria AS ( SELECT /*+ MATERIALIZE */ m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia, MAX(m.percentual_meta) AS percentual_meta_propria, SUM(m.valor_meta) AS valor_meta_propria FROM TB_FLASH_META_CONTRIBUICAO m WHERE m.data_referencia BETWEEN TRUNC(p_data_inicial) AND TRUNC(p_data_final) GROUP BY m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia ), meta_filhos_diaria AS ( SELECT pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia, SUM(mpd.valor_meta_propria) AS valor_meta_filhos FROM TB_FLASH_NODO pai JOIN TB_FLASH_NODO filho ON filho.id_nodo_pai = pai.id_nodo JOIN meta_propria_diaria mpd ON mpd.id_nodo = filho.id_nodo GROUP BY pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia ), base AS ( SELECT DISTINCT n.id_nodo, ch.data_referencia, ch.ano_referencia, ch.mes_referencia, ch.dia_referencia, ch.nrosegmento, ch.nome_segmento FROM contribuicao_hierarquia ch JOIN TB_FLASH_NODO n ON n.id_nodo = ch.id_nodo UNION SELECT DISTINCT n.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia, NULL AS nrosegmento, NULL AS nome_segmento FROM meta_propria_diaria m JOIN TB_FLASH_NODO n ON n.id_nodo = m.id_nodo ), calculo AS ( SELECT b.id_nodo, b.data_referencia, b.ano_referencia, b.mes_referencia, b.dia_referencia, b.nrosegmento, b.nome_segmento, NVL(ch.nro_tickets, 0) AS nro_tickets, NVL(ch.vlr_imp_contribuicao, 0) AS vlr_imp_contribuicao, NVL(ch.qtde_contribuicao, 0) AS qtde_contribuicao, NVL(ch.vlr_contribuicao, 0) AS vlr_contribuicao, mpd.valor_meta_propria, mfd.valor_meta_filhos, mpd.percentual_meta_propria, CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END AS valor_meta_efetiva FROM base b LEFT JOIN contribuicao_hierarquia ch ON ch.id_nodo = b.id_nodo AND ch.data_referencia = b.data_referencia AND ch.nrosegmento = b.nrosegmento LEFT JOIN meta_propria_diaria mpd ON mpd.id_nodo = b.id_nodo AND mpd.data_referencia = b.data_referencia LEFT JOIN meta_filhos_diaria mfd ON mfd.id_nodo = b.id_nodo AND mfd.data_referencia = b.data_referencia ) SELECT SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO.NEXTVAL, c.id_nodo, c.data_referencia, c.ano_referencia, c.mes_referencia, c.dia_referencia, c.nro_tickets, c.vlr_imp_contribuicao, c.qtde_contribuicao, c.vlr_contribuicao, CASE WHEN c.nro_tickets > 0 THEN c.vlr_contribuicao / c.nro_tickets ELSE NULL END, c.valor_meta_propria, c.valor_meta_filhos, c.valor_meta_efetiva, c.percentual_meta_propria, CAST(NULL AS NUMBER(10,4)), CASE WHEN c.percentual_meta_propria IS NOT NULL THEN c.percentual_meta_propria ELSE NULL END, c.vlr_contribuicao - NVL(c.valor_meta_efetiva, 0), CASE WHEN NVL(c.valor_meta_efetiva, 0) = 0 THEN NULL ELSE (c.vlr_contribuicao / c.valor_meta_efetiva) * 100 END, SYSDATE, c.nrosegmento, c.nome_segmento FROM calculo c; COMMIT; END; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO' AND object_type = 'PROCEDURE'; IF v_count > 0 THEN EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO'; END IF; END; -- +goose StatementEnd