create or replace 
PROCEDURE FUNDIR_PARCNEGOCIO_CRM
(P_PARCNEGORIGEM  IN VARCHAR2,
 P_PARCNEGDESTINO IN NUMBER,
 P_NRORG IN NUMBER,
 P_CDOPERULTATU IN VARCHAR2,
 P_RETORNO OUT VARCHAR2,
 P_RETORNOERRO OUT VARCHAR2)
 
 AS
 V_ERRO1 VARCHAR2(250);	-- Variavel criada para concatenar os parceiros de negócio que possuem orçamento.
 V_ERRO2 VARCHAR2(250); -- Variavel criada para concatenar os parceiros de negócio que possuem registro na tabela PARCERIA com o tipo 'CLIENTE'.
 V_CONTADORERRO1 NUMBER; -- Contador usado no select count da tabela FCT_ORCAMENTO
 V_CONTADORERRO2 NUMBER; -- Contador usado no select count da tabela de PARCERIA
 V_CDPROSPECTDEST VARCHAR2(21); -- Variavel que recebe o código do prospect de destino.
 V_CDPROSPECTORI VARCHAR2(21); -- Variavel que recebe o código do prospect de origem.
 V_CDINTEPROS VARCHAR2(2); -- Variavel que recebe o código do interlocudor do prospect a ser inserido.
 V_NRCANDIDATOORI NUMBER; -- Variavel que recebe o código do lead de origem.
 V_NRCANDIDATODEST NUMBER; -- Variavel que recebe o código do lead de destino.
 
BEGIN
  V_ERRO1 := '"ERR01":[null'; -- O formato da concatenação é para o uso da função json_decode em php.
  V_ERRO2 := '"ERR02":[null'; -- O formato da concatenação é para o uso da função json_decode em php.
  
	FOR VALIDA_ROTINA IN(
      SELECT NRPARCNEGOCIO 
        FROM PARCNEGOCIO 
       WHERE NRORG = P_NRORG
         AND (INSTR(P_PARCNEGORIGEM, '_'||NRPARCNEGOCIO||'_')>0))LOOP
	    BEGIN
			    SELECT COUNT(*) -- Count na tabela de Orçamento para verificar se o parceiro de negócio possui algum orçamento.
			      INTO V_CONTADORERRO1
            FROM FCT_ORCAMENTO
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
          EXCEPTION 
            WHEN NO_DATA_FOUND THEN
              V_CONTADORERRO1 := 0;
		  END;
		  IF(V_CONTADORERRO1>0) THEN
			    V_ERRO1 := V_ERRO1||','||VALIDA_ROTINA.NRPARCNEGOCIO; -- Concatena os parceiros encontrados na tabela de Orçamento.
		  END IF;
		
		  BEGIN
			    SELECT COUNT(*) -- Count na tabela de Parceria para verificar se o parceiro de negócio possui algum registro com o tipo 'CLIENTE' e 'FORNECEDOR'.
            INTO V_CONTADORERRO2
            FROM PARCERIA
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO
             AND CDTIPOPARCEIRO IN ('CLIENTE','FORNECEDOR');
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              V_CONTADORERRO2 := 0;
		  END;
      IF(V_CONTADORERRO2>0) THEN
          V_ERRO2 := V_ERRO2||','||VALIDA_ROTINA.NRPARCNEGOCIO; -- Concatena os parceiros encontrados na tabela de Parceria, que possuem registros do tipo 'CLIENTE'.
      END IF;
		
      IF((V_CONTADORERRO1=0)AND(V_CONTADORERRO2=0)) THEN -- Se os dois contadores forem iguais a zero então o parceiro de negócio não tem nenhuma restrição que o impede de ser fundido.
			    UPDATE CONTATO -- Executa o update na tabela CONTATO substituindo o parceiro de negócio de origem pelo parceiro de negócio de destino, além da atualização dos campos de Audit.
             SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
		 
          UPDATE CRM_OPORTUNI -- Executa o update na tabela CRM_OPORTUNI substituindo o parceiro de negócio de origem pelo parceiro de negócio de destino, além da atualização dos campos de Audit..
             SET NRPARCOPORT = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCOPORT = VALIDA_ROTINA.NRPARCNEGOCIO;
		 
          UPDATE FILACONTATO -- Executa o update na tabela FILACONTATO substituindo o parceiro de negócio de origem pelo parceiro de negócio de destino, além da atualização dos campos de Audit..
             SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
	
          UPDATE PLANOCUPACAO -- Executa o update na tabela PLANOCUPACAO substituindo o parceiro de negócio de origem pelo parceiro de negócio de destino, além da atualização dos campos de Audit..
             SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
		
          BEGIN -- Verifica se o parceiro de destino possui registro na tabela de prospect, se não tiver a variavel do prospect de destino recebe NULL
              SELECT CDPROSPECT 
                INTO V_CDPROSPECTORI
                FROM PROSPECT 
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  V_CDPROSPECTORI := NULL;
          END;  
				
          BEGIN -- Verifica se o parceiro de origem possui registro na tabela de prospect, se não tiver a variavel do prospect de origem recebe NULL
              SELECT CDPROSPECT 
                INTO V_CDPROSPECTDEST
                FROM PROSPECT 
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = P_PARCNEGDESTINO;
              EXCEPTION   
                WHEN NO_DATA_FOUND THEN
                  V_CDPROSPECTDEST := NULL;
          END;             
					
          IF ((V_CDPROSPECTORI IS NOT NULL) AND (V_CDPROSPECTDEST IS NOT NULL)) THEN -- Verifica se as duas variaveis são nulas, se não forem então os interlocutores do prospect de destino são copiados para o prospect de destino, além da atualização dos campos de Audit.
              FOR C_INTEPROSP IN(
                  SELECT * 
                    FROM INTEPROSP 
                   WHERE NRORG = P_NRORG
                     AND CDPROSPECT = V_CDPROSPECTORI)	LOOP
                  BEGIN
                      SELECT NVL(MAX(TO_NUMBER(CDINTEPROS)),0)+1
                        INTO V_CDINTEPROS
                        FROM INTEPROSP
                       WHERE NRORG = P_NRORG
                         AND CDPROSPECT = V_CDPROSPECTDEST;
                  END;
                
                  INSERT INTO INTEPROSP 
                  (CDPROSPECT, CDINTEPROS, CDPAIS, SGESTADO, CDMUNICIPIO, 
                   IDTPINTEPROS, NMINTEPROS, DSCARGINPROS, DTNASCINPROS, NRTEL1INPROS, 
                   NRRAM1INPROS, NRTEL2INPROS, NRRAM2INPROS, NRFAXINPROS, IDENDEINPROS, 
                   DSENDEINPROS, NMBAIRINPROS, NRCEPINPROS, DSEMAILIPROS, IDSTINTEPROS, 
                   NRCELULINPRO, NRTELREINPRO, DTULTATUINTP, CDCARGOINTERLOC, NRORG, 
                   DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, 
                   CDOPERULTATU, NRRELACIONAPARC, DSCARACINPROS, IDINPROSRECPRES, IDATIVO)
                  VALUES 
                  (V_CDPROSPECTDEST, V_CDINTEPROS, C_INTEPROSP.CDPAIS, C_INTEPROSP.SGESTADO, C_INTEPROSP.CDMUNICIPIO, 
                   C_INTEPROSP.IDTPINTEPROS, C_INTEPROSP.NMINTEPROS, C_INTEPROSP.DSCARGINPROS, C_INTEPROSP.DTNASCINPROS, C_INTEPROSP.NRTEL1INPROS, 
                   C_INTEPROSP.NRRAM1INPROS, C_INTEPROSP.NRTEL2INPROS, C_INTEPROSP.NRRAM2INPROS, C_INTEPROSP.NRFAXINPROS, C_INTEPROSP.IDENDEINPROS, 
                   C_INTEPROSP.DSENDEINPROS, C_INTEPROSP.NMBAIRINPROS, C_INTEPROSP.NRCEPINPROS, C_INTEPROSP.DSEMAILIPROS, C_INTEPROSP.IDSTINTEPROS, 
                   C_INTEPROSP.NRCELULINPRO, C_INTEPROSP.NRTELREINPRO, C_INTEPROSP.DTULTATUINTP, C_INTEPROSP.CDCARGOINTERLOC, C_INTEPROSP.NRORG, 
                   C_INTEPROSP.DTINCLUSAO, SYSDATE, C_INTEPROSP.NRORGINCLUSAO, C_INTEPROSP.CDOPERINCLUSAO, P_NRORG, 
                   P_CDOPERULTATU, C_INTEPROSP.NRRELACIONAPARC, C_INTEPROSP.DSCARACINPROS, C_INTEPROSP.IDINPROSRECPRES, C_INTEPROSP.IDATIVO);
              END LOOP;
          
              UPDATE ENDEPROSPECT -- Executa o update na tabela ENDEPROSPECT substituindo o campo de IDATIVO, além da atualização dos campos de Audit.
                 SET IDATIVO = 'N', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
               WHERE NRORG = P_NRORG
                 AND CDPROSPECT = V_CDPROSPECTORI;
                 
              UPDATE PROSPECT -- Executa o update na tabela PROSPECT substituindo os campos de IDATIVO e IDPARCFUNDIDO, além da atualização dos campos de Audit.
                 SET IDATIVO = 'N', IDPARCFUNDIDO = 'S', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
		
          ELSIF ((V_CDPROSPECTORI IS NOT NULL) AND (V_CDPROSPECTDEST IS NULL)) THEN -- Verifica se o prospect de destino é nulo e se o prospect de origem não é nulo, caso seja verdade então o prospect do parceiro de origem é updatado para receber o NRPARCNEGOCIO do parceiro de destino, além da atualização dos campos de Audit.
             UPDATE PROSPECT -- Executa o update na tabela PROSPECT substituindo o campo de NRPARCNEGOCIO pelo parceiro de destino, além da atualização dos campos de Audit.
                SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
              WHERE NRORG = P_NRORG
                AND CDPROSPECT = V_CDPROSPECTORI;
                
             UPDATE PARCNEGOCIO -- Executa o update na tabela PARCNEGOCIO substituindo o campo de CDTIPOPARCPRINCIPAL para 'PROSPECT' parceiro de destino se o registro for do tipo principal 'CANDIDATO', além da atualização dos campos de Audit.
                SET CDTIPOPARCPRINCIPAL = 'PROSPECT', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
              WHERE NRORG = P_NRORG
                AND CDTIPOPARCPRINCIPAL = 'CANDIDATO'
                AND NRPARCNEGOCIO = P_PARCNEGDESTINO;
                
          END IF;
    
          FOR C_PARCERIA IN(
              SELECT PARC.NRPARCERIA
                  FROM PARCERIA PARC
                 WHERE NRORG = P_NRORG
                   AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO
                   AND NOT EXISTS 
                       (SELECT CDTIPOPARCEIRO
                          FROM PARCERIA
                         WHERE NRORG = P_NRORG
                           AND NRPARCNEGOCIO = P_PARCNEGDESTINO
                           AND CDTIPOPARCEIRO = PARC.CDTIPOPARCEIRO))LOOP
    
              UPDATE PARCERIA -- Executa o update na tabela PARCERIA, substituindo o parceiro de negocio de origem pelo parceiro de negocio de destino, nas parcerias que o parceiro de destino não possui.
                 SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
               WHERE NRORG = P_NRORG
                 AND NRPARCERIA = C_PARCERIA.NRPARCERIA;
          END LOOP;
          BEGIN -- Verifica se o parceiro de destino possui registro na tabela de lead, se não tiver a variavel do lead de origem recebe NULL
              SELECT NRCANDIDATO 
                INTO V_NRCANDIDATOORI
                FROM CRM_CANDIDATO 
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  V_NRCANDIDATOORI := NULL;
          END;  
				
          BEGIN -- Verifica se o parceiro de origem possui registro na tabela de lead, se não tiver a variavel do destino de origem recebe NULL
              SELECT NRCANDIDATO 
                INTO V_NRCANDIDATODEST
                FROM CRM_CANDIDATO 
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = P_PARCNEGDESTINO;
              EXCEPTION   
                WHEN NO_DATA_FOUND THEN
                  V_NRCANDIDATODEST := NULL;
          END; 
          
          IF ((V_NRCANDIDATOORI IS NOT NULL) AND (V_NRCANDIDATODEST IS NULL)) THEN -- Verifica se o lead de destino é nulo e se o lead de origem não é nulo, caso seja verdade então o lead do parceiro de origem é updatado para receber o NRPARCNEGOCIO do parceiro de destino, além da atualização dos campos de Audit.
              UPDATE CRM_CANDIDATO
                 SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;             
          ELSE
              UPDATE CRM_CANDIDATO -- Executa o update na tabela CRM_CANDIDATO substituindo os campos de IDATIVO e IDPARCFUNDIDO, além da atualização dos campos de Audit.
                 SET IDATIVO = 'N', IDPARCFUNDIDO = 'S', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
               WHERE NRORG = P_NRORG
                 AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
          END IF;
          
          UPDATE RELACIONAPARC -- Executa o update na tabela RELACIONAPARC substituindo o parceiro de negócio de origem pelo parceiro de negócio de destino, além da atualização dos campos de Audit.
             SET NRPARCNEGOCIO = P_PARCNEGDESTINO, CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
			 
          UPDATE ENDERECOPARC -- Executa o update na tabela ENDERECOPARC substituindo o campo de IDATIVO, além da atualização dos campos de Audit.
             SET IDATIVO = 'N', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;

          UPDATE PARCNEGOCIO -- Executa o update na tabela PARCNEGOCIO substituindo os campos de IDATIVO e IDPARCFUNDIDO, além da atualização dos campos de Audit.
             SET IDATIVO = 'N', IDPARCFUNDIDO = 'S', CDOPERULTATU = P_CDOPERULTATU, DTULTATU = SYSDATE, NRORGULTATU = P_NRORG
           WHERE NRORG = P_NRORG
             AND NRPARCNEGOCIO = VALIDA_ROTINA.NRPARCNEGOCIO;
          
          P_RETORNO := 'OK'; -- Valor de sucesso das fusões que deram certo.
		  END IF;
	END LOOP;
	V_ERRO1 := V_ERRO1||']'; -- No final da rotina é fechado com colchetes a variavel de V_ERRO1
	V_ERRO2 := V_ERRO2||']'; -- No final da rotina é fechado com colchetes a variavel de V_ERRO2
	P_RETORNOERRO := '{'||V_ERRO1||','||V_ERRO2||'}'; -- COncatenação das duas variaveis de erro de forma a ser tratada em php pela função json_decode
END;