-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE PRC_CARREGA_FLASH_PERDAS (
    p_data_inicial IN DATE,
    p_data_final   IN DATE,
    p_reprocessar  IN VARCHAR2 DEFAULT 'S'
)
IS
BEGIN
    IF p_reprocessar = 'S' THEN
        DELETE FROM TB_FLASH_PERDAS
         WHERE DATA_PERDA BETWEEN p_data_inicial AND p_data_final;
    END IF;

    INSERT INTO TB_FLASH_PERDAS (
        ID,
        NUMERO_LOJA,
        NOME_LOJA,
        CODIGO_CATEGORIA_N1,
        NOME_CATEGORIA_N1,
        CODIGO_CATEGORIA_N2,
        NOME_CATEGORIA_N2,
        CODIGO_CATEGORIA_N3,
        NOME_CATEGORIA_N3,
        CODIGO_CATEGORIA_N4,
        NOME_CATEGORIA_N4,
        CODIGO_CATEGORIA_N5,
        NOME_CATEGORIA_N5,
        CODIGO_PRODUTO,
        NOME_PRODUTO,
        DATA_PERDA,
        ANO,
        MES,
        DIA,
        DIA_SEMANA,
        VALOR_PERDA,
        CUSTO,
        QTD_PERDA,
        DATAINC,
        DATAALT
    )
    WITH cat_base AS (
        SELECT
            pc.seqproduto,
            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_produto pc
        JOIN consinco.map_familia fc
          ON fc.seqfamilia = pc.seqfamilia
        JOIN consinco.map_famdivcateg dc
          ON dc.seqfamilia = fc.seqfamilia
         AND dc.nrodivisao = 1
         AND dc.status = 'A'
        JOIN consinco.map_categoria cc
          ON cc.nrodivisao = dc.nrodivisao
         AND cc.seqcategoria = dc.seqcategoria
         AND cc.tipcategoria = 'M'
         AND cc.statuscategor = 'A'
         AND cc.nivelhierarquia BETWEEN 1 AND 5
        GROUP BY pc.seqproduto
    ),
    custo_base AS (
        SELECT
            cd.seqproduto,
            cd.nroempresa,
            cd.dtaentradasaida,
            (cd.cmdiavlrnf
             + cd.cmdiaipi
             + cd.cmdiaicmsst
             + cd.cmdiadespnf
             + cd.cmdiadespforanf
             - cd.cmdiacredicms
             - cd.cmdiacredicmspresum
             - cd.cmdiacredicmsantecip
             - cd.cmdiacredpis
             - cd.cmdiacredcofins
             - cd.cmdiadctoforanf) AS custo_dia
        FROM consinco.mrl_custodia cd
    ),
    inner_query AS (
        SELECT
            e.nroempresa AS empresa,
            e.nomereduzido AS nomeempresa,
            cat.codcatn1,
            cat.nomecatn1,
            cat.codcatn2,
            cat.nomecatn2,
            cat.codcatn3,
            cat.nomecatn3,
            cat.codcatn4,
            cat.nomecatn4,
            cat.codcatn5,
            cat.nomecatn5,
            c.seqproduto AS cod_produto,
            a.desccompleta AS descricao,
            a.seqprodutobase,
            vw.dtaentradasaida AS data_venda,
            SUM(vw.vlrctoliquido) AS custo_liq_na_loja,
            SUM(vw.valorlancto) AS perda,
            SUM(vw.qtdlancto) AS qtde_perda_unit,
            (
                SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal *
                    (e.pericmsestimativa + e.peroutroimposto + e.percpmf + e.perir +
                     DECODE(e.indfaturaiss, 'S', e.perciss, 0) +
                     DECODE(e.indfaturaipi || b.indcalcipisaida, 'SS', b.peraliquotaipi, 0)) / 100)
              + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal *
                    (t3.peraliquota * t3.pertributado / 100) / 100)
              + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal *
                    DECODE(b.indisentopis, 'S', 0,
                        DECODE(b.indisentodebpiscofins, 'S', 0, e.perpis)) / 100)
              + SUM((vw.qtdlancto / c3.qtdembalagem) * c3.precovalidnormal *
                    DECODE(b.indisentopis, 'S', 0,
                        DECODE(b.indisentodebpiscofins, 'S', 0, e.percofins)) / 100)
            ) AS vlrimpostovda,
            CASE
                WHEN cat.codcatn2 IN (15458, 18080)
                 AND cat.codcatn3 NOT IN (17696, 18007, 17182)
                THEN
                    SUM(
                        vw.qtdlancto * (
                            SELECT cx.custo_dia
                              FROM custo_base cx
                             WHERE cx.seqproduto = COALESCE(a.seqprodutobase, c.seqproduto)
                               AND cx.nroempresa = 301
                               AND cx.dtaentradasaida = (
                                   SELECT MAX(cx2.dtaentradasaida)
                                     FROM custo_base cx2
                                    WHERE cx2.seqproduto = cx.seqproduto
                                      AND cx2.nroempresa = 301
                                      AND cx2.dtaentradasaida <= vw.dtaentradasaida
                               )
                        )
                    )
                ELSE SUM(vw.valorlancto)
            END AS perda_novo
        FROM
            maxv_categoria gs,
            map_famdivcateg us,
            map_famdivcateg w,
            map_famdivisao d,
            max_empresa e,
            max_divisao i2,
            map_classifabc z2,
            maxv_abcperdabase vw,
            map_tributacaouf t3,
            map_familia b,
            mad_famsegmento h,
            map_famembalagem k,
            mrl_produtoempresa c,
            mrl_prodempseg c3,
            map_produto a,
            mad_segmento se,
            map_produto pr,
            cat_base cat,
            (
                SELECT
                    a.seqproduto,
                    a.nroempresa,
                    SUM(a.estqloja) AS estqloja,
                    SUM(a.estqdeposito) AS estqdeposito,
                    SUM(a.estqtroca) AS estqtroca,
                    SUM(a.estqalmoxarifado) AS estqalmoxarifado,
                    SUM(a.estqoutro) AS estqoutro,
                    SUM(
                        NVL(a.cmultvlrdescpistransf, 0) +
                        NVL(a.cmultvlrdesccofinstransf, 0) +
                        NVL(a.cmultvlrdescicmstransf, 0) +
                        NVL(a.cmultvlrdescipitransf, 0) +
                        NVL(a.cmultvlrdesclucrotransf, 0) +
                        NVL(a.cmultvlrdescverbatransf, 0) +
                        NVL(a.cmultvlrdescdiferencatransf, 0)
                    ) AS vlrdesctransfcb
                FROM mrl_produtoempresa a
                GROUP BY a.seqproduto, a.nroempresa
            ) sx,
            (
                SELECT MAX(dx.utilacresccustprodrelac) AS utilacresccustprodrelac
                  FROM max_divisao dx
                  JOIN max_empresa ex
                    ON ex.nrodivisao = dx.nrodivisao
            ) i3
        WHERE
            e.nroempresa = vw.nroempresa
            AND e.nrodivisao = d.nrodivisao
            AND h.seqfamilia = vw.seqfamilia
            AND h.nrosegmento = e.nrosegmentoprinc
            AND h.nrosegmento = se.nrosegmento
            AND d.seqfamilia = vw.seqfamilia
            AND d.nrodivisao IN (1)
            AND b.seqfamilia = vw.seqfamilia
            AND i2.nrodivisao = d.nrodivisao
            AND z2.nrosegmento = h.nrosegmento
            AND z2.classifcomercabc = h.classifcomercabc
            AND k.seqfamilia = h.seqfamilia
            AND a.seqproduto = c.seqproduto
            AND k.qtdembalagem = h.padraoembvenda
            AND c.seqproduto = vw.seqproduto
            AND c.nroempresa = NVL(e.nroempcustoabc, e.nroempresa)
            AND c3.nroempresa = vw.nroempresa
            AND c3.seqproduto = vw.seqproduto
            AND c3.nrosegmento = e.nrosegmentoprinc
            AND c3.qtdembalagem = h.padraoembvenda
            AND t3.nrotributacao = d.nrotributacao
            AND t3.ufempresa = e.uf
            AND t3.ufclientefornec = e.uf
            AND t3.tiptributacao = DECODE(i2.tipdivisao, 'V', 'SN', 'SC')
            AND t3.nroregtributacao = NVL(e.nroregtributacao, 0)
            AND pr.seqproduto = vw.seqproduto
            AND sx.seqproduto = vw.seqproduto
            AND sx.nroempresa = vw.nroempresa
            AND cat.seqproduto = vw.seqproduto
            AND vw.dtaentradasaida BETWEEN p_data_inicial AND p_data_final
            AND vw.nroempresa IN (
                SELECT CODIGO
                  FROM VITRUVIO.vi_lojas
                 WHERE codigo NOT IN (301, 401, 500)
            )
            AND vw.tipclassinterno IN ('P', 'R', 'C', 'A')
            AND vw.tiplancto IN ('S')
            AND gs.nrodivisao = us.nrodivisao
            AND gs.nivelhierarquia = 2
            AND gs.tipcategoria = 'M'
            AND gs.statuscategor != 'I'
            AND us.seqfamilia = d.seqfamilia
            AND us.nrodivisao = d.nrodivisao
            AND us.seqcategoria = gs.seqcategoria
            AND us.status = 'A'
            AND w.seqfamilia = d.seqfamilia
            AND w.nrodivisao = d.nrodivisao
            AND w.status = 'A'
            AND w.seqcategoria IN (14772, 15450)
        GROUP BY
            e.nroempresa,
            e.nomereduzido,
            gs.seqcategoria,
            gs.caminhocompleto,
            SUBSTR(e.nomereduzido || ' : ' || gs.caminhocompleto, 1, 250),
            c.seqproduto,
            a.seqprodutobase,
            a.desccompleta,
            vw.dtaentradasaida,
            cat.codcatn1, cat.nomecatn1,
            cat.codcatn2, cat.nomecatn2,
            cat.codcatn3, cat.nomecatn3,
            cat.codcatn4, cat.nomecatn4,
            cat.codcatn5, cat.nomecatn5,
            TO_NUMBER(NULL),
            NULL
    )
    SELECT
        SEQ_FLASH_PERDAS.NEXTVAL,
        iq.empresa,
        iq.nomeempresa,
        TO_CHAR(iq.codcatn1),
        iq.nomecatn1,
        TO_CHAR(iq.codcatn2),
        iq.nomecatn2,
        TO_CHAR(iq.codcatn3),
        iq.nomecatn3,
        TO_CHAR(iq.codcatn4),
        iq.nomecatn4,
        TO_CHAR(iq.codcatn5),
        iq.nomecatn5,
        TO_CHAR(iq.cod_produto),
        iq.descricao,
        iq.data_venda,
        EXTRACT(YEAR FROM iq.data_venda),
        EXTRACT(MONTH FROM iq.data_venda),
        EXTRACT(DAY FROM iq.data_venda),
        (TRUNC(iq.data_venda) - TRUNC(iq.data_venda, 'IW') + 1),
        iq.perda_novo,
        iq.custo_liq_na_loja,
        iq.qtde_perda_unit,
        SYSDATE,
        SYSDATE
    FROM inner_query iq;

    COMMIT;
END;
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
BEGIN
    EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_CARREGA_FLASH_PERDAS';
EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE != -4043 THEN
            RAISE;
        END IF;
END;
-- +goose StatementEnd