/**
 * Aplica restri��es informadas como par�metro sobre o card�pio base e suas regras 
 * para cria��o de um card�pio de trabalho.
 * 
 * @param {Number} P_NRCARDAPIOBASE N�mero do card�pio base da importa��o
 * @param {Varchar2} P_IDORIGEM Indica a opera��o que est� executando a importa��o 
 *                              (CALCULOGN, PLANEJAMENTO, SIMULADOR)
 * @param {Number} P_NRATIVCLISEGMER N�mero da rela��o entre segmento de mercado e ramo de atividade
 * @param {Varchar2} P_CDREGIAO C�digo da regi�o
 * @param {Varchar2} P_VRPEACRESCUSTO Percentual de acr�scimo sobre o custo da regi�o
 * @param {Number} P_NRTIPOPUBLICO N�mero do tipo de p�blico
 * @param {Float} P_QTSEGSEX Quantidade de comensais de segunda a sexta
 * @param {Float} P_QTSABADO Quantidade de comensais no s�bado
 * @param {Float} P_QTDOMFERI Quantidade de comensais em domingos e feriados
 * @param {Float} P_QTTURNOS Quantidade de turnos
 * @param {Varchar2} P_CONFIGURACOES N�mero da tabela LISTA que cont�m o n�mero das configura��es no CDLISTA
 * @param {Varchar2} P_GRUPOS N�mero da tabela LISTA que cont�m a chave do grupo de tipo de prato, 
 *                            o n�mero do porcionamento, o n�mero da gramatura e aplica��o da gramatura no campo CDLISTA.
 *                            Exemplo de CDLISTA: 28|2425|455555|0
 *                            Aplica��o:
 *                            0 => INNATURA
 *                            1=> LIMPA
 *                            2=> PRONTA
 * @param {Date} P_DTCUSTO Data para refer�ncia do custo
 * @param {Number} P_NRCARDTRABCOMPLEMENTADO Data do card�pio de trabalho complementado pelo card�pio base de origem
 * @param {Number} P_NRORG N�mero da organiza��o logada
 * @param {Varchar2} P_CDOPERADOR C�digo do operador logado
 * @param {Varchar2} P_CDFILIALLOGADA C�digo da filial logada
 * @param {Number} P_NRCARDAPIOTRAB {sa�da} N�mero sequencial do card�pio de trabalho resultante da rotina
 * @param {Number} P_LISTAERROS {sa�da} Lista de erros. Se preenchido o ROLLBACK � obrigat�rio
 * @param {Varchar2} P_IDIOMA Idioma utilizado atualmente pelo sistema
 * revisada
 */
CREATE OR REPLACE PROCEDURE IMPORTA_CARDBASE_NO_CARDTRAB
(
   P_NRCARDAPIOBASE IN NUMBER,
   P_IDORIGEM IN VARCHAR2,
   P_NRATIVCLISEGMER IN NUMBER,
   P_CDREGIAO IN VARCHAR2,
   P_VRPEACRESCUSTO IN FLOAT,
   P_NRTIPOPUBLICO IN NUMBER,
   P_QTSEGSEX IN FLOAT,
   P_QTSABADO IN FLOAT,
   P_QTDOMFERI IN FLOAT,
   P_QTTURNOS IN FLOAT,
   P_CONFIGURACOES IN VARCHAR2,
   P_GRUPOS IN VARCHAR2,
   P_DTCUSTO IN DATE,
   P_NRCARDTRABCOMPLEMENTADO IN NUMBER,
   P_NRORG IN NUMBER,
   P_CDOPERADOR IN VARCHAR2,
   P_CDFILIALLOGADA IN VARCHAR2,
   P_NRCARDAPIOTRAB OUT NUMBER,
   P_LISTAERROS OUT VARCHAR2,
   P_IDIOMA IN VARCHAR2 DEFAULT 'PT_BR'
)
AS
   V_QTDE NUMBER;
   V_NRCARDAPIOTRAB NUMBER;
   V_CDCARDAPIOBASE VARCHAR2(10);
   V_DTINIVIGENCIA DATE;
   V_DTFIMVIGENCIA DATE;
   V_IDATIVO VARCHAR2(1);
   V_NRPADRAOQUALIDADE NUMBER;
   V_NRSERVICOPROPOSTA NUMBER;
   V_CDFILIAL VARCHAR2(4);
   V_CDTIPOCUSTO VARCHAR2(2);
   V_NRDIACARDTRAB NUMBER;
   V_NRCONFIGCARDTRAB NUMBER;
   V_NRCOMPCARDTRAB NUMBER;
   V_NRPRODUTOCARDTRAB NUMBER;
   V_NRRECEPRATCARDTRAB NUMBER;
   V_NRCOMPCARDBASE NUMBER;
   V_NRPRATCOMPCARDBASE NUMBER;
   V_CDFILAUXPRAT VARCHAR2(4);
   V_CDPRATO VARCHAR2(10);
   V_NMPRATO VARCHAR2(100);
   V_NRADESAOCARDBASE NUMBER;
   V_CDADESAOCARDBASE VARCHAR2(5);   
   V_ATENDE_PORCIONAMENTO VARCHAR2(1);
   V_ATENDE_SEGMENTO VARCHAR2(1);
   V_ATENDE_RAMO VARCHAR2(1);
   V_SERVICOPROPOSTA VARCHAR2(100);
   V_CDFILIALSERV VARCHAR2(4);   
   V_CDSERVFILI VARCHAR2(5);
   V_QTDE2 NUMBER;
   V_CDPRODUTO_BASE VARCHAR2(10);   
   V_NRRECEPRAT_ESCOLHIDA NUMBER;   
   V_VRGRAMATURA FLOAT;
   V_IDTIPOGRAMATURA VARCHAR2(30);
   V_CDPRODUTO VARCHAR2(10);
   V_NMPRODUTO VARCHAR2(100);   
   V_NRPARTSEGCARDBASE NUMBER; 
   V_CDPARTSEGCARDBASE VARCHAR2(5);
   V_NRCONFIGCARDBASEQ NUMBER;
   V_NRCONFIGCARDBASEF NUMBER;
   V_QTUNIDADES FLOAT;
   V_NRORDEM NUMBER;
   V_COMENSAIS FLOAT;
   V_CDTIPOPRATLIMPEZA VARCHAR2(2);
   V_NRCONFIGCARDBASE NUMBER;
   V_IDCOMPLEMENTAR VARCHAR2(1);
   V_NRCARDAPIOBASECOMPL NUMBER;
   V_NRCARDCOMPLCARDBASE NUMBER;
   V_NRCOMPCARDTRABCOMPL NUMBER;
   V_NMREGIAO VARCHAR2(100);
   V_DESCRICAO VARCHAR2(100);
   V_CDSEGMER VARCHAR2(5);
   V_IDRECEITA VARCHAR2(1);
   V_NMSERVICO VARCHAR2(200);
   V_DSCOMPLEMENTO VARCHAR2(50);
   V_VRFTCONVER FLOAT; 
   V_IDTIPOOPE VARCHAR2(1);   
   V_CDFILCENTCMP VARCHAR2(4);

   V_CDPRODESTO VARCHAR2(10);
   V_VRPRECO FLOAT;
   V_VRPRECO_PROD FLOAT;
   V_FORNECEDOR_OL VARCHAR2(1);
   V_FORNECEDOR_OL_PROD VARCHAR2(1);
   V_CDMARCA VARCHAR2(5);
   V_IDTIPOAPUR VARCHAR2(1);
   V_VRFATOCONV FLOAT;

   V_NRLISTAPRECOTCO NUMBER;
   V_NRDIACARDBASE NUMBER;
   V_NRPORCIOGRAMCARDTRAB NUMBER;
   V_NRAMOSTRACARDBASE NUMBER;
   V_NRLIMPEZACARDBASE NUMBER;
   V_NRGRUPOPRATO NUMBER;
   V_NMGRUPOPRATO VARCHAR2(50);   
   V_NRITEMGRAMCARDBASE NUMBER;
   V_GRAMATURA VARCHAR2(400);
   V_SGUNIDADE VARCHAR2(10);
   V_NRTABCORRPRODTCO NUMBER;
   V_VRDEGELO FLOAT;
   V_VRLIMPEZA FLOAT;
   V_VRCOCCAO FLOAT;
   V_VRBRUTA FLOAT;
   -- Procedure auxiliar para agilizar inclus�o na lista de erros
   PROCEDURE I_L(MENSAGEM IN VARCHAR2)
   AS
   BEGIN
      INSERE_LISTA_ERROS(P_CDFILIALLOGADA, MENSAGEM,
                         P_CDOPERADOR, P_NRORG, P_LISTAERROS);
   END;

   FUNCTION NOME_DIA(NRSEMANA IN NUMBER, NRDIASEMANA IN NUMBER) RETURN VARCHAR2
   AS
   BEGIN
   	  IF UPPER(P_IDIOMA) = 'PT_BR' THEN
   	  	 IF NRDIASEMANA = 1 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' DOM';
   	  	 ELSIF NRDIASEMANA = 2 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' SEG';
   	  	 ELSIF NRDIASEMANA = 3 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' TER';
   	  	 ELSIF NRDIASEMANA = 4 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' QUA';
   	  	 ELSIF NRDIASEMANA = 5 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' QUI';
   	  	 ELSIF NRDIASEMANA = 6 THEN   	  	 	
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' SEX';
   	  	 ELSIF NRDIASEMANA = 7 THEN
   	  	 	RETURN TO_CHAR(NRSEMANA) || ' SAB';
   	  	 END IF;
   	  END IF;
   	  RETURN NULL;
   END;

   FUNCTION RETORNA_IDTIPOGRAMATURA(P_IDXGRAMATURA IN VARCHAR2) RETURN VARCHAR2
   AS
   BEGIN
      IF P_IDXGRAMATURA = '0' THEN
         RETURN 'INNATURA';
      ELSIF P_IDXGRAMATURA = '1' THEN
         RETURN 'LIMPA';
      ELSIF P_IDXGRAMATURA = '2' THEN
         RETURN 'PRONTA';
      END IF;
      RETURN NULL;
   END;

   PROCEDURE REGISTRA_REGRA(R_REGRA IN VARCHAR2, R_CDGRTIPOPR IN VARCHAR2,
                            R_NRPORCIONAMENTO IN NUMBER,
                            R_NRDIACARDBASE IN NUMBER,
                            R_NRADESAOCARDBASE IN NUMBER,
                            R_NRGRAMATURACARDBASE IN NUMBER,
                            R_IDTIPOGRAMATURA IN VARCHAR2,
                            R_NRPARTSEGCARDBASE IN NUMBER,
                            R_NRAMOSTRACARDBASE IN NUMBER,
                            R_IDTEMPERATURA IN VARCHAR2,
                            R_NRDESCARTCARDBASE IN NUMBER,
                            R_NRLIMPEZACARDBASE IN NUMBER)
   AS
      V_NRREGRACARDTRAB NUMBER;
   BEGIN
      V_NRREGRACARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('REGRACARDTRAB', 1));
      INSERT INTO REGRACARDTRAB
      (NRREGRACARDTRAB, NRCARDAPIOTRAB, IDREGRACARDTRAB, 
       CDGRTIPOPR, NRPORCIONAMENTO, NRDIACARDBASE, 
       NRATIVCLISEGMER, NRADESAOCARDBASE, NRGRAMATURACARDBASE, 
       IDTIPOGRAMATURA, NRTIPOPUBLICO, NRPARTSEGCARDBASE, 
       NRAMOSTRACARDBASE, IDTEMPERATURA, 
       NRDESCARTCARDBASE, NRLIMPEZACARDBASE, 
       NRORG, NRORGINCLUSAO, NRORGULTATU,
       CDOPERINCLUSAO, CDOPERULTATU,
       DTINCLUSAO, DTULTATU)
      VALUES
      (V_NRREGRACARDTRAB, V_NRCARDAPIOTRAB, R_REGRA, 
       R_CDGRTIPOPR, R_NRPORCIONAMENTO, R_NRDIACARDBASE, 
       P_NRATIVCLISEGMER, R_NRADESAOCARDBASE, R_NRGRAMATURACARDBASE, 
       R_IDTIPOGRAMATURA, P_NRTIPOPUBLICO, R_NRPARTSEGCARDBASE, 
       R_NRAMOSTRACARDBASE, R_IDTEMPERATURA,
       R_NRDESCARTCARDBASE, R_NRLIMPEZACARDBASE, 
       P_NRORG, P_NRORG, P_NRORG,
       P_CDOPERADOR, P_CDOPERADOR,
       SYSDATE, SYSDATE);
   END;

   PROCEDURE REGISTRA_REGRA_ADESAO(R_NRADESAOCARDBASE IN NUMBER, R_CDGRTIPOPR IN VARCHAR2, 
                             R_NRPORCIONAMENTO IN NUMBER, R_NRDIACARDBASE IN NUMBER)
   AS
   BEGIN
      REGISTRA_REGRA('ADESAO', R_CDGRTIPOPR, R_NRPORCIONAMENTO,
                     R_NRDIACARDBASE, R_NRADESAOCARDBASE,
                     NULL, NULL, NULL,
                     NULL, NULL, NULL, NULL);
   END;

   PROCEDURE REGISTRA_REGRA_GRAMATURA(R_NRGRAMATURACARDBASE IN NUMBER, R_IDTIPOGRAMATURA IN VARCHAR2, 
                                R_CDGRTIPOPR IN VARCHAR2, R_NRPORCIONAMENTO IN NUMBER)
   AS
   BEGIN
      REGISTRA_REGRA('GRAMATURA', R_CDGRTIPOPR, R_NRPORCIONAMENTO,
                     NULL, NULL,
                     R_NRGRAMATURACARDBASE, R_IDTIPOGRAMATURA, NULL,
                     NULL, NULL, NULL, NULL);
   END;

   PROCEDURE REGISTRA_REGRA_PARTSEG(R_NRPARTSEGCARDBASE IN NUMBER)
   AS
   BEGIN
      REGISTRA_REGRA('PARTSEG', NULL, NULL,
                     NULL, NULL,
                     NULL, NULL, R_NRPARTSEGCARDBASE,
                     NULL, NULL, NULL, NULL);
   END;

   PROCEDURE REGISTRA_REGRA_AMOSTRA(R_NRAMOSTRACARDBASE IN NUMBER, R_IDTEMPERATURA IN VARCHAR2)
   AS
   BEGIN
      REGISTRA_REGRA('AMOSTRA', NULL, NULL,
                     NULL, NULL,
                     NULL, NULL, NULL,
                     R_NRAMOSTRACARDBASE, R_IDTEMPERATURA, NULL, NULL);
   END;

   PROCEDURE REGISTRA_REGRA_DESCARTAVEL(R_NRDESCARTCARDBASE IN NUMBER)
   AS
   BEGIN
      REGISTRA_REGRA('DESCARTAVEL', NULL, NULL,
                     NULL, NULL,
                     NULL, NULL, NULL,
                     NULL, NULL, R_NRDESCARTCARDBASE, NULL);
   END;

   PROCEDURE REGISTRA_REGRA_LIMPEZA(R_NRLIMPEZACARDBASE IN NUMBER)
   AS
   BEGIN
      REGISTRA_REGRA('LIMPEZA', NULL, NULL,
                     NULL, NULL,
                     NULL, NULL, NULL,
                     NULL, NULL, NULL, R_NRLIMPEZACARDBASE);
   END;

BEGIN
--=========================================================
--=== Valida��o inicial
--=========================================================
   SELECT MAX(CDCARDAPIOBASE), MAX(NRPADRAOQUALIDADE), 
          MAX(IDATIVO), MAX(DTINIVIGENCIA), 
          MAX(DTFIMVIGENCIA), COUNT(1),
          MAX(NRSERVICOPROPOSTA),
          MAX(IDCOMPLEMENTAR)
     INTO V_CDCARDAPIOBASE, V_NRPADRAOQUALIDADE, V_IDATIVO, V_DTINIVIGENCIA, V_DTFIMVIGENCIA, 
          V_QTDE, V_NRSERVICOPROPOSTA, V_IDCOMPLEMENTAR
     FROM CARDAPIOBASE
    WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE;

   SELECT MAX(CDSEGMER)
     INTO V_CDSEGMER   
     FROM ATIVCLISEGMER
    WHERE NRATIVCLISEGMER = P_NRATIVCLISEGMER;   

   IF V_QTDE = 0 THEN
      -- Card�pio base informado n�o encontrado
      I_L(MSG('TCOPROC_CARDBASE_N_CAD'));
   ELSE
      IF P_IDORIGEM IS NULL THEN
         -- Origem n�o informada
         I_L(MSG('TCOPROC_ORIGEM_N_INF'));
      END IF;

    --   IF V_IDATIVO = 'N' THEN
    --      -- Card�pio base informado encontra-se inativo
    --      I_L(MSG('TCOPROC_CARDBASE_INATIVO'));
    --   END IF;
      
    --   IF NOT (TRUNC(SYSDATE) BETWEEN V_DTINIVIGENCIA AND V_DTFIMVIGENCIA) THEN
    --      -- Card�pio base informado n�o est� vigente
    --      I_L(MSG('TCOPROC_CARDBASE_N_VIGENTE'));
    --   END IF;
      
      SELECT COUNT(1)
        INTO V_QTDE
        FROM SEGMERCARDBASE
       WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
         AND CDSEGMER = V_CDSEGMER;

      IF V_QTDE = 0 THEN
         -- Segmento de mercado n�o � contemplado pelo card�pio base informado
         I_L(MSG('TCOPROC_SEGMER_N_CONTEMP_CARDBASE'));
      END IF;

      SELECT COUNT(1), MAX(CDREGIAO || ' - ' || NMREGIAO)
        INTO V_QTDE, V_NMREGIAO
        FROM REGIAO
       WHERE CDREGIAO = P_CDREGIAO;

      IF V_QTDE = 0 THEN
         -- Regi�o n�o informada
         I_L(MSG('TCOPROC_REGIAO_N_INF'));
      END IF;

      IF (P_QTSEGSEX IS NULL AND P_QTSABADO IS NULL AND P_QTDOMFERI IS NULL) OR
         (P_QTSEGSEX + P_QTSABADO + P_QTDOMFERI = 0) THEN
         -- N�o foram informados comensais estimados
         I_L(MSG('TCOPROC_COMENSAIS_N_INF'));
      END IF;    
      
      SELECT COUNT(1)
        INTO V_QTDE
        FROM LISTA
       WHERE NRLISTA = P_CONFIGURACOES;
      IF P_CONFIGURACOES IS NULL OR V_QTDE = 0 THEN
         -- N�o foi informada a configura��o de colunas do card�pio
         I_L(MSG('TCOPROC_CONFIG_N_INF'));
      ELSE
         SELECT COUNT(1)
           INTO V_QTDE
           FROM CONFIGCARDBASE C
                INNER JOIN LISTA L ON C.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
          WHERE L.NRLISTA = P_CONFIGURACOES
            AND C.NRCARDAPIOBASE = P_NRCARDAPIOBASE;
         IF V_QTDE = 0 THEN
            -- Configura��o informada n�o encontrada no card�pio base
            I_L(MSG('TCOPROC_CONFIG_NEXIST_CARDBASE'));
         END IF;
      END IF;

      SELECT COUNT(1)
        INTO V_QTDE
        FROM LISTA
       WHERE NRLISTA = P_GRUPOS;
      IF P_GRUPOS IS NULL OR V_QTDE = 0 THEN         
         -- Grupos de tipos de prato n�o informados
         I_L(MSG('TCOPROC_GRTIPOPRAT_N_INF'));
      ELSE
         --Verifica se as configura��es e os grupos informados est�o corretos
         FOR C_CNF IN 
         (
         SELECT C.IDCLASSIFICACAO,
                G.CDGRTIPOPR, 
                T.NMTIPOPRAT || CASE WHEN C.DSCOMPLEMENTO IS NULL THEN '' ELSE ' (' || NVL(C.DSCOMPLEMENTO, ' ') || ')' END AS DESCRICAO,
                G.NMGRTIPOPR,
                CASE WHEN LG.NRLISTA IS NULL THEN 'N' ELSE 'S' END AS GRUPO_INFORMADO,
                CASE WHEN LG.NRLISTA IS NULL THEN 'N' 
                     WHEN SUBSTR( LG.CDLISTA, INSTR(LG.CDLISTA, '|') + 1, INSTR(LG.CDLISTA, '|', 1, 2) - INSTR(LG.CDLISTA, '|') -1 ) || ' ' = ' ' THEN 'N' 
                     ELSE 'S' 
                END AS PORCIONAMENTO_INFORMADO
           FROM CONFIGCARDBASE C
                INNER JOIN LISTA L ON C.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
                INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                LEFT JOIN GRTIPOPR G ON G.CDGRTIPOPR = T.CDGRTIPOPR
                LEFT JOIN LISTA LG ON LG.NRLISTA = P_GRUPOS AND
                                      SUBSTR(LG.CDLISTA, 1, INSTR(LG.CDLISTA, '|') - 1) = G.CDGRTIPOPR
          WHERE L.NRLISTA = P_CONFIGURACOES
            AND C.NRCARDAPIOBASE = P_NRCARDAPIOBASE
            AND C.IDCLASSIFICACAO = 'ALIMENTAR'
            AND (G.CDGRTIPOPR IS NULL OR
            NOT EXISTS (
               SELECT 1
                 FROM LISTA
                WHERE NRLISTA = P_GRUPOS
                  AND SUBSTR(CDLISTA, 1, INSTR(CDLISTA, '|') - 1) = G.CDGRTIPOPR
            ))
         ) LOOP
            IF C_CNF.CDGRTIPOPR IS NULL THEN
               -- Grupo de tipo de prato da coluna __PARAM0__ n�o cadastrado no tipo de prato
               I_L(MSG('TCOPROC_GRTIPOPRAT_N_CAD', C_CNF.DESCRICAO));
            END IF;
            
            IF C_CNF.GRUPO_INFORMADO = 'N' THEN
               -- Grupo de tipo de prato __PARAM0__ da coluna __PARAM1__ n�o informado
               I_L(MSG('TCOPROC_GRTIPOPRAT_COLUNA_N_INF', C_CNF.NMGRTIPOPR, C_CNF.DESCRICAO));
            END IF;

            IF C_CNF.PORCIONAMENTO_INFORMADO = 'N' THEN
               I_L(MSG('TCOPROC_PORCIO_N_INF_GRUPOTP', C_CNF.NMGRTIPOPR));
            END IF;
            -- IF C_CNF.IDCLASSIFICACAO <> 'ALIMENTAR' THEN
            --    -- Classifica��o da coluna informada __PARAM0__ n�o � "Alimentar"
            --    I_L(MSG('TCOPROC_CLASS_COLUNA_N_E_ALIMENTAR', C_CNF.DESCRICAO));
            -- END IF;
         END LOOP;

         FOR C_GRUPOS IN
         (SELECT G.CDGRTIPOPR || ' - ' || G.NMGRTIPOPR AS GRUPO
            FROM GRTIPOPR G
                 INNER JOIN LISTA LI ON SUBSTR(LI.CDLISTA, 1, INSTR(LI.CDLISTA, '|') - 1) = G.CDGRTIPOPR
           WHERE NRLISTA = P_GRUPOS
             AND NOT EXISTS (SELECT 1
                               FROM CONFIGCARDBASE C
                                    INNER JOIN LISTA L ON C.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
                                    INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                              WHERE L.NRLISTA = P_CONFIGURACOES
                                AND C.IDCLASSIFICACAO = 'ALIMENTAR'
                                AND T.CDGRTIPOPR = G.CDGRTIPOPR)
         ) LOOP
            -- Grupo de tipo de prato __PARAM0__ n�o possui colunas selecionadas
            I_L(MSG('TCOPROC_GRTIPOPRAT_SEM_COLUNAS', C_GRUPOS.GRUPO));
         END LOOP;

         SELECT MAX(CDFILIAL), MAX(CDTIPOCUSTO), MAX(CDTIPOPRATLIMPEZA)
           INTO V_CDFILIAL, V_CDTIPOCUSTO, V_CDTIPOPRATLIMPEZA
           FROM PARAMTCO;         
         -- IF V_CDTIPOCUSTO IS NULL THEN            
         --    -- Tipo de custo n�o informado nos par�metros comerciais
         --    I_L(MSG('TCOPROC_TIPOCUSTO_N_INF_PARAMTCO'));
         -- END IF;
         IF V_CDFILIAL IS NULL THEN
            -- Unidade base para elabora��o do card�pio n�o informada nos par�metros comerciais
            I_L(MSG('TCOPROC_FILIAL_N_INF_PARAMTCO'));
         END IF;

      END IF;

      SELECT MAX(S.CDSERVICOPROPOSTA || ' - ' || S.NMSERVICOPROPOSTA), MAX(S.CDFILIAL), 
             MAX(S.CDSERVFILI), MAX(SE.CDSERVFILI || ' - ' || SE.NMSERVICO)
        INTO V_SERVICOPROPOSTA, V_CDFILIALSERV, 
             V_CDSERVFILI, V_NMSERVICO
        FROM SERVICOPROPOSTA S
             LEFT JOIN SERVICO SE ON SE.CDFILIAL = S.CDFILIAL AND
                                     SE.CDSERVFILI = S.CDSERVFILI
       WHERE S.NRSERVICOPROPOSTA = V_NRSERVICOPROPOSTA;

      IF V_CDFILIAL <> V_CDFILIALSERV THEN
         -- Unidade do servi�o de planejamento do servi�o para proposta difere da unidade base para elabora��o do card�pio
         I_L(MSG('TCOPROC_FILIAL<>FILIAL_SERVPROPOSTA'));
      END IF;

      IF V_CDSERVFILI IS NULL THEN
         -- Servi�o de planejamento n�o indicado no servi�o para proposta
         I_L(MSG('TCOPROC_SERVPLAN_N_CAD_SERVPROPOSTA'));
      END IF;
--=========================================================
--=== Procedimento
--=========================================================   
      IF P_LISTAERROS IS NULL THEN   
      --=========================================================
      --=== Cabe�alho, configura��o selecionada e dias
      --=========================================================   
         
         --Insere card�pio
         V_NRCARDAPIOTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('CARDAPIOTRAB', 1));
         INSERT INTO CARDAPIOTRAB
         (NRCARDAPIOTRAB, CDREGIAO, VRPEACRESCUSTO,
          DTCUSTO, CDTIPOCUSTO, IDORIGEM,
          NRCARDAPIOBASE,
          NRORG, NRORGINCLUSAO, NRORGULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,
          DTINCLUSAO, DTULTATU)
         VALUES
         (V_NRCARDAPIOTRAB, P_CDREGIAO, P_VRPEACRESCUSTO,
          TRUNC(P_DTCUSTO), V_CDTIPOCUSTO, P_IDORIGEM, P_NRCARDAPIOBASE,
          P_NRORG, P_NRORG, P_NRORG,
          P_CDOPERADOR, P_CDOPERADOR,
          SYSDATE, SYSDATE);

         --Inclus�o dos dias
         SELECT COUNT(1)
           INTO V_QTDE
           FROM DIACARDBASE
          WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE;
         IF V_QTDE = 0 THEN
            -- Card�pio base n�o possui dias cadastrados
            I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_DIAS'));
         ELSE
            V_NRDIACARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('DIACARDTRAB', V_QTDE));

            INSERT INTO DIACARDTRAB
            (NRDIACARDTRAB, NRCARDAPIOTRAB,
             NRSEMANA, NRDIASEMANA, QTCOMENSAIS, 
             NRORG, NRORGINCLUSAO, NRORGULTATU,
             CDOPERINCLUSAO, CDOPERULTATU,
             DTINCLUSAO, DTULTATU)
            SELECT V_NRDIACARDTRAB + (ROW_NUMBER() OVER (ORDER BY D.NRDIACARDBASE) - 1) AS NRDIACARDTRAB,
                   V_NRCARDAPIOTRAB,
                   D.NRSEMANA, D.NRDIASEMANA, 
                   CASE WHEN D.NRDIASEMANA = 1 THEN NVL(P_QTDOMFERI, 0)
                        WHEN D.NRDIASEMANA BETWEEN 2 AND 6 THEN NVL(P_QTSEGSEX, 0)
                        WHEN D.NRDIASEMANA = 7 THEN NVL(P_QTSABADO, 0)
                   END AS QTCOMENSAIS,
                   P_NRORG, P_NRORG, P_NRORG,
                   P_CDOPERADOR, P_CDOPERADOR,
                   SYSDATE, SYSDATE
              FROM DIACARDBASE D
             WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
             ORDER BY D.NRDIACARDBASE;
         END IF;
         SELECT COUNT(1)
           INTO V_QTDE
           FROM CONFIGCARDBASE C
                INNER JOIN LISTA L ON C.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
          WHERE L.NRLISTA = P_CONFIGURACOES
            AND C.NRCARDAPIOBASE = P_NRCARDAPIOBASE
            AND C.IDCLASSIFICACAO = 'ALIMENTAR';
         
         -- Inclus�o da Configura��o
         V_NRCONFIGCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('CONFIGCARDTRAB', V_QTDE));
         INSERT INTO CONFIGCARDTRAB
         (NRCONFIGCARDTRAB, NRCARDAPIOTRAB,
          CDTIPOPRAT, DSCOMPLEMENTO, IDCLASSIFICACAO, 
          NRORDEM,IDTEMPERATURA, NRCONFIGCARDBASE,
          NRORG, NRORGINCLUSAO, NRORGULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,
          DTINCLUSAO, DTULTATU)
         SELECT V_NRCONFIGCARDTRAB + (ROW_NUMBER() OVER (ORDER BY C.NRCONFIGCARDBASE) - 1) AS NRCONFIGCARDTRAB,
                V_NRCARDAPIOTRAB,
                C.CDTIPOPRAT, C.DSCOMPLEMENTO, C.IDCLASSIFICACAO, 
                C.NRORDEM, C.IDTEMPERATURA, C.NRCONFIGCARDBASE,
                P_NRORG, P_NRORG, P_NRORG,
                P_CDOPERADOR, P_CDOPERADOR,
                SYSDATE, SYSDATE
           FROM CONFIGCARDBASE C
                INNER JOIN LISTA L ON C.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
          WHERE L.NRLISTA = P_CONFIGURACOES
            AND C.NRCARDAPIOBASE = P_NRCARDAPIOBASE
            AND C.IDCLASSIFICACAO = 'ALIMENTAR'           
          ORDER BY C.NRCONFIGCARDBASE;
      --=========================================================
      --=== Composi��o a partir do card�pio base
      --=========================================================   
         FOR C_CNFTRAB IN
         (
            SELECT C.NRCONFIGCARDTRAB,
                   T.NMTIPOPRAT || CASE WHEN C.DSCOMPLEMENTO IS NULL THEN '' ELSE ' (' || NVL(C.DSCOMPLEMENTO, ' ') || ')' END AS DESCRICAO,
                   C.NRCONFIGCARDBASE
              FROM CONFIGCARDTRAB C
                   INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
             WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB         
         ) LOOP
            FOR C_DIATRAB IN
            (
               SELECT D.NRDIACARDTRAB, LPAD(TO_CHAR((D.NRSEMANA - 1) * 7 + D.NRDIASEMANA),2, '0') AS DIA, DB.NRDIACARDBASE, D.QTCOMENSAIS,
               		  D.NRSEMANA, D.NRDIASEMANA
                 FROM DIACARDTRAB D
                      INNER JOIN DIACARDBASE DB ON DB.NRSEMANA = D.NRSEMANA AND
                                                   DB.NRDIASEMANA = D.NRDIASEMANA 
                WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                  AND DB.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND D.QTCOMENSAIS > 0
            ) LOOP               
               V_NRPRATCOMPCARDBASE := NULL;
               
               SELECT MAX(NRCOMPCARDBASE)
                 INTO V_NRCOMPCARDBASE
                 FROM COMPCARDBASE
                WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND NRDIACARDBASE = C_DIATRAB.NRDIACARDBASE
                  AND NRCONFIGCARDBASE = C_CNFTRAB.NRCONFIGCARDBASE;
               IF V_NRCOMPCARDBASE IS NULL THEN
                  -- N�o h� pratos no card�pio base para o dia __PARAM0__ e coluna __PARAM1__
                  I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA', NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), C_CNFTRAB.DESCRICAO));
               ELSE
                  SELECT COUNT(1), MAX(P.NRPRATCOMPCARDBASE)
                    INTO V_QTDE, V_NRPRATCOMPCARDBASE
                    FROM PRATCOMPCARDBASE P
                         INNER JOIN REGIAOPRATCARDBASE R ON R.NRPRATCOMPCARDBASE = P.NRPRATCOMPCARDBASE
                   WHERE P.NRCOMPCARDBASE = V_NRCOMPCARDBASE
                     AND R.CDREGIAO = P_CDREGIAO;

                  IF V_QTDE = 0 THEN
                     -- N�o h� pratos no card�pio base que atendam a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                     I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), C_CNFTRAB.DESCRICAO));
                  ELSIF V_QTDE > 1 THEN
                     -- H� dois ou mais pratos no card�pio base que atendem a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                     I_L(MSG('TCOPROC_CARDBASE_MAISDE1_PRATO_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), C_CNFTRAB.DESCRICAO));
                  ELSE
                     SELECT MAX(P.CDFILAUXPRAT), MAX(P.CDPRATO), MAX(PT.CDPRATO || ' - ' || PT.NMPRATO), MAX(PT.IDATIVO)
                       INTO V_CDFILAUXPRAT, V_CDPRATO, V_NMPRATO, V_IDATIVO
                       FROM PRATCOMPCARDBASE P
                            INNER JOIN PRATO PT ON PT.CDFILAUXPRAT = P.CDFILAUXPRAT AND
                                                   PT.CDPRATO = P.CDPRATO
                      WHERE P.NRPRATCOMPCARDBASE = V_NRPRATCOMPCARDBASE;
                     
                     IF V_IDATIVO = 'N' THEN
                        -- O prato __PARAM0__ est� inativo
                        I_L(MSG('TCOPROC_PRATO_INATIVO', V_NMPRATO));
                     END IF;

                     SELECT COUNT(1)
                       INTO V_QTDE
                       FROM GRUPOPRATO G INNER JOIN GRUPOPRATOSERV GS ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                          INNER JOIN ITGRUPOPRATOSERV IT ON IT.NRGRUPOPRATOSERV = GS.NRGRUPOPRATOSERV
                       WHERE G.CDFILIAL = V_CDFILIAL AND
                             GS.CDSERVFILI = V_CDSERVFILI AND
                             IT.CDPRATO = V_CDPRATO AND
                             IT.CDFILAUXPRAT = V_CDFILAUXPRAT AND
                             G.IDTIPORESTRICAO = 'CONTRATO';

                     IF V_QTDE = 0 THEN
                        -- O prato __PARAM0__ n�o est� cadastrado a grupo de prato para o servi�o __PARAM1__ na unidade __PARAM2__
                        I_L(MSG('TCOPROC_PRATO_N_CAD_GRUPOPRAT', V_NMPRATO, V_NMSERVICO, V_CDFILIAL));
                     ELSIF V_QTDE > 1 THEN
                        -- O prato __PARAM0__ est� cadastrado a dois ou mais grupos de prato para o servi�o __PARAM1__ na unidade __PARAM2__
                        I_L(MSG('TCOPROC_PRATO_MAISDE1_GRUPOPRAT', V_NMPRATO, V_NMSERVICO, V_CDFILIAL));
                     END IF;

                     V_NRCOMPCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('COMPCARDTRAB', 1));

                     INSERT INTO COMPCARDTRAB
                     (NRCOMPCARDTRAB, NRCARDAPIOTRAB, 
                      NRDIACARDTRAB, NRCONFIGCARDTRAB,
                      CDFILAUXPRAT, CDPRATO, VRPECONSCARDTRAB,
                      NRORG, NRORGINCLUSAO, NRORGULTATU,
                      CDOPERINCLUSAO, CDOPERULTATU,
                      DTINCLUSAO, DTULTATU)
                     VALUES
                     (V_NRCOMPCARDTRAB, V_NRCARDAPIOTRAB,
                      C_DIATRAB.NRDIACARDTRAB, C_CNFTRAB.NRCONFIGCARDTRAB,
                      V_CDFILAUXPRAT, V_CDPRATO, 100,
                      P_NRORG, P_NRORG, P_NRORG,
                      P_CDOPERADOR, P_CDOPERADOR,
                      SYSDATE, SYSDATE);

                     SELECT COUNT(1)
                       INTO V_QTDE
                       FROM RECEPRATCARDTRAB
                      WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                        AND CDFILAUXPRAT = V_CDFILAUXPRAT
                        AND CDPRATO = V_CDPRATO;

                     IF V_QTDE = 0 THEN
                        V_IDRECEITA := RECE_UTIL_TCO(V_CDFILAUXPRAT,
                                                      V_CDPRATO,
                                                      V_CDFILIAL,
                                                      V_NRSERVICOPROPOSTA,
                                                      V_NRPADRAOQUALIDADE,
                                                      P_CDREGIAO,
                                                      NULL);

                        IF V_IDRECEITA IS NULL THEN
                           -- O prato __PARAM0__ n�o possui receita cadastrada
                           I_L(MSG('TCOPROC_PRATO_SEM_RECEITA', V_NMPRATO));
                        ELSE                              
                           IF V_IDRECEITA = 'R' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEREGIAO
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDREGIAO = P_CDREGIAO
                                 AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB,
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEREGIAO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECREGIAO,
                                     NVL(R.VRPEFATCOCREGIAO, 0), NVL(R.VRPEFATCORREGIAO, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAREGIAOUNR,
                                     NVL(R.IDPRODBASEREGIAO, 'N'), NVL(R.IDQTDEFIXREGIAO, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEREGIAO R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDREGIAO = P_CDREGIAO
                                 AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                               ORDER BY R.NRRECEREGIAO;

                           ELSIF V_IDRECEITA = 'Q' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEPADQUALI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEPADQUALI) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECPADQ,
                                     NVL(R.VRPEFATCOCPADQ, 0), NVL(R.VRPEFATCORPADQ, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPADQUNR,
                                     NVL(R.IDPRODBASEPADQ,'N'), NVL(R.IDQTDEFIXPADQ, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEPADQUALI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                               ORDER BY R.NRRECEPADQUALI;

                           ELSIF V_IDRECEITA = 'S' THEN                           

                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECESERV
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL
                                 AND CDSERVFILI = V_CDSERVFILI;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATSERV
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL
                                 AND CDSERVFILI = V_CDSERVFILI;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita por servico do prato __PARAM0__ est� inativa para unidade __PARAM1__ e servico __PARAM2__
                                 I_L(MSG('TCOPROC_RECESERV_INATIVA', V_NMPRATO, V_CDFILIAL, V_NMSERVICO));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECSER,
                                     NVL(R.VRPEFATCOCSE, 0), NVL(R.VRPEFATCORSE, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTASEUNR,
                                     NVL(R.IDPRODBASESE, 'N'), NVL(R.IDQTDEFIXSE, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECESERV R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDFILIAL = V_CDFILIAL
                                 AND R.CDSERVFILI = V_CDSERVFILI
                               ORDER BY R.CDPRODUTO;

                           ELSIF V_IDRECEITA = 'F' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEFILI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATFILI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita por unidade do prato __PARAM0__ est� inativa para unidade __PARAM1__
                                 I_L(MSG('TCOPROC_RECEFILI_INATIVA', V_NMPRATO, V_CDFILIAL));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECLOC,
                                     NVL(R.VRPEFATCOCLO, 0), NVL(R.VRPEFATCORLO, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTALOUNR,
                                     NVL(R.IDPRODBASELO, 'N'), NVL(R.IDQTDEFIXLO, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEFILI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDFILIAL = V_CDFILIAL
                               ORDER BY R.CDPRODUTO;

                           ELSIF V_IDRECEITA = 'P' THEN                           
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEPADR
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATPADR
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita padr�o do prato __PARAM0__ est� inativa
                                 I_L(MSG('TCOPROC_RECEPADR_INATIVA', V_NMPRATO));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODPRAT,
                                     NVL(R.VRPEFATCOCPR, 0), NVL(R.VRPEFATCORPR, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPRUNR,
                                     NVL(R.IDPRODBASEPR, 'N'), NVL(R.IDQTDEFIXPR, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEPADR R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                              ORDER BY R.CDPRODUTO;
                           END IF;
                        END IF;

                     END IF;                           
                  END IF;
               END IF;               
            END LOOP; 
         END LOOP;
      --=========================================================
      --=== Regras de ades�o e gramatura (1� e 2� etapas)
      --=========================================================
         FOR C_GRUPOS IN 
         (
            SELECT G.CDGRTIPOPR, 
                   G.CDGRTIPOPR || ' - ' || G.NMGRTIPOPR AS NMGRTIPOPR,
                   P.NRPORCIONAMENTO,
                   P.NMPORCIONAMENTO,                   
                   TO_NUMBER( SUBSTR( LI.CDLISTA, INSTR(LI.CDLISTA, '|', 1, 2) + 1, INSTR(LI.CDLISTA, '|', 1, 3) - INSTR(LI.CDLISTA, '|', 1, 2) - 1 ) ) AS NRGRAMATURACARDBASE,
                   SUBSTR( LI.CDLISTA, INSTR(LI.CDLISTA, '|', 1, 3) + 1) AS IDXGRAMATURA
              FROM GRTIPOPR G                    
                   INNER JOIN LISTA LI ON SUBSTR(LI.CDLISTA, 1, INSTR(LI.CDLISTA, '|') - 1) = G.CDGRTIPOPR
                   LEFT JOIN PORCIONAMENTO P ON P.NRPORCIONAMENTO = TO_NUMBER( SUBSTR( LI.CDLISTA, INSTR(LI.CDLISTA, '|') + 1, INSTR(LI.CDLISTA, '|', 1, 2) - INSTR(LI.CDLISTA, '|') -1 ) )
             WHERE NRLISTA = P_GRUPOS
         ) LOOP

            V_IDTIPOGRAMATURA := RETORNA_IDTIPOGRAMATURA(C_GRUPOS.IDXGRAMATURA);
            
            -- Porcionamento não informado para o grupo __PARAM0__
            IF C_GRUPOS.NRPORCIONAMENTO IS NULL THEN
                I_L(MSG('TCOPROC_PORCIO_N_INF_GRUPOTP', C_GRUPOS.NMGRTIPOPR));
                CONTINUE;
            END IF;

            -- Registra porcionamento e gramatura informados pelo usu�rio
            V_NRPORCIOGRAMCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('PORCIOGRAMCARDTRAB', 1));
            INSERT INTO PORCIOGRAMCARDTRAB
            (NRPORCIOGRAMCARDTRAB, NRCARDAPIOTRAB, CDGRTIPOPR,
             NRPORCIONAMENTO, NRGRAMATURACARDBASE,
             IDTIPOGRAMATURA,
             NRORG, NRORGINCLUSAO, NRORGULTATU,
             CDOPERINCLUSAO, CDOPERULTATU,
             DTINCLUSAO, DTULTATU)
            VALUES
            (V_NRPORCIOGRAMCARDTRAB, V_NRCARDAPIOTRAB, C_GRUPOS.CDGRTIPOPR,
             C_GRUPOS.NRPORCIONAMENTO, C_GRUPOS.NRGRAMATURACARDBASE,
             V_IDTIPOGRAMATURA,
             P_NRORG, P_NRORG, P_NRORG,
             P_CDOPERADOR, P_CDOPERADOR,
             SYSDATE, SYSDATE);

         --=========================================================
         --=== 1� etapa: Regra de ades�o
         --=========================================================
            /*Busca regra de ades�o do grupo que corresponda a configura��o de servi�os no card�pio*/
            V_QTDE := 0;
            V_NRADESAOCARDBASE := NULL;
            V_CDADESAOCARDBASE := NULL;
            FOR C_ADESAO IN
            (
               SELECT A.NRADESAOCARDBASE, A.CDADESAOCARDBASE
                 FROM ADESAOCARDBASE A
                WHERE A.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND A.CDGRTIPOPR = C_GRUPOS.CDGRTIPOPR
                  AND A.IDATIVO = 'S'
                  AND A.NRDIACARDBASE IS NULL
            ) LOOP
               -- Verifica se os itens da regra correspondem a sele��o de tipos de prato
               SELECT COUNT(1)
                 INTO V_QTDE2
                 FROM (
                          SELECT C.NRCONFIGCARDBASE
                            FROM CONFIGCARDTRAB C
                                 INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                           WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                             AND T.CDGRTIPOPR = C_GRUPOS.CDGRTIPOPR
                      ) CNF FULL OUTER JOIN
                      (
                          SELECT DISTINCT I.NRCONFIGCARDBASE
                            FROM ITEMADESAOCBASE I
                           WHERE I.NRADESAOCARDBASE = C_ADESAO.NRADESAOCARDBASE
                      ) I ON I.NRCONFIGCARDBASE = CNF.NRCONFIGCARDBASE
                WHERE I.NRCONFIGCARDBASE IS NULL OR
                      CNF.NRCONFIGCARDBASE IS NULL;

               -- Se itens n�o correspondem � sele��o, passa para a pr�xima regra
               IF V_QTDE2 > 0 THEN
                  CONTINUE;
               END IF;
                           
               V_ATENDE_SEGMENTO := 'N';
               SELECT COUNT(1)
                 INTO V_QTDE2
                 FROM SEGMERADESAOCBASE
                WHERE NRADESAOCARDBASE = C_ADESAO.NRADESAOCARDBASE;
               -- Se vazio atende a todos os segmentos
               IF V_QTDE2 = 0 THEN
                  V_ATENDE_SEGMENTO := 'S';
               ELSE
                  SELECT COUNT(1)
                    INTO V_QTDE2
                    FROM SEGMERADESAOCBASE
                   WHERE NRADESAOCARDBASE = C_ADESAO.NRADESAOCARDBASE
                     AND CDSEGMER = V_CDSEGMER;
                  IF V_QTDE2 > 0 THEN
                     V_ATENDE_SEGMENTO := 'S';
                  END IF;
               END IF;

               -- verifica se atende ao ramo de atividade
               V_ATENDE_RAMO := 'N';
               SELECT COUNT(1)
                 INTO V_QTDE2
                 FROM ATIVCLIADESAOCBASE
                WHERE NRADESAOCARDBASE = C_ADESAO.NRADESAOCARDBASE;
               -- Se vazio atende a todos os ramos
               IF V_QTDE2 = 0 THEN
                  V_ATENDE_RAMO := 'S';
               ELSE
                  SELECT COUNT(1)
                    INTO V_QTDE2
                    FROM ATIVCLIADESAOCBASE
                   WHERE NRADESAOCARDBASE = C_ADESAO.NRADESAOCARDBASE
                     AND NRATIVCLISEGMER = P_NRATIVCLISEGMER;
                  IF V_QTDE2 > 0 THEN
                     V_ATENDE_RAMO := 'S';
                  END IF;
               END IF;

               IF V_ATENDE_SEGMENTO = 'S' AND V_ATENDE_RAMO = 'S' THEN
                  V_QTDE := V_QTDE + 1;
                  V_NRADESAOCARDBASE := C_ADESAO.NRADESAOCARDBASE;
                  V_CDADESAOCARDBASE := C_ADESAO.CDADESAOCARDBASE;
               END IF;
            END LOOP;            

            IF V_QTDE = 0 THEN
               -- N�o h� regra de ades�o que atenda a sele��o de tipos de prato, segmento e ramo de atividade informados para o grupo de tipo de prato __PARAM0__
               I_L(MSG('TCOPROC_ADESAO_N_CAD', C_GRUPOS.NMGRTIPOPR));
            ELSIF V_QTDE > 1 THEN
               -- H� mais de uma regra de ades�o que atenda a sele��o de tipos de prato, segmento e ramo de atividade informados para o grupo de tipo de prato __PARAM0__
               I_L(MSG('TCOPROC_ADESAO_MAISDE1', C_GRUPOS.NMGRTIPOPR));
            ELSE
               SELECT COUNT(1)
                 INTO V_QTDE
                 FROM ITEMADESAOCBASE
                WHERE NRADESAOCARDBASE = V_NRADESAOCARDBASE
                  AND NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO;

               IF V_QTDE = 0 THEN
                  -- A regra de ades�o __PARAM0__ n�o atende o porcionamento __PARAM1__ do grupo de tipo de prato __PARAM2__ 
                  I_L(MSG('TCOPROC_ADESAO_N_ATENDE_PORCIONAMENTO', V_CDADESAOCARDBASE, C_GRUPOS.NMPORCIONAMENTO,  C_GRUPOS.NMGRTIPOPR));
               ELSE
                  FOR C_ITEMADESAO IN
                  (
                     SELECT NRCONFIGCARDBASE, VRPEADESAO
                       FROM ITEMADESAOCBASE
                      WHERE NRADESAOCARDBASE = V_NRADESAOCARDBASE
                        AND NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO
                  ) LOOP
                     FOR C_COMPOSICAO IN
                     (
                        SELECT C.NRCOMPCARDTRAB
                          FROM COMPCARDTRAB C
                               INNER JOIN CONFIGCARDTRAB CNF ON CNF.NRCONFIGCARDTRAB = C.NRCONFIGCARDTRAB
                         WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                           AND CNF.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                           AND CNF.NRCONFIGCARDBASE = C_ITEMADESAO.NRCONFIGCARDBASE
                     ) LOOP
                        UPDATE COMPCARDTRAB
                           SET VRPECONSCARDTRAB = NVL(C_ITEMADESAO.VRPEADESAO, 100),
                               NRORGULTATU = P_NRORG,
                               CDOPERULTATU = P_CDOPERADOR,
                               DTULTATU = SYSDATE
                         WHERE NRCOMPCARDTRAB = C_COMPOSICAO.NRCOMPCARDTRAB;
                     END LOOP;
                  END LOOP;

                  REGISTRA_REGRA_ADESAO(V_NRADESAOCARDBASE, C_GRUPOS.CDGRTIPOPR, 
                                        C_GRUPOS.NRPORCIONAMENTO, NULL);
               END IF;
            END IF;

            /*Regras de ades�o espec�ficas do dia*/
            FOR C_DIAS IN
            (
               SELECT D.NRDIACARDTRAB, DB.NRDIACARDBASE
                 FROM DIACARDTRAB D
                      INNER JOIN DIACARDBASE DB ON DB.NRSEMANA = D.NRSEMANA AND
                                                   DB.NRDIASEMANA = D.NRDIASEMANA 
                WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                  AND DB.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND D.QTCOMENSAIS > 0
            ) LOOP
               V_QTDE := 0;
               V_NRADESAOCARDBASE := NULL;
               V_CDADESAOCARDBASE := NULL;
               FOR C_ADESAO_DIA IN
               (
                  SELECT A.NRADESAOCARDBASE, A.CDADESAOCARDBASE, A.NRDIACARDBASE
                    FROM ADESAOCARDBASE A
                   WHERE A.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                     AND A.CDGRTIPOPR = C_GRUPOS.CDGRTIPOPR
                     AND A.IDATIVO = 'S'
                     AND A.NRDIACARDBASE = C_DIAS.NRDIACARDBASE
                   ORDER BY A.NRDIACARDBASE
               ) LOOP                  
                  -- Verifica se os itens da regra correspondem a sele��o de tipos de prato
                  SELECT COUNT(1)
                    INTO V_QTDE2
                    FROM (
                             SELECT C.NRCONFIGCARDBASE
                               FROM CONFIGCARDTRAB C
                                    INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                              WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                                AND T.CDGRTIPOPR = C_GRUPOS.CDGRTIPOPR
                         ) CNF FULL OUTER JOIN
                         (
                             SELECT DISTINCT I.NRCONFIGCARDBASE
                               FROM ITEMADESAOCBASE I
                              WHERE I.NRADESAOCARDBASE = C_ADESAO_DIA.NRADESAOCARDBASE
                         ) I ON I.NRCONFIGCARDBASE = CNF.NRCONFIGCARDBASE
                   WHERE I.NRCONFIGCARDBASE IS NULL OR
                         CNF.NRCONFIGCARDBASE IS NULL;

                  -- Se itens n�o correspondem � sele��o, passa para a pr�xima regra
                  IF V_QTDE2 > 0 THEN
                     CONTINUE;
                  END IF;
                              
                  V_ATENDE_SEGMENTO := 'N';
                  SELECT COUNT(1)
                    INTO V_QTDE2
                    FROM SEGMERADESAOCBASE
                   WHERE NRADESAOCARDBASE = C_ADESAO_DIA.NRADESAOCARDBASE;
                  -- Se vazio atende a todos os segmentos
                  IF V_QTDE2 = 0 THEN
                     V_ATENDE_SEGMENTO := 'S';
                  ELSE
                     SELECT COUNT(1)
                       INTO V_QTDE2
                       FROM SEGMERADESAOCBASE
                      WHERE NRADESAOCARDBASE = C_ADESAO_DIA.NRADESAOCARDBASE
                        AND CDSEGMER = V_CDSEGMER;
                     IF V_QTDE2 > 0 THEN
                        V_ATENDE_SEGMENTO := 'S';
                     END IF;
                  END IF;

                  -- verifica se atende ao ramo de atividade
                  V_ATENDE_RAMO := 'N';
                  SELECT COUNT(1)
                    INTO V_QTDE2
                    FROM ATIVCLIADESAOCBASE
                   WHERE NRADESAOCARDBASE = C_ADESAO_DIA.NRADESAOCARDBASE;
                  -- Se vazio atende a todos os ramos
                  IF V_QTDE2 = 0 THEN
                     V_ATENDE_RAMO := 'S';
                  ELSE
                     SELECT COUNT(1)
                       INTO V_QTDE2
                       FROM ATIVCLIADESAOCBASE
                      WHERE NRADESAOCARDBASE = C_ADESAO_DIA.NRADESAOCARDBASE
                        AND NRATIVCLISEGMER = P_NRATIVCLISEGMER;
                     IF V_QTDE2 > 0 THEN
                        V_ATENDE_RAMO := 'S';
                     END IF;
                  END IF;

                  IF V_ATENDE_SEGMENTO = 'S' AND V_ATENDE_RAMO = 'S' THEN
                     V_QTDE := V_QTDE + 1;
                     V_NRADESAOCARDBASE := C_ADESAO_DIA.NRADESAOCARDBASE;
                     V_CDADESAOCARDBASE := C_ADESAO_DIA.CDADESAOCARDBASE;
                  END IF;
               END LOOP;

               IF V_QTDE = 0 THEN
                  CONTINUE;
               ELSIF V_QTDE > 1 THEN
                  -- H� mais de uma regra de ades�o que atenda a sele��o de tipos de prato, segmento e ramo de atividade informados para o grupo de tipo de prato __PARAM0__
                  I_L(MSG('TCOPROC_ADESAO_MAISDE1', C_GRUPOS.NMGRTIPOPR));
               ELSE
                  SELECT COUNT(1)
                    INTO V_QTDE
                    FROM ITEMADESAOCBASE
                   WHERE NRADESAOCARDBASE = V_NRADESAOCARDBASE
                     AND NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO;

                  IF V_QTDE = 0 THEN
                     -- A regra de ades�o __PARAM0__ n�o atende o porcionamento __PARAM1__ do grupo de tipo de prato __PARAM2__ 
                     I_L(MSG('TCOPROC_ADESAO_N_ATENDE_PORCIONAMENTO', V_CDADESAOCARDBASE, C_GRUPOS.NMPORCIONAMENTO,  C_GRUPOS.NMGRTIPOPR));
                  ELSE
                     FOR C_ITEMADESAO IN
                     (
                        SELECT NRCONFIGCARDBASE, VRPEADESAO
                          FROM ITEMADESAOCBASE
                         WHERE NRADESAOCARDBASE = V_NRADESAOCARDBASE
                           AND NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO
                     ) LOOP
                        FOR C_COMPOSICAO IN
                        (
                           SELECT C.NRCOMPCARDTRAB
                             FROM COMPCARDTRAB C
                                  INNER JOIN CONFIGCARDTRAB CNF ON CNF.NRCONFIGCARDTRAB = C.NRCONFIGCARDTRAB
                            WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                              AND CNF.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                              AND CNF.NRCONFIGCARDBASE = C_ITEMADESAO.NRCONFIGCARDBASE
                              AND C.NRDIACARDTRAB = C_DIAS.NRDIACARDTRAB
                        ) LOOP
                           UPDATE COMPCARDTRAB
                              SET VRPECONSCARDTRAB = NVL(C_ITEMADESAO.VRPEADESAO, 100),
                                  NRORGULTATU = P_NRORG,
                                  CDOPERULTATU = P_CDOPERADOR,
                                  DTULTATU = SYSDATE
                            WHERE NRCOMPCARDTRAB = C_COMPOSICAO.NRCOMPCARDTRAB;
                        END LOOP;
                     END LOOP;
                     REGISTRA_REGRA_ADESAO(V_NRADESAOCARDBASE, C_GRUPOS.CDGRTIPOPR, 
                                           C_GRUPOS.NRPORCIONAMENTO, C_DIAS.NRDIACARDBASE);
                  END IF;
               END IF;
            END LOOP;
         --=========================================================
         --=== 2� etapa: Regra de gramatura
         --=========================================================
            IF C_GRUPOS.NRGRAMATURACARDBASE IS NOT NULL THEN               

               SELECT MAX(VRGRAMATURA), MAX(SGUNIDADE)
                 INTO V_VRGRAMATURA, V_SGUNIDADE
                 FROM GRAMATURACARDBASE
                WHERE NRGRAMATURACARDBASE = C_GRUPOS.NRGRAMATURACARDBASE;

               V_GRAMATURA := TO_CHAR(V_VRGRAMATURA) || ' ' || V_SGUNIDADE;

               FOR C_COMPOSICAO IN
               (
                  SELECT DISTINCT C.CDFILAUXPRAT, C.CDPRATO, P.CDPRATO || ' - ' || P.NMPRATO AS NMPRATO,
                         TP.NRTIPOPREPAROTCO, TP.NMTIPOPREPAROTCO
                    FROM COMPCARDTRAB C
                         INNER JOIN CONFIGCARDTRAB CNF ON CNF.NRCONFIGCARDTRAB = C.NRCONFIGCARDTRAB
                         LEFT JOIN TIPOPRAT T ON T.CDTIPOPRAT = CNF.CDTIPOPRAT
                         LEFT JOIN PRATO P ON P.CDFILAUXPRAT = C.CDFILAUXPRAT AND
                                              P.CDPRATO = C.CDPRATO
                         LEFT JOIN TIPOPREPAROTCO TP ON TP.NRTIPOPREPAROTCO = P.NRTIPOPREPAROTCO
                   WHERE C.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                     AND CNF.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB            
                     AND T.CDGRTIPOPR = C_GRUPOS.CDGRTIPOPR
               ) LOOP

                  SELECT MAX(G.NRGRUPOPRATO), MAX(NMGRUPOPRATO)
                       INTO V_NRGRUPOPRATO, V_NMGRUPOPRATO
                       FROM GRUPOPRATO G INNER JOIN GRUPOPRATOSERV GS ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                          INNER JOIN ITGRUPOPRATOSERV IT ON IT.NRGRUPOPRATOSERV = GS.NRGRUPOPRATOSERV
                       WHERE G.CDFILIAL = V_CDFILIAL AND
                             GS.CDSERVFILI = V_CDSERVFILI AND
                             IT.CDPRATO = C_COMPOSICAO.CDPRATO AND
                             IT.CDFILAUXPRAT = C_COMPOSICAO.CDFILAUXPRAT AND
                             G.IDTIPORESTRICAO = 'CONTRATO';

                  -- Valida se o prato possui tipo de preparo informado
                  IF C_COMPOSICAO.NRTIPOPREPAROTCO IS NULL THEN
                     -- Prato __PARAM0__ n�o possui tipo de preparo informado
                     I_L(MSG('TCOPROC_PRAT_N_POSSUI_TIPOPREPARO', C_COMPOSICAO.NMPRATO));
                  END IF;

                  -- Valida se existe regra para o Grupo de Prato, Preparo e algum produto do prato
                  SELECT MAX(I.NRITEMGRAMCARDBASE), MAX(VRGRAMATURA), COUNT(1)
                    INTO V_NRITEMGRAMCARDBASE, V_VRGRAMATURA, V_QTDE
                    FROM ITEMGRAMCARDBASE I
                   WHERE I.NRGRAMATURACARDBASE = C_GRUPOS.NRGRAMATURACARDBASE
                     AND I.NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO
                     AND I.NRGRUPOPRATO = V_NRGRUPOPRATO
                     AND I.NRTIPOPREPAROTCO = C_COMPOSICAO.NRTIPOPREPAROTCO
                     AND EXISTS(SELECT 1 FROM RECEPRATCARDTRAB R WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                                                                   AND R.CDFILAUXPRAT = C_COMPOSICAO.CDFILAUXPRAT 
                                                                   AND R.CDPRATO = C_COMPOSICAO.CDPRATO
                                                                   AND R.CDPRODUTO = I.CDPRODUTO);
                  IF V_NRITEMGRAMCARDBASE IS NOT NULL THEN
                     IF V_QTDE > 1 THEN
                        -- Mais de um item da regra de gramatura __PARAM0__ do grupo de tipo de prato __PARAM1__ est� sendo aplicada ao prato __PARAM2__, preparo __PARAM3__ e grupo de prato __PARAM4__
                        I_L(MSG('TCOPROC_MAISDE1_GRAM_PRATO', V_GRAMATURA, C_GRUPOS.NMGRTIPOPR, C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                     END IF;
                  ELSE
                     -- Valida se existe regra para o Grupo de Prato e Preparo
                     SELECT MAX(I.NRITEMGRAMCARDBASE), MAX(VRGRAMATURA), COUNT(1)
                       INTO V_NRITEMGRAMCARDBASE, V_VRGRAMATURA, V_QTDE
                       FROM ITEMGRAMCARDBASE I
                      WHERE I.NRGRAMATURACARDBASE = C_GRUPOS.NRGRAMATURACARDBASE
                        AND I.NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO
                        AND I.NRGRUPOPRATO = V_NRGRUPOPRATO
                        AND I.NRTIPOPREPAROTCO = C_COMPOSICAO.NRTIPOPREPAROTCO
                        AND I.CDPRODUTO IS NULL;
                     IF V_NRITEMGRAMCARDBASE IS NOT NULL THEN
                        IF V_QTDE > 1 THEN
                           V_NRITEMGRAMCARDBASE := NULL;
                           -- Mais de um item da regra de gramatura __PARAM0__ do grupo de tipo de prato __PARAM1__ est� sendo aplicada ao prato __PARAM2__, preparo __PARAM3__ e grupo de prato __PARAM4__
                           I_L(MSG('TCOPROC_MAISDE1_GRAM_PRATO', V_GRAMATURA, C_GRUPOS.NMGRTIPOPR, C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                        END IF;
                     ELSE
                        -- Valida se existe regra para o Grupo de Prato e Preparo
                        SELECT MAX(NRITEMGRAMCARDBASE), MAX(VRGRAMATURA), COUNT(1)
                          INTO V_NRITEMGRAMCARDBASE, V_VRGRAMATURA, V_QTDE
                          FROM ITEMGRAMCARDBASE I
                         WHERE I.NRGRAMATURACARDBASE = C_GRUPOS.NRGRAMATURACARDBASE
                           AND I.NRPORCIONAMENTO = C_GRUPOS.NRPORCIONAMENTO
                           AND I.NRGRUPOPRATO = V_NRGRUPOPRATO
                           AND I.NRTIPOPREPAROTCO IS NULL
                           AND I.CDPRODUTO IS NULL;
                        IF V_NRITEMGRAMCARDBASE IS NOT NULL THEN
                           IF V_QTDE > 1 THEN
                              V_NRITEMGRAMCARDBASE := NULL;
                              -- Mais de um item da regra de gramatura __PARAM0__ do grupo de tipo de prato __PARAM1__ est� sendo aplicada ao prato __PARAM2__, preparo __PARAM3__ e grupo de prato __PARAM4__
                              I_L(MSG('TCOPROC_MAISDE1_GRAM_PRATO', V_GRAMATURA, C_GRUPOS.NMGRTIPOPR, C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                           END IF;
                        ELSE
                           -- N�o h� item da regra de gramatura __PARAM0__ do grupo de tipo de prato __PARAM1__ a aplicar sobre o prato __PARAM2__, preparo __PARAM3__ e grupo de prato __PARAM4__
                           I_L(MSG('TCOPROC_N_HA_GRAM_PRATO', V_GRAMATURA, C_GRUPOS.NMGRTIPOPR, C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                        END IF;
                     END IF;
                  END IF;

                  IF V_NRITEMGRAMCARDBASE IS NOT NULL AND V_VRGRAMATURA <= 0 THEN
                     -- Item da regra de gramatura __PARAM0__ n�o possui valor informado para o grupo de tipo de prato __PARAM1__, preparo __PARAM2__ e grupo de prato __PARAM3__
                     I_L(MSG('TCOPROC_GRAM_PRATO_VALOR_INVALIDO', V_GRAMATURA, C_GRUPOS.NMGRTIPOPR, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                  END IF;

                  SELECT MAX(T.NRTABCORRPRODTCO), MAX(T.VRDEGELO), MAX(T.VRLIMPEZA), MAX(T.VRCOCCAO), COUNT(1)
                    INTO V_NRTABCORRPRODTCO, V_VRDEGELO, V_VRLIMPEZA, V_VRCOCCAO, V_QTDE
                    FROM TABCORRPRODTCO T
                   WHERE T.NRGRUPOPRATO = V_NRGRUPOPRATO
                     AND T.NRTIPOPREPAROTCO = C_COMPOSICAO.NRTIPOPREPAROTCO
                     AND EXISTS(SELECT 1 FROM RECEPRATCARDTRAB R WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                                                                   AND R.CDFILAUXPRAT = C_COMPOSICAO.CDFILAUXPRAT 
                                                                   AND R.CDPRATO = C_COMPOSICAO.CDPRATO
                                                                   AND R.CDPRODUTO = T.CDPRODUTO);

                  IF V_NRTABCORRPRODTCO IS NOT NULL THEN
                     IF V_QTDE > 1 THEN
                        V_NRTABCORRPRODTCO := NULL;
                        -- Prato __PARAM0__ de preparo __PARAM1__ e grupo de prato __PARAM2__ possui mais de um item na tabela de corre��o.
                        I_L(MSG('TCOPROC_MAISDE1_TABCORR', C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                     END IF;
                  ELSE
                     SELECT MAX(T.NRTABCORRPRODTCO), MAX(T.VRDEGELO), MAX(T.VRLIMPEZA), MAX(T.VRCOCCAO), COUNT(1)
                       INTO V_NRTABCORRPRODTCO, V_VRDEGELO, V_VRLIMPEZA, V_VRCOCCAO, V_QTDE
                       FROM TABCORRPRODTCO T
                      WHERE T.NRGRUPOPRATO = V_NRGRUPOPRATO
                        AND T.NRTIPOPREPAROTCO = C_COMPOSICAO.NRTIPOPREPAROTCO
                        AND T.CDPRODUTO IS NULL;
                     IF V_NRTABCORRPRODTCO IS NOT NULL THEN
                        IF V_QTDE > 1 THEN
                           V_NRTABCORRPRODTCO := NULL;
                           -- Prato __PARAM0__ de preparo __PARAM1__ e grupo de prato __PARAM2__ possui mais de uma correspond�ncia na tabela de corre��o
                           I_L(MSG('TCOPROC_MAISDE1_TABCORR', C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                        END IF;
                     ELSE
                        -- Prato __PARAM0__ de preparo __PARAM1__ e grupo de prato __PARAM2__ n�o possui correspond�ncia na tabela de corre��o
                        I_L(MSG('TCOPROC_N_HA_TABCORR', C_COMPOSICAO.NMPRATO, C_COMPOSICAO.NMTIPOPREPAROTCO, V_NMGRUPOPRATO));
                     END IF;
                  END IF;
                  IF V_VRDEGELO < 0 THEN
                     V_VRDEGELO := 0;
                  END IF;
                  IF V_VRLIMPEZA < 0 THEN
                     V_VRLIMPEZA := 0;
                  END IF;
                  IF V_VRCOCCAO < 0 THEN
                     V_VRCOCCAO := 0;
                  END IF;

                  IF V_NRITEMGRAMCARDBASE IS NOT NULL AND
                     V_NRTABCORRPRODTCO IS NOT NULL THEN                     
                     IF V_IDTIPOGRAMATURA = 'LIMPA' THEN
                        V_VRGRAMATURA := V_VRGRAMATURA/(1 - V_VRDEGELO/100 - V_VRLIMPEZA/100);
                     END IF;
                     IF V_IDTIPOGRAMATURA = 'PRONTA' THEN
                        V_VRGRAMATURA := V_VRGRAMATURA/(1 - V_VRDEGELO/100 - V_VRLIMPEZA/100)/(1 - V_VRCOCCAO/100);
                     END IF;

                     FOR C_PRODRECPRAT IN
                     (
                        SELECT CDPRODUTO, QTBRUTACARDTRABUNR, IDQTDEFIXCARDTRAB
                          FROM RECEPRATCARDTRAB R 
                         WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                           AND R.CDFILAUXPRAT = C_COMPOSICAO.CDFILAUXPRAT 
                           AND R.CDPRATO = C_COMPOSICAO.CDPRATO
                     ) LOOP
                        V_VRBRUTA := ROUND(V_VRGRAMATURA/100 * C_PRODRECPRAT.QTBRUTACARDTRABUNR, 5);

                        -- Se campo indicado como fixo, apenas muda de valor a cada altera��o inteira de quantidade
                        --Ex. 1 ovo, aplicada a regra foi para 1,2 => o valor do ovo na receita continua 1
                        --    1 ovo, aplicada a regra foi para 2,1 => o valor do ovo na receita vai para 2
                        IF C_PRODRECPRAT.IDQTDEFIXCARDTRAB = 'S' THEN
                           V_VRBRUTA := FLOOR(V_VRBRUTA);
                        END IF;

                        -- Como leu da tabela de corre��o, n�o aplica os fatores de coc��o e corre��o
                        UPDATE RECEPRATCARDTRAB
                           SET VRPEFATCOCCARDTRAB = 0.00,
                               VRPEFATCORCARDTRAB = 0.00,
                               QTBRUTACARDTRABUNR = V_VRBRUTA,
                               QTPRODRECCARDTRAB = V_VRBRUTA
                         WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                               AND CDFILAUXPRAT = C_COMPOSICAO.CDFILAUXPRAT
                               AND CDPRATO = C_COMPOSICAO.CDPRATO
                               AND CDPRODUTO = C_PRODRECPRAT.CDPRODUTO;
                     END LOOP;
                  END IF;

               END LOOP;
            END IF;
         END LOOP;
      --=========================================================
      --=== 3� etapa: Particularidade do Segmento
      --=========================================================
         SELECT MAX(NRPARTSEGCARDBASE), MAX(CDPARTSEGCARDBASE)
           INTO V_NRPARTSEGCARDBASE, V_CDPARTSEGCARDBASE
           FROM PARTSEGCARDBASE
          WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
            AND NRATIVCLISEGMER = P_NRATIVCLISEGMER;

         IF V_NRPARTSEGCARDBASE IS NOT NULL THEN
            FOR C_ITPARTSEG IN
            (
               SELECT C.NRCONFIGCARDTRAB, I.VRPERCENTUAL
                 FROM ITPARTSEGCARDBASE I
                      INNER JOIN CONFIGCARDTRAB C ON C.NRCONFIGCARDBASE = I.NRCONFIGCARDBASE
                WHERE NRPARTSEGCARDBASE = V_NRPARTSEGCARDBASE
            ) LOOP
               IF C_ITPARTSEG.VRPERCENTUAL IS NOT NULL THEN
                  FOR C_PRATOS IN
                  (
                     SELECT DISTINCT CDFILAUXPRAT, CDPRATO
                       FROM COMPCARDTRAB
                      WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                        AND NRCONFIGCARDTRAB = C_ITPARTSEG.NRCONFIGCARDTRAB
                  ) LOOP                  
                     UPDATE RECEPRATCARDTRAB
                        SET QTBRUTACARDTRABUNR = ROUND(QTBRUTACARDTRABUNR + QTBRUTACARDTRABUNR * C_ITPARTSEG.VRPERCENTUAL/100, 5),
                            QTPRODRECCARDTRAB = ROUND(QTPRODRECCARDTRAB + QTPRODRECCARDTRAB * C_ITPARTSEG.VRPERCENTUAL/100, 5),
                            NRORGULTATU = P_NRORG,
                            CDOPERULTATU = P_CDOPERADOR,
                            DTULTATU = SYSDATE
                      WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                        AND CDFILAUXPRAT = C_PRATOS.CDFILAUXPRAT
                        AND CDPRATO = C_PRATOS.CDPRATO
                        AND IDQTDEFIXCARDTRAB <> 'S';
                  END LOOP;
               END IF;
            END LOOP;
            REGISTRA_REGRA_PARTSEG(V_NRPARTSEGCARDBASE);
         END IF;
      --=========================================================
      --=== Se Card�pio for Complementar a Outro
      --=========================================================
         IF V_IDCOMPLEMENTAR = 'S' THEN
            SELECT COUNT(1), MAX(NRCARDAPIOBASE)
              INTO V_QTDE, V_NRCARDAPIOBASECOMPL
              FROM CARDAPIOTRAB
             WHERE NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO;
            IF V_QTDE = 0 THEN
               -- Servi�o da proposta � complementar mas n�o foi informado o card�pio complementado pelo mesmo
               I_L(MSG('TCOPROC_SERVCOMPLEMENTAR_SEM_CARDCOMPLEMENTADO'));
            ELSE
               SELECT COUNT(1), MAX(NRCARDCOMPLCARDBASE)
                 INTO V_QTDE, V_NRCARDCOMPLCARDBASE
                 FROM CARDCOMPLCARDBASE
                WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND NRCARDAPIOBASECOMPL = V_NRCARDAPIOBASECOMPL;

               IF V_QTDE = 0 THEN
                  -- Servi�o da proposta complementar n�o complementa o card�pio complementado informado
                  I_L(MSG('TCOPROC_SERVCOMPLEMENTAR_N_LINK_CARDCOMPLEMENTADO'));
               END IF;
            END IF;
            -- Busca a �ltima ordem cadastrada
            SELECT MAX(NRORDEM)
              INTO V_NRORDEM
              FROM CONFIGCARDTRAB
             WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB;

            -- -- Valida se os pratos do card�pio complementado n�o s�o iguais aos do card�pio complementar
            -- FOR C_PRATOS_INCORRETOS IN
            -- (
            --   SELECT DISTINCT PT.CDPRATO, PT.CDPRATO || ' - ' || PT.NMPRATO AS NMPRATO
            --      FROM CONFIGCARDTRAB C
            --           INNER JOIN CNFCCOMPLCARDBASE CNF ON CNF.NRCONFIGCARDBASE = C.NRCONFIGCARDBASE
            --           INNER JOIN COMPCARDTRAB CO ON CO.NRCARDAPIOTRAB = C.NRCARDAPIOTRAB AND
            --                                         CO.NRCONFIGCARDTRAB = C.NRCONFIGCARDTRAB
            --           INNER JOIN PRATO PT ON PT.CDFILAUXPRAT = CO.CDFILAUXPRAT AND
            --                                  PT.CDPRATO = CO.CDPRATO
            --     WHERE C.NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
            --       AND CNF.NRCARDCOMPLCARDBASE = V_NRCARDCOMPLCARDBASE
            --       AND EXISTS
            --           (
            --              SELECT 1
            --               FROM COMPCARDTRAB
            --               WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
            --                 AND CDFILAUXPRAT = CO.CDFILAUXPRAT
            --                 AND CDPRATO = CO.CDPRATO
            --           )
            -- ) LOOP
            --   -- Prato __PARAM0__ do card�pio complementado j� existe no card�pio
            --   I_L(MSG('TCOPROC_PRATO_CARDCOMPLEMENTADO_EXISTE', C_PRATOS_INCORRETOS.NMPRATO));
            -- END LOOP;
            
            -- Percorre as colunas do card�pio complementado
            FOR C_CNFCOMPL IN
            (
               SELECT C.NRCONFIGCARDTRAB, C.CDTIPOPRAT, C.DSCOMPLEMENTO, T.NMTIPOPRAT || CASE WHEN C.DSCOMPLEMENTO IS NULL THEN '' ELSE ' ('|| NVL(C.DSCOMPLEMENTO, ' ') || ')' END AS DESCRICAO, C.IDCLASSIFICACAO,
                      C.NRORDEM, C.IDTEMPERATURA, C.NRCONFIGCARDBASE
                 FROM CONFIGCARDTRAB C
                      INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                      INNER JOIN CNFCCOMPLCARDBASE CNF ON CNF.NRCONFIGCARDBASE = C.NRCONFIGCARDBASE
                WHERE C.NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
                  AND CNF.NRCARDCOMPLCARDBASE = V_NRCARDCOMPLCARDBASE
            ) LOOP

               V_NRORDEM := NVL(V_NRORDEM + 1, 1);
               
               -- Insere configura��o
               V_NRCONFIGCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('CONFIGCARDTRAB', 1));

               INSERT INTO CONFIGCARDTRAB
               (NRCONFIGCARDTRAB, NRCARDAPIOTRAB,
                CDTIPOPRAT, DSCOMPLEMENTO, IDCLASSIFICACAO, 
                NRORDEM,IDTEMPERATURA, NRCONFIGCARDBASE,
                NRORG, NRORGINCLUSAO, NRORGULTATU,
                CDOPERINCLUSAO, CDOPERULTATU,
                DTINCLUSAO, DTULTATU)
               VALUES
               (V_NRCONFIGCARDTRAB, V_NRCARDAPIOTRAB,
                C_CNFCOMPL.CDTIPOPRAT, C_CNFCOMPL.DSCOMPLEMENTO, C_CNFCOMPL.IDCLASSIFICACAO,
                V_NRORDEM, C_CNFCOMPL.IDTEMPERATURA, NULL,
                P_NRORG, P_NRORG, P_NRORG,
                P_CDOPERADOR, P_CDOPERADOR,
                SYSDATE, SYSDATE);

               -- percorre os dias do card�pio complementado
               FOR C_DIATRAB IN
               (
                  SELECT D.NRDIACARDTRAB, TO_CHAR( (D.NRSEMANA - 1) * 7 + D.NRDIASEMANA) AS DIA, DB.NRDIACARDTRAB AS NRDIACARDTRABORI, D.QTCOMENSAIS,
                         D.NRSEMANA, D.NRDIASEMANA
                    FROM DIACARDTRAB D
                         INNER JOIN DIACARDTRAB DB ON DB.NRSEMANA = D.NRSEMANA AND
                                                      DB.NRDIASEMANA = D.NRDIASEMANA
                   WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                     AND DB.NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
                     AND D.QTCOMENSAIS > 0
               ) LOOP
                  SELECT MAX(NRCOMPCARDTRAB), MAX(CDFILAUXPRAT), MAX(CDPRATO)                    
                    INTO V_NRCOMPCARDTRABCOMPL, V_CDFILAUXPRAT, V_CDPRATO
                    FROM COMPCARDTRAB
                   WHERE NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
                     AND NRDIACARDTRAB = C_DIATRAB.NRDIACARDTRABORI
                     AND NRCONFIGCARDTRAB = C_CNFCOMPL.NRCONFIGCARDTRAB;
                  IF V_NRCOMPCARDTRABCOMPL IS NULL THEN
                     -- N�o h� pratos no dia __PARAM0__ para a coluna __PARAM1__ no card�pio complementado
                     I_L(MSG('TCOPROC_PRATO_N_EXIT_CARDCOMPLEMENTADO', NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), C_CNFCOMPL.DESCRICAO));
                  ELSE
                     V_NRCOMPCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('COMPCARDTRAB', 1));
                     INSERT INTO COMPCARDTRAB
                     (NRCOMPCARDTRAB, NRCARDAPIOTRAB, 
                      NRDIACARDTRAB, NRCONFIGCARDTRAB,
                      CDFILAUXPRAT, CDPRATO, VRPECONSCARDTRAB,
                      NRORG, NRORGINCLUSAO, NRORGULTATU,
                      CDOPERINCLUSAO, CDOPERULTATU,
                      DTINCLUSAO, DTULTATU)
                     SELECT V_NRCOMPCARDTRAB, V_NRCARDAPIOTRAB,
                            C_DIATRAB.NRDIACARDTRAB, V_NRCONFIGCARDTRAB,
                            C.CDFILAUXPRAT, C.CDPRATO, NVL(C.VRPECONSCARDTRAB, 0.00),
                            P_NRORG, P_NRORG, P_NRORG,
                            P_CDOPERADOR, P_CDOPERADOR,
                            SYSDATE, SYSDATE
                       FROM COMPCARDTRAB C
                      WHERE C.NRCOMPCARDTRAB = V_NRCOMPCARDTRABCOMPL;

                     SELECT MAX(C.CDFILAUXPRAT), MAX(C.CDPRATO), MAX(PT.CDPRATO || ' - ' || PT.NMPRATO)
                       INTO V_CDFILAUXPRAT, V_CDPRATO, V_NMPRATO
                       FROM COMPCARDTRAB C
                            INNER JOIN PRATO PT ON PT.CDFILAUXPRAT = C.CDFILAUXPRAT AND
                                                   PT.CDPRATO = C.CDPRATO
                      WHERE NRCOMPCARDTRAB = V_NRCOMPCARDTRAB;

                     IF(C_CNFCOMPL.IDCLASSIFICACAO = 'ALIMENTAR') THEN
                        SELECT COUNT(1)
                         INTO V_QTDE
                         FROM GRUPOPRATO G INNER JOIN GRUPOPRATOSERV GS ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                            INNER JOIN ITGRUPOPRATOSERV IT ON IT.NRGRUPOPRATOSERV = GS.NRGRUPOPRATOSERV
                         WHERE G.CDFILIAL = V_CDFILIAL AND
                               GS.CDSERVFILI = V_CDSERVFILI AND
                               IT.CDPRATO = V_CDPRATO AND
                               IT.CDFILAUXPRAT = V_CDFILAUXPRAT AND
                               G.IDTIPORESTRICAO = 'CONTRATO';

                        IF V_QTDE = 0 THEN
                          -- O prato __PARAM0__ n�o est� cadastrado a grupo de prato para o servi�o __PARAM1__ na unidade __PARAM2__
                          I_L(MSG('TCOPROC_PRATO_N_CAD_GRUPOPRAT', V_NMPRATO, V_NMSERVICO, V_CDFILIAL));
                        ELSIF V_QTDE > 1 THEN
                          -- O prato __PARAM0__ est� cadastrado a dois ou mais grupos de prato para o servi�o __PARAM1__ na unidade __PARAM2__
                          I_L(MSG('TCOPROC_PRATO_MAISDE1_GRUPOPRAT', V_NMPRATO, V_NMSERVICO, V_CDFILIAL));
                        END IF;
                     END IF;

                     SELECT COUNT(1)
                       INTO V_QTDE
                       FROM RECEPRATCARDTRAB
                      WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                        AND CDFILAUXPRAT = V_CDFILAUXPRAT
                        AND CDPRATO = V_CDPRATO;
                     IF V_QTDE = 0 THEN
                        SELECT COUNT(1)
                          INTO V_QTDE
                          FROM RECEPRATCARDTRAB
                         WHERE NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
                           AND CDFILAUXPRAT = V_CDFILAUXPRAT
                           AND CDPRATO = V_CDPRATO;

                        V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                        INSERT INTO RECEPRATCARDTRAB
                        (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB,
                         CDFILAUXPRAT, CDPRATO,
                         CDPRODUTO, QTPRODRECCARDTRAB,
                         VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                         SGUNIDADE, QTBRUTACARDTRABUNR,
                         IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                         NRORG, NRORGINCLUSAO, NRORGULTATU,
                         CDOPERINCLUSAO, CDOPERULTATU,
                         DTINCLUSAO, DTULTATU) 
                        SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1), V_NRCARDAPIOTRAB,
                               R.CDFILAUXPRAT, R.CDPRATO,
                               R.CDPRODUTO, R.QTPRODRECCARDTRAB,
                               R.VRPEFATCOCCARDTRAB, R.VRPEFATCORCARDTRAB,
                               NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTACARDTRABUNR,
                               NVL(R.IDPRODBASECARDTRAB, 'N'), NVL(R.IDQTDEFIXCARDTRAB, 'N'),
                               P_NRORG, P_NRORG, P_NRORG,
                               P_CDOPERADOR, P_CDOPERADOR,
                               SYSDATE, SYSDATE
                          FROM RECEPRATCARDTRAB R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                         WHERE R.NRCARDAPIOTRAB = P_NRCARDTRABCOMPLEMENTADO
                           AND R.CDFILAUXPRAT = V_CDFILAUXPRAT
                           AND R.CDPRATO = V_CDPRATO
                         ORDER BY R.CDPRODUTO;
                     END IF;
                  END IF;   
               END LOOP;               
            END LOOP;
         END IF;
      --=========================================================
      --=== 4� etapa: Descart�veis
      --=========================================================
         --Amostra
         SELECT MAX(NRAMOSTRACARDBASE), MAX(NRCONFIGCARDBASEQ), MAX(NRCONFIGCARDBASEF)
           INTO V_NRAMOSTRACARDBASE, V_NRCONFIGCARDBASEQ, V_NRCONFIGCARDBASEF
           FROM AMOSTRACARDBASE
          WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE;

         --Descart�veis
         FOR C_DESCART IN
         (
            SELECT V_NRCONFIGCARDBASEQ AS NRCONFIGCARDBASE, 'QUENTE' AS IDFORMACALCULO, NULL AS NRDESCARTCARDBASE
              FROM DUAL             
             WHERE V_NRCONFIGCARDBASEQ IS NOT NULL 

            UNION ALL 

            SELECT V_NRCONFIGCARDBASEF AS NRCONFIGCARDBASE, 'FRIO' AS IDFORMACALCULO, NULL AS NRDESCARTCARDBASE
              FROM DUAL
             WHERE V_NRCONFIGCARDBASEF IS NOT NULL

            UNION ALL

            SELECT D.NRCONFIGCARDBASE, D.IDFORMACALCULO, D.NRDESCARTCARDBASE
              FROM DESCARTCARDBASE D
                   INNER JOIN LISTA L ON L.NRLISTA = P_CONFIGURACOES AND
                                         D.NRCONFIGCARDBASE = TO_NUMBER(L.CDLISTA)
             WHERE D.NRCARDAPIOBASE = P_NRCARDAPIOBASE
               AND (V_NRCONFIGCARDBASEQ IS NULL OR D.NRCONFIGCARDBASE <> V_NRCONFIGCARDBASEQ)
               AND (V_NRCONFIGCARDBASEF IS NULL OR D.NRCONFIGCARDBASE <> V_NRCONFIGCARDBASEF)
         ) LOOP
            V_QTDE := 0;
            IF C_DESCART.IDFORMACALCULO IN ('QUENTE', 'FRIO') THEN
               SELECT COUNT(1)
                 INTO V_QTDE
                 FROM CONFIGCARDTRAB
                WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                  AND IDCLASSIFICACAO = 'ALIMENTAR'
                  AND IDTEMPERATURA = C_DESCART.IDFORMACALCULO;
               V_QTUNIDADES := V_QTDE * NVL(CASE WHEN P_QTTURNOS = 0 THEN 1 ELSE P_QTTURNOS END, 1);
            END IF;

            IF V_QTDE > 0 OR NOT (C_DESCART.IDFORMACALCULO IN ('QUENTE', 'FRIO')) THEN

               V_NRCONFIGCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('CONFIGCARDTRAB', 1));
               
               SELECT MAX(NRORDEM)
                 INTO V_NRORDEM
                 FROM CONFIGCARDTRAB
                WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB;
               V_NRORDEM := NVL(V_NRORDEM + 1, 1);

               INSERT INTO CONFIGCARDTRAB
               (NRCONFIGCARDTRAB, NRCARDAPIOTRAB,
                CDTIPOPRAT, DSCOMPLEMENTO, IDCLASSIFICACAO, 
                NRORDEM,IDTEMPERATURA, NRCONFIGCARDBASE,
                NRORG, NRORGINCLUSAO, NRORGULTATU,
                CDOPERINCLUSAO, CDOPERULTATU,
                DTINCLUSAO, DTULTATU)
               SELECT V_NRCONFIGCARDTRAB,
                      V_NRCARDAPIOTRAB,
                      C.CDTIPOPRAT, C.DSCOMPLEMENTO, C.IDCLASSIFICACAO, 
                      V_NRORDEM, C.IDTEMPERATURA, C.NRCONFIGCARDBASE,
                      P_NRORG, P_NRORG, P_NRORG,
                      P_CDOPERADOR, P_CDOPERADOR,
                      SYSDATE, SYSDATE
                 FROM CONFIGCARDBASE C                   
                WHERE C.NRCONFIGCARDBASE = C_DESCART.NRCONFIGCARDBASE
                ORDER BY C.NRCONFIGCARDBASE;


               SELECT T.NMTIPOPRAT || CASE WHEN C.DSCOMPLEMENTO IS NULL THEN '' ELSE ' (' || NVL(C.DSCOMPLEMENTO, ' ') || ')' END AS DESCRICAO
                 INTO V_DESCRICAO
                 FROM CONFIGCARDBASE C
                      INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
                WHERE C.NRCONFIGCARDBASE = C_DESCART.NRCONFIGCARDBASE;

               FOR C_DIATRAB IN
               (
                  SELECT D.NRDIACARDTRAB, LPAD(TO_CHAR( (D.NRSEMANA - 1) * 7 + D.NRDIASEMANA), 2, '0') AS DIA, DB.NRDIACARDBASE, D.QTCOMENSAIS,
                         D.NRSEMANA, D.NRDIASEMANA
                    FROM DIACARDTRAB D
                         INNER JOIN DIACARDBASE DB ON DB.NRSEMANA = D.NRSEMANA AND
                                                      DB.NRDIASEMANA = D.NRDIASEMANA 
                   WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                     AND DB.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                     AND D.QTCOMENSAIS > 0
               ) LOOP               
                  /*Se n�o tiver comensais n�o insere o prato pois n�o foi solicitado para o dia*/
                  
                  SELECT MAX(NRCOMPCARDBASE)
                    INTO V_NRCOMPCARDBASE
                    FROM COMPCARDBASE
                   WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
                     AND NRDIACARDBASE = C_DIATRAB.NRDIACARDBASE
                     AND NRCONFIGCARDBASE = C_DESCART.NRCONFIGCARDBASE;
                  IF V_NRCOMPCARDBASE IS NULL THEN
                     -- N�o h� pratos no card�pio base para o dia __PARAM0__ e coluna __PARAM1__
                     I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA', NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
                  ELSE
                     SELECT COUNT(1), MAX(P.NRPRATCOMPCARDBASE)
                       INTO V_QTDE, V_NRPRATCOMPCARDBASE
                       FROM PRATCOMPCARDBASE P
                            INNER JOIN REGIAOPRATCARDBASE R ON R.NRPRATCOMPCARDBASE = P.NRPRATCOMPCARDBASE
                      WHERE P.NRCOMPCARDBASE = V_NRCOMPCARDBASE
                        AND R.CDREGIAO = P_CDREGIAO;

                     IF V_QTDE = 0 THEN
                        -- N�o h� pratos no card�pio base que atendam a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                        I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
                     ELSIF V_QTDE > 1 THEN
                        -- H� dois ou mais pratos no card�pio base que atendem a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                        I_L(MSG('TCOPROC_CARDBASE_MAISDE1_PRATO_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
                     ELSE
                        SELECT MAX(P.CDFILAUXPRAT), MAX(P.CDPRATO), MAX(PT.CDPRATO || ' - ' || PT.NMPRATO), MAX(PT.IDATIVO)
                          INTO V_CDFILAUXPRAT, V_CDPRATO, V_NMPRATO, V_IDATIVO
                          FROM PRATCOMPCARDBASE P
                               INNER JOIN PRATO PT ON PT.CDFILAUXPRAT = P.CDFILAUXPRAT AND
                                                      PT.CDPRATO = P.CDPRATO
                         WHERE P.NRPRATCOMPCARDBASE = V_NRPRATCOMPCARDBASE;
                        
                        IF V_IDATIVO = 'N' THEN
                           -- O prato __PARAM0__ est� inativo
                           I_L(MSG('TCOPROC_PRATO_INATIVO', V_NMPRATO));
                        END IF;

                        V_NRCOMPCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('COMPCARDTRAB', 1));

                        INSERT INTO COMPCARDTRAB
                        (NRCOMPCARDTRAB, NRCARDAPIOTRAB, 
                         NRDIACARDTRAB, NRCONFIGCARDTRAB,
                         CDFILAUXPRAT, CDPRATO, VRPECONSCARDTRAB,
                         NRORG, NRORGINCLUSAO, NRORGULTATU,
                         CDOPERINCLUSAO, CDOPERULTATU,
                         DTINCLUSAO, DTULTATU)
                        VALUES
                        (V_NRCOMPCARDTRAB, V_NRCARDAPIOTRAB,
                         C_DIATRAB.NRDIACARDTRAB, V_NRCONFIGCARDTRAB,
                         V_CDFILAUXPRAT, V_CDPRATO, 100,
                         P_NRORG, P_NRORG, P_NRORG,
                         P_CDOPERADOR, P_CDOPERADOR,
                         SYSDATE, SYSDATE);

                        SELECT COUNT(1)
                          INTO V_QTDE
                          FROM RECEPRATCARDTRAB
                         WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                           AND CDFILAUXPRAT = V_CDFILAUXPRAT
                           AND CDPRATO = V_CDPRATO;

                        IF V_QTDE = 0 THEN
                           V_IDRECEITA := RECE_UTIL_TCO(V_CDFILAUXPRAT,
                                                      V_CDPRATO,
                                                      V_CDFILIAL,
                                                      V_NRSERVICOPROPOSTA,
                                                      V_NRPADRAOQUALIDADE,
                                                      P_CDREGIAO,
                                                      NULL);

                           IF V_IDRECEITA IS NULL THEN
                              -- O prato __PARAM0__ n�o possui receita cadastrada
                              I_L(MSG('TCOPROC_PRATO_SEM_RECEITA', V_NMPRATO));
                           ELSE                              
                              IF V_IDRECEITA = 'R' THEN
                                 SELECT COUNT(1)
                                   INTO V_QTDE
                                   FROM RECEREGIAO
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO
                                    AND CDREGIAO = P_CDREGIAO
                                    AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                                 V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                                 INSERT INTO RECEPRATCARDTRAB
                                 (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                                  CDFILAUXPRAT, CDPRATO,
                                  CDPRODUTO, QTPRODRECCARDTRAB,
                                  VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                                  SGUNIDADE, QTBRUTACARDTRABUNR,
                                  IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                                  NRORG, NRORGINCLUSAO, NRORGULTATU,
                                  CDOPERINCLUSAO, CDOPERULTATU,
                                  DTINCLUSAO, DTULTATU)                                 
                                 SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEREGIAO) - 1) AS NRRECEPRATCARDTRAB,
                                        V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                        R.CDPRODUTO, R.QTPRODRECREGIAO,
                                        NVL(R.VRPEFATCOCREGIAO, 0), NVL(R.VRPEFATCORREGIAO, 0),
                                        NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAREGIAOUNR,
                                        NVL(R.IDPRODBASEREGIAO, 'N'), NVL(R.IDQTDEFIXREGIAO, 'N'),
                                        P_NRORG, P_NRORG, P_NRORG,
                                        P_CDOPERADOR, P_CDOPERADOR,
                                        SYSDATE, SYSDATE
                                   FROM RECEREGIAO R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                                  WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND R.CDPRATO = V_CDPRATO
                                    AND R.CDREGIAO = P_CDREGIAO
                                    AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                                  ORDER BY R.NRRECEREGIAO;

                              ELSIF V_IDRECEITA = 'Q' THEN
                                 SELECT COUNT(1)
                                   INTO V_QTDE
                                   FROM RECEPADQUALI
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO
                                    AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                                 V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                                 INSERT INTO RECEPRATCARDTRAB
                                 (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB,
                                  CDFILAUXPRAT, CDPRATO,
                                  CDPRODUTO, QTPRODRECCARDTRAB,
                                  VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                                  SGUNIDADE, QTBRUTACARDTRABUNR,
                                  IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                                  NRORG, NRORGINCLUSAO, NRORGULTATU,
                                  CDOPERINCLUSAO, CDOPERULTATU,
                                  DTINCLUSAO, DTULTATU)                                 
                                 SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEPADQUALI) - 1) AS NRRECEPRATCARDTRAB,
                                        V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                        R.CDPRODUTO, R.QTPRODRECPADQ,
                                        NVL(R.VRPEFATCOCPADQ, 0), NVL(R.VRPEFATCORPADQ, 0),
                                        NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPADQUNR,
                                        NVL(R.IDPRODBASEPADQ, 'N'), NVL(R.IDQTDEFIXPADQ, 'N'),
                                        P_NRORG, P_NRORG, P_NRORG,
                                        P_CDOPERADOR, P_CDOPERADOR,
                                        SYSDATE, SYSDATE
                                   FROM RECEPADQUALI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                                  WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND R.CDPRATO = V_CDPRATO
                                    AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                                  ORDER BY R.NRRECEPADQUALI;

                              ELSIF V_IDRECEITA = 'S' THEN                           

                                 SELECT COUNT(1)
                                   INTO V_QTDE
                                   FROM RECESERV
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO
                                    AND CDFILIAL = V_CDFILIAL
                                    AND CDSERVFILI = V_CDSERVFILI;

                                 SELECT MAX(IDATIVO)
                                   INTO V_IDATIVO
                                   FROM PRATSERV
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO
                                    AND CDFILIAL = V_CDFILIAL
                                    AND CDSERVFILI = V_CDSERVFILI;

                                 IF V_IDATIVO = 'N' THEN
                                    -- Receita por servico do prato __PARAM0__ est� inativa para unidade __PARAM1__ e servico __PARAM2__
                                    I_L(MSG('TCOPROC_RECESERV_INATIVA', V_NMPRATO, V_CDFILIAL, V_NMSERVICO));
                                 END IF;

                                 V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                                 INSERT INTO RECEPRATCARDTRAB
                                 (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                                  CDFILAUXPRAT, CDPRATO,
                                  CDPRODUTO, QTPRODRECCARDTRAB,
                                  VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                                  SGUNIDADE, QTBRUTACARDTRABUNR,
                                  IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                                  NRORG, NRORGINCLUSAO, NRORGULTATU,
                                  CDOPERINCLUSAO, CDOPERULTATU,
                                  DTINCLUSAO, DTULTATU)                                 
                                 SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                        V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                        R.CDPRODUTO, R.QTPRODRECSER,
                                        NVL(R.VRPEFATCOCSE, 0), NVL(R.VRPEFATCORSE, 0),
                                        NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTASEUNR,
                                        NVL(R.IDPRODBASESE, 'N'), NVL(R.IDQTDEFIXSE, 'N'),
                                        P_NRORG, P_NRORG, P_NRORG,
                                        P_CDOPERADOR, P_CDOPERADOR,
                                        SYSDATE, SYSDATE
                                   FROM RECESERV R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                                  WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND R.CDPRATO = V_CDPRATO
                                    AND R.CDFILIAL = V_CDFILIAL
                                    AND R.CDSERVFILI = V_CDSERVFILI
                                  ORDER BY R.CDPRODUTO;

                                 ELSIF V_IDRECEITA = 'F' THEN
                                    SELECT COUNT(1)
                                      INTO V_QTDE
                                      FROM RECEFILI
                                     WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                       AND CDPRATO = V_CDPRATO
                                       AND CDFILIAL = V_CDFILIAL;

                                    SELECT MAX(IDATIVO)
                                      INTO V_IDATIVO
                                      FROM PRATFILI
                                     WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                       AND CDPRATO = V_CDPRATO
                                       AND CDFILIAL = V_CDFILIAL;

                                    IF V_IDATIVO = 'N' THEN
                                       -- Receita por unidade do prato __PARAM0__ est� inativa para unidade __PARAM1__
                                       I_L(MSG('TCOPROC_RECEFILI_INATIVA', V_NMPRATO, V_CDFILIAL));
                                    END IF;

                                    V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                                    INSERT INTO RECEPRATCARDTRAB
                                    (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                                     CDFILAUXPRAT, CDPRATO,
                                     CDPRODUTO, QTPRODRECCARDTRAB,
                                     VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                                     SGUNIDADE, QTBRUTACARDTRABUNR,
                                     IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                                     NRORG, NRORGINCLUSAO, NRORGULTATU,
                                     CDOPERINCLUSAO, CDOPERULTATU,
                                     DTINCLUSAO, DTULTATU)                                 
                                    SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                           V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                           R.CDPRODUTO, R.QTPRODRECLOC,
                                           NVL(R.VRPEFATCOCLO, 0), NVL(R.VRPEFATCORLO, 0),
                                           NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTALOUNR,
                                           NVL(R.IDPRODBASELO, 'N'), NVL(R.IDQTDEFIXLO, 'N'),
                                           P_NRORG, P_NRORG, P_NRORG,
                                           P_CDOPERADOR, P_CDOPERADOR,
                                           SYSDATE, SYSDATE
                                      FROM RECEFILI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                                     WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                       AND R.CDPRATO = V_CDPRATO
                                       AND R.CDFILIAL = V_CDFILIAL
                                     ORDER BY R.CDPRODUTO;
                                     
                              ELSIF V_IDRECEITA = 'P' THEN                           
                                 SELECT COUNT(1)
                                   INTO V_QTDE
                                   FROM RECEPADR
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO;

                                 SELECT MAX(IDATIVO)
                                   INTO V_IDATIVO
                                   FROM PRATPADR
                                  WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND CDPRATO = V_CDPRATO;

                                 IF V_IDATIVO = 'N' THEN
                                    -- Receita padr�o do prato __PARAM0__ est� inativa
                                    I_L(MSG('TCOPROC_RECEPADR_INATIVA', V_NMPRATO));
                                 END IF;

                                 V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                                 INSERT INTO RECEPRATCARDTRAB
                                 (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                                  CDFILAUXPRAT, CDPRATO,
                                  CDPRODUTO, QTPRODRECCARDTRAB,
                                  VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                                  SGUNIDADE, QTBRUTACARDTRABUNR,
                                  IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                                  NRORG, NRORGINCLUSAO, NRORGULTATU,
                                  CDOPERINCLUSAO, CDOPERULTATU,
                                  DTINCLUSAO, DTULTATU)                                 
                                 SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                        V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                        R.CDPRODUTO, R.QTPRODPRAT,
                                        NVL(R.VRPEFATCOCPR, 0), NVL(R.VRPEFATCORPR, 0),
                                        NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPRUNR,
                                        NVL(R.IDPRODBASEPR, 'N'), NVL(R.IDQTDEFIXPR, 'N'),
                                        P_NRORG, P_NRORG, P_NRORG,
                                        P_CDOPERADOR, P_CDOPERADOR,
                                        SYSDATE, SYSDATE
                                   FROM RECEPADR R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                                  WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                    AND R.CDPRATO = V_CDPRATO
                                 ORDER BY R.CDPRODUTO;
                              END IF;
                           END IF;

                        END IF;

                        IF C_DESCART.IDFORMACALCULO IN ('QUENTE', 'FRIO') THEN
                           V_COMENSAIS := V_QTUNIDADES/C_DIATRAB.QTCOMENSAIS;
                        ELSIF C_DESCART.IDFORMACALCULO = 'PERCAPITA' THEN
                           V_COMENSAIS := 1;
                        ELSE
                           V_COMENSAIS := 1/C_DIATRAB.QTCOMENSAIS;
                        END IF;
                        V_COMENSAIS := V_COMENSAIS * 100;
                        
                        UPDATE COMPCARDTRAB
                           SET VRPECONSCARDTRAB = NVL(V_COMENSAIS, 0),
                               NRORGULTATU = P_NRORG,
                               CDOPERULTATU = P_CDOPERADOR,
                               DTULTATU = SYSDATE
                         WHERE NRCOMPCARDTRAB = V_NRCOMPCARDTRAB;

                     END IF;
                  END IF;               
               END LOOP;

               IF (NOT (C_DESCART.IDFORMACALCULO IN ('QUENTE', 'FRIO'))) THEN
                  REGISTRA_REGRA_DESCARTAVEL(C_DESCART.NRDESCARTCARDBASE);
               ELSE
                  REGISTRA_REGRA_AMOSTRA(V_NRAMOSTRACARDBASE, C_DESCART.IDFORMACALCULO);
               END IF;
            END IF;
         END LOOP;
      --=========================================================
      --=== 5� etapa: Limpeza
      --=========================================================
          SELECT MAX(L.NRLIMPEZACARDBASE), MAX(L.NRCONFIGCARDBASE), MAX(C.CDTIPOPRAT), MAX(C.DSCOMPLEMENTO), MAX(T.NMTIPOPRAT || CASE WHEN C.DSCOMPLEMENTO IS NULL THEN '' ELSE ' (' || NVL(C.DSCOMPLEMENTO, ' ') || ')' END)
            INTO V_NRLIMPEZACARDBASE, V_NRCONFIGCARDBASE, V_CDTIPOPRATLIMPEZA, V_DSCOMPLEMENTO, V_DESCRICAO
            FROM LIMPEZACARDBASE L
                 INNER JOIN CONFIGCARDBASE C ON C.NRCONFIGCARDBASE = L.NRCONFIGCARDBASE
                 INNER JOIN TIPOPRAT T ON T.CDTIPOPRAT = C.CDTIPOPRAT
           WHERE L.NRCARDAPIOBASE = P_NRCARDAPIOBASE
             AND NVL(P_QTSEGSEX, NVL(P_QTSABADO, P_QTDOMFERI)) BETWEEN QTINICIAL AND QTFINAL;
         IF V_NRCONFIGCARDBASE IS NOT NULL THEN            
            V_NRCONFIGCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('CONFIGCARDTRAB', 1));

            SELECT MAX(NRORDEM)
              INTO V_NRORDEM
              FROM CONFIGCARDTRAB
             WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB;
            V_NRORDEM := NVL(V_NRORDEM + 1, 1);

            INSERT INTO CONFIGCARDTRAB
            (NRCONFIGCARDTRAB, NRCARDAPIOTRAB,
             CDTIPOPRAT, DSCOMPLEMENTO, IDCLASSIFICACAO, 
             NRORDEM,IDTEMPERATURA, NRCONFIGCARDBASE,
             NRORG, NRORGINCLUSAO, NRORGULTATU,
             CDOPERINCLUSAO, CDOPERULTATU,
             DTINCLUSAO, DTULTATU)
            VALUES
            (V_NRCONFIGCARDTRAB, V_NRCARDAPIOTRAB,
             V_CDTIPOPRATLIMPEZA, V_DSCOMPLEMENTO, 'LIMPEZA',
             V_NRORDEM, NULL, V_NRCONFIGCARDBASE,
             P_NRORG, P_NRORG, P_NRORG,
             P_CDOPERADOR, P_CDOPERADOR,
             SYSDATE, SYSDATE);

            FOR C_DIATRAB IN
            (
               SELECT D.NRDIACARDTRAB, LPAD(TO_CHAR( (D.NRSEMANA - 1) * 7 + D.NRDIASEMANA), 2, '0') AS DIA, DB.NRDIACARDBASE, D.QTCOMENSAIS,
                      D.NRSEMANA, D.NRDIASEMANA
                 FROM DIACARDTRAB D
                      INNER JOIN DIACARDBASE DB ON DB.NRSEMANA = D.NRSEMANA AND
                                                   DB.NRDIASEMANA = D.NRDIASEMANA 
                WHERE D.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                  AND DB.NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND D.QTCOMENSAIS > 0
            ) LOOP
               /*Se n�o tiver comensais n�o insere o prato pois n�o foi solicitado para o dia*/
            
               SELECT MAX(NRCOMPCARDBASE)
                 INTO V_NRCOMPCARDBASE
                 FROM COMPCARDBASE
                WHERE NRCARDAPIOBASE = P_NRCARDAPIOBASE
                  AND NRDIACARDBASE = C_DIATRAB.NRDIACARDBASE
                  AND NRCONFIGCARDBASE = V_NRCONFIGCARDBASE;
               IF V_NRCOMPCARDBASE IS NULL THEN
                  -- N�o h� pratos no card�pio base para o dia __PARAM0__ e coluna __PARAM1__
                  I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA', NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
               ELSE
                  SELECT COUNT(1), MAX(P.NRPRATCOMPCARDBASE)
                    INTO V_QTDE, V_NRPRATCOMPCARDBASE
                    FROM PRATCOMPCARDBASE P
                         INNER JOIN REGIAOPRATCARDBASE R ON R.NRPRATCOMPCARDBASE = P.NRPRATCOMPCARDBASE
                   WHERE P.NRCOMPCARDBASE = V_NRCOMPCARDBASE
                     AND R.CDREGIAO = P_CDREGIAO;

                  IF V_QTDE = 0 THEN
                     -- N�o h� pratos no card�pio base que atendam a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                     I_L(MSG('TCOPROC_CARDBASE_N_POSSUI_PRATOS_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
                  ELSIF V_QTDE > 1 THEN
                     -- H� dois ou mais pratos no card�pio base que atendem a regi�o __PARAM0__ no dia __PARAM1__ e coluna __PARAM2__
                     I_L(MSG('TCOPROC_CARDBASE_MAISDE1_PRATO_DIA_PARA_REGIAO', V_NMREGIAO, NOME_DIA(C_DIATRAB.NRSEMANA, C_DIATRAB.NRDIASEMANA), V_DESCRICAO));
                  ELSE
                     SELECT MAX(P.CDFILAUXPRAT), MAX(P.CDPRATO), MAX(PT.CDPRATO || ' - ' || PT.NMPRATO), MAX(PT.IDATIVO)
                       INTO V_CDFILAUXPRAT, V_CDPRATO, V_NMPRATO, V_IDATIVO
                       FROM PRATCOMPCARDBASE P
                            INNER JOIN PRATO PT ON PT.CDFILAUXPRAT = P.CDFILAUXPRAT AND
                                                   PT.CDPRATO = P.CDPRATO
                      WHERE P.NRPRATCOMPCARDBASE = V_NRPRATCOMPCARDBASE;
                     
                     IF V_IDATIVO = 'N' THEN
                        -- O prato __PARAM0__ est� inativo
                        I_L(MSG('TCOPROC_PRATO_INATIVO', V_NMPRATO));
                     END IF;

                     V_NRCOMPCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('COMPCARDTRAB', 1));

                     V_COMENSAIS := 1/C_DIATRAB.QTCOMENSAIS * 100;

                     INSERT INTO COMPCARDTRAB
                     (NRCOMPCARDTRAB, NRCARDAPIOTRAB, 
                      NRDIACARDTRAB, NRCONFIGCARDTRAB,
                      CDFILAUXPRAT, CDPRATO, VRPECONSCARDTRAB,
                      NRORG, NRORGINCLUSAO, NRORGULTATU,
                      CDOPERINCLUSAO, CDOPERULTATU,
                      DTINCLUSAO, DTULTATU)
                     VALUES
                     (V_NRCOMPCARDTRAB, V_NRCARDAPIOTRAB,
                      C_DIATRAB.NRDIACARDTRAB, V_NRCONFIGCARDTRAB,
                      V_CDFILAUXPRAT, V_CDPRATO, NVL(V_COMENSAIS, 0),
                      P_NRORG, P_NRORG, P_NRORG,
                      P_CDOPERADOR, P_CDOPERADOR,
                      SYSDATE, SYSDATE);

                     SELECT COUNT(1)
                       INTO V_QTDE
                       FROM RECEPRATCARDTRAB
                      WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
                        AND CDFILAUXPRAT = V_CDFILAUXPRAT
                        AND CDPRATO = V_CDPRATO;

                     IF V_QTDE = 0 THEN
                        V_IDRECEITA := RECE_UTIL_TCO(V_CDFILAUXPRAT,
                                                      V_CDPRATO,
                                                      V_CDFILIAL,
                                                      V_NRSERVICOPROPOSTA,
                                                      V_NRPADRAOQUALIDADE,
                                                      P_CDREGIAO,
                                                      NULL);

                        IF V_IDRECEITA IS NULL THEN
                           -- O prato __PARAM0__ n�o possui receita cadastrada
                           I_L(MSG('TCOPROC_PRATO_SEM_RECEITA', V_NMPRATO));
                        ELSE                              
                           IF V_IDRECEITA = 'R' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEREGIAO
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDREGIAO = P_CDREGIAO
                                 AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEREGIAO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECREGIAO,
                                     NVL(R.VRPEFATCOCREGIAO, 0), NVL(R.VRPEFATCORREGIAO, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAREGIAOUNR,
                                     NVL(R.IDPRODBASEREGIAO, 'N'), NVL(R.IDQTDEFIXREGIAO, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEREGIAO R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDREGIAO = P_CDREGIAO
                                 AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                               ORDER BY R.NRRECEREGIAO;

                           ELSIF V_IDRECEITA = 'Q' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEPADQUALI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.NRRECEPADQUALI) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECPADQ,
                                     NVL(R.VRPEFATCOCPADQ, 0), NVL(R.VRPEFATCORPADQ, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPADQUNR,
                                     NVL(R.IDPRODBASEPADQ, 'N'), NVL(R.IDQTDEFIXPADQ, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEPADQUALI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.NRPADRAOQUALIDADE = V_NRPADRAOQUALIDADE
                               ORDER BY R.NRRECEPADQUALI;

                           ELSIF V_IDRECEITA = 'S' THEN                           

                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECESERV
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL
                                 AND CDSERVFILI = V_CDSERVFILI;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATSERV
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL
                                 AND CDSERVFILI = V_CDSERVFILI;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita por servico do prato __PARAM0__ est� inativa para unidade __PARAM1__ e servico __PARAM2__
                                 I_L(MSG('TCOPROC_RECESERV_INATIVA', V_NMPRATO, V_CDFILIAL, V_NMSERVICO));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB, 
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECSER,
                                     NVL(R.VRPEFATCOCSE, 0), NVL(R.VRPEFATCORSE, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTASEUNR,
                                     NVL(R.IDPRODBASESE, 'N'), NVL(R.IDQTDEFIXSE, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECESERV R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDFILIAL = V_CDFILIAL
                                 AND R.CDSERVFILI = V_CDSERVFILI
                               ORDER BY R.CDPRODUTO;

                           ELSIF V_IDRECEITA = 'F' THEN
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEFILI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATFILI
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO
                                 AND CDFILIAL = V_CDFILIAL;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita por unidade do prato __PARAM0__ est� inativa para unidade __PARAM1__
                                 I_L(MSG('TCOPROC_RECEFILI_INATIVA', V_NMPRATO, V_CDFILIAL));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB,
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODRECLOC,
                                     NVL(R.VRPEFATCOCLO, 0), NVL(R.VRPEFATCORLO, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTALOUNR,
                                     NVL(R.IDPRODBASELO, 'N'), NVL(R.IDQTDEFIXLO, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEFILI R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                                 AND R.CDFILIAL = V_CDFILIAL
                               ORDER BY R.CDPRODUTO;
                           ELSIF V_IDRECEITA = 'P' THEN                           
                              SELECT COUNT(1)
                                INTO V_QTDE
                                FROM RECEPADR
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO;

                              SELECT MAX(IDATIVO)
                                INTO V_IDATIVO
                                FROM PRATPADR
                               WHERE CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND CDPRATO = V_CDPRATO;

                              IF V_IDATIVO = 'N' THEN
                                 -- Receita padr�o do prato __PARAM0__ est� inativa
                                 I_L(MSG('TCOPROC_RECEPADR_INATIVA', V_NMPRATO));
                              END IF;

                              V_NRRECEPRATCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('RECEPRATCARDTRAB', V_QTDE));

                              INSERT INTO RECEPRATCARDTRAB
                              (NRRECEPRATCARDTRAB, NRCARDAPIOTRAB,
                               CDFILAUXPRAT, CDPRATO,
                               CDPRODUTO, QTPRODRECCARDTRAB,
                               VRPEFATCOCCARDTRAB, VRPEFATCORCARDTRAB,
                               SGUNIDADE, QTBRUTACARDTRABUNR,
                               IDPRODBASECARDTRAB, IDQTDEFIXCARDTRAB,
                               NRORG, NRORGINCLUSAO, NRORGULTATU,
                               CDOPERINCLUSAO, CDOPERULTATU,
                               DTINCLUSAO, DTULTATU)                                 
                              SELECT V_NRRECEPRATCARDTRAB + (ROW_NUMBER() OVER (ORDER BY R.CDPRODUTO) - 1) AS NRRECEPRATCARDTRAB,
                                     V_NRCARDAPIOTRAB, R.CDFILAUXPRAT, R.CDPRATO,
                                     R.CDPRODUTO, R.QTPRODPRAT,
                                     NVL(R.VRPEFATCOCPR, 0), NVL(R.VRPEFATCORPR, 0),
                                     NVL(R.SGUNIDADE, P.SGUNIDADE), R.QTBRUTAPRUNR,
                                     NVL(R.IDPRODBASEPR, 'N'), NVL(R.IDQTDEFIXPR, 'N'),
                                     P_NRORG, P_NRORG, P_NRORG,
                                     P_CDOPERADOR, P_CDOPERADOR,
                                     SYSDATE, SYSDATE
                                FROM RECEPADR R INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                               WHERE R.CDFILAUXPRAT = V_CDFILAUXPRAT
                                 AND R.CDPRATO = V_CDPRATO
                              ORDER BY R.CDPRODUTO;
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;                 
            END LOOP;

            REGISTRA_REGRA_LIMPEZA(V_NRLIMPEZACARDBASE);
         END IF;
      --=========================================================
      --=== Custo dos produtos
      --=========================================================
         -- Busca a central de compras
         SELECT MAX(NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL))
           INTO V_CDFILCENTCMP
           FROM FILIAL
          WHERE CDFILIAL = V_CDFILIAL;
         -- Busca informa��es da PARASUPRI
         SELECT MAX(IDTIPOAPUR)
           INTO V_IDTIPOAPUR
           FROM PARASUPRI
          WHERE CDFILIAL = V_CDFILCENTCMP;

         V_CDPRODESTO := NULL;             

         -- Procura a lista de pre�os calculada para a data.
         SELECT MAX(NRLISTAPRECOTCO)
           INTO V_NRLISTAPRECOTCO
           FROM LISTAPRECOTCO
          WHERE DTREFERENCIA = P_DTCUSTO
            AND CDREGIAO = P_CDREGIAO;

         -- Caso n�o encontre uma lista j� salva, gera uma nova lista de pre�os do TCO
         IF V_NRLISTAPRECOTCO IS NULL THEN
            GRAVA_LISTAPRECOTCO(P_DTCUSTO, P_CDREGIAO, P_NRORG, P_CDOPERADOR, V_NRLISTAPRECOTCO);              
         END IF;

         -- Se foi salva nova lista de pre�os
         IF V_NRLISTAPRECOTCO IS NOT NULL THEN
            -- Indica lista de pre�os tco utilizada no card�pio de trabalho
            UPDATE CARDAPIOTRAB
               SET NRLISTAPRECOTCO = V_NRLISTAPRECOTCO
             WHERE NRCARDAPIOTRAB = V_NRCARDAPIOTRAB;

            FOR C_CUSTOS IN 
            (SELECT NRPRODLISTAPRECOTCO, CDPRODESTO, VRCUSTO, CDMARCA
               FROM PRODLISTAPRECOTCO
              WHERE NRLISTAPRECOTCO = V_NRLISTAPRECOTCO
                AND IDESCOLHIDO = 'S') LOOP

               V_NRPRODUTOCARDTRAB := TO_NUMBER(RETORNA_NOVO_CODIGO('PRODUTOCARDTRAB', 1));

               INSERT INTO PRODUTOCARDTRAB
               (NRPRODUTOCARDTRAB, NRCARDAPIOTRAB, 
                CDPRODUTO, CDMARCA, 
                VRCUSTO,
                NRPRODLISTAPRECOTCO,
                NRORG, NRORGINCLUSAO, NRORGULTATU,
                CDOPERINCLUSAO, CDOPERULTATU,
                DTINCLUSAO, DTULTATU)
               VALUES
               (V_NRPRODUTOCARDTRAB, V_NRCARDAPIOTRAB,
                C_CUSTOS.CDPRODESTO, C_CUSTOS.CDMARCA, 
                C_CUSTOS.VRCUSTO + ( C_CUSTOS.VRCUSTO * (NVL(P_VRPEACRESCUSTO, 0)/100)),
                C_CUSTOS.NRPRODLISTAPRECOTCO,
                P_NRORG, P_NRORG, P_NRORG,
                P_CDOPERADOR, P_CDOPERADOR,
                SYSDATE, SYSDATE);
            END LOOP;            
         END IF;

         -- Verifica produto de estoque em uso em receitas do prato
         FOR C_RECEITAS IN
         (
            SELECT DISTINCT P.CDPRATO || ' - ' || P.NMPRATO AS PRATO, PT.CDARVPROD || ' - ' || PT.NMPRODUTO AS NMPRODUTO
              FROM RECEPRATCARDTRAB R
                   INNER JOIN PRATO P ON P.CDFILAUXPRAT = R.CDFILAUXPRAT AND 
                                         P.CDPRATO = R.CDPRATO
                   INNER JOIN PRODUTO PT ON PT.CDPRODUTO = R.CDPRODUTO
             WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
               AND (PT.CDPRODUTO <> PT.CDPRODESTO OR PT.CDPRODESTO IS NULL)
         ) LOOP
            -- Produto __PARAM0__ n�o � produto de estoque e est� em uso no prato __PARAM1__
            I_L(MSG('TCOPROC_PRODUTO_ESTOQUE_INVALIDO', C_RECEITAS.NMPRODUTO, C_RECEITAS.PRATO));
         END LOOP;

         -- Verifica produto com custo zero
         FOR C_PRODUTOS IN
         (
            SELECT DISTINCT R.CDPRODUTO, PT.CDARVPROD || ' - ' || PT.NMPRODUTO AS NMPRODUTO
              FROM RECEPRATCARDTRAB R
                   INNER JOIN PRODUTO PT ON PT.CDPRODUTO = R.CDPRODUTO
                   LEFT JOIN PRODUTOCARDTRAB P ON P.NRCARDAPIOTRAB = R.NRCARDAPIOTRAB AND
                                                  P.CDPRODUTO = R.CDPRODUTO AND
                                                  P.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
             WHERE R.NRCARDAPIOTRAB = V_NRCARDAPIOTRAB
               AND P.CDPRODUTO IS NULL
               AND PT.CDPRODUTO = PT.CDPRODESTO
         ) LOOP
            -- Produto __PARAM0__ n�o possui custo
            I_L(MSG('TCOPROC_PRODUTO_SEM_CUSTO', C_PRODUTOS.NMPRODUTO));
         END LOOP;
      END IF;
--=========================================================
--=== Retorno
--=========================================================
      IF P_LISTAERROS IS NULL THEN
         P_NRCARDAPIOTRAB := V_NRCARDAPIOTRAB; 
      END IF;
   END IF;

END;
/

-- VERSAO --
BEGIN ATUVEROBJ('IMPORTA_CARDBASE_NO_CARDTRAB','6.29.xxx'); END;
/