CREATE OR replace PROCEDURE Desfundir_parcnegocio_crm ( 
p_parcnovodest    IN VARCHAR2, 
p_parcatual       IN NUMBER, 
p_strdescendentes IN VARCHAR2, 
p_nrorg           IN NUMBER, 
p_cdoperador      IN VARCHAR2) 
AS 
  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_cdprospnovodest VARCHAR2(21); 
  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 
    SAVEPOINT inicio; 

    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_cdprospnovodest 
        FROM   prospect 
        WHERE  nrorg = p_nrorg 
               AND nrparcnegocio = p_parcnovodest; 
    EXCEPTION 
        WHEN no_data_found THEN 
          v_cdprospectori := NULL; 
    END;
    
    UPDATE PARCNEGOCIO
       SET IDATIVO = 'S',
           IDPARCFUNDIDO = 'N',
           DTULTATU = SYSDATE,
           CDOPERULTATU = p_cdoperador
    WHERE NRPARCNEGOCIO = p_parcnovodest
      AND NRORG = p_nrorg;

    IF( v_cdprospnovodest IS NOT NULL ) THEN 
      UPDATE endeprospect 
      -- Executa o update na tabela ENDEPROSPECT substituindo o campo de IDATIVO, além da atualização dos campos de Audit.
      SET    idativo = 'S', 
             cdoperultatu = p_cdoperador, 
             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 = 'S', 
             idparcfundido = 'N', 
             cdoperultatu = p_cdoperador, 
             dtultatu = SYSDATE, 
             nrorgultatu = p_nrorg 
      WHERE  nrorg = p_nrorg 
             AND nrparcnegocio = p_parcnovodest; 
    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 = 'S', 
             idparcfundido = 'N', 
             cdoperultatu = p_cdoperador, 
             dtultatu = SYSDATE, 
             nrorgultatu = p_nrorg 
      WHERE  nrorg = p_nrorg 
             AND nrparcnegocio = p_parcnovodest; 
    END IF; 

    FOR parcadesfundir IN(SELECT nrparcnegocio 
                          FROM   parcnegocio 
                          WHERE  nrorg = p_nrorg 
                                 AND ( Instr(p_strdescendentes, '_' 
                                                                ||nrparcnegocio 
                                                                ||'_') > 0 )) 
    LOOP 
        UPDATE contato 
        SET    nrparcnegocio = p_parcnovodest, 
               cdoperultatu = p_cdoperador, 
               dtultatu = SYSDATE, 
               nrorgultatu = p_nrorg 
        WHERE  nrorg = p_nrorg 
               AND nrparcnegocio = p_parcatual 
               AND nrparcorigem = parcadesfundir.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_parcnovodest, 
               cdoperultatu = p_cdoperador, 
               dtultatu = SYSDATE, 
               nrorgultatu = p_nrorg 
        WHERE  nrorg = p_nrorg 
               AND nrparcoport = p_parcatual 
               AND nrparcorigem = parcadesfundir.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_parcnovodest, 
               cdoperultatu = p_cdoperador, 
               dtultatu = SYSDATE, 
               nrorgultatu = p_nrorg 
        WHERE  nrorg = p_nrorg 
               AND nrparcnegocio = p_parcatual 
               AND nrparcorigem = parcadesfundir.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_parcnovodest, 
               cdoperultatu = p_cdoperador, 
               dtultatu = SYSDATE, 
               nrorgultatu = p_nrorg 
        WHERE  nrorg = p_nrorg 
               AND nrparcnegocio = p_parcatual 
               AND nrparcorigem = parcadesfundir.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 = parcadesfundir.nrparcnegocio 
                   AND idativo = 'S'; 
        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_parcatual 
                   AND idativo = 'S'; 
        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.
          UPDATE inteprosp 
          SET    idativo = 'N' 
          -- Desativa os interlocutores copiados do parceiro de origem 
          WHERE  nrorg = p_nrorg 
                 AND cdprosp_origem = v_cdprospectori 
                 AND cdprospect = v_cdprospectdest; 
        END IF; 
    END LOOP; 
EXCEPTION 
  WHEN OTHERS THEN 
             ROLLBACK; 

             RAISE; 
END;