CREATE OR REPLACE PROCEDURE INSERE_RESERPRODPED(P_CDFILIAL  IN ITEMPEDIDO.CDFILIAL%TYPE,
                                                P_NRPEDIDO  IN ITEMPEDIDO.NRPEDIDO%TYPE,
                                                P_NRITEMPED IN ITEMPEDIDO.NRITEMPED%TYPE,
                                                P_TODOS     IN VARCHAR2 DEFAULT 'N')
IS
   V_CDPRODESTO    PRODUTO.CDPRODESTO%TYPE;
   V_QTRESERVADA   DOUBLE PRECISION;
   V_QTITEMPED     ITEMPEDIDO.QTITEMPED%TYPE;
   V_QTSALDSAID    DOUBLE PRECISION;
   V_CDPRODUTO     PRODUTO.CDPRODUTO%TYPE;
   V_NRRESPRODPED  VARCHAR2(20);
   V_IDUTDEPOSITO  PARAMPEDIDO.IDUTDEPOSITO%TYPE;
   V_CDFILIALDEP   PARAMPEDIDO.CDFILDEPOSITO%TYPE;
   V_CDFILDEPOSITO PARAMPEDIDO.CDFILDEPOSITO%TYPE;
   V_IDCNTRESTOQ   PRODFILI.IDCNTRESTOQ%TYPE;
   V_IDATUESTTPOP  TIPOOPERAC.IDATUESTTPOP%TYPE;
   V_IDESTGERALEXP VARCHAR2(01);
   V_IDTIPOPEDIDO  PEDIDO.IDTIPOPEDIDO%TYPE;
BEGIN
   IF P_TODOS = 'S' THEN
      FOR C_ITENS IN (SELECT I.CDFILIAL, I.NRPEDIDO, I.NRITEMPED, NVL(T.IDATUESTTPOP, 'S') IDATUESTTPOP
                        FROM ITEMPEDIDO I, PEDIDO P, TIPOOPERAC T
                       WHERE P.CDFILIAL = P_CDFILIAL
                         AND P.NRPEDIDO = P_NRPEDIDO
                         AND P.CDFILIAL = I.CDFILIAL
                         AND P.NRPEDIDO = I.NRPEDIDO
                         AND P.CDTIPOOPER = T.CDTIPOOPER(+)
                         AND P.IDENTRSAIDOP = T.IDENTRSAIDOP(+)) LOOP
         IF (C_ITENS.IDATUESTTPOP = 'S') THEN
            INSERE_RESERPRODPED(C_ITENS.CDFILIAL, C_ITENS.NRPEDIDO, C_ITENS.NRITEMPED, 'N');
         END IF;
      END LOOP;
   ELSE

      DELETE FROM RESERPRODPED
      WHERE CDFILIAL  = P_CDFILIAL
        AND NRPEDIDO  = P_NRPEDIDO
        AND NRITEMPED = P_NRITEMPED;

      SELECT MAX(PR.CDPRODESTO), SUM(I.QTITEMPED * PR.VRFATOCONV), MAX(I.CDPRODUTO), NVL(MAX(PF.IDCNTRESTOQ), 'S'), NVL(MAX(T.IDATUESTTPOP), 'S'),
             MAX(P.IDTIPOPEDIDO)
        INTO V_CDPRODESTO, V_QTITEMPED, V_CDPRODUTO, V_IDCNTRESTOQ, V_IDATUESTTPOP, V_IDTIPOPEDIDO
        FROM PEDIDO P, ITEMPEDIDO I, PRODUTO PR, PRODFILI PF, TIPOOPERAC T
       WHERE I.CDFILIAL  = P_CDFILIAL
         AND I.NRPEDIDO  = P_NRPEDIDO
         AND I.NRITEMPED = P_NRITEMPED
         AND I.CDFILIAL = P.CDFILIAL
         AND I.NRPEDIDO = P.NRPEDIDO
         AND I.CDPRODUTO = PR.CDPRODUTO
         AND I.CDFILIAL = PF.CDFILIAL(+)
         AND I.CDPRODUTO = PF.CDPRODUTO(+)
         AND P.CDTIPOOPER = T.CDTIPOOPER(+)
         AND P.IDENTRSAIDOP = T.IDENTRSAIDOP(+);

      IF (V_IDCNTRESTOQ = 'S') AND (V_IDATUESTTPOP = 'S') AND (V_IDTIPOPEDIDO = '1') THEN
         V_QTSALDSAID  := V_QTITEMPED;
         V_QTRESERVADA := V_QTITEMPED;



         V_CDFILIALDEP  := P_CDFILIAL;
         SELECT NVL(MAX(IDUTDEPOSITO), 'N'), MAX(CDFILDEPOSITO)
           INTO V_IDUTDEPOSITO,  V_CDFILDEPOSITO
           FROM PARAMPEDIDO
          WHERE CDFILIAL = P_CDFILIAL;

         IF V_IDUTDEPOSITO = 'S' THEN
            V_CDFILIALDEP  :=  V_CDFILDEPOSITO;
         END IF;

         BEGIN
            SELECT NVL(IDESTGERALEXP, 'N')
              INTO V_IDESTGERALEXP
              FROM PAREXPEDICAO
             WHERE CDFILIAL = P_CDFILIAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_IDESTGERALEXP := 'N';
         END;

         IF (V_IDESTGERALEXP = 'S') THEN
            FOR C_POSICAOESTOQ IN (SELECT RE.CDFILIAL    , RE.CDPRODUTO   , PR.CDARVPROD   , RE.CDALMOXARIFE,        LT.CDORDENALOTE,
                                       RE.CDLOCALESTOQ, LO.IDDISPCONPED, RE.NRLOTEESTQ  , RE.NRSUBLOTE   ,        RE.QTTOTALESTOQ,
                                       LT.DTENTRLOTE  , LT.DTVALILOTE,   PR.SGUNIDADE   , RE.CDPRODUTO CDPRODRES, RE.QTDISPONIVEL,
                                       LT.CDORDENALOTE AS CDORDENA
                                  FROM PRODUTO PR, ALMOXARIFADO AL, LOCALESTOQUE LO, LOTE    LT, RESERVAPED RE, PRODFILI PF
                                 WHERE RE.CDFILIAL    = P_CDFILIAL
                                   AND RE.CDPRODUTO   = V_CDPRODESTO
                                   AND RE.CDPRODUTO    = PR.CDPRODUTO
                                   AND RE.QTDISPONIVEL > 0
                                   AND RE.CDFILIAL     = AL.CDFILIAL
                                   AND RE.CDALMOXARIFE = AL.CDALMOXARIFE
                                   AND RE.CDFILIAL     = LO.CDFILIAL
                                   AND RE.CDALMOXARIFE = LO.CDALMOXARIFE
                                   AND RE.CDLOCALESTOQ = LO.CDLOCALESTOQ
                                   AND RE.CDFILIAL     = LT.CDFILIAL   (+)
                                   AND RE.NRLOTEESTQ   = LT.NRLOTEESTQ (+)
                                   AND RE.NRSUBLOTE    = LT.NRSUBLOTE  (+)
                                   AND RE.CDPRODUTO    = LT.CDPRODUTO  (+)
                                   AND LO.IDDISPCONPED = 'S'
                                   AND RE.CDFILIAL     = PF.CDFILIAL
                                   AND RE.CDPRODUTO    = PF.CDPRODUTO
                                   AND ((PF.IDUTCTRLLOTE = 'S') AND (TRUNC(LT.DTVALILOTE) >= TRUNC(SYSDATE))
                                         OR ((PF.IDUTCTRLLOTE = 'N') AND (LT.DTVALILOTE IS NULL)))
                                ORDER BY CDFILIAL , CDARVPROD   , DTVALILOTE,  CDORDENALOTE, CDORDENA, DTENTRLOTE, NRLOTEESTQ,
                                         NRSUBLOTE, CDALMOXARIFE, CDLOCALESTOQ

                                ) LOOP


               IF (V_QTSALDSAID <= C_POSICAOESTOQ.QTDISPONIVEL) THEN
                  V_QTRESERVADA := V_QTSALDSAID;
               ELSE
                  V_QTRESERVADA := C_POSICAOESTOQ.QTDISPONIVEL;
               END IF;

               IF (V_QTSALDSAID > 0) THEN
                  NOVO_CODIGO_NT('CDRESPEDIDO'||P_CDFILIAL, V_NRRESPRODPED);
                  V_NRRESPRODPED := SUBSTR(V_NRRESPRODPED,11,10);

                  INSERT INTO RESERPRODPED
                  (CDFILIAL, NRPEDIDO, NRITEMPED, CDALMOXARIFE, CDLOCALESTOQ,
                   NRLOTEESTQ, NRSUBLOTE, QTRESPRODPED, CDPRODUTO, QTRESPRODARR,
                   NRRESPRODPED, CDFILIALDEP)
                  VALUES
                  (P_CDFILIAL, P_NRPEDIDO, P_NRITEMPED, C_POSICAOESTOQ.CDALMOXARIFE, C_POSICAOESTOQ.CDLOCALESTOQ,
                   C_POSICAOESTOQ.NRLOTEESTQ, C_POSICAOESTOQ.NRSUBLOTE, V_QTRESERVADA, V_CDPRODESTO, V_QTRESERVADA,
                   V_NRRESPRODPED, V_CDFILIALDEP);

                  IF (V_QTSALDSAID <= C_POSICAOESTOQ.QTDISPONIVEL) THEN
                     V_QTSALDSAID := 0;
                  ELSE
                     V_QTSALDSAID := V_QTSALDSAID - C_POSICAOESTOQ.QTDISPONIVEL;
                  END IF;
               END IF;
            END LOOP;
         ELSE
            FOR C_POSICAOESTOQ IN (SELECT RE.CDFILIAL    , RE.CDPRODUTO   , PR.CDARVPROD   , RE.CDALMOXARIFE,        LT.CDORDENALOTE,
                                          RE.CDLOCALESTOQ, LO.IDDISPCONPED, RE.NRLOTEESTQ  , RE.NRSUBLOTE   ,        RE.QTTOTALESTOQ,
                                          LT.DTENTRLOTE  , LT.DTVALILOTE,   PR.SGUNIDADE   , RE.CDPRODUTO CDPRODRES, RE.QTDISPONIVEL,
                                          LT.CDORDENALOTE AS CDORDENA
                                     FROM PRODUTO PR, ALMOXARIFADO AL, LOCALESTOQUE LO, LOTE    LT, RESERVAPED RE, PRODFILI PF
                                    WHERE RE.CDFILIAL    = P_CDFILIAL
                                      AND RE.CDPRODUTO   = V_CDPRODESTO
                                      AND RE.CDPRODUTO    = PR.CDPRODUTO
                                      AND RE.QTDISPONIVEL > 0
                                      AND RE.CDFILIAL     = AL.CDFILIAL
                                      AND RE.CDALMOXARIFE = AL.CDALMOXARIFE
                                      AND RE.CDFILIAL     = LO.CDFILIAL
                                      AND RE.CDALMOXARIFE = LO.CDALMOXARIFE
                                      AND RE.CDLOCALESTOQ = LO.CDLOCALESTOQ
                                      AND RE.CDFILIAL     = LT.CDFILIAL   (+)
                                      AND RE.NRLOTEESTQ   = LT.NRLOTEESTQ (+)
                                      AND RE.NRSUBLOTE    = LT.NRSUBLOTE  (+)
                                      AND RE.CDPRODUTO    = LT.CDPRODUTO  (+)
                                      AND LO.IDDISPCONPED = 'S'
                                      AND RE.CDFILIAL     = PF.CDFILIAL
                                      AND RE.CDPRODUTO    = PF.CDPRODUTO
                                      AND ((PF.IDUTCTRLLOTE = 'S') AND (TRUNC(LT.DTVALILOTE) >= TRUNC(SYSDATE))
                                            OR ((PF.IDUTCTRLLOTE = 'N') AND (LT.DTVALILOTE IS NULL)))
                                      AND (LO.CDLOCALESTOQ = (SELECT NVL(CDLOCALPRCLI, ' ')
                                                                FROM PRODFILI PF
                                                               WHERE PF.CDFILIAL    = P_CDFILIAL
                                                                 AND PF.CDPRODUTO    = V_CDPRODESTO
                                                                 AND PF.CDALMOXPRCLI = LO.CDALMOXARIFE))
                                   ORDER BY CDFILIAL , CDARVPROD   , DTVALILOTE,  CDORDENALOTE, CDORDENA, DTENTRLOTE, NRLOTEESTQ,
                                            NRSUBLOTE, CDALMOXARIFE, CDLOCALESTOQ

                                   ) LOOP


               IF (V_QTSALDSAID <= C_POSICAOESTOQ.QTDISPONIVEL) THEN
                  V_QTRESERVADA := V_QTSALDSAID;
               ELSE
                  V_QTRESERVADA := C_POSICAOESTOQ.QTDISPONIVEL;
               END IF;

               IF (V_QTSALDSAID > 0) THEN
                  NOVO_CODIGO_NT('CDRESPEDIDO'||P_CDFILIAL, V_NRRESPRODPED);
                  V_NRRESPRODPED := SUBSTR(V_NRRESPRODPED,11,10);

                  INSERT INTO RESERPRODPED
                  (CDFILIAL, NRPEDIDO, NRITEMPED, CDALMOXARIFE, CDLOCALESTOQ,
                   NRLOTEESTQ, NRSUBLOTE, QTRESPRODPED, CDPRODUTO, QTRESPRODARR,
                   NRRESPRODPED, CDFILIALDEP)
                  VALUES
                  (P_CDFILIAL, P_NRPEDIDO, P_NRITEMPED, C_POSICAOESTOQ.CDALMOXARIFE, C_POSICAOESTOQ.CDLOCALESTOQ,
                   C_POSICAOESTOQ.NRLOTEESTQ, C_POSICAOESTOQ.NRSUBLOTE, V_QTRESERVADA, V_CDPRODESTO, V_QTRESERVADA,
                   V_NRRESPRODPED, V_CDFILIALDEP);

                  IF (V_QTSALDSAID <= C_POSICAOESTOQ.QTDISPONIVEL) THEN
                     V_QTSALDSAID := 0;
                  ELSE
                     V_QTSALDSAID := V_QTSALDSAID - C_POSICAOESTOQ.QTDISPONIVEL;
                  END IF;
               END IF;
            END LOOP;
         END IF;
         IF (V_QTSALDSAID > 0) THEN

            NOVO_CODIGO_NT('CDRESPEDIDO'||P_CDFILIAL, V_NRRESPRODPED);
            V_NRRESPRODPED := SUBSTR(V_NRRESPRODPED,11,10);

            INSERT INTO RESERPRODPED
            (CDFILIAL, NRPEDIDO, NRITEMPED, CDALMOXARIFE, CDLOCALESTOQ,
             NRLOTEESTQ, NRSUBLOTE, QTRESPRODPED, CDPRODUTO, QTRESPRODARR,
             NRRESPRODPED, CDFILIALDEP)
            VALUES
            (P_CDFILIAL, P_NRPEDIDO, P_NRITEMPED, '', '',
             '', '', V_QTSALDSAID, V_CDPRODESTO, V_QTSALDSAID,
             V_NRRESPRODPED, V_CDFILIALDEP);
         END IF;
      END IF;
   END IF;


END;
/