create or replace PROCEDURE GERA_RCPE(
   P_CDFILIAL        IN     FILIAL.CDFILIAL%TYPE,
   P_NRRELATRCPE     IN     RELAT_RCPE.NRRELATRCPE%TYPE,
   P_DTINICIAL       IN     DATE,
   P_DTFINAL         IN     DATE,
   P_CDPRODUTOINI    IN     PRODUTO.CDARVPROD%TYPE,
   P_CDPRODUTOFIN    IN     PRODUTO.CDARVPROD%TYPE,
   P_NRLIVRO         IN     RELAT_RCPE.NRLIVRO%TYPE)
IS
   V_SEQMOVIEST   NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_IDUTILALMOX  PARAMFILIAL.IDUTILALMOX%TYPE;
   V_CDALMOXARIFE ALMOXARIFADO.CDALMOXARIFE%TYPE;
   V_TAMNIVEL     INTEGER;
   V_COUNT        INTEGER;
   V_NRSEQPGRCPE  INTEGER;
   V_LINHAFOLHA   INTEGER;
   V_CDPRODANT    RELAT_RCPE.CDPRODRCPE%TYPE;
   V_NRLIVRO      INTEGER;
   V_NRLINHALIVRO INTEGER;
   V_NRFOLHA      INTEGER;
   V_FOLHALIVRO   INTEGER;

   CURSOR C_MOVIMENTACAO IS
      SELECT M.CDFILIMOVIEST, M.CDPRODMOVIEST, M.IDTIPOMOVIEST, M.DTLANCMOVIEST, M.QTLANCAMENTO, M.VRTOTLANCEST,
             M.QTDEMOVIEST,   M.CDTOTMOVIEST,  M.IDORDEMCALC,   M.NRRELATMOVI,   M.NRLOTEESTQME, M.NRSUBLOTEME,
             M.NRLANCMOVIEST
        FROM RELAT_MOVIEST M JOIN PRODUTO P
                             ON M.CDPRODMOVIEST = P.CDARVPROD
       WHERE M.CDFILIMOVIEST = P_CDFILIAL
         AND M.NRRELATMOVI = V_SEQMOVIEST
      ORDER BY M.CDTOTMOVIEST , CDPRODMOVIEST, DTLANCMOVIEST, NVL(M.IDORDEMCALC, M.IDTIPOMOVIEST), NRLOTEESTQME,
         NRSUBLOTEME, NRLANCMOVIEST, NRSEQUMOVIEST;

   CURSOR C_MOVIEST_TDIA IS
      SELECT M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST, M.DTLANCMOVIEST, SUM(M.QTLANCAMENTO) AS QTTOTDIA
        FROM RELAT_MOVIEST M
       WHERE M.CDFILIMOVIEST = P_CDFILIAL
         AND M.NRRELATMOVI = V_SEQMOVIEST
         AND M.IDTIPOMOVIEST <> '-'
      GROUP BY M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST, M.DTLANCMOVIEST;

   CURSOR C_MOVIEST_TMES IS
      SELECT M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST, LAST_DAY(M.DTLANCMOVIEST) DTLANCMOVIEST, SUM(M.QTLANCAMENTO) AS QTTOTMES
        FROM RELAT_MOVIEST M
       WHERE M.CDFILIMOVIEST = P_CDFILIAL
         AND M.NRRELATMOVI = V_SEQMOVIEST
         AND M.IDTIPOMOVIEST <> '-'
      GROUP BY M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST, LAST_DAY(M.DTLANCMOVIEST);

   CURSOR C_MOVIEST_TPERIODO IS
      SELECT M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST,LAST_DAY(P_DTFINAL) DTLANCMOVIEST, SUM(M.QTLANCAMENTO) AS QTTOTAL
        FROM RELAT_MOVIEST M
       WHERE M.CDFILIMOVIEST = P_CDFILIAL
         AND M.NRRELATMOVI = V_SEQMOVIEST
         AND M.IDTIPOMOVIEST <> '-'
      GROUP BY M.CDFILIMOVIEST, M.NRRELATMOVI, M.CDPRODMOVIEST, LAST_DAY(P_DTFINAL);

   CURSOR C_RELATRCPE IS
      SELECT CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE,
             row_number() OVER(PARTITION BY CDPRODRCPE ORDER BY CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE)  AS NRLINHA
        FROM (SELECT CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE
                FROM RELAT_RCPE
               WHERE CDFILIALRCPE = P_CDFILIAL
                 AND NRRELATRCPE = P_NRRELATRCPE
              ORDER BY CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE);

   CURSOR C_NRSESPGRCPE IS
      SELECT CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE, NRSEQPGRCPE
        FROM RELAT_RCPE
       WHERE CDFILIALRCPE = P_CDFILIAL
         AND NRRELATRCPE = P_NRRELATRCPE
         AND IDTPDADORCPE <> 'AB'
      ORDER BY CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE;

   CURSOR C_SEQPGRCPE IS
      SELECT DISTINCT CDFILIALRCPE, NRRELATRCPE, NRSEQPGRCPE
        FROM RELAT_RCPE
       WHERE CDFILIALRCPE = P_CDFILIAL
         AND NRRELATRCPE = P_NRRELATRCPE
      ORDER BY CDFILIALRCPE, NRRELATRCPE, NRSEQPGRCPE;

   CURSOR C_ABREFECHA IS
      SELECT NRLIVRO, MAX(NRFOLHALIVRO) AS NRULTFOLHA, MAX(NRLINHALIVRO)  AS NRLINHA
        FROM RELAT_RCPE
       WHERE CDFILIALRCPE = P_CDFILIAL
         AND NRRELATRCPE = P_NRRELATRCPE
      GROUP BY NRLIVRO;

BEGIN

   NOVO_CODIGO('MOVIESTOQUE', V_SEQMOVIEST);
   V_SEQMOVIEST := SUBSTR(V_SEQMOVIEST, 11,10);

   BEGIN
      SELECT IDUTILALMOX
        INTO V_IDUTILALMOX
        FROM PARAMFILIAL
       WHERE CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_IDUTILALMOX := 'N';
      END;
   END;
   IF (V_IDUTILALMOX = 'S') THEN
      V_CDALMOXARIFE := ' ';
   ELSE
      V_CDALMOXARIFE := '';
   END IF;

   BEGIN
      SELECT LENGTH(MAX(CDARVPROD))
        INTO V_TAMNIVEL
        FROM PRODUTO
       WHERE CDNVPRODUTO = (SELECT MAX(CDNVPRODUTO) FROM PRODUTO);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
         V_TAMNIVEL := 20;
      END;
   END;
   MOVIMENTACAO_ESTOQUE(P_CDFILIAL,NULL,NULL,NULL,V_TAMNIVEL,P_DTINICIAL,P_DTFINAL,P_CDPRODUTOINI,P_CDPRODUTOFIN,3,1,V_SEQMOVIEST,'S');

   FOR C_MOVIEST IN C_MOVIMENTACAO LOOP
      SELECT COUNT(1)
        INTO V_COUNT
        FROM RELAT_MOVIEST M
       WHERE M.CDFILIMOVIEST = P_CDFILIAL
         AND M.NRRELATMOVI = V_SEQMOVIEST
         AND M.CDPRODMOVIEST = C_MOVIEST.CDPRODMOVIEST;

      IF (V_COUNT > 1) THEN
         GRAVA_RELAT_RCPE(C_MOVIEST.CDFILIMOVIEST, P_NRRELATRCPE,          C_MOVIEST.CDPRODMOVIEST, 'DA',                   C_MOVIEST.IDTIPOMOVIEST, C_MOVIEST.NRLANCMOVIEST,
                          C_MOVIEST.DTLANCMOVIEST, C_MOVIEST.QTLANCAMENTO, C_MOVIEST.VRTOTLANCEST,  C_MOVIEST.QTDEMOVIEST,  C_MOVIEST.CDTOTMOVIEST,  C_MOVIEST.IDORDEMCALC,
                          C_MOVIEST.NRRELATMOVI,   NULL,                   NULL,                    NULL,                   NULL,                    NULL);
      END IF;
   END LOOP;

   FOR C_TDIA IN C_MOVIEST_TDIA LOOP
      GRAVA_RELAT_RCPE(C_TDIA.CDFILIMOVIEST, P_NRRELATRCPE,   C_TDIA.CDPRODMOVIEST, 'TD', '7',  NULL,
                       C_TDIA.DTLANCMOVIEST, C_TDIA.QTTOTDIA, NULL,                 NULL, NULL, NULL,
                       C_TDIA.NRRELATMOVI,   NULL,            NULL,                 NULL, NULL, NULL);
   END LOOP;

   FOR C_TMES IN C_MOVIEST_TMES LOOP
      GRAVA_RELAT_RCPE(C_TMES.CDFILIMOVIEST, P_NRRELATRCPE,   C_TMES.CDPRODMOVIEST, 'TM', '8',  NULL,
                       C_TMES.DTLANCMOVIEST, C_TMES.QTTOTMES, NULL,                 NULL, NULL, NULL,
                       C_TMES.NRRELATMOVI,   NULL,            NULL,                 NULL, NULL, NULL);

   END LOOP;

   FOR C_TPERIODO IN C_MOVIEST_TPERIODO LOOP
      GRAVA_RELAT_RCPE(C_TPERIODO.CDFILIMOVIEST, P_NRRELATRCPE,      C_TPERIODO.CDPRODMOVIEST, 'TP', '9',  NULL,
                       C_TPERIODO.DTLANCMOVIEST, C_TPERIODO.QTTOTAL, NULL,                     NULL, NULL, NULL,
                       C_TPERIODO.NRRELATMOVI,   NULL,               NULL,                     NULL, NULL, NULL);

   END LOOP;

   V_NRSEQPGRCPE := 1;
   V_LINHAFOLHA  := 36;
   V_CDPRODANT   := '';
   FOR C_FOLHA IN C_RELATRCPE LOOP
      IF ((MOD(C_FOLHA.NRLINHA, V_LINHAFOLHA) = 0) OR (V_CDPRODANT <> C_FOLHA.CDPRODRCPE)) THEN
        V_NRSEQPGRCPE := V_NRSEQPGRCPE +1;
      END IF;

      UPDATE RELAT_RCPE
         SET NRSEQPGRCPE = V_NRSEQPGRCPE,
             NRSEQLINHA = C_FOLHA.NRLINHA
       WHERE CDFILIALRCPE = C_FOLHA.CDFILIALRCPE
         AND NRRELATRCPE = C_FOLHA.NRRELATRCPE
         AND NRSEQRCPE = C_FOLHA.NRSEQRCPE;

      V_CDPRODANT := C_FOLHA.CDPRODRCPE;
   END LOOP;


   V_NRLIVRO      := TO_NUMBER(P_NRLIVRO);
   V_NRLINHALIVRO := 1;
   V_NRFOLHA      := 2;
   V_FOLHALIVRO   := 498;

   FOR C_LIVRO IN C_SEQPGRCPE LOOP
      FOR C_FOLHA IN (SELECT CDFILIALRCPE, NRRELATRCPE, NRSEQRCPE
                        FROM RELAT_RCPE
                       WHERE CDFILIALRCPE = P_CDFILIAL
                         AND NRRELATRCPE = P_NRRELATRCPE
                         AND NRSEQPGRCPE = C_LIVRO.NRSEQPGRCPE
                      ORDER BY CDFILIALRCPE, NRRELATRCPE, CDPRODRCPE, DTLANCMOVIEST, IDTIPOMOVIEST, IDTPDADORCPE, NRSEQRCPE)
      LOOP
         UPDATE RELAT_RCPE
            SET NRLIVRO = LPAD(TO_CHAR(V_NRLIVRO),10,'0'),
                NRFOLHALIVRO = LPAD(TO_CHAR(V_NRFOLHA),3,'0'),
                NRLINHALIVRO = V_NRLINHALIVRO
          WHERE CDFILIALRCPE =C_FOLHA.CDFILIALRCPE
            AND NRRELATRCPE = C_FOLHA.NRRELATRCPE
            AND NRSEQRCPE = C_FOLHA.NRSEQRCPE;
         V_NRLINHALIVRO := V_NRLINHALIVRO + 1;
      END LOOP;
      V_NRFOLHA := V_NRFOLHA+1;
      IF (MOD(C_LIVRO.NRSEQPGRCPE, V_FOLHALIVRO) = 0) THEN

           V_NRLIVRO := TO_NUMBER(V_NRLIVRO) +1;
           V_NRFOLHA := 2;
           V_NRLINHALIVRO := 1;
      END IF;
   END LOOP;

   FOR C_ABREFECHALIVRO IN C_ABREFECHA LOOP

      GRAVA_RELAT_RCPE(P_CDFILIAL,   P_NRRELATRCPE,      NULL, 'AB',      '0',  NULL,
                       NULL,         NULL,               NULL, NULL,      NULL, NULL,
                       V_SEQMOVIEST, NULL,               NULL, C_ABREFECHALIVRO.NRLIVRO, '001', 0);

      GRAVA_RELAT_RCPE(P_CDFILIAL,   P_NRRELATRCPE,      NULL, 'UL',      '0',  NULL,
                       NULL,         NULL,               NULL, NULL,      NULL, NULL,
                       V_SEQMOVIEST, NULL,               NULL, C_ABREFECHALIVRO.NRLIVRO, LPAD(TO_CHAR((TO_NUMBER(C_ABREFECHALIVRO.NRULTFOLHA))),3,'0'), (C_ABREFECHALIVRO.NRLINHA+1));
   END LOOP;
END;
/