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_CDALMOXARIFE  ALMOXARIFADO.CDALMOXARIFE%TYPE;
   V_CDLOCALESTOQ  LOCALESTOQUE.CDLOCALESTOQ%TYPE;
   V_IDUTDEPOSITO  PARAMPEDIDO.IDUTDEPOSITO%TYPE;
   V_CDFILIALDEP   PARAMPEDIDO.CDFILDEPOSITO%TYPE;
   V_CDFILDEPOSITO PARAMPEDIDO.CDFILDEPOSITO%TYPE;
BEGIN
   IF P_TODOS = 'S' THEN
      FOR C_ITENS IN (SELECT CDFILIAL, NRPEDIDO, NRITEMPED
                        FROM ITEMPEDIDO
                       WHERE CDFILIAL = P_CDFILIAL
                         AND NRPEDIDO = P_NRPEDIDO) LOOP
         INSERE_RESERPRODPED(C_ITENS.CDFILIAL, C_ITENS.NRPEDIDO, C_ITENS.NRITEMPED, 'N');
      END LOOP;
   ELSE

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

      SELECT MAX(P.CDPRODESTO), SUM(I.QTITEMPED * P.VRFATOCONV), MAX(I.CDPRODUTO)
        INTO V_CDPRODESTO, V_QTITEMPED, V_CDPRODUTO
        FROM ITEMPEDIDO I, PRODUTO P
       WHERE I.CDPRODUTO = P.CDPRODUTO
         AND I.CDFILIAL  = P_CDFILIAL
         AND I.NRPEDIDO  = P_NRPEDIDO
         AND I.NRITEMPED = P_NRITEMPED;

      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;
      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
                              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 (TRUNC(LT.DTVALILOTE) >= TRUNC(SYSDATE) OR (LT.DTVALILOTE IS NULL))
                                AND (LO.CDLOCALESTOQ = (SELECT NVL(CDLOCALPRCLI, ' ')
                                                          FROM PRODFILI PF
                                                         WHERE PF.CDFILIAL    = P_CDFILIAL
                                                           AND PF.CDPRODUTO    = V_CDPRODUTO
                                                           AND PF.CDALMOXPRCLI = LO.CDALMOXARIFE))
                             ) LOOP


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

         IF (V_QTSALDSAID > 0) THEN
            NOVO_CODIGO('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.QTTOTALESTOQ) THEN
               V_QTSALDSAID := 0;
            ELSE
               V_QTSALDSAID := V_QTSALDSAID - C_POSICAOESTOQ.QTTOTALESTOQ;
            END IF;
         END IF;
      END LOOP;

      IF (V_QTSALDSAID > 0) THEN

         NOVO_CODIGO('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_CDALMOXARIFE, V_CDLOCALESTOQ,
          '', '', V_QTSALDSAID, V_CDPRODESTO, V_QTSALDSAID,
          V_NRRESPRODPED, V_CDFILIALDEP);
      END IF;
   END IF;


END;
/