create or replace FUNCTION BUSCA_DATA_PRODUCAO( P_CDFILIAL IN FILIAL.CDFILIAL%TYPE,
                                                P_CDPRODUTO IN PRODUTO.CDPRODUTO%TYPE,
                                                P_CDPERIPRODU IN PERIPRODUCAO.CDPERIPRODU%TYPE,
                                                P_NRTOTLOTEDIA IN INTEGER,
                                                P_DTMRP IN DATE,
                                                P_DTPRODUCAO IN DATE,
                                                P_QTAFABRICDIA IN FLOAT,
                                                P_GERACALE OUT VARCHAR2) RETURN DATE
IS
   V_NRLOTESDIAS INT;
   V_GERACALE VARCHAR2(1);
   V_DTAPRODUZIR DATE;
   V_MSGERROR VARCHAR2(20);
   V_QTVENDAPCP FLOAT;
BEGIN

   V_GERACALE := 'S';
   SELECT
      MAX(DTPRODUCAO)
     INTO
      V_DTAPRODUZIR
     FROM
      CALEPRODUCAO
    WHERE
      (CDFILIAL             = P_CDFILIAL)             AND
      (CDPERIPRODU          = P_CDPERIPRODU)  AND
      (TO_DATE(DTPRODUCAO) <= TO_DATE(P_DTPRODUCAO));

   SELECT MAX(QTVENDAPCP)
     INTO V_QTVENDAPCP
     FROM PROGPRODU
    WHERE (CDFILIAL  = P_CDFILIAL)
      AND CDPRODUTO = P_CDPRODUTO
      AND (DTPROGPRODU = P_DTMRP)
      AND (TRUNC(DTENTPROD) = TO_DATE(P_DTPRODUCAO));

   IF NOT V_DTAPRODUZIR IS NULL THEN

      V_DTAPRODUZIR := (V_DTAPRODUZIR + (P_DTPRODUCAO - TRUNC(P_DTPRODUCAO)));

      V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');
      VERIFICA_SALDO_LOTE_PROD(  P_CDFILIAL,
                                 P_CDPRODUTO,
                                 P_DTMRP,
                                 V_DTAPRODUZIR,
                                 V_QTVENDAPCP, -- P_QTAFABRICDIA,
                                 V_GERACALE);
      P_GERACALE := V_GERACALE;
      IF(V_GERACALE = 'S')THEN
         SELECT
            COUNT(*)
         INTO
            V_NRLOTESDIAS
         FROM
            CALEPRODMRP
         WHERE
            (CDFILIAL              = P_CDFILIAL)          AND
            (DTPROGPRODCP          = P_DTMRP)             AND
            (CDPRODUTO             = P_CDPRODUTO) AND
            (TO_DATE(DTCONCPROMRP) = TO_DATE(V_DTAPRODUZIR));
         IF (V_NRLOTESDIAS = P_NRTOTLOTEDIA) THEN
            V_DTAPRODUZIR := V_DTAPRODUZIR - 1;
            V_DTAPRODUZIR := BUSCA_DATA_PRODUCAO( P_CDFILIAL, P_CDPRODUTO, P_CDPERIPRODU,
                                                  P_NRTOTLOTEDIA, P_DTMRP, V_DTAPRODUZIR,
                                                  V_QTVENDAPCP, -- P_QTAFABRICDIA
                                                  V_GERACALE);
            IF V_DTAPRODUZIR < SYSDATE THEN
               V_DTAPRODUZIR := NULL;
               P_GERACALE := 'M';
               RETURN(V_DTAPRODUZIR);
            ELSE
               P_GERACALE := V_GERACALE;
               RETURN(V_DTAPRODUZIR);
            END IF;
         ELSE
            P_GERACALE := V_GERACALE;
            RETURN(V_DTAPRODUZIR);
         END IF;
      ELSE
         RETURN( V_DTAPRODUZIR);
      END IF;
   ELSE
      P_GERACALE := 'C';
      RETURN(V_DTAPRODUZIR);
   END IF;
END;
/