create or replace PROCEDURE CONTABILIZA_RET_ESTOQUE (
     P_NRLISTA IN LISTA.NRLISTA%TYPE)
IS
     V_CDCONTCTBL VARCHAR2(20);
     V_IDCONTCCUS VARCHAR2(1);
     V_CDLOTE VARCHAR2(20);
     V_NRLANCLOTE VARCHAR2(06);
     V_CDEMPRESA VARCHAR2(04);
     V_RECEBFUNC BOOLEAN;
BEGIN
     EXCLUI_LANCCONTABIL('02',P_NRLISTA);
  FOR C_RETIRADA IN
    (SELECT ROUND(SUM(CUSTO_PRODUTO_LCEST(IT.CDFILIMOVI, IT.CDPRODMOVI, 3, IT.DTLANCMOVI,
                                    SYSDATE, IT.CDALMOXARIFE, IT.CDLOCALESTOQ,  IT.NRLOTEESTQ,
                                    IT.NRSUBLOTE) * IT.QTLANCTOEST), 2) AS VRCUSTPROD,
            IT.CDFILIMOVI AS CDFILIMOVI  ,  TR.CDHISTPADR AS CDHISTPADR, HP.DSHISTPADR AS DSHISTPADR,
            IT.CDTIPORETI AS CDTIPORETI  , S.CDCENTCUST CDCENTCUSTDB,
            IT.IDTIPOMOVI IDTIPOMOVI,
            CENTCUST_PRODUTO(IT.CDFILIMOVI, PR.CDARVPROD, 'S') AS CDCENTCUSTCR,
            CTBL_PRODUTO(PR.CDPRODUTO,'E') AS CDCTBLENTRPR,
            DECODE(TR.IDCONTABCMV,'S',CTBL_CMV(PR.CDPRODUTO),TR.CDCONTCTBL) CDCONTCTBL,
            (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7))) LASTDAY
     FROM ITLANCTOEST IT, PRODUTO PR, ITREQUESTO IR,
           LOCALESTOQUE LE, TIPORETI TR,  PARAMAN PM, HISTPADR HP,
           RETIRADAESTO R, setor s, LANCTOESTOQ L, LISTA LI
     WHERE
           (PR.CDPRODUTO    = IT.CDPRODUTO   )  AND
           (IT.IDTIPOMOVI   = '3'            )  AND
           (IT.CDFILIMOVI   = LE.CDFILIAL    )  AND
           (PM.CDFILIAL  = IT.CDFILIMOVI     )  AND
           (PM.CDTIPORETI <> IT.CDTIPORETI   )  AND
           (IT.CDALMOXARIFE = LE.CDALMOXARIFE)  AND
           (IT.CDLOCALESTOQ = LE.CDLOCALESTOQ)  AND
           (L.CDFILIAL   = R.CDFILIALLAN     )  AND
           (L.NRLANCESTQ = R.NRLANCESTQ      )  AND
           (R.CDSETOR    = S.CDSETOR(+)      )  AND
           (R.CDCENTCUST = S.CDCENTCUST(+)   )  AND
           (IT.CDFILIAL   = L.CDFILIAL       )  AND
           (IT.NRLANCESTQ = L.NRLANCESTQ     )  AND
           ((R.CDCENTCUST IS NOT NULL) OR (R.CDCENTCUST <> '') ) AND
           (NVL(IT.IDEVOLESTOQ, 'S') = 'S'   )  AND
           (IT.CDTIPORETI   = TR.CDTIPORETI(+)) AND
           (IT.CDFILIAL     = IR.CDFILILANC(+)) AND
            (HP.CDHISTPADR    = TR.CDHISTPADR ) AND
           (IT.NRLANCESTQ   = IR.NRLANCESTQ(+)) AND
           (IT.NRSEQUITEM   = IR.NRSEQUITEM(+)) AND
           (IT.CDPRODUTO    = IR.CDPRODUTO (+)) AND
           (IT.CDFILIMOVI   = SUBSTR(LI.CDLISTA,1,4)) AND
           (IT.CDTIPORETI   = SUBSTR(LI.CDLISTA,5,2)) AND
           (IT.DTLANCMOVI BETWEEN ('01/'||SUBSTR(LI.CDLISTA,7,7)) AND (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7)))) AND
           (LI.NRLISTA      = P_NRLISTA)        AND
           (IT.CDEMPITCTB   IS NULL    )        AND
           (IT.CDLOTEITCTB  IS NULL    )
     GROUP BY
           IT.CDFILIMOVI  ,  TR.CDHISTPADR, HP.DSHISTPADR,
           IT.CDTIPORETI  , S.CDCENTCUST,
           IT.IDTIPOMOVI,
           CENTCUST_PRODUTO(IT.CDFILIMOVI, PR.CDARVPROD, 'S'),
           CTBL_PRODUTO(PR.CDPRODUTO,'E') ,
           DECODE(TR.IDCONTABCMV,'S',CTBL_CMV(PR.CDPRODUTO),TR.CDCONTCTBL), (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7)))
     HAVING ROUND(SUM(CUSTO_PRODUTO_LCEST(IT.CDFILIMOVI, IT.CDPRODMOVI, 3, IT.DTLANCMOVI,
                                    SYSDATE, IT.CDALMOXARIFE, IT.CDLOCALESTOQ,  IT.NRLOTEESTQ,
                                    IT.NRSUBLOTE) * IT.QTLANCTOEST), 2) <> 0
     UNION ALL
     SELECT ROUND(SUM(CUSTO_PRODUTO_LCEST(IT.CDFILIMOVI, IT.CDPRODMOVI, 3, IT.DTLANCMOVI,
                                    SYSDATE, IT.CDALMOXARIFE, IT.CDLOCALESTOQ,  IT.NRLOTEESTQ,
                                    IT.NRSUBLOTE) * IT.QTLANCTOEST),2) AS VRCUSTPROD,
            IT.CDFILIMOVI AS CDFILIMOVI  ,  TR.CDHISTPADR AS CDHISTPADR, HP.DSHISTPADR AS DSHISTPADR,
            IT.CDTIPORETI AS CDTIPORETI, F.CDCENTCUST CDCENTCUSTDB,
            IT.IDTIPOMOVI AS IDTIPOMOVI,
            CENTCUST_PRODUTO(IT.CDFILIMOVI, PR.CDARVPROD, 'S') AS CDCENTCUSTCR,
            CTBL_PRODUTO(PR.CDPRODUTO,'E') AS CDCTBLENTRPR,
            DECODE(TR.IDCONTABCMV,'S',CTBL_CMV(PR.CDPRODUTO),TR.CDCONTCTBL) CDCONTCTBL,
            (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7))) LASTDAY
     FROM ITLANCTOEST IT, PRODUTO PR,
           LOCALESTOQUE LE, TIPORETI TR, HISTPADR HP,
           RETIRADA RE, LANCTOESTOQ L, FILIAL F, LISTA LI
     WHERE
           (PR.CDPRODUTO    = IT.CDPRODUTO   ) AND
           (IT.IDTIPOMOVI   = '3'            ) AND
           (IT.CDFILIMOVI   = LE.CDFILIAL    ) AND
           (IT.CDALMOXARIFE = LE.CDALMOXARIFE) AND
           (IT.CDLOCALESTOQ = LE.CDLOCALESTOQ) AND
           (RE.CDFILANCESTQ = F.CDFILIAL     ) AND
           (L.CDFILIAL   = RE.CDFILANCESTQ   ) AND
           (L.NRLANCESTQ = RE.NRLANCESTQ     ) AND
           (IT.CDFILIAL   = L.CDFILIAL       ) AND
           (IT.NRLANCESTQ = L.NRLANCESTQ     ) AND
           (NVL(IT.IDEVOLESTOQ, 'S') = 'S'   ) AND
           (IT.CDTIPORETI   = TR.CDTIPORETI(+)  )     AND
           (HP.CDHISTPADR (+)    = TR.CDHISTPADR)     AND
           (IT.CDFILIMOVI   = SUBSTR(LI.CDLISTA,1,4)) AND
           (IT.CDTIPORETI   = SUBSTR(LI.CDLISTA,5,2)) AND
           (IT.DTLANCMOVI BETWEEN ('01/'||SUBSTR(LI.CDLISTA,7,7)) AND (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7)))) AND
           (LI.NRLISTA      = P_NRLISTA)        AND
           (IT.CDEMPITCTB   IS NULL    )        AND
           (IT.CDLOTEITCTB  IS NULL    )
     GROUP BY
           IT.CDFILIMOVI  ,  TR.CDHISTPADR, HP.DSHISTPADR,
           IT.CDTIPORETI,F.CDCENTCUST,
           IT.IDTIPOMOVI,
           CENTCUST_PRODUTO(IT.CDFILIMOVI, PR.CDARVPROD, 'S'),
           CTBL_PRODUTO(PR.CDPRODUTO,'E') ,
           DECODE(TR.IDCONTABCMV,'S',CTBL_CMV(PR.CDPRODUTO),TR.CDCONTCTBL), (LAST_DAY('01/'||SUBSTR(LI.CDLISTA,7,7)))
     HAVING ROUND(SUM(CUSTO_PRODUTO_LCEST(IT.CDFILIMOVI, IT.CDPRODMOVI, 3, IT.DTLANCMOVI,
                                    SYSDATE, IT.CDALMOXARIFE, IT.CDLOCALESTOQ,  IT.NRLOTEESTQ,
                                    IT.NRSUBLOTE) * IT.QTLANCTOEST),2) <> 0
     )
     LOOP
        BEGIN
           SELECT CDEMPRESA
             INTO V_CDEMPRESA
             FROM FILIAL
            WHERE CDFILIAL = C_RETIRADA.CDFILIMOVI;
           EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_CDEMPRESA := NULL;
        END;
           GERA_LOTECONTABIL(V_CDEMPRESA,'02','',C_RETIRADA.CDFILIMOVI,C_RETIRADA.LASTDAY,'','',V_CDLOTE,V_NRLANCLOTE);
           NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RETIRADA.LASTDAY,V_NRLANCLOTE,C_RETIRADA.CDCONTCTBL,C_RETIRADA.CDHISTPADR,
                       C_RETIRADA.DSHISTPADR, ROUND(C_RETIRADA.VRCUSTPROD * -1,2),'','','02', '','N');
        BEGIN
           SELECT CDCONTCTBL, IDCONTCCUS
             INTO V_CDCONTCTBL, V_IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL =  C_RETIRADA.CDCONTCTBL;
           EXCEPTION
            WHEN NO_DATA_FOUND THEN
             V_CDCONTCTBL := NULL;
             V_IDCONTCCUS := NULL;
        END;
        IF C_RETIRADA.CDCENTCUSTDB IS NOT NULL THEN
           IF V_IDCONTCCUS <> 'O' THEN
              RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RETIRADA.LASTDAY,V_NRLANCLOTE,C_RETIRADA.CDFILIMOVI,
                             C_RETIRADA.CDCENTCUSTDB,ROUND(C_RETIRADA.VRCUSTPROD * -1,2));
           END IF;
        END IF;
        NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RETIRADA.LASTDAY,V_NRLANCLOTE,C_RETIRADA.CDCTBLENTRPR,C_RETIRADA.CDHISTPADR,
                     C_RETIRADA.DSHISTPADR, ROUND(C_RETIRADA.VRCUSTPROD,2),'','','02', '','N');
        BEGIN
           SELECT CDCONTCTBL, IDCONTCCUS
             INTO V_CDCONTCTBL, V_IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL =  C_RETIRADA.CDCONTCTBL;
           EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_CDCONTCTBL := NULL;
                V_IDCONTCCUS := NULL;
        END;
        IF C_RETIRADA.CDCENTCUSTCR IS NOT NULL THEN
           IF V_IDCONTCCUS <> 'O' THEN
              RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RETIRADA.LASTDAY,V_NRLANCLOTE,C_RETIRADA.CDFILIMOVI,
                             C_RETIRADA.CDCENTCUSTCR,ROUND(C_RETIRADA.VRCUSTPROD,2));
           END IF;
        END IF;
        V_RECEBFUNC := CONFERE_PARTIDA(V_CDEMPRESA, V_CDLOTE, V_NRLANCLOTE,C_RETIRADA.LASTDAY);
        UPDATE ITLANCTOEST
           SET CDEMPITCTB  = V_CDEMPRESA,
               CDLOTEITCTB = V_CDLOTE
         WHERE (IDTIPOMOVI = '3')                   AND
               (CDFILIMOVI = C_RETIRADA.CDFILIMOVI) AND
               (CDTIPORETI = C_RETIRADA.CDTIPORETI) AND
               (DTLANCMOVI BETWEEN '01/'||SUBSTR(C_RETIRADA.LASTDAY,4,7) AND C_RETIRADA.LASTDAY);
     END LOOP;
  DELETE FROM LISTA
   WHERE NRLISTA = P_NRLISTA;
END;
/