create or replace PROCEDURE PEDIDOS_PRODUCAO
(
   P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE,
   P_NRORG IN NUMBER,
   P_NRLOGMATPRIMA OUT NUMBER
) AS
 
V_CONF_A_UTILIZAR   NUMBER;
V_CDCNFDISTEMBSERV  VARCHAR2(5);
V_CDCONTAINER       VARCHAR2(5);
V_VRQTDEPRATEMB     NUMBER;
V_PONTUACAO         NUMBER;
V_SEQUENCIAL        VARCHAR2(20);
V_EXISTELOGMATPRIMA NUMBER;

BEGIN
 FOR C_PTO_ENTREGA IN(
        SELECT CP.NRPLANPROD, CP.CDPRODUTO, P.NMPRODUTO, CP.IDCOOKCHILL, CP.IDTPPRODCHILL, CP.IDESTADO, CP.CDPRATO, CP.CDFILAUXPRAT, CP.CDFILIAL, CP.CDSERVFILI, 
             CP.DTCONSUMO, CP.CDCLIENTE, CP.CDDESTFILI, CP.CDTIPOPRAT, CP.QTCOMESTICLI, CP.NRSEQPRATCAR,
             ROUND((PF.QTAPRODUZIR /PF.QTCOMENSSERV) *  CP.QTCOMESTICLI,5) AS QTAPRODUZIR,
             ROUND((PF.QTEXTRA /PF.QTCOMENSSERV) * CP.QTCOMESTICLI,5) AS QTEXTRA
        FROM CARDACLIPLANPROD CP INNER JOIN (SELECT NRPLANPROD, CDPRODACABADO, SUM(QTAPRODUZIR - QTPERDA) AS QTAPRODUZIR, SUM(QTEXTRA) AS QTEXTRA, 
                                                    SUM(QTCOMENSSERV) QTCOMENSSERV, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO, IDCOOKCHILL, 
                                                    IDTPPRODCHILL, IDESTADO, NRORG
                                               FROM PLANPRODFILIAGREGA 
                                              WHERE NRORG = P_NRORG AND 
                                                    NRPLANPROD = P_NRPLANPROD AND 
                                                    IDPRODUZIR = 'S' AND 
                                                    (IDCONCLUIDO = 'N' OR (IDESTADO = 'FINALIZACAO' AND IDFINALIZACAO = 'M')) AND
                                                    QTAPRODUZIR > 0
                                            GROUP BY NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO, IDCOOKCHILL, 
                                                     IDTPPRODCHILL, IDESTADO, NRORG) PF ON CP.NRPLANPROD = PF.NRPLANPROD AND 
                                                                                           CP.CDFILIAL = PF.CDFILIAGREG AND
                                                                                           CP.CDSERVFILI = PF.CDSERVFILIAGREG AND
                                                                                           CP.DTCONSUMO = PF.DTCONSUMO AND
                                                                                           PF.NRORG = CP.NRORG AND
                                                                                           PF.CDPRODACABADO = CP.CDPRODUTO AND
                                                                                           CP.IDCOOKCHILL = PF.IDCOOKCHILL AND
                                                                                           CP.IDTPPRODCHILL = PF.IDTPPRODCHILL AND
                                                                                           CP.IDESTADO = PF.IDESTADO
       INNER JOIN PRODUTO P ON P.CDPRODUTO = CP.CDPRODUTO
       WHERE CP.NRPLANPROD = P_NRPLANPROD
    ) LOOP
          BEGIN
          SELECT MAX(CONF_A_UTILIZAR)
                    INTO V_CONF_A_UTILIZAR
                 FROM
                 (
                   /*VERIFICA SE HÁ CONFIGURAÇÃO DE EMBALAGENS PARA O SERVIÇO*/
                   SELECT 1 AS CONF_A_UTILIZAR
                   FROM DUAL
                   WHERE EXISTS
                   (
                     SELECT 1
                     FROM CNFDISTEMBSERV
                     WHERE CDFILIAL = C_PTO_ENTREGA.CDFILIAL 
                     AND CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI
                     AND CDCLIENTE IS NULL 
                   )

                   UNION
                   /*VERIFICA SE HÁ CONFIGURAÇÃO DE EMBALAGENS PARA O PONTO DE ENTREGA*/
                   SELECT 2 AS CONF_A_UTILIZAR
                   FROM DUAL
                   WHERE EXISTS
                   (
                     SELECT 1
                     FROM CNFDISTEMBSERV
                     WHERE CDFILIAL = C_PTO_ENTREGA.CDFILIAL 
                       AND CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI
                       AND CDCLIENTE = C_PTO_ENTREGA.CDCLIENTE
                       AND CDDESTFILI = C_PTO_ENTREGA.CDDESTFILI
                   )
                 ) S;
              EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                    /*Indica que não há configuração a ser utilizada*/
                    V_CONF_A_UTILIZAR := 0;
              END;

              IF (V_CONF_A_UTILIZAR = 1) THEN
                BEGIN
                    SELECT CNF.CDCNFDISTEMBSERV, CNF.CDCONTAINER, C.VRQTDEPRATEMB
                      INTO V_CDCNFDISTEMBSERV, V_CDCONTAINER, V_VRQTDEPRATEMB
                      FROM CNFDISTEMBSERV CNF INNER JOIN (SELECT R.CDCONTAINER, R.VRQTDEPRATEMB
                                                           FROM RELPRATEMB R 
                                                           INNER JOIN CONTAINER C ON C.CDCONTAINER = R.CDCONTAINER AND
                                                                                     R.CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT AND
                                                                                     R.CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                                                                                     C.IDPROPOSITO = 'C') C ON C.CDCONTAINER = CNF.CDCONTAINER
                     WHERE CDFILIAL = C_PTO_ENTREGA.CDFILIAL
                       AND CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI
                       AND CDCLIENTE IS NULL
                       AND V_CONF_A_UTILIZAR = 1
                       AND CNF.NRSEQCNFCARD = C_PTO_ENTREGA.NRSEQPRATCAR;
                 EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                       V_CDCONTAINER := NULL;
                 END;
                 IF (V_CDCONTAINER IS NULL) THEN
                    /*DIST AUTOMATICA*/
                    /*RETORNA O CONTAINER DE MENOR PONTUACAO, OU SEJA, AQUELE QUE UTILIZA MENOS EMBALAGENS E QUE TEM MAIOR PERCENTUAL DE OCUPACAO  */
                    BEGIN
                       SELECT CDCONTAINER, VRQTDEPRATEMB, PONTUACAO 
                         INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_PONTUACAO
                        FROM(SELECT A.CDCONTAINER, VRQTDEPRATEMB, MIN(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO) AS PONTUACAO 
                               FROM(SELECT R.CDCONTAINER, CASE TRUNC(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA / VRQTDEPRATEMB) WHEN 0 THEN 1 ELSE TRUNC(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA / VRQTDEPRATEMB) END AS QTEMBCOMPLETAS,
                                           VRQTDEPRATEMB, CASE MOD(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA , VRQTDEPRATEMB) 
                                                          WHEN 0 THEN 0 ELSE (1 - ((VRQTDEPRATEMB - MOD(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA , VRQTDEPRATEMB)) / VRQTDEPRATEMB)) END AS QTNAOAPROVEITAMENTO
                                      FROM RELPRATEMB R INNER JOIN CONTAINER C ON R.CDCONTAINER = C.CDCONTAINER AND C.IDPROPOSITO = 'C'
                                     WHERE CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                                           CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT) A
                               GROUP BY A.CDCONTAINER,VRQTDEPRATEMB
                               ORDER BY MIN(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO))
                       WHERE ROWNUM = 1;
                    EXCEPTION
                       WHEN NO_DATA_FOUND THEN
                          V_CDCONTAINER := NULL;
                          V_VRQTDEPRATEMB := NULL;
                          V_CONF_A_UTILIZAR := NULL;
                    END;    
                 END IF;

                 UPDATE CARDACLIPLANPROD 
                    SET QTAPRODUZIR = C_PTO_ENTREGA.QTAPRODUZIR,
                        QTEXTRA = C_PTO_ENTREGA.QTEXTRA,
                        CDCONTAINER = V_CDCONTAINER,
                        VRQTDEPRATEMB = V_VRQTDEPRATEMB
                  WHERE NRPLANPROD = C_PTO_ENTREGA.NRPLANPROD AND
                        CDPRODUTO = C_PTO_ENTREGA.CDPRODUTO AND
                        IDCOOKCHILL = C_PTO_ENTREGA.IDCOOKCHILL AND
                        IDTPPRODCHILL = C_PTO_ENTREGA.IDTPPRODCHILL AND
                        IDESTADO = C_PTO_ENTREGA.IDESTADO AND
                        CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                        CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT AND
                        CDFILIAL = C_PTO_ENTREGA.CDFILIAL AND
                        CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI AND
                        DTCONSUMO = C_PTO_ENTREGA.DTCONSUMO AND
                        (CDCLIENTE = C_PTO_ENTREGA.CDCLIENTE OR CDCLIENTE IS NULL) AND
                        (CDDESTFILI = C_PTO_ENTREGA.CDDESTFILI OR CDDESTFILI IS NULL) AND
                        CDTIPOPRAT = C_PTO_ENTREGA.CDTIPOPRAT AND
                        NRSEQPRATCAR = C_PTO_ENTREGA.NRSEQPRATCAR;
              ELSIF (V_CONF_A_UTILIZAR = 2) THEN
                 BEGIN
                   SELECT CNF.CDCNFDISTEMBSERV, CNF.CDCONTAINER, C.VRQTDEPRATEMB
                     INTO V_CDCNFDISTEMBSERV, V_CDCONTAINER, V_VRQTDEPRATEMB
                     FROM CNFDISTEMBSERV CNF INNER JOIN (SELECT R.CDCONTAINER, R.VRQTDEPRATEMB
                                                          FROM RELPRATEMB R 
                                                          INNER JOIN CONTAINER C ON C.CDCONTAINER = R.CDCONTAINER AND
                                                                                    R.CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT AND
                                                                                    R.CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                                                                                    C.IDPROPOSITO = 'C') C ON C.CDCONTAINER = CNF.CDCONTAINER
                    WHERE CDFILIAL = C_PTO_ENTREGA.CDFILIAL
                      AND CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI
                      AND CDCLIENTE = C_PTO_ENTREGA.CDCLIENTE
                      AND CDDESTFILI = C_PTO_ENTREGA.CDDESTFILI
                      AND V_CONF_A_UTILIZAR = 2;
                  EXCEPTION WHEN NO_DATA_FOUND THEN
                    V_CDCONTAINER := NULL;
                  END;

                     IF (V_CDCONTAINER IS NULL) THEN
                        /*DIST AUTOMATICA*/
                        /*RETORNA O CONTAINER DE MENOR PONTUACAO, OU SEJA, AQUELE QUE UTILIZA MENOS EMBALAGENS E QUE TEM MAIOR PERCENTUAL DE OCUPACAO  */
                        BEGIN 
                            SELECT CDCONTAINER, VRQTDEPRATEMB, PONTUACAO 
                              INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_PONTUACAO
                             FROM(SELECT A.CDCONTAINER, VRQTDEPRATEMB, MIN(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO) AS PONTUACAO 
                                    FROM(SELECT R.CDCONTAINER, CASE TRUNC(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA / VRQTDEPRATEMB) WHEN 0 THEN 1 ELSE TRUNC(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA / VRQTDEPRATEMB) END AS QTEMBCOMPLETAS,
                                                VRQTDEPRATEMB, CASE MOD(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA , VRQTDEPRATEMB) 
                                                               WHEN 0 THEN 0 ELSE (1 - ((VRQTDEPRATEMB - MOD(C_PTO_ENTREGA.QTAPRODUZIR +  C_PTO_ENTREGA.QTEXTRA , VRQTDEPRATEMB)) / VRQTDEPRATEMB)) END AS QTNAOAPROVEITAMENTO
                                           FROM RELPRATEMB R INNER JOIN CONTAINER C ON R.CDCONTAINER = C.CDCONTAINER AND C.IDPROPOSITO = 'C'
                                          WHERE CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                                                CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT) A
                                    GROUP BY A.CDCONTAINER,VRQTDEPRATEMB
                                    ORDER BY MIN(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO))
                            WHERE ROWNUM = 1;
                         EXCEPTION WHEN NO_DATA_FOUND THEN
                           V_CDCONTAINER := NULL;
                           V_VRQTDEPRATEMB := NULL;
                           V_CONF_A_UTILIZAR := NULL;
                         END;

                         UPDATE CARDACLIPLANPROD 
                            SET QTAPRODUZIR = C_PTO_ENTREGA.QTAPRODUZIR,
                                QTEXTRA = C_PTO_ENTREGA.QTEXTRA,
                                CDCONTAINER = V_CDCONTAINER,
                                VRQTDEPRATEMB = V_VRQTDEPRATEMB
                          WHERE NRPLANPROD = C_PTO_ENTREGA.NRPLANPROD AND
                                CDPRODUTO = C_PTO_ENTREGA.CDPRODUTO AND
                                IDCOOKCHILL = C_PTO_ENTREGA.IDCOOKCHILL AND
                                IDTPPRODCHILL = C_PTO_ENTREGA.IDTPPRODCHILL AND
                                IDESTADO = C_PTO_ENTREGA.IDESTADO AND
                                CDPRATO = C_PTO_ENTREGA.CDPRATO AND
                                CDFILAUXPRAT = C_PTO_ENTREGA.CDFILAUXPRAT AND
                                CDFILIAL = C_PTO_ENTREGA.CDFILIAL AND
                                CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI AND
                                DTCONSUMO = C_PTO_ENTREGA.DTCONSUMO AND
                                (CDCLIENTE = C_PTO_ENTREGA.CDCLIENTE OR CDCLIENTE IS NULL) AND
                                (CDDESTFILI = C_PTO_ENTREGA.CDDESTFILI OR CDDESTFILI IS NULL) AND
                                CDTIPOPRAT = C_PTO_ENTREGA.CDTIPOPRAT AND
                                NRSEQPRATCAR = C_PTO_ENTREGA.NRSEQPRATCAR;
                        END IF;
                  END IF;

                  IF (V_CONF_A_UTILIZAR = 0 OR V_CONF_A_UTILIZAR IS NULL) THEN
                    IF V_EXISTELOGMATPRIMA IS NULL THEN 
                        NOVO_CODIGO_SC('LOGMATPRIMA', V_SEQUENCIAL);
                        V_EXISTELOGMATPRIMA := V_SEQUENCIAL;
                    END IF;

                    BEGIN
                       SELECT DISTINCT NRLOGMATPRIMA INTO V_EXISTELOGMATPRIMA 
                        FROM LOGMATPRIMA
                       WHERE CDPRODUTO = C_PTO_ENTREGA.CDPRODUTO
						 AND CDFILIAL = C_PTO_ENTREGA.CDFILIAL
                         AND CDSERVFILI = C_PTO_ENTREGA.CDSERVFILI
                         AND DSORIGEM = 'PEDIDO' 
                         AND NRPLANPROD = C_PTO_ENTREGA.NRPLANPROD;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                        INSERT INTO LOGMATPRIMA 
                            (NRLOGMATPRIMA, CDPRODUTO, NMPRODUTO, DSORIGEM, 
                            CDFILIAL, CDSERVFILI, NRPLANPROD, DTCARDAPIO) 
                          VALUES 
                            (V_EXISTELOGMATPRIMA, C_PTO_ENTREGA.CDPRODUTO, C_PTO_ENTREGA.NMPRODUTO, 'PEDIDO', 
                            C_PTO_ENTREGA.CDFILIAL, C_PTO_ENTREGA.CDSERVFILI, C_PTO_ENTREGA.NRPLANPROD, TO_CHAR(C_PTO_ENTREGA.DTCONSUMO, 'DD/MM/YYYY'));
                    END;
                  END IF;
              END LOOP;
          P_NRLOGMATPRIMA := V_EXISTELOGMATPRIMA;
        END; 