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

    INSERT INTO TB_FLASH_FATO_PERDA (
        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, qtde_perda, vlr_perda,
        propqtdprodutobase, data_cadastro, nome_segmento
    )
    SELECT
        SEQ_TB_FLASH_FATO_PERDA.NEXTVAL,
        x.data_referencia, x.ano_referencia, x.mes_referencia, x.dia_referencia, x.dia_semana,
        x.id_nodo, x.id_nodo_empresa, x.cod_empresa, x.nome_empresa,
        x.cod_produto, x.descricao_produto, x.seqprodutobase, x.nrodivisao, x.nrosegmento,
        x.qtde_perda, x.vlr_perda, x.propqtdprodutobase, x.data_cadastro, x.nome_segmento
    FROM (
        SELECT
            TRUNC(a.DTAVDA)                   AS data_referencia,
            EXTRACT(YEAR  FROM a.DTAVDA)      AS ano_referencia,
            EXTRACT(MONTH FROM a.DTAVDA)      AS mes_referencia,
            EXTRACT(DAY   FROM a.DTAVDA)      AS dia_referencia,
            TO_NUMBER(TO_CHAR(a.DTAVDA,'D'))  AS dia_semana,
            MIN(b.id_nodo)                    AS id_nodo,
            MIN(c.id_nodo)                    AS id_nodo_empresa,
            b.cod_empresa                     AS cod_empresa,
            MAX(d.fantasia)                   AS nome_empresa,
            a.seqproduto                      AS cod_produto,
            MAX(e.descreduzida)               AS descricao_produto,
            MAX(e.seqprodutobase)             AS seqprodutobase,
            MIN(a.nrodivisao)                 AS nrodivisao,
            a.nrosegmento                     AS nrosegmento,
            SUM(a.qtditem)                    AS qtde_perda,
            SUM(a.vlritem)                    AS vlr_perda,
            MAX(e.propqtdprodutobase)         AS propqtdprodutobase,
            SYSDATE                           AS data_cadastro,
            MAX(seg1.descsegmento)            AS nome_segmento
          FROM consinco.maxv_abcdistribbase a
          INNER JOIN vitruvio.TB_FLASH_NODO b ON b.tipo_nodo = 'PRODUTO' AND b.cod_empresa = a.nroempresa AND b.cod_produto = a.seqproduto
          INNER JOIN vitruvio.TB_FLASH_NODO c ON c.tipo_nodo = 'EMPRESA' AND c.cod_empresa = a.nroempresa
          INNER JOIN consinco.max_empresa d    ON d.nroempresa = c.cod_empresa
          INNER JOIN consinco.map_produto e    ON e.seqproduto = a.seqproduto
          INNER JOIN consinco.mad_segmento seg1 ON seg1.nrodivisao = a.nrodivisao AND seg1.nrosegmento = a.nrosegmento
         WHERE a.nroempresa = p_empresa
           AND a.dtavda BETWEEN p_data_inicial AND p_data_final
           AND (p_cgos IS NULL OR a.codgeraloper IN (SELECT TO_NUMBER(REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL)) FROM dual CONNECT BY REGEXP_SUBSTR(p_cgos,'[^,]+',1,LEVEL) IS NOT NULL))
           AND (p_divisao IS NULL OR a.nrodivisao IN (SELECT TO_NUMBER(REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL)) FROM dual CONNECT BY REGEXP_SUBSTR(p_divisao,'[^,]+',1,LEVEL) IS NOT NULL))
         GROUP BY TRUNC(a.dtavda), EXTRACT(YEAR FROM a.dtavda), EXTRACT(MONTH FROM a.dtavda),
                  EXTRACT(DAY FROM a.dtavda), TO_NUMBER(TO_CHAR(a.dtavda,'D')), b.cod_empresa, a.seqproduto, a.nrosegmento
    ) x;

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