create or replace PROCEDURE CALCULA_EMB_SERV_COZ
(
   P_NRDISTPROD IN DISTPROD.NRDISTPROD%TYPE,
   P_NRORG IN NUMBER,
   P_RETORNO OUT VARCHAR2
)
IS   
   /*Chave da embalagem da distribuio do cardpio*/
   V_NREMBDISTCARD NUMBER;
   /*Para indicar qual das configuraes de embalagem (servio ou ponto de entrega) ser utilizada*/
   V_CONF_A_UTILIZAR INT;
   /*Indica que a embalagem  nova e deve ser inserida na tabela DISTEMBCARD*/
   PRIMEIRA_ITERACAO_GRUPO BOOLEAN;
   /*Muda a cada vez que a embalagem trocar*/
   V_NRGRUPO_ATUAL NUMBER;
   /*Indica que o prato  representante da embalagem*/
   V_IDPRINCIPAL VARCHAR2(1);
   /*Sequencial da novo cdigo*/
   V_SEQUENCIAL VARCHAR2(20);
   /*Quantidade de container*/
   V_QTCONTAINER FLOAT;
   V_NRSEQPRATCAR NUMBER(3);
   /*Quantidade de embalagens para produto*/
   V_QTEMBALAGENS NUMBER;
   V_CDCONTAINER VARCHAR2(5);
   V_NREMBDISTPROD NUMBER;
   V_VRQTDEPRODEMB NUMBER;
   V_PONTUACAO NUMBER;
   V_VRQTDEPRATEMB NUMBER;
   
   V_QTTOTPRATO FLOAT;
   V_QTPRATO FLOAT;
   V_QTTOTEXTRA FLOAT;
   V_QTRESTOPRODUTO FLOAT;
   V_QTCOMENSAIS NUMBER;
   V_CONTAINER_ANT VARCHAR2(5);
   V_PRODUTO_ANT VARCHAR2(10);
   
   --EMBALAGENS PERMITIDAS COLETIVA E/OU INDIVIDUAL
   V_PROPOSITO VARCHAR2(1);
   
   PROCEDURE INSERE_LOG (P_CDPRODUTO IN VARCHAR2,
                          P_NMPRODUTO IN VARCHAR2,
                          P_CDFILIAL IN VARCHAR2,
                          P_NMFILIAL IN VARCHAR2,
                          P_CDSERVFILI IN VARCHAR2,
                          P_NMSERVICO IN VARCHAR2,
                          P_CDCLIENTE IN VARCHAR2,
                          P_NMRAZSOCCLIE IN VARCHAR2,
                          P_CDDESTFILI IN VARCHAR2,
                          P_NMDESTFILI IN VARCHAR2,
                          P_DTCARDAPIO IN DATE,
                          P_NRLOGMATPRIMA IN NUMBER,
                          P_NRORG IN NUMBER,
                          P_RETORNO OUT NUMBER)
   AS                          
      V_SEQUENCIAL VARCHAR2(20);  
      V_NRLOGMATPRIMA NUMBER;
   BEGIN
      IF (P_NRLOGMATPRIMA IS NULL) THEN 
          /*Busca novo sequencial para a tabela de log*/               
         NOVO_CODIGO_SC('LOGMATPRIMA', V_SEQUENCIAL, 1, P_NRORG);
         V_NRLOGMATPRIMA := TO_NUMBER(V_SEQUENCIAL);
      ELSE 
         V_NRLOGMATPRIMA := P_NRLOGMATPRIMA;
      END IF; 
      
      BEGIN
         SELECT NRLOGMATPRIMA
           INTO V_NRLOGMATPRIMA
         FROM LOGMATPRIMA
        WHERE NRLOGMATPRIMA = V_NRLOGMATPRIMA
          AND CDPRODUTO = P_CDPRODUTO 
          AND CDFILIAL = P_CDFILIAL 
          AND CDSERVFILI = P_CDSERVFILI 
          AND (CDCLIENTE = P_CDCLIENTE OR P_CDCLIENTE IS NULL)
          AND (CDDESTFILI = P_CDDESTFILI OR P_CDDESTFILI IS NULL) 
          AND DTCARDAPIO = P_DTCARDAPIO 
          AND NRORG = P_NRORG;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          INSERT INTO LOGMATPRIMA 
          (NRLOGMATPRIMA, CDPRODUTO, NMPRODUTO, DSORIGEM, CDFILIAL, NMFILIAL, 
          CDSERVFILI, NMSERVICO, CDCLIENTE, NMRAZSOCCLIE, CDDESTFILI, NMDESTFILI,
          DTCARDAPIO, NRORG) 
          VALUES
          (V_NRLOGMATPRIMA, P_CDPRODUTO, P_NMPRODUTO, 'CALCULAEMBALAGEM', P_CDFILIAL, SUBSTR(P_NMFILIAL,1,30),
          P_CDSERVFILI, P_NMSERVICO, P_CDCLIENTE, P_NMRAZSOCCLIE, P_CDDESTFILI, P_NMDESTFILI,
          P_DTCARDAPIO, P_NRORG);
      END;
      
      P_RETORNO := V_NRLOGMATPRIMA;
   END;
                          
BEGIN

    -- VERIFICAR PARAMETRIZACAO DA GERACAO DE ETIQUETAS
    SELECT DECODE(P.IDPESAPAETIQ, 'N', 'T', 'I') INTO V_PROPOSITO
      FROM PARAMPLANEJA P, DISTPROD D
     WHERE D.NRDISTPROD = P_NRDISTPROD
       AND D.NRORG = P_NRORG
       AND D.CDCENTRAL = P.CDFILIAL;

   /*DISTRIBUICAO DE EMBALAGEM PARA PRATOS*/
   FOR C_CARD IN
   (SELECT C.CDFILIAL, FI.NMFILIAL, C.CDSERVFILI, SE.NMSERVICO, C.NRDISTCARD, 
           D.CDCLIENTE, D.CDDESTFILI, D.NRCARDAPIO, D.QTCOMENSAIS, DP.DTFINPROD,
           CD.DTCARDAPIO, CLIENTE.NMRAZSOCCLIE, DESTFILI.NMDESTFILI
      FROM CARDDISTPROD C
     INNER JOIN DISTCARD D ON (D.NRDISTCARD = C.NRDISTCARD AND C.NRCARDAPIO = D.NRCARDAPIO AND 
                               C.CDFILIAL = D.CDFILIAL AND D.NRORG = C.NRORG)
      LEFT JOIN CLIENTE ON CLIENTE.CDCLIENTE = D.CDCLIENTE AND CLIENTE.NRORG = D.NRORG
      LEFT JOIN DESTFILI ON DESTFILI.CDDESTFILI = D.CDDESTFILI AND DESTFILI.NRORG = D.NRORG AND DESTFILI.CDFILIAL = C.CDFILIAL
     INNER JOIN CARDADIA CD ON CD.CDFILIAL = D.CDFILIAL AND CD.NRCARDAPIO = D.NRCARDAPIO AND CD.NRORG = D.NRORG                        
     INNER JOIN DISTPROD DP ON (DP.NRDISTPROD = C.NRDISTPROD  AND DP.NRORG = C.NRORG)
     INNER JOIN FILIAL FI ON (C.CDFILIAL = FI.CDFILIAL AND C.NRORG = FI.NRORG)
     INNER JOIN SERVICO SE ON (C.CDFILIAL = SE.CDFILIAL AND C.CDSERVFILI = SE.CDSERVFILI AND C.NRORG = SE.NRORG)
     WHERE DP.NRDISTPROD = P_NRDISTPROD
       AND DP.NRORG = P_NRORG
     ORDER BY CDFILIAL, CDSERVFILI, NRDISTCARD
   )LOOP
      /*SUBSTITUI DISTRIBUICAO ANTERIOR*/
      DELETE FROM ITEMBDISTCARD
       WHERE NRDISTCARD = C_CARD.NRDISTCARD;
         
      DELETE FROM EMBDISTCARD
       WHERE NRDISTCARD = C_CARD.NRDISTCARD;
      /*=============================================================*/
      /*DETERMINA QUAL CONFIGURAO UTILIZAR : SE A DO SERVIO OU A DO PONTO DE ENTREGA*/
      /*=============================================================*/
      BEGIN
         SELECT MAX(CONF_A_UTILIZAR)
            INTO V_CONF_A_UTILIZAR
         FROM
         (
           /*VERIFICA SE H CONFIGURAO DE EMBALAGENS PARA O SERVIO*/
           SELECT 1 AS CONF_A_UTILIZAR
           FROM DUAL
           WHERE EXISTS
           (
             SELECT 1
             FROM CNFDISTEMBSERV
             WHERE CDFILIAL = C_CARD.CDFILIAL 
             AND CDSERVFILI = C_CARD.CDSERVFILI
             AND CDCLIENTE IS NULL 
           )
          
           UNION
           /*VERIFICA SE H CONFIGURAO DE EMBALAGENS PARA O PONTO DE ENTREGA*/
           SELECT 2 AS CONF_A_UTILIZAR
           FROM DUAL
           WHERE EXISTS
           (
             SELECT 1
             FROM CNFDISTEMBSERV
             WHERE CDFILIAL = C_CARD.CDFILIAL 
               AND CDSERVFILI = C_CARD.CDSERVFILI
               AND CDCLIENTE = C_CARD.CDCLIENTE
               AND CDDESTFILI = C_CARD.CDDESTFILI
           )
         ) S;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            /*Indica que no h configurao a ser utilizada*/
            V_CONF_A_UTILIZAR := 0;
      END;
      /*USADA PARA INDICAR QUEBRA DE PROCESSAMENTO DE EMBALAGENS*/
      V_NRGRUPO_ATUAL := -1; 
    /*  IF V_CONF_A_UTILIZAR = 2 THEN
       
         SELECT NMRAZSOCCLIE, NMDESTFILI
         INTO V_NMCLIENTE, V_NMDESTFILI
           FROM CLIENTE, 
          WHERE CLIENTE.CDCLIENTE = C_CARD.CDCLIENTE AND
                DESTFILI. = C_CARD.CDDESTFILI AND
                DESTFILI.CDFILIAL = C_CARD.CDFILIAL;
      END IF;*/
      
      FOR C_PRATOS IN
      (SELECT C.NRSEQPRATCAR, C.CDFILAUXPRAT, C.CDPRATO, P.NMPRATO, C.QTTOTCOMENSAIS, C.QTTOTPRATO, C.QTPORPESSOA, C.QTTOTEXTRA,
              CNF.NRGRUPO, CNF.CDCNFDISTEMBSERV, CNF.IDPROPOSITO, CNF.CDCONTAINER, R.VRQTDEPRATEMB, C.CDPRODPRODUCAO AS CDPRODUTO, PROD.NMPRODUTO
         FROM CNFDISTCARD C 
         LEFT JOIN (SELECT CNF.NRSEQCNFMES AS NRSEQCNFCARD, CNF.NRGRUPOEMB AS NRGRUPO, CNF.CDCONTAINER AS CDCNFDISTEMBSERV,
                          CNF.CDCONTAINER, C.IDPROPOSITO 
                     FROM CNFCAMES CNF LEFT JOIN CONTAINER C ON C.CDCONTAINER = CNF.CDCONTAINER AND (C.IDPROPOSITO = V_PROPOSITO OR 'T' = V_PROPOSITO)
                    WHERE CDFILIAL = C_CARD.CDFILIAL
                      AND CDSERVFILI = C_CARD.CDSERVFILI
                      AND DTREFECNFMES = (C_CARD.DTFINPROD - TO_CHAR(C_CARD.DTFINPROD, 'DD')+ 1)
                      AND (V_CONF_A_UTILIZAR = 1 or V_CONF_A_UTILIZAR = 0)
/*
                  (SELECT CNF.NRSEQCNFCARD, CNF.NRGRUPO, CNF.CDCNFDISTEMBSERV, CNF.CDCONTAINER, C.IDPROPOSITO
                     FROM CNFDISTEMBSERV CNF LEFT JOIN CONTAINER C ON C.CDCONTAINER = CNF.CDCONTAINER
                    WHERE CDFILIAL = C_CARD.CDFILIAL
                      AND CDSERVFILI = C_CARD.CDSERVFILI
                      AND CDCLIENTE IS NULL
                      AND V_CONF_A_UTILIZAR = 1*/
                   UNION ALL
                   
                   SELECT CNF.NRSEQCNFCARD, CNF.NRGRUPO, CNF.CDCNFDISTEMBSERV, CNF.CDCONTAINER, C.IDPROPOSITO
                     FROM CNFDISTEMBSERV CNF LEFT JOIN CONTAINER C ON C.CDCONTAINER = CNF.CDCONTAINER AND (C.IDPROPOSITO = V_PROPOSITO OR 'T' = V_PROPOSITO)
                    WHERE CDFILIAL = C_CARD.CDFILIAL
                      AND CDSERVFILI = C_CARD.CDSERVFILI
                      AND CDCLIENTE = C_CARD.CDCLIENTE
                      AND CDDESTFILI = C_CARD.CDDESTFILI
                      AND V_CONF_A_UTILIZAR = 2
                  ) CNF ON CNF.NRSEQCNFCARD = C.NRSEQPRATCAR            
        LEFT JOIN RELPRATEMB R ON (R.CDFILAUXPRAT = C.CDFILAUXPRAT AND
                                   R.CDPRATO = C.CDPRATO AND
                                   R.CDCONTAINER = CNF.CDCONTAINER)
        LEFT JOIN PRODUTO PROD ON (PROD.CDPRODUTO = C.CDPRODPRODUCAO)
       INNER JOIN PRATO P ON (P.CDFILAUXPRAT = C.CDFILAUXPRAT AND P.CDPRATO = C.CDPRATO)
       WHERE C.NRDISTCARD = C_CARD.NRDISTCARD
       ORDER BY CNF.NRGRUPO
      )LOOP
         IF (C_PRATOS.VRQTDEPRATEMB IS NULL AND C_PRATOS.IDPROPOSITO = 'C') THEN 
            INSERE_LOG (C_PRATOS.CDPRODUTO, C_PRATOS.NMPRODUTO, C_CARD.CDFILIAL, C_CARD.NMFILIAL, 
                        C_CARD.CDSERVFILI, C_CARD.NMSERVICO, C_CARD.CDCLIENTE, C_CARD.NMRAZSOCCLIE, 
                        C_CARD.CDDESTFILI, C_CARD.NMDESTFILI, C_CARD.DTCARDAPIO, P_RETORNO, P_NRORG, P_RETORNO);
         ELSE        
            /*=======================================*/
            /*PERCORRE OS PRATOS DO SERVIO PARA O DIA INFORMADO*/      
            /*=======================================*/
     
            /*VERIFICA QUEBRA DE GRUPO (NOVA EMBALAGEM SENDO PROCESSADA)*/
            IF V_NRGRUPO_ATUAL <> C_PRATOS.NRGRUPO THEN
               V_NRGRUPO_ATUAL := C_PRATOS.NRGRUPO;
               /*INDICA MOMENTO DE INSERO DAS EMBALAGENS*/
               PRIMEIRA_ITERACAO_GRUPO := TRUE;
            END IF;
        
            /*===========================*/
            /*===== EMBALAGENS COLETIVAS =====*/
            /*===========================*/
            /*Se a embalagem e o prato no foram relacionados, no faz a distribuio deste na embalagem*/
            IF (C_PRATOS.IDPROPOSITO = 'C') AND (C_PRATOS.VRQTDEPRATEMB IS NOT NULL) THEN            
               IF C_PRATOS.QTPORPESSOA > 0 THEN
                  IF PRIMEIRA_ITERACAO_GRUPO THEN
                     /*Quantidade de containers : completos + incompleto*/
                     V_QTCONTAINER := TRUNC(C_PRATOS.QTTOTPRATO/C_PRATOS.VRQTDEPRATEMB);
                     IF MOD(C_PRATOS.QTTOTPRATO, C_PRATOS.VRQTDEPRATEMB) <> 0 THEN
                        V_QTCONTAINER := V_QTCONTAINER + 1;
                  END IF;
                    
                  /*Busca novo sequencial*/               
                  NOVO_CODIGO_SC('EMBDISTCARD',V_SEQUENCIAL);
                  V_NREMBDISTCARD := TO_NUMBER(V_SEQUENCIAL);
                    
                  /*Insere embalagem na distribuio do cardpio*/
                  INSERT INTO EMBDISTCARD
                     (NRDISTCARD, NREMBDISTCARD, CDCONTAINER, QTCONTAINER, IDCADAUTO)
                  VALUES
                     (C_CARD.NRDISTCARD, V_NREMBDISTCARD, C_PRATOS.CDCONTAINER, V_QTCONTAINER, 'S');    
               END IF;
                 
               /*Insere o prato na embalagem na distribuio*/
               INSERT INTO ITEMBDISTCARD
                  (NRDISTCARD, NRSEQPRATCAR, NREMBDISTCARD, 
                  QTCOMENSAIS, QTPRATO, QTEXTRA, IDCADAUTO, IDPRINCIPAL)
               VALUES
                 (C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR, V_NREMBDISTCARD, 
                  C_PRATOS.QTTOTCOMENSAIS, C_PRATOS.QTTOTPRATO, C_PRATOS.QTTOTEXTRA, 'S', 'S');
               END IF;
            /*============================*/
            /*===== EMBALAGENS INDIVIDUAIS =====*/
            /*============================*/
           
            ELSIF (C_PRATOS.IDPROPOSITO = 'I') THEN
               IF PRIMEIRA_ITERACAO_GRUPO THEN             
                  V_IDPRINCIPAL := 'S';
                  /*Busca novo sequencial*/
                  NOVO_CODIGO_SC('EMBDISTCARD',V_SEQUENCIAL);
                  V_NREMBDISTCARD := TO_NUMBER(V_SEQUENCIAL);
              
                  /*Insere embalagem na distribuio do cardpio*/
                  INSERT INTO EMBDISTCARD
                  (NRDISTCARD, NREMBDISTCARD, CDCONTAINER, QTCONTAINER, IDCADAUTO, CDAGRUPEMB)
                  VALUES
                  (C_CARD.NRDISTCARD, V_NREMBDISTCARD, C_PRATOS.CDCONTAINER, C_CARD.QTCOMENSAIS, 'S',C_PRATOS.NRGRUPO);
               END IF;
              
               /*Insere o prato na embalagem na distribuio*/
               INSERT INTO ITEMBDISTCARD
               (NRDISTCARD, NRSEQPRATCAR, NREMBDISTCARD, 
               QTCOMENSAIS, QTPRATO, QTEXTRA, IDCADAUTO, IDPRINCIPAL)
               VALUES
               (C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR, V_NREMBDISTCARD, 
                C_PRATOS.QTTOTCOMENSAIS, C_PRATOS.QTTOTPRATO, C_PRATOS.QTTOTEXTRA, 'S', V_IDPRINCIPAL);
                  
               V_IDPRINCIPAL := 'N';   
           
            /*==============================================*/
            /*===== DISTRIBUIO AUTOMTICA ======================*/
            /*Para todos os que no foram contemplados pelos passos acima :          */         
            /*- Pratos  que no possuem relao explicitada com a embalagem           */
            /*- Pratos cujo tipo de prato no pertence  conf. original do servio         */
            /*- Pratos cuja distribuio foi definida como automtica na tela de servio*/
            /*==============================================*/
            ELSE            
               IF C_PRATOS.CDCNFDISTEMBSERV = 'DISTR'/* AND C_PRATOS.IDPROPOSITO IS NOT NULL */THEN
                  IF C_PRATOS.QTPORPESSOA > 0 THEN
        --             DIST_AUTO_PRAT(C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR,'DISTR');               
                     V_QTTOTPRATO := C_PRATOS.QTTOTPRATO;
                     V_QTTOTEXTRA := C_PRATOS.QTTOTEXTRA;
                     V_QTRESTOPRODUTO := 1;
                       
                     WHILE V_QTRESTOPRODUTO > 0
                     LOOP
                        BEGIN
                          /*Retorna a melhor embalagem conforme a quantidade a ser embalada*/
                          SELECT CDCONTAINER, VRQTDEPRATEMB, QTRESTANTE
                            INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_QTTOTPRATO     
                            FROM (SELECT R.CDCONTAINER, VRQTDEPRATEMB,
                                         (V_QTTOTPRATO + V_QTTOTEXTRA) - VRQTDEPRATEMB AS QTRESTANTE
                                    FROM RELPRATEMB R INNER JOIN CONTAINER C ON R.CDCONTAINER = C.CDCONTAINER AND C.IDPROPOSITO = 'C'
                                   WHERE CDPRATO = C_PRATOS.CDPRATO AND
                                         CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT AND
                                         VRQTDEPRATEMB <= (V_QTTOTPRATO + V_QTTOTEXTRA)
                                   ORDER BY VRQTDEPRATEMB DESC) A 
                           WHERE ROWNUM = 1;
                                      
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_VRQTDEPRATEMB := NULL;
                        END;
                        
                        IF (V_VRQTDEPRATEMB IS NULL) THEN
                           /*Atualiza o numero de embalagens do ultimo registro quando */
                           /*no tiver embalagem ideal para a quantidade restante a ser embalada*/
                           UPDATE EMBDISTCARD 
                              SET QTCONTAINER = QTCONTAINER + 1 
                            WHERE NRDISTCARD = C_CARD.NRDISTCARD 
                              AND NREMBDISTCARD = V_NREMBDISTCARD
                              AND CDCONTAINER = V_CONTAINER_ANT;    
                                
                           /*Trata numero de comensais para no sobrar decimais*/   
                           V_QTCOMENSAIS := TRUNC(V_QTRESTOPRODUTO / C_PRATOS.QTPORPESSOA);
                           IF (MOD(V_QTRESTOPRODUTO, C_PRATOS.QTPORPESSOA) <> 0) THEN
                              V_QTCOMENSAIS := V_QTCOMENSAIS + 1;
                           END IF;
                                
                           UPDATE ITEMBDISTCARD 
                              SET QTPRATO = QTPRATO + V_QTRESTOPRODUTO, 
                                  QTCOMENSAIS = QTCOMENSAIS + V_QTCOMENSAIS
                            WHERE NRDISTCARD = C_CARD.NRDISTCARD 
                              AND NRSEQPRATCAR = C_PRATOS.NRSEQPRATCAR
                              AND NREMBDISTCARD = V_NREMBDISTCARD;
                                
                           /*Atualiza varivel para no cair mais no loop*/   
                           V_QTRESTOPRODUTO := 0;
                        ELSE 
                           /*Busca novo sequencial*/               
                           NOVO_CODIGO_SC('EMBDISTCARD',V_SEQUENCIAL);
                           V_NREMBDISTCARD := TO_NUMBER(V_SEQUENCIAL);
                               
                           /*Insere embalagem na distribuio do cardpio*/
                           INSERT INTO EMBDISTCARD
                           (NRDISTCARD, NREMBDISTCARD, CDCONTAINER, QTCONTAINER, IDCADAUTO)
                           VALUES
                           (C_CARD.NRDISTCARD, V_NREMBDISTCARD, V_CDCONTAINER, 1, 'S');    
                           /*Se qual a quantidade do prato na embalagem (embalagem cheia ou total do produto)*/
                           IF (V_VRQTDEPRATEMB > C_PRATOS.QTTOTPRATO) THEN
                              V_QTPRATO := C_PRATOS.QTTOTPRATO;
                              V_QTCOMENSAIS := C_PRATOS.QTTOTCOMENSAIS;
                           ELSE 
                              V_QTPRATO := V_VRQTDEPRATEMB;                    
                              /*Calcula a quantidade de comensais de acordo com o quanto ser armazenado na embalagem*/
                              V_QTCOMENSAIS := TRUNC(V_QTPRATO / C_PRATOS.QTPORPESSOA);
                           END IF;
                            
                           /*Insere o prato na embalagem na distribuio*/
                           INSERT INTO ITEMBDISTCARD
                           (NRDISTCARD, NRSEQPRATCAR, NREMBDISTCARD, 
                           QTCOMENSAIS, QTPRATO, QTEXTRA, IDCADAUTO, IDPRINCIPAL)
                           VALUES
                           (C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR, V_NREMBDISTCARD, 
                           V_QTCOMENSAIS, V_QTPRATO, V_QTTOTEXTRA, 'S', 'S');
                             
                             
                           /* Quantidade extra deve ser somado apenas uma vez */
                           V_QTTOTEXTRA := 0;
                           /*Grava a ultima embalagem caso precise aumentar mais uma quantidade*/
                           V_CONTAINER_ANT := V_CDCONTAINER;
                           /*Grava a quantidade restante do produto*/
                           V_QTRESTOPRODUTO := V_QTTOTPRATO;
                        END IF;
                     END LOOP;
                  END IF;                     
               ELSIF C_PRATOS.CDCNFDISTEMBSERV = 'DIST'/* AND C_PRATOS.IDPROPOSITO IS NOT NULL */THEN
                  --DIST_AUTO_PRAT(C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR, 'DIST');
                  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_PRATOS.QTTOTPRATO +  C_PRATOS.QTTOTEXTRA / VRQTDEPRATEMB) 
                                    WHEN 0 THEN 1 
                                    ELSE TRUNC(C_PRATOS.QTTOTPRATO +  C_PRATOS.QTTOTEXTRA / VRQTDEPRATEMB) END AS QTEMBCOMPLETAS,
                                    VRQTDEPRATEMB, 
                                    CASE MOD(C_PRATOS.QTTOTPRATO +  C_PRATOS.QTTOTEXTRA , VRQTDEPRATEMB) 
                                    WHEN 0 THEN 0 
                                    ELSE (1 - ((VRQTDEPRATEMB - MOD(C_PRATOS.QTTOTPRATO +  C_PRATOS.QTTOTEXTRA , VRQTDEPRATEMB)) / VRQTDEPRATEMB)) END AS QTNAOAPROVEITAMENTO
                                    FROM RELPRATEMB R INNER JOIN CONTAINER C ON R.CDCONTAINER = C.CDCONTAINER AND C.IDPROPOSITO = 'C'
                                   WHERE CDPRATO = C_PRATOS.CDPRATO AND
                                         CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT) A
                       GROUP BY A.CDCONTAINER,VRQTDEPRATEMB
                       ORDER BY MIN(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO))
                       WHERE ROWNUM = 1;
                  EXCEPTION
                       WHEN NO_DATA_FOUND THEN
                       V_VRQTDEPRATEMB := NULL;
                  END;
                    
                  IF (V_VRQTDEPRATEMB IS NOT NULL) THEN
                     /*Quantidade de containers : completos + incompleto*/
                     V_QTCONTAINER := TRUNC(C_PRATOS.QTTOTPRATO/V_VRQTDEPRATEMB);
                     IF MOD(C_PRATOS.QTTOTPRATO, V_VRQTDEPRATEMB) <> 0 THEN
                        V_QTCONTAINER := V_QTCONTAINER + 1;
                     END IF;
                       
                     /*Busca novo sequencial*/               
                     NOVO_CODIGO_SC('EMBDISTCARD',V_SEQUENCIAL);
                     V_NREMBDISTCARD := TO_NUMBER(V_SEQUENCIAL);
                       
                          /*Insere embalagem na distribuio do cardpio*/
                     INSERT INTO EMBDISTCARD
                     (NRDISTCARD, NREMBDISTCARD, CDCONTAINER, QTCONTAINER, IDCADAUTO)
                     VALUES
                     (C_CARD.NRDISTCARD, V_NREMBDISTCARD, V_CDCONTAINER, V_QTCONTAINER, 'S');    
                  
                     /*Insere o prato na embalagem na distribuio*/
                     INSERT INTO ITEMBDISTCARD
                     (NRDISTCARD, NRSEQPRATCAR, NREMBDISTCARD, 
                     QTCOMENSAIS, QTPRATO, QTEXTRA, IDCADAUTO, IDPRINCIPAL)
                     VALUES
                     (C_CARD.NRDISTCARD, C_PRATOS.NRSEQPRATCAR, V_NREMBDISTCARD, 
                     C_PRATOS.QTTOTCOMENSAIS, C_PRATOS.QTTOTPRATO, C_PRATOS.QTTOTEXTRA, 'S', 'S');
                  ELSE 
                     INSERE_LOG (C_PRATOS.CDPRODUTO, C_PRATOS.NMPRODUTO, C_CARD.CDFILIAL, C_CARD.NMFILIAL, 
                        C_CARD.CDSERVFILI, C_CARD.NMSERVICO, C_CARD.CDCLIENTE, C_CARD.NMRAZSOCCLIE, 
                        C_CARD.CDDESTFILI, C_CARD.NMDESTFILI, C_CARD.DTCARDAPIO, P_RETORNO, P_NRORG, P_RETORNO);
                  END IF;  
               ELSE 
                    IF C_PRATOS.CDCONTAINER IS NULL THEN
                      INSERE_LOG (C_PRATOS.CDPRODUTO, C_PRATOS.NMPRODUTO, C_CARD.CDFILIAL, C_CARD.NMFILIAL, 
                                  C_CARD.CDSERVFILI, C_CARD.NMSERVICO, C_CARD.CDCLIENTE, C_CARD.NMRAZSOCCLIE, 
                                  C_CARD.CDDESTFILI, C_CARD.NMDESTFILI, C_CARD.DTCARDAPIO, P_RETORNO, P_NRORG, P_RETORNO);     
                    END IF;
               END IF;   
            END IF;
         END IF;
         /*Somente  verdadeiro para a primeira iterao de uma embalagem da configurao*/
         PRIMEIRA_ITERACAO_GRUPO := FALSE;
      END LOOP;
  
      /*ATUALIZA SITUAO DA DISTRIBUIO QUANTO  SUA COMPLETUDE*/
      BEGIN
         SELECT MAX(C.NRSEQPRATCAR)
                INTO V_NRSEQPRATCAR
         FROM CNFDISTCARD C
              LEFT JOIN
             ( 
              SELECT NRDISTCARD, NRSEQPRATCAR, SUM(QTCOMENSAIS) AS QTCOMENSAIS,
                     SUM(QTPRATO) AS QTPRATO, SUM(QTEXTRA) AS QTEXTRA
                FROM ITEMBDISTCARD
                WHERE NRDISTCARD = C_CARD.NRDISTCARD
              GROUP BY NRDISTCARD, NRSEQPRATCAR
             ) U ON U.NRSEQPRATCAR = C.NRSEQPRATCAR
         WHERE C.NRDISTCARD = C_CARD.NRDISTCARD AND
               (C.QTTOTCOMENSAIS - NVL(U.QTCOMENSAIS, 0) > 0 OR
                C.QTTOTPRATO - NVL(U.QTPRATO, 0) > 0 OR
                C.QTTOTEXTRA - NVL(U.QTEXTRA, 0) > 0 );

      EXCEPTION
         WHEN NO_DATA_FOUND THEN
      
            UPDATE DISTCARD
            SET IDSITUACAO = 'C'
            WHERE NRDISTCARD = C_CARD.NRDISTCARD;
      
      END;
   
      IF V_NRSEQPRATCAR IS NOT NULL THEN
         UPDATE DISTCARD
            SET IDSITUACAO = 'I'
            WHERE NRDISTCARD = C_CARD.NRDISTCARD;
      ELSE
         UPDATE DISTCARD
            SET IDSITUACAO = 'C'
            WHERE NRDISTCARD = C_CARD.NRDISTCARD;
      END IF;   
   END LOOP;
   /*FIM DISTRIBUICAO DE EMBALAGEM PARA PRATOS*/
   
   /*DISTRIBUICAO DE EMBALAGEM PARA PRODUTOS*/
   
   V_PRODUTO_ANT := 1;
   /*SUBSTITUI EMBALAGENS JA DISTRIBUIDAS*/
   DELETE FROM ITEMBDISTPROD WHERE NRDISTPROD = P_NRDISTPROD;
   DELETE FROM EMBDISTPROD WHERE NRDISTPROD = P_NRDISTPROD;
   
   FOR C_PROD IN
      (SELECT C.CDFILIAL, F.NMFILIAL, C.CDSERVFILI, S.NMSERVICO, C.CDCLIENTE, 
              CL.NMRAZSOCCLIE, C.CDDESTFILI, D.NMDESTFILI, C.CDPRODUTO, PR.NMPRODUTO, 
              C.NRPRODDISTPROD, C.QTTOTCOMENSAIS, C.QTTOTPRODUTO, C.DTCARDAPIO
         FROM PRODDISTPROD C 
              INNER JOIN PRODUTO PR ON (PR.NRORG = C.NRORG AND PR.CDPRODUTO = C.CDPRODUTO)
              INNER JOIN FILIAL F ON (F.NRORG = C.NRORG AND F.CDFILIAL = C.CDFILIAL)
              INNER JOIN SERVICO S ON (S.NRORG = C.NRORG AND S.CDFILIAL = C.CDFILIAL AND S.CDSERVFILI = C.CDSERVFILI)
              LEFT JOIN CLIENTE CL ON (CL.NRORG = C.NRORG AND CL.CDCLIENTE = C.CDCLIENTE)
              LEFT JOIN DESTFILI D ON (D.NRORG = C.NRORG AND D.CDDESTFILI = C.CDDESTFILI AND D.CDFILIAL = C.CDFILIAL)
              INNER JOIN DISTPROD P ON (P.NRDISTPROD = C.NRDISTPROD AND P.NRORG = C.NRORG)
        WHERE P.NRDISTPROD = P_NRDISTPROD
          AND C.IDTIPOPROD <> 'ENTREGADIRETA'
          AND P.NRORG = P_NRORG
       ORDER BY C.CDPRODUTO, C.CDFILIAL, C.CDSERVFILI, C.CDCLIENTE, C.CDDESTFILI
   )LOOP

      BEGIN
         /*SE NAO TIVER EMBALAGEM RELACIONADA OU SE TIVER S UMA FAZ SEM CHAMAR A FUNO*/
         SELECT COUNT(1)
           INTO V_QTEMBALAGENS
           FROM RELPRODEMB 
          WHERE CDPRODUTO = C_PROD.CDPRODUTO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_QTEMBALAGENS := 0;
         END;
      IF V_QTEMBALAGENS = 1 THEN
         SELECT CDCONTAINER, VRQTDEPRODEMB
           INTO V_CDCONTAINER, V_VRQTDEPRODEMB
           FROM RELPRODEMB
          WHERE CDPRODUTO = C_PROD.CDPRODUTO;
            
         V_QTCONTAINER := TRUNC(C_PROD.QTTOTPRODUTO/V_VRQTDEPRODEMB);
         IF MOD(C_PROD.QTTOTPRODUTO, V_VRQTDEPRODEMB) <> 0 THEN
            V_QTCONTAINER := V_QTCONTAINER + 1;
         END IF;
         
         /*Busca novo sequencial*/               
         NOVO_CODIGO_SC('EMBDISTPROD',V_SEQUENCIAL);
         V_NREMBDISTPROD := TO_NUMBER(V_SEQUENCIAL);
         
         /*Insere embalagem na distribuio do cardpio*/
         INSERT INTO EMBDISTPROD
         (NREMBDISTPROD, NRDISTPROD, CDCONTAINER, QTCONTAINER)
         VALUES
         (V_NREMBDISTPROD, P_NRDISTPROD, V_CDCONTAINER, V_QTCONTAINER);  
            
         /*Insere o prato na embalagem na distribuio*/
         INSERT INTO ITEMBDISTPROD
         (NRPRODDISTPROD, NREMBDISTPROD, NRDISTPROD, 
         QTCOMENSAIS, QTPRODUTO, IDPRINCIPAL)
         VALUES
         (C_PROD.NRPRODDISTPROD, V_NREMBDISTPROD, P_NRDISTPROD, 
         C_PROD.QTTOTCOMENSAIS, C_PROD.QTTOTPRODUTO, 'S');
             
      ELSIF V_QTEMBALAGENS > 1 THEN
         DIST_AUTO_PROD(P_NRDISTPROD, C_PROD.NRPRODDISTPROD, C_PROD.CDPRODUTO, C_PROD.QTTOTCOMENSAIS, C_PROD.QTTOTPRODUTO);
      ELSE 
         IF V_PRODUTO_ANT <> C_PROD.CDPRODUTO THEN
            INSERE_LOG (C_PROD.CDPRODUTO, C_PROD.NMPRODUTO, C_PROD.CDFILIAL, C_PROD.NMFILIAL, 
                        C_PROD.CDSERVFILI, C_PROD.NMSERVICO, C_PROD.CDCLIENTE, C_PROD.NMRAZSOCCLIE, 
                        C_PROD.CDDESTFILI, C_PROD.NMDESTFILI, C_PROD.DTCARDAPIO, P_RETORNO, P_NRORG, P_RETORNO); 
            V_PRODUTO_ANT := C_PROD.CDPRODUTO;  
         END IF;
      END IF; 
   END LOOP;
END;
/