CREATE OR REPLACE
PROCEDURE INCLUI_RESERVA_OL (
    P_FILOPELOG    IN FILIAL.CDFILIAL%TYPE,
    P_DTENTREGA    IN DATE,
    P_DATAENT      IN VARCHAR2,
    P_ROTA         IN VARCHAR2,
    P_PEDOLEXTR    IN VARCHAR2,
    P_CDLOTENVIOL  IN VARCHAR2,
    P_SUBGRUPO     IN VARCHAR2,
    P_STATUS       IN VARCHAR2,
    P_ROWSAFFECT   OUT VARCHAR2,
    P_VERIFICACNPJ IN VARCHAR2,
    P_NRINSJUREMPR IN VARCHAR2
    )
IS
   V_CONTADOR        FLOAT := 0;
   V_QUANT_ESTOQUE   FLOAT;
   V_ESTOQ_RESERVADO FLOAT;
   V_ESTOQUE_TOTAL   FLOAT;
   V_CONTARESERVA    FLOAT := 0;
   V_CONTATODOS      FLOAT := 0;

BEGIN
   P_ROWSAFFECT := 'S';
   IF P_ROTA IS NULL THEN
      FOR C_RESERVA IN (SELECT I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO,
                               I.DTPROGENPEOL, NVL(I.QTATENDPEDOL, I.QTPROGENPEOL) QTPROGENPEOL, P.CDFILIOPELOG, I.DTPROGEMBARQ
                          FROM PEDIDOEXOL P, ITEMPEDEXOL I, FILIAL F
                         WHERE P.CDFILIOPELOG = P_FILOPELOG
                           AND P.CDFILDEST = I.CDFILDEST
                           AND P.CDFILLANC = I.CDFILLANC
                           AND P.CDFILDEST = F.CDFILIAL
                           AND DECODE(P_DATAENT, '0', I.DTPROGENPEOL, I.DTPROGEMBARQ) = P_DTENTREGA
                           AND P.CDFILDEST <> P_FILOPELOG
                           AND P.NRPEDEXOL = I.NRPEDEXOL
                           AND I.IDBAIXAOLSAI IS NULL
                           AND ((P.IDPEDEXOLEXTR = P_PEDOLEXTR) OR (P_PEDOLEXTR = 'T'))
                           AND ((INSTR(P_CDLOTENVIOL, I.CDLOTENVITOL) > 0) OR (NVL(I.CDLOTENVITOL, P_CDLOTENVIOL) = 'T') OR (P_CDLOTENVIOL = 'N'))
                           AND NVL(I.IDITEMAJUSTE, 'N') = 'N'
                           AND NVL(NVL(I.QTATENDPEDOL, I.QTPROGENPEOL), 0) > 0
                           AND (P_SUBGRUPO =  'T' OR EXISTS (SELECT 1
                                                                FROM PRSUBGRPROD PR, PARASUPRI PA
                                                               WHERE PR.CDPRODUTO  = I.CDPRODUTO AND
                                                                     PR.CDGRUPPROD = PA.CDGRUPPROD   AND
                                                                     NVL(F.CDFILCENTCMP, F.CDFILIAL) = PA.CDFILIAL AND
                                                                     PR.CDFILISUBGR = 'P' AND
                                                                     (INSTR(P_SUBGRUPO, PR.CDSUBGRPROD) > 0)))
                           AND INSTR(P_STATUS, CASE NVL(I.IDBAIXAOLSAI, '0')
                                                  WHEN '0'
                                                  THEN CASE TO_CHAR(I.QTATENDPEDOL)
                                                          WHEN '-1'
                                                          THEN NVL(I.IDBAIXAOLSAI, '0')
                                                          ELSE '9'
                                                       END
                                                  ELSE NVL(I.IDBAIXAOLSAI, '0')
                                               END) > 0
                           AND ((P_VERIFICACNPJ IS NULL) OR
                                (EXISTS (SELECT 1
                                           FROM FILIAL
                                          WHERE CDFILIAL       = P.CDFILDEST
                                            AND P_VERIFICACNPJ = CASE NRINSJURFILI
                                                                    WHEN P_NRINSJUREMPR
                                                                    THEN 'I'
                                                                    ELSE 'D'
                                                                 END)))
                         ORDER BY CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO)

      LOOP
      V_QUANT_ESTOQUE   := 0;
      V_ESTOQ_RESERVADO := 0;
      V_ESTOQUE_TOTAL   := 0;
      V_CONTATODOS      := V_CONTATODOS + 1;
      SELECT MAX(CALC_ESTOQ_CONS(P_FILOPELOG, Q.CDPRODUTO, Q.DTPOSESTCON)) QUANT_ESTOQUE
        INTO V_QUANT_ESTOQUE
        FROM (SELECT MAX(P.CDPRODUTO) CDPRODUTO, NVL(MAX(DTPOSESTCON), SYSDATE) AS DTPOSESTCON
                FROM (SELECT DECODE (R.CDPRODARVOL, P.CDPRODESTO, R.CDPRODARVOL, PR.CDPRODUTO) AS CDPRODUTO
                        FROM RELACPRODOL R, PRODUTO P, PRODUTO PR
                       WHERE P.CDPRODUTO   = R.CDPRODARVOL
                         AND P.CDPRODESTO  = PR.CDPRODUTO
                         AND R.CDPRARVORIG = C_RESERVA.CDPRODUTO
                         AND R.CDMARCA     = C_RESERVA.CDMARCA) P, POSESTCONS E
                WHERE E.CDFILIAL  = P_FILOPELOG
                  AND E.CDPRODUTO = P.CDPRODUTO) Q;

      SELECT SUM(QTRESERVESTOL)
        INTO V_ESTOQ_RESERVADO
        FROM RESERVAPEDEXOL
       WHERE CDPRODUTO    =  C_RESERVA.CDPRODUTO
         AND CDMARCA      =  C_RESERVA.CDMARCA
         AND CDFILRESOL   =  P_FILOPELOG
         AND (CDFILDEST   <> C_RESERVA.CDFILDEST
          OR CDFILLANC    <> C_RESERVA.CDFILLANC
          OR NRPEDEXOL    <> C_RESERVA.NRPEDEXOL
          OR DTPROGENPEOL <> C_RESERVA.DTPROGENPEOL);

         V_ESTOQUE_TOTAL := NVL(V_QUANT_ESTOQUE, 0) - (NVL(V_ESTOQ_RESERVADO, 0) + C_RESERVA.QTPROGENPEOL);

         IF V_ESTOQUE_TOTAL >= 0 THEN
            V_CONTARESERVA := V_CONTARESERVA+1;
            BEGIN
               INSERT
                 INTO RESERVAPEDEXOL (CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO,
                      DTPROGENPEOL, QTRESERVESTOL, CDFILRESOL, DTRESEMBARQ)
               VALUES (C_RESERVA.CDFILDEST, C_RESERVA.CDFILLANC, C_RESERVA.NRPEDEXOL, C_RESERVA.CDMARCA, C_RESERVA.CDPRODUTO,
                      C_RESERVA.DTPROGENPEOL, C_RESERVA.QTPROGENPEOL, C_RESERVA.CDFILIOPELOG, C_RESERVA.DTPROGEMBARQ);
            EXCEPTION
               WHEN OTHERS THEN BEGIN
                  UPDATE RESERVAPEDEXOL
                     SET QTRESERVESTOL = C_RESERVA.QTPROGENPEOL
                   WHERE CDFILDEST     = C_RESERVA.CDFILDEST
                     AND CDFILLANC     = C_RESERVA.CDFILLANC
                     AND NRPEDEXOL     = C_RESERVA.NRPEDEXOL
                     AND DTPROGENPEOL  = C_RESERVA.DTPROGENPEOL
                     AND CDMARCA       = C_RESERVA.CDMARCA
                     AND CDPRODUTO     = C_RESERVA.CDPRODUTO
                     AND QTRESERVESTOL <> C_RESERVA.QTPROGENPEOL;
               END;
            END;
            V_CONTADOR := V_CONTADOR+1;
            IF V_CONTADOR >= 500 THEN
               V_CONTADOR := 0;
               COMMIT;
            END IF;
         END IF;
      END LOOP;
   ELSE
      FOR C_RESERVA IN (SELECT I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO,
                               I.DTPROGENPEOL, NVL(I.QTATENDPEDOL, I.QTPROGENPEOL) QTPROGENPEOL, P.CDFILIOPELOG, I.DTPROGEMBARQ
                          FROM PEDIDOEXOL P, ITEMPEDEXOL I, FILIAL F
                         WHERE P.CDFILIOPELOG = P_FILOPELOG
                           AND P.CDFILDEST = I.CDFILDEST
                           AND P.CDFILLANC = I.CDFILLANC
                           AND DECODE(P_DATAENT, '0', I.DTPROGENPEOL, I.DTPROGEMBARQ) = P_DTENTREGA
                           AND P.CDFILDEST = F.CDFILIAL
                           AND P.CDFILDEST <> P_FILOPELOG
                           AND P.NRPEDEXOL = I.NRPEDEXOL
                           AND I.IDBAIXAOLSAI IS NULL
                           AND EXISTS (SELECT 1
                                         FROM FILIALROTA R
                                        WHERE (INSTR(P_ROTA, '_'||CDROTATRANS||'_') > 0)
                                          AND P.CDFILDEST = R.CDFILIAL)
                           AND ((P.IDPEDEXOLEXTR = P_PEDOLEXTR) OR (P_PEDOLEXTR = 'T'))
                           AND ((INSTR(P_CDLOTENVIOL, I.CDLOTENVITOL) > 0) OR (NVL(I.CDLOTENVITOL, P_CDLOTENVIOL) = 'T') OR (P_CDLOTENVIOL = 'N'))
                           AND NVL(I.IDITEMAJUSTE, 'N') = 'N'
                           AND NVL(NVL(I.QTATENDPEDOL, I.QTPROGENPEOL), 0) > 0
                           AND (P_SUBGRUPO =  'T' OR EXISTS (SELECT 1
                                                                FROM PRSUBGRPROD PR, PARASUPRI PA
                                                               WHERE PR.CDPRODUTO  = I.CDPRODUTO AND
                                                                     PR.CDGRUPPROD = PA.CDGRUPPROD   AND
                                                                     NVL(F.CDFILCENTCMP, F.CDFILIAL) = PA.CDFILIAL AND
                                                                     PR.CDFILISUBGR = 'P' AND
                                                                     (INSTR(P_SUBGRUPO, PR.CDSUBGRPROD) > 0)))
                           AND INSTR(P_STATUS, CASE NVL(I.IDBAIXAOLSAI, '0')
                                                  WHEN '0'
                                                  THEN CASE TO_CHAR(I.QTATENDPEDOL)
                                                          WHEN '-1'
                                                          THEN NVL(I.IDBAIXAOLSAI, '0')
                                                          ELSE '9'
                                                       END
                                                  ELSE NVL(I.IDBAIXAOLSAI, '0')
                                               END) > 0
                           AND ((P_VERIFICACNPJ IS NULL) OR
                                (EXISTS (SELECT 1
                                           FROM EMPRESA
                                          WHERE CDEMPRESA      = P.CDEMPRESA
                                            AND P_VERIFICACNPJ = CASE NRINSJUREMPR
                                                                    WHEN P_NRINSJUREMPR
                                                                    THEN 'I'
                                                                    ELSE 'D'
                                                                 END)))
                         ORDER BY CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO)

      LOOP
      V_QUANT_ESTOQUE   := 0;
      V_ESTOQ_RESERVADO := 0;
      V_ESTOQUE_TOTAL   := 0;
      V_CONTATODOS      := V_CONTATODOS + 1;
      SELECT MAX(CALC_ESTOQ_CONS(P_FILOPELOG, Q.CDPRODUTO, Q.DTPOSESTCON)) QUANT_ESTOQUE
        INTO V_QUANT_ESTOQUE
        FROM (SELECT MAX(P.CDPRODUTO) CDPRODUTO, NVL(MAX(DTPOSESTCON), SYSDATE) AS DTPOSESTCON
                FROM (SELECT DECODE (R.CDPRODARVOL, P.CDPRODESTO, R.CDPRODARVOL, PR.CDPRODUTO) AS CDPRODUTO
                        FROM RELACPRODOL R, PRODUTO P, PRODUTO PR
                       WHERE P.CDPRODUTO   = R.CDPRODARVOL
                         AND P.CDPRODESTO  = PR.CDPRODUTO
                         AND R.CDPRARVORIG = C_RESERVA.CDPRODUTO
                         AND R.CDMARCA     = C_RESERVA.CDMARCA) P, POSESTCONS E
                WHERE E.CDFILIAL  = P_FILOPELOG
                  AND E.CDPRODUTO = P.CDPRODUTO) Q;

      SELECT SUM(QTRESERVESTOL) INTO V_ESTOQ_RESERVADO
        FROM RESERVAPEDEXOL
       WHERE CDPRODUTO    =  C_RESERVA.CDPRODUTO
         AND CDMARCA      =  C_RESERVA.CDMARCA
         AND CDFILRESOL   =  P_FILOPELOG
         AND (CDFILDEST   <> C_RESERVA.CDFILDEST
          OR CDFILLANC    <> C_RESERVA.CDFILLANC
          OR NRPEDEXOL    <> C_RESERVA.NRPEDEXOL
          OR DTPROGENPEOL <> C_RESERVA.DTPROGENPEOL);

         V_ESTOQUE_TOTAL := NVL(V_QUANT_ESTOQUE, 0) - (NVL(V_ESTOQ_RESERVADO, 0) + C_RESERVA.QTPROGENPEOL);

         IF V_ESTOQUE_TOTAL >= 0 THEN
            V_CONTARESERVA := V_CONTARESERVA+1;
            BEGIN
               INSERT
                 INTO RESERVAPEDEXOL (CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO,
                      DTPROGENPEOL, QTRESERVESTOL, CDFILRESOL, DTRESEMBARQ)
               VALUES (C_RESERVA.CDFILDEST, C_RESERVA.CDFILLANC, C_RESERVA.NRPEDEXOL, C_RESERVA.CDMARCA, C_RESERVA.CDPRODUTO,
                      C_RESERVA.DTPROGENPEOL, C_RESERVA.QTPROGENPEOL, C_RESERVA.CDFILIOPELOG, C_RESERVA.DTPROGEMBARQ);
            EXCEPTION
               WHEN OTHERS THEN BEGIN
                  UPDATE RESERVAPEDEXOL
                     SET QTRESERVESTOL = C_RESERVA.QTPROGENPEOL
                   WHERE CDFILDEST     = C_RESERVA.CDFILDEST
                     AND CDFILLANC     = C_RESERVA.CDFILLANC
                     AND NRPEDEXOL     = C_RESERVA.NRPEDEXOL
                     AND DTPROGENPEOL  = C_RESERVA.DTPROGENPEOL
                     AND CDMARCA       = C_RESERVA.CDMARCA
                     AND CDPRODUTO     = C_RESERVA.CDPRODUTO
                     AND QTRESERVESTOL <> C_RESERVA.QTPROGENPEOL;
               END;
            END;
            V_CONTADOR := V_CONTADOR+1;
            IF V_CONTADOR >= 500 THEN
               V_CONTADOR := 0;
               COMMIT;
            END IF;
         END IF;
      END LOOP;
   END IF;
   COMMIT;
   IF V_CONTARESERVA <> V_CONTATODOS THEN
      P_ROWSAFFECT := 'N';
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('INCLUI_RESERVA_OL','6.10.XXX'); END;
/
