-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_CONTRIBUICAO (
    p_data_inicial IN DATE,
    p_data_final   IN DATE,
    p_empresa      IN NUMBER
) AS
    v_id_empresa   NUMBER;
    v_id_cat1      NUMBER;
    v_id_cat2      NUMBER;
    v_id_cat3      NUMBER;
    v_id_cat4      NUMBER;
    v_id_cat5      NUMBER;
    v_id_produto   NUMBER;
    v_contador     NUMBER := 0;

    FUNCTION FN_GET_OR_CREATE_NODO (
        p_id_nodo_pai    IN NUMBER,
        p_tipo_nodo      IN VARCHAR2,
        p_codigo         IN VARCHAR2,
        p_nome           IN VARCHAR2,
        p_nivel          IN NUMBER,
        p_cod_empresa    IN NUMBER DEFAULT NULL,
        p_cod_produto    IN NUMBER DEFAULT NULL,
        p_seqprodutobase IN NUMBER DEFAULT NULL
    ) RETURN NUMBER
    IS
        v_id_nodo NUMBER;
    BEGIN
        SELECT n.id_nodo
          INTO v_id_nodo
          FROM TB_FLASH_NODO n
         WHERE (
                  n.id_nodo_pai = p_id_nodo_pai
               OR (n.id_nodo_pai IS NULL AND p_id_nodo_pai IS NULL)
               )
           AND n.tipo_nodo = p_tipo_nodo
           AND n.codigo = p_codigo
           AND (
                  p_tipo_nodo <> 'PRODUTO'
               OR (
                       n.cod_empresa = p_cod_empresa
                    OR (n.cod_empresa IS NULL AND p_cod_empresa IS NULL)
                  )
               );

        UPDATE TB_FLASH_NODO n
           SET n.nome             = p_nome,
               n.cod_empresa      = p_cod_empresa,
               n.cod_produto      = p_cod_produto,
               n.seqprodutobase   = p_seqprodutobase,
               n.data_atualizacao = SYSDATE
         WHERE n.id_nodo = v_id_nodo
           AND (
                  NVL(n.nome, '#') <> NVL(p_nome, '#')
               OR NVL(n.cod_empresa, -1) <> NVL(p_cod_empresa, -1)
               OR NVL(n.cod_produto, -1) <> NVL(p_cod_produto, -1)
               OR NVL(n.seqprodutobase, -1) <> NVL(p_seqprodutobase, -1)
               );

        RETURN v_id_nodo;

    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_id_nodo := SEQ_TB_FLASH_NODO.NEXTVAL;

            INSERT INTO TB_FLASH_NODO (
                id_nodo, id_nodo_pai, tipo_nodo, codigo, nome, nivel,
                ordem_exibicao, ativo, cod_empresa, cod_produto, seqprodutobase,
                data_cadastro, data_atualizacao
            ) VALUES (
                v_id_nodo, p_id_nodo_pai, p_tipo_nodo, p_codigo, p_nome, p_nivel,
                NULL, 'S', p_cod_empresa, p_cod_produto, p_seqprodutobase,
                SYSDATE, NULL
            );

            RETURN v_id_nodo;
    END;

BEGIN
    DELETE FROM TB_FLASH_FATO_CONTRIBUICAO
     WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
       AND cod_empresa = p_empresa;

    FOR r IN (
        SELECT Z.DTA,
    	   Z.NROEMPRESA,
    	   Z.NOMEEMPRESA,
    	   Z.NROSEGMENTO,
    	   Z.NRODIVISAO,
    	   Z.SEQPRODUTO,
    	   Z.SEQPRODUTOBASE,
    	   Z.PRODUTO,
    	   Z.SEQCATEGORIAN1,
    	   Z.CATEGORIAN1,
    	   Z.SEQCATEGORIAN2,
    	   Z.CATEGORIAN2,
    	   Z.SEQCATEGORIAN3,
    	   Z.CATEGORIAN3,
    	   Z.SEQCATEGORIAN4,
    	   Z.CATEGORIAN4,
    	   Z.SEQCATEGORIAN5,
    	   Z.CATEGORIAN5,
    	   Z.VLRVENDA,
    	   (CASE WHEN (Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) < TO_DATE('01/09/2022','DD/MM/YYYY'))
	                OR ( Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) > TO_DATE('01/01/2024','DD/MM/YYYY')) THEN
	               Z.VLRVENDA - (Z.QTDE_VENDA * (SELECT nvl(ROUND((CD.CMDIAVLRNF + CD.CMDIAIPI  + CD.CMDIAICMSST + CD.CMDIADESPNF + CD.CMDIADESPFORANF -
	                       CD.CMDIACREDICMS - CD.CMDIACREDICMSPRESUM - CD.CMDIACREDICMSANTECIP - CD.CMDIACREDPIS - CD.CMDIACREDCOFINS- CD.CMDIADCTOFORANF),4),0)
	                  FROM MRL_CUSTODIA CD
	                 WHERE CD.SEQPRODUTO = (CASE WHEN Z.SEQPRODUTOBASE IS NULL THEN Z.SEQPRODUTO ELSE Z.SEQPRODUTOBASE END)
	                   AND CD.NROEMPRESA = 301
	                   AND CD.DTAENTRADASAIDA = (
	                      SELECT MAX(CD1.DTAENTRADASAIDA)
	                        FROM  MRL_CUSTODIA CD1
	                       WHERE CD1.SEQPRODUTO = CD.SEQPRODUTO
	                         AND CD1.NROEMPRESA = 301
	                         AND CD1.DTAENTRADASAIDA <= Z.DTA
	                   )
	               )) - Z.VLR_IMP_VENDA
		      ELSE
		      	Z.VLRCONTRIB
		      END) AS VLRCONTRIB,
    	   Z.VLRVENDA_MES_ANT,
    	   Z.VLRCONTRIB_MES_ANT,
    	   Z.VLRVENDA_ANO_ANT,
    	   Z.VLRCONTRIB_ANO_ANT,
    	   Z.QTDE_VENDA,
    	   Z.VLR_IMP_VENDA,
    	   Z.PROPQTDPRODUTOBASE
    	FROM (SELECT /*+OPTIMIZER_FEATURES_ENABLE('10.2.0.4')*/
                     TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' ) DTA,
                     V.NROEMPRESA,
                     E.FANTASIA AS NOMEEMPRESA,
                     V.NROSEGMENTO,
                     V.NRODIVISAO,
                     V.SEQPRODUTO,
                     A.SEQPRODUTOBASE,
                     A.DESCCOMPLETA PRODUTO,
                     CC1.SEQCATEGORIA AS SEQCATEGORIAN1,
                     CC1.CATEGORIA AS CATEGORIAN1,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR in ('A', 'F')
                             AND CC2.NIVELHIERARQUIA = 2
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS in ('A', 'F')
                     ) AS SEQCATEGORIAN2,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR in ('A', 'F')
                             AND CC2.NIVELHIERARQUIA = 2
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS in ('A', 'F')
                     ) AS CATEGORIAN2,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 3
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN3,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 3
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN3,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 4
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN4,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 4
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN4,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 5
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN5,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 5
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN5,
                     SUM( ( V.QTDITEM - NVL( V.QTDDEVOLITEM, 0 ) ) ) AS QTDE_VENDA,
                     SUM( ( ROUND( V.VLRITEM, 2 ) ) - ( ROUND( V.VLRDEVOLITEM, 2 ) - ( 0 ) ) ) AS VLRVENDA,
                     SUM( DECODE(
                         V.ACMCOMPRAVENDA, 'I', ( V.VLRITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
                         DECODE( Y.QTDVDA * V.QTDITEM, 0, 0, ( Y.VLRIMPOSTOVDA - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDITEM )
                         )
                         - DECODE(
                         V.ACMCOMPRAVENDA, 'I', ( V.VLRDEVOLITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
                         DECODE( Y.QTDVDA * V.QTDDEVOLITEM, 0, 0, ( Y.VLRIMPOSTODEVOL - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDDEVOLITEM )
                         )
                         + DECODE(
                         V.ACMCOMPRAVENDA, 'I', 0,
                         DECODE( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
                         + V.VLRFCPICMS + V.PISITEM + V.COFINSITEM -
                         DECODE( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
                         - V.DVLRFCPICMS - V.PISDEVOLITEM - V.COFINSDEVOLITEM
                         )
                     ) AS VLR_IMP_VENDA
                     , sum(
                         consinco.fC5_AbcDistribLucratividade(
                         'L',
                         'L',
                         'N',
                         V.VLRITEM ,
                         'N',
                         V.VLRICMSST,
                         V.VLRFCPST,
                         V.VLRICMSSTEMPORIG,
                         E.UF,
                         V.UFPESSOA,
                         'S',
                         null,
                         'N',
                         V.VLRIPIITEM,
                         V.VLRIPIDEVOLITEM,
                         'N',
                         V.VLRDESCFORANF,
                         Y.CMDIAVLRNF - 0 ,
                         Y.CMDIAIPI,
                         nvl( Y.CMDIACREDPIS, 0 ),
                         nvl( Y.CMDIACREDCOFINS, 0 ),
                         Y.CMDIAICMSST,
                         Y.CMDIADESPNF,
                         Y.CMDIADESPFORANF,
                         Y.CMDIADCTOFORANF,
                         'S',
                         a.propqtdprodutobase,
                         V.QTDITEM,
                         V.VLREMBDESCRESSARCST,
                         V.ACMCOMPRAVENDA,
                         V.PISITEM,
                         V.COFINSITEM,
                         decode( V.TIPCGO, 'S', Y.QTDVDA, nvl( Y.QTDDEVOL, Y.QTDVDA ) ),
                         ( decode( V.TIPCGO, 'S', Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ),
                         nvl( Y.VLRIMPOSTODEVOL - nvl( V.VLRIPIDEVOLITEM, 0 ),
                         Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ) ) ) ) ,
                         'N',
                         V.VLRDESPOPERACIONALITEM,
                         Y.VLRDESPESAVDA,
                         'N',
                         nvl( Y.VLRVERBAVDAACR, 0 ),
                         DECODE( V.TIPDOCFISCALCGO, 'T', 0, Y.QTDVERBAVDA ),
                         Y.VLRVERBAVDA - nvl( Y.VLRVERBAVDAINDEVIDA, 0 ),
                         'N',
                         NVL(V.VLRTOTCOMISSAOITEM, 0),
                         V.VLRDEVOLITEM,
                         VLRDEVOLICMSST,
                         V.DVLRFCPST,
                         V.QTDDEVOLITEM,
                         V.PISDEVOLITEM,
                         V.COFINSDEVOLITEM,
                         V.VLRDESPOPERACIONALITEMDEVOL,
                         V.VLRTOTCOMISSAOITEMDEVOL,
                         E.PERIRLUCRAT,
                         E.PERCSLLLUCRAT,
                         Y.CMDIACREDICMS,
                         decode( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
                         + 0 ,
                         V.VLRFCPICMS,
                         V.PERCPMF,
                         V.PEROUTROIMPOSTO,
                         decode( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
                         + 0 ,
                         V.DVLRFCPICMS,
                         case when ( 'N' ) = 'N' then
                         (nvl(y.cmdiavlrdescpistransf,0) + nvl(y.cmdiavlrdesccofinstransf,0) + nvl(y.cmdiavlrdescicmstransf,0) +
                         nvl(y.cmdiavlrdescipitransf,0) + nvl(y.cmdiavlrdesclucrotransf,0) + nvl(y.cmdiavlrdescverbatransf,0) )
                         else 0
                         end,
                         case when DV.UTILACRESCCUSTPRODRELAC = 'S' and nvl( A.SEQPRODUTOBASE, A.SEQPRODUTOBASEANTIGO ) is not null then
                         coalesce( PR.PERCACRESCCUSTORELACVIG, nvl( consinco.F_RETACRESCCUSTORELACABC( V.SEQPRODUTO, V.DTAVDA ), 1 ) )
                         else 1
                         end,
                         'N',
                         0,
                         0,
                         'S',
                         V.VLRDESCMEDALHA,
                         'S',
                         V.VLRDESCFORNEC,
                         V.VLRDESCFORNECDEVOL,
                         'N',
                         V.VLRFRETEITEMRATEIO,
                         V.VLRFRETEITEMRATEIODEV,
                         'S',
                         V.VLRICMSSTEMBUTPROD,
                         V.VLRICMSSTEMBUTPRODDEV,
                         V.VLREMBDESCRESSARCSTDEVOL,
                         case when 'N' = 'S' then nvl( V.VLRDESCACORDOVERBAPDV, 0 ) else 0 end,
                         nvl( Y.CMDIACREDIPI, 0 ),
                         NVL(V.VLRITEMRATEIOCTE,0),
                         'N',
                         'C',
                         V.VLRIPIPRECOVDA,
                         V.VLRIPIPRECODEVOL,
                         V.VLRDESCMEDALHADEVOL,
                         'N'
                         )) AS VLRCONTRIB
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_MES_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_MES_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_ANO_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_ANO_ANT
                     , MAX(A.PROPQTDPRODUTOBASE) AS PROPQTDPRODUTOBASE
                FROM consinco.MRL_CUSTODIA Y
                JOIN consinco.MAXV_ABCDISTRIBBASE V ON Y.DTAENTRADASAIDA = V.DTAVDA
                JOIN consinco.MAP_PRODUTO A ON A.SEQPRODUTO = V.SEQPRODUTO
                JOIN consinco.MAP_PRODUTO PB ON PB.SEQPRODUTO = V.SEQPRODUTOCUSTO AND PB.SEQPRODUTO = Y.SEQPRODUTO
                JOIN consinco.MAP_FAMDIVISAO D ON D.SEQFAMILIA = A.SEQFAMILIA AND D.NRODIVISAO = V.NRODIVISAO
                JOIN consinco.MAP_FAMEMBALAGEM K ON K.SEQFAMILIA = A.SEQFAMILIA AND K.QTDEMBALAGEM = 1
                JOIN consinco.MAX_EMPRESA E ON E.NROEMPRESA = V.NROEMPRESA AND Y.NROEMPRESA = NVL( E.NROEMPCUSTOABC, E.NROEMPRESA )
                JOIN consinco.MAX_DIVISAO DV ON E.NRODIVISAO = DV.NRODIVISAO
                JOIN consinco.MAP_FAMDIVCATEG DC ON DC.NRODIVISAO = D.NRODIVISAO AND DC.STATUS = 'A' AND DC.SEQFAMILIA = D.SEQFAMILIA
                JOIN consinco.MAP_CATEGORIA CC1 ON CC1.SEQCATEGORIA = DC.SEQCATEGORIA AND CC1.STATUSCATEGOR in ('A', 'F') AND CC1.NIVELHIERARQUIA = 1 AND CC1.NRODIVISAO = DC.NRODIVISAO AND CC1.TIPCATEGORIA = 'M'
                LEFT JOIN consinco.MAP_PRODACRESCCUSTORELAC PR ON PR.SEQPRODUTO = V.SEQPRODUTO AND PR.DTAMOVIMENTACAO = V.DTAVDA
                WHERE V.NROEMPRESA IN ( SELECT E.EMPRESA_ID FROM EMPRESA_PARAMETROS E WHERE E.PARTICIPA_FLASH = 1 )
                AND V.NROEMPRESA = p_empresa
                AND V.NROSEGMENTO IN ( SELECT A.NROSEGMENTO FROM CONSINCO.MAD_SEGMENTO A WHERE A.STATUS = 'A' )
                AND DECODE(V.TIPTABELA, 'S', V.CGOACMCOMPRAVENDA, V.ACMCOMPRAVENDA) IN ( 'S','I' )
                AND V.DTAVDA BETWEEN p_data_inicial AND p_data_final
                GROUP BY TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' )
                            , V.NROEMPRESA
                            , E.FANTASIA
                            , V.NRODIVISAO
                            , V.NROSEGMENTO
                            , V.SEQPRODUTO
                            , A.SEQPRODUTOBASE
                            , A.SEQFAMILIA
                            , A.DESCCOMPLETA
                            , CC1.SEQCATEGORIA
                            , CC1.CATEGORIA) Z
    ) LOOP

        v_id_empresa := FN_GET_OR_CREATE_NODO(NULL, 'EMPRESA', TO_CHAR(r.NROEMPRESA), r.NOMEEMPRESA, 1, r.NROEMPRESA);

        IF r.SEQCATEGORIAN1 IS NOT NULL THEN
            v_id_cat1 := FN_GET_OR_CREATE_NODO(v_id_empresa, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN1), r.CATEGORIAN1, 2, r.NROEMPRESA);
        ELSE v_id_cat1 := v_id_empresa; END IF;

        IF r.SEQCATEGORIAN2 IS NOT NULL THEN
            v_id_cat2 := FN_GET_OR_CREATE_NODO(v_id_cat1, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN2), r.CATEGORIAN2, 3, r.NROEMPRESA);
        ELSE v_id_cat2 := v_id_cat1; END IF;

        IF r.SEQCATEGORIAN3 IS NOT NULL THEN
            v_id_cat3 := FN_GET_OR_CREATE_NODO(v_id_cat2, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN3), r.CATEGORIAN3, 4, r.NROEMPRESA);
        ELSE v_id_cat3 := v_id_cat2; END IF;

        IF r.SEQCATEGORIAN4 IS NOT NULL THEN
            v_id_cat4 := FN_GET_OR_CREATE_NODO(v_id_cat3, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN4), r.CATEGORIAN4, 5, r.NROEMPRESA);
        ELSE v_id_cat4 := v_id_cat3; END IF;

        IF r.SEQCATEGORIAN5 IS NOT NULL THEN
            v_id_cat5 := FN_GET_OR_CREATE_NODO(v_id_cat4, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN5), r.CATEGORIAN5, 6, r.NROEMPRESA);
        ELSE v_id_cat5 := v_id_cat4; END IF;

        v_id_produto := FN_GET_OR_CREATE_NODO(v_id_cat5, 'PRODUTO', TO_CHAR(r.SEQPRODUTO), r.PRODUTO, 7, r.NROEMPRESA, r.SEQPRODUTO, r.SEQPRODUTOBASE);

        INSERT INTO TB_FLASH_FATO_CONTRIBUICAO (
            id_fato, data_referencia, ano_referencia, mes_referencia, dia_referencia, dia_semana,
            id_nodo, id_nodo_empresa, cod_empresa, nome_empresa, cod_produto, descricao_produto,
            seqprodutobase, nrodivisao, nrosegmento, nro_tickets, vlr_imp_contribuicao, qtde_contribuicao,
            vlr_contribuicao, vl_ticket_medio, propqtdprodutobase, data_cadastro
        ) VALUES (
            SEQ_TB_FLASH_FATO_CONTRIBUICAO.NEXTVAL,
            r.DTA, EXTRACT(YEAR FROM r.DTA), EXTRACT(MONTH FROM r.DTA), EXTRACT(DAY FROM r.DTA),
            TO_NUMBER(TO_CHAR(r.DTA, 'D')),
            v_id_produto, v_id_empresa, r.NROEMPRESA, r.NOMEEMPRESA, r.SEQPRODUTO, r.PRODUTO,
            r.SEQPRODUTOBASE, r.NRODIVISAO, r.NROSEGMENTO, r.QTDE_VENDA, r.VLR_IMP_VENDA,
            r.QTDE_VENDA, r.VLRCONTRIB,
            CASE WHEN r.QTDE_VENDA > 0 THEN r.VLRVENDA / r.QTDE_VENDA ELSE NULL END,
            r.PROPQTDPRODUTOBASE, SYSDATE
        );

    END LOOP;

    COMMIT;
END;
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_CONTRIBUICAO (
    p_data_inicial IN DATE,
    p_data_final   IN DATE,
    p_empresa      IN NUMBER
) AS
    v_id_empresa   NUMBER;
    v_id_cat1      NUMBER;
    v_id_cat2      NUMBER;
    v_id_cat3      NUMBER;
    v_id_cat4      NUMBER;
    v_id_cat5      NUMBER;
    v_id_produto   NUMBER;
    v_contador     NUMBER := 0;

    FUNCTION FN_GET_OR_CREATE_NODO (
        p_id_nodo_pai    IN NUMBER,
        p_tipo_nodo      IN VARCHAR2,
        p_codigo         IN VARCHAR2,
        p_nome           IN VARCHAR2,
        p_nivel          IN NUMBER,
        p_cod_empresa    IN NUMBER DEFAULT NULL,
        p_cod_produto    IN NUMBER DEFAULT NULL,
        p_seqprodutobase IN NUMBER DEFAULT NULL
    ) RETURN NUMBER
    IS
        v_id_nodo NUMBER;
    BEGIN
        SELECT n.id_nodo
          INTO v_id_nodo
          FROM TB_FLASH_NODO n
         WHERE (
                  n.id_nodo_pai = p_id_nodo_pai
               OR (n.id_nodo_pai IS NULL AND p_id_nodo_pai IS NULL)
               )
           AND n.tipo_nodo = p_tipo_nodo
           AND n.codigo = p_codigo
           AND (
                  p_tipo_nodo <> 'PRODUTO'
               OR (
                       n.cod_empresa = p_cod_empresa
                    OR (n.cod_empresa IS NULL AND p_cod_empresa IS NULL)
                  )
               );

        UPDATE TB_FLASH_NODO n
           SET n.nome             = p_nome,
               n.cod_empresa      = p_cod_empresa,
               n.cod_produto      = p_cod_produto,
               n.seqprodutobase   = p_seqprodutobase,
               n.data_atualizacao = SYSDATE
         WHERE n.id_nodo = v_id_nodo
           AND (
                  NVL(n.nome, '#') <> NVL(p_nome, '#')
               OR NVL(n.cod_empresa, -1) <> NVL(p_cod_empresa, -1)
               OR NVL(n.cod_produto, -1) <> NVL(p_cod_produto, -1)
               OR NVL(n.seqprodutobase, -1) <> NVL(p_seqprodutobase, -1)
               );

        RETURN v_id_nodo;

    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_id_nodo := SEQ_TB_FLASH_NODO.NEXTVAL;

            INSERT INTO TB_FLASH_NODO (
                id_nodo, id_nodo_pai, tipo_nodo, codigo, nome, nivel,
                ordem_exibicao, ativo, cod_empresa, cod_produto, seqprodutobase,
                data_cadastro, data_atualizacao
            ) VALUES (
                v_id_nodo, p_id_nodo_pai, p_tipo_nodo, p_codigo, p_nome, p_nivel,
                NULL, 'S', p_cod_empresa, p_cod_produto, p_seqprodutobase,
                SYSDATE, NULL
            );

            RETURN v_id_nodo;
    END;

BEGIN
    DELETE FROM TB_FLASH_FATO_CONTRIBUICAO
     WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
       AND cod_empresa = p_empresa;

    FOR r IN (
        SELECT Z.DTA,
    	   Z.NROEMPRESA,
    	   Z.NOMEEMPRESA,
    	   Z.NROSEGMENTO,
    	   Z.NRODIVISAO,
    	   Z.SEQPRODUTO,
    	   Z.SEQPRODUTOBASE,
    	   Z.PRODUTO,
    	   Z.SEQCATEGORIAN1,
    	   Z.CATEGORIAN1,
    	   Z.SEQCATEGORIAN2,
    	   Z.CATEGORIAN2,
    	   Z.SEQCATEGORIAN3,
    	   Z.CATEGORIAN3,
    	   Z.SEQCATEGORIAN4,
    	   Z.CATEGORIAN4,
    	   Z.SEQCATEGORIAN5,
    	   Z.CATEGORIAN5,
    	   Z.VLRVENDA,
    	   (CASE WHEN (Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) < TO_DATE('01/09/2022','DD/MM/YYYY'))
	                OR ( Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) > TO_DATE('01/01/2024','DD/MM/YYYY')) THEN
	               Z.VLRVENDA - (Z.QTDE_VENDA * (SELECT nvl(ROUND((CD.CMDIAVLRNF + CD.CMDIAIPI  + CD.CMDIAICMSST + CD.CMDIADESPNF + CD.CMDIADESPFORANF -
	                       CD.CMDIACREDICMS - CD.CMDIACREDICMSPRESUM - CD.CMDIACREDICMSANTECIP - CD.CMDIACREDPIS - CD.CMDIACREDCOFINS- CD.CMDIADCTOFORANF),4),0)
	                  FROM MRL_CUSTODIA CD
	                 WHERE CD.SEQPRODUTO = (CASE WHEN Z.SEQPRODUTOBASE IS NULL THEN Z.SEQPRODUTO ELSE Z.SEQPRODUTOBASE END)
	                   AND CD.NROEMPRESA = 301
	                   AND CD.DTAENTRADASAIDA = (
	                      SELECT MAX(CD1.DTAENTRADASAIDA)
	                        FROM  MRL_CUSTODIA CD1
	                       WHERE CD1.SEQPRODUTO = CD.SEQPRODUTO
	                         AND CD1.NROEMPRESA = 301
	                         AND CD1.DTAENTRADASAIDA <= Z.DTA
	                   )
	               )) - Z.VLR_IMP_VENDA
		      ELSE
		      	Z.VLRCONTRIB
		      END) AS VLRCONTRIB,
    	   Z.VLRVENDA_MES_ANT,
    	   Z.VLRCONTRIB_MES_ANT,
    	   Z.VLRVENDA_ANO_ANT,
    	   Z.VLRCONTRIB_ANO_ANT,
    	   Z.QTDE_VENDA,
    	   Z.VLR_IMP_VENDA,
    	   Z.PROPQTDPRODUTOBASE
    	FROM (SELECT /*+OPTIMIZER_FEATURES_ENABLE('10.2.0.4')*/
                     TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' ) DTA,
                     V.NROEMPRESA,
                     E.FANTASIA AS NOMEEMPRESA,
                     V.NROSEGMENTO,
                     V.NRODIVISAO,
                     V.SEQPRODUTO,
                     A.SEQPRODUTOBASE,
                     A.DESCCOMPLETA PRODUTO,
                     CC1.SEQCATEGORIA AS SEQCATEGORIAN1,
                     CC1.CATEGORIA AS CATEGORIAN1,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR in ('A', 'F')
                             AND CC2.NIVELHIERARQUIA = 2
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS in ('A', 'F')
                     ) AS SEQCATEGORIAN2,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR in ('A', 'F')
                             AND CC2.NIVELHIERARQUIA = 2
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS in ('A', 'F')
                     ) AS CATEGORIAN2,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 3
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN3,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 3
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN3,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 4
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN4,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 4
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN4,
                     ( SELECT CC2.SEQCATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 5
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS SEQCATEGORIAN5,
                     ( SELECT CC2.CATEGORIA
                         FROM consinco.MAP_FAMDIVCATEG DC2
                         JOIN consinco.MAP_CATEGORIA CC2
                             ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
                             AND CC2.STATUSCATEGOR = 'A'
                             AND CC2.NIVELHIERARQUIA = 5
                             AND CC2.NRODIVISAO = DC2.NRODIVISAO
                             AND CC2.TIPCATEGORIA = 'M'
                         WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
                             AND DC2.NRODIVISAO = V.NRODIVISAO
                             AND DC2.STATUS = 'A'
                     ) AS CATEGORIAN5,
                     SUM( ( V.QTDITEM - NVL( V.QTDDEVOLITEM, 0 ) ) ) AS QTDE_VENDA,
                     SUM( ( ROUND( V.VLRITEM, 2 ) ) - ( ROUND( V.VLRDEVOLITEM, 2 ) - ( 0 ) ) ) AS VLRVENDA,
                     SUM( DECODE(
                         V.ACMCOMPRAVENDA, 'I', ( V.VLRITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
                         DECODE( Y.QTDVDA * V.QTDITEM, 0, 0, ( Y.VLRIMPOSTOVDA - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDITEM )
                         )
                         - DECODE(
                         V.ACMCOMPRAVENDA, 'I', ( V.VLRDEVOLITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
                         DECODE( Y.QTDVDA * V.QTDDEVOLITEM, 0, 0, ( Y.VLRIMPOSTODEVOL - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDDEVOLITEM )
                         )
                         + DECODE(
                         V.ACMCOMPRAVENDA, 'I', 0,
                         DECODE( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
                         + V.VLRFCPICMS + V.PISITEM + V.COFINSITEM -
                         DECODE( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
                         - V.DVLRFCPICMS - V.PISDEVOLITEM - V.COFINSDEVOLITEM
                         )
                     ) AS VLR_IMP_VENDA
                     , sum(
                         consinco.fC5_AbcDistribLucratividade(
                         'L',
                         'L',
                         'N',
                         V.VLRITEM ,
                         'N',
                         V.VLRICMSST,
                         V.VLRFCPST,
                         V.VLRICMSSTEMPORIG,
                         E.UF,
                         V.UFPESSOA,
                         'S',
                         null,
                         'N',
                         V.VLRIPIITEM,
                         V.VLRIPIDEVOLITEM,
                         'N',
                         V.VLRDESCFORANF,
                         Y.CMDIAVLRNF - 0 ,
                         Y.CMDIAIPI,
                         nvl( Y.CMDIACREDPIS, 0 ),
                         nvl( Y.CMDIACREDCOFINS, 0 ),
                         Y.CMDIAICMSST,
                         Y.CMDIADESPNF,
                         Y.CMDIADESPFORANF,
                         Y.CMDIADCTOFORANF,
                         'S',
                         a.propqtdprodutobase,
                         V.QTDITEM,
                         V.VLREMBDESCRESSARCST,
                         V.ACMCOMPRAVENDA,
                         V.PISITEM,
                         V.COFINSITEM,
                         decode( V.TIPCGO, 'S', Y.QTDVDA, nvl( Y.QTDDEVOL, Y.QTDVDA ) ),
                         ( decode( V.TIPCGO, 'S', Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ),
                         nvl( Y.VLRIMPOSTODEVOL - nvl( V.VLRIPIDEVOLITEM, 0 ),
                         Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ) ) ) ) ,
                         'N',
                         V.VLRDESPOPERACIONALITEM,
                         Y.VLRDESPESAVDA,
                         'N',
                         nvl( Y.VLRVERBAVDAACR, 0 ),
                         DECODE( V.TIPDOCFISCALCGO, 'T', 0, Y.QTDVERBAVDA ),
                         Y.VLRVERBAVDA - nvl( Y.VLRVERBAVDAINDEVIDA, 0 ),
                         'N',
                         NVL(V.VLRTOTCOMISSAOITEM, 0),
                         V.VLRDEVOLITEM,
                         VLRDEVOLICMSST,
                         V.DVLRFCPST,
                         V.QTDDEVOLITEM,
                         V.PISDEVOLITEM,
                         V.COFINSDEVOLITEM,
                         V.VLRDESPOPERACIONALITEMDEVOL,
                         V.VLRTOTCOMISSAOITEMDEVOL,
                         E.PERIRLUCRAT,
                         E.PERCSLLLUCRAT,
                         Y.CMDIACREDICMS,
                         decode( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
                         + 0 ,
                         V.VLRFCPICMS,
                         V.PERCPMF,
                         V.PEROUTROIMPOSTO,
                         decode( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
                         + 0 ,
                         V.DVLRFCPICMS,
                         case when ( 'N' ) = 'N' then
                         (nvl(y.cmdiavlrdescpistransf,0) + nvl(y.cmdiavlrdesccofinstransf,0) + nvl(y.cmdiavlrdescicmstransf,0) +
                         nvl(y.cmdiavlrdescipitransf,0) + nvl(y.cmdiavlrdesclucrotransf,0) + nvl(y.cmdiavlrdescverbatransf,0) )
                         else 0
                         end,
                         case when DV.UTILACRESCCUSTPRODRELAC = 'S' and nvl( A.SEQPRODUTOBASE, A.SEQPRODUTOBASEANTIGO ) is not null then
                         coalesce( PR.PERCACRESCCUSTORELACVIG, nvl( consinco.F_RETACRESCCUSTORELACABC( V.SEQPRODUTO, V.DTAVDA ), 1 ) )
                         else 1
                         end,
                         'N',
                         0,
                         0,
                         'S',
                         V.VLRDESCMEDALHA,
                         'S',
                         V.VLRDESCFORNEC,
                         V.VLRDESCFORNECDEVOL,
                         'N',
                         V.VLRFRETEITEMRATEIO,
                         V.VLRFRETEITEMRATEIODEV,
                         'S',
                         V.VLRICMSSTEMBUTPROD,
                         V.VLRICMSSTEMBUTPRODDEV,
                         V.VLREMBDESCRESSARCSTDEVOL,
                         case when 'N' = 'S' then nvl( V.VLRDESCACORDOVERBAPDV, 0 ) else 0 end,
                         nvl( Y.CMDIACREDIPI, 0 ),
                         NVL(V.VLRITEMRATEIOCTE,0),
                         'N',
                         'C',
                         V.VLRIPIPRECOVDA,
                         V.VLRIPIPRECODEVOL,
                         V.VLRDESCMEDALHADEVOL,
                         'N'
                         )) AS VLRCONTRIB
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_MES_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_MES_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_ANO_ANT
                     , CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_ANO_ANT
                     , MAX(A.PROPQTDPRODUTOBASE) AS PROPQTDPRODUTOBASE
                FROM consinco.MRL_CUSTODIA Y
                JOIN consinco.MAXV_ABCDISTRIBBASE V ON Y.DTAENTRADASAIDA = V.DTAVDA
                JOIN consinco.MAP_PRODUTO A ON A.SEQPRODUTO = V.SEQPRODUTO
                JOIN consinco.MAP_PRODUTO PB ON PB.SEQPRODUTO = V.SEQPRODUTOCUSTO AND PB.SEQPRODUTO = Y.SEQPRODUTO
                JOIN consinco.MAP_FAMDIVISAO D ON D.SEQFAMILIA = A.SEQFAMILIA AND D.NRODIVISAO = V.NRODIVISAO
                JOIN consinco.MAP_FAMEMBALAGEM K ON K.SEQFAMILIA = A.SEQFAMILIA AND K.QTDEMBALAGEM = 1
                JOIN consinco.MAX_EMPRESA E ON E.NROEMPRESA = V.NROEMPRESA AND Y.NROEMPRESA = NVL( E.NROEMPCUSTOABC, E.NROEMPRESA )
                JOIN consinco.MAX_DIVISAO DV ON E.NRODIVISAO = DV.NRODIVISAO
                JOIN consinco.MAP_FAMDIVCATEG DC ON DC.NRODIVISAO = D.NRODIVISAO AND DC.STATUS = 'A' AND DC.SEQFAMILIA = D.SEQFAMILIA
                JOIN consinco.MAP_CATEGORIA CC1 ON CC1.SEQCATEGORIA = DC.SEQCATEGORIA AND CC1.STATUSCATEGOR in ('A', 'F') AND CC1.NIVELHIERARQUIA = 1 AND CC1.NRODIVISAO = DC.NRODIVISAO AND CC1.TIPCATEGORIA = 'M'
                LEFT JOIN consinco.MAP_PRODACRESCCUSTORELAC PR ON PR.SEQPRODUTO = V.SEQPRODUTO AND PR.DTAMOVIMENTACAO = V.DTAVDA
                WHERE V.NROEMPRESA IN ( SELECT E.EMPRESA_ID FROM EMPRESA_PARAMETROS E WHERE E.PARTICIPA_FLASH = 1 )
                AND V.NROSEGMENTO IN ( SELECT A.NROSEGMENTO FROM CONSINCO.MAD_SEGMENTO A WHERE A.STATUS = 'A' )
                AND DECODE(V.TIPTABELA, 'S', V.CGOACMCOMPRAVENDA, V.ACMCOMPRAVENDA) IN ( 'S','I' )
                AND V.DTAVDA BETWEEN p_data_inicial AND p_data_final
                GROUP BY TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' )
                            , V.NROEMPRESA
                            , E.FANTASIA
                            , V.NRODIVISAO
                            , V.NROSEGMENTO
                            , V.SEQPRODUTO
                            , A.SEQPRODUTOBASE
                            , A.SEQFAMILIA
                            , A.DESCCOMPLETA
                            , CC1.SEQCATEGORIA
                            , CC1.CATEGORIA) Z
    ) LOOP

        v_id_empresa := FN_GET_OR_CREATE_NODO(NULL, 'EMPRESA', TO_CHAR(r.NROEMPRESA), r.NOMEEMPRESA, 1, r.NROEMPRESA);

        IF r.SEQCATEGORIAN1 IS NOT NULL THEN
            v_id_cat1 := FN_GET_OR_CREATE_NODO(v_id_empresa, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN1), r.CATEGORIAN1, 2, r.NROEMPRESA);
        ELSE v_id_cat1 := v_id_empresa; END IF;

        IF r.SEQCATEGORIAN2 IS NOT NULL THEN
            v_id_cat2 := FN_GET_OR_CREATE_NODO(v_id_cat1, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN2), r.CATEGORIAN2, 3, r.NROEMPRESA);
        ELSE v_id_cat2 := v_id_cat1; END IF;

        IF r.SEQCATEGORIAN3 IS NOT NULL THEN
            v_id_cat3 := FN_GET_OR_CREATE_NODO(v_id_cat2, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN3), r.CATEGORIAN3, 4, r.NROEMPRESA);
        ELSE v_id_cat3 := v_id_cat2; END IF;

        IF r.SEQCATEGORIAN4 IS NOT NULL THEN
            v_id_cat4 := FN_GET_OR_CREATE_NODO(v_id_cat3, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN4), r.CATEGORIAN4, 5, r.NROEMPRESA);
        ELSE v_id_cat4 := v_id_cat3; END IF;

        IF r.SEQCATEGORIAN5 IS NOT NULL THEN
            v_id_cat5 := FN_GET_OR_CREATE_NODO(v_id_cat4, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN5), r.CATEGORIAN5, 6, r.NROEMPRESA);
        ELSE v_id_cat5 := v_id_cat4; END IF;

        v_id_produto := FN_GET_OR_CREATE_NODO(v_id_cat5, 'PRODUTO', TO_CHAR(r.SEQPRODUTO), r.PRODUTO, 7, r.NROEMPRESA, r.SEQPRODUTO, r.SEQPRODUTOBASE);

        INSERT INTO TB_FLASH_FATO_CONTRIBUICAO (
            id_fato, data_referencia, ano_referencia, mes_referencia, dia_referencia, dia_semana,
            id_nodo, id_nodo_empresa, cod_empresa, nome_empresa, cod_produto, descricao_produto,
            seqprodutobase, nrodivisao, nrosegmento, nro_tickets, vlr_imp_contribuicao, qtde_contribuicao,
            vlr_contribuicao, vl_ticket_medio, propqtdprodutobase, data_cadastro
        ) VALUES (
            SEQ_TB_FLASH_FATO_CONTRIBUICAO.NEXTVAL,
            r.DTA, EXTRACT(YEAR FROM r.DTA), EXTRACT(MONTH FROM r.DTA), EXTRACT(DAY FROM r.DTA),
            TO_NUMBER(TO_CHAR(r.DTA, 'D')),
            v_id_produto, v_id_empresa, r.NROEMPRESA, r.NOMEEMPRESA, r.SEQPRODUTO, r.PRODUTO,
            r.SEQPRODUTOBASE, r.NRODIVISAO, r.NROSEGMENTO, r.QTDE_VENDA, r.VLR_IMP_VENDA,
            r.QTDE_VENDA, r.VLRCONTRIB,
            CASE WHEN r.QTDE_VENDA > 0 THEN r.VLRVENDA / r.QTDE_VENDA ELSE NULL END,
            r.PROPQTDPRODUTOBASE, SYSDATE
        );

    END LOOP;

    COMMIT;
END;
-- +goose StatementEnd
