create or replace
PROCEDURE AGRUPA_SEMIACABADO_MRP
   (P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
    P_DTMRP         IN PROGPRODU.DTPROGPRODU%TYPE
) IS
   V_DTAPRODUZIR    PROGPRODU.DTENTPROD%TYPE;
   V_QTD_RESTANTE   FLOAT;
   V_NRSEQLOTEDIA   CALEPRODMRP.NRSEQLOTEDIA%TYPE;
   V_QTFABLOTEDIA   FLOAT;
   V_NRORDENAOP     CALEPRODMRP.NRORDENAOP%TYPE;
   V_NRORDENASUBOP  CALEPRODMRP.NRORDENASUBOP%TYPE;
   V_QTHORASPROD    NUMBER;
   V_QTHRSEGPROD    PARAMPRODMRP.QTHRSEGPROD%TYPE;
   V_CDPERIPRODU    PARAMPRODMRP.CDPERIPRODU%TYPE;
   V_GERACALE       VARCHAR2(1) := 'S';
   V_MSGERROR       VARCHAR2(50) := '';
BEGIN
   FOR C_SEMIACABADOS IN (SELECT CDPRODUTO, DTENTPROD, QTPADPRODPCP, QTVENDAPCP, QTLOTEFABPCP
                            FROM PROGPRODU
                           WHERE CDFILIAL = P_CDFILIAL
                             AND DTPROGPRODU = P_DTMRP
                             AND NVL(IDSEMIACABADO, 'N') = 'S')
   LOOP
      DELETE FROM CALEPRODMRP
      WHERE CDFILIAL = P_CDFILIAL
        AND DTPROGPRODCP = P_DTMRP
        AND CDPRODUTO = C_SEMIACABADOS.CDPRODUTO;

      V_DTAPRODUZIR  := C_SEMIACABADOS.DTENTPROD;
      V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');
      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_SEMIACABADOS.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;

      SELECT TO_NUMBER( DECODE( NVL(PA.IDAPLICHRSEG, 'L'), 'L', NVL(PA.QTHRSEGPROD,0), 0)) AS QTHRSEGPROD,
             PA.CDPERIPRODU
        INTO V_QTHRSEGPROD, V_CDPERIPRODU
        FROM PARAMPRODMRP PA
       WHERE (PA.CDFILIAL  = P_CDFILIAL)
         AND (PA.CDPRODUTO = C_SEMIACABADOS.CDPRODUTO);

      V_DTAPRODUZIR := (V_DTAPRODUZIR - (V_QTHORASPROD/24) - (V_QTHRSEGPROD/24));
      V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');
      V_DTAPRODUZIR :=  BUSCA_DATA_PRODUCAO( P_CDFILIAL, C_SEMIACABADOS.CDPRODUTO, V_CDPERIPRODU,
                                             C_SEMIACABADOS.QTLOTEFABPCP, P_DTMRP, V_DTAPRODUZIR, V_QTD_RESTANTE, V_GERACALE);
      IF V_GERACALE = 'M' THEN
         INSERT INTO INCONSMRP
         (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
         (SELECT P_CDFILIAL, P_DTMRP, C_SEMIACABADOS.CDPRODUTO, 'P'
            FROM DUAL
           WHERE NOT EXISTS (SELECT P_CDFILIAL
                               FROM INCONSMRP
                              WHERE CDFILIAL     = P_CDFILIAL
                                AND DTPROGPRODIN = P_DTMRP
                                AND CDPRODUTO    = C_SEMIACABADOS.CDPRODUTO));
         EXIT;
      ELSE
         IF V_GERACALE = 'C' THEN
            INSERT INTO INCONSMRP
            (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
            (SELECT P_CDFILIAL, P_DTMRP, C_SEMIACABADOS.CDPRODUTO, 'C'
               FROM DUAL
              WHERE NOT EXISTS (SELECT P_CDFILIAL
                                  FROM INCONSMRP
                                 WHERE CDFILIAL     = P_CDFILIAL
                                   AND DTPROGPRODIN = P_DTMRP
                                   AND CDPRODUTO    = C_SEMIACABADOS.CDPRODUTO));
            EXIT;
         END IF;
      END IF;
      V_QTD_RESTANTE := C_SEMIACABADOS.QTVENDAPCP;
      V_NRSEQLOTEDIA := '001';
      V_QTFABLOTEDIA := LEAST(V_QTD_RESTANTE, C_SEMIACABADOS.QTPADPRODPCP);
      V_NRORDENAOP    := '0000000000';
      V_NRORDENASUBOP := '0';
      WHILE V_QTD_RESTANTE > 0 LOOP
         INSERT INTO CALEPRODMRP
            (CDFILIAL,   DTPROGPRODCP,  CDPRODUTO,   DTCONCPROMRP,  NRSEQLOTEDIA, QTAFABRICMRP,
             NRORDENAOP, NRORDENASUBOP, CDPRODFINAL, QTAFABRICDIA,  NRORDEMPROD )
         VALUES
            (P_CDFILIAL,   P_DTMRP,         C_SEMIACABADOS.CDPRODUTO, V_DTAPRODUZIR,  V_NRSEQLOTEDIA, V_QTFABLOTEDIA,
             V_NRORDENAOP, V_NRORDENASUBOP, NULL,                     C_SEMIACABADOS.QTLOTEFABPCP,    '1');

         V_QTD_RESTANTE := V_QTD_RESTANTE - V_QTFABLOTEDIA;
         V_QTFABLOTEDIA := LEAST(V_QTD_RESTANTE, C_SEMIACABADOS.QTPADPRODPCP);
         V_NRSEQLOTEDIA := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_NRSEQLOTEDIA) + 1)),3,'0');

         IF V_NRSEQLOTEDIA > C_SEMIACABADOS.QTLOTEFABPCP THEN
            V_NRSEQLOTEDIA := '001';

            V_DTAPRODUZIR := V_DTAPRODUZIR - 1;
            V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');
            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_SEMIACABADOS.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;

            SELECT TO_NUMBER( DECODE( NVL(PA.IDAPLICHRSEG, 'L'), 'L', NVL(PA.QTHRSEGPROD,0), 0)) AS QTHRSEGPROD,
                   PA.CDPERIPRODU
              INTO V_QTHRSEGPROD, V_CDPERIPRODU
              FROM PARAMPRODMRP PA
             WHERE (PA.CDFILIAL  = P_CDFILIAL)
               AND (PA.CDPRODUTO = C_SEMIACABADOS.CDPRODUTO);

            V_DTAPRODUZIR := (V_DTAPRODUZIR - (V_QTHORASPROD/24) - (V_QTHRSEGPROD/24));
            V_DTAPRODUZIR := ENCAIXA_PRODUCAO_TURNO( P_CDFILIAL , V_DTAPRODUZIR,'',0,V_MSGERROR,'N');
            V_DTAPRODUZIR :=  BUSCA_DATA_PRODUCAO( P_CDFILIAL, C_SEMIACABADOS.CDPRODUTO, V_CDPERIPRODU,
                                                   C_SEMIACABADOS.QTLOTEFABPCP, P_DTMRP, V_DTAPRODUZIR, V_QTD_RESTANTE, V_GERACALE);
            IF V_GERACALE = 'M' THEN
               INSERT INTO INCONSMRP
               (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
               (SELECT P_CDFILIAL, P_DTMRP, C_SEMIACABADOS.CDPRODUTO, 'P'
                  FROM DUAL
                 WHERE NOT EXISTS (SELECT P_CDFILIAL
                                     FROM INCONSMRP
                                    WHERE CDFILIAL     = P_CDFILIAL
                                      AND DTPROGPRODIN = P_DTMRP
                                      AND CDPRODUTO    = C_SEMIACABADOS.CDPRODUTO));
               EXIT;
            ELSE
               IF V_GERACALE = 'C' THEN
                  INSERT INTO INCONSMRP
                  (CDFILIAL, DTPROGPRODIN, CDPRODUTO, IDINCONSMRP)
                  (SELECT P_CDFILIAL, P_DTMRP, C_SEMIACABADOS.CDPRODUTO, 'C'
                     FROM DUAL
                    WHERE NOT EXISTS (SELECT P_CDFILIAL
                                        FROM INCONSMRP
                                       WHERE CDFILIAL     = P_CDFILIAL
                                         AND DTPROGPRODIN = P_DTMRP
                                         AND CDPRODUTO    = C_SEMIACABADOS.CDPRODUTO));
                  EXIT;
               END IF;
            END IF;
         END IF;
      END LOOP;
   END LOOP;
END;
/
