-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_VENDA (
    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_VENDA
     WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
       AND cod_empresa = p_empresa;

    INSERT INTO TB_FLASH_FATO_VENDA (
        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_venda, qtde_venda,
        vlr_venda, vl_ticket_medio, propqtdprodutobase, data_cadastro, nome_segmento
    )
    WITH pg AS (
        SELECT MAX(indutilicmstaresugprabc) AS indutilicmstaresugprabc
          FROM consinco.max_paramgeral
    ),
    cat AS (
        SELECT dc.nrodivisao, dc.seqfamilia,
               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_famdivcateg dc
          JOIN consinco.map_categoria cc
            ON cc.seqcategoria = dc.seqcategoria AND cc.nrodivisao = dc.nrodivisao
           AND cc.statuscategor = 'A' AND cc.tipcategoria = 'M' AND cc.nivelhierarquia BETWEEN 1 AND 5
         WHERE dc.status = 'A'
         GROUP BY dc.nrodivisao, dc.seqfamilia
    ),
    dados AS (
        SELECT dv.nrodivisao, seg1.nrosegmento, seg1.descsegmento,
               e.nroempresa AS empresa, e.nomereduzido AS nomeempresa,
               a.seqproduto AS cod_produto, a.seqprodutobase, a.desccompleta AS descricao,
               z.dtaentradasaida AS data_referencia,
               TO_NUMBER(TO_CHAR(z.dtaentradasaida, 'D'))    AS dia_semana,
               TO_NUMBER(TO_CHAR(z.dtaentradasaida, 'DD'))   AS dia,
               TO_NUMBER(TO_CHAR(z.dtaentradasaida, 'MM'))   AS mes,
               TO_NUMBER(TO_CHAR(z.dtaentradasaida, 'YYYY')) AS ano,
               0 AS nro_tickets,
               SUM(DECODE(y.qtdvda,0,0,(y.vlrimpostovda+NVL(DECODE(pg.indutilicmstaresugprabc,'S',COALESCE(y.vlricmsvdasolicit,y.vlricmsvda),y.vlricmsvda),0)+NVL(y.vlrpisvda,0)+NVL(y.vlrcofinsvda,0))/y.qtdvda)*z.qtdvda)
               +SUM(DECODE(NVL(y.qtddevol,0),0,0,(NVL(y.vlrimpostodevol,0)+NVL(DECODE(pg.indutilicmstaresugprabc,'S',DECODE(y.qtdvda,0,0,COALESCE((y.vlricmsvdasolicit/y.qtdvda)*y.qtddevol,y.vlricmsdevol)),((z.vlricmsvda/GREATEST(z.qtdvda,1))*NVL(z.qtddevol,0))),0)+NVL(y.vlrpisdevol,0)+NVL(y.vlrcofinsdevol,0))/y.qtddevol)*(0-NVL(z.qtddevol,0))) AS vlr_imp_venda,
               SUM((z.qtdvda - NVL(z.qtddevol,0)) / k.qtdembalagem) AS qtde_venda,
               SUM(z.vlrtotalvda) - SUM(NVL(z.vlrtotaldevol,0)) AS vlr_venda,
               0 AS vl_ticket_medio,
               a.propqtdprodutobase
          FROM consinco.mrl_custodia z
          JOIN consinco.max_empresa e    ON e.nroempresa = z.nroempresa
          JOIN consinco.mrl_custodia y   ON y.seqproduto = z.seqproduto AND y.dtaentradasaida = z.dtaentradasaida AND y.nroempresa = z.nroempresa
          JOIN consinco.map_famdivisao d ON d.seqfamilia = z.seqfamilia AND d.nrodivisao = e.nrodivisao
          JOIN consinco.max_divisao dv   ON dv.nrodivisao = d.nrodivisao
          JOIN consinco.mad_segmento seg1 ON seg1.nrodivisao = d.nrodivisao
          JOIN consinco.mad_famsegmento h ON h.seqfamilia = z.seqfamilia AND h.nrosegmento = e.nrosegmentoprinc AND h.nrosegmento = seg1.nrosegmento
          JOIN consinco.map_famembalagem k ON k.seqfamilia = h.seqfamilia AND k.qtdembalagem = 1
          JOIN consinco.map_produto a    ON a.seqproduto = z.seqproduto AND a.seqfamilia = d.seqfamilia
          JOIN cat                       ON cat.nrodivisao = d.nrodivisao AND cat.seqfamilia = d.seqfamilia
         CROSS JOIN pg
         WHERE z.dtaentradasaida BETWEEN p_data_inicial AND p_data_final
           AND z.nroempresa = p_empresa
           AND (p_divisao IS NULL OR d.nrodivisao IN (SELECT TO_NUMBER(REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL)) FROM dual CONNECT BY REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL) IS NOT NULL))
           AND (z.vlrtotalvda > 0 OR z.vlrtotaldevol > 0)
           AND EXISTS (SELECT 1 FROM consinco.maxv_abcdistribbase b WHERE b.seqproduto=z.seqproduto AND b.nroempresa=z.nroempresa AND b.dtavda=z.dtaentradasaida AND (p_cgos IS NULL OR b.codgeraloper IN (SELECT TO_NUMBER(REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL)) FROM dual CONNECT BY REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL) IS NOT NULL)))
         GROUP BY dv.nrodivisao, seg1.nrosegmento, seg1.descsegmento, e.nroempresa, e.nomereduzido,
                  a.seqproduto, a.seqprodutobase, a.desccompleta, z.dtaentradasaida, a.propqtdprodutobase
    ),
    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_VENDA.NEXTVAL,
           r.data_referencia, r.ano, r.mes, r.dia, r.dia_semana,
           np.id_nodo AS id_nodo, ne.id_nodo AS id_nodo_empresa,
           r.empresa, r.nomeempresa, r.cod_produto, r.descricao, r.seqprodutobase,
           r.nrodivisao, r.nrosegmento, r.nro_tickets, r.vlr_imp_venda, r.qtde_venda,
           r.vlr_venda, r.vl_ticket_medio, r.propqtdprodutobase, SYSDATE, r.descsegmento
      FROM dados r
      JOIN nodo_empresa ne ON ne.codigo = TO_CHAR(r.empresa)
      JOIN nodo_produto np ON np.codigo = TO_CHAR(r.cod_produto) AND np.cod_empresa = r.empresa AND NVL(np.seqprodutobase,-1) = NVL(r.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_VENDA' AND object_type = 'PROCEDURE';
    IF v_count > 0 THEN
        EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_DADOS_VENDA';
    END IF;
END;
-- +goose StatementEnd
