CREATE OR REPLACE FUNCTION CARREGA_LIMISEGU_OL
(
   P_CDFILIAL        IN FILIAL.CDFILIAL%TYPE,
   P_CDARVPROD       IN PRODUTO.CDARVPROD%TYPE,
   P_DTENTREGA       IN DATE,
   P_NRLIMISEGU      IN LIMISEGPROD.NRLIMISEGU%TYPE DEFAULT NULL,
   P_CDPERIENTR      IN PERFILPROD.CDPERIENTR%TYPE DEFAULT NULL,
   P_MAXCDARVPROD    IN PRODUTO.CDARVPROD%TYPE     DEFAULT NULL
)  RETURN NUMBER
IS
   V_NRLIMISEGU             LIMISEGPROD.NRLIMISEGU%TYPE := P_NRLIMISEGU;
   V_NRLIMISEGCAD           LIMISEGPROD.NRLIMISEGU%TYPE;
   V_CDPERIENTR             PERIENTR.CDPERIENTR%TYPE := P_CDPERIENTR;
   V_IDDNULIMSEG            PERIENTR.IDDNULIMSEGP%TYPE;
   V_COUNT                  NUMBER := 0;
   V_NFERICOMP              NUMBER := 0;
   V_NRLIMISEGU_UTIL        NUMBER := 0;
   V_CDARVPROD              PRODUTO.CDARVPROD%TYPE;
BEGIN
   IF P_CDARVPROD IS NOT NULL THEN
      IF P_MAXCDARVPROD IS NULL THEN
         SELECT MAX(CDARVPROD)
           INTO V_CDARVPROD
           FROM LIMISEGPROD A, PRODUTO B
          WHERE (A.CDPRODUTO = B.CDPRODUTO)
            AND (A.CDFILIAL  = P_CDFILIAL)
            AND (INSTR(P_CDARVPROD, B.CDARVPROD) = 1);
      ELSE
         V_CDARVPROD := P_MAXCDARVPROD;
      END IF;
      IF V_CDARVPROD IS NOT NULL THEN
         SELECT NVL(MAX(TO_NUMBER(NRLIMISEGU)), 0)
           INTO V_NRLIMISEGU
           FROM LIMISEGPROD, PRODUTO
          WHERE (LIMISEGPROD.CDPRODUTO = PRODUTO.CDPRODUTO)
            AND (LIMISEGPROD.CDFILIAL  = P_CDFILIAL)
            AND (PRODUTO.CDARVPROD     = V_CDARVPROD);
      END IF;
      IF V_NRLIMISEGU > 0 THEN
         SELECT NVL(MAX(CDPERIENTR), 'XX')
           INTO V_CDPERIENTR
           FROM PERFILPROD
          WHERE CDFILIAL = P_CDFILIAL
            AND CDPRODUTO = (SELECT MAX(B.CDARVPROD)
                               FROM PERFILPROD A, PRODUTO B
                              WHERE A.CDPRODUTO = B.CDPRODUTO
                                AND A.CDFILIAL  = P_CDFILIAL
                                AND INSTR(V_CDARVPROD, B.CDARVPROD) = 1);
      END IF;
   END IF;
   IF V_NRLIMISEGU > 0 THEN
      IF V_CDPERIENTR <> 'XX' THEN
         SELECT NVL(MAX(PERIENTR.IDDIANUTIL), 'N')
           INTO V_IDDNULIMSEG
           FROM PERIENTR
          WHERE PERIENTR.CDPERIENTR = V_CDPERIENTR;
      END IF;
      IF V_IDDNULIMSEG IS NULL THEN
         SELECT NVL(MAX(PARASUPRI.IDDNULIMSEG), 'N')
           INTO V_IDDNULIMSEG
           FROM PARASUPRI, FILIAL
          WHERE FILIAL.CDFILIAL    = P_CDFILIAL
            AND PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL);
      END IF;
      IF V_IDDNULIMSEG = 'S' THEN
         FOR C_DATA IN (SELECT DTDATA
                          FROM DATA
                         WHERE DTDATA BETWEEN P_DTENTREGA-60 AND P_DTENTREGA
                         ORDER BY DTDATA DESC) LOOP

            SELECT COUNT(*)
              INTO V_COUNT
              FROM FERICOMP
             WHERE CDFILIAL   = P_CDFILIAL
               AND DTFERICOMP = C_DATA.DTDATA AND
               NOT EXISTS (SELECT /*+ FIRST_ROWS(1)*/
                                  1
                             FROM CALECOMP
                            WHERE CALECOMP.CDFILIAL   = P_CDFILIAL
                              AND CALECOMP.DTENTREGA  = DTFERICOMP
                              AND CALECOMP.CDPERIENTR = V_CDPERIENTR);

            IF V_COUNT = 0 THEN
               V_NFERICOMP := V_NFERICOMP + 1;
            END IF;

            V_NRLIMISEGU_UTIL := V_NRLIMISEGU_UTIL + 1;
            IF V_NFERICOMP = V_NRLIMISEGU THEN
               V_NRLIMISEGU := V_NRLIMISEGU_UTIL;
               EXIT;
            END IF;
         END LOOP;
      END IF;
   END IF;
   RETURN(NVL(V_NRLIMISEGU, 0));
END;
/