-- +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,
    p_divisao      IN VARCHAR2 DEFAULT NULL,
    p_cgos         IN VARCHAR2 DEFAULT NULL
) AS
BEGIN
    DELETE FROM TB_FLASH_FATO_CONTRIBUICAO
     WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
       AND cod_empresa = p_empresa;

    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, nome_segmento
    )
    WITH
        CGOS AS (SELECT TO_NUMBER(TRIM(REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL))) AS CODGERALOPER FROM DUAL CONNECT BY REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL) IS NOT NULL),
        DIVISOES AS (SELECT TO_NUMBER(TRIM(REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL))) AS NRODIVISAO FROM DUAL CONNECT BY REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL) IS NOT NULL),
        CATEG AS (
            SELECT DC.SEQFAMILIA, DC.NRODIVISAO,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=2 THEN CC.SEQCATEGORIA END) AS SEQCATEGORIAN2,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=2 THEN CC.CATEGORIA    END) AS CATEGORIAN2,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=3 THEN CC.SEQCATEGORIA END) AS SEQCATEGORIAN3,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=3 THEN CC.CATEGORIA    END) AS CATEGORIAN3,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=4 THEN CC.SEQCATEGORIA END) AS SEQCATEGORIAN4,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=4 THEN CC.CATEGORIA    END) AS CATEGORIAN4,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=5 THEN CC.SEQCATEGORIA END) AS SEQCATEGORIAN5,
                   MAX(CASE WHEN CC.NIVELHIERARQUIA=5 THEN CC.CATEGORIA    END) AS CATEGORIAN5
              FROM consinco.MAP_FAMDIVCATEG DC
              JOIN DIVISOES DI ON DI.NRODIVISAO=DC.NRODIVISAO
              JOIN consinco.MAP_CATEGORIA CC ON CC.SEQCATEGORIA=DC.SEQCATEGORIA AND CC.NRODIVISAO=DC.NRODIVISAO AND CC.TIPCATEGORIA='M' AND CC.NIVELHIERARQUIA BETWEEN 2 AND 5
               AND ((CC.NIVELHIERARQUIA=2 AND CC.STATUSCATEGOR IN ('A','F') AND DC.STATUS IN ('A','F')) OR (CC.NIVELHIERARQUIA IN (3,4,5) AND CC.STATUSCATEGOR='A' AND DC.STATUS='A'))
             GROUP BY DC.SEQFAMILIA, DC.NRODIVISAO
        ),
        NODO_EMPRESA AS (SELECT codigo, MAX(id_nodo) AS id_nodo FROM TB_FLASH_NODO WHERE tipo_nodo='EMPRESA' AND id_nodo_pai IS NULL GROUP BY codigo),
        NODO_PRODUTO AS (SELECT codigo, cod_empresa, seqprodutobase, MAX(id_nodo) AS id_nodo FROM TB_FLASH_NODO WHERE tipo_nodo='PRODUTO' GROUP BY codigo, cod_empresa, seqprodutobase)
    SELECT
        SEQ_TB_FLASH_FATO_CONTRIBUICAO.NEXTVAL,
        Z.DTA, EXTRACT(YEAR FROM Z.DTA), EXTRACT(MONTH FROM Z.DTA), EXTRACT(DAY FROM Z.DTA),
        TO_NUMBER(TO_CHAR(Z.DTA,'D')),
        NP.id_nodo, NE.id_nodo, Z.NROEMPRESA, Z.NOMEEMPRESA, Z.SEQPRODUTO, Z.PRODUTO,
        Z.SEQPRODUTOBASE, Z.NRODIVISAO, Z.NROSEGMENTO,
        Z.QTDE_VENDA, Z.VLR_IMP_VENDA, Z.QTDE_VENDA, Z.VLRCONTRIB,
        CASE WHEN Z.QTDE_VENDA>0 THEN Z.VLRVENDA/Z.QTDE_VENDA ELSE NULL END,
        Z.PROPQTDPRODUTOBASE, SYSDATE, Z.DESCSEGMENTO
    FROM (
        SELECT /*+ OPTIMIZER_FEATURES_ENABLE('10.2.0.4') */
               Y.DTAENTRADASAIDA AS DTA, V.NROEMPRESA, E.NOMEREDUZIDO AS NOMEEMPRESA,
               V.NROSEGMENTO, seg1.descsegmento, V.NRODIVISAO, V.SEQPRODUTO, A.SEQPRODUTOBASE,
               A.DESCCOMPLETA AS PRODUTO,
               CC1.SEQCATEGORIA AS SEQCATEGORIAN1, CC1.CATEGORIA AS CATEGORIAN1,
               C.SEQCATEGORIAN2, C.CATEGORIAN2, C.SEQCATEGORIAN3, C.CATEGORIAN3,
               C.SEQCATEGORIAN4, C.CATEGORIAN4, C.SEQCATEGORIAN5, C.CATEGORIAN5,
               SUM(V.QTDITEM-NVL(V.QTDDEVOLITEM,0)) AS QTDE_VENDA,
               SUM(ROUND(V.VLRITEM,2)-ROUND(V.VLRDEVOLITEM,2)) 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,V.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 CGOS CG                           ON CG.CODGERALOPER=V.CODGERALOPER
          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.MAD_SEGMENTO seg1        ON seg1.NRODIVISAO=D.NRODIVISAO AND seg1.NROSEGMENTO=V.NROSEGMENTO AND seg1.STATUS='A'
          JOIN DIVISOES DI                       ON DI.NRODIVISAO=D.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 CATEG C                      ON C.SEQFAMILIA=A.SEQFAMILIA AND C.NRODIVISAO=V.NRODIVISAO
          LEFT JOIN consinco.MAP_PRODACRESCCUSTORELAC PR ON PR.SEQPRODUTO=V.SEQPRODUTO AND PR.DTAMOVIMENTACAO=V.DTAVDA
         WHERE V.NROEMPRESA=p_empresa AND V.DTAVDA>=p_data_inicial AND V.DTAVDA<p_data_final+1
           AND ((V.TIPTABELA='S' AND V.CGOACMCOMPRAVENDA IN ('S','I')) OR (V.TIPTABELA<>'S' AND V.ACMCOMPRAVENDA IN ('S','I')))
         GROUP BY Y.DTAENTRADASAIDA, V.NROEMPRESA, E.NOMEREDUZIDO, V.NRODIVISAO, V.NROSEGMENTO, SEG1.DESCSEGMENTO,
                  V.SEQPRODUTO, A.SEQPRODUTOBASE, A.SEQFAMILIA, A.DESCCOMPLETA, CC1.SEQCATEGORIA, CC1.CATEGORIA,
                  C.SEQCATEGORIAN2, C.CATEGORIAN2, C.SEQCATEGORIAN3, C.CATEGORIAN3, C.SEQCATEGORIAN4, C.CATEGORIAN4,
                  C.SEQCATEGORIAN5, C.CATEGORIAN5
    ) Z
    JOIN NODO_EMPRESA NE ON NE.codigo=TO_CHAR(Z.NROEMPRESA)
    JOIN NODO_PRODUTO NP ON NP.codigo=TO_CHAR(Z.SEQPRODUTO) AND NP.cod_empresa=Z.NROEMPRESA AND NVL(NP.seqprodutobase,-1)=NVL(Z.SEQPRODUTOBASE,-1);

    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_DADOS_CONTRIBUICAO' AND object_type = 'PROCEDURE';
    IF v_count > 0 THEN
        EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_DADOS_CONTRIBUICAO';
    END IF;
END;
-- +goose StatementEnd
