CREATE OR REPLACE FUNCTION CALCULA_DATAEMBARQUE_OL(
   P_CDFILIOPELOG IN FILIAL.CDFILIAL%TYPE,
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_CDARVPROD    IN PRODUTO.CDARVPROD%TYPE,
   P_DTENTREGA    IN DATE,
   P_CDARVPRODEMB IN PRODUTO.CDARVPROD%TYPE DEFAULT NULL) RETURN DATE IS

   V_NRLIMISEGU   NUMBER(5);
   V_NRCONTA      NUMBER(5);

   V_DTENTREGA    DATE;
   V_ENTREGA_MENOS_ANO DATE;
   V_ENTREGA_MENOS_DIA DATE;

   V_CONTAUXI     INT;

   V_IDDNULIMSEG  CHAR(1);
   W_N            CHAR(1):= 'N';
   W_S            CHAR(1):= 'S';

   /* Cursor com dias uteis no intervalo de um ano a partir da data de entrega */
   CURSOR C_MAIORDATA IS
      SELECT
          DTDATA
       FROM
          DATA
       WHERE
          (DTDATA BETWEEN V_ENTREGA_MENOS_ANO AND V_ENTREGA_MENOS_DIA) AND

          ((V_IDDNULIMSEG = W_N) OR ((V_IDDNULIMSEG = W_S)    AND
                                     (DTDATA NOT IN (SELECT
                                                        DTFERICOMP
                                                     FROM
                                                        FERICOMP
                                                     WHERE
                                                        (CDFILIAL   = P_CDFILIOPELOG) AND
                                                        (DTFERICOMP < P_DTENTREGA)))))
       ORDER BY
          DTDATA DESC;
BEGIN
   V_ENTREGA_MENOS_ANO := P_DTENTREGA - 364;
   V_ENTREGA_MENOS_DIA := P_DTENTREGA - 1;
   V_NRLIMISEGU := 0;
   V_DTENTREGA  := P_DTENTREGA;
   IF P_CDARVPRODEMB IS NULL THEN
      SELECT NVL(MAX(TO_NUMBER(NRDIAEMBARQUE)),0), NVL(MAX(IDSOMENTEUTIL), 'S')
      INTO V_NRLIMISEGU, V_IDDNULIMSEG
      FROM DATAEMBARQUEOL, PRODUTO
      WHERE DATAEMBARQUEOL.CDPRODUTO    = PRODUTO.CDPRODUTO
        AND DATAEMBARQUEOL.CDFILIAL     = P_CDFILIAL
        AND DATAEMBARQUEOL.CDFILIOPELOG = P_CDFILIOPELOG
        AND PRODUTO.CDARVPROD = (SELECT MAX(CDARVPROD)
                                 FROM DATAEMBARQUEOL A, PRODUTO B
                                 WHERE A.CDFILIAL     = P_CDFILIAL
                                   AND A.CDFILIOPELOG = P_CDFILIOPELOG
                                   AND A.CDPRODUTO    = B.CDPRODUTO
                                   AND INSTR(P_CDARVPROD, B.CDARVPROD) = 1);

   ELSE
      SELECT NVL(MAX(TO_NUMBER(NRDIAEMBARQUE)),0), NVL(MAX(IDSOMENTEUTIL), 'S')
        INTO V_NRLIMISEGU, V_IDDNULIMSEG
        FROM DATAEMBARQUEOL, PRODUTO
       WHERE DATAEMBARQUEOL.CDPRODUTO    = PRODUTO.CDPRODUTO
         AND DATAEMBARQUEOL.CDFILIAL     = P_CDFILIAL
         AND DATAEMBARQUEOL.CDFILIOPELOG = P_CDFILIOPELOG
         AND PRODUTO.CDARVPROD           = P_CDARVPRODEMB;
   END IF;
   IF V_NRLIMISEGU > 0 THEN
      OPEN C_MAIORDATA;
      FOR V_NRCONTA IN 1..V_NRLIMISEGU LOOP
         /* Busca a ultima data ate o n de dias para embarque */
         FETCH C_MAIORDATA INTO V_DTENTREGA;
         EXIT WHEN C_MAIORDATA%NOTFOUND;
      END LOOP;
      CLOSE C_MAIORDATA;
   END IF;

   IF V_IDDNULIMSEG = W_S THEN
      V_CONTAUXI := 1;
   END IF;
   
   WHILE V_CONTAUXI > 0 LOOP
     SELECT COUNT(*) INTO V_CONTAUXI
     FROM FERICOMP
     WHERE CDFILIAL   = P_CDFILIOPELOG
       AND DTFERICOMP = V_DTENTREGA;
     IF V_CONTAUXI > 0 THEN
        V_DTENTREGA := V_DTENTREGA - 1;
     END IF;
   END LOOP;
   RETURN(V_DTENTREGA);
END;
/