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')
  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;
BEGIN
    /*P_TIPO: V -> Versionamento / C - Cÿ³pia */
    /* 1 - Realiza a cÿ³pia do Contrato */
    /*Gera novo cÿ³digo de Contrato*/
    NOVO_CODIGO_NT('FCT_CONTRATO', V_NEW_NRSEQCONTRATO, 1, P_NRORG);
    P_NRSEQCONTRATO_GERADO := V_NEW_NRSEQCONTRATO;
    /* Insere a cÿ³pia do contrato.
       - Sempre serÿ¡ incluso com a situaÿ§ÿ£o P (PENDENTE)
       - Se for um versionamento: A rotina incrementa a versÿ£o e insere a ligaÿ§ÿ£o do sequencial do contrato pai
       - Se for uma cÿ³pia: A versÿ£o ÿ© sempre 1, as datas de inicio e fim do contrato seguem de acordo com a data atual
         e as datas de inÿ­cio e fim e prazo de vigÿªncia sÿ£o 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)
    SELECT V_NEW_NRSEQCONTRATO, IDTPCONTRATO, NRCONTRATOFCT, DECODE(P_TIPO, 'V', NRVERSAOCONTRATO+1,1), CDFILIALORCA,
           NRSEQMODCONTRA, NRPARCNEGOCIO, DSREFERENCIACONT, DECODE(P_TIPO, 'C', SYSDATE, DTINICIOCONTRATO),
           DECODE(P_TIPO, 'C',SYSDATE+NRDIASPRAZOCONT, DTFIMCONTRATO), NRDIASPRAZOCONT, NRDIAVENPARCFAT, CDINDFINCONT,
           CDTPINDFINCON, IDPERVALFINCON, DTPADREAJCONT, DTPADRPRORGCONT, DECODE(P_TIPO, 'C', NULL, NRDIASPRORGCONT),
           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, DTINIVIGENCONT), 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
      FROM FCT_CONTRATO
     WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
       AND NRORG = P_NRORG;
    /* Gera mnemÿ´nico do novo Contrato e atualiza */
    CRIA_MNEMONICO(P_NRORG, 'C', V_NEW_NRSEQCONTRATO, V_NRCONTRATOFCT);
    /* Se for um versionamento, inativa o registro da versão anterior e gera o relacionamento com a proposta, caso exista.*/
    IF P_TIPO = 'V' THEN
       /* 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;
       IF V_IDSITUACAOCONTRATO = 'A' 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);
       END IF;
       /* Inativa o registro da versão 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
              INTO V_REFEORCCONT, V_PROPOSTA
              FROM FCT_REFEORCACONT
             WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
               AND NRORG = P_NRORG;
        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)
            VALUES (V_NEW_NRSEQREFEORCCONT, V_PROPOSTA, V_NEW_NRSEQCONTRATO, 'A', P_NRORG,
                    SYSDATE, NULL, P_NRORG, P_OPERADOR, NULL,
                    NULL, 'S');
            /* 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;
        /* 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 versão 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;
    /* 2 - Realiza a cÿ³pia da parametrizaÿ§ÿ£o de faturamento do Contrato
    Gera novo cÿ³digo de Parÿ¢metro de  Faturamento de Contrato
    NOVO_CODIGO_NT(NRSEQFATUCONTR, V_NEW_NRSEQFATUCONTR, 1, P_NRORG);
      Insere a cÿ³pia da parametrizaÿ§ÿ£o de contrato.
    INSERT INTO FCT_PARAMFATCONT (NRSEQFATUCONTR, NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA,
                IDSOMAFATUCONT, IDSOMAITGRUPFAT, IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, QTFRANQEVOLCONTR,
                NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO,
                NRORGULTATU, CDOPERULTATU)
     SELECT  V_NEW_NRSEQFATUCONTR, V_NEW_NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA,
             IDSOMAFATUCONT, IDSOMAITGRUPFAT, IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, QTFRANQEVOLCONTR,
             P_NRORG, S, SYSDATE, NULL, P_NRORG, P_OPERADOR,
             NULL, NULL
        FROM FCT_PARAMFATCONT
       WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
         AND NRORG = P_NRORG;
     Se for um versionamento, inativa o registro da versÿ£o anterior
    IF P_TIPO = V THEN
       UPDATE FCT_PARAMFATCONT
          SET IDATIVO = N,
              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 cÿ³digo de Parÿ¢metro de itens de Contrato */
        NOVO_CODIGO_NT('FCT_RELACESTRUTURACONT', 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, C_ESTRUT.VRITEMRATEIO, C_ESTRUT.IDRELACESTRUTURA,
                     C_ESTRUT.QTMEDIDARATEIO, C_ESTRUT.VRPERCRATEIO);
    END LOOP;
    /* 3 - Realiza a cÿ³pia 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
                     FROM FCT_ITEMCONTRATO
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                      AND NRORG = P_NRORG
                      AND NRITEMCONTRATOPAI IS NULL
    )LOOP
        /* Gera novo cÿ³digo de Parÿ¢metro de itens de Contrato */
        NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NEW_NRITEMOCONTRATO, 1, P_NRORG);
        /* Insere a cÿ³pia 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)
        VALUES (V_NEW_NRITEMOCONTRATO, V_NEW_NRSEQCONTRATO, C_ITENS.CDPRODUTO, C_ITENS.CDSERVORCA, C_ITENS.SGUNIDADE, C_ITENS.NMITEMCONTRATO,
                C_ITENS.QTITEMCONTRATO, C_ITENS.CDPRECBASESERV, C_ITENS.CDTPMEDIDASERV, C_ITENS.QTMEDIDACONTR, C_ITENS.IDFATURACONTR, C_ITENS.CDMODPGTO,
                C_ITENS.NRGRUPOFATURA, C_ITENS.QTTEMPOSERV, C_ITENS.IDUNIDTEMPOSERV, C_ITENS.IDITEMATIVO, C_ITENS.VRUNITITEMCONT, C_ITENS.VRTOTITEMCONT,
                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);
         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 cÿ³digo de Parÿ¢metro de itens de Contrato */
            NOVO_CODIGO_NT('FCT_RELACESTRUTURACONT', 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, C_ESTRUTITEM.VRITEMRATEIO, C_ESTRUTITEM.IDRELACESTRUTURA,
                        C_ESTRUTITEM.QTMEDIDARATEIO, C_ESTRUTITEM.VRPERCRATEIO);
        END LOOP;
        /* 3.1 - Realiza a cÿ³pia 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
                         FROM FCT_ITEMCONTRATO
                        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                          AND NRORG = P_NRORG
                          AND NRITEMCONTRATOPAI = C_ITENS.NRITEMOCONTRATO
        )LOOP
            /* Gera novo cÿ³digo de Parÿ¢metro de itens de Contrato */
            NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NEW_NRITEMOCONTRATOAD, 1, P_NRORG);
           /* Insere a cÿ³pia 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)
            VALUES (V_NEW_NRITEMOCONTRATOAD, V_NEW_NRSEQCONTRATO, C_ITENSAD.CDPRODUTO, C_ITENSAD.CDSERVORCA, C_ITENSAD.SGUNIDADE, C_ITENSAD.NMITEMCONTRATO,
                    C_ITENSAD.QTITEMCONTRATO, C_ITENSAD.CDPRECBASESERV, C_ITENSAD.CDTPMEDIDASERV, C_ITENSAD.QTMEDIDACONTR, C_ITENSAD.IDFATURACONTR, C_ITENSAD.CDMODPGTO,
                    C_ITENSAD.NRGRUPOFATURA, C_ITENSAD.QTTEMPOSERV, C_ITENSAD.IDUNIDTEMPOSERV, C_ITENSAD.IDITEMATIVO, C_ITENSAD.VRUNITITEMCONT, C_ITENSAD.VRTOTITEMCONT,
                    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 , NULL);
            /* Se for um versionamento, inativa o registro da versÿ£o 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 NRITEMOCONTRATO = C_ITENSAD.NRITEMOCONTRATO
                  AND NRORG = P_NRORG;
            END IF;
        END LOOP;
        /* 3.2 - Realiza a cÿ³pia da parametrizaÿ§ÿ£o de faturamento dos itens do Contrato
        FOR C_ITENSPAR IN (SELECT NRSEQFATUITCONT, NRSEQCONTRATO, NRITEMOCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA,
                                  NRPARCFATURA, IDBLOQVRITMEDIC, NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO,
                                  NRORGULTATU, CDOPERULTATU
                             FROM FCT_PARAMFATITCONT
                            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                              AND NRORG = P_NRORG
                              AND NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
        )LOOP
             Gera novo cÿ³digo de Parÿ¢metro de itens de Contrato
            NOVO_CODIGO_NT(NRSEQFATUITCONT, V_NEW_NRSEQFATUITCONT, 1, P_NRORG);
             Insere a cÿ³pia da parametrizaÿ§ÿ£o dos itens do contrato.
            INSERT INTO FCT_PARAMFATITCONT (NRSEQFATUITCONT, NRSEQCONTRATO, NRITEMOCONTRATO, CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA,
                                            NRPARCFATURA, IDBLOQVRITMEDIC, NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO,
                                            NRORGULTATU, CDOPERULTATU)
            VALUES (V_NEW_NRSEQFATUITCONT, V_NEW_NRSEQCONTRATO, V_NEW_NRITEMOCONTRATO, C_ITENSPAR.CDPRODFATURA, C_ITENSPAR.CDFILIALFATURA, C_ITENSPAR.NRGRUPOFATURA,
                    C_ITENSPAR.NRPARCFATURA, C_ITENSPAR.IDBLOQVRITMEDIC, P_NRORG, S, SYSDATE, NULL, P_NRORG, P_OPERADOR,
                   NULL, NULL);
            Se for um versionamento, inativa o registro da versÿ£o anterior
            IF P_TIPO = V THEN
               UPDATE FCT_PARAMFATITCONT
                  SET IDATIVO = N,
                      DTULTATU = SYSDATE,
                      NRORGULTATU = P_NRORG,
                      CDOPERULTATU = P_OPERADOR
                WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                  AND NRSEQFATUITCONT = C_ITENSPAR.NRSEQFATUITCONT
                  AND NRORG = P_NRORG;
            END IF;
        END LOOP;*/
        /* Se for um versionamento, inativa o registro da versÿ£o 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 NRITEMOCONTRATO = C_ITENS.NRITEMOCONTRATO
              AND NRORG = P_NRORG;
        END IF;
        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;
    /* 4 - Realiza a cÿ³pia 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)
                                    AND (IDSITUACAOCONTRATO = 'P' OR (IDSITUACAOCONTRATO IS NULL AND (SELECT COUNT(DOC.NRSEQMODDOCFCT)
                                                                                      FROM FCT_MODELODOCCONTR DOC
                                                                                      WHERE DOC.IDSITUACAOCONTRATO = 'P'
                                                                                        AND DOC.NRSEQMODCONTRA = FCT_MODELODOCCONTR.NRSEQMODCONTRA) = 0))) MODCONT
                        ON FCT_MODELODOC.NRORG = MODCONT.NRORG
                        AND FCT_MODELODOC.NRSEQMODDOCFCT = MODCONT.NRSEQMODDOCFCT
                      WHERE FCT_MODELODOC.NRORG = P_NRORG
    )LOOP
        /* Se for um versionamento, inativa o registro da versÿ£o 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 cÿ³digo de Parÿ¢metro de itens de Contrato */
        NOVO_CODIGO_NT('NRSEQCONTDOC', V_NEW_NRSEQCONTDOC, 1, P_NRORG);
        /* Insere a cÿ³pia dos documentos do contrato. */
        INSERT INTO FCT_CONTRATODOC (NRSEQCONTDOC, NRSEQCONTRATO, NRSEQMODDOCFCT, IDIDIOMA, TXMODELODOCORCA,
                                     NRORG, IDATIVO, DTINCLUSAO, DTULTATU, NRORGINCLUSAO, CDOPERINCLUSAO, NRORGULTATU, CDOPERULTATU)
        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);
    END LOOP;
    /* 5 - Realiza a cÿ³pia das parametrizaÿ§ÿµes 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 cÿ³digo de Parÿ¢metro de itens de Contrato */
        NOVO_CODIGO_NT('NRSEQREAJUS', V_NEW_NRSEQREAJUS, 1, P_NRORG);
        /* Insere a cÿ³pia 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 cÿ³pia dos indices das parametrizaÿ§ÿµes 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 cÿ³digo de Parÿ¢metro de itens de Contrato */
            NOVO_CODIGO_NT('NRSEQINDCONTR', V_NEW_NRSEQINDCONTR, 1, P_NRORG);
            /* Insere a cÿ³pia 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 versÿ£o 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 versÿ£o 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_NEGOCIACAO IN (
        SELECT NRTIPOORCAMENTO, IDTPFATURA,   VRTOTITEMCOMDESC, VRDESCITEM,
               CDFILIALFATURA,  NRPARCFATURA, CDTIPOOPERFATURA, CDSERIENF,
               CDEMPRESA,       CDINSCESTA,   CDINSCMUNI,       VRTOTITEM,
               VRPERCDESCITEM,  NRNEGOCIACAOCONTRATO
        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
        ) 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,       C_NEGOCIACAO.VRTOTITEM,
            C_NEGOCIACAO.VRPERCDESCITEM, C_NEGOCIACAO.VRDESCITEM,   C_NEGOCIACAO.VRTOTITEMCOMDESC, 'S',
            P_NRORG,                     SYSDATE,                   P_NRORG,                       P_OPERADOR,
            NULL,                        NULL,                      NULL
        );
        FOR C_ITNEGOCIACAO IN (
            SELECT ITNEGO.NRITEMORCAMENTO,    ITNEGO.VRPERCDESCITEM,  ITNEGO.NRPARCFATURA, ITNEGO.CDPRODFATURA,
                   ITNEGO.NRITEMORCAMENTOPAI, ITNEGO.VRTOTITEM,       ITNEGO.CDSERVORCA,   ITNEGO.VRDESCITEM,
                   ITNEGO.VRTOTITEMCOMDESC,   ITEM.NRITEMOCONTRATO
            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
            ) VALUES (
                V_NRITNEGOCIACAOCONTRATO,          V_NRNEGOCIACAOCONTRATO,   C_ITNEGOCIACAO.NRITEMORCAMENTO, C_ITNEGOCIACAO.VRPERCDESCITEM,
                C_ITNEGOCIACAO.NRITEMORCAMENTOPAI, C_ITNEGOCIACAO.VRTOTITEM, C_ITNEGOCIACAO.CDSERVORCA,      C_ITNEGOCIACAO.VRDESCITEM,
                C_ITNEGOCIACAO.VRTOTITEMCOMDESC,   'S',                      C_ITNEGOCIACAO.CDPRODFATURA,    C_ITNEGOCIACAO.NRPARCFATURA,
                P_NRORG,                           NULL,                     NULL,                           P_OPERADOR,
                P_NRORG,                           SYSDATE,                  C_ITNEGOCIACAO.NRITEMOCONTRATO
            );
        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, C_PARCENEGO.VRPARCELA,  '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,
                   VRTOTITEMCOMDESC,     QTMESESDESC,    DTFINALVALIDADEDESC
            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,
                DTFINALVALIDADEDESC,   IDATIVO,              NRORG,
                DTINCLUSAO,            NRORGINCLUSAO,        CDOPERINCLUSAO,
                DTULTATU,              NRORGULTATU,          CDOPERULTATU
            ) VALUES (
                V_NRDESCPERIODONEGOCONT,           V_NRNEGOCIACAOCONTRATO,         C_DESCPERIODO.VRPERCDESCITEM,
                C_DESCPERIODO.VRDESCITEM,          C_DESCPERIODO.VRTOTITEMCOMDESC, C_DESCPERIODO.QTMESESDESC,
                C_DESCPERIODO.DTFINALVALIDADEDESC, 'S',                            P_NRORG,
                SYSDATE,                           P_NRORG,                        P_OPERADOR,
                NULL,                              NULL,                           NULL
            );
        END LOOP; -- C_DESCPERIODO
    END LOOP; -- C_NEGOCIACAO
    UPDATE FCT_ITEMCONTRATO
    SET CDOPERULTATU = NULL
    WHERE NRSEQCONTRATO = V_NEW_NRSEQCONTRATO
        AND NRORG       = P_NRORG;
END;