create or replace PROCEDURE CALCULA_ETIQUETA ( 
        P_NRPLANPROD IN PLANPRODACABADO.NRPLANPROD%TYPE,
        P_CDCENTRAL IN FILIAL.CDFILIAL%TYPE,
        P_NRORG IN NUMBER,
        P_RETORNO OUT VARCHAR2 )
IS 
    V_CONF_A_UTILIZAR INT;
    V_SEQUENCIAL      VARCHAR2(20);
    V_QTCONTAINER     FLOAT;
    V_CDCONTAINER     VARCHAR2(5);
    V_PONTUACAO       NUMBER;
    V_VRQTDEPRATEMB   NUMBER;
    V_NRSEQETIQUETA   NUMBER;
    V_QTAPRODUZIR     FLOAT;
    V_QTCUBA          FLOAT;
    V_QTCUBAADD       FLOAT;
    V_QTEXTRA         FLOAT;
    V_QTRESTOPRODUTO  FLOAT;
    V_QTACRESCIMO     FLOAT;
    V_CONTADOR        NUMBER;
    V_PROPOSITO       VARCHAR2(1);
    V_IDLOCALAMOSTRA  VARCHAR2(1);
    V_IDARMAZAMOSTRA  VARCHAR2(1);
    V_QTCOMENSAIS FLOAT;
    V_TOTQTCOMENSAIS FLOAT;
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_DTCONSUMO    IN DATE,
        P_NRPLANPROD   IN NUMBER,
        P_NRORG        IN NUMBER,
        P_RETORNO     OUT NUMBER)
AS
    V_SEQUENCIAL    VARCHAR2(20);
    V_NRLOGMATPRIMA NUMBER;
BEGIN
    IF (P_NRPLANPROD 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_NRPLANPROD;
    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_DTCONSUMO
            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, P_NMFILIAL,
                P_CDSERVFILI, P_NMSERVICO, P_CDCLIENTE, P_NMRAZSOCCLIE, P_CDDESTFILI, P_NMDESTFILI,
                P_DTCONSUMO, P_NRORG
            );
    END;
    P_RETORNO := V_NRLOGMATPRIMA;
END;
BEGIN
     SELECT DECODE(P.IDPESAPAETIQ, 'N', 'N', 'C'), NVL(P.IDLOCALAMOSTRA, 'C'), NVL(P.IDARMAZAMOSTRA, 'N')
       INTO V_PROPOSITO, V_IDLOCALAMOSTRA, V_IDARMAZAMOSTRA
       FROM PARAMPLANEJA P
      WHERE P.CDFILIAL = P_CDCENTRAL;

    IF V_PROPOSITO = 'C' THEN
         DELETE
           FROM ETIQUETACOZ
          WHERE NRPLANPROD = P_NRPLANPROD;
		COMMIT;
		
        FOR C_CARD IN
        ( SELECT DISTINCT CC.CDFILIAL, CC.CDSERVFILI, CC.DTCONSUMO, CC.CDCLIENTE, CC.CDDESTFILI, PP.CDPRODACABADO, CC.IDESTADO
           FROM CARDACLIPLANPROD CC
        INNER JOIN PLANPRODFILIAGREGA PP
             ON PP.NRPLANPROD = CC.NRPLANPROD
            AND PP.CDPRODACABADO = CC.CDPRODUTO
            AND PP.CDFILIAGREG = CC.CDFILIAL
            AND PP.CDSERVFILIAGREG = CC.CDSERVFILI
            AND PP.IDPRODUZIR = 'S'
            AND PP.IDESTADO <> 'PRODUCAO'
            AND PP.IDESTADO = CC.IDESTADO
          WHERE CC.NRPLANPROD = P_NRPLANPROD
       ORDER BY CC.CDFILIAL, CC.CDSERVFILI, CC.DTCONSUMO, CC.CDCLIENTE, CC.CDDESTFILI
        )
        LOOP
            BEGIN
                 SELECT MAX(CONF_A_UTILIZAR) INTO V_CONF_A_UTILIZAR
                   FROM (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
                         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
                    V_CONF_A_UTILIZAR := 0;
            END;

            FOR C_PRATOS IN
                (SELECT CP.NRSEQPRATCAR, CP.NRCARDACLIPLANPROD, CP.CDFILAUXPRAT, CP.CDPRATO, P.NMPRATO, CP.QTCOMESTICLI,
                        -- CP.QTAPRODUZIR, 
						DECODE(V_IDLOCALAMOSTRA, 'A',
							DECODE(V_IDARMAZAMOSTRA, 'S', CP.QTAPRODUZIR,
								CP.QTAPRODUZIR - NVL(CP.QTAMOSTRA, 0)),
							CP.QTAPRODUZIR - NVL(CP.QTAMOSTRA, 0)
						) AS QTAPRODUZIR,
					    DECODE(V_IDLOCALAMOSTRA, 'C', 
						  NVL(CP.QTEXTRA, 0) - NVL(CP.QTAMOSTRA, 0) + NVL(CP.QTACRESCIMO, 0),
						  NVL(CP.QTEXTRA, 0) + NVL(CP.QTAMOSTRA, 0) + NVL(CP.QTACRESCIMO, 0)
					    ) AS QTEXTRA,
						CNF.NRGRUPO, CNF.CDCNFDISTEMBSERV, CNF.IDPROPOSITO, CNF.CDCONTAINER,
                        R.VRQTDEPRATEMB, CP.CDPRODUTO, NVL(CP.QTAMOSTRA, 0) AS QTAMOSTRA, NVL(CP.QTPORPESSOA, 0) QTPORPESSOA, NVL(CP.QTACRESCIMO, 0) QTACRESCIMO
                   FROM CARDACLIPLANPROD CP
                   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 = 'C'
                              WHERE CDFILIAL = C_CARD.CDFILIAL
                                AND CDSERVFILI = C_CARD.CDSERVFILI
                                AND DTREFECNFMES = (C_CARD.DTCONSUMO - TO_CHAR(C_CARD.DTCONSUMO, 'DD')+ 1)
                                AND ( V_CONF_A_UTILIZAR = 1 OR V_CONF_A_UTILIZAR = 0 )
                              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 = 'C'
                              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 = CP.NRSEQPRATCAR
                   LEFT JOIN RELPRATEMB R ON R.CDFILAUXPRAT = CP.CDFILAUXPRAT
                                         AND R.CDPRATO = CP.CDPRATO
                                         AND R.CDCONTAINER = CNF.CDCONTAINER
                  INNER JOIN PRATO P ON P.CDFILAUXPRAT = CP.CDFILAUXPRAT
                                    AND P.CDPRATO = CP.CDPRATO
                  INNER JOIN PLANPRODFILIAGREGA PP ON PP.NRPLANPROD = CP.NRPLANPROD
                                                  AND PP.NRPLANPROD = CP.NRPLANPROD
                                                  AND PP.CDPRODACABADO = CP.CDPRODUTO
                                                  AND PP.CDFILIAGREG = CP.CDFILIAL
                                                  AND PP.CDSERVFILIAGREG = CP.CDSERVFILI
                                                  AND PP.DTCONSUMO = CP.DTCONSUMO
                                                  AND PP.IDPRODUZIR = 'S'
                                                  AND PP.IDESTADO <> 'PRODUCAO'
												  AND PP.IDESTADO = CP.IDESTADO
                  WHERE CP.NRPLANPROD = P_NRPLANPROD
                    AND CP.DTCONSUMO = C_CARD.DTCONSUMO
                    AND CP.CDPRODUTO = C_CARD.CDPRODACABADO
                    AND CP.IDESTADO = C_CARD.IDESTADO
                    AND C_CARD.CDFILIAL = CP.CDFILIAL
                    AND C_CARD.CDSERVFILI = CP.CDSERVFILI
                    AND (CP.CDCLIENTE = C_CARD.CDCLIENTE OR C_CARD.CDCLIENTE IS NULL)
                    AND (CP.CDDESTFILI = C_CARD.CDDESTFILI OR C_CARD.CDDESTFILI IS NULL)
               ORDER BY CNF.NRGRUPO
                )
            LOOP
				V_QTAPRODUZIR := C_PRATOS.QTAPRODUZIR;
                V_QTEXTRA := C_PRATOS.QTEXTRA;
				V_QTACRESCIMO := C_PRATOS.QTACRESCIMO;

                IF (C_PRATOS.IDPROPOSITO = 'C') AND (C_PRATOS.VRQTDEPRATEMB IS NOT NULL) THEN
                    -- V_QTCUBA := C_PRATOS.QTAPRODUZIR + C_PRATOS.QTEXTRA;
                    V_QTCUBA := V_QTAPRODUZIR;
                    V_QTCONTAINER := TRUNC(V_QTCUBA/C_PRATOS.VRQTDEPRATEMB);
                    IF MOD(V_QTCUBA, C_PRATOS.VRQTDEPRATEMB) <> 0 THEN
                        V_QTCONTAINER := V_QTCONTAINER + 1;
                    END IF;
                    
                    V_TOTQTCOMENSAIS := 0;

                    WHILE V_QTCONTAINER > 0
                    LOOP
                        NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
                        V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);
                        IF V_QTCUBA > C_PRATOS.VRQTDEPRATEMB THEN
                            V_QTCUBAADD := C_PRATOS.VRQTDEPRATEMB;
                            V_QTCUBA := V_QTCUBA - C_PRATOS.VRQTDEPRATEMB;
                        ELSE
                            V_QTCUBAADD := V_QTCUBA;
                        END IF;
                        
                        V_QTCOMENSAIS := ROUND(V_QTCUBAADD / C_PRATOS.QTPORPESSOA,2);
                        V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                        IF V_TOTQTCOMENSAIS > C_PRATOS.QTCOMESTICLI THEN   
                            V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_PRATOS.QTCOMESTICLI);
                            IF V_QTCOMENSAIS < 0 THEN
                                V_QTCOMENSAIS := 0;
                            END IF;
                        END IF;
                        IF V_QTCONTAINER = 1 AND V_TOTQTCOMENSAIS > 0 AND C_PRATOS.QTCOMESTICLI - V_TOTQTCOMENSAIS > 0 THEN
                           V_QTCOMENSAIS := V_QTCOMENSAIS + (C_PRATOS.QTCOMESTICLI - V_TOTQTCOMENSAIS);
                        END IF;
                        INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
                            NRCARDACLIPLANPROD, CDCONTAINER, QTREAL, IDATIVO,
                            NRORG, IDIMPRESSO, QTCOMENSAIS, QTEXTRA, CDPRODUTO)
                        VALUES ( V_NRSEQETIQUETA, P_NRPLANPROD, 
                            C_PRATOS.NRCARDACLIPLANPROD, C_PRATOS.CDCONTAINER, V_QTCUBAADD, 'S',
                            P_NRORG, 'N', V_QTCOMENSAIS, V_QTEXTRA, C_PRATOS.CDPRODUTO
                        );

						V_QTEXTRA := 0;
                        V_QTCONTAINER := V_QTCONTAINER - 1;
                    END LOOP;
                ELSE
                    IF (C_PRATOS.CDCNFDISTEMBSERV = 'DISTR') THEN 
                        V_QTRESTOPRODUTO := V_QTAPRODUZIR;
						-- V_QTRESTOPRODUTO := 1;
                        V_CONTADOR := 1;
                        V_TOTQTCOMENSAIS := 0;

                        WHILE V_QTRESTOPRODUTO > 0
						LOOP
							BEGIN
							 SELECT CDCONTAINER, VRQTDEPRATEMB, QTRESTANTE
								INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_QTAPRODUZIR
							   FROM (SELECT A.CDCONTAINER, A.VRQTDEPRATEMB, A.QTRESTANTE 
									   FROM (SELECT R.CDCONTAINER, MAX(R.VRQTDEPRATEMB) VRQTDEPRATEMB, (V_QTAPRODUZIR) - MAX(R.VRQTDEPRATEMB) AS QTRESTANTE
											   FROM RELPRATEMB R
											  WHERE R.CDPRATO = C_PRATOS.CDPRATO
												AND R.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
												AND R.VRQTDEPRATEMB <= (V_QTAPRODUZIR)
												AND NOT EXISTS (SELECT ER.CDCONTAINER 
																  FROM EXCECRELPRATEMBFIL ER
																 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
																   AND ER.CDPRATO = R.CDPRATO
																   AND ER.CDFILAUXPRAT = R.CDFILAUXPRAT)
											 GROUP BY R.CDCONTAINER
											 UNION ALL
											SELECT ER.CDCONTAINER, MAX(ER.VRQTDEPRATEMB) VRQTDEPRATEMB, (V_QTAPRODUZIR) - MAX(ER.VRQTDEPRATEMB) AS QTRESTANTE 
											  FROM EXCECRELPRATEMBFIL ER
											 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
											   AND ER.CDPRATO = C_PRATOS.CDPRATO
											   AND ER.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
											   AND ER.VRQTDEPRATEMB <= (V_QTAPRODUZIR)
											 GROUP BY ER.CDCONTAINER
											) A
										INNER JOIN CONTAINER C
											 ON A.CDCONTAINER = C.CDCONTAINER
											AND C.IDPROPOSITO = 'C'
										ORDER BY A.VRQTDEPRATEMB DESC ) WHERE ROWNUM = 1;
							EXCEPTION
								WHEN NO_DATA_FOUND THEN
									BEGIN
										SELECT CDCONTAINER, VRQTDEPRATEMB
										   INTO V_CDCONTAINER, V_VRQTDEPRATEMB
										   FROM (SELECT A.CDCONTAINER, A.VRQTDEPRATEMB
												   FROM (SELECT R.CDCONTAINER, R.VRQTDEPRATEMB
														   FROM RELPRATEMB R
														  WHERE R.CDPRATO = C_PRATOS.CDPRATO
															AND R.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
															AND R.VRQTDEPRATEMB >= (V_QTAPRODUZIR)
															AND NOT EXISTS (SELECT ER.CDCONTAINER 
																			  FROM EXCECRELPRATEMBFIL ER
																			 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
																			   AND ER.CDPRATO = R.CDPRATO
																			   AND ER.CDFILAUXPRAT = R.CDFILAUXPRAT)
														 UNION ALL
														SELECT ER.CDCONTAINER, ER.VRQTDEPRATEMB
														  FROM EXCECRELPRATEMBFIL ER
														 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
														   AND ER.CDPRATO = C_PRATOS.CDPRATO
														   AND ER.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
														   AND ER.VRQTDEPRATEMB >= (V_QTAPRODUZIR)
														) A
													INNER JOIN CONTAINER C
														 ON A.CDCONTAINER = C.CDCONTAINER
														AND C.IDPROPOSITO = 'C'
													ORDER BY A.VRQTDEPRATEMB ASC ) WHERE ROWNUM = 1;
									 EXCEPTION
										WHEN NO_DATA_FOUND THEN
											IF V_CONTADOR = 1 THEN
												INSERE_LOG (C_PRATOS.CDPRODUTO, '', C_CARD.CDFILIAL, '', 
													C_CARD.CDSERVFILI, '', C_CARD.CDCLIENTE, '', 
													C_CARD.CDDESTFILI, '', C_CARD.DTCONSUMO, 
													P_RETORNO, P_NRORG, P_RETORNO);
												V_VRQTDEPRATEMB := NULL;
											END IF;
									  END;

									IF (V_VRQTDEPRATEMB IS NOT NULL) THEN
									  NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
									  V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);
                                      
                                      V_QTCOMENSAIS := ROUND(V_QTRESTOPRODUTO / C_PRATOS.QTPORPESSOA,2);
                                      V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                                      IF V_TOTQTCOMENSAIS > C_PRATOS.QTCOMESTICLI THEN 
                                        V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_PRATOS.QTCOMESTICLI);
                                        IF V_QTCOMENSAIS < 0 THEN
                                            V_QTCOMENSAIS := 0;
                                        END IF;
                                      END IF;
                                      
									  INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
										NRCARDACLIPLANPROD, CDCONTAINER, QTREAL, IDATIVO,
										NRORG, IDIMPRESSO, QTCOMENSAIS, QTEXTRA, CDPRODUTO
									  ) VALUES ( V_NRSEQETIQUETA, P_NRPLANPROD,
										C_PRATOS.NRCARDACLIPLANPROD, V_CDCONTAINER, V_QTAPRODUZIR, 'S',
										P_NRORG, 'N', V_QTCOMENSAIS, V_QTEXTRA, C_PRATOS.CDPRODUTO);
									END IF;								

									V_QTEXTRA := 0;
									V_VRQTDEPRATEMB := NULL;
									V_QTRESTOPRODUTO := 0;
									V_CONTADOR := 0;
							END;

                            IF (V_VRQTDEPRATEMB IS NOT NULL) THEN
                                NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
                                V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);

								IF (V_QTAPRODUZIR < 0) THEN
									V_VRQTDEPRATEMB := V_QTAPRODUZIR + V_VRQTDEPRATEMB;
								END IF;
                                
                                V_QTCOMENSAIS := ROUND(V_VRQTDEPRATEMB / C_PRATOS.QTPORPESSOA,2);
                                V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                                IF V_TOTQTCOMENSAIS > C_PRATOS.QTCOMESTICLI THEN 
                                    V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_PRATOS.QTCOMESTICLI);
                                    IF V_QTCOMENSAIS < 0 THEN
                                        V_QTCOMENSAIS := 0;
                                    END IF;
                                END IF;

                                INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
                                    NRCARDACLIPLANPROD, CDCONTAINER, QTREAL, IDATIVO,
                                    NRORG, IDIMPRESSO, QTCOMENSAIS, QTEXTRA, CDPRODUTO
                                ) VALUES ( V_NRSEQETIQUETA, P_NRPLANPROD, 
                                    C_PRATOS.NRCARDACLIPLANPROD, V_CDCONTAINER, V_VRQTDEPRATEMB, 'S',
                                    P_NRORG, 'N', V_QTCOMENSAIS, V_QTEXTRA, C_PRATOS.CDPRODUTO);

								V_QTEXTRA := 0;
								V_QTRESTOPRODUTO := V_QTAPRODUZIR;
								V_CONTADOR := 0;
								V_QTACRESCIMO := 0;								
						   
                            END IF;
                        END LOOP;
                    ELSE
                        IF (C_PRATOS.CDCNFDISTEMBSERV = 'DIST') THEN
                            V_TOTQTCOMENSAIS := 0;
                            BEGIN
                                 SELECT CDCONTAINER, VRQTDEPRATEMB, PONTUACAO
                                    INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_PONTUACAO
                                   FROM
                                    (SELECT A.CDCONTAINER, VRQTDEPRATEMB, MAX(A.QTEMBCOMPLETAS + A.QTNAOAPROVEITAMENTO) AS PONTUACAO
                                       FROM 
                                        ( SELECT EMB.CDCONTAINER, CASE TRUNC(C_PRATOS.QTAPRODUZIR + C_PRATOS.QTEXTRA / EMB.VRQTDEPRATEMB)
												 	WHEN 0
													THEN 1
													ELSE TRUNC(C_PRATOS.QTAPRODUZIR + C_PRATOS.QTEXTRA / EMB.VRQTDEPRATEMB)
												 END AS QTEMBCOMPLETAS, EMB.VRQTDEPRATEMB,
												 CASE MOD(C_PRATOS.QTAPRODUZIR + C_PRATOS.QTEXTRA , EMB.VRQTDEPRATEMB)
													WHEN 0
													THEN 0
													ELSE (1 - ((EMB.VRQTDEPRATEMB - MOD(C_PRATOS.QTAPRODUZIR + C_PRATOS.QTEXTRA , EMB.VRQTDEPRATEMB)) / EMB.VRQTDEPRATEMB))
												 END AS QTNAOAPROVEITAMENTO
										    FROM (SELECT R.CDCONTAINER, R.VRQTDEPRATEMB
												   FROM RELPRATEMB R
												  WHERE R.CDPRATO = C_PRATOS.CDPRATO
													AND R.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
													AND NOT EXISTS (SELECT ER.CDCONTAINER 
																	  FROM EXCECRELPRATEMBFIL ER
																	 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
																	   AND ER.CDPRATO = R.CDPRATO
																	   AND ER.CDFILAUXPRAT = R.CDFILAUXPRAT)												
													 UNION ALL
													SELECT ER.CDCONTAINER, ER.VRQTDEPRATEMB
													  FROM EXCECRELPRATEMBFIL ER
													 WHERE ER.CDFILIAL = C_CARD.CDFILIAL
													   AND ER.CDPRATO = C_PRATOS.CDPRATO
													   AND ER.CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
												) EMB
											INNER JOIN CONTAINER C
											   ON EMB.CDCONTAINER = C.CDCONTAINER
											  AND C.IDPROPOSITO = 'C'
											) A
									   GROUP BY CDCONTAINER, VRQTDEPRATEMB
									   ORDER BY PONTUACAO DESC 
										)
									  WHERE ROWNUM = 1;
                            EXCEPTION
                            WHEN NO_DATA_FOUND THEN
                                V_VRQTDEPRATEMB := NULL;
                            END;

							--V_QTAPRODUZIR := C_PRATOS.QTAPRODUZIR; 

                            IF (V_VRQTDEPRATEMB IS NOT NULL) THEN
                                V_QTCONTAINER := TRUNC(C_PRATOS.QTAPRODUZIR/V_VRQTDEPRATEMB);

                                IF MOD(C_PRATOS.QTAPRODUZIR, V_VRQTDEPRATEMB) <> 0 THEN
                                    V_QTCONTAINER := V_QTCONTAINER + 1;
                                END IF;

                                WHILE V_QTCONTAINER > 0
                                LOOP
                                    NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
                                    V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);

                                    IF (V_VRQTDEPRATEMB > V_QTAPRODUZIR) THEN
                                        V_QTRESTOPRODUTO := V_QTAPRODUZIR;
                                    ELSE
                                        V_QTRESTOPRODUTO := V_VRQTDEPRATEMB;
                                    END IF;
                                    
                                    V_QTCOMENSAIS := ROUND(V_QTRESTOPRODUTO / C_PRATOS.QTPORPESSOA,2);
                                    V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                                    IF V_TOTQTCOMENSAIS > C_PRATOS.QTCOMESTICLI THEN 
                                        V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_PRATOS.QTCOMESTICLI);
                                        IF V_QTCOMENSAIS < 0 THEN
                                            V_QTCOMENSAIS := 0;
                                        END IF;
                                    END IF;
                                    IF V_QTCONTAINER = 1 AND V_TOTQTCOMENSAIS > 0 AND C_PRATOS.QTCOMESTICLI - V_TOTQTCOMENSAIS > 0 THEN
                                       V_QTCOMENSAIS := V_QTCOMENSAIS + (C_PRATOS.QTCOMESTICLI - V_TOTQTCOMENSAIS);
                                    END IF;
                                     INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
                                        NRCARDACLIPLANPROD, CDCONTAINER, QTREAL, IDATIVO,
                                        NRORG, IDIMPRESSO, CDPRODUTO, QTCOMENSAIS, QTEXTRA
                                    ) VALUES (V_NRSEQETIQUETA, P_NRPLANPROD, 
                                        C_PRATOS.NRCARDACLIPLANPROD, V_CDCONTAINER, V_QTRESTOPRODUTO, 'S',
                                        P_NRORG, 'N', C_PRATOS.CDPRODUTO, V_QTCOMENSAIS, V_QTEXTRA);

									V_QTEXTRA := 0;
                                    V_QTCONTAINER := V_QTCONTAINER - 1;                                    
                                    V_QTAPRODUZIR := V_QTAPRODUZIR - V_QTRESTOPRODUTO; 
                                END LOOP;

                            END IF;
                        ELSE
                            INSERE_LOG (C_PRATOS.CDPRODUTO, '', C_CARD.CDFILIAL, '', 
                                        C_CARD.CDSERVFILI, '', C_CARD.CDCLIENTE, '', 
                                        C_CARD.CDDESTFILI, '', C_CARD.DTCONSUMO, 
                                        P_RETORNO, P_NRORG, P_RETORNO);
                        END IF;
                    END IF;
                END IF;
            END LOOP;
        END LOOP;

        FOR C_ANTECIPACAO IN (
            SELECT PP.CDFILIAGREG, PP.CDSERVFILIAGREG, PP.CDPRODACABADO, PA.CDPRATO, 
                   PA.CDFILAUXPRAT, PP.DTCONSUMO, CP.QTAPRODUZIR, 0 AS QTEXTRA, CP.NRCARDACLIPLANPROD , NVL(CP.QTPORPESSOA, 0) QTPORPESSOA,
                   CP.QTCOMESTICLI
            FROM PLANPRODFILIAGREGA PP
            INNER JOIN PLANPRODACABADO PA ON 
                PA.NRPLANPROD = PP.NRPLANPROD
                AND PA.CDPRODACABADO = PP.CDPRODACABADO
				AND PA.IDESTADO = PP.IDESTADO
			INNER JOIN CARDACLIPLANPROD CP ON PP.NRPLANPROD = CP.NRPLANPROD
				  AND PP.NRPLANPROD = CP.NRPLANPROD
				  AND PP.CDPRODACABADO = CP.CDPRODUTO
				  AND PP.CDFILIAGREG = CP.CDFILIAL
				  AND PP.CDSERVFILIAGREG = CP.CDSERVFILI
				  AND PP.DTCONSUMO = CP.DTCONSUMO
				  AND PP.IDESTADO = CP.IDESTADO
            WHERE PP.NRPLANPROD = P_NRPLANPROD
			  AND PP.IDPRODUZIR = 'S'
			  AND PP.IDESTADO = 'PRODUCAO'
            ORDER BY PP.CDFILIAGREG, PP.CDSERVFILIAGREG, PP.DTCONSUMO 
        )LOOP
            V_QTAPRODUZIR := C_ANTECIPACAO.QTAPRODUZIR;
            V_QTEXTRA := C_ANTECIPACAO.QTEXTRA;
            V_QTRESTOPRODUTO := 1;
            V_CONTADOR := 1;
            V_TOTQTCOMENSAIS := 0;

            WHILE V_QTRESTOPRODUTO > 0
            LOOP
                BEGIN
                     SELECT CDCONTAINER, VRQTDEPRATEMB, NVL(QTRESTANTE, 0)
                       INTO V_CDCONTAINER, V_VRQTDEPRATEMB, V_QTAPRODUZIR
                       FROM
                        (SELECT R.CDCONTAINER, R.VRQTDEPRATEMB, (V_QTAPRODUZIR + V_QTEXTRA) - VRQTDEPRATEMB AS QTRESTANTE
                           FROM RELPRATEMB R
                        INNER JOIN CONTAINER C
                             ON R.CDCONTAINER = C.CDCONTAINER
                            AND C.IDPROPOSITO = 'C'
                          WHERE CDPRATO = C_ANTECIPACAO.CDPRATO
                            AND CDFILAUXPRAT = C_ANTECIPACAO.CDFILAUXPRAT
                            AND VRQTDEPRATEMB <= (V_QTAPRODUZIR + V_QTEXTRA)
                       ORDER BY VRQTDEPRATEMB DESC
                        ) A
                      WHERE ROWNUM = 1; 
                EXCEPTION
                WHEN NO_DATA_FOUND THEN
					SELECT CDCONTAINER, VRQTDEPRATEMB
					   INTO V_CDCONTAINER, V_VRQTDEPRATEMB
					   FROM
						(SELECT R.CDCONTAINER, R.VRQTDEPRATEMB
						   FROM RELPRATEMB R
						INNER JOIN CONTAINER C
							 ON R.CDCONTAINER = C.CDCONTAINER
							AND C.IDPROPOSITO = 'C'
						  WHERE CDPRATO = C_ANTECIPACAO.CDPRATO
							AND CDFILAUXPRAT = C_ANTECIPACAO.CDFILAUXPRAT
							AND VRQTDEPRATEMB >= (V_QTAPRODUZIR + V_QTEXTRA)
					   ORDER BY VRQTDEPRATEMB ASC
						) A
					  WHERE ROWNUM = 1;
					  
					  IF (V_VRQTDEPRATEMB IS NULL AND V_CONTADOR = 1) THEN
						INSERE_LOG (C_ANTECIPACAO.CDPRODACABADO, '', C_ANTECIPACAO.CDFILIAGREG, '', 
								C_ANTECIPACAO.CDSERVFILIAGREG, '', '', '', 
								'', '', C_ANTECIPACAO.DTCONSUMO, 
								P_RETORNO, P_NRORG, P_RETORNO);
					 ELSE 						
					   NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
 					   V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);
                       
                       V_QTCOMENSAIS := ROUND(V_QTRESTOPRODUTO / C_ANTECIPACAO.QTPORPESSOA,2);
                       V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                       IF V_TOTQTCOMENSAIS > C_ANTECIPACAO.QTCOMESTICLI THEN 
                        V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_ANTECIPACAO.QTCOMESTICLI);
                        IF V_QTCOMENSAIS < 0 THEN
                            V_QTCOMENSAIS := 0;
                        END IF;
                       END IF;

					   INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
							CDPRODUTO, CDCONTAINER, QTREAL, IDATIVO,
							NRORG, IDIMPRESSO, NRCARDACLIPLANPROD, QTCOMENSAIS, QTEXTRA
						) VALUES ( V_NRSEQETIQUETA, P_NRPLANPROD, 
							C_ANTECIPACAO.CDPRODACABADO, V_CDCONTAINER, V_QTRESTOPRODUTO, 'S',
							P_NRORG, 'N', C_ANTECIPACAO.NRCARDACLIPLANPROD, V_QTCOMENSAIS, V_QTEXTRA );
                    END IF;

                    V_VRQTDEPRATEMB := 0;
                    V_QTRESTOPRODUTO := 0;
                    V_CONTADOR := 0;
					V_QTEXTRA := 0;

                END;
				
                IF (V_VRQTDEPRATEMB > 0) THEN
                    NOVO_CODIGO_SC('ETIQUETACOZ',V_SEQUENCIAL);
                    V_NRSEQETIQUETA := TO_NUMBER(V_SEQUENCIAL);
                    
                    V_QTCOMENSAIS := ROUND(V_VRQTDEPRATEMB / C_ANTECIPACAO.QTPORPESSOA,2);
                    V_TOTQTCOMENSAIS := V_TOTQTCOMENSAIS + V_QTCOMENSAIS;
                    IF V_TOTQTCOMENSAIS > C_ANTECIPACAO.QTCOMESTICLI THEN 
                        V_QTCOMENSAIS := V_QTCOMENSAIS - (V_TOTQTCOMENSAIS - C_ANTECIPACAO.QTCOMESTICLI);
                        IF V_QTCOMENSAIS < 0 THEN
                            V_QTCOMENSAIS := 0;
                        END IF;
                    END IF;

                    INSERT INTO ETIQUETACOZ ( NRETIQUETACOZ, NRPLANPROD, 
                        CDPRODUTO, CDCONTAINER, QTREAL, IDATIVO,
                        NRORG, IDIMPRESSO, NRCARDACLIPLANPROD, QTCOMENSAIS, QTEXTRA
                    ) VALUES ( V_NRSEQETIQUETA, P_NRPLANPROD, 
                        C_ANTECIPACAO.CDPRODACABADO, V_CDCONTAINER, V_VRQTDEPRATEMB, 'S',
                        P_NRORG, 'N', C_ANTECIPACAO.NRCARDACLIPLANPROD, V_QTCOMENSAIS, V_QTEXTRA );

                    V_QTEXTRA := 0;
                    V_QTRESTOPRODUTO := V_QTAPRODUZIR;
                    V_CONTADOR := 0;
                END IF;    
            END LOOP;
        END LOOP;
    END IF;

    IF P_RETORNO IS NULL THEN
        P_RETORNO := 'S';
    END IF;
END;
/
