CREATE OR REPLACE PROCEDURE FCT_COPIA_VERSIONA_CONTRATO (
    P_NRSEQCONTRATO        IN INTEGER,
    P_TIPO                 IN VARCHAR2,
    P_OPERADOR             IN VARCHAR2,
    P_NRORG                IN INTEGER,
    P_NRSEQCONTRATO_GERADO OUT INTEGER,
    P_ADICONARAGRUP        IN VARCHAR2 DEFAULT 'N',
    P_IDPARCELACONSIDERADA IN VARCHAR2 DEFAULT NULL,
    P_IDREPLICARNEGOCIACAO IN VARCHAR2 DEFAULT 'N',
    P_DTRENEGOCIACONT      IN DATE DEFAULT SYSDATE)
  AS

    V_NEW_NRSEQCONTRATO      NUMBER;
    V_NEW_NRSEQREFEORCCONT   NUMBER;
    V_NEW_NRSEQFATUCONTR     NUMBER;
    V_NEW_NRITEMOCONTRATO    NUMBER;
    V_NEW_NRITEMOCONTRATOAD  NUMBER;
    V_NEW_NRSEQFATUITCONT    NUMBER;
    V_NEW_NRSEQCONTDOC       NUMBER;
    V_NEW_NRSEQREAJUS        NUMBER;
    V_NEW_NRSEQINDCONTR      NUMBER;
    V_NEW_NRRELACESTRUTCONT  NUMBER;
    V_NRCONTRATOFCT          VARCHAR2(30);
    V_PROPOSTA               NUMBER;
    V_REFEORCCONT            NUMBER;
    V_NRRELACFORMACAOCONT    FCT_RELACFORMACAOCONT.NRRELACFORMACAOCONT%TYPE;
    V_NRCALCFORMPRECSERV     FCT_CALCFORMPRECSERV_ITCONT.NRCALCFORMPRECSERV%TYPE;
    V_NRFORMPRECOSERVICO     FCT_RELACFORMACAOCONT.NRFORMPRECOSERVICO%TYPE;
    V_REFERENCIA             FCT_CALCFORMPRECSERV_ITCONT.DSREFECALCULO%TYPE;
    V_IDITEMCALCULOPAI       FCT_CALCFORMPRECSERV_ITCONT.IDITEMCALCULO%TYPE;
    V_PAI                    FCT_CALCFORMPRECSERV_ITCONT.NRCALCFORMPRECSERV%TYPE;
    V_NRAGENDPENDENTE        FCT_AGENDPENDENTE.NRAGENDPENDENTE%TYPE;
    V_IDSITUACAOCONTRATO     FCT_CONTRATO.IDSITUACAOCONTRATO%TYPE;
    V_NRAGRUPAMENTO          FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_NRAGRUPAMENTOCONT      FCT_RELACAGRUPAMENTOCONT.NRAGRUPAMENTOCONT%TYPE;
    V_NRNEGOCIACAOCONTRATO   FCT_NEGOCIACAOCONTRATO.NRNEGOCIACAOCONTRATO%TYPE;
    V_NRITNEGOCIACAOCONTRATO FCT_ITNEGOCIACAOCONTRATO.NRITNEGOCIACAOCONTRATO%TYPE;
    V_NRPARCELANEGOCONT      FCT_PARCELANEGOCONT.NRPARCELANEGOCONT%TYPE;
    V_NRDESCPERIODONEGOCONT  FCT_DESCPERIODONEGOCONT.NRDESCPERIODONEGOCONT%TYPE;
    V_NRCOMPETENCIANEGOCONT  FCT_COMPETENCIANEGOCONT.NRCOMPETENCIANEGOCONT%TYPE;
    V_NRTRABSERVCONT         FCT_TRABSERVCONTRATO.NRTRABSERVCONT%TYPE;
    V_NRMEDIDACONTRATO       FCT_RELACMEDIDACONTRATO.NRMEDIDACONTRATO%TYPE;
    V_NRCOMPSERVCONT         FCT_COMPSERVCONTRATO.NRCOMPSERVCONT%TYPE;
    V_NRTIPOORCAMENTO        FCT_TIPOORCAMENTO.NRTIPOORCAMENTO%TYPE;
    V_COUNTDOCRENEGOCIACAO   NUMBER;
    V_INDICESPADRCONTR       NUMBER;
    V_DSALTERACONTRATUAIS    FCT_CONTRATO.DSALTERACONTRATUAIS%TYPE;
    V_DTINIVIGENCONT         DATE;
    V_GERAFATCONTANTIGO      BOOLEAN;

    V_NRASSDIGITALCONTR FCT_ASSINATDIGITALCONTR.NRASSDIGITALCONTR%TYPE;
    V_NRSEQMODCONTRA    FCT_CONTRATO.NRSEQMODCONTRA%TYPE;
    V_NRINSCRICAOPARC   PARCNEGOCIO.NRINSCRICAOPARC%TYPE;

    V_NRMEDICAOFATURA    FCT_MEDICAOFATURA.NRMEDICAOFATURA%TYPE;
    V_NRFATURACONT       FCT_FATURACONT.NRFATURACONT%TYPE;
    V_IDSITUACAOPARC     VARCHAR2(1);
    V_IDSITUACAOPARCMED  VARCHAR2(1);
    V_DTINICOMPET        DATE;
    V_DTFINCOMPET        DATE;

    V_NRNEGCONTRATO VARCHAR2(20);
    V_NRPARCELASNEGCONTR VARCHAR2(20);

    V_NRRELOPERNOTIFASSELE FCT_RELACOPERNOTIFASSELE.NRRELOPERNOTIFASSELE%TYPE;

BEGIN
    /*P_TIPO: V -> Versionamento / C - Copia */
    /* P_IDPARCELACONSIDERADA: parametro para saber se, para o periodo de faturamento atual, 
    deixa valendo a parcela do contrato anterior ou a do contrato novo. So e utilizado se 
    o escopo de faturamento tiver o campo "Tipo de cclculo para parcelas incompletas" = "Integral"
    NULL = contrato calcula as parcelas de modo proporcional
    '1' = calcula de modo integral - considera a parcela do contrato novo
    '2' = calcula de modo integral - considera a parcela do contrato velho */

    /* 1 - Realiza a copia do Contrato */

    /*Gera novo codigo de Contrato*/
    NOVO_CODIGO_NT('FCT_CONTRATO', V_NEW_NRSEQCONTRATO, 1, P_NRORG);
    P_NRSEQCONTRATO_GERADO := V_NEW_NRSEQCONTRATO;
    /* Insere a cypia do contrato.
       - Sempre sery incluso com a situayyo "P" (PENDENTE)
       - Se for um versionamento: A rotina incrementa a versyo e insere a ligayyo do sequencial do contrato pai
       - Se for uma cypia: A versyo y sempre 1, as datas de inicio e fim do contrato seguem de acordo com a data atual
         e as datas de inycio e fim e prazo de vigyncia syo "NULL".
    */

    INSERT INTO FCT_CONTRATO(NRSEQCONTRATO, IDTPCONTRATO, NRCONTRATOFCT, NRVERSAOCONTRATO, CDFILIALORCA, NRSEQMODCONTRA,
                             NRPARCNEGOCIO, DSREFERENCIACONT, DTINICIOCONTRATO, DTFIMCONTRATO, NRDIASPRAZOCONT, NRDIAVENPARCFAT,
                             CDINDFINCONT, CDTPINDFINCON, IDPERVALFINCON, DTPADREAJCONT, DTPADRPRORGCONT, NRDIASPRORGCONT,
                             QTPOSTOTRABCONT, IDORIGCONTRATO, DTRECISAOCONTR, IDSITUACAOCONTRATO, CDFILIALFATURA, DSOBSERVACAOCONT,
                             NRSEQCONTRATOPAI, CDSEQCONTRATO, IDQTDIASCOMPCON, NRQTDIASCOMPCON, IDTPCOMPETCONT, NRDIACOMPETCONT,
                             IDTPDTEMISSNF, NRDIADTEMISSNF, IDTPDTVENC, IDTPREAJUSTE, IDTPMESREAJUSTE, NRQTDREAJUSTE,
                             IDSOMAFATUCONT, IDTPFATUINCOMP, DTINIVIGENCONT, DTFINVIGENCONT, IDBLOQSEMMEDIC, IDFATURACONTR,
                             CDMODPGTO, DTINICFATCONTR, CDMNEMCRIACAO, CDCENTCUST, NRPARCINTERLOCUTOR, QTPARCELASFATU,
                             NRDIAVENCPARCELASFATU, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, DTULTATU, NRORGULTATU,
                             CDOPERULTATU, IDATIVO, CDOPERRESPONSAVEL, NRTIPOORCAMENTO, IDRENOVACAOAUTOMATICA, IDREAJUSTEAUTOMATICO, NRDIASPRORGCONTRENOV, 
                             IDASSELETRDIGITAL, DSALTERACONTRATUAIS)
    SELECT V_NEW_NRSEQCONTRATO, IDTPCONTRATO, NRCONTRATOFCT, DECODE(P_TIPO, 'V', NRVERSAOCONTRATO+1,1), CDFILIALORCA,
           NRSEQMODCONTRA, NRPARCNEGOCIO, DSREFERENCIACONT, DECODE(P_TIPO, 'C', SYSDATE, P_DTRENEGOCIACONT),
           DECODE(P_TIPO, 'C',SYSDATE+NRDIASPRAZOCONT, DTFIMCONTRATO), NRDIASPRAZOCONT, NRDIAVENPARCFAT, CDINDFINCONT,
           CDTPINDFINCON, IDPERVALFINCON, DTPADREAJCONT, DTPADRPRORGCONT, DECODE(P_TIPO, 'C', NULL, TRUNC(DTFINVIGENCONT) - TRUNC(DTINIVIGENCONT) + 1),
           QTPOSTOTRABCONT, IDORIGCONTRATO, NULL, 'P', CDFILIALFATURA, DSOBSERVACAOCONT, DECODE(P_TIPO, 'V', NRSEQCONTRATO,NULL),
           CDSEQCONTRATO, IDQTDIASCOMPCON, NRQTDIASCOMPCON,IDTPCOMPETCONT, NRDIACOMPETCONT, IDTPDTEMISSNF, NRDIADTEMISSNF,
           IDTPDTVENC, IDTPREAJUSTE, IDTPMESREAJUSTE, NRQTDREAJUSTE, IDSOMAFATUCONT, IDTPFATUINCOMP,
           DECODE(P_TIPO, 'C', NULL, TRUNC(P_DTRENEGOCIACONT)), DECODE(P_TIPO, 'C', NULL, DTFINVIGENCONT), IDBLOQSEMMEDIC,
           IDFATURACONTR, CDMODPGTO, DTINICFATCONTR,CDMNEMCRIACAO, CDCENTCUST, NRPARCINTERLOCUTOR, QTPARCELASFATU,
           NRDIAVENCPARCELASFATU, P_NRORG, SYSDATE, P_NRORG, P_OPERADOR, NULL, NULL,
           NULL, 'S', CDOPERRESPONSAVEL, NRTIPOORCAMENTO, IDRENOVACAOAUTOMATICA, IDREAJUSTEAUTOMATICO, NRDIASPRORGCONTRENOV, 
           IDASSELETRDIGITAL, NULL
      FROM FCT_CONTRATO
     WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
       AND NRORG = P_NRORG;

    /* Gera mnemynico do novo Contrato e atualiza */
    CRIA_MNEMONICO(P_NRORG, 'C', V_NEW_NRSEQCONTRATO, V_NRCONTRATOFCT);

    /* Se for um versionamento, inativa o registro da versao anterior e gera o relacionamento com a proposta, caso exista.*/
    IF P_TIPO = 'V' THEN

        /* Quando e versionamento, copia o valor das alteracoes contratuais. */
        BEGIN
            SELECT DSALTERACONTRATUAIS
              INTO V_DSALTERACONTRATUAIS
              FROM FCT_CONTRATO
             WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRORG = P_NRORG; 
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
              V_DSALTERACONTRATUAIS := NULL; 
        END;

        UPDATE FCT_CONTRATO
           SET DSALTERACONTRATUAIS = V_DSALTERACONTRATUAIS
         WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
           AND NRORG = P_NRORG;

        /* Deleta as parcelas de Fatruamento */
        BEGIN
           SELECT IDSITUACAOCONTRATO, NRAGRUPAMENTO
           INTO V_IDSITUACAOCONTRATO, V_NRAGRUPAMENTO
           FROM FCT_CONTRATO CONT
           LEFT JOIN FCT_RELACAGRUPAMENTOCONT CONTAGRUP
              ON CONT.NRSEQCONTRATO = CONTAGRUP.NRSEQCONTRATO
              AND CONT.NRORG        = CONTAGRUP.NRORG
           WHERE CONT.NRSEQCONTRATO = P_NRSEQCONTRATO
              AND CONT.NRORG        = P_NRORG;
        EXCEPTION
           WHEN NO_DATA_FOUND THEN BEGIN
               V_IDSITUACAOCONTRATO := NULL;
               V_NRAGRUPAMENTO      := NULL;
           END;
        END;

        
        SELECT NVL(DTINIVIGENCONT, DTINICIOCONTRATO) AS DTINIVIGENCONT
             INTO V_DTINIVIGENCONT
             FROM FCT_CONTRATO
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
              AND NRORG         = P_NRORG;

        IF (V_IDSITUACAOCONTRATO = 'A') THEN

           V_GERAFATCONTANTIGO := TRUE;

           IF (P_IDPARCELACONSIDERADA IS NULL) THEN

              /* deleta o faturamento velho */
              FCT_CANC_VENCPREV_CONT(P_NRORG, P_NRSEQCONTRATO);

              /* deleta o faturamento novo */
              FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);

              IF (TRUNC(V_DTINIVIGENCONT) > TRUNC(P_DTRENEGOCIACONT-1)) THEN
                  UPDATE FCT_CONTRATO
                     SET DTFINVIGENCONT = TRUNC(V_DTINIVIGENCONT)
                   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                     AND NRORG         = P_NRORG;

                  V_GERAFATCONTANTIGO := FALSE;
              ELSE
                  UPDATE FCT_CONTRATO
                     SET DTFINVIGENCONT = TRUNC(P_DTRENEGOCIACONT-1)
                   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                     AND NRORG         = P_NRORG;
              END IF;

              UPDATE FCT_CONTRATO
                 SET DTINIVIGENCONT = TRUNC(P_DTRENEGOCIACONT)
               WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
                 AND NRORG         = P_NRORG;

              IF (V_GERAFATCONTANTIGO = TRUE) THEN
                  FCT_GERAR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG, P_OPERADOR);
              END IF;
              
           ELSE

              BEGIN
                  SELECT NRMEDICAOFATURA,
                         IDSITUACAO,
                         DTINICOMPET,
                         DTFINCOMPET
                    INTO V_NRMEDICAOFATURA,
                         V_IDSITUACAOPARCMED,
                         V_DTINICOMPET,
                         V_DTFINCOMPET
                    FROM FCT_MEDICAOFATURA
                   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                     AND NRORG         = P_NRORG
                     AND TRUNC(P_DTRENEGOCIACONT) BETWEEN TRUNC(DTINICOMPET) AND TRUNC(DTFINCOMPET);
              EXCEPTION WHEN NO_DATA_FOUND THEN
                  V_NRMEDICAOFATURA    := NULL;
                  V_IDSITUACAOPARCMED  := NULL;
                  V_DTINICOMPET        := NULL;
                  V_DTFINCOMPET        := NULL;
              END;

              IF (V_NRMEDICAOFATURA IS NULL) THEN

                 BEGIN
                    SELECT FAT.NRFATURACONT,
                           FAT.IDSITUACAO,
                           FAT.DTINICOMPET,
                           FAT.DTFINCOMPET
                      INTO V_NRFATURACONT,
                           V_IDSITUACAOPARC,
                           V_DTINICOMPET,
                           V_DTFINCOMPET
                      FROM FCT_FATURACONT FAT
                      JOIN FCT_RELACAGRUPCONTFAT REL
                        ON FAT.NRFATURACONT = REL.NRFATURACONT
                       AND FAT.NRORG        = REL.NRORG
                     WHERE REL.NRSEQCONTRATO = P_NRSEQCONTRATO
                       AND REL.NRORG         = P_NRORG
                       AND FAT.IDTPFATURA    IN ('A', 'X')
                       AND TRUNC(P_DTRENEGOCIACONT) BETWEEN TRUNC(FAT.DTINICOMPET) AND TRUNC(FAT.DTFINCOMPET);
                 EXCEPTION WHEN NO_DATA_FOUND THEN
                    V_NRFATURACONT   := NULL;
                    V_IDSITUACAOPARC := NULL;
                    V_DTINICOMPET    := NULL;
                    V_DTFINCOMPET    := NULL;
                 END;

              END IF;

              FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);


              IF (NVL(V_NRMEDICAOFATURA, V_NRFATURACONT) IS NOT NULL) THEN
              
                  IF (P_IDPARCELACONSIDERADA = '1') THEN /* considera a parcela do contrato novo */

                    IF (V_NRMEDICAOFATURA IS NULL) THEN

                       IF ((V_IDSITUACAOPARC = '1') OR (V_IDSITUACAOPARC = '5')) THEN

                          IF (TRUNC(V_DTINIVIGENCONT) > TRUNC(V_DTINICOMPET-1)) THEN
                              UPDATE FCT_CONTRATO
                                 SET DTFINVIGENCONT = TRUNC(V_DTINIVIGENCONT)
                               WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                 AND NRORG         = P_NRORG;

                              V_GERAFATCONTANTIGO := FALSE;
                          ELSE
                              UPDATE FCT_CONTRATO
                                 SET DTFINVIGENCONT = TRUNC(V_DTINICOMPET-1)
                               WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                 AND NRORG         = P_NRORG;
                          END IF;

                       ELSE

                          UPDATE FCT_CONTRATO
                             SET DTFINVIGENCONT = TRUNC(V_DTFINCOMPET)
                           WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                             AND NRORG         = P_NRORG;

                       END IF;

                       UPDATE FCT_CONTRATO
                          SET DTINIVIGENCONT = TRUNC(V_DTINICOMPET)
                        WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
                          AND NRORG         = P_NRORG;

                    ELSE

                       IF  (V_IDSITUACAOPARCMED <> '4') THEN

                          IF (TRUNC(V_DTINIVIGENCONT) > TRUNC(V_DTINICOMPET-1)) THEN
                              UPDATE FCT_CONTRATO
                                 SET DTFINVIGENCONT = TRUNC(V_DTINIVIGENCONT)
                               WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                 AND NRORG         = P_NRORG;

                              V_GERAFATCONTANTIGO := FALSE;
                          ELSE
                              UPDATE FCT_CONTRATO
                                 SET DTFINVIGENCONT = TRUNC(V_DTINICOMPET-1)
                               WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                 AND NRORG         = P_NRORG;
                          END IF;

                       ELSE

                          UPDATE FCT_CONTRATO
                             SET DTFINVIGENCONT = TRUNC(V_DTFINCOMPET)
                           WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                             AND NRORG         = P_NRORG;

                       END IF;

                       UPDATE FCT_CONTRATO
                          SET DTINIVIGENCONT = TRUNC(V_DTINICOMPET)
                        WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
                          AND NRORG         = P_NRORG;

                      /* Altera a situacao da parcela de atual para pendente caso a mesma ainda nao tenha gerado a parcela. */

                        UPDATE FCT_MEDICAOFATURA
                           SET IDSITUACAO = '1'
                         WHERE NRMEDICAOFATURA = V_NRMEDICAOFATURA
                           AND IDSITUACAO <> '4'
                           AND NRORG  = P_NRORG;

                      END IF;

                  ELSE /* P_IDPARCELACONSIDERADA = '2' = considera a parcela do contrato antigo */

                     UPDATE FCT_CONTRATO
                        SET DTFINVIGENCONT = TRUNC(V_DTFINCOMPET)
                      WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;

                     UPDATE FCT_CONTRATO
                        SET DTINIVIGENCONT = TRUNC(V_DTFINCOMPET+1)
                      WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;

                  END IF;

              ELSE

                 IF (TRUNC(V_DTINIVIGENCONT) > TRUNC(P_DTRENEGOCIACONT-1)) THEN
                     UPDATE FCT_CONTRATO
                        SET DTFINVIGENCONT = TRUNC(V_DTINIVIGENCONT)
                      WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;

                     V_GERAFATCONTANTIGO := FALSE;
                 ELSE
                     UPDATE FCT_CONTRATO
                        SET DTFINVIGENCONT = TRUNC(P_DTRENEGOCIACONT-1)
                      WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;
                 END IF;

                 UPDATE FCT_CONTRATO
                    SET DTINIVIGENCONT = TRUNC(P_DTRENEGOCIACONT)
                  WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
                    AND NRORG         = P_NRORG;

              END IF;

              IF (V_GERAFATCONTANTIGO = TRUE) THEN
                  FCT_GERAR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG, P_OPERADOR);
              END IF;

           END IF; --P_IDPARCELACONSIDERADA IS NULL

        END IF; --V_IDSITUACAOCONTRATO = 'A'


       /* Inativa o registro da versao anterior*/
        UPDATE FCT_CONTRATO
          SET IDATIVO            = 'N',
              IDSITUACAOCONTRATO = 'E',
              DTULTATU = SYSDATE,
              NRORGULTATU = P_NRORG,
              CDOPERULTATU = P_OPERADOR
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
          AND NRORG         = P_NRORG;


        BEGIN
            SELECT NRSEQREFEORCCONT, NRSEQORCAMENTO, NRTIPOORCAMENTO
              INTO V_REFEORCCONT, V_PROPOSTA, V_NRTIPOORCAMENTO
            FROM FCT_REFEORCACONT
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRORG        = P_NRORG
               AND ((IDATIVO    = 'S')
                OR (IDATIVO IS NULL));
        EXCEPTION
            WHEN NO_DATA_FOUND THEN BEGIN
                V_REFEORCCONT := NULL;
                V_PROPOSTA := NULL;
            END;
        END;

        /*Gera o relacionamento com a proposta, caso exista*/
        IF V_PROPOSTA IS NOT NULL THEN

            NOVO_CODIGO_NT('FCT_REFEORCACONT', V_NEW_NRSEQREFEORCCONT, 1, P_NRORG);

            INSERT INTO FCT_REFEORCACONT (NRSEQREFEORCCONT, NRSEQORCAMENTO, NRSEQCONTRATO, IDCONTRATIVO, NRORG,
                              DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU,
                              CDOPERULTATU, IDATIVO, NRTIPOORCAMENTO)
            VALUES (V_NEW_NRSEQREFEORCCONT, V_PROPOSTA, V_NEW_NRSEQCONTRATO, 'A', P_NRORG,
                    SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL,
                    NULL, 'S', V_NRTIPOORCAMENTO);

            /* Inativa o antigo relacionamento*/
            UPDATE FCT_REFEORCACONT
               SET IDATIVO = 'N',
                   IDCONTRATIVO = 'I',
                   DTULTATU = SYSDATE,
                   NRORGULTATU = P_NRORG,
                   CDOPERULTATU = P_OPERADOR
             WHERE NRSEQREFEORCCONT = V_REFEORCCONT
               AND NRORG   = P_NRORG;
        END IF;

        /* Copia parametrizao de Faturamento antiga, caso tenha */
        FOR C_PARAMFATC IN (
            SELECT NRSEQFATUCONTR, NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA,
                   IDSOMAFATUCONT, IDSOMAITGRUPFAT, IDGERANFPARC, IDBLOQVRMEDIC, NRORG, IDGERARATEIO, QTFRANQEVOLCONTR,
                   IDAPURAAPONTAMENTO
              FROM FCT_PARAMFATCONT
             WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRORG = P_NRORG
        ) LOOP

            NOVO_CODIGO_NT('NRSEQFATUCONTR', V_NEW_NRSEQFATUCONTR, 1, P_NRORG);

            INSERT INTO FCT_PARAMFATCONT(NRSEQFATUCONTR, NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA,
                             IDSOMAFATUCONT, IDSOMAITGRUPFAT, IDGERANFPARC, IDBLOQVRMEDIC, NRORG, IDATIVO, DTINCLUSAO,
                             NRORGINCLUSAO, CDOPERINCLUSAO,  IDGERARATEIO, QTFRANQEVOLCONTR, IDAPURAAPONTAMENTO)
                     VALUES (V_NEW_NRSEQFATUCONTR, V_NEW_NRSEQCONTRATO, C_PARAMFATC.CDPRODFATURA, C_PARAMFATC.CDFILIALFATURA, C_PARAMFATC.NRGRUPOFATURA, C_PARAMFATC.NRPARCFATURA,
                             C_PARAMFATC.IDSOMAFATUCONT, C_PARAMFATC.IDSOMAITGRUPFAT, C_PARAMFATC.IDGERANFPARC, C_PARAMFATC.IDBLOQVRMEDIC, P_NRORG, 'S', SYSDATE,
                             P_NRORG, P_OPERADOR,  C_PARAMFATC.IDGERARATEIO, C_PARAMFATC.QTFRANQEVOLCONTR, C_PARAMFATC.IDAPURAAPONTAMENTO);

        END LOOP; --C_PARAMFATC

        /* retira o contrato do agrupamento e adicona o novo no mesmo */
        IF(P_ADICONARAGRUP = 'S' AND V_NRAGRUPAMENTO IS NOT NULL) THEN
            NOVO_CODIGO_SC('FCT_RELACAGRUPAMENTOCONT', V_NRAGRUPAMENTOCONT, 1, P_NRORG);
            INSERT INTO FCT_RELACAGRUPAMENTOCONT(
                NRAGRUPAMENTOCONT, NRAGRUPAMENTO,  NRSEQCONTRATO, IDFATCONTJUNT,
                NRORG,             IDATIVO,        DTINCLUSAO,    DTULTATU,
                NRORGINCLUSAO,     CDOPERINCLUSAO, NRORGULTATU,   CDOPERULTATU
            ) VALUES (
                V_NRAGRUPAMENTOCONT, V_NRAGRUPAMENTO,  V_NEW_NRSEQCONTRATO, NULL,
                P_NRORG,             'S',              SYSDATE,             NULL,
                P_NRORG,             P_OPERADOR,       NULL,                NULL
            );

            DELETE
            FROM FCT_RELACAGRUPAMENTOCONT
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
             AND NRORG          = P_NRORG;
        END IF;

      /* Inativa o registro da versao anterior*/
        UPDATE FCT_CONTRATO
          SET IDATIVO            = 'N',
              IDSITUACAOCONTRATO = 'E',
              DTULTATU = SYSDATE,
              NRORGULTATU = P_NRORG,
              CDOPERULTATU = P_OPERADOR
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
          AND NRORG         = P_NRORG;

    END IF;

    FOR C_ESTRUT IN (SELECT NRRELACESTRUTCONT, NRESTRUTURAM, NRSEQCONTRATO, NRITEMOCONTRATO, NRORG, IDATIVO,
                          DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, VRITEMRATEIO, IDRELACESTRUTURA,
                          QTMEDIDARATEIO, VRPERCRATEIO
                     FROM FCT_RELACESTRUTURACONT
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                      AND NRITEMOCONTRATO IS NULL
                      AND NRORG = P_NRORG
    ) LOOP

        /* Gera novo cydigo de Parymetro de itens de Contrato */
        NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NEW_NRRELACESTRUTCONT, 1, P_NRORG);

        INSERT INTO FCT_RELACESTRUTURACONT (NRRELACESTRUTCONT, NRESTRUTURAM, NRSEQCONTRATO, NRITEMOCONTRATO, NRORG, IDATIVO,
                                            DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, VRITEMRATEIO, IDRELACESTRUTURA,
                                            QTMEDIDARATEIO, VRPERCRATEIO)
             VALUES (V_NEW_NRRELACESTRUTCONT, C_ESTRUT.NRESTRUTURAM, V_NEW_NRSEQCONTRATO, C_ESTRUT.NRITEMOCONTRATO, P_NRORG, 'S',
                     SYSDATE, P_NRORG, P_OPERADOR, ROUND(C_ESTRUT.VRITEMRATEIO, 2), C_ESTRUT.IDRELACESTRUTURA,
                     C_ESTRUT.QTMEDIDARATEIO, C_ESTRUT.VRPERCRATEIO);

    END LOOP;

    FOR C_INDPADRCONT IN (SELECT NRINDICESPADRCONTR, CDTPINDICE, IDPERVALOR, CDINDICE, NRPERCENTINDICE
                            FROM FCT_INDICESPADRCONTR
                           WHERE NRSEQCONTRATO =  P_NRSEQCONTRATO
                             AND NRORG = P_NRORG) LOOP

        NOVO_CODIGO_NT('FCT_INDICESPADRCONTR', V_INDICESPADRCONTR, 1);

        INSERT INTO FCT_INDICESPADRCONTR (NRINDICESPADRCONTR, NRSEQCONTRATO, CDTPINDICE, IDPERVALOR, CDINDICE, NRPERCENTINDICE,
                                          IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                VALUES (V_INDICESPADRCONTR, V_NEW_NRSEQCONTRATO, C_INDPADRCONT.CDTPINDICE, C_INDPADRCONT.IDPERVALOR, C_INDPADRCONT.CDINDICE, C_INDPADRCONT.NRPERCENTINDICE,
                        'S', P_NRORG, SYSDATE, P_NRORG, P_OPERADOR);

    END LOOP;

    /* 3 - Realiza a cypia dos itens do Contrato */

    FOR C_ITENS IN (SELECT NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODUTO, CDSERVORCA, SGUNIDADE, NMITEMCONTRATO,
                          QTITEMCONTRATO, CDPRECBASESERV, CDTPMEDIDASERV, QTMEDIDACONTR, IDFATURACONTR, CDMODPGTO,
                          NRGRUPOFATURA, QTTEMPOSERV, IDUNIDTEMPOSERV, IDITEMATIVO, VRUNITITEMCONT, VRTOTITEMCONT,
                          IDMULTMEDVRTOT, DTINICFATCONTR, IDADICITEMCONT, IDADICCOBRCONT, NRITEMCONTRATOPAI, IDBLOQSEMMEDIC,
                          IDFATURAITEM, IDTPDESCONTO, VRDESCONTO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, NRORG, IDATIVO,
                          DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU,
                          IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL,
                          QTMEDIDACALCULADA
                     FROM FCT_ITEMCONTRATO
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                      AND NRORG         = P_NRORG
                      AND NRITEMCONTRATOPAI IS NULL
    )LOOP

        /* Gera novo cydigo de Parymetro de itens de Contrato */
        NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NEW_NRITEMOCONTRATO, 1, P_NRORG);

        /* Insere a cypia dos itens de contrato. */
        INSERT INTO FCT_ITEMCONTRATO (NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODUTO, CDSERVORCA, SGUNIDADE, NMITEMCONTRATO,
                                      QTITEMCONTRATO, CDPRECBASESERV, CDTPMEDIDASERV, QTMEDIDACONTR, IDFATURACONTR, CDMODPGTO,
                                      NRGRUPOFATURA, QTTEMPOSERV, IDUNIDTEMPOSERV, IDITEMATIVO, VRUNITITEMCONT, VRTOTITEMCONT,
                                      IDMULTMEDVRTOT, DTINICFATCONTR, IDADICITEMCONT, IDADICCOBRCONT, NRITEMCONTRATOPAI, IDBLOQSEMMEDIC,
                                      IDFATURAITEM, IDTPDESCONTO, VRDESCONTO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, NRORG, IDATIVO,
                                      DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU,
                                      IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL, QTMEDIDACALCULADA)
        VALUES (V_NEW_NRITEMOCONTRATO, V_NEW_NRSEQCONTRATO, C_ITENS.CDPRODUTO, C_ITENS.CDSERVORCA, C_ITENS.SGUNIDADE, C_ITENS.NMITEMCONTRATO,
                ROUND(C_ITENS.QTITEMCONTRATO, 2), C_ITENS.CDPRECBASESERV, C_ITENS.CDTPMEDIDASERV, ROUND(C_ITENS.QTMEDIDACONTR, 2), C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO,
                C_ITENS.NRGRUPOFATURA, C_ITENS.QTTEMPOSERV, C_ITENS.IDUNIDTEMPOSERV, C_ITENS.IDITEMATIVO, ROUND(C_ITENS.VRUNITITEMCONT, 2), ROUND(C_ITENS.VRTOTITEMCONT, 2),
                C_ITENS.IDMULTMEDVRTOT, C_ITENS.DTINICFATCONTR, C_ITENS.IDADICITEMCONT, C_ITENS.IDADICCOBRCONT, C_ITENS.NRITEMCONTRATOPAI, C_ITENS.IDBLOQSEMMEDIC,
                C_ITENS.IDFATURAITEM, C_ITENS.IDTPDESCONTO, C_ITENS.VRDESCONTO, C_ITENS.QTPARCELASFATU, C_ITENS.NRDIAVENCPARCELASFATU, P_NRORG, 'S',
                SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL, C_ITENS.NRITEMOCONTRATO, C_ITENS.IDELEMENTO, C_ITENS.NMCONTRATUALITEMCONT,
                ROUND(C_ITENS.VRUNITITEMCONTTBLPRECO, 2), C_ITENS.CDTPMEDIDAVARIAVEL, ROUND(C_ITENS.QTMEDIDACALCULADA, 2));


        FOR C_PARAMFATITC IN (
            SELECT NRSEQFATUITCONT, NRSEQCONTRATO, NRITEMOCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA,
                   NRPARCFATURA, IDBLOQVRITMEDIC, NRORG, IDATIVO, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO
              FROM FCT_PARAMFATITCONT
             WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
               AND NRORG = P_NRORG
        ) LOOP

            NOVO_CODIGO_NT('NRSEQFATUITCONT', V_NEW_NRSEQFATUITCONT, 1, P_NRORG);

            INSERT INTO  FCT_PARAMFATITCONT (NRSEQFATUITCONT, NRSEQCONTRATO, NRITEMOCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA,
                                           NRPARCFATURA, IDBLOQVRITMEDIC, NRORG, IDATIVO, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
            VALUES (V_NEW_NRSEQFATUITCONT, V_NEW_NRSEQCONTRATO, V_NEW_NRITEMOCONTRATO, C_PARAMFATITC.CDPRODFATURA, C_PARAMFATITC.CDFILIALFATURA, C_PARAMFATITC.NRGRUPOFATURA,
                                           C_PARAMFATITC.NRPARCFATURA, C_PARAMFATITC.IDBLOQVRITMEDIC, P_NRORG, 'S', SYSDATE, P_NRORG, P_OPERADOR);

        END LOOP; --C_PARAMFATITC

        FOR C_ESTRUTITEM IN (SELECT NRRELACESTRUTCONT, NRESTRUTURAM, NRSEQCONTRATO, NRITEMOCONTRATO, NRORG, IDATIVO,
                          DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, VRITEMRATEIO, IDRELACESTRUTURA,
                          QTMEDIDARATEIO, VRPERCRATEIO
                     FROM FCT_RELACESTRUTURACONT
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                      AND NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
                      AND NRORG = P_NRORG
        ) LOOP

            /* Gera novo cydigo de Parymetro de itens de Contrato */
            NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NEW_NRRELACESTRUTCONT, 1, P_NRORG);

            INSERT INTO FCT_RELACESTRUTURACONT (NRRELACESTRUTCONT, NRESTRUTURAM, NRSEQCONTRATO, NRITEMOCONTRATO, NRORG, IDATIVO,
                                                DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO, VRITEMRATEIO, IDRELACESTRUTURA,
                                                QTMEDIDARATEIO, VRPERCRATEIO)
                VALUES (V_NEW_NRRELACESTRUTCONT, C_ESTRUTITEM.NRESTRUTURAM, V_NEW_NRSEQCONTRATO,V_NEW_NRITEMOCONTRATO, P_NRORG, 'S',
                        SYSDATE, P_NRORG, P_OPERADOR, ROUND(C_ESTRUTITEM.VRITEMRATEIO, 2), C_ESTRUTITEM.IDRELACESTRUTURA,
                        C_ESTRUTITEM.QTMEDIDARATEIO, C_ESTRUTITEM.VRPERCRATEIO);

        END LOOP;

        /* 3.1 - Realiza a cypia dos adicionais dos itens do Contrato */
        FOR C_ITENSAD IN (SELECT NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODUTO, CDSERVORCA, SGUNIDADE, NMITEMCONTRATO,
                              QTITEMCONTRATO, CDPRECBASESERV, CDTPMEDIDASERV, QTMEDIDACONTR, IDFATURACONTR, CDMODPGTO,
                              NRGRUPOFATURA, QTTEMPOSERV, IDUNIDTEMPOSERV, IDITEMATIVO, VRUNITITEMCONT, VRTOTITEMCONT,
                              IDMULTMEDVRTOT, DTINICFATCONTR, IDADICITEMCONT, IDADICCOBRCONT, NRITEMCONTRATOPAI, IDBLOQSEMMEDIC,
                              IDFATURAITEM, IDTPDESCONTO, VRDESCONTO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, NRORG, IDATIVO,
                              DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU,
                              IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL, QTMEDIDACALCULADA,
                              IDAPARECEPROPOSTA
                         FROM FCT_ITEMCONTRATO
                        WHERE NRSEQCONTRATO     = P_NRSEQCONTRATO
                          AND NRORG             = P_NRORG
                          AND NRITEMCONTRATOPAI = C_ITENS.NRITEMOCONTRATO
        )LOOP

            /* Gera novo cydigo de Parymetro de itens de Contrato */
            NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NEW_NRITEMOCONTRATOAD, 1, P_NRORG);

           /* Insere a cypia dos adicionais dos itens de contrato. */
            INSERT INTO FCT_ITEMCONTRATO (NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODUTO, CDSERVORCA, SGUNIDADE, NMITEMCONTRATO,
                                          QTITEMCONTRATO, CDPRECBASESERV, CDTPMEDIDASERV, QTMEDIDACONTR, IDFATURACONTR, CDMODPGTO,
                                          NRGRUPOFATURA, QTTEMPOSERV, IDUNIDTEMPOSERV, IDITEMATIVO, VRUNITITEMCONT, VRTOTITEMCONT,
                                          IDMULTMEDVRTOT, DTINICFATCONTR, IDADICITEMCONT, IDADICCOBRCONT, NRITEMCONTRATOPAI, IDBLOQSEMMEDIC,
                                          IDFATURAITEM, IDTPDESCONTO, VRDESCONTO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, NRORG, IDATIVO,
                                          DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU,
                                          IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL, QTMEDIDACALCULADA,
                                          IDAPARECEPROPOSTA)
            VALUES (V_NEW_NRITEMOCONTRATOAD, V_NEW_NRSEQCONTRATO, C_ITENSAD.CDPRODUTO, C_ITENSAD.CDSERVORCA, C_ITENSAD.SGUNIDADE, C_ITENSAD.NMITEMCONTRATO,
                    ROUND(C_ITENSAD.QTITEMCONTRATO, 2), C_ITENSAD.CDPRECBASESERV, C_ITENSAD.CDTPMEDIDASERV, ROUND(C_ITENSAD.QTMEDIDACONTR, 2), C_ITENSAD.IDFATURACONTR, C_ITENSAD.CDMODPGTO,
                    C_ITENSAD.NRGRUPOFATURA, C_ITENSAD.QTTEMPOSERV, C_ITENSAD.IDUNIDTEMPOSERV, C_ITENSAD.IDITEMATIVO, ROUND(C_ITENSAD.VRUNITITEMCONT, 2), ROUND(C_ITENSAD.VRTOTITEMCONT, 2),
                    C_ITENSAD.IDMULTMEDVRTOT, C_ITENSAD.DTINICFATCONTR, C_ITENSAD.IDADICITEMCONT, C_ITENSAD.IDADICCOBRCONT, V_NEW_NRITEMOCONTRATO, C_ITENSAD.IDBLOQSEMMEDIC,
                    C_ITENSAD.IDFATURAITEM, C_ITENSAD.IDTPDESCONTO, C_ITENSAD.VRDESCONTO, C_ITENSAD.QTPARCELASFATU, C_ITENSAD.NRDIAVENCPARCELASFATU, P_NRORG, 'S',
                    SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL , C_ITENSAD.NRITEMOCONTRATO, C_ITENSAD.IDELEMENTO, C_ITENSAD.NMCONTRATUALITEMCONT,
                    ROUND(C_ITENSAD.VRUNITITEMCONTTBLPRECO, 2), C_ITENSAD.CDTPMEDIDAVARIAVEL, ROUND(C_ITENSAD.QTMEDIDACALCULADA, 2), C_ITENSAD.IDAPARECEPROPOSTA);

        END LOOP;

        FOR C_FORMACOES IN (
            SELECT NRRELACFORMACAOCONT,
                   NRFORMPRECOSERVICO,
                   NRITEMOCONTRATO,
                   IDATIVO
              FROM FCT_RELACFORMACAOCONT
             WHERE NRSEQCONTRATO   = P_NRSEQCONTRATO
               AND NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
               AND NRORG           = P_NRORG
        ) LOOP

            NOVO_CODIGO_NT('FCT_RELACFORMACAOCONT', V_NRRELACFORMACAOCONT, 1, P_NRORG);
            V_NRFORMPRECOSERVICO := C_FORMACOES.NRFORMPRECOSERVICO;
            INSERT INTO FCT_RELACFORMACAOCONT (
                NRRELACFORMACAOCONT,    NRFORMPRECOSERVICO,     NRSEQCONTRATO,
                NRITEMOCONTRATO,        NRORG,                  IDATIVO,
                DTINCLUSAO,             NRORGINCLUSAO,          CDOPERINCLUSAO
            )
            VALUES (
                V_NRRELACFORMACAOCONT,    C_FORMACOES.NRFORMPRECOSERVICO,     V_NEW_NRSEQCONTRATO,
                V_NEW_NRITEMOCONTRATO,    P_NRORG,                            C_FORMACOES.IDATIVO,
                SYSDATE,                  P_NRORG,                            P_OPERADOR
            );

        END LOOP;

        FOR C_FORMACOESAUX IN(
            SELECT NRFORMPRECOSERVICO, IDORDENACAO, IDITEMCALCULO,
                IDELEMENTO, NRCALCFORMPRECSERVPAI, DSREFECALCULO, CDHABILITSERV, IDTIPOCALCULO,
                DSEXPRESSAOCALC, VRUNITARIO, QTCALCULO, VRTOTAL, IDUSAMEDIDA, CDTPMEDIDASERV,
                QTMEDIDACALC, VRPERCCALCULO
            FROM FCT_CALCFORMPRECSERV_ITCONT
            WHERE NRSEQCONTRATO       = P_NRSEQCONTRATO
               AND NRITEMOCONTRATO    = C_ITENS.NRITEMOCONTRATO
               AND NRORG              = P_NRORG
               AND NRFORMPRECOSERVICO = V_NRFORMPRECOSERVICO
        ) LOOP

               BEGIN
                    SELECT IDITEMCALCULO
                      INTO V_IDITEMCALCULOPAI
                    FROM FCT_CALCFORMPRECSERV_ITCONT
                    WHERE NRCALCFORMPRECSERV  = C_FORMACOESAUX.NRCALCFORMPRECSERVPAI
                       AND NRFORMPRECOSERVICO = C_FORMACOESAUX.NRFORMPRECOSERVICO
                       AND NRORG = P_NRORG;
                EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                      V_IDITEMCALCULOPAI := NULL;
                END;

                IF V_IDITEMCALCULOPAI IS NOT NULL THEN
                    V_REFERENCIA := C_FORMACOESAUX.DSREFECALCULO||'_PAI_'||V_IDITEMCALCULOPAI;
                ELSE
                    V_REFERENCIA := C_FORMACOESAUX.DSREFECALCULO;
                END IF;


               NOVO_CODIGO_NT('FCT_CALCFORMPRECSERV_ITCONT', V_NRCALCFORMPRECSERV, 1, P_NRORG);
               INSERT INTO FCT_CALCFORMPRECSERV_ITCONT(NRCALCFORMPRECSERV,  NRITEMOCONTRATO,  NRSEQCONTRATO,  NRFORMPRECOSERVICO,
                    IDORDENACAO,     IDITEMCALCULO,  IDELEMENTO, NRCALCFORMPRECSERVPAI, DSREFECALCULO,  CDHABILITSERV,  IDTIPOCALCULO,
                    DSEXPRESSAOCALC, VRUNITARIO,     QTCALCULO,  VRTOTAL,               IDUSAMEDIDA,    CDTPMEDIDASERV, QTMEDIDACALC,
                    VRPERCCALCULO,   DTINCLUSAO,     DTULTATU,   NRORG,                 NRORGINCLUSAO,  CDOPERINCLUSAO, NRORGULTATU,
                    CDOPERULTATU,    IDATIVO)
               VALUES (V_NRCALCFORMPRECSERV,                V_NEW_NRITEMOCONTRATO,                  V_NEW_NRSEQCONTRATO,
                       C_FORMACOESAUX.NRFORMPRECOSERVICO,   C_FORMACOESAUX.IDORDENACAO,             C_FORMACOESAUX.IDITEMCALCULO,
                       C_FORMACOESAUX.IDELEMENTO,           C_FORMACOESAUX.NRCALCFORMPRECSERVPAI,   V_REFERENCIA,
                       C_FORMACOESAUX.CDHABILITSERV,        C_FORMACOESAUX.IDTIPOCALCULO,           C_FORMACOESAUX.DSEXPRESSAOCALC,
                       C_FORMACOESAUX.VRUNITARIO,           C_FORMACOESAUX.QTCALCULO,               C_FORMACOESAUX.VRTOTAL,
                       C_FORMACOESAUX.IDUSAMEDIDA,          C_FORMACOESAUX.CDTPMEDIDASERV,          C_FORMACOESAUX.QTMEDIDACALC,
                       C_FORMACOESAUX.VRPERCCALCULO,        SYSDATE,                                NULL,
                       P_NRORG,                             P_NRORG,                                P_OPERADOR,
                       NULL,                                NULL,                                   'S');
        END LOOP;

        FOR C_FORMACOESAUXPAI IN (SELECT NRCALCFORMPRECSERV, NRFORMPRECOSERVICO,
                                     SUBSTR(DSREFECALCULO, INSTR(DSREFECALCULO, '_PAI_')+5) AS IDPAI,
                                     SUBSTR(DSREFECALCULO, 0, INSTR(DSREFECALCULO, '_PAI_')-1) AS REFERENCIA
                                 FROM FCT_CALCFORMPRECSERV_ITCONT
                                 WHERE NRFORMPRECOSERVICO = V_NRFORMPRECOSERVICO
                                   AND NRORG           = P_NRORG
                                   AND NRSEQCONTRATO   = V_NEW_NRSEQCONTRATO
                                   AND NRITEMOCONTRATO = V_NEW_NRITEMOCONTRATO
                                   AND NRCALCFORMPRECSERVPAI IS NOT NULL
                                   ORDER BY IDORDENACAO
        ) LOOP

            SELECT NRCALCFORMPRECSERV
              INTO V_PAI
              FROM FCT_CALCFORMPRECSERV_ITCONT
             WHERE IDITEMCALCULO      = C_FORMACOESAUXPAI.IDPAI
               AND NRSEQCONTRATO      = V_NEW_NRSEQCONTRATO
               AND NRITEMOCONTRATO    = V_NEW_NRITEMOCONTRATO
               AND NRFORMPRECOSERVICO = V_NRFORMPRECOSERVICO
               AND NRORG              = P_NRORG;

            UPDATE FCT_CALCFORMPRECSERV_ITCONT
               SET NRCALCFORMPRECSERVPAI  =  V_PAI,
                   DSREFECALCULO          = C_FORMACOESAUXPAI.REFERENCIA
             WHERE NRCALCFORMPRECSERV = C_FORMACOESAUXPAI.NRCALCFORMPRECSERV
               AND NRFORMPRECOSERVICO = V_NRFORMPRECOSERVICO
                           AND NRSEQCONTRATO      = V_NEW_NRSEQCONTRATO
                           AND NRITEMOCONTRATO    = V_NEW_NRITEMOCONTRATO
               AND NRORG              = P_NRORG;
        END LOOP; --FORMACOES

        FOR C_AGENDPEND IN (SELECT NRAGENDPENDENTE,  NRAGENDRECURSOCONT, NRSEQCONTRATO,  NRSEQORCAMENTO,
                                   NRITEMOCONTRATO,  NRITEMORCAMENTO,    QTPENDENCIA,    IDPENDENCIA,
                                   DTINIAGENDAMENTO, DTFINAGENDAMENTO,   CDOPERINCLUSAO, NRORG
                              FROM FCT_AGENDPENDENTE
                             WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                               AND NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
                               AND NRORG = P_NRORG
        ) LOOP

           /* Insere agendamento novo */
           NOVO_CODIGO_NT('FCT_AGENDPENDENTE', V_NRAGENDPENDENTE, 1, P_NRORG);

           INSERT INTO FCT_AGENDPENDENTE (NRAGENDPENDENTE,  NRAGENDRECURSOCONT, NRSEQCONTRATO,  NRSEQORCAMENTO,
                                          NRITEMOCONTRATO,  NRITEMORCAMENTO,    QTPENDENCIA,    IDPENDENCIA,
                                          DTINIAGENDAMENTO, DTFINAGENDAMENTO,   CDOPERINCLUSAO, IDATIVO,
                                          NRORG)
                  VALUES(V_NRAGENDPENDENTE,            C_AGENDPEND.NRAGENDRECURSOCONT, V_NEW_NRSEQCONTRATO,        C_AGENDPEND.NRSEQORCAMENTO,
                         V_NEW_NRITEMOCONTRATO,        C_AGENDPEND.NRITEMORCAMENTO,    C_AGENDPEND.QTPENDENCIA,    C_AGENDPEND.IDPENDENCIA,
                         C_AGENDPEND.DTINIAGENDAMENTO, C_AGENDPEND.DTFINAGENDAMENTO,   C_AGENDPEND.CDOPERINCLUSAO, 'S',
                         P_NRORG);

           /* -- Deleta agendamento antigo -- */
           DELETE FROM FCT_AGENDPENDENTE
            WHERE NRAGENDPENDENTE = C_AGENDPEND.NRAGENDPENDENTE
              AND NRORG = P_NRORG;

        END LOOP; -- AGENDPEND

    END LOOP; --C_ITENS

    /** Inativa os itens do contrato anterior **/
    IF P_TIPO = 'V' THEN
        UPDATE FCT_ITEMCONTRATO
          SET IDATIVO  = 'N',
              DTULTATU = SYSDATE,
              NRORGULTATU   = P_NRORG,
              CDOPERULTATU  = P_OPERADOR
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
          AND NRORG = P_NRORG;
    END IF;

    SELECT COUNT(CONTDOC.NRSEQMODDOCFCT)
    INTO V_COUNTDOCRENEGOCIACAO
    FROM FCT_MODELODOCCONTR CONTDOC
    JOIN FCT_MODELODOC DOC
        ON CONTDOC.NRSEQMODDOCFCT = DOC.NRSEQMODDOCFCT
        AND CONTDOC.NRORG         = DOC.NRORG
    WHERE CONTDOC.NRORG            = P_NRORG
        AND DOC.IDDOCRENEGOCIACAO  = 'S'
        AND CONTDOC.NRSEQMODCONTRA = (SELECT NRSEQMODCONTRA
                                      FROM FCT_CONTRATO
                                      WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                        AND NRORG         = P_NRORG);

    /* 4 - Realiza a cypia dos documentos do Contrato */
    FOR C_DOCCONT IN (SELECT FCT_MODELODOC.NRSEQMODDOCFCT,
                         FCT_MODELODOC.NRMODELODOCFCT,
                         FCT_MODELODOC.IDIDIOMA,
                         FCT_MODELODOC.TXMODELODOCORCA,
                         FCT_MODELODOC.NRORG,
                         FCT_MODELODOC.NMARQUIVO,
                         FCT_MODELODOC.DSCAMINHOARQ,
                         FCT_MODELODOC.DSTIPO,
                         FCT_MODELODOC.VRTAMANHO,
                         MODCONT.IDSITUACAOCONTRATO
                      FROM FCT_MODELODOC
                      INNER JOIN (SELECT DISTINCT NRSEQMODDOCFCT, IDSITUACAOCONTRATO, NRORG
                                  FROM FCT_MODELODOCCONTR
                                  WHERE NRORG = P_NRORG
                                    AND NRSEQMODCONTRA IN (SELECT NRSEQMODCONTRA
                                                           FROM FCT_CONTRATO
                                                           WHERE NRSEQCONTRATO = P_NRSEQCONTRATO)) MODCONT
                        ON FCT_MODELODOC.NRORG              = MODCONT.NRORG
                        AND FCT_MODELODOC.NRSEQMODDOCFCT    = MODCONT.NRSEQMODDOCFCT
                      WHERE FCT_MODELODOC.NRORG             = P_NRORG
                        AND (((V_COUNTDOCRENEGOCIACAO = 0 OR P_TIPO = 'C')  AND FCT_MODELODOC.IDDOCRENEGOCIACAO = 'N')
                            OR (V_COUNTDOCRENEGOCIACAO > 0 AND P_TIPO = 'V' AND FCT_MODELODOC.IDDOCRENEGOCIACAO = 'S'))
    ) LOOP

        /* Se for um versionamento, inativa o registro da versyo anterior*/
        IF P_TIPO = 'V' THEN
           UPDATE FCT_CONTRATODOC
              SET IDATIVO       = 'N',
                  DTULTATU      = SYSDATE,
                  NRORGULTATU   = P_NRORG,
                  CDOPERULTATU  = P_OPERADOR
            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
              AND NRORG = P_NRORG;
        END IF;
        /* Gera novo cydigo de Parymetro de itens de Contrato */
        NOVO_CODIGO_NT('NRSEQCONTDOC', V_NEW_NRSEQCONTDOC, 1, P_NRORG);
        /* Insere a cypia dos documentos do contrato. */
        INSERT INTO FCT_CONTRATODOC (NRSEQCONTDOC, NRSEQCONTRATO, NRSEQMODDOCFCT, IDIDIOMA, TXMODELODOCORCA,
                                     NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU,
                                     NMARQUIVO, DSCAMINHOARQ, DSTIPO, VRTAMANHO, IDSITUACAOCONTRATO)
        VALUES (V_NEW_NRSEQCONTDOC, V_NEW_NRSEQCONTRATO, C_DOCCONT.NRSEQMODDOCFCT, C_DOCCONT.IDIDIOMA, C_DOCCONT.TXMODELODOCORCA,
                P_NRORG, 'S', SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL, NULL,
                C_DOCCONT.NMARQUIVO, C_DOCCONT.DSCAMINHOARQ, C_DOCCONT.DSTIPO, C_DOCCONT.VRTAMANHO, C_DOCCONT.IDSITUACAOCONTRATO);
    END LOOP;

    /* 5 - Realiza a cypia das parametrizayyues de Reajuste do Contrato */
    FOR C_REAJCONT IN (SELECT NRSEQREAJUS, NRSEQCONTRATO, NMREAJUSCONTR, IDTPMESREAJUSTE, NRQTDREAJUSTE, NRORG, IDATIVO,
                              DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU
                         FROM FCT_REAJUSTCONTR
                         WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                         AND NRORG = P_NRORG
    )LOOP

        /* Gera novo cydigo de Parymetro de itens de Contrato */
        NOVO_CODIGO_NT('NRSEQREAJUS', V_NEW_NRSEQREAJUS, 1, P_NRORG);

        /* Insere a cypia dos parametros de reajuste do contrato. */
        INSERT INTO FCT_REAJUSTCONTR (NRSEQREAJUS, NRSEQCONTRATO, NMREAJUSCONTR, IDTPMESREAJUSTE, NRQTDREAJUSTE, NRORG, IDATIVO,
                              DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU)
        VALUES (V_NEW_NRSEQREAJUS, V_NEW_NRSEQCONTRATO, C_REAJCONT.NMREAJUSCONTR, C_REAJCONT.IDTPMESREAJUSTE, C_REAJCONT.NRQTDREAJUSTE, P_NRORG, 'S',
                SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL, NULL);

        /* 5.1 - Realiza a cypia dos indices das parametrizayyues de Reajuste do Contrato */
        FOR C_INDCONT IN (SELECT NRSEQINDCONTR, NRSEQREAJUS, NRSEQCONTRATO, CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR,
                                 NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU
                            FROM FCT_INDICECONTR
                           WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                             AND NRORG = P_NRORG
                             AND NRSEQREAJUS = C_REAJCONT.NRSEQREAJUS
        )LOOP

            /* Gera novo cydigo de Parymetro de itens de Contrato */
            NOVO_CODIGO_NT('NRSEQINDCONTR', V_NEW_NRSEQINDCONTR, 1, P_NRORG);

            /* Insere a cypia dos indices dos parametros de reajuste do contrato. */
            INSERT INTO FCT_INDICECONTR (NRSEQINDCONTR, NRSEQREAJUS, NRSEQCONTRATO, CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR,
                                         NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU)
            VALUES (V_NEW_NRSEQINDCONTR, V_NEW_NRSEQREAJUS, V_NEW_NRSEQCONTRATO, C_INDCONT.CDTPINDICE, C_INDCONT.IDPERVALOR, C_INDCONT.CDINDICE, C_INDCONT.VRPERCINDCONTR,
                    P_NRORG, 'S', SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL, NULL);

            /* Se for um versionamento, inativa o registro da versyo anterior*/
            IF P_TIPO = 'V' THEN
               UPDATE FCT_INDICECONTR
                  SET IDATIVO = 'N',
                      DTULTATU = SYSDATE,
                      NRORGULTATU = P_NRORG,
                      CDOPERULTATU = P_OPERADOR
                WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                  AND NRSEQINDCONTR = C_INDCONT.NRSEQINDCONTR
                  AND NRORG = P_NRORG;
            END IF;

       END LOOP;

       /* Se for um versionamento, inativa o registro da versyo anterior*/
       IF P_TIPO = 'V' THEN
          UPDATE FCT_REAJUSTCONTR
             SET IDATIVO = 'N',
                 DTULTATU = SYSDATE,
                 NRORGULTATU = P_NRORG,
                 CDOPERULTATU = P_OPERADOR
           WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
             AND NRSEQREAJUS = C_REAJCONT.NRSEQREAJUS
             AND NRORG = P_NRORG;
       END IF;

    END LOOP;

    FOR C_ELEMENTOS IN (
        SELECT NRTRABSERVCONT,  NRSEQCONTRATO,     NRTIPOORCAMENTO,
            NRCOMPSERVICO,      NRITCOMPSERVICO,   IDESCOLHIDO,
            CDSERVORCA,         QTSERVORCA,        CDTPMEDIDASERV,
            QTMEDSERVORCA,      VRUNITSERVORCA,    VRTOTSERVORCA,
            IDELEMENTO,         IDELEMENTOPAI,     IDTIPOELEMENTO,
            IDSERVOBRIGCOMP,    QTMEDIDAVARIAVEL,  QTMEDIDACALC,
            IDAPARECEPROPOSTA
        FROM FCT_TRABSERVCONTRATO
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG
    ) LOOP

        NOVO_CODIGO_SC('FCT_TRABSERVCONTRATO', V_NRTRABSERVCONT, 1, P_NRORG);
        INSERT INTO FCT_TRABSERVCONTRATO (
            NRTRABSERVCONT,  NRSEQCONTRATO,    NRTIPOORCAMENTO,
            NRCOMPSERVICO,   NRITCOMPSERVICO,  IDESCOLHIDO,
            CDSERVORCA,      QTSERVORCA,       CDTPMEDIDASERV,
            QTMEDSERVORCA,   VRUNITSERVORCA,   VRTOTSERVORCA,
            IDELEMENTO,      IDELEMENTOPAI,    IDTIPOELEMENTO,
            IDSERVOBRIGCOMP, QTMEDIDAVARIAVEL, QTMEDIDACALC,
            NRORG,           IDATIVO,          DTINCLUSAO,
            DTULTATU,        NRORGINCLUSAO,    CDOPERINCLUSAO,
            NRORGULTATU,     CDOPERULTATU,     IDAPARECEPROPOSTA
        ) VALUES (
            V_NRTRABSERVCONT,                    V_NEW_NRSEQCONTRATO,                    C_ELEMENTOS.NRTIPOORCAMENTO,
            C_ELEMENTOS.NRCOMPSERVICO,           C_ELEMENTOS.NRITCOMPSERVICO,            C_ELEMENTOS.IDESCOLHIDO,
            C_ELEMENTOS.CDSERVORCA,              C_ELEMENTOS.QTSERVORCA,                 C_ELEMENTOS.CDTPMEDIDASERV,
            ROUND(C_ELEMENTOS.QTMEDSERVORCA, 2), ROUND(C_ELEMENTOS.VRUNITSERVORCA, 2),   ROUND(C_ELEMENTOS.VRTOTSERVORCA, 2),
            C_ELEMENTOS.IDELEMENTO,              C_ELEMENTOS.IDELEMENTOPAI,              C_ELEMENTOS.IDTIPOELEMENTO,
            C_ELEMENTOS.IDSERVOBRIGCOMP,         ROUND(C_ELEMENTOS.QTMEDIDAVARIAVEL, 2), ROUND(C_ELEMENTOS.QTMEDIDACALC, 2),
            P_NRORG,                             'S',                                    SYSDATE,
            NULL,                                P_NRORG,                                P_OPERADOR,
            NULL,                                NULL,                                   C_ELEMENTOS.IDAPARECEPROPOSTA
        );

    END LOOP; -- C_ELEMENTOS

    FOR C_TPMEDIDA IN (
        SELECT NRMEDIDACONTRATO, NRSEQCONTRATO,  CDTPMEDIDAVARIAVEL,
               QTMEDIDAVARIAVEL, IDELEMENTORAIZ, QTFRANQUIA,
               NRTIPOORCAMENTO,  CDSERVORCA,     IDAPARECEPROPOSTA
        FROM FCT_RELACMEDIDACONTRATO
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG
    ) LOOP

        NOVO_CODIGO_SC('FCT_RELACMEDIDACONTRATO', V_NRMEDIDACONTRATO, 1, P_NRORG);
        INSERT INTO FCT_RELACMEDIDACONTRATO (
            NRMEDIDACONTRATO, NRSEQCONTRATO,     CDTPMEDIDAVARIAVEL,
            QTMEDIDAVARIAVEL, IDELEMENTORAIZ,    QTFRANQUIA,
            NRORG,            DTINCLUSAO,        DTULTATU,
            NRORGINCLUSAO,    CDOPERINCLUSAO,    NRORGULTATU,
            CDOPERULTATU,     IDATIVO,           NRTIPOORCAMENTO,
            CDSERVORCA,       IDAPARECEPROPOSTA
        ) VALUES (
            V_NRMEDIDACONTRATO,                    V_NEW_NRSEQCONTRATO,          C_TPMEDIDA.CDTPMEDIDAVARIAVEL,
            ROUND(C_TPMEDIDA.QTMEDIDAVARIAVEL, 2), C_TPMEDIDA.IDELEMENTORAIZ,    C_TPMEDIDA.QTFRANQUIA,
            P_NRORG,                               SYSDATE,                      NULL,
            P_NRORG,                               P_OPERADOR,                   NULL,
            NULL,                                  'S',                          C_TPMEDIDA.NRTIPOORCAMENTO,
            C_TPMEDIDA.CDSERVORCA,                 C_TPMEDIDA.IDAPARECEPROPOSTA
        );

    END LOOP; -- C_TPMEDIDA

    FOR C_COMPOSICOES IN (
        SELECT NRCOMPSERVCONT, NRSEQCONTRATO,    NRCOMPSERVICO,
               NMCOMPSERVICO,  NRCOMPSERVICOPAI, IDCOMPOBRIGATORIA,
               IDESCOLHIDO
        FROM FCT_COMPSERVCONTRATO
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG
    ) LOOP

        NOVO_CODIGO_SC('FCT_COMPSERVCONTRATO', V_NRCOMPSERVCONT, 1, P_NRORG);
        INSERT INTO FCT_COMPSERVCONTRATO (
            NRCOMPSERVCONT, NRSEQCONTRATO,    NRCOMPSERVICO,
            NMCOMPSERVICO,  NRCOMPSERVICOPAI, IDCOMPOBRIGATORIA,
            IDESCOLHIDO,    NRORG,            IDATIVO,
            DTINCLUSAO,     DTULTATU,         NRORGINCLUSAO,
            CDOPERINCLUSAO, NRORGULTATU,      CDOPERULTATU
        ) VALUES (
            V_NRCOMPSERVCONT,             V_NEW_NRSEQCONTRATO,            C_COMPOSICOES.NRCOMPSERVICO,
            C_COMPOSICOES.NMCOMPSERVICO,  C_COMPOSICOES.NRCOMPSERVICOPAI, C_COMPOSICOES.IDCOMPOBRIGATORIA,
            C_COMPOSICOES.IDESCOLHIDO,    P_NRORG,                        'S',
            SYSDATE,                      NULL,                           P_NRORG,
            P_OPERADOR,                   NULL,                           NULL
        );

    END LOOP; -- C_COMPOSICOES

    FOR C_NEGOCIACAO IN (
        SELECT NRTIPOORCAMENTO, IDTPFATURA,           VRTOTITEMCOMDESC, VRDESCITEM,
               CDFILIALFATURA,  NRPARCFATURA,         CDTIPOOPERFATURA, CDSERIENF,
               CDEMPRESA,       CDINSCESTA,           CDINSCMUNI,       VRTOTITEM,
               VRPERCDESCITEM,  NRNEGOCIACAOCONTRATO, IDTPDESCONTO
        FROM FCT_NEGOCIACAOCONTRATO
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG
    ) LOOP

        NOVO_CODIGO_SC('FCT_NEGOCIACAOCONTRATO', V_NRNEGOCIACAOCONTRATO, 1, P_NRORG);
        INSERT INTO FCT_NEGOCIACAOCONTRATO (
            NRNEGOCIACAOCONTRATO, NRSEQCONTRATO,  NRTIPOORCAMENTO,  IDTPFATURA,
            CDFILIALFATURA,       NRPARCFATURA,   CDTIPOOPERFATURA, CDSERIENF,
            CDEMPRESA,            CDINSCESTA,     CDINSCMUNI,       VRTOTITEM,
            VRPERCDESCITEM,       VRDESCITEM,     VRTOTITEMCOMDESC, IDATIVO,
            NRORG,                DTINCLUSAO,     NRORGINCLUSAO,    CDOPERINCLUSAO,
            DTULTATU,             NRORGULTATU,    CDOPERULTATU,     IDTPDESCONTO
        ) VALUES (
            V_NRNEGOCIACAOCONTRATO,                V_NEW_NRSEQCONTRATO,                C_NEGOCIACAO.NRTIPOORCAMENTO,              C_NEGOCIACAO.IDTPFATURA,
            C_NEGOCIACAO.CDFILIALFATURA,           C_NEGOCIACAO.NRPARCFATURA,          C_NEGOCIACAO.CDTIPOOPERFATURA,             C_NEGOCIACAO.CDSERIENF,
            C_NEGOCIACAO.CDEMPRESA,                C_NEGOCIACAO.CDINSCESTA,            C_NEGOCIACAO.CDINSCMUNI,                   ROUND(C_NEGOCIACAO.VRTOTITEM, 2),
            ROUND(C_NEGOCIACAO.VRPERCDESCITEM, 2), ROUND(C_NEGOCIACAO.VRDESCITEM, 2), ROUND(C_NEGOCIACAO.VRTOTITEMCOMDESC, 2), 'S',
            P_NRORG,                               SYSDATE,                            P_NRORG,                                   P_OPERADOR,
            NULL,                                  NULL,                               NULL,
            C_NEGOCIACAO.IDTPDESCONTO
        );


        FOR C_ITNEGOCIACAO IN (
            SELECT ITEM.NRITEMORCAMENTO,      ITNEGO.VRPERCDESCITEM,  ITNEGO.NRPARCFATURA, ITNEGO.CDPRODFATURA,
                   ITNEGO.NRITEMORCAMENTOPAI, ITNEGO.VRTOTITEM,       ITNEGO.CDSERVORCA,   ITNEGO.VRDESCITEM,
                   ITNEGO.VRTOTITEMCOMDESC,   ITEM.NRITEMOCONTRATO,   ITEM.NRITEMCONTRATOPAI, ITNEGO.IDTPDESCONTO
            FROM FCT_ITNEGOCIACAOCONTRATO ITNEGO
            JOIN FCT_ITEMCONTRATO ITEM
                ON ITNEGO.NRITEMOCONTRATO = TO_NUMBER(ITEM.CDOPERULTATU)
                AND ITNEGO.NRORG          = ITEM.NRORG
            WHERE ITNEGO.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                AND ITNEGO.NRORG              = P_NRORG
        ) LOOP

            NOVO_CODIGO_SC('FCT_ITNEGOCIACAOCONTRATO', V_NRITNEGOCIACAOCONTRATO, 1, P_NRORG);
            INSERT INTO FCT_ITNEGOCIACAOCONTRATO(
                NRITNEGOCIACAOCONTRATO, NRNEGOCIACAOCONTRATO, NRITEMORCAMENTO, VRPERCDESCITEM,
                NRITEMORCAMENTOPAI,     VRTOTITEM,            CDSERVORCA,      VRDESCITEM,
                VRTOTITEMCOMDESC,       IDATIVO,              CDPRODFATURA,    NRPARCFATURA,
                NRORGINCLUSAO,          DTULTATU,             NRORGULTATU,     CDOPERINCLUSAO,
                NRORG,                  DTINCLUSAO,           NRITEMOCONTRATO, NRITEMCONTRATOPAI,
                IDTPDESCONTO
            ) VALUES (
                V_NRITNEGOCIACAOCONTRATO,                  V_NRNEGOCIACAOCONTRATO,             C_ITNEGOCIACAO.NRITEMORCAMENTO, ROUND(C_ITNEGOCIACAO.VRPERCDESCITEM, 2),
                C_ITNEGOCIACAO.NRITEMORCAMENTOPAI,         ROUND(C_ITNEGOCIACAO.VRTOTITEM, 2), C_ITNEGOCIACAO.CDSERVORCA,      ROUND(C_ITNEGOCIACAO.VRDESCITEM, 2),
                ROUND(C_ITNEGOCIACAO.VRTOTITEMCOMDESC, 2), 'S',                                C_ITNEGOCIACAO.CDPRODFATURA,    C_ITNEGOCIACAO.NRPARCFATURA,
                P_NRORG,                                   NULL,                               NULL,                           P_OPERADOR,
                P_NRORG,                                   SYSDATE,                            C_ITNEGOCIACAO.NRITEMOCONTRATO, C_ITNEGOCIACAO.NRITEMCONTRATOPAI,
                C_ITNEGOCIACAO.IDTPDESCONTO
            );

        END LOOP; -- C_ITNEGOCIACAO

        FOR C_PARCENEGO IN (
            SELECT NRNEGOCIACAOCONTRATO, QTDIASFATURAMENTO,
                   NRDIAVENCIMENTO,      VRPARCELA
            FROM FCT_PARCELANEGOCONT
            WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                AND NRORG              = P_NRORG
        ) LOOP

            NOVO_CODIGO_SC('FCT_PARCELANEGOCONT', V_NRPARCELANEGOCONT, 1, P_NRORG);
            INSERT INTO FCT_PARCELANEGOCONT (
                NRPARCELANEGOCONT, NRNEGOCIACAOCONTRATO, QTDIASFATURAMENTO, NRDIAVENCIMENTO,
                VRPARCELA,         IDATIVO,              NRORG,             DTINCLUSAO,
                NRORGINCLUSAO,     CDOPERINCLUSAO,       DTULTATU,          NRORGULTATU,
                CDOPERULTATU
            ) VALUES (
                V_NRPARCELANEGOCONT,         V_NRNEGOCIACAOCONTRATO,           C_PARCENEGO.QTDIASFATURAMENTO,
                C_PARCENEGO.NRDIAVENCIMENTO, ROUND(C_PARCENEGO.VRPARCELA, 2),  'S',
                P_NRORG,                     SYSDATE,                          P_NRORG,
                P_OPERADOR,                  NULL,                             NULL,
                NULL
            );
        END LOOP; -- C_PARCENEGO

        FOR C_COMPETENCIA IN (
            SELECT NRDIACOMPETINI, QTDIASFATUVENC, IDMESCALCVENC,
                   NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                   QTDIASAPURACAO, IDTPCALCVENC,   NRDIACALCVENC
            FROM FCT_COMPETENCIANEGOCONT
            WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                AND NRORG              = P_NRORG
        ) LOOP

            NOVO_CODIGO_SC('FCT_COMPETENCIANEGOCONT', V_NRCOMPETENCIANEGOCONT, 1, P_NRORG);
            INSERT INTO FCT_COMPETENCIANEGOCONT (
                NRCOMPETENCIANEGOCONT, NRNEGOCIACAOCONTRATO, NRDIACOMPETINI,
                NRDIACOMPETFIN,        IDMESCOMPETINI,       IDMESCOMPETFIN,
                QTDIASAPURACAO,        IDTPCALCVENC,         NRDIACALCVENC,
                IDMESCALCVENC,         QTDIASFATUVENC,       IDATIVO,
                NRORG,                 DTINCLUSAO,           NRORGINCLUSAO,
                CDOPERINCLUSAO,        DTULTATU,             NRORGULTATU,
                CDOPERULTATU
            ) VALUES (
                V_NRCOMPETENCIANEGOCONT,      V_NRNEGOCIACAOCONTRATO,       C_COMPETENCIA.NRDIACOMPETINI,
                C_COMPETENCIA.NRDIACOMPETFIN, C_COMPETENCIA.IDMESCOMPETINI, C_COMPETENCIA.IDMESCOMPETFIN,
                C_COMPETENCIA.QTDIASAPURACAO, C_COMPETENCIA.IDTPCALCVENC,   C_COMPETENCIA.NRDIACALCVENC,
                C_COMPETENCIA.IDMESCALCVENC,  C_COMPETENCIA.QTDIASFATUVENC, 'S',
                P_NRORG,                      SYSDATE,                      P_NRORG,
                P_OPERADOR,                   NULL,                         NULL,
                NULL
            );
        END LOOP; -- C_COMPETENCIA

        FOR C_DESCPERIODO IN (
            SELECT NRNEGOCIACAOCONTRATO, VRPERCDESCITEM, VRDESCITEM, NRORDEMAPLICADESC,
                   VRTOTITEMCOMDESC,     QTMESESDESC,    DTFINALVALIDADEDESC, IDTPDESCONTO
            FROM FCT_DESCPERIODONEGOCONT
            WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                AND NRORG              = P_NRORG
        ) LOOP

            NOVO_CODIGO_SC('FCT_DESCPERIODONEGOCONT', V_NRDESCPERIODONEGOCONT, 1, P_NRORG);
            INSERT INTO FCT_DESCPERIODONEGOCONT (
                NRDESCPERIODONEGOCONT, NRNEGOCIACAOCONTRATO, VRPERCDESCITEM,
                VRDESCITEM,            VRTOTITEMCOMDESC,     QTMESESDESC,
                NRORDEMAPLICADESC,     IDATIVO,              NRORG,
                DTINCLUSAO,            NRORGINCLUSAO,        CDOPERINCLUSAO,
                DTULTATU,              NRORGULTATU,          CDOPERULTATU,
                IDTPDESCONTO
            ) VALUES (
                V_NRDESCPERIODONEGOCONT,            V_NRNEGOCIACAOCONTRATO,                   ROUND(C_DESCPERIODO.VRPERCDESCITEM, 2),
                ROUND(C_DESCPERIODO.VRDESCITEM, 2), ROUND(C_DESCPERIODO.VRTOTITEMCOMDESC, 2), C_DESCPERIODO.QTMESESDESC,
                C_DESCPERIODO.NRORDEMAPLICADESC,    'S',                                      P_NRORG,
                SYSDATE,                            P_NRORG,                                  P_OPERADOR,
                NULL,                               NULL,                                     NULL,
                C_DESCPERIODO.IDTPDESCONTO
            );
        END LOOP; -- C_DESCPERIODO
    END LOOP; -- C_NEGOCIACAO

    /* Se for um versionamento, copia do contrato, se nao, copia do modelo*/
    IF P_TIPO = 'V' THEN

    	FOR C_ASSINATURAS IN (SELECT NRASSDIGITALCONTR, NRSEQCONTRATO, NRPARCNEGOCIO, NRSEQINTERLOCUTOR, NRCPFSIGNATARIO,
							         IDTIPOASSINATURA, IDTESTEMUNHA, NRORDENACAO, IDSITUACAO, DSEMAILNOTSIGNENV, DSEMAILNOTIFOUTROS, NRORG
							    FROM FCT_ASSINATDIGITALCONTR
							   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
							     AND NRORG = P_NRORG) LOOP

    		NOVO_CODIGO_SC('FCT_ASSINATDIGITALCONTR', V_NRASSDIGITALCONTR, 1, P_NRORG);

    		INSERT INTO FCT_ASSINATDIGITALCONTR (
			    NRASSDIGITALCONTR, NRSEQCONTRATO, NRPARCNEGOCIO, NRSEQINTERLOCUTOR, NRCPFSIGNATARIO, 
			    IDTIPOASSINATURA, IDTESTEMUNHA, NRORDENACAO, IDSITUACAO, DSEMAILNOTSIGNENV, DSEMAILNOTIFOUTROS, NRORG, IDATIVO, 
			    DTINCLUSAO, CDOPERINCLUSAO, NRORGINCLUSAO
  			)
  			VALUES (
  			    V_NRASSDIGITALCONTR, V_NEW_NRSEQCONTRATO, C_ASSINATURAS.NRPARCNEGOCIO, C_ASSINATURAS.NRSEQINTERLOCUTOR, C_ASSINATURAS.NRCPFSIGNATARIO, 
  			    C_ASSINATURAS.IDTIPOASSINATURA, C_ASSINATURAS.IDTESTEMUNHA, C_ASSINATURAS.NRORDENACAO, 'P', C_ASSINATURAS.DSEMAILNOTSIGNENV, C_ASSINATURAS.DSEMAILNOTIFOUTROS, P_NRORG, 'S', 
  			    SYSDATE, P_OPERADOR, P_NRORG
  			);
			
			 /* Copia operadores */
            
        FOR C_OPERADORES IN (SELECT CDOPERADOR
                               FROM FCT_RELACOPERNOTIFASSELE 
                              WHERE NRASSDIGITALCONTR = C_ASSINATURAS.NRASSDIGITALCONTR
          ) LOOP

            NOVO_CODIGO_SC('FCT_RELACOPERNOTIFASSELE', V_NRRELOPERNOTIFASSELE, 1, P_NRORG);

            INSERT INTO FCT_RELACOPERNOTIFASSELE (
              NRRELOPERNOTIFASSELE, NRASSDIGITALCONTR, CDOPERADOR, NRORG, IDATIVO, 
              DTINCLUSAO, CDOPERINCLUSAO, NRORGINCLUSAO
            )
            VALUES (
                V_NRRELOPERNOTIFASSELE, V_NRASSDIGITALCONTR, C_OPERADORES.CDOPERADOR, P_NRORG, 'S', 
                SYSDATE, P_OPERADOR, P_NRORG
            );

        END LOOP;
            
    	END LOOP;
    
    ELSE

        BEGIN
	    	SELECT NRSEQMODCONTRA
		      INTO V_NRSEQMODCONTRA
		      FROM FCT_CONTRATO
		     WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
		       AND NRORG = P_NRORG;
	    EXCEPTION
	    	WHEN NO_DATA_FOUND THEN
	    		V_NRSEQMODCONTRA := NULL;
	    END;

    	FOR C_ASSINATURAS IN (SELECT NRSIGNATPADRCONT, NRSEQMODCONTRA, NRPARCNEGOCIO, IDTIPOASSINATURA, IDTESTEMUNHA, 
						   	         DSEMAILNOTSIGNENV, DSEMAILNOTIFOUTROS, NRORDENACAO, NRORG
						   	    FROM FCT_SIGNATPADRMODCONT
						   	   WHERE NRSEQMODCONTRA = V_NRSEQMODCONTRA
						   	     AND NRORG = P_NRORG
                     AND IDTPSIGNATARIO = 'SE') LOOP

    		BEGIN
		    	SELECT NRINSCRICAOPARC
			      INTO V_NRINSCRICAOPARC
			      FROM PARCNEGOCIO
			     WHERE NRPARCNEGOCIO = C_ASSINATURAS.NRPARCNEGOCIO
			       AND NRORG = P_NRORG;
		    EXCEPTION
		    	WHEN NO_DATA_FOUND THEN
		    		V_NRINSCRICAOPARC := NULL;
		    END;

    		NOVO_CODIGO_SC('FCT_ASSINATDIGITALCONTR', V_NRASSDIGITALCONTR, 1, P_NRORG);

    		INSERT INTO FCT_ASSINATDIGITALCONTR (
  			    NRASSDIGITALCONTR, NRSEQCONTRATO, NRPARCNEGOCIO, NRSEQINTERLOCUTOR, NRCPFSIGNATARIO, 
  			    IDTIPOASSINATURA, IDTESTEMUNHA, NRORDENACAO, IDSITUACAO, NRORG, IDATIVO, 
  			    DTINCLUSAO, CDOPERINCLUSAO, NRORGINCLUSAO, DSEMAILNOTSIGNENV, DSEMAILNOTIFOUTROS
  			)
  			VALUES (
  			    V_NRASSDIGITALCONTR, V_NEW_NRSEQCONTRATO, C_ASSINATURAS.NRPARCNEGOCIO, NULL, V_NRINSCRICAOPARC, 
  			    C_ASSINATURAS.IDTIPOASSINATURA, C_ASSINATURAS.IDTESTEMUNHA, C_ASSINATURAS.NRORDENACAO, 'P', P_NRORG, 'S', 
  			    SYSDATE, P_OPERADOR, P_NRORG, C_ASSINATURAS.DSEMAILNOTSIGNENV, C_ASSINATURAS.DSEMAILNOTIFOUTROS
  			);

        -- INSERIR OPERADORES
        FOR C_OPERADORES IN (SELECT CDOPERADOR
                               FROM FCT_RELACOPERNOTIFASSELE 
                              WHERE NRSIGNATPADRCONT = C_ASSINATURAS.NRSIGNATPADRCONT
        ) LOOP

            NOVO_CODIGO_SC('FCT_RELACOPERNOTIFASSELE', V_NRRELOPERNOTIFASSELE, 1, P_NRORG);

            INSERT INTO FCT_RELACOPERNOTIFASSELE (
                NRRELOPERNOTIFASSELE, NRASSDIGITALCONTR, CDOPERADOR, NRORG, IDATIVO, 
                DTINCLUSAO, CDOPERINCLUSAO, NRORGINCLUSAO
            )
            VALUES (
                V_NRRELOPERNOTIFASSELE, V_NRASSDIGITALCONTR, C_OPERADORES.CDOPERADOR, P_NRORG, 'S', 
                SYSDATE, P_OPERADOR, P_NRORG
            );

        END LOOP;

    	END LOOP; --C_ASSINATURAS
    END IF;

    UPDATE FCT_ITEMCONTRATO
    SET CDOPERULTATU = NULL
    WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
        AND NRORG       = P_NRORG;
END;
/