CREATE OR REPLACE PROCEDURE CONTABILIZA_RET_PROD (
   P_NRLISTA IN LISTA.NRLISTA%TYPE)
IS
   V_CDHISTPADR VARCHAR2(04);
   V_DSHISTPADR VARCHAR2(1000);
   V_IDCONTCCUS VARCHAR2(01);
   V_CDLOTE VARCHAR2(20);
   V_NRLANCLOTE VARCHAR2(06);
   V_CDEMPRESA VARCHAR2(2);
BEGIN
   EXCLUI_LANCCONTABIL('03',P_NRLISTA);
    
   BEGIN
     SELECT MIN(CDHISTPADR)
       INTO V_CDHISTPADR
       FROM HISTPADR;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
     V_CDHISTPADR := NULL;
   END;

   V_DSHISTPADR := 'RETIRADA MANUFATURA';

   FOR C_RET_PROD IN (
      SELECT AP.CDFILIAL, AP.CDCENTCUST, CTBL_PRODUTO(PR.CDPRODUTO,'E') AS CDCONTCTBL, CTBL_PRODPRODUCAO(PR.CDPRODUTO) AS CDCTBLPRODPR,
             SUM(ROUND(NVL(AP.QTAPRCUSTOP * AP.VRAPRCUSTOP, 0),2)) VRAPRCUSTOP,
             TRUNC(LAST_DAY(OP.DTHRFIMREAOP)) AS DTHRFIMREAOP
        FROM APRCUSTOP AP, ORDPRODUCAO OP, PRODUTO PR, LISTA L
       WHERE (AP.CDFILIAL = OP.CDFILIAL)
         AND (AP.NRORDPROD = OP.NRORDPROD)
         AND (AP.NRSUBORDPROD    = OP.NRSUBORDPROD)
         AND (OP.IDSITORDPROD = '3')
         AND (AP.CDFUNCUSTO  <> '099')
         AND (AP.CDAPRCUSTOP  = PR.CDPRODUTO)
         AND (AP.CDFILIAL = SUBSTR(L.CDLISTA,1,4))
         AND (TO_CHAR(OP.DTHRFIMREAOP,'MM/YYYY') = SUBSTR(L.CDLISTA,5,7))
         AND (L.NRLISTA = P_NRLISTA)
         AND (AP.CDEMPRCTBOP IS NULL)
         AND (AP.CDLOTECTBOP IS NULL)
       GROUP BY AP.CDFILIAL, AP.CDCENTCUST, CTBL_PRODUTO(PR.CDPRODUTO,'E'), CTBL_PRODPRODUCAO(PR.CDPRODUTO),
                TRUNC(LAST_DAY(OP.DTHRFIMREAOP))
       ORDER BY 1, 2) LOOP

       BEGIN
          SELECT CDEMPRESA
            INTO V_CDEMPRESA
            FROM FILIAL
           WHERE CDFILIAL = C_RET_PROD.CDFILIAL;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
            V_CDEMPRESA := NULL;
       END;

       BEGIN
        SELECT CDHISTPADRETPRO, DSHISTPADR
          INTO V_CDHISTPADR, V_DSHISTPADR
          FROM PARAMESTOQUE, HISTPADR
         WHERE CDHISTPADRETPRO = CDHISTPADR;
       EXCEPTION
        WHEN NO_DATA_FOUND THEN
         V_CDHISTPADR := '';
         V_DSHISTPADR := '';
       END;

       GERA_LOTECONTABIL(V_CDEMPRESA,'03','',C_RET_PROD.CDFILIAL, '','','',V_CDLOTE,V_NRLANCLOTE);

       IF C_RET_PROD.VRAPRCUSTOP <> 0.0 THEN

          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE, C_RET_PROD.DTHRFIMREAOP,V_NRLANCLOTE,C_RET_PROD.CDCONTCTBL,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_RET_PROD.VRAPRCUSTOP,2),'','','03', '','N');

          IF C_RET_PROD.CDCENTCUST IS NOT NULL THEN
             BEGIN
               SELECT IDCONTCCUS
                 INTO V_IDCONTCCUS
                 FROM CONTCTBL
                WHERE CDCONTCTBL = C_RET_PROD.CDCONTCTBL;
             EXCEPTION
              WHEN NO_DATA_FOUND THEN
               V_IDCONTCCUS := NULL;
             END;

              IF V_IDCONTCCUS <> 'O' THEN
                 RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RET_PROD.DTHRFIMREAOP,V_NRLANCLOTE,C_RET_PROD.CDFILIAL,
                                C_RET_PROD.CDCENTCUST,ROUND(C_RET_PROD.VRAPRCUSTOP,2));
              END IF;
          END IF;

          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_RET_PROD.DTHRFIMREAOP,V_NRLANCLOTE,C_RET_PROD.CDCTBLPRODPR,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_RET_PROD.VRAPRCUSTOP * -1,2),'','','03','','N');
       END IF;
   END LOOP;

   V_DSHISTPADR := 'PRODUTO ACABADO';

   FOR C_PRODACABADO IN (
      SELECT CTBL_PRODUTO(OP.CDPRODUTO, 'E') AS CDCTBLENTRPR,
             CTBL_PRODPRODUCAO(OP.CDPRODUTO) AS CDCONTCTBL,
             SUM(ROUND(NVL(AP.QTAPRCUSTOP * AP.VRAPRCUSTOP, 0),2)) AS VRPRACABADO, AP.CDFILIAL, FL.CDCENTCUST, CONT.IDCONTCCUS,
             TRUNC(LAST_DAY(OP.DTHRFIMREAOP)) AS DTHRFIMREAOP
        FROM ORDPRODUCAO OP, FILIAL FL, CONTCTBL CONT, APRCUSTOP AP, LISTA L
       WHERE (FL.CDFILIAL = AP.CDFILIAL)
         AND (CONT.CDCONTCTBL = CTBL_PRODUTO(OP.CDPRODUTO, 'E'))
         AND (OP.IDSITORDPROD  = '3')
         AND (AP.CDFILIAL = OP.CDFILIAL)
         AND (AP.NRORDPROD = OP.NRORDPROD)
         AND (AP.NRSUBORDPROD = OP.NRSUBORDPROD)
         AND (AP.CDFILIAL = SUBSTR(L.CDLISTA,1,4))
         AND (TO_CHAR(OP.DTHRFIMREAOP,'MM/YYYY') = SUBSTR(L.CDLISTA,5,7))
         AND (L.NRLISTA = P_NRLISTA)
         AND (AP.CDEMPRCTBOP IS NULL)
         AND (AP.CDLOTECTBOP IS NULL)
       GROUP BY CTBL_PRODUTO(OP.CDPRODUTO, 'E'), CTBL_PRODPRODUCAO(OP.CDPRODUTO), AP.CDFILIAL, FL.CDCENTCUST, CONT.IDCONTCCUS,
                TRUNC(LAST_DAY(OP.DTHRFIMREAOP))
       ORDER BY 1, 2) LOOP

       BEGIN
          SELECT CDEMPRESA
            INTO V_CDEMPRESA
            FROM FILIAL
           WHERE CDFILIAL = C_PRODACABADO.CDFILIAL;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN
            V_CDEMPRESA := NULL;
       END;
       
       GERA_LOTECONTABIL(V_CDEMPRESA,'03','',C_PRODACABADO.CDFILIAL,'','','',V_CDLOTE,V_NRLANCLOTE);

       IF C_PRODACABADO.VRPRACABADO <> 0.0 THEN
          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_PRODACABADO.DTHRFIMREAOP,V_NRLANCLOTE,C_PRODACABADO.CDCTBLENTRPR,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_PRODACABADO.VRPRACABADO * -1,2),'','','03','','N');
                       
          IF C_PRODACABADO.CDCENTCUST IS NOT NULL THEN      
              IF C_PRODACABADO.IDCONTCCUS <> 'O' THEN
                 RATEIO_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_PRODACABADO.DTHRFIMREAOP,V_NRLANCLOTE,C_PRODACABADO.CDFILIAL,
                                C_PRODACABADO.CDCENTCUST,ROUND(C_PRODACABADO.VRPRACABADO * -1,2));
              END IF;
          END IF; 

          NOVA_PARTIDA(V_CDEMPRESA,V_CDLOTE,C_PRODACABADO.DTHRFIMREAOP,V_NRLANCLOTE,C_PRODACABADO.CDCONTCTBL,V_CDHISTPADR,
                       V_DSHISTPADR, ROUND(C_PRODACABADO.VRPRACABADO,2),'','','03','','N');
       END IF;

       FOR C_UPDATE IN (
          SELECT AP.CDFILIAL, AP.NRORDPROD
            FROM APRCUSTOP AP, ORDPRODUCAO OP, PRODUTO PR
           WHERE (AP.CDFILIAL = OP.CDFILIAL)
             AND (AP.NRORDPROD = OP.NRORDPROD)
             AND (AP.NRSUBORDPROD    = OP.NRSUBORDPROD)
             AND (OP.IDSITORDPROD = '3')
             AND (AP.CDFUNCUSTO  <> '099')
             AND (AP.CDAPRCUSTOP  = PR.CDPRODUTO)
             AND (AP.CDFILIAL = C_PRODACABADO.CDFILIAL)
             AND (TO_CHAR(OP.DTHRFIMREAOP,'MM/YYYY') = SUBSTR(C_PRODACABADO.DTHRFIMREAOP,4,7))
             AND (AP.CDEMPRCTBOP IS NULL)
             AND (AP.CDLOTECTBOP IS NULL)
           GROUP BY AP.CDFILIAL, AP.NRORDPROD
           ORDER BY 1, 2) LOOP

           UPDATE APRCUSTOP
              SET IDSTATUSCTBOP = 'C',
                  CDEMPRCTBOP   = V_CDEMPRESA,
                  CDLOTECTBOP   = V_CDLOTE
            WHERE CDFILIAL  = C_UPDATE.CDFILIAL
              AND NRORDPROD = C_UPDATE.NRORDPROD;
       END LOOP;
   END LOOP;

   DELETE FROM LISTA
    WHERE NRLISTA = P_NRLISTA;
END;
/