DROP PROCEDURE GERA_CALE_PRODU
/


create or replace
FUNCTION GERA_CALE_PRODU
   (P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
    P_DTMRP         IN PROGPRODU.DTPROGPRODU%TYPE,
    P_IDESTOQUE     IN PROGPRODU.IDESTOQUEMRP%TYPE,
    P_CDPRODUTO     IN PRODUTO.CDPRODUTO%TYPE,
    P_DTENTPROD     IN PROGPRODU.DTENTPROD%TYPE,
    P_NRORDENAOP    IN CALEPRODMRP.NRORDENAOP%TYPE,
    P_NRORDENASUBOP IN CALEPRODMRP.NRORDENASUBOP%TYPE,
    P_IDSUBOPINSU   IN INSUMETAPA.IDSUBOPINSU%TYPE,
    P_CDPRODFINAL   IN PRODUTO.CDPRODUTO%TYPE,
    P_QTAFABRICDIA  IN FLOAT,
    P_ORDENAPRODUCAO IN FLOAT,
    P_QTESTOQUE  IN FLOAT,
    P_IDVALIDCALEPROD IN VARCHAR2 DEFAULT 'S'
   ) RETURN FLOAT
    IS
   V_QTAFABRICARR   PROGPRODU.QTAFABRICPCP%TYPE;
   V_QTHORASPROD    NUMBER;
   V_DTAPRODUZIR    PROGPRODU.DTENTPROD%TYPE;
   V_DTPRODUCAO     DATE;
   V_QTFABLOTEDIA   FLOAT;
   V_QTTOTFABDIA    FLOAT;
   V_NRLOTESDIAS    INTEGER;
   V_NRTOTLOTEDIA   INTEGER;
   V_NRSEQLOTEDIA   CALEPRODMRP.NRSEQLOTEDIA%TYPE;
   V_VEXISHORATUR   TURNO_PRODUCAO.HRINITURNO%TYPE;
   V_TURNOINIANT    TURNO_PRODUCAO.HRINITURNO%TYPE;
   V_TURNOFIMANT    TURNO_PRODUCAO.HRFIMTURNO%TYPE;
   V_TURNOAUXI      INTEGER;
   V_DTTURNOAUXI    NUMBER;
   V_LOTEDISPON     VARCHAR2(1);
   V_IDSUBOPSEMIACA PARAMAN.IDSUBOPSEMIACA%TYPE;
   V_NRORDENAOP     CALEPRODMRP.NRORDENAOP%TYPE;
   V_NRORDENASUBOP  CALEPRODMRP.NRORDENASUBOP%TYPE;
   V_IDUTEQUIPLAPROD PARAMAN.IDUTEQUIPLAPROD%TYPE;
   V_QTEQUIPPRODU FLOAT;
   V_DTPRODEQUIP DATE;
   V_QTDEMINUTOSUTI FLOAT;
   V_DTRESEREQUIP DATE;
   V_CONTATIV     INTEGER;
   V_DTPRODFINAL  DATE;
   V_CDCHAVE VARCHAR2(50);
   V_DTATIVANT DATE;
   V_GERACALE VARCHAR2(1);
   V_QTAFABRICDIA FLOAT;
   V_SALDO FLOAT;
   V_NRORDEMPROD FLOAT;
   V_NRTURNOEQUIP TURNO_PRODUCAO.NRTURNO%TYPE;
   V_MSGERROR VARCHAR2(50);


BEGIN
   V_NRORDENAOP    := P_NRORDENAOP;
   V_NRORDENASUBOP := P_NRORDENASUBOP;
   V_QTAFABRICARR := 0;
   V_GERACALE := 'S';
   V_MSGERROR := '';

   -- Arredonda a quantidade a fabricar de acordo com o processo de fabricacao
   FOR C_PRODARRED IN
      (SELECT
          CDPRODUTO,
          P_QTAFABRICDIA AS QTAFABRICPCP,
          QTPADPROCFAB AS QTPADPRODPCP,
          QTLOTEFABDIA,
          IDTPPROPOPF AS IDPROPORCAO,
          IDTPARREDPF AS IDARREDONDA
       FROM
          PROCFABRICA
       WHERE
          (CDFILIAL     =  P_CDFILIAL)  AND
          (CDPRODUTO    = P_CDPRODUTO) AND
          (IDPROFABPADR = 'S')
      )
   LOOP
      IF C_PRODARRED.IDPROPORCAO = 'L' THEN
         IF C_PRODARRED.IDARREDONDA = '1' THEN
            IF (MOD(C_PRODARRED.QTAFABRICPCP, C_PRODARRED.QTPADPRODPCP) <> 0) THEN
               V_QTAFABRICARR := ((TRUNC(C_PRODARRED.QTAFABRICPCP / C_PRODARRED.QTPADPRODPCP) + 1) * C_PRODARRED.QTPADPRODPCP);
            ELSE
               V_QTAFABRICARR := ((C_PRODARRED.QTAFABRICPCP / C_PRODARRED.QTPADPRODPCP) * C_PRODARRED.QTPADPRODPCP);
            END IF;
         ELSE
            IF C_PRODARRED.IDARREDONDA = '2' THEN
               V_QTAFABRICARR := ((TRUNC(C_PRODARRED.QTAFABRICPCP / C_PRODARRED.QTPADPRODPCP)) * C_PRODARRED.QTPADPRODPCP);
            END IF;
         END IF;
      ELSE
         IF C_PRODARRED.IDPROPORCAO IN ('N', 'U') THEN
            V_QTAFABRICARR := V_QTAFABRICARR + P_QTAFABRICDIA;
         ELSE
            V_QTAFABRICARR := V_QTAFABRICARR + C_PRODARRED.QTPADPRODPCP;
         END IF;
      END IF;
   END LOOP;
  -- COLOCAR O RASCUNHO AQUI 

  -- GERA A ORDENACAO PARA A VERIFICACAO DOS SEMIACABADOS DE ACORDO COM O CALENDARIO DA PRODUCAO
   IF P_ORDENAPRODUCAO IS NULL THEN
      BEGIN
         SELECT MAX(NVL(NRORDEMPROD,0)) + 1
         INTO  V_NRORDEMPROD
         FROM CALEPRODMRP
         WHERE
            CDFILIAL = P_CDFILIAL AND
            DTPROGPRODCP = P_DTMRP;

         IF V_NRORDEMPROD IS NULL THEN
            V_NRORDEMPROD := 1;
         END IF;

      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_NRORDEMPROD := 1;
      END;
   ELSE
      V_NRORDEMPROD := P_ORDENAPRODUCAO;
   END IF;

  -- Monta o Calendario da Producao
   FOR C_PRODMRP IN
      (SELECT
          PROC.CDPRODUTO,
          P_DTENTPROD AS DTENTPROD,
          PA.CDPERIPRODU,
          TO_NUMBER( DECODE( NVL(IDAPLICHRSEG, 'L'), 'L', NVL(PA.QTHRSEGPROD,0), 0)) AS QTHRSEGPROD,
          QTLOTEFABDIA,
          V_QTAFABRICARR AS QTAFABRICARR,
          QTPADPROCFAB QTPADPRODPCP,
          (QTPADPROCFAB * QTLOTEFABDIA) AS QTPADPRODUCAO,
          PROC.IDTPPROPOPF AS IDPROPORCAO,
          PROC.IDTPARREDPF AS IDARREDONDA
       FROM
          PROCFABRICA PROC,
          PARAMPRODMRP PA
       WHERE
          (PA.CDFILIAL       = PROC.CDFILIAL)  AND
          (PA.CDPRODUTO      = PROC.CDPRODUTO) AND
          (PROC.CDFILIAL     = P_CDFILIAL)  AND
          (PROC.CDPRODUTO    = P_CDPRODUTO) AND
          (PROC.IDPROFABPADR = 'S')
      )
   LOOP
      IF C_PRODMRP.IDPROPORCAO = 'L' THEN
         V_QTFABLOTEDIA := C_PRODMRP.QTPADPRODPCP;

      ELSE
         IF C_PRODMRP.IDPROPORCAO = 'N' THEN
            IF C_PRODMRP.QTAFABRICARR <= C_PRODMRP.QTPADPRODPCP THEN
               V_QTFABLOTEDIA := C_PRODMRP.QTAFABRICARR;
            ELSE
               IF C_PRODMRP.QTAFABRICARR = C_PRODMRP.QTPADPRODUCAO THEN
                  V_QTFABLOTEDIA := C_PRODMRP.QTPADPRODPCP;
               ELSE
                  IF (C_PRODMRP.QTAFABRICARR > C_PRODMRP.QTPADPRODUCAO) THEN
                     IF((MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODUCAO)) >= C_PRODMRP.QTPADPRODPCP)OR
                     (MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODUCAO) = 0) THEN
                        V_QTFABLOTEDIA := C_PRODMRP.QTPADPRODPCP;
                     ELSE
                        V_QTFABLOTEDIA := MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODUCAO);
                     END IF;
                  ELSE
                     IF((MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODPCP)) >= C_PRODMRP.QTPADPRODPCP)OR((MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODPCP) = 0)) THEN
                        V_QTFABLOTEDIA := C_PRODMRP.QTPADPRODPCP;
                     ELSE
                        V_QTFABLOTEDIA := MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODPCP);
                     END IF;
                  END IF;
               END IF;
            END IF;
         ELSE
            IF C_PRODMRP.IDPROPORCAO = 'U' THEN
               V_QTFABLOTEDIA := C_PRODMRP.QTAFABRICARR;
            ELSE
               IF C_PRODMRP.IDPROPORCAO = 'D' THEN
                  IF C_PRODMRP.IDARREDONDA = '1' THEN
                     IF (MOD(C_PRODMRP.QTAFABRICARR, C_PRODMRP.QTPADPRODPCP) <> 0) THEN
                        V_QTFABLOTEDIA := (C_PRODMRP.QTAFABRICARR / (TRUNC(C_PRODMRP.QTAFABRICARR / C_PRODMRP.QTPADPRODPCP) + 1));
                     ELSE
                        V_QTFABLOTEDIA := (C_PRODMRP.QTAFABRICARR / (C_PRODMRP.QTAFABRICARR / C_PRODMRP.QTPADPRODPCP));
                     END IF;
                  ELSE
                     IF C_PRODMRP.IDARREDONDA = '2' THEN
                        IF(C_PRODMRP.QTAFABRICARR  < C_PRODMRP.QTPADPRODPCP) THEN
                           V_QTFABLOTEDIA := 0;
                        ELSE
                           V_QTFABLOTEDIA := (C_PRODMRP.QTAFABRICARR / (TRUNC(C_PRODMRP.QTAFABRICARR / C_PRODMRP.QTPADPRODPCP)));
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;
      END IF;

      V_NRTOTLOTEDIA := C_PRODMRP.QTLOTEFABDIA;
      V_DTAPRODUZIR  := C_PRODMRP.DTENTPROD;

      -- Qtde. total a fabricar do dia 
      IF V_QTFABLOTEDIA > 0 THEN
         V_QTTOTFABDIA  := C_PRODMRP.QTAFABRICARR;
      ELSE
        -- VERIFICAR SE E NECESSARIO ESTE PONTO 
         V_QTTOTFABDIA  := 0;
         DELETE FROM PROGPRODU
         WHERE
            CDFILIAL    = P_CDFILIAL AND
            DTPROGPRODU = P_DTMRP AND
            CDPRODUTO   = C_PRODMRP.CDPRODUTO AND
            DTENTPROD   = C_PRODMRP.DTENTPROD;

      END IF;

    
      BEGIN
         SELECT IDUTEQUIPLAPROD
         INTO V_IDUTEQUIPLAPROD
         FROM PARAMAN
         WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDUTEQUIPLAPROD := 'N';
      END;

      WHILE ((V_QTTOTFABDIA > 0) AND (V_DTAPRODUZIR > SYSDATE))  LOOP
         -- verifica o tempo gasto para produzir o produto 
         IF V_IDUTEQUIPLAPROD = 'N' THEN
         
            SELECT
               NVL(MAX(A.QTHRETFABRIC),0)
            INTO
               V_QTHORASPROD
            FROM
               (SELECT
                   SUM(B.QTHRETFABRIC) AS QTHRETFABRIC
                FROM
                   (SELECT
                       P.CDPROCFABRIC,
                       E.NRORDETFAB,
                       MAX(NVL(T.QTHRETFABRPR, 0)) AS QTHRETFABRIC
                    FROM
                       PROCFABRICA P,
                       TEMPOETAFABR T,
                       ETAFABRIC E
                    WHERE
                       (P.CDFILIAL     = P_CDFILIAL)          AND
                       (P.CDPRODUTO    = C_PRODMRP.CDPRODUTO) AND
                       (P.IDPROFABPADR = 'S')                 AND
                       (E.CDFILIAL     = P.CDFILIAL)          AND
                       (E.CDPRODUTO    = P.CDPRODUTO)         AND
                       (E.CDPROCFABRIC = P.CDPROCFABRIC)      AND
                       (E.CDFILIAL     = T.CDFILIAL     (+))  AND
                       (E.CDPRODUTO    = T.CDPRODUTO    (+))  AND
                       (E.CDPROCFABRIC = T.CDPROCFABRIC (+))  AND
                       (E.CDETAPAPROD  = T.CDETAPAPROD  (+))  AND
                       (V_QTFABLOTEDIA BETWEEN T.VRINIQTFABPR (+) AND T.VRFINQTFABPR (+))
                    GROUP BY
                       P.CDPROCFABRIC,
                       E.NRORDETFAB
                   ) B
               ) A;
               
             -- Verifica quantos lotes ja foram produzidos na data   
             
             SELECT 
                 MAX(NRSEQLOTEDIA) 
             INTO 
                 V_NRSEQLOTEDIA 
             FROM 
                 CALEPRODMRP 
             WHERE 
                  (CDFILIAL              = P_CDFILIAL)          AND 
                  (DTPROGPRODCP          = P_DTMRP)             AND 
                  (CDPRODUTO             = C_PRODMRP.CDPRODUTO) AND
                  (TO_DATE(DTCONCPROMRP) = TO_DATE(V_DTAPRODUZIR));

            
                /* Forca a producao maxima de lotes por dia. Por isso, apenas
                 ira mudar a data de producao quando for o primeiro lote a ser
                 produzido, ou quando ja tiver atingido a quantidade maxima de
                 lotes por dia (Cadastrada no Processo de Fabricacao)*/
			
            IF (TO_NUMBER(V_NRSEQLOTEDIA) >= V_NRTOTLOTEDIA)or(V_NRSEQLOTEDIA IS NULL) THEN

                V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');

                V_DTAPRODUZIR := (V_DTAPRODUZIR - (V_QTHORASPROD/24) - (C_PRODMRP.QTHRSEGPROD/24));


                V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');


                V_DTAPRODUZIR :=  BUSCA_DATA_PRODUCAO( P_CDFILIAL, P_CDPRODUTO, C_PRODMRP.CDPERIPRODU,
                                                       C_PRODMRP.QTLOTEFABDIA, P_DTMRP, V_DTAPRODUZIR, P_QTAFABRICDIA, V_GERACALE);

-- RAISE_APPLICATION_ERROR(-20405, TO_CHAR(V_DTAPRODUZIR, 'DD/MM/YYYY HH24:MI:SS'), TRUE);

            END IF;



            IF V_GERACALE = 'M' THEN
               INSERT INTO INCONSMRP
               (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
               (SELECT P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, 'P'
                  FROM DUAL
                 WHERE NOT EXISTS (SELECT P_CDFILIAL
                                FROM INCONSMRP
                                WHERE
                                   CDFILIAL     = P_CDFILIAL          AND
                                   DTPROGPRODIN = P_DTMRP             AND
                                   CDPRODUTO    = C_PRODMRP.CDPRODUTO));
               EXIT;
            ELSE
               IF V_GERACALE = 'C' THEN
                  INSERT INTO INCONSMRP
                  (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
                  (SELECT P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, 'C'
                     FROM DUAL
                    WHERE NOT EXISTS (SELECT P_CDFILIAL
                                   FROM INCONSMRP
                                   WHERE
                                      CDFILIAL     = P_CDFILIAL          AND
                                      DTPROGPRODIN = P_DTMRP             AND
                                      CDPRODUTO    = C_PRODMRP.CDPRODUTO));
                  EXIT;
               END IF;
            END IF;

            IF V_GERACALE = 'S' THEN
               V_LOTEDISPON := 'S';
            ELSE
               V_LOTEDISPON := 'N';
            END IF;


            IF (( V_LOTEDISPON = 'S') AND (V_DTAPRODUZIR > SYSDATE)) THEN
               SELECT
                  MAX(NRSEQLOTEDIA)
               INTO
                  V_NRSEQLOTEDIA
               FROM
                  CALEPRODMRP
               WHERE
                  (CDFILIAL              = P_CDFILIAL)          AND
                  (DTPROGPRODCP          = P_DTMRP)             AND
                  (CDPRODUTO             = C_PRODMRP.CDPRODUTO) AND
                  (TO_DATE(DTCONCPROMRP) = TO_DATE(V_DTAPRODUZIR));
               IF V_NRSEQLOTEDIA IS NULL THEN
                  V_NRSEQLOTEDIA := '001';
               ELSE
                  V_NRSEQLOTEDIA := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRSEQLOTEDIA) + 1)),3,'0');
               END IF;
            END IF;
         ELSE

          --   ROTINA MRP II: CONSIDERA EQUIPAMENTOS E HABILIDADES NO PLANEJAMENTO


            V_QTEQUIPPRODU :=  V_QTFABLOTEDIA;
            V_DTPRODEQUIP := V_DTAPRODUZIR;
            V_QTDEMINUTOSUTI := 0;
            V_CDCHAVE := 'M';

          -- VERIFICA SE EXISTE ATIVIDADES CADASTRADAS PARA O PRODUTO
          -- ELAS SAO NECESSARIAS PARA O CALCULO DO TEMPO
            SELECT COUNT(*)
            INTO V_CONTATIV
            FROM
               PROCFABRICA P, ETAFABRIC E, INSPETAPA I,
               RECURETAPA R
            WHERE
               (P.CDFILIAL     = P_CDFILIAL) AND
               (P.CDPRODUTO    = C_PRODMRP.CDPRODUTO) AND
               (P.IDPROFABPADR = 'S')AND
               (QTHRUTRECUR > 0) AND
               (E.CDFILIAL     = P.CDFILIAL) AND
               (E.CDPRODUTO    = P.CDPRODUTO) AND
               (E.CDPROCFABRIC = P.CDPROCFABRIC) AND
                I.CDFILIAL     = E.CDFILIAL AND
                I.CDPRODUTO    = E.CDPRODUTO AND
                I.CDPROCFABRIC = E.CDPROCFABRIC AND
                I.CDETAPAPROD  = E.CDETAPAPROD AND
                R.CDFILIAL  =  I.CDFILIAL AND
                R.CDPRODUTO =   I.CDPRODUTO AND
                R.CDPROCFABRIC = I.CDPROCFABRIC AND
                R.CDETAPAPROD = I.CDETAPAPROD AND
                R.CDINSPECAO = I.CDINSPECAO AND
                R.NRINSPETAPA = I.NRINSPETAPA;
            IF (V_CONTATIV = 0) AND (P_IDVALIDCALEPROD = 'S') THEN
               INSERT INTO INCONSMRP (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
                                    (SELECT P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, 'A'
                                     FROM DUAL
                                     WHERE NOT EXISTS (SELECT P_CDFILIAL
                                                       FROM INCONSMRP
                                                       WHERE
                                                          CDFILIAL     = P_CDFILIAL AND
                                                          DTPROGPRODIN = P_DTMRP AND
                                                          CDPRODUTO    = C_PRODMRP.CDPRODUTO));
               EXIT;
            END IF;


            FOR C_DADOS IN(
               SELECT P.CDFILIAL,
                  E.NRORDETFAB, I.NRINSPETAPA, NRORDUTRECUR,
                  I.CDINSPECAO, I.CDPROCFABRIC, I.CDETAPAPROD, CDGRUPOEQUIPA,
                  I.NRORDINSETAP, QTHRUTRECUR, R.IDRECURETAPA, QTHRSETUPRECUR, NRRECURETAPA,
                  (SELECT
                      MAX(QTHRUTRECUR)AS QTDEHORAMAX
                     FROM
                        RECURETAPA
                     WHERE
                         CDFILIAL = P.CDFILIAL AND
                         CDPRODUTO = P.CDPRODUTO AND
                         CDPROCFABRIC = P.CDPROCFABRIC AND
                         CDETAPAPROD = E.CDETAPAPROD AND
                         CDINSPECAO = R.CDINSPECAO AND
                         NRINSPETAPA = R.NRINSPETAPA AND
                         NRORDUTRECUR =  R. NRORDUTRECUR) QTHRRECURSO,
                         P.CDFILIAL||C_PRODMRP.CDPRODUTO||I.CDPROCFABRIC||I.CDETAPAPROD||I.CDINSPECAO||I.NRINSPETAPA AS CDCHAVE
               FROM
                  PROCFABRICA P, ETAFABRIC E, INSPETAPA I,
                  RECURETAPA R
               WHERE
                  (P.CDFILIAL     = P_CDFILIAL) AND
                  (P.CDPRODUTO    = C_PRODMRP.CDPRODUTO) AND
                  (P.IDPROFABPADR = 'S')AND
                  (QTHRUTRECUR > 0) AND
                  (E.CDFILIAL     = P.CDFILIAL) AND
                  (E.CDPRODUTO    = P.CDPRODUTO) AND
                  (E.CDPROCFABRIC = P.CDPROCFABRIC) AND
                   I.CDFILIAL     = E.CDFILIAL AND
                   I.CDPRODUTO    = E.CDPRODUTO AND
                   I.CDPROCFABRIC = E.CDPROCFABRIC AND
                   I.CDETAPAPROD  = E.CDETAPAPROD AND
                   R.CDFILIAL  =  I.CDFILIAL AND
                   R.CDPRODUTO =   I.CDPRODUTO AND
                   R.CDPROCFABRIC = I.CDPROCFABRIC AND
                   R.CDETAPAPROD = I.CDETAPAPROD AND
                   R.CDINSPECAO = I.CDINSPECAO AND
                   R.NRINSPETAPA = I.NRINSPETAPA
               ORDER BY
                  E.NRORDETFAB, I.NRORDINSETAP, NRORDUTRECUR, I.CDINSPECAO, I.NRINSPETAPA)  LOOP


              -- PARA CONSIDERAR ATIVIDADES DA MESMA PRIORIDADE
               IF V_CDCHAVE <> C_DADOS.CDCHAVE THEN
                  V_CDCHAVE := C_DADOS.CDCHAVE;
                  V_DTATIVANT :=  V_DTPRODEQUIP;
               ELSE
                  V_DTPRODEQUIP := V_DTATIVANT;
               END IF;

               -- SE O RECURSO FOR UMA HABILIDADE
               IF C_DADOS.IDRECURETAPA = 'H' THEN
                  V_DTPRODEQUIP := V_DTPRODEQUIP - (C_DADOS.QTHRRECURSO/24) - (NVL(C_DADOS.QTHRSETUPRECUR,0)/24);
                  V_DTATIVANT :=  V_DTPRODEQUIP;
               -- SE O RECURSO FOR UM EQUIPAMENTO
               ELSE
                  -- BUSCA E PERCORRE TODOS OS EQUIPAMENTOS UTILIZADOS NA ETAPA
                  FOR C_EQUIPAMENTOS IN(SELECT NRORDUTILEQUIP, CDEQUIPPRO, VRCAPEQUIPPROD, QTHRUTIEQUIPROD,
                                            IDLIBERAEQUIPA,
                                            IDEQUIPPADRAO
                                        FROM  EQUIPRECUETAPA
                                        WHERE
                                            CDFILIAL     =  C_DADOS.CDFILIAL    AND
                                            CDPRODUTO    = C_PRODMRP.CDPRODUTO  AND
                                            CDPROCFABRIC = C_DADOS.CDPROCFABRIC AND
                                            CDETAPAPROD  = C_DADOS.CDETAPAPROD  AND
                                            CDINSPECAO   = C_DADOS.CDINSPECAO   AND
                                            NRINSPETAPA  = C_DADOS.NRINSPETAPA  AND
                                            NRRECURETAPA = C_DADOS.NRRECURETAPA
                                        ORDER BY IDEQUIPPADRAO DESC,  NRORDUTILEQUIP)LOOP

                     /*  Calcula quantidade de tempo necessaria para realizar a
                       etapa. A qtde. de tempo e igual a quantidade de produtos
                       a utilizar o equipamento multiplicada pelo tempo de
                       utilizacao. O resultado e dividido pela capacidade do
                       equipamento.

                       Ex.: Para produzir 10 UN de um produto cuja etapa utiliza:

                            Equipamento: Batedeira
                            Capacidade : 5
                            Tempo      : 10 min

                       Significa que uma batedeira e utilizada por 10 min para
                       produzir 5 UN do produto.
                       Logo, para produzir 10 UN, temos:

                          Tempo Total = (Qtde * tempo)/Capacidade =
                          (10 * 10)/5 = 20 min.*/

                     V_QTDEMINUTOSUTI :=   (V_QTEQUIPPRODU * C_EQUIPAMENTOS.QTHRUTIEQUIPROD)/ C_EQUIPAMENTOS.VRCAPEQUIPPROD;

                     /* A data de producao, a principio, e igual a data de entrega
                       menos o tempo de utilizacao do equipamento, menos o tempo
                       de Setup do equipamento */


                     V_DTPRODEQUIP := V_DTPRODEQUIP - ((V_QTDEMINUTOSUTI)/24) - ( NVL(C_DADOS.QTHRSETUPRECUR,0)/24);

                      /* Valida a data a produzir calculada (V_DTPRODEQUIP),
                        verificando se a mesma esta de acordo com as
                        parametrizacoes de turno e periodicidade da producao.
                        Se nao estiver, encontra a data e hora mais apropriada
                        e retorna em V_DTAPRODUZIR.*/

                     V_DTAPRODUZIR := VALIDA_DATA_PRODUCAO( P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO,
                                                            V_DTPRODEQUIP, V_NRTOTLOTEDIA,
                                                            C_PRODMRP.CDPERIPRODU,C_DADOS.QTHRSETUPRECUR,((V_QTDEMINUTOSUTI/24)+( NVL(C_DADOS.QTHRSETUPRECUR,0)/24)),
                                                            C_EQUIPAMENTOS.CDEQUIPPRO, V_DTPRODFINAL,C_DADOS.CDPROCFABRIC,C_DADOS.CDETAPAPROD,
                                                            C_DADOS.CDINSPECAO,C_DADOS.NRINSPETAPA,C_DADOS.NRRECURETAPA,V_QTEQUIPPRODU,
                                                            V_NRTURNOEQUIP,V_MSGERROR);
                                                            
                     
                     /*  Se o equipamento ja estiver alocado no periodo validado, 
                       para um produto do mesmo MRP, busca um equipamento alternativo
                       para refazer a validacao.
                       (O equipamento de menor ordem de utilizacao)  */           
                     
                       
                        IF V_DTAPRODUZIR IS NULL THEN
                           V_DTPRODEQUIP := V_DTPRODEQUIP + ((V_QTDEMINUTOSUTI)/24) + ( NVL(C_DADOS.QTHRSETUPRECUR,0)/24);
                           V_QTEQUIPPRODU := V_QTFABLOTEDIA;
                        ELSE
                       
                          -- BUSCA O SEQUENCIAL DO LOTE DIA 
                           SELECT
                              MAX(NRSEQLOTEDIA)
                           INTO
                              V_NRSEQLOTEDIA
                           FROM
                              CALEPRODMRP
                           WHERE
                              (CDFILIAL              = P_CDFILIAL)          AND
                              (DTPROGPRODCP          = P_DTMRP)             AND
                              (CDPRODUTO             = C_PRODMRP.CDPRODUTO) AND
                              (TO_DATE(DTCONCPROMRP) = TO_DATE(V_DTAPRODUZIR));
                           IF V_NRSEQLOTEDIA IS NULL THEN
                              V_NRSEQLOTEDIA := '001';
                           ELSE
                              V_NRSEQLOTEDIA := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRSEQLOTEDIA) + 1)),3,'0');
                           END IF;
                        
                        
                           INSERT INTO CALENDEQUIPAPRO( CDFILIAL, DTPROGUTEQUIP, CDPRODUTO, DTCONCPRODEQUIP,
                                                  DTHRINIUTEQUIP, DTHRFINUTEQUIP, NRSEQLOTEDIAPRO,
                                                  CDEQUIPPRO, CDGRUPOEQUIPA, QTPRODPROCEQUIP, CDETAPAPROD, CDINSPECAO, NRINSPETAPAPROD)
                               VALUES( C_DADOS.CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, V_DTAPRODUZIR,
                                       V_DTAPRODUZIR, V_DTPRODFINAL, V_NRSEQLOTEDIA,
                                       C_EQUIPAMENTOS.CDEQUIPPRO, C_DADOS.CDGRUPOEQUIPA, V_QTEQUIPPRODU, C_DADOS.CDETAPAPROD,
                                       C_DADOS.CDINSPECAO, C_DADOS.NRINSPETAPA);
                           V_DTPRODEQUIP := V_DTPRODFINAL;
                           V_QTEQUIPPRODU := V_QTFABLOTEDIA - V_QTEQUIPPRODU;
                           IF V_QTEQUIPPRODU = 0 THEN                           
                              EXIT;
                           END IF;
                           V_DTPRODEQUIP := V_DTAPRODUZIR;
                           V_DTATIVANT := V_DTAPRODUZIR;
                       END IF;
                     
                  END LOOP;
                 
                  -- SE NAO EXISTIR EQUIPAMENTOS DISPONIVEIS PARA A PRODUCAO
                  IF(V_QTEQUIPPRODU > 0)AND(P_IDVALIDCALEPROD = 'S')THEN
                     INSERT INTO INCONSMRP (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
                                    (SELECT P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, 'E'
                                     FROM DUAL
                                     WHERE NOT EXISTS (SELECT P_CDFILIAL
                                                       FROM INCONSMRP
                                                       WHERE
                                                          CDFILIAL     = P_CDFILIAL AND
                                                          DTPROGPRODIN = P_DTMRP AND
                                                          CDPRODUTO    = C_PRODMRP.CDPRODUTO));
                     EXIT;
                  END IF;
               END IF;
            END LOOP;
             
            -- SE O PROCESSO DE FABRICACAO SO POSSUI ATIVIDADES DE HABILIDADADE E NENHUMA DE EQUIPAMENTO
            IF(V_DTPRODEQUIP <> V_DTAPRODUZIR)AND( V_QTEQUIPPRODU > 0)THEN
               V_DTAPRODUZIR := V_DTPRODEQUIP;
               V_QTEQUIPPRODU := 0;

               -- BUSCA O SEQUENCIAL DO LOTE DIA 
               SELECT
                  MAX(NRSEQLOTEDIA)
               INTO
                  V_NRSEQLOTEDIA
               FROM
                  CALEPRODMRP
               WHERE
                  (CDFILIAL              = P_CDFILIAL)          AND
                  (DTPROGPRODCP          = P_DTMRP)             AND
                  (CDPRODUTO             = C_PRODMRP.CDPRODUTO) AND
                  (TO_DATE(DTCONCPROMRP) = TO_DATE(V_DTAPRODUZIR));
               IF V_NRSEQLOTEDIA IS NULL THEN
                  V_NRSEQLOTEDIA := '001';
               ELSE
                  V_NRSEQLOTEDIA := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRSEQLOTEDIA) + 1)),3,'0');
               END IF;

            END IF;
            V_LOTEDISPON := 'S';
         END IF;


         IF ((V_LOTEDISPON = 'S') AND (V_DTAPRODUZIR > SYSDATE)) THEN        
            IF V_QTFABLOTEDIA <> 0 THEN
               SELECT NVL(MAX(IDSUBOPSEMIACA),'N')
               INTO V_IDSUBOPSEMIACA
               FROM PARAMAN
               WHERE CDFILIAL = P_CDFILIAL;
               IF V_IDSUBOPSEMIACA = 'S' THEN
                  IF P_IDSUBOPINSU = 'S' THEN
                     V_NRORDENAOP    := P_NRORDENAOP;
                     V_NRORDENASUBOP := P_NRORDENASUBOP;
                  ELSE
                     SELECT LPAD(TO_CHAR(TO_NUMBER(NVL(MAX(NRORDENAOP),'0')) + 1),10,'0')
                     INTO V_NRORDENAOP
                     FROM CALEPRODMRP
                     WHERE CDFILIAL = P_CDFILIAL
                       AND DTPROGPRODCP = P_DTMRP;
                     V_NRORDENASUBOP := '0';
                  END IF;
               ELSE
                  V_NRORDENAOP    := '0000000000';
                  V_NRORDENASUBOP := '0';
               END IF;

               IF V_QTFABLOTEDIA >0 THEN
                  UPDATE PROGPRODU
                     SET  QTAFABRICARR = NVL(QTAFABRICARR,0) + V_QTFABLOTEDIA
                   WHERE
                     (CDFILIAL    = P_CDFILIAL)     AND
                     (DTPROGPRODU = P_DTMRP)        AND
                     (CDPRODUTO   = C_PRODMRP.CDPRODUTO)    AND
                     (TRUNC(DTENTPROD)   = TRUNC(P_DTENTPROD));
               END IF;


               INSERT INTO CALEPRODMRP
                  (CDFILIAL, DTPROGPRODCP, CDPRODUTO, DTCONCPROMRP, NRSEQLOTEDIA, QTAFABRICMRP, NRORDENAOP, NRORDENASUBOP, CDPRODFINAL, QTAFABRICDIA,  NRORDEMPROD )
               VALUES
                  (P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, V_DTAPRODUZIR, V_NRSEQLOTEDIA, V_QTFABLOTEDIA, V_NRORDENAOP, V_NRORDENASUBOP, P_CDPRODFINAL, P_QTAFABRICDIA, V_NRORDEMPROD);

            END IF;
         END IF;
         V_QTTOTFABDIA := V_QTTOTFABDIA - V_QTFABLOTEDIA;
         IF C_PRODMRP.IDPROPORCAO = 'L' OR
            C_PRODMRP.IDPROPORCAO = 'N' THEN
            V_QTFABLOTEDIA := C_PRODMRP.QTPADPRODPCP;
         END IF;
      END LOOP;
 
      IF (V_DTAPRODUZIR < SYSDATE)AND(P_IDVALIDCALEPROD = 'S') THEN
         INSERT INTO INCONSMRP
             (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
             (SELECT P_CDFILIAL, P_DTMRP, C_PRODMRP.CDPRODUTO, 'P'
              FROM DUAL
              WHERE NOT EXISTS (SELECT P_CDFILIAL
                                FROM INCONSMRP
                                WHERE
                                   CDFILIAL     = P_CDFILIAL          AND
                                   DTPROGPRODIN = P_DTMRP             AND
                                   CDPRODUTO    = C_PRODMRP.CDPRODUTO));
      END IF;
   END LOOP;
   RETURN( V_NRORDEMPROD);
END;
/