create or replace PROCEDURE EXPORTA_CADASTROS_OTIMIZADOR(
   P_TABELA IN VARCHAR2, /*TABELA QUE SERA EXPORTADA*/
   P_NRLISTAITEM IN LISTA.NRLISTA%TYPE, /*LISTA DE ITENS SELECIONADOS PARA A EXPORTACAO*/
   P_CDFILIAL IN FILIAL.CDFILIAL%TYPE, /*FILIAL LOGADA*/
   P_CDSERVFILI IN SERVICO.CDSERVFILI%TYPE, /*SERVICO LOGADO*/
   P_IDTIPORESTRICAO IN VARCHAR2,/*TIPO DE RESTRICAO LOGADO*/
   P_NRLISTAFILISERV IN LISTA.NRLISTA%TYPE, /*LISTA DE FILIAIS E SERVICOS PARA DESTINO*/
   P_IDOPCAO IN VARCHAR2, /*OPCAO ACRESCENTAR OU SOBREPOR*/
   P_CDOPERADOR IN OPERADOR.CDOPERADOR%TYPE, /*OPERADOR LOGADO*/
   P_LISTA_ERROS OUT VARCHAR2, /*LISTA DE ERROS PARA RETORNO*/
   P_CDGRUPOPRATODEST IN GRUPOPRATO.CDGRUPOPRATO%TYPE DEFAULT NULL, /*NRO DO GRUPO DE PRATO DE DESTINO  - EXCLUSIVO PARA A EXPORTACAO DE PRATOS DO GRUPO DE PRATO*/
   P_IDEXCLUIORGIEM IN VARCHAR2 DEFAULT NULL) /*OPCAO SE EXCLUI OS PRATOS DO GRUPO DE ORIGEM OU NAO  - EXCLUSIVO PARA A EXPORTACAO DE PRATOS DO GRUPO DE PRATO  */
AS
   V_LISTA_ERROS NUMBER;
   V_CDCHAVE VARCHAR2(500);
   V_MENSAGEM VARCHAR2(4000);
   V_NRLISTA NUMBER;
   V_NRLISTA_S NUMBER;
   V_NRGRUPOPRATO_D NUMBER;
   V_NRGRUPOPRATOSERV_D NUMBER;
   V_NRAGRUPGRPRAT_D NUMBER;
   V_MESMOSERV VARCHAR2(1);
   V_CDNVPRATO VARCHAR2(1);
   V_IMPORTA VARCHAR2(1);
   V_PRATO_1 VARCHAR2(4);
   V_PRATO_2 VARCHAR2(4);
   V_NRGRUPOPRATOSERV_1 NUMBER;
   V_NRGRUPOPRATOSERV_2 NUMBER;   
   V_COUNT NUMBER;
   
BEGIN 
   /*EXPORTACAO DE CONFIGURACAO DO SERVICO*/
   IF P_TABELA = 'CONFCARD' THEN
      /*PERCORRE CADA SERVICO QUE POSSUI ALGUMA CONFIGURACAO IGUAO AO ORIGEM*/
      FOR C_DEST IN (SELECT DISTINCT CF.CDFILIAL, CF.CDSERVFILI
                       FROM LISTA L INNER JOIN CONFCARD CF ON CF.CDFILIAL = SUBSTR(CDLISTA, 1,4) AND CF.CDSERVFILI = SUBSTR(CDLISTA, 5,5) AND L.NRLISTA = P_NRLISTAFILISERV
                      WHERE EXISTS(SELECT C.NRSEQCNFCARD
                                     FROM CONFCARD C
                                    WHERE C.CDFILIAL = P_CDFILIAL AND
                                          C.CDSERVFILI = P_CDSERVFILI AND
                                          C.NRORDCNFCARD = CF.NRORDCNFCARD AND
                                          C.CDTIPOPRAT = CF.CDTIPOPRAT)
      )LOOP
         /*PROCURA GRUPOS DE PRATOS NAO ASSOCIADOS AO SERVICO DESTINO PARA INSERIR NA LISTA DE ERROS*/
         FOR C_ERROS IN (SELECT DISTINCT G.CDGRUPOPRATO, G.NMGRUPOPRATO, G.NRORG
                           FROM CONFCARDGRUPOPRATO GF INNER JOIN GRUPOPRATOSERV GS ON GS.NRGRUPOPRATOSERV = GF.NRGRUPOPRATOSERV
                                                      INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO AND G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND G.CDFILIAL = P_CDFILIAL
                           WHERE GF.CDFILIAL = P_CDFILIAL AND GF.CDSERVFILI = P_CDSERVFILI AND
                                 NOT EXISTS (SELECT GS2.NRGRUPOPRATO
                                              FROM GRUPOPRATOSERV GS2 INNER JOIN GRUPOPRATO P2 ON GS2.NRGRUPOPRATO = P2.NRGRUPOPRATO AND P2.IDTIPORESTRICAO = P_IDTIPORESTRICAO 
                                             WHERE P2.CDFILIAL = C_DEST.CDFILIAL AND
                                                   P2.CDGRUPOPRATO = G.CDGRUPOPRATO AND
                                                   GS2.CDSERVFILI = C_DEST.CDSERVFILI AND
                                                   GS2.NRGRUPOPRATOSERV <> GF.NRGRUPOPRATOSERV)
         )LOOP
             /*INSERE NA TABELA DE ERROS*/
            V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_ERROS.CDGRUPOPRATO);
            V_MENSAGEM := MSG('CONSISTE_GRUPOPRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_ERROS.CDGRUPOPRATO||' - '||C_ERROS.NMGRUPOPRATO);
            INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_ERROS.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
         END LOOP;

         /*SE A OPCAO E SOBREPOR ENTAO APAGA AS CONFIGURACOES DAS COLUNAS DESTINO*/
         IF P_IDOPCAO = 'SOBREPOR' THEN
            DELETE 
              FROM CONFCARDGRUPOPRATO
             WHERE NRCONFCARDGRUPOPRATO IN (SELECT F.NRCONFCARDGRUPOPRATO
                                              FROM CONFCARDGRUPOPRATO F INNER JOIN CONFCARD C ON F.CDFILIAL = C.CDFILIAL AND F.CDSERVFILI = C.CDSERVFILI AND F.NRSEQCNFCARD = C.NRSEQCNFCARD
                                             WHERE F.CDFILIAL = C_DEST.CDFILIAL AND
                                                   F.CDSERVFILI = C_DEST.CDSERVFILI AND
                                                   EXISTS(SELECT CF.NRSEQCNFCARD
                                                            FROM CONFCARD CF
                                                           WHERE CF.CDFILIAL = P_CDFILIAL AND
                                                                 CF.CDSERVFILI = P_CDSERVFILI AND
                                                                 CF.NRORDCNFCARD = C.NRORDCNFCARD AND
                                                                 CF.CDTIPOPRAT = C.CDTIPOPRAT));
         END IF;
         /*INSERE NA CONFIGURACAO DO DESTINO TODOS OS GRUPOS DE PRATO DA ORIGEM QUE EXISTE NO DESTINO E ESTA ASSOCIADO PARA A MESMA COLUNA*/
         INSERT INTO CONFCARDGRUPOPRATO(NRCONFCARDGRUPOPRATO, CDFILIAL, CDSERVFILI, NRSEQCNFCARD, NRGRUPOPRATOSERV, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
         (SELECT RETORNA_NOVO_CODIGO('CONFCARDGRUPOPRATO', 1), C.CDFILIAL, C.CDSERVFILI, C.NRSEQCNFCARD, GS1.NRGRUPOPRATOSERV, C.NRORG, SYSDATE, P_CDOPERADOR
            FROM CONFCARD C INNER JOIN CONFCARD C2 ON C2.CDFILIAL = P_CDFILIAL AND C2.CDSERVFILI = P_CDSERVFILI AND C2.NRORDCNFCARD = C.NRORDCNFCARD AND C2.CDTIPOPRAT = C.CDTIPOPRAT
                            INNER JOIN CONFCARDGRUPOPRATO CF2 ON CF2.CDFILIAL = C2.CDFILIAL AND CF2.CDSERVFILI = C2.CDSERVFILI AND CF2.NRSEQCNFCARD = C2.NRSEQCNFCARD
                            INNER JOIN GRUPOPRATOSERV GS2 ON GS2.NRGRUPOPRATOSERV = CF2.NRGRUPOPRATOSERV
                            INNER JOIN GRUPOPRATO G2 ON G2.NRGRUPOPRATO = GS2.NRGRUPOPRATO
                            INNER JOIN GRUPOPRATO G1 ON G1.CDFILIAL = C.CDFILIAL AND G1.CDGRUPOPRATO = G2.CDGRUPOPRATO AND G1.IDTIPORESTRICAO = P_IDTIPORESTRICAO
                            INNER JOIN GRUPOPRATOSERV GS1 ON GS1.CDSERVFILI = C.CDSERVFILI AND GS1.NRGRUPOPRATO = G1.NRGRUPOPRATO
           WHERE C.CDFILIAL = C_DEST.CDFILIAL AND
                 C.CDSERVFILI = C_DEST.CDSERVFILI AND
                 NOT EXISTS (SELECT NRCONFCARDGRUPOPRATO
                               FROM CONFCARDGRUPOPRATO V
                              WHERE V.CDFILIAL = C.CDFILIAL AND
                                    V.CDSERVFILI = C.CDSERVFILI AND
                                    V.NRSEQCNFCARD = C.NRSEQCNFCARD AND
                                    V.NRGRUPOPRATOSERV = GS1.NRGRUPOPRATOSERV));
      END LOOP;
   END IF;

   /*EXPORTACAO DE REGRAS DE RESTRICAO DE REPETICAO*/
   IF P_TABELA = 'REGRARESTREPET' THEN
      /*PERCORRE CADA SERVICO QUE POSSUI ALGUMA CONFIGURACAO IGUAO AO ORIGEM*/
      FOR C_DEST IN (SELECT SUBSTR(CDLISTA, 1,4) AS CDFILIAL, SUBSTR(CDLISTA, 5,5) AS CDSERVFILI, L.NRORG
                       FROM LISTA L 
                      WHERE L.NRLISTA = P_NRLISTAFILISERV
      ) LOOP
         IF P_IDOPCAO = 'SOBREPOR' THEN
            DELETE 
              FROM REGRARESTREPET
             WHERE CDFILIAL = C_DEST.CDFILIAL AND
                   CDSERVFILI = C_DEST.CDSERVFILI;

            FOR C_REGRA IN(SELECT NRREGRARESTREPET, NMREGRARESTREPET, NRORG
                             FROM REGRARESTREPET 
                            WHERE CDFILIAL = P_CDFILIAL AND
                                  CDSERVFILI = P_CDSERVFILI
            )LOOP
               NOVO_CODIGO('REGRARESTREPET', V_NRLISTA);
               INSERT INTO REGRARESTREPET (NRREGRARESTREPET, NMREGRARESTREPET, CDFILIAL, CDSERVFILI, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
               VALUES(V_NRLISTA, C_REGRA.NMREGRARESTREPET, C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_DEST.NRORG, SYSDATE, P_CDOPERADOR);

               INSERT INTO RESTRICAOTPPRAT (NRRESTRICAOTPPRAT, NRREGRARESTREPET, CDTIPOPRAT, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
               (SELECT RETORNA_NOVO_CODIGO('RESTRICAOTPPRAT', 1), V_NRLISTA, CDTIPOPRAT, NRORG, SYSDATE, P_CDOPERADOR
                  FROM RESTRICAOTPPRAT
                 WHERE NRREGRARESTREPET = C_REGRA.NRREGRARESTREPET);

               INSERT INTO RESTRICAOINGRED (NRRESTRICAOINGRED, NRREGRARESTREPET, NRINGREDIENTEPRINC, IDINGREDIENTE1, IDINGREDIENTE2, NRORG, DTINCLUSAO, CDOPERINCLUSAO, IDMESMODIA, IDDIASEGUIDO)
               (SELECT RETORNA_NOVO_CODIGO('RESTRICAOINGRED', 1), V_NRLISTA, NRINGREDIENTEPRINC, IDINGREDIENTE1, IDINGREDIENTE2, NRORG, SYSDATE, P_CDOPERADOR, IDMESMODIA, IDDIASEGUIDO
                  FROM RESTRICAOINGRED 
                 WHERE NRREGRARESTREPET = C_REGRA.NRREGRARESTREPET);
            END LOOP;
         END IF;
      END LOOP;
   END IF;

   /*EXPORTACAO DE GRUPO DE PRATO PARA OUTROS SERVICOS/FILIAIS - OBS: TBM LEVA OS PRATOS*/
   IF P_TABELA = 'GRUPOPRATO' THEN
       SELECT MAX(CDNVPRATO)
         INTO V_CDNVPRATO
         FROM PRATO;
      /*GUARDA COD DO GRUPO NA FILIAL SERVICO E AGRUPAMENTO DE ORIGEM*/
      FOR C_GRUPO IN (SELECT G.CDGRUPOPRATO, GS.NRGRUPOPRATOSERV, GS.NRAGRUPGRPRAT
                        FROM GRUPOPRATOSERV GS INNER JOIN LISTA L ON L.CDLISTA = GS.NRGRUPOPRATOSERV
                                               INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO AND G.IDTIPORESTRICAO = P_IDTIPORESTRICAO
                       WHERE L.NRLISTA = P_NRLISTAITEM
      )LOOP
         /*PERCORRE CADA SERVICO DESTINO*/
         FOR C_DEST IN (SELECT SUBSTR(CDLISTA, 1,4) AS CDFILIAL, SUBSTR(CDLISTA, 5,5) AS CDSERVFILI
                          FROM LISTA L 
                         WHERE L.NRLISTA = P_NRLISTAFILISERV
         ) LOOP
            /*PRATOS LOCAIS QUE NAO EXISTEM NA UNIDADE DESTINO COMO LOCAL OU COMO PADRAO VAO PARA O LOG DE ERRO E NAO EXPORTAM*/
            FOR C_ERROS IN (SELECT I.CDPRATO, I.CDFILAUXPRAT, P.NMPRATO, P.NRORG, 1 AS TIPOERRO
                              FROM ITGRUPOPRATOSERV I INNER JOIN PRATO P ON P.CDFILAUXPRAT = I.CDFILAUXPRAT AND P.CDPRATO = I.CDPRATO
                             WHERE I.NRGRUPOPRATOSERV = C_GRUPO.NRGRUPOPRATOSERV AND I.CDFILAUXPRAT = P_CDFILIAL AND
                                   NOT EXISTS (SELECT P2.CDPRATO
                                                 FROM PRATO P2 
                                                WHERE (P2.CDFILAUXPRAT = 'P' OR P2.CDFILAUXPRAT = C_DEST.CDFILIAL) AND
                                                      P2.CDPRATO = P.CDPRATO AND P2.NMPRATO = P.NMPRATO)
                            UNION ALL
                            SELECT I.CDPRATO, I.CDFILAUXPRAT, P.NMPRATO, P.NRORG, 2 AS TIPOERRO
                              FROM ITGRUPOPRATOSERV I INNER JOIN PRATO P ON P.CDFILAUXPRAT = I.CDFILAUXPRAT AND P.CDPRATO = I.CDPRATO
                             WHERE I.NRGRUPOPRATOSERV = C_GRUPO.NRGRUPOPRATOSERV AND
                                   EXISTS (SELECT IT2.CDPRATO
                                             FROM ITGRUPOPRATOSERV IT2 INNER JOIN GRUPOPRATOSERV GS2 ON GS2.NRGRUPOPRATOSERV = IT2.NRGRUPOPRATOSERV
                                                                       INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS2.NRGRUPOPRATO
                                            WHERE IT2.CDFILAUXPRAT = I.CDFILAUXPRAT AND
                                                  IT2.CDPRATO = I.CDPRATO AND
                                                  GS2.CDSERVFILI = C_DEST.CDSERVFILI AND
                                                  G.CDFILIAL = C_DEST.CDFILIAL AND
                                                  G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND
                                                  G.CDGRUPOPRATO <> C_GRUPO.CDGRUPOPRATO
                                            )
            )LOOP
               /*INSERE NA TABELA DE ERROS*/
               V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_ERROS.CDPRATO);
               V_MENSAGEM := MSG('CONSISTE_PRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_ERROS.CDPRATO||' - '||C_ERROS.NMPRATO ||CASE WHEN C_ERROS.TIPOERRO = 2 THEN ' - JA ASSOCIADO A OUTRO GRUPO DE PRATO NO SERVICO DESTINO' ELSE '' END);
               INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_ERROS.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
            END LOOP; 
  
            /*VERIFICA SE O GRUPO EXISTE NA FILIAL/SERVICO DESTINO*/         
            BEGIN
            SELECT G.NRGRUPOPRATO, GS.NRGRUPOPRATOSERV, GS.NRAGRUPGRPRAT
              INTO V_NRGRUPOPRATO_D, V_NRGRUPOPRATOSERV_D, V_NRAGRUPGRPRAT_D
              FROM GRUPOPRATO G LEFT JOIN GRUPOPRATOSERV GS ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO AND GS.CDSERVFILI = C_DEST.CDSERVFILI
             WHERE G.CDGRUPOPRATO = C_GRUPO.CDGRUPOPRATO AND
                   G.CDFILIAL = C_DEST.CDFILIAL AND
                   G.IDTIPORESTRICAO = P_IDTIPORESTRICAO;
            EXCEPTION
             WHEN NO_DATA_FOUND THEN
             V_NRGRUPOPRATO_D := NULL;
             V_NRGRUPOPRATOSERV_D := NULL;
             V_NRAGRUPGRPRAT_D := NULL;
            END;

            /*SE SOBREPOR, APAGA OS PRATOS DO GRUPO DE PRATO NO SERVICO DE DESTINO*/
            IF P_IDOPCAO = 'SOBREPOR' THEN
               DELETE 
                 FROM ITGRUPOPRATOSERV 
                WHERE NRGRUPOPRATOSERV = V_NRGRUPOPRATOSERV_D;
            END IF;

            /*SE O GRUPO DE PRATO NAO EXISTE NA FILIAL DE DESTINO ENTAO INSERE*/
            IF V_NRGRUPOPRATO_D IS NULL THEN
               NOVO_CODIGO('GRUPOPRATO', V_NRLISTA);
               INSERT INTO GRUPOPRATO(NRGRUPOPRATO, CDFILIAL, CDGRUPOPRATO, NMGRUPOPRATO, NRORG, DTINCLUSAO, CDOPERINCLUSAO, IDTIPORESTRICAO)
               (SELECT V_NRLISTA, C_DEST.CDFILIAL, CDGRUPOPRATO, NMGRUPOPRATO, NRORG, SYSDATE, P_CDOPERADOR, IDTIPORESTRICAO
                  FROM GRUPOPRATO 
                 WHERE CDGRUPOPRATO = C_GRUPO.CDGRUPOPRATO AND IDTIPORESTRICAO = P_IDTIPORESTRICAO AND CDFILIAL = P_CDFILIAL);
            END IF;
            /*SE O GRUPO DE PRATO NAO EXISTE NO SERVICO DE DESTINO ENTAO INSERE*/
            IF V_NRGRUPOPRATOSERV_D IS NULL THEN
               NOVO_CODIGO('GRUPOPRATOSERV', V_NRLISTA_S);
               INSERT INTO GRUPOPRATOSERV(NRGRUPOPRATOSERV, NRGRUPOPRATO, NRAGRUPGRPRAT, CDSERVFILI, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
               (SELECT V_NRLISTA_S, NVL(V_NRGRUPOPRATO_D,V_NRLISTA), NRAGRUPGRPRAT, C_DEST.CDSERVFILI, NRORG, SYSDATE, P_CDOPERADOR
                  FROM GRUPOPRATOSERV
                 WHERE NRGRUPOPRATOSERV = C_GRUPO.NRGRUPOPRATOSERV);
            ELSE
               UPDATE GRUPOPRATOSERV 
                  SET NRAGRUPGRPRAT = C_GRUPO.NRAGRUPGRPRAT
                WHERE NRGRUPOPRATOSERV = V_NRGRUPOPRATOSERV_D;
            END IF;

            /*INSERE OS PRATOS NO GRUPO DE PRATO DE DESTINO*/
            INSERT INTO ITGRUPOPRATOSERV (NRITGRUPOPRATOSERV, NRGRUPOPRATOSERV, CDFILAUXPRAT, CDPRATO, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
            (SELECT RETORNA_NOVO_CODIGO('ITGRUPOPRATOSERV', 1), NVL(V_NRGRUPOPRATOSERV_D, V_NRLISTA_S), P2.CDFILAUXPRAT, P2.CDPRATO, IT.NRORG, SYSDATE, P_CDOPERADOR
               FROM ITGRUPOPRATOSERV IT INNER JOIN PRATO P ON P.CDFILAUXPRAT = IT.CDFILAUXPRAT AND P.CDPRATO = IT.CDPRATO
                                        INNER JOIN (SELECT MIN(CDFILAUXPRAT) AS CDFILAUXPRAT, CDPRATO, NMPRATO
                                                      FROM PRATO P
                                                     WHERE (CDFILAUXPRAT = 'P' OR CDFILAUXPRAT = C_DEST.CDFILIAL) AND P.IDATIVO = 'S' AND CDNVPRATO = V_CDNVPRATO
                                                    GROUP BY CDPRATO, NMPRATO) P2 ON P2.CDPRATO = P.CDPRATO AND P2.NMPRATO = P.NMPRATO
              WHERE IT.NRGRUPOPRATOSERV = C_GRUPO.NRGRUPOPRATOSERV AND
                    NOT EXISTS(SELECT I2.CDPRATO
                                 FROM ITGRUPOPRATOSERV I2 INNER JOIN GRUPOPRATOSERV GS ON I2.NRGRUPOPRATOSERV = GS.NRGRUPOPRATOSERV
                                                          INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                WHERE I2.CDPRATO = P2.CDPRATO AND
                                      I2.CDFILAUXPRAT = P2.CDFILAUXPRAT AND
                                      GS.CDSERVFILI = C_DEST.CDSERVFILI AND
                                      G.CDFILIAL = C_DEST.CDFILIAL AND
                                      G.IDTIPORESTRICAO = P_IDTIPORESTRICAO)
              );
         END LOOP;
      END LOOP;   
   END IF;

   /*EXPORTACAO DOS PRATOS DO GRUPO DE PRATO ORIGEM PARA DESTINOS - SE FOR PARA OUTRO GRUPO NO MESMO SERVICO ENTAO IRA EXCLUIR NO SERVICO ORIGEM*/
   IF P_TABELA = 'ITGRUPOPRATO' THEN
      SELECT MAX(CDNVPRATO)
        INTO V_CDNVPRATO
        FROM PRATO;   
      V_MESMOSERV := 'N';
      /*PERCORRE CADA SERVICO DESTINO SE NA LISTA TEM A MESMA UNIDADE E SERVICO ENTAO EXPORTA ELE POR ULTIMO PARA EXCLUIR DO ORIGEM*/
      FOR C_DEST IN (SELECT SUBSTR(CDLISTA, 1,4) AS CDFILIAL, SUBSTR(CDLISTA, 5,5) AS CDSERVFILI, CASE WHEN CDLISTA = P_CDFILIAL||P_CDSERVFILI THEN 1 ELSE 0 END AS ORDEM
                       FROM LISTA L 
                      WHERE L.NRLISTA = P_NRLISTAFILISERV
                     ORDER BY ORDEM ASC 
      ) LOOP
         /*VERIFICA SE EXISTE EXPORTACAO PARA OUTRO GRUPO DO MESMO SERVICO, SE EXISTIR ENTAO ELE OBRIGATORIAMENTE EXCLUIRA OS PRATOS NO SERVICO/GRUPO ORIGEM*/
         IF C_DEST.ORDEM = 1 THEN
            V_MESMOSERV := 'S';
         ELSE
            V_MESMOSERV := 'N';
         END IF;
         /*PRATOS LOCAIS QUE NAO EXISTEM NA UNIDADE DESTINO COMO LOCAL OU COMO PADRAO VAO PARA O LOG DE ERRO E NAO EXPORTAM*/
         FOR C_ERROS IN (SELECT I.CDPRATO, I.CDFILAUXPRAT, P.NMPRATO, P.NRORG, 1 AS TIPOERRO
                           FROM ITGRUPOPRATOSERV I INNER JOIN LISTA L ON L.NRLISTA = P_NRLISTAITEM AND L.CDLISTA = I.NRITGRUPOPRATOSERV
                                                   INNER JOIN PRATO P ON P.CDFILAUXPRAT = I.CDFILAUXPRAT AND P.CDPRATO = I.CDPRATO
                          WHERE I.CDFILAUXPRAT = P_CDFILIAL AND
                                NOT EXISTS (SELECT P2.CDPRATO
                                              FROM PRATO P2 
                                             WHERE (P2.CDFILAUXPRAT = 'P' OR P2.CDFILAUXPRAT = C_DEST.CDFILIAL) AND
                                                   P2.CDPRATO = P.CDPRATO AND P2.NMPRATO = P.NMPRATO)
                         UNION ALL
                         SELECT I.CDPRATO, I.CDFILAUXPRAT, P.NMPRATO, P.NRORG, 2 AS TIPOERRO
                           FROM ITGRUPOPRATOSERV I INNER JOIN LISTA L ON L.NRLISTA = P_NRLISTAITEM AND L.CDLISTA = I.NRITGRUPOPRATOSERV
                                                   INNER JOIN GRUPOPRATOSERV GS ON GS.NRGRUPOPRATOSERV = I.NRGRUPOPRATOSERV
                                                   INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                                   INNER JOIN PRATO P ON P.CDFILAUXPRAT = I.CDFILAUXPRAT AND P.CDPRATO = I.CDPRATO
                          WHERE EXISTS (SELECT IT2.CDPRATO
                                          FROM ITGRUPOPRATOSERV IT2 INNER JOIN GRUPOPRATOSERV GS2 ON GS2.NRGRUPOPRATOSERV = IT2.NRGRUPOPRATOSERV
                                                                    INNER JOIN GRUPOPRATO G2 ON G2.NRGRUPOPRATO = GS2.NRGRUPOPRATO
                                         WHERE IT2.CDFILAUXPRAT = I.CDFILAUXPRAT AND
                                               IT2.CDPRATO = I.CDPRATO AND
                                               GS2.CDSERVFILI = C_DEST.CDSERVFILI AND
                                               G2.CDFILIAL = C_DEST.CDFILIAL AND
                                               G2.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND
                                               G2.CDGRUPOPRATO <> G.CDGRUPOPRATO
                                         )
         )LOOP
            /*INSERE NA TABELA DE ERROS*/
            V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_ERROS.CDPRATO);
            V_MENSAGEM := MSG('CONSISTE_PRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_ERROS.CDPRATO||' - '||C_ERROS.NMPRATO||CASE WHEN C_ERROS.TIPOERRO = 2 THEN ' - JA ASSOCIADO A OUTRO GRUPO DE PRATO NO SERVICO DESTINO' ELSE '' END);
            INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_ERROS.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
         END LOOP;

         /*VERIFICA SE O GRUPO DE PRATO SELECIONADO EXISTE NO DESTINO*/
         BEGIN
         SELECT G.NRGRUPOPRATO, GS.NRGRUPOPRATOSERV
           INTO V_NRGRUPOPRATO_D, V_NRGRUPOPRATOSERV_D
           FROM GRUPOPRATO G LEFT JOIN GRUPOPRATOSERV GS ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO AND GS.CDSERVFILI = C_DEST.CDSERVFILI
          WHERE G.CDGRUPOPRATO = P_CDGRUPOPRATODEST AND
                G.CDFILIAL = C_DEST.CDFILIAL AND
                G.IDTIPORESTRICAO = P_IDTIPORESTRICAO;
         EXCEPTION 
            WHEN NO_DATA_FOUND THEN
               V_NRGRUPOPRATO_D := NULL;
               V_NRGRUPOPRATOSERV_D := NULL;
            END;

         /*SE SOBREPOR, APAGA OS PRATOS DO GRUPO DE PRATO NO SERVICO DE DESTINO*/
         IF P_IDOPCAO = 'SOBREPOR' THEN
            DELETE 
              FROM ITGRUPOPRATOSERV 
             WHERE NRGRUPOPRATOSERV = V_NRGRUPOPRATOSERV_D;
         END IF;

         /*SE O GRUPO DE PRATO NAO EXISTE NA FILIAL DE DESTINO ENTAO INSERE A PARTIR DO PADRAO DE GRUPO DE PRATO INFORMADO*/
         IF V_NRGRUPOPRATO_D IS NULL THEN
            NOVO_CODIGO('GRUPOPRATO', V_NRLISTA);
            INSERT INTO GRUPOPRATO(NRGRUPOPRATO, CDFILIAL, CDGRUPOPRATO, NMGRUPOPRATO, NRORG, DTINCLUSAO, CDOPERINCLUSAO, IDTIPORESTRICAO)
            (SELECT V_NRLISTA, C_DEST.CDFILIAL, CDPADGRUPOPRATO, NMPADGRUPOPRATO, NRORG, SYSDATE, P_CDOPERADOR, IDTIPORESTRICAO
               FROM PADGRUPOPRATO 
              WHERE CDPADGRUPOPRATO = P_CDGRUPOPRATODEST AND IDTIPORESTRICAO = P_IDTIPORESTRICAO);
         END IF;
         /*SE O GRUPO DE PRATO NAO EXISTE NO SERVICO DE DESTINO ENTAO INSERE*/
         IF V_NRGRUPOPRATOSERV_D IS NULL THEN
            NOVO_CODIGO('GRUPOPRATOSERV', V_NRLISTA_S);
            INSERT INTO GRUPOPRATOSERV(NRGRUPOPRATOSERV, NRGRUPOPRATO, NRAGRUPGRPRAT, CDSERVFILI, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
            (SELECT V_NRLISTA_S, NVL(V_NRGRUPOPRATO_D,V_NRLISTA), NRAGRUPGRPRAT, C_DEST.CDSERVFILI, NRORG, SYSDATE, P_CDOPERADOR
               FROM GRUPOPRATOSERV
              WHERE NRGRUPOPRATOSERV = (SELECT MAX(NRGRUPOPRATOSERV)
                                          FROM ITGRUPOPRATOSERV IT INNER JOIN LISTA L ON L.NRLISTA = P_NRLISTAITEM AND IT.NRITGRUPOPRATOSERV = L.CDLISTA));
         END IF;

         /*INSERE OS PRATOS NO GRUPO DE PRATO DE DESTINO*/
         INSERT INTO ITGRUPOPRATOSERV (NRITGRUPOPRATOSERV, NRGRUPOPRATOSERV, CDFILAUXPRAT, CDPRATO, NRORG, DTINCLUSAO, CDOPERINCLUSAO)
         (SELECT RETORNA_NOVO_CODIGO('ITGRUPOPRATOSERV', 1), NVL(V_NRGRUPOPRATOSERV_D, V_NRLISTA_S), P2.CDFILAUXPRAT, P2.CDPRATO, IT.NRORG, SYSDATE, P_CDOPERADOR
            FROM ITGRUPOPRATOSERV IT INNER JOIN LISTA L ON L.NRLISTA = P_NRLISTAITEM AND L.CDLISTA = IT.NRITGRUPOPRATOSERV
                                     INNER JOIN GRUPOPRATOSERV GS ON GS.NRGRUPOPRATOSERV = IT.NRGRUPOPRATOSERV
                                     INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                     INNER JOIN PRATO P ON P.CDFILAUXPRAT = IT.CDFILAUXPRAT AND P.CDPRATO = IT.CDPRATO
                                     INNER JOIN (SELECT MIN(CDFILAUXPRAT) AS CDFILAUXPRAT, CDPRATO, NMPRATO
                                                   FROM PRATO P
                                                  WHERE (CDFILAUXPRAT = 'P' OR CDFILAUXPRAT = C_DEST.CDFILIAL) AND P.IDATIVO = 'S' AND CDNVPRATO = V_CDNVPRATO
                                                 GROUP BY CDPRATO, NMPRATO) P2 ON P2.CDPRATO = P.CDPRATO AND P2.NMPRATO = P.NMPRATO
           WHERE NOT EXISTS(SELECT I2.CDPRATO
                              FROM ITGRUPOPRATOSERV I2 INNER JOIN GRUPOPRATOSERV GS2 ON GS2.NRGRUPOPRATOSERV = I2.NRGRUPOPRATOSERV
                                                       INNER JOIN GRUPOPRATO G2 ON G2.NRGRUPOPRATO = GS2.NRGRUPOPRATO
                             WHERE I2.CDPRATO = P2.CDPRATO AND
                                   I2.CDFILAUXPRAT = P2.CDFILAUXPRAT AND
                                   GS2.CDSERVFILI = C_DEST.CDSERVFILI AND
                                   G2.CDFILIAL = C_DEST.CDFILIAL AND
                                   G2.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND
                                   G2.CDGRUPOPRATO <> G.CDGRUPOPRATO)
         );     
      END LOOP;
      IF V_MESMOSERV = 'S' OR P_IDEXCLUIORGIEM = 'S' THEN
         DELETE 
           FROM ITGRUPOPRATOSERV
          WHERE NRITGRUPOPRATOSERV IN (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTAITEM);        
      END IF;
   END IF;

   /*EXPORTACAO DE COMBINACAO DE PRATOS*/
   IF P_TABELA = 'COMBGRUPOPRATO' THEN
      /*PERCORRE CADA SERVICO DESTINO A EXPORTAR*/
      FOR C_DEST IN (SELECT SUBSTR(CDLISTA, 1,4) AS CDFILIAL, SUBSTR(CDLISTA, 5,5) AS CDSERVFILI
                       FROM LISTA L 
                      WHERE L.NRLISTA = P_NRLISTAFILISERV
      ) LOOP
         /*SE A OPCAO E SOBREPOR ENTAO DELETA NO DESTINO OS CADASTROS DE COMBINACAO*/
         IF P_IDOPCAO = 'SOBREPOR' THEN
            DELETE 
              FROM COMBGRUPOTPPRAT
             WHERE CDFILIAL = C_DEST.CDFILIAL AND
                   CDSERVFILI = C_DEST.CDSERVFILI;   
         END IF;
         /*PARA CADA SERVICO DESTINO PERCORRE TODOS OS ITENS CADASTRADOS BUSCANDO SUAS INFORMACOES PARA EXPORTACAO*/
         FOR C_COMB IN (SELECT C.NRORG, C.CDGRTIPOPR, C.CDFILAUXPRAT, C.CDPRATO, P1.NMPRATO, C.NRGRUPOPRATOSERV, G1.CDGRUPOPRATO, G1.NMGRUPOPRATO,
                               IT.CDGRTIPOPR AS CDGRTIPOPR_IT, IT.CDFILAUXPRAT AS CDFILAUXPRAT_IT, IT.CDPRATO AS CDPRATO_IT, P2.NMPRATO AS NMPRATO_IT, IT.IDCOMBINACAO, IT.PERCENTREDUCAO, IT.NRGRUPOPRATOSERV AS NRGRUPOPRATOSERV_IT, 
                               G2.CDGRUPOPRATO AS CDGRUPOPRATO_IT, G2.NMGRUPOPRATO AS NMGRUPOPRATO_IT, IT.CDTIPOPRAT
                          FROM ITCOMBGRUPOTPPRAT IT INNER JOIN COMBGRUPOTPPRAT C ON IT.NRCOMBGRUPOTPPRAT = C.NRCOMBGRUPOTPPRAT
                          LEFT JOIN PRATO P1 ON P1.CDFILAUXPRAT = C.CDFILAUXPRAT AND P1.CDPRATO = C.CDPRATO
                          LEFT JOIN PRATO P2 ON P2.CDFILAUXPRAT = IT.CDFILAUXPRAT AND P2.CDPRATO = IT.CDPRATO
                          LEFT JOIN (SELECT GS.NRGRUPOPRATOSERV, G.NMGRUPOPRATO, G.CDGRUPOPRATO
                                       FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON GS.NRGRUPOPRATO = G.NRGRUPOPRATO
                                      WHERE G.CDFILIAL = P_CDFILIAL AND G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND GS.CDSERVFILI = P_CDSERVFILI) G1 ON G1.NRGRUPOPRATOSERV = C.NRGRUPOPRATOSERV
                          LEFT JOIN (SELECT GS.NRGRUPOPRATOSERV, G.NMGRUPOPRATO, G.CDGRUPOPRATO
                                       FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON GS.NRGRUPOPRATO = G.NRGRUPOPRATO
                                      WHERE G.CDFILIAL = P_CDFILIAL AND G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND GS.CDSERVFILI = P_CDSERVFILI) G2 ON G2.NRGRUPOPRATOSERV = IT.NRGRUPOPRATOSERV
                         WHERE C.CDFILIAL = P_CDFILIAL AND
                               C.CDSERVFILI = P_CDSERVFILI 
         )LOOP
            V_IMPORTA := 'S';
            V_PRATO_1 := 'P';
            V_PRATO_2 := 'P';
            V_NRGRUPOPRATOSERV_1 := NULL;
            V_NRGRUPOPRATOSERV_2 := NULL;
            /*SE O PRATO COMB E LOCAL E NAO EXISTE NO DESTINO NAO IMPORTA*/
            IF(C_COMB.CDFILAUXPRAT = P_CDFILIAL) THEN
               SELECT MAX(CDFILAUXPRAT)
                 INTO V_PRATO_1
                 FROM PRATO 
                WHERE CDPRATO = C_COMB.CDPRATO AND (CDFILAUXPRAT = 'P' OR CDFILAUXPRAT = C_DEST.CDFILIAL);
               IF V_PRATO_1 IS NULL THEN
                  V_IMPORTA := 'N';
                  /*INSERE NA TABELA DE ERROS*/
                  V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_COMB.CDPRATO);
                  V_MENSAGEM := MSG('CONSISTE_PRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_COMB.CDPRATO||' - '||C_COMB.NMPRATO);
                  INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_COMB.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
               END IF;
            END IF;
            
            /*SE O PRATO ITCOMB E LOCAL E NAO EXISTE NO DESTINO NAO IMPORTA*/
            IF(C_COMB.CDFILAUXPRAT_IT = P_CDFILIAL) THEN
               SELECT MAX(CDFILAUXPRAT)
                 INTO V_PRATO_2
                 FROM PRATO 
                WHERE CDPRATO = C_COMB.CDPRATO_IT AND (CDFILAUXPRAT = 'P' OR CDFILAUXPRAT = C_DEST.CDFILIAL);
               IF V_PRATO_2 IS NULL THEN
                  V_IMPORTA := 'N';
                  /*INSERE NA TABELA DE ERROS*/
                  V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_COMB.CDPRATO_IT);
                  V_MENSAGEM := MSG('CONSISTE_PRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_COMB.CDPRATO_IT||' - '||C_COMB.NMPRATO_IT);
                  INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_COMB.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
               END IF;
            END IF;
            /*SE O GRUPO DE PRATO COMB NAO EXISTE NO DESTINO NAO IMPORTA*/
            IF C_COMB.NRGRUPOPRATOSERV IS NOT NULL THEN
               SELECT MAX(GS.NRGRUPOPRATOSERV)
                 INTO V_NRGRUPOPRATOSERV_1
                 FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                WHERE GS.CDSERVFILI = C_DEST.CDSERVFILI AND
                      G.CDFILIAL = C_DEST.CDFILIAL AND 
                      G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND
                      G.CDGRUPOPRATO = (SELECT G.CDGRUPOPRATO
                                          FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                         WHERE GS.NRGRUPOPRATOSERV = C_COMB.NRGRUPOPRATOSERV);
               IF V_NRGRUPOPRATOSERV_1 IS NULL THEN
                  V_IMPORTA := 'N';
                  /*INSERE NA TABELA DE ERROS*/
                  V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_COMB.CDGRUPOPRATO);
                  V_MENSAGEM := MSG('CONSISTE_GRUPOPRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_COMB.CDGRUPOPRATO||' - '||C_COMB.NMGRUPOPRATO);
                  INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_COMB.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
               END IF;
            END IF;
            /*SE O GRUPO DE PRATO ITCOMB NAO EXISTE NO DESTINO NAO IMPORTA*/
            IF C_COMB.NRGRUPOPRATOSERV_IT IS NOT NULL THEN
               SELECT MAX(GS.NRGRUPOPRATOSERV)
                 INTO V_NRGRUPOPRATOSERV_2
                 FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                WHERE GS.CDSERVFILI = C_DEST.CDSERVFILI AND
                      G.CDFILIAL = C_DEST.CDFILIAL AND 
                      G.IDTIPORESTRICAO = P_IDTIPORESTRICAO AND
                      G.CDGRUPOPRATO = (SELECT G.CDGRUPOPRATO
                                          FROM GRUPOPRATOSERV GS INNER JOIN GRUPOPRATO G ON G.NRGRUPOPRATO = GS.NRGRUPOPRATO
                                         WHERE GS.NRGRUPOPRATOSERV = C_COMB.NRGRUPOPRATOSERV_IT);
               IF V_NRGRUPOPRATOSERV_2 IS NULL THEN
                  V_IMPORTA := 'N';
                  /*INSERE NA TABELA DE ERROS*/
                  V_CDCHAVE := (C_DEST.CDFILIAL||'|'||C_DEST.CDSERVFILI||'|'||C_COMB.CDGRUPOPRATO_IT);
                  V_MENSAGEM := MSG('CONSISTE_GRUPOPRATO',C_DEST.CDFILIAL, C_DEST.CDSERVFILI, C_COMB.CDGRUPOPRATO_IT||' - '||C_COMB.NMGRUPOPRATO_IT);
                  INSERE_LISTA_ERROS(C_DEST.CDFILIAL,V_MENSAGEM,P_CDOPERADOR, C_COMB.NRORG, V_LISTA_ERROS, NULL, V_CDCHAVE);
               END IF;
            END IF;
            IF V_IMPORTA = 'S' THEN
               SELECT COUNT(*)
                 INTO V_COUNT
                 FROM ITCOMBGRUPOTPPRAT IT INNER JOIN COMBGRUPOTPPRAT C ON IT.NRCOMBGRUPOTPPRAT = C.NRCOMBGRUPOTPPRAT
                WHERE NVL(C.CDPRATO,'0') = NVL(C_COMB.CDPRATO,'0') AND NVL(C.NRGRUPOPRATOSERV,-1) = NVL(V_NRGRUPOPRATOSERV_1,-1) AND
                      NVL(IT.CDPRATO,'0') = NVL(C_COMB.CDPRATO_IT,'0') AND NVL(IT.NRGRUPOPRATOSERV,-1) = NVL(V_NRGRUPOPRATOSERV_2,-1) AND
                      C.CDFILIAL = C_DEST.CDFILIAL AND C.CDSERVFILI = C_DEST.CDSERVFILI;
               IF V_COUNT = 0 THEN
                  NOVO_CODIGO('COMBGRUPOTPPRAT', V_NRLISTA);
                  INSERT INTO COMBGRUPOTPPRAT (NRCOMBGRUPOTPPRAT, CDGRTIPOPR, CDFILAUXPRAT, CDPRATO, DTINCLUSAO, CDOPERINCLUSAO, CDFILIAL, CDSERVFILI, NRGRUPOPRATOSERV)
                  VALUES (V_NRLISTA, C_COMB.CDGRTIPOPR, CASE WHEN C_DEST.CDFILIAL = P_CDFILIAL THEN C_COMB.CDFILAUXPRAT ELSE V_PRATO_1 END, C_COMB.CDPRATO, SYSDATE, P_CDOPERADOR, C_DEST.CDFILIAL, C_DEST.CDSERVFILI, V_NRGRUPOPRATOSERV_1);
                  
                  NOVO_CODIGO('ITCOMBGRUPOTPPRAT', V_NRLISTA_S);
                  INSERT INTO ITCOMBGRUPOTPPRAT(NRITCOMBGRUPOTPPRAT, NRCOMBGRUPOTPPRAT, CDGRTIPOPR, CDFILAUXPRAT, CDPRATO, IDCOMBINACAO, DTINCLUSAO, CDOPERINCLUSAO, PERCENTREDUCAO, NRGRUPOPRATOSERV, CDTIPOPRAT)
                  VALUES(V_NRLISTA_S, V_NRLISTA, C_COMB.CDGRTIPOPR_IT, CASE WHEN C_DEST.CDFILIAL = P_CDFILIAL THEN C_COMB.CDFILAUXPRAT_IT ELSE V_PRATO_2 END, C_COMB.CDPRATO_IT, C_COMB.IDCOMBINACAO, SYSDATE, P_CDOPERADOR, C_COMB.PERCENTREDUCAO,
                  V_NRGRUPOPRATOSERV_2, C_COMB.CDTIPOPRAT);
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   COMMIT;
   P_LISTA_ERROS := V_LISTA_ERROS;
END;
/