ALTER TABLE FCT_ITMEDICAOFATURA ADD VRITEMCONT FLOAT(126) NULL
/

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;
    V_NRTRABSERVCONT         FCT_TRABSERVCONTRATO.NRTRABSERVCONT%TYPE;
    V_NRMEDIDACONTRATO       FCT_RELACMEDIDACONTRATO.NRMEDIDACONTRATO%TYPE;
    V_NRCOMPSERVCONT         FCT_COMPSERVCONTRATO.NRCOMPSERVCONT%TYPE;
    V_NRTIPOORCAMENTO        FCT_TIPOORCAMENTO.NRTIPOORCAMENTO%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, 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;

        /* 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;

    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,
                          IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL
                     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,
                                      IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL)
        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, C_ITENS.IDELEMENTO, C_ITENS.NMCONTRATUALITEMCONT, 
                C_ITENS.VRUNITITEMCONTTBLPRECO, C_ITENS.CDTPMEDIDAVARIAVEL);


        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,
                              IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL
                         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,
                                          IDELEMENTO, NMCONTRATUALITEMCONT, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL)
            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 , V_NEW_NRITEMOCONTRATOAD, C_ITENSAD.IDELEMENTO, C_ITENSAD.NMCONTRATUALITEMCONT, 
                    C_ITENSAD.VRUNITITEMCONTTBLPRECO, C_ITENSAD.CDTPMEDIDAVARIAVEL);
        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;

    /** 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;

    /* 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)) 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_ELEMENTOS IN (
        SELECT NRTRABSERVCONT,  NRSEQCONTRATO,    NRTIPOORCAMENTO,
            NRCOMPSERVICO,   NRITCOMPSERVICO,  IDESCOLHIDO,
            CDSERVORCA,      QTSERVORCA,       CDTPMEDIDASERV,
            QTMEDSERVORCA,   VRUNITSERVORCA,   VRTOTSERVORCA,
            IDELEMENTO,      IDELEMENTOPAI,    IDTIPOELEMENTO,
            IDSERVOBRIGCOMP, QTMEDIDAVARIAVEL, QTMEDIDACALC
        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
        ) 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,
            C_ELEMENTOS.QTMEDSERVORCA,   C_ELEMENTOS.VRUNITSERVORCA,    C_ELEMENTOS.VRTOTSERVORCA,
            C_ELEMENTOS.IDELEMENTO,      C_ELEMENTOS.IDELEMENTOPAI,     C_ELEMENTOS.IDTIPOELEMENTO,
            C_ELEMENTOS.IDSERVOBRIGCOMP, C_ELEMENTOS.QTMEDIDAVARIAVEL,  C_ELEMENTOS.QTMEDIDACALC,
            P_NRORG,                     'S',                           SYSDATE,
            NULL,                        P_NRORG,                       P_OPERADOR,
            NULL,                        NULL
        );

    END LOOP; -- C_ELEMENTOS

    FOR C_TPMEDIDA IN (
        SELECT NRMEDIDACONTRATO, NRSEQCONTRATO,  CDTPMEDIDAVARIAVEL,
               QTMEDIDAVARIAVEL, IDELEMENTORAIZ, QTFRANQUIA
        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
        ) VALUES (
            V_NRMEDIDACONTRATO,          V_NEW_NRSEQCONTRATO,       C_TPMEDIDA.CDTPMEDIDAVARIAVEL,
            C_TPMEDIDA.QTMEDIDAVARIAVEL, C_TPMEDIDA.IDELEMENTORAIZ, C_TPMEDIDA.QTFRANQUIA,
            P_NRORG,                     SYSDATE,                   NULL,
            P_NRORG,                     P_OPERADOR,                NULL,
            NULL,                        'S'
        );

    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      
        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,   ITNEGO.NRITEMCONTRATOPAI
            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
            ) 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, C_ITNEGOCIACAO.NRITEMCONTRATOPAI 
            );

        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;
/


create or replace PROCEDURE FCT_GERAR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG         IN NUMBER,
    P_CDOPERADOR    IN VARCHAR2
)
AS
    V_QTDIASFATURAMENTO_ANT NUMBER;
    V_DTINICOMPET_ATUAL     DATE;
    V_DTFINCOMPET_ATUAL     DATE;
    V_NRDIASVENCIMENTO      NUMBER;
    V_QTDIASFATUVENC        NUMBER;
    V_DTVENCIMENTO          DATE;
    V_VRDIFERENCA           FLOAT;
    V_VRVENCIMENTOITEM      FLOAT;
    V_SOMA_VRVENCIMENTOITEM FLOAT;
    V_COUNT_ITEM            NUMBER;
    V_PARAM_ESCOPO          FCT_PARAMFATESC%ROWTYPE;
    V_VRTOTITEMCOMDESC      FLOAT;
    V_VRDESCITEM            FLOAT;
    V_VRPERCDESCITEM        FLOAT;
    V_IDSITUACAO            CHAR(1);
    V_VALIDAMEDIDACONT      NUMBER;

    --NOVO CODIGO
    V_NRFATURACONT          VARCHAR2(20);
    V_NRITFATURACONT        VARCHAR2(20);
    V_NRAGRUPCONTFAT        FCT_RELACAGRUPCONTFAT.NRAGRUPCONTFAT%TYPE;
    V_NRITMEDICAOFATURA     FCT_ITMEDICAOFATURA.NRITMEDICAOFATURA%TYPE;
    V_NRMEDICAOFATURA       FCT_MEDICAOFATURA.NRMEDICAOFATURA%TYPE;
    V_NRMEDVARMEDICAOFATURA FCT_MEDVARMEDICAOFATURA.NRMEDVARMEDICAOFATURA%TYPE;
    V_NRSEQORCAMENTO_ORIGEM FCT_ORCAMENTO.NRSEQORCAMENTO%TYPE;

    V_ULTDIAMES             FCT_COMPETENCIANEGOCONT.NRDIACOMPETINI%TYPE;
    V_NRAGRUPAMENTO         FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_IDPARCAGRUP           FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
BEGIN
    -- Manda deletar as parcelas e medições no caso de regeração do faturamento
    FCT_EXCLUIR_PARCELAS_FATURA(P_NRSEQCONTRATO, P_NRORG);

    -- Verifica se o contrato faz parte de um agrupamento
    BEGIN
        SELECT NRAGRUPAMENTO
        INTO V_NRAGRUPAMENTO
        FROM FCT_RELACAGRUPAMENTOCONT
        WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
            AND NRORG       = P_NRORG;
    EXCEPTION WHEN NO_DATA_FOUND THEN
        V_NRAGRUPAMENTO := NULL;
    END;

    FOR C_NEGOCIACAO IN (
        SELECT NEG.NRSEQCONTRATO,
               NEG.NRTIPOORCAMENTO,
               NEG.IDTPFATURA,
               NEG.VRPERCDESCITEM,
               NEG.VRDESCITEM,
               NEG.VRTOTITEM,
               NEG.VRTOTITEMCOMDESC,
               NVL(CONT.DTINIVIGENCONT, CONT.DTINICIOCONTRATO) AS DTINICIOCONTRATO,
               NVL(CONT.DTFINVIGENCONT, CONT.DTFIMCONTRATO) AS DTFIMCONTRATO,
               NEG.NRNEGOCIACAOCONTRATO,
               NEG.CDFILIALFATURA,
               NEG.NRPARCFATURA,
               NEG.CDTIPOOPERFATURA,
               NEG.CDSERIENF,
               NEG.CDEMPRESA,
               NEG.CDINSCESTA,
               NEG.CDINSCMUNI,
               /*NEG.QTPARCELASFATU,
               NEG.QTDIASAPURACAO,
               NEG.IDTPCALCVENC,
               NEG.NRDIACALCVENC,
               NEG.IDMESCALCVENC,
               NEG.QTDIASFATUVENC,*/
               (SELECT COUNT(*)
                  FROM FCT_ITNEGOCIACAOCONTRATO
                 WHERE NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                   AND NRORG                = NEG.NRORG
                   AND NRITEMORCAMENTOPAI   IS NULL) AS QTITEM
          FROM FCT_NEGOCIACAOCONTRATO NEG
         INNER JOIN FCT_CONTRATO CONT
            ON NEG.NRSEQCONTRATO = CONT.NRSEQCONTRATO
           AND NEG.NRORG         = CONT.NRORG
         WHERE NEG.NRSEQCONTRATO = P_NRSEQCONTRATO
           AND NEG.NRORG         = P_NRORG
    ) LOOP

        V_NRFATURACONT := NULL;
        V_IDPARCAGRUP  := 'N';
        /*
        IDTPFATURA
        A = Periodico (valor de parcela fixo)
        X = Periodico (Valor Apurado por Medicao)
        P = Parcelamento (Quantidade de Parcelas)
        */
        IF (C_NEGOCIACAO.IDTPFATURA = 'P') THEN

            V_QTDIASFATURAMENTO_ANT := -1;

            FOR C_PARCELAS IN (
                SELECT ROWNUM AS NRPARCELA,
                       PARCELA.*
                  FROM (SELECT PARC.QTDIASFATURAMENTO,
                               PARC.NRDIAVENCIMENTO,
                               PARC.VRPARCELA
                          FROM FCT_PARCELANEGOCONT PARC
                         WHERE PARC.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                           AND PARC.NRORG                = P_NRORG
                         ORDER BY QTDIASFATURAMENTO) PARCELA
            ) LOOP

                V_DTINICOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO + V_QTDIASFATURAMENTO_ANT + 1;
                V_DTFINCOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO + C_PARCELAS.QTDIASFATURAMENTO;

                SELECT *
                INTO V_PARAM_ESCOPO
                FROM FCT_PARAMFATESC
                WHERE NRTIPOORCAMENTO = C_NEGOCIACAO.NRTIPOORCAMENTO
                  AND NRORG           = P_NRORG;

                --INICIO: calculo da data de vencimento da NF
                IF (C_PARCELAS.NRDIAVENCIMENTO IS NOT NULL) THEN

                    V_NRDIASVENCIMENTO := NULL;
                    V_QTDIASFATUVENC := NULL;
                    V_DTVENCIMENTO := TO_DATE(LPAD(C_PARCELAS.NRDIAVENCIMENTO, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                    IF (V_DTVENCIMENTO < V_DTFINCOMPET_ATUAL) THEN
                        V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                    END IF;

                    IF (V_PARAM_ESCOPO.IDTPCALCVENC = '1' AND V_PARAM_ESCOPO.QTDIASFATUVENC IS NOT NULL) THEN
                        V_QTDIASFATUVENC := V_PARAM_ESCOPO.QTDIASFATUVENC;
                    END IF;

                ELSE

                    IF (V_PARAM_ESCOPO.IDTPCALCVENC = '1') THEN --dia fixo

                        V_NRDIASVENCIMENTO := NULL;
                        V_QTDIASFATUVENC := V_PARAM_ESCOPO.QTDIASFATUVENC;

                        --data de vencimento para o mes atual
                        V_DTVENCIMENTO := TO_DATE(LPAD(V_PARAM_ESCOPO.NRDIACALCVENC, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');

                        IF (V_PARAM_ESCOPO.IDMESCALCVENC = '1') THEN --mes anterior

                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, -1);

                        ELSIF (V_PARAM_ESCOPO.IDMESCALCVENC = '3') THEN --proximo mes

                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);

                        END IF;

                    ELSE --quantidade de dias apos data de emissao

                        V_DTVENCIMENTO := NULL;
                        V_NRDIASVENCIMENTO := C_PARCELAS.NRDIAVENCIMENTO;
                        V_QTDIASFATUVENC := NULL;

                    END IF;

                END IF;
                --FIM: calculo da data de vencimento da NF

                -- Valida se a parcela gerada será paralisada
                BEGIN
                    SELECT '5' AS IDSITUACAO
                    INTO V_IDSITUACAO
                    FROM FCT_PARAMPARALISACAOCONT
                    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG       = P_NRORG
                        AND DTRETOMADAFATURA > SYSDATE
                        AND (DTINIPARALISACAO BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL
                            OR (DTRETOMADAFATURA BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL))
                    GROUP BY 1;
                EXCEPTION WHEN NO_DATA_FOUND THEN
                    V_IDSITUACAO := '1';
                END;

                V_NRFATURACONT := NULL;
                V_IDPARCAGRUP  := 'N';

                -- Verifica se há uma parcela pendente inserida para o agrupamento
                IF(V_NRAGRUPAMENTO IS NOT NULL) THEN
                    V_IDPARCAGRUP := 'S';
                    BEGIN
                        SELECT DISTINCT PARCELA.NRFATURACONT
                        INTO V_NRFATURACONT
                        FROM FCT_FATURACONT PARCELA
                        INNER JOIN FCT_RELACAGRUPCONTFAT PARCCONT
                          ON PARCELA.NRFATURACONT = PARCCONT.NRFATURACONT
                          AND PARCELA.NRORG       = PARCCONT.NRORG
                        INNER JOIN FCT_RELACAGRUPAMENTOCONT AGRUPCONT
                          ON PARCCONT.NRSEQCONTRATO = AGRUPCONT.NRSEQCONTRATO
                          AND PARCCONT.NRORG        = AGRUPCONT.NRORG
                        INNER JOIN FCT_AGRUPAMENTO AGRUP
                          ON AGRUPCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                          AND AGRUPCONT.NRORG        = AGRUP.NRORG
                        WHERE AGRUP.NRAGRUPAMENTO      = V_NRAGRUPAMENTO
                          AND PARCELA.IDSITUACAO       = '1'
                          AND PARCELA.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                          AND PARCELA.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                          AND PARCELA.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                          AND PARCELA.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                          AND PARCELA.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                          AND PARCELA.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                          AND PARCELA.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                          AND PARCELA.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                          AND TO_CHAR(PARCELA.DTINICOMPET, 'DD/MM/YYYY') = V_DTINICOMPET_ATUAL
                          AND TO_CHAR(PARCELA.DTFINCOMPET, 'DD/MM/YYYY') = V_DTFINCOMPET_ATUAL;
                    EXCEPTION WHEN NO_DATA_FOUND THEN
                        V_NRFATURACONT := NULL;
                    END;
                END IF;

                IF(V_NRFATURACONT IS NULL) THEN
                    NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
                    INSERT INTO FCT_FATURACONT (
                        NRFATURACONT,
                        NRSEQCONTRATO,
                        CDFILIALFATURA,
                        NRPARCFATURA,
                        CDTIPOOPERFATURA,
                        CDSERIENF,
                        CDEMPRESA,
                        CDINSCESTA,
                        CDINSCMUNI,
                        IDTPFATURA,
                        IDSITUACAO,
                        DTINICOMPET,
                        DTFINCOMPET,
                        DTLIMITEAPU,
                        DTVENCIMENTO,
                        NRDIASVENCIMENTO,
                        QTDIASFATUVENC,
                        VRVENCIMENTO,
                        VRFATURADO,
                        VRFALTAFATURAR,
                        IDFORMAFATURA,
                        DSJUSTIFICATIVA,
                        NRAPURACAO,
                        NRMEDICAOFATURA,
                        IDALTUSUARIO,
                        IDATIVO,
                        NRORG,
                        DTINCLUSAO,
                        NRORGINCLUSAO,
                        CDOPERINCLUSAO
                    )
                    VALUES (
                        V_NRFATURACONT,
                        NULL,
                        C_NEGOCIACAO.CDFILIALFATURA,
                        C_NEGOCIACAO.NRPARCFATURA,
                        C_NEGOCIACAO.CDTIPOOPERFATURA,
                        C_NEGOCIACAO.CDSERIENF,
                        C_NEGOCIACAO.CDEMPRESA,
                        C_NEGOCIACAO.CDINSCESTA,
                        C_NEGOCIACAO.CDINSCMUNI,
                        C_NEGOCIACAO.IDTPFATURA,
                        V_IDSITUACAO,
                        V_DTINICOMPET_ATUAL,
                        V_DTFINCOMPET_ATUAL,
                        V_DTFINCOMPET_ATUAL + V_PARAM_ESCOPO.QTDIASAPURACAO,
                        V_DTVENCIMENTO,
                        V_NRDIASVENCIMENTO,
                        V_QTDIASFATUVENC,
                        C_PARCELAS.VRPARCELA,
                        0,
                        C_PARCELAS.VRPARCELA,
                        NULL,
                        NULL,
                        NULL,
                        NULL,
                        'N',
                        'S',
                        P_NRORG,
                        SYSDATE,
                        P_NRORG,
                        P_CDOPERADOR
                    );
                ELSE
                    UPDATE FCT_FATURACONT
                        SET VRVENCIMENTO  = VRVENCIMENTO + C_PARCELAS.VRPARCELA,
                           VRFALTAFATURAR = VRVENCIMENTO + C_PARCELAS.VRPARCELA
                    WHERE NRFATURACONT  = V_NRFATURACONT
                      AND NRORG         = P_NRORG;
                END IF;

                BEGIN
                    SELECT NRAGRUPCONTFAT
                    INTO V_NRAGRUPCONTFAT
                    FROM FCT_RELACAGRUPCONTFAT
                    WHERE NRFATURACONT    = V_NRFATURACONT
                        AND NRSEQCONTRATO = P_NRSEQCONTRATO
                        AND NRORG         = P_NRORG;
                EXCEPTION WHEN NO_DATA_FOUND THEN
                  V_NRAGRUPCONTFAT := NULL;
                END;

                IF(V_NRAGRUPCONTFAT IS NULL) THEN
                    NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                    INSERT INTO FCT_RELACAGRUPCONTFAT (
                       NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
                       NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
                       CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
                       NRORGINCLUSAO)
                    VALUES (
                          V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       P_NRSEQCONTRATO,
                          P_NRORG,              'S',            SYSDATE,             NULL,
                          P_CDOPERADOR,          NULL,          NULL,                NULL,
                          P_NRORG);
                END IF;

                V_VRDIFERENCA    := C_NEGOCIACAO.VRTOTITEMCOMDESC - C_PARCELAS.VRPARCELA;
                V_VRPERCDESCITEM := (V_VRDIFERENCA / C_NEGOCIACAO.VRTOTITEMCOMDESC) * 100;

                FOR C_ITNEGOCIACAO IN (
                    SELECT ITNEG.NRITEMOCONTRATO,
                           ITNEG.VRTOTITEM,
                           ITNEG.VRPERCDESCITEM,
                           ITNEG.VRDESCITEM,
                           ITNEG.VRTOTITEMCOMDESC,
                           ITNEG.CDPRODFATURA
                      FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                     WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                       AND ITNEG.NRORG                = P_NRORG
             AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                       AND ITNEG.NRITEMCONTRATOPAI IS NULL
                ) LOOP

                    V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEMCOMDESC - (C_ITNEGOCIACAO.VRTOTITEMCOMDESC * V_VRPERCDESCITEM / 100);

                    NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
                    INSERT INTO FCT_ITFATURACONT (
                        NRITFATURACONT,
                        NRFATURACONT,
                        NRSEQCONTRATO,
                        NRITEMOCONTRATO,
                        CDPRODFATURA,
                        IDSITUACAO,
                        VRVENCIMENTO,
                        VRFATURADO,
                        VRFALTAFATURAR,
                        IDFORMAFATURA,
                        DSJUSTIFICATIVA,
                        NRAPURACAO,
                        IDATIVO,
                        NRORG,
                        DTINCLUSAO,
                        NRORGINCLUSAO,
                        CDOPERINCLUSAO
                    )
                    VALUES (
                        V_NRITFATURACONT,
                        V_NRFATURACONT,
                        P_NRSEQCONTRATO,
                        C_ITNEGOCIACAO.NRITEMOCONTRATO,
                        C_ITNEGOCIACAO.CDPRODFATURA,
                        V_IDSITUACAO,
                        V_VRVENCIMENTOITEM,
                        0,
                        V_VRVENCIMENTOITEM,
                        NULL,
                        NULL,
                        NULL,
                        'S',
                        P_NRORG,
                        SYSDATE,
                        P_NRORG,
                        P_CDOPERADOR
                    );

                END LOOP; --C_ITNEGOCIACAO;

                V_QTDIASFATURAMENTO_ANT := C_PARCELAS.QTDIASFATURAMENTO;

            END LOOP; --C_PARCELAS

        ELSE --C_NEGOCIACAO.IDTPFATURA = 'A' ou 'X'

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

                V_ULTDIAMES := EXTRACT(DAY FROM(LAST_DAY(C_NEGOCIACAO.DTINICIOCONTRATO)));

                IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETINI THEN
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(V_ULTDIAMES, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                END IF;

                IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETFIN THEN
                    V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(V_ULTDIAMES, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETFIN, 2, '0') || '/' || TO_CHAR(C_NEGOCIACAO.DTINICIOCONTRATO, 'MM/YYYY'), 'DD/MM/YYYY');
                END IF;

                IF (C_COMPETENCIA.IDMESCOMPETINI = '1') THEN
                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, -1);
                ELSIF (C_COMPETENCIA.IDMESCOMPETINI = '3') THEN
                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                END IF;

                IF (C_COMPETENCIA.IDMESCOMPETFIN = '1') THEN
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, -1);
                ELSIF (C_COMPETENCIA.IDMESCOMPETFIN = '3') THEN
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                END IF;

                WHILE (V_DTINICOMPET_ATUAL <= C_NEGOCIACAO.DTFIMCONTRATO) LOOP
                    V_NRFATURACONT := NULL;
                    V_IDPARCAGRUP  := 'N';

                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');

                    IF (V_DTINICOMPET_ATUAL < C_NEGOCIACAO.DTINICIOCONTRATO) THEN
                        IF (V_DTFINCOMPET_ATUAL < C_NEGOCIACAO.DTINICIOCONTRATO) THEN
                            V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                            V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                            CONTINUE;
                        ELSE
                            V_DTINICOMPET_ATUAL := C_NEGOCIACAO.DTINICIOCONTRATO;
                        END IF;
                    END IF;

                    IF(V_DTFINCOMPET_ATUAL > C_NEGOCIACAO.DTFIMCONTRATO) THEN
                        V_DTFINCOMPET_ATUAL := C_NEGOCIACAO.DTFIMCONTRATO;
                    END IF;

                    --INICIO: calculo da data de vencimento da NF
                    --dia fixo
                    IF (C_COMPETENCIA.IDTPCALCVENC = '1') THEN

                        V_DTVENCIMENTO := TO_DATE(LPAD(C_COMPETENCIA.NRDIACALCVENC, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');

                        IF (C_COMPETENCIA.IDMESCALCVENC = '1') THEN --mes anterior
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, -1);
                        ELSIF (C_COMPETENCIA.IDMESCALCVENC = '3') THEN --proximo mes
                            V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                        END IF;

                        V_NRDIASVENCIMENTO := NULL;
                        V_QTDIASFATUVENC := C_COMPETENCIA.QTDIASFATUVENC;

                    ELSE --quantidade de dias apos data de emissao

                        V_DTVENCIMENTO := NULL;
                        V_NRDIASVENCIMENTO := C_COMPETENCIA.NRDIACALCVENC;
                        V_QTDIASFATUVENC := NULL;

                    END IF;
                    --FIM: calculo da data de vencimento da NF

                    BEGIN
                        SELECT DESCPER.VRTOTITEMCOMDESC, DESCPER.VRDESCITEM
                          INTO V_VRTOTITEMCOMDESC, V_VRDESCITEM
                          FROM (SELECT VRTOTITEMCOMDESC,
                                       VRPERCDESCITEM,
                                       VRDESCITEM,
                                       QTMESESDESC,
                                       DTFINALVALIDADEDESC
                                  FROM FCT_DESCPERIODONEGOCONT
                                 WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND NRORG                = P_NRORG
                                   AND V_DTINICOMPET_ATUAL  < DTFINALVALIDADEDESC
                                 ORDER BY DTFINALVALIDADEDESC) DESCPER
                         WHERE ROWNUM = 1;
                    EXCEPTION WHEN NO_DATA_FOUND THEN
                        V_VRTOTITEMCOMDESC := C_NEGOCIACAO.VRTOTITEMCOMDESC;
                        V_VRDESCITEM       := 0;
                    END;

                    IF (V_VRTOTITEMCOMDESC > 0) THEN

                        -- Valida se a parcela gerada será paralisada
                        BEGIN
                            SELECT '5' AS IDSITUACAO
                            INTO V_IDSITUACAO
                            FROM FCT_PARAMPARALISACAOCONT
                            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                AND NRORG       = P_NRORG
                                AND DTRETOMADAFATURA > SYSDATE
                                AND (DTINIPARALISACAO BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL
                                    OR (DTRETOMADAFATURA BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL))
                            GROUP BY 1;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                            V_IDSITUACAO := '1';
                        END;

                        IF (C_NEGOCIACAO.IDTPFATURA = 'A') THEN
                            -- Verifica se há uma parcela pendente inserida para o agrupamento
                            IF(V_NRAGRUPAMENTO IS NOT NULL) THEN
                                BEGIN
                                    SELECT DISTINCT PARCELA.NRFATURACONT
                                    INTO V_NRFATURACONT
                                    FROM FCT_FATURACONT PARCELA
                                    INNER JOIN FCT_RELACAGRUPCONTFAT PARCCONT
                                      ON PARCELA.NRFATURACONT = PARCCONT.NRFATURACONT
                                      AND PARCELA.NRORG       = PARCCONT.NRORG
                                    INNER JOIN FCT_RELACAGRUPAMENTOCONT AGRUPCONT
                                      ON PARCCONT.NRSEQCONTRATO = AGRUPCONT.NRSEQCONTRATO
                                      AND PARCCONT.NRORG        = AGRUPCONT.NRORG
                                    INNER JOIN FCT_AGRUPAMENTO AGRUP
                                      ON AGRUPCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                                      AND AGRUPCONT.NRORG        = AGRUP.NRORG
                                    WHERE AGRUP.NRAGRUPAMENTO      = V_NRAGRUPAMENTO
                                      AND PARCELA.IDSITUACAO       = '1'
                                      AND PARCELA.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                                      AND PARCELA.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                                      AND PARCELA.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                                      AND PARCELA.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                                      AND PARCELA.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                                      AND PARCELA.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                                      AND PARCELA.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                                      AND PARCELA.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                                      AND TO_CHAR(PARCELA.DTINICOMPET, 'DD/MM/YYYY') = V_DTINICOMPET_ATUAL
                                      AND TO_CHAR(PARCELA.DTFINCOMPET, 'DD/MM/YYYY') = V_DTFINCOMPET_ATUAL;
                                EXCEPTION WHEN NO_DATA_FOUND THEN
                                    V_NRFATURACONT := NULL;
                                END;
                            END IF;

                            IF V_NRFATURACONT IS NOT NULL THEN
                                UPDATE FCT_FATURACONT
                                    SET VRVENCIMENTO  = VRVENCIMENTO + V_VRTOTITEMCOMDESC,
                                       VRFALTAFATURAR = VRVENCIMENTO + V_VRTOTITEMCOMDESC
                                WHERE NRFATURACONT  = V_NRFATURACONT
                                  AND NRORG         = P_NRORG;
                            ELSE
                                NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
                                INSERT INTO FCT_FATURACONT (
                                    NRFATURACONT,
                                    NRSEQCONTRATO,
                                    CDFILIALFATURA,
                                    NRPARCFATURA,
                                    CDTIPOOPERFATURA,
                                    CDSERIENF,
                                    CDEMPRESA,
                                    CDINSCESTA,
                                    CDINSCMUNI,
                                    IDTPFATURA,
                                    IDSITUACAO,
                                    DTINICOMPET,
                                    DTFINCOMPET,
                                    DTLIMITEAPU,
                                    DTVENCIMENTO,
                                    NRDIASVENCIMENTO,
                                    QTDIASFATUVENC,
                                    VRVENCIMENTO,
                                    VRFATURADO,
                                    VRFALTAFATURAR,
                                    IDFORMAFATURA,
                                    DSJUSTIFICATIVA,
                                    NRAPURACAO,
                                    NRMEDICAOFATURA,
                                    IDALTUSUARIO,
                                    IDATIVO,
                                    NRORG,
                                    DTINCLUSAO,
                                    NRORGINCLUSAO,
                                    CDOPERINCLUSAO
                                )
                                VALUES (
                                    V_NRFATURACONT,
                                    NULL,
                                    C_NEGOCIACAO.CDFILIALFATURA,
                                    C_NEGOCIACAO.NRPARCFATURA,
                                    C_NEGOCIACAO.CDTIPOOPERFATURA,
                                    C_NEGOCIACAO.CDSERIENF,
                                    C_NEGOCIACAO.CDEMPRESA,
                                    C_NEGOCIACAO.CDINSCESTA,
                                    C_NEGOCIACAO.CDINSCMUNI,
                                    C_NEGOCIACAO.IDTPFATURA,
                                    V_IDSITUACAO,
                                    V_DTINICOMPET_ATUAL,
                                    V_DTFINCOMPET_ATUAL,
                                    V_DTFINCOMPET_ATUAL + C_COMPETENCIA.QTDIASAPURACAO,
                                    V_DTVENCIMENTO,
                                    V_NRDIASVENCIMENTO,
                                    V_QTDIASFATUVENC,
                                    V_VRTOTITEMCOMDESC,
                                    0,
                                    V_VRTOTITEMCOMDESC,
                                    NULL,
                                    NULL,
                                    NULL,
                                    NULL,
                                    'N',
                                    'S',
                                    P_NRORG,
                                    SYSDATE,
                                    P_NRORG,
                                    P_CDOPERADOR
                                );
                            END IF;

                            BEGIN
                                SELECT NRAGRUPCONTFAT
                                INTO V_NRAGRUPCONTFAT
                                FROM FCT_RELACAGRUPCONTFAT
                                WHERE NRFATURACONT    = V_NRFATURACONT
                                    AND NRSEQCONTRATO = P_NRSEQCONTRATO
                                    AND NRORG         = P_NRORG;
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                              V_NRAGRUPCONTFAT := NULL;
                            END;

                            IF(V_NRAGRUPCONTFAT IS NULL) THEN
                              NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
                              INSERT INTO FCT_RELACAGRUPCONTFAT (
                                   NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
                                   NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
                                   CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
                                   NRORGINCLUSAO)
                              VALUES (
                                      V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       P_NRSEQCONTRATO,
                                      P_NRORG,              'S',            SYSDATE,             NULL,
                                      P_CDOPERADOR,          NULL,          NULL,                NULL,
                                      P_NRORG);
                            END IF;
                            V_VRPERCDESCITEM := (V_VRDESCITEM / V_VRTOTITEMCOMDESC) * 100;

                            FOR C_ITNEGOCIACAO IN (
                                SELECT ITNEG.NRITEMOCONTRATO,
                                       ITNEG.VRTOTITEM,
                                       ITNEG.VRPERCDESCITEM,
                                       ITNEG.VRDESCITEM,
                                       ITNEG.VRTOTITEMCOMDESC,
                                       ITNEG.CDPRODFATURA
                                  FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                 WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND ITNEG.NRORG                = P_NRORG
                                   AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                                   AND ITNEG.NRITEMCONTRATOPAI IS NULL
                            ) LOOP

                                V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEMCOMDESC - (C_ITNEGOCIACAO.VRTOTITEMCOMDESC * C_NEGOCIACAO.VRPERCDESCITEM / 100);
                                V_VRVENCIMENTOITEM := V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * V_VRPERCDESCITEM / 100);

                                NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
                                INSERT INTO FCT_ITFATURACONT (
                                    NRITFATURACONT,
                                    NRFATURACONT,
                                    NRSEQCONTRATO,
                                    NRITEMOCONTRATO,
                                    CDPRODFATURA,
                                    IDSITUACAO,
                                    VRVENCIMENTO,
                                    VRFATURADO,
                                    VRFALTAFATURAR,
                                    IDFORMAFATURA,
                                    DSJUSTIFICATIVA,
                                    NRAPURACAO,
                                    IDATIVO,
                                    NRORG,
                                    DTINCLUSAO,
                                    NRORGINCLUSAO,
                                    CDOPERINCLUSAO
                                )
                                VALUES (
                                    V_NRITFATURACONT,
                                    V_NRFATURACONT,
                                    P_NRSEQCONTRATO,
                                    C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                    C_ITNEGOCIACAO.CDPRODFATURA,
                                    V_IDSITUACAO,
                                    V_VRVENCIMENTOITEM,
                                    0,
                                    V_VRVENCIMENTOITEM,
                                    NULL,
                                    NULL,
                                    NULL,
                                    'S',
                                    P_NRORG,
                                    SYSDATE,
                                    P_NRORG,
                                    P_CDOPERADOR
                                );

                            END LOOP; --C_ITNEGOCIACAO

                        ELSE --C_NEGOCIACAO.IDTPFATURA = 'X'
                            NOVO_CODIGO_SC('FCT_MEDICAOFATURA', V_NRMEDICAOFATURA, 1, P_NRORG);
                            INSERT INTO FCT_MEDICAOFATURA (
                                NRMEDICAOFATURA,
                                NRSEQCONTRATO,
                                CDFILIALFATURA,
                                NRPARCFATURA,
                                CDTIPOOPERFATURA,
                                CDSERIENF,
                                CDEMPRESA,
                                CDINSCESTA,
                                CDINSCMUNI,
                                IDSITUACAO,
                                DTINICOMPET,
                                DTFINCOMPET,
                                DTLIMITEAPU,
                                DTVENCIMENTO,
                                NRDIASVENCIMENTO,
                                QTDIASFATUVENC,
                                VRMEDICAO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO
                            )
                            VALUES (
                                V_NRMEDICAOFATURA,
                                P_NRSEQCONTRATO,
                                C_NEGOCIACAO.CDFILIALFATURA,
                                C_NEGOCIACAO.NRPARCFATURA,
                                C_NEGOCIACAO.CDTIPOOPERFATURA,
                                C_NEGOCIACAO.CDSERIENF,
                                C_NEGOCIACAO.CDEMPRESA,
                                C_NEGOCIACAO.CDINSCESTA,
                                C_NEGOCIACAO.CDINSCMUNI,
                                V_IDSITUACAO,
                                V_DTINICOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL + C_COMPETENCIA.QTDIASAPURACAO,
                                V_DTVENCIMENTO,
                                V_NRDIASVENCIMENTO,
                                V_QTDIASFATUVENC,
                                0,
                                'S',
                                P_NRORG,
                                SYSDATE,
                                P_NRORG,
                                P_CDOPERADOR
                            );

                            --Buscar o codigo da proposta que gerou o contrato
                            BEGIN
                                SELECT NRSEQORCAMENTO
                                  INTO V_NRSEQORCAMENTO_ORIGEM
                                  FROM FCT_REFEORCACONT
                                 WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                   AND NRORG         = P_NRORG;
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                                RAISE_APPLICATION_ERROR('-20001', 'CONTRATO_SEM_PROPOSTA');
                            END;

                            V_VRPERCDESCITEM := (V_VRDESCITEM/V_VRTOTITEMCOMDESC) * 100;

                            FOR C_ITNEGOCIACAO IN (
                                SELECT ITNEG.NRITEMOCONTRATO,
                                       ITNEG.VRPERCDESCITEM,
                                       ITNEG.VRDESCITEM,
                                       ITNEG.VRTOTITEMCOMDESC,
                                       ITNEG.CDPRODFATURA,
                                       ITNEG.CDSERVORCA,
                                       (SELECT SUM(VRTOTITEM)
                                          FROM FCT_ITNEGOCIACAOCONTRATO
                                          WHERE (NRITEMCONTRATOPAI  = ITNEG.NRITEMOCONTRATO
                                              OR NRITEMORCAMENTOPAI = ITNEG.NRITEMORCAMENTO)) AS VRTOTITEM
                                  FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                  WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                   AND ITNEG.NRORG                 = P_NRORG
                                   AND ITNEG.NRITEMOCONTRATO IS NOT NULL
                                   AND ITNEG.NRITEMCONTRATOPAI IS NULL
                            ) LOOP

                                IF C_NEGOCIACAO.VRDESCITEM IS NOT NULL AND C_NEGOCIACAO.VRDESCITEM <> 0 THEN
                                    V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEM - (C_ITNEGOCIACAO.VRTOTITEM * (C_NEGOCIACAO.VRDESCITEM / C_NEGOCIACAO.VRTOTITEM));
                                ELSE
                                    V_VRVENCIMENTOITEM := C_ITNEGOCIACAO.VRTOTITEMCOMDESC;
                                END IF;

                                V_VRVENCIMENTOITEM := V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * V_VRPERCDESCITEM / 100);

                                NOVO_CODIGO_SC('FCT_ITMEDICAOFATURA', V_NRITMEDICAOFATURA, 1, P_NRORG);
                                INSERT INTO FCT_ITMEDICAOFATURA (
                                    NRITMEDICAOFATURA,
                                    NRMEDICAOFATURA,
                                    NRSEQCONTRATO,
                                    NRITEMOCONTRATO,
                                    CDSERVORCA,
                                    CDPRODFATURA,
                                    IDSITUACAO,
                                    VRTOTITEMCONT,
                                    IDATIVO,
                                    NRORG,
                                    DTINCLUSAO,
                                    NRORGINCLUSAO,
                                    CDOPERINCLUSAO,
                                    DTULTATU,
                                    NRORGULTATU,
                                    CDOPERULTATU,
                                    VRITEMCONT
                                )
                                VALUES (
                                    V_NRITMEDICAOFATURA,
                                    V_NRMEDICAOFATURA,
                                    P_NRSEQCONTRATO,
                                    C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                    C_ITNEGOCIACAO.CDSERVORCA,
                                    C_ITNEGOCIACAO.CDPRODFATURA,
                                    V_IDSITUACAO,
                                    C_ITNEGOCIACAO.VRTOTITEM,
                                    'S',
                                    P_NRORG,
                                    SYSDATE,
                                    P_NRORG,
                                    P_CDOPERADOR,
                                    NULL,
                                    NULL,
                                    NULL,
                                    V_VRVENCIMENTOITEM
                                );


                               SELECT COUNT(*)
                                 INTO V_VALIDAMEDIDACONT
                                 FROM FCT_RELACMEDIDACONTRATO
                                WHERE NRSEQCONTRATO  = P_NRSEQCONTRATO
                                  AND NRORG          = P_NRORG;

                                FOR C_MEDIDASIT IN (
                                    SELECT REL.IDELEMENTORAIZ,
                                           REL.CDTPMEDIDAVARIAVEL,
                                           REL.QTMEDIDAVARIAVEL,
                                           NVL(REL.QTFRANQUIA, 0) AS QTFRANQUIA,
                                           VAR.IDMULTIPVARIACAO
                                    FROM FCT_RELACMEDIDACONTRATO REL
                                    LEFT JOIN FCT_VARPRECBASESERVCONT VAR
                                        ON REL.NRSEQCONTRATO       = VAR.NRSEQCONTRATO
                                        AND REL.CDTPMEDIDAVARIAVEL = VAR.CDTPMEDIDAVARIAVEL
                                        AND REL.NRORG              = VAR.NRORG
                                    WHERE REL.NRSEQCONTRATO    = P_NRSEQCONTRATO
                                        AND REL.NRORG          = P_NRORG
                                        AND VAR.CDSERVORCA     = C_ITNEGOCIACAO.CDSERVORCA
                                        AND REL.QTMEDIDAVARIAVEL BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                        AND V_VALIDAMEDIDACONT > 0

                                    UNION ALL

                                    SELECT REL.IDELEMENTORAIZ,
                                           REL.CDTPMEDIDAVARIAVEL,
                                           REL.QTMEDIDAVARIAVEL,
                                           NVL(REL.QTFRANQUIA, 0) AS QTFRANQUIA,
                                           VAR.IDMULTIPVARIACAO
                                    FROM FCT_RELACMEDIDAPROPOSTA REL
                                    LEFT JOIN FCT_VARPRECBASESERVORCA VAR
                                        ON REL.NRSEQORCAMENTO      = VAR.NRSEQORCAMENTO
                                        AND REL.CDTPMEDIDAVARIAVEL = VAR.CDTPMEDIDAVARIAVEL
                                        AND REL.NRORG              = VAR.NRORG
                                    WHERE REL.NRSEQORCAMENTO   = V_NRSEQORCAMENTO_ORIGEM
                                        AND REL.NRORG          = P_NRORG
                                        AND VAR.CDSERVORCA     = C_ITNEGOCIACAO.CDSERVORCA
                                        AND REL.QTMEDIDAVARIAVEL BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                        AND V_VALIDAMEDIDACONT = 0
                                    ORDER BY IDELEMENTORAIZ

                                ) LOOP

                                    NOVO_CODIGO_SC('FCT_MEDVARMEDICAOFATURA', V_NRMEDVARMEDICAOFATURA, 1, P_NRORG);
                                    INSERT INTO FCT_MEDVARMEDICAOFATURA (
                                        NRMEDVARMEDICAOFATURA,
                                        NRMEDICAOFATURA,
                                        IDELEMENTORAIZ,
                                        CDSERVORCA,
                                        CDTPMEDIDAVARIAVEL,
                                        QTMEDIDAVARIAVEL,
                                        QTMEDIDAMEDICAO,
                                        QTFRANQUIA,
                                        IDMULTIPVARIACAO,
                                        IDATIVO,
                                        NRORG,
                                        DTINCLUSAO,
                                        NRORGINCLUSAO,
                                        CDOPERINCLUSAO
                                    )
                                    VALUES (
                                        V_NRMEDVARMEDICAOFATURA,
                                        V_NRMEDICAOFATURA,
                                        C_MEDIDASIT.IDELEMENTORAIZ,
                                        C_ITNEGOCIACAO.CDSERVORCA,
                                        C_MEDIDASIT.CDTPMEDIDAVARIAVEL,
                                        C_MEDIDASIT.QTMEDIDAVARIAVEL,
                                        C_MEDIDASIT.QTMEDIDAVARIAVEL - C_MEDIDASIT.QTFRANQUIA,
                                        C_MEDIDASIT.QTFRANQUIA,
                                        C_MEDIDASIT.IDMULTIPVARIACAO,
                                        'S',
                                        P_NRORG,
                                        SYSDATE,
                                        P_NRORG,
                                        P_CDOPERADOR
                                    );

                                END LOOP;  -- C_MEDIDASIT
                            END LOOP; -- C_ITNEGOCIACAO
                        END IF; --C_NEGOCIACAO.IDTPFATURA = 'A'
                    END IF; --V_VRTOTITEMCOMDESC > 0

                    V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                    V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);

                END LOOP; --WHILE

            END LOOP; --C_COMPETENCIA

        END IF; --C_NEGOCIACAO.IDTPFATURA = 'P'

    END LOOP; --C_NEGOCIACAO

END;
/


create or replace PROCEDURE FCT_GERAR_PARCELAS_APURACAO (
    P_NRSEQCONTRATO   IN VARCHAR2,
    P_NRMEDICAOFATURA IN VARCHAR2,
    P_NRORG           IN NUMBER,
    P_CDOPERADOR      IN VARCHAR2
)
AS

    V_NRFATURACONT       NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_NRITFATURACONT     NOVOCODIGO.NRSEQUENCIAL%TYPE;
    V_VALIDAAPUR         NUMBER;
    V_AGRUPAMENTO        FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_NRFATURACONTAGRUP  FCT_FATURACONT.NRFATURACONT%TYPE;
    V_DTINICOMPET        FCT_FATURACONT.DTINICOMPET%TYPE;
    V_DTFINCOMPET        FCT_FATURACONT.DTFINCOMPET%TYPE;
    V_VRVENCIMENTO       FCT_FATURACONT.VRVENCIMENTO%TYPE;
    V_TOTALPARCGERADAS   INTEGER;
    V_TOTALPARCELA       INTEGER;
    V_NRAGRUPCONTFAT     FCT_RELACAGRUPCONTFAT.NRAGRUPCONTFAT%TYPE;
    V_IDPARCAGRUP        FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
    V_NRSEQCONTRATO      FCT_CONTRATO.NRSEQCONTRATO%TYPE;

BEGIN

    FOR C_APUR IN (SELECT NRMEDICAOFATURA, NRSEQCONTRATO, CDFILIALFATURA, NRPARCFATURA,
                       CDTIPOOPERFATURA, CDSERIENF, CDEMPRESA, CDINSCESTA, CDINSCMUNI,
                       IDSITUACAO, DTINICOMPET, DTFINCOMPET, DTLIMITEAPU, DTVENCIMENTO,
                       NRDIASVENCIMENTO, QTDIASFATUVENC, VRMEDICAO, IDATIVO, NRORG
                    FROM FCT_MEDICAOFATURA
                    WHERE ((INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(FCT_MEDICAOFATURA.NRSEQCONTRATO) || '_') > 0) OR (P_NRSEQCONTRATO IS NULL))
                       AND ((INSTR(P_NRMEDICAOFATURA, '_' || TO_CHAR(FCT_MEDICAOFATURA.NRMEDICAOFATURA) || '_') > 0) OR (P_NRMEDICAOFATURA IS NULL))
                       AND NRORG      = P_NRORG
                       AND IDSITUACAO = '3') LOOP

        V_DTINICOMPET   := C_APUR.DTINICOMPET;
        V_DTFINCOMPET   := C_APUR.DTFINCOMPET;
        V_VRVENCIMENTO  := C_APUR.VRMEDICAO;
        V_IDPARCAGRUP   := 'N';
        V_NRSEQCONTRATO := NULL;

        -- VERIFICA SE O CONTRATO ESTÁ LIGADO A UM AGRUPAMENTO
        BEGIN
          SELECT NRAGRUPAMENTO
          INTO V_AGRUPAMENTO
          FROM FCT_RELACAGRUPAMENTOCONT
          WHERE NRSEQCONTRATO = C_APUR.NRSEQCONTRATO;
        EXCEPTION WHEN NO_DATA_FOUND THEN
          V_AGRUPAMENTO := NULL;
        END;

        IF(V_AGRUPAMENTO IS NOT NULL) THEN
            -- VERIFICA SE EXISTEM PARCELAS CRIADAS PARA ELE
            BEGIN
                SELECT DISTINCT PARCELA.NRFATURACONT
                INTO V_NRFATURACONTAGRUP
                FROM FCT_FATURACONT PARCELA
                JOIN FCT_RELACAGRUPCONTFAT RELACFAT
                  ON PARCELA.NRFATURACONT = RELACFAT.NRFATURACONT
                  AND PARCELA.NRORG       = RELACFAT.NRORG
                JOIN FCT_RELACAGRUPAMENTOCONT RELACCONT
                  ON RELACFAT.NRSEQCONTRATO = RELACCONT.NRSEQCONTRATO
                  AND RELACFAT.NRORG        = RELACCONT.NRORG
                JOIN FCT_AGRUPAMENTO AGRUP
                  ON RELACCONT.NRAGRUPAMENTO = AGRUP.NRAGRUPAMENTO
                  AND RELACCONT.NRORG        = AGRUP.NRORG
                WHERE AGRUP.NRAGRUPAMENTO   = V_AGRUPAMENTO
                    AND PARCELA.DTINICOMPET = TO_CHAR(V_DTINICOMPET, 'DD/MM/YYYY')
                    AND PARCELA.DTFINCOMPET = TO_CHAR(V_DTFINCOMPET, 'DD/MM/YYYY')
                    AND IDTPFATURA          = 'X'
                    AND IDSITUACAO          = '1';

            EXCEPTION WHEN NO_DATA_FOUND THEN
              V_NRFATURACONTAGRUP := NULL;
            END;

            IF(V_NRFATURACONTAGRUP IS NULL) THEN
              V_VALIDAAPUR := 0;
            ELSE
                V_VALIDAAPUR     := 1;
                V_NRFATURACONT   := V_NRFATURACONTAGRUP;
                V_IDPARCAGRUP    := 'S';
            END IF;
        ELSE
            BEGIN
                SELECT COUNT(*)
                INTO V_VALIDAAPUR
                FROM FCT_RELACAGRUPCONTFAT RELACFAT
                WHERE RELACFAT.NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
                  AND RELACFAT.NRSEQCONTRATO   = C_APUR.NRSEQCONTRATO
                  AND RELACFAT.NRORG           = P_NRORG;
            EXCEPTION WHEN NO_DATA_FOUND THEN
                V_VALIDAAPUR := 0;
            END;
        END IF;

        IF (V_VALIDAAPUR = 0) THEN

            NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
            INSERT INTO FCT_FATURACONT (
                NRFATURACONT,
                NRSEQCONTRATO,
                CDFILIALFATURA,
                NRPARCFATURA,
                CDTIPOOPERFATURA,
                CDSERIENF,
                CDEMPRESA,
                CDINSCESTA,
                CDINSCMUNI,
                IDTPFATURA,
                IDSITUACAO,
                DTINICOMPET,
                DTFINCOMPET,
                DTLIMITEAPU,
                DTVENCIMENTO,
                NRDIASVENCIMENTO,
                QTDIASFATUVENC,
                VRVENCIMENTO,
                VRFATURADO,
                VRFALTAFATURAR,
                IDFORMAFATURA,
                DSJUSTIFICATIVA,
                NRAPURACAO,
                NRMEDICAOFATURA,
                IDALTUSUARIO,
                IDATIVO,
                NRORG,
                DTINCLUSAO,
                NRORGINCLUSAO,
                CDOPERINCLUSAO
            ) VALUES (
                V_NRFATURACONT,
                NULL,
                C_APUR.CDFILIALFATURA,
                C_APUR.NRPARCFATURA,
                C_APUR.CDTIPOOPERFATURA,
                C_APUR.CDSERIENF,
                C_APUR.CDEMPRESA,
                C_APUR.CDINSCESTA,
                C_APUR.CDINSCMUNI,
                'X',
                '1',
                V_DTINICOMPET,
                V_DTFINCOMPET,
                C_APUR.DTLIMITEAPU,
                C_APUR.DTVENCIMENTO,
                C_APUR.NRDIASVENCIMENTO,
                C_APUR.QTDIASFATUVENC,
                V_VRVENCIMENTO,
                0,
                V_VRVENCIMENTO,
                NULL,
                NULL,
                NULL,
                NULL,
                'N',
                'S',
                P_NRORG,
                SYSDATE,
                P_NRORG,
                P_CDOPERADOR
            );

        ELSE
            IF(V_VALIDAAPUR = 1) THEN
                UPDATE FCT_FATURACONT
                SET VRVENCIMENTO  = VRVENCIMENTO   + V_VRVENCIMENTO,
                   VRFALTAFATURAR = VRFALTAFATURAR + V_VRVENCIMENTO,
                   DTINICOMPET    = V_DTINICOMPET,
                   DTFINCOMPET    = V_DTFINCOMPET
                WHERE NRFATURACONT = V_NRFATURACONT
                  AND NRORG        = P_NRORG;
            END IF;
        END IF;

        UPDATE FCT_MEDICAOFATURA
            SET IDSITUACAO  = '4',
               NRORGULTATU  = P_NRORG,
               DTULTATU     = SYSDATE,
               CDOPERULTATU = P_CDOPERADOR
        WHERE NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
            AND NRORG         = P_NRORG;

        NOVO_CODIGO_SC('FCT_RELACAGRUPCONTFAT', V_NRAGRUPCONTFAT, 1, P_NRORG);
        INSERT INTO FCT_RELACAGRUPCONTFAT (
            NRAGRUPCONTFAT,     NRFATURACONT, IDPARCAGRUP,  NRSEQCONTRATO,
            NRORG,              IDATIVO,      DTINCLUSAO,   DTULTATU,
            CDOPERINCLUSAO,     NRORGULTATU,  CDOPERULTATU, NRMEDICAOFATURA,
            NRORGINCLUSAO
        ) VALUES (
            V_NRAGRUPCONTFAT,     V_NRFATURACONT, V_IDPARCAGRUP,       C_APUR.NRSEQCONTRATO,
            C_APUR.NRORG,         'S',            SYSDATE,             NULL,
            P_CDOPERADOR,          NULL,          NULL,                C_APUR.NRMEDICAOFATURA,
            C_APUR.NRORG
        );

        IF (V_IDPARCAGRUP = 'S') THEN

          UPDATE FCT_RELACAGRUPCONTFAT
          SET IDPARCAGRUP = 'S'
          WHERE NRFATURACONT = V_NRFATURACONT
              AND NRORG      = P_NRORG;

        END IF;

        FOR C_ITENS IN (SELECT NRITMEDICAOFATURA, NRMEDICAOFATURA, NRSEQCONTRATO, NRITEMOCONTRATO, CDSERVORCA,
                            CDPRODFATURA, IDSITUACAO, VRTOTITEMCONT, IDATIVO, NRORG, VRITEMCONT
                        FROM FCT_ITMEDICAOFATURA
                        WHERE NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
                            AND NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
                            AND NRORG         = P_NRORG) LOOP

            NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
            INSERT INTO FCT_ITFATURACONT (NRITFATURACONT, NRFATURACONT, NRSEQCONTRATO, NRITEMOCONTRATO, CDPRODFATURA, IDSITUACAO,
               VRVENCIMENTO, VRFATURADO, VRFALTAFATURAR, IDFORMAFATURA, DSJUSTIFICATIVA, NRAPURACAO,
               IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO
            ) VALUES (V_NRITFATURACONT, V_NRFATURACONT, C_ITENS.NRSEQCONTRATO, C_ITENS.NRITEMOCONTRATO, C_ITENS.CDPRODFATURA, '1',
                C_ITENS.VRITEMCONT, 0, C_ITENS.VRITEMCONT, NULL, NULL, NULL,
                'S', P_NRORG, SYSDATE, P_NRORG, P_CDOPERADOR
            );

        END LOOP;
    END LOOP;
END;
/



CREATE OR REPLACE PROCEDURE FCT_GERA_CONTRATO (
  P_NRORG              IN NUMBER,
  P_NRSEQORCAMENTO     IN NUMBER,
  P_NRSEQCONTRATO      OUT NUMBER)
AS
  V_NRSEQMODCONTRATO   NUMBER;
  V_NRSEQCONTRATO      VARCHAR2(30);
  V_NRSEQFATUCONTR     VARCHAR2(30);
  V_NRSEQFATUITCONT    VARCHAR2(30);
  V_NRITSEQCONTRATO    VARCHAR2(30);
  V_NRITELESEQCONTRATO VARCHAR2(30);
  V_NRCONTRATOFCT      VARCHAR2(50);
  V_DTINICIOCONT       DATE;
  V_DTFINCONT          DATE;
  V_DTPADREAJCONT      DATE;
  V_NRITEMOCONTRATO    VARCHAR2(10);
  V_NRSEQREFEORCCONT   VARCHAR2(20);
  V_PRAZO              NUMBER;
  V_NRSEQREAJUSTE      NUMBER;
  V_NRSEQINDCONTR      NUMBER;
  V_NRSEQCONTDOC       NUMBER;
  V_SOMAVALOR          VARCHAR2(3);
  V_NRRELACESTRUTCONT  NUMBER;

  /* = PARAMETROS DE FORMACAO DE PREO DOS ITENS = */
  V_NRRELACFORMACAOCONT FCT_RELACFORMACAOCONT.NRRELACFORMACAOCONT%TYPE;
  V_NRFORMPRECOSERVICO  FCT_RELACFORMACAOPROP.NRFORMPRECOSERVICO%TYPE;

  /* == PARAMETROS DE FATURAMENTO (ESCOPO) == */
  V_CDPRODFATURA          FCT_PARAMFATESCOPO.CDPRODFATURA%TYPE;
  V_CDFILIALFATURA        VARCHAR2(4);
  V_NRGRUPOFATURA         NUMBER;
  V_NRPARCFATURA          NUMBER;
  V_IDFATURACONTR         CHAR(1);
  V_CDMODPGTO             VARCHAR2(5);
  V_IDQTDIASCOMPCON       VARCHAR2(1);
  V_NRQTDIASCOMPCON       NUMBER;
  V_IDTPCOMPETCONT        VARCHAR2(1);
  V_NRDIACOMPETCONT       NUMBER;
  V_IDTPFATUINCOMP        VARCHAR2(1);
  V_IDTPDTEMISSNF         VARCHAR2(1);
  V_NRDIADTEMISSNF        NUMBER;
  V_IDTPDTVENC            VARCHAR2(1);
  V_NRDIATPDTVENC         NUMBER;
  V_IDSOMAFATUCONT        VARCHAR2(1);
  V_IDSOMAITGRUPFAT       VARCHAR2(1);
  V_IDGERANFPARC          VARCHAR2(1);
  V_IDBLOQVRMEDIC         VARCHAR2(1);
  V_IDGERARATEIO          VARCHAR2(1);
  V_QTPARCELASFATU        NUMBER;
  V_NRDIAVENCPARCELASFATU NUMBER;
  V_IDAPURAAPONTAMENTO    CHAR(1);

  /* == PARAMETROS DE FATURAMENTO (SERVICO ESCOPO) == */
  V_CDPRODFATURA_IT          VARCHAR2(10);
  V_CDFILIALFATURA_IT        VARCHAR2(4);
  V_NRGRUPOFATURA_IT         NUMBER;
  V_NRPARCFATURA_IT          NUMBER;
  V_IDFATURACONTR_IT         CHAR(1);
  V_CDMODPGTO_IT             VARCHAR2(5);
  V_IDBLOQVRITMEDIC_IT       VARCHAR2(1);
  V_QTPARCELASFATU_IT        NUMBER;
  V_NRDIAVENCPARCELASFATU_IT NUMBER;

  /* == PARAMETROS DE FATURAMENTO (NOVO) == */

  V_NRPARAMFATCON             VARCHAR2(30);
  V_NRCAPAPARAMFATCON         VARCHAR2(30);
  V_NRGRUPOFATURA_FNOVO       NUMBER;
  V_CDPRODFATURA_FNOVO        VARCHAR2(10);
  V_CDFILIALFATURA_FNOVO      VARCHAR2(4);
  V_NRPARCFATURA_FNOVO        NUMBER;
  V_IDTPFATURA_FNOVO          CHAR(1);
  V_QTPARCELASFATU_FNOVO      NUMBER;
  V_IDTPCALCPARCINC_FNOVO     CHAR(1);
  V_IDGERARATEIO_FNOVO        CHAR(1);
  V_IDAPURAAPONTAMENTO_FNOVO  CHAR(1);

  V_NRPARAMFATITCON          VARCHAR2(30);
  V_NRGRUPOFATURA_ITFATNOVO  NUMBER;
  V_CDPRODFATURA_ITFATNOVO   VARCHAR2(10);
  V_CDFILIALFATURA_ITFATNOVO VARCHAR2(4);
  V_NRPARCFATURA_ITFATNOVO   NUMBER;
  V_IDTPFATURA_ITFATNOVO     CHAR(1);
  V_QTPARCELASFATU_ITFATNOVO NUMBER;

  V_ITPROPOSTA  NUMBER;
  V_ITESCOPO  NUMBER;
  V_NRITESCOPOPROPOSTA_FAT NUMBER;
  V_VAL_PARC_ESC NUMBER;

  V_NRTRABSERVCONT    FCT_TRABSERVCONTRATO.NRTRABSERVCONT%TYPE;
  V_NRMEDIDACONTRATO  FCT_RELACMEDIDACONTRATO.NRMEDIDACONTRATO%TYPE;
  V_NRCOMPSERVCONT    FCT_COMPSERVCONTRATO.NRCOMPSERVCONT%TYPE;

  /* == PARAMETROS DE NEGOCIACAO DE VALORES == */

  V_NRNEGOCIACAOCONTRATO    VARCHAR2(20);
  V_NRITEMOCONTRATO_NEGO    NUMBER;
  V_NRITEMCONTITPAI_NEGO    NUMBER;
  V_NRITNEGOCIACAOCONTRATO  VARCHAR2(20);
  V_NRPARCELANEGOCONT       VARCHAR2(20);
  V_NRDESCPERIODONEGOCONT   VARCHAR2(20);
  V_NRCOMPETENCIANEGOCONT   VARCHAR2(20);

BEGIN
  V_NRCONTRATOFCT := 1;
  FOR C_ORCAMENTO IN (
       SELECT NVL(O.NRTIPOORCAMENTO, ESC.NRTIPOORCAMENTO) AS NRTIPOORCAMENTO,
             O.NRSEQORCAMENTO,
             NVL(O.CDFILIAL, ESC.CDFILIAL) AS CDFILIAL,
             O.NRORCAMENTO,
             O.NRVERSAOORCAMENTO,
             ORCAMOD.NRSEQMODCONTRA AS NRSEQMODCONTRATO,
             O.NRPARCNEGOCIO,
             O.QTDIASCONTRATO,
             O.DTREFORCAMENTO,
             ORCAMOD.IDUTILIZAHIERSERV,
             O.CDOPERRESPONSAVEL,
             TP.IDUTILIZAVARPRECO,
             O.DSREFERENCIAORCA
        FROM FCT_ORCAMENTO O
        INNER JOIN FCT_RELACESCOPOPROPOSTA ESC
          ON O.NRSEQORCAMENTO = ESC.NRSEQORCAMENTO
         AND O.NRORG          = ESC.NRORG
        LEFT JOIN FCT_TIPOORCAMENTO TP
          ON NVL(O.NRTIPOORCAMENTO, ESC.NRTIPOORCAMENTO) = TP.NRTIPOORCAMENTO
         AND O.NRORG                                     = TP.NRORG
        LEFT JOIN FCT_ORCAMENTOMODELO ORCAMOD
          ON O.NRORCAMENTOMODELO = ORCAMOD.NRORCAMENTOMODELO
         AND O.NRORG             = ORCAMOD.NRORG
       WHERE O.NRORG             = P_NRORG
         AND O.NRSEQORCAMENTO    = P_NRSEQORCAMENTO) LOOP

      V_NRSEQMODCONTRATO := C_ORCAMENTO.NRSEQMODCONTRATO;

      IF V_NRSEQMODCONTRATO IS NULL THEN
          BEGIN
            SELECT NRSEQMODCONTRATO
              INTO V_NRSEQMODCONTRATO
              FROM FCT_PARAMETROGERAL;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
              V_NRSEQMODCONTRATO := NULL;
          END;
      END IF;

        FOR C_MODELOCONTRATO IN (
          SELECT MC.NRDIAVENPARCFAT, DECODE(MC.NRDIASVIGCONT, NULL, 0, MC.NRDIASVIGCONT) AS NRDIASVIGCONT,
                 MC.DTPADREAJCONT, MC.NRDIASPRORGCONT, MC.QTPOSTOTRABCONT, MC.VRPERCMULTQBCONT,
                 MC.CDTPINDFINCON, MC.IDPERVALFINCON, MC.CDINDFINCONT, MC.IDQTDIASCOMPCON,
                 MC.IDTPCOMPETCONT, MC.IDTPFATUINCOMP,MC.IDTPDTEMISSNF,MC.IDTPDTVENC,
                 MC.NRQTDIASCOMPCON, MC.NRDIACOMPETCONT, MC.NRDIADTEMISSNF, MC.IDSOMAFATUCONT,
                 MC.IDFATURACONTR, MC.CDMODPGTO, MC.QTPARCELASFATU, MC.NRDIAVENCPARCELASFATU, MC.DTINICFATCONTR,
                 NVL(MC.IDSITUACAOCONTRATO, 'P') AS IDSITUACAOCONTRATO, PARAM.NRGRUPOFATURA,
                 PARAM.IDSOMAFATUCONT AS IDSOMAFATUCONTFATU, PARAM.IDSOMAITGRUPFAT, PARAM.IDGERANFPARC,
                 PARAM.IDBLOQVRMEDIC, PARAM.IDGERARATEIO, PARAM.IDAPURAAPONTAMENTO
            FROM FCT_MODELOCONTRATO MC
            LEFT JOIN FCT_PARAMFATMODCONT PARAM
              ON MC.NRSEQMODCONTRA = PARAM.NRSEQMODCONTRA
             AND MC.NRORG = PARAM.NRORG
           WHERE MC.NRSEQMODCONTRA = V_NRSEQMODCONTRATO
             AND MC.NRORG          = P_NRORG
             AND ROWNUM            = 1
             AND MC.IDATIVO        = 'S') LOOP

          IF C_ORCAMENTO.NRTIPOORCAMENTO IS NOT NULL THEN

            BEGIN
              SELECT CDPRODFATURA, CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA, IDFATURACONTR, CDMODPGTO,
                     IDQTDIASCOMPCON, NRQTDIASCOMPCON, IDTPCOMPETCONT,NRDIACOMPETCONT, IDTPFATUINCOMP,
                     IDTPDTEMISSNF, NRDIADTEMISSNF, IDTPDTVENC, NRDIATPDTVENC,IDSOMAFATUCONT, IDSOMAITGRUPFAT,
                     IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, QTPARCELASFATU, NRDIAVENCPARCELASFATU, IDAPURAAPONTAMENTO
                 INTO
                     V_CDPRODFATURA, V_CDFILIALFATURA, V_NRGRUPOFATURA, V_NRPARCFATURA, V_IDFATURACONTR, V_CDMODPGTO,
                     V_IDQTDIASCOMPCON, V_NRQTDIASCOMPCON, V_IDTPCOMPETCONT, V_NRDIACOMPETCONT, V_IDTPFATUINCOMP,
                     V_IDTPDTEMISSNF, V_NRDIADTEMISSNF, V_IDTPDTVENC, V_NRDIATPDTVENC, V_IDSOMAFATUCONT, V_IDSOMAITGRUPFAT,
                     V_IDGERANFPARC, V_IDBLOQVRMEDIC, V_IDGERARATEIO, V_QTPARCELASFATU, V_NRDIAVENCPARCELASFATU, V_IDAPURAAPONTAMENTO
                FROM FCT_PARAMFATESCOPO
               WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                 AND NRORG = P_NRORG;
            EXCEPTION
              WHEN NO_DATA_FOUND THEN BEGIN
                V_CDPRODFATURA          :=  NULL;
                V_CDFILIALFATURA        :=  NULL;
                V_NRGRUPOFATURA         :=  C_MODELOCONTRATO.NRGRUPOFATURA;
                V_NRPARCFATURA          :=  NULL;
                V_IDFATURACONTR         :=  C_MODELOCONTRATO.IDFATURACONTR;
                V_CDMODPGTO             :=  C_MODELOCONTRATO.CDMODPGTO;
                V_IDQTDIASCOMPCON       :=  C_MODELOCONTRATO.IDQTDIASCOMPCON;
                V_NRQTDIASCOMPCON       :=  C_MODELOCONTRATO.NRQTDIASCOMPCON;
                V_IDTPCOMPETCONT        :=  C_MODELOCONTRATO.IDTPCOMPETCONT;
                V_NRDIACOMPETCONT       :=  C_MODELOCONTRATO.NRDIACOMPETCONT;
                V_IDTPFATUINCOMP        :=  C_MODELOCONTRATO.IDTPFATUINCOMP;
                V_IDTPDTEMISSNF         :=  C_MODELOCONTRATO.IDTPDTEMISSNF;
                V_NRDIADTEMISSNF        :=  C_MODELOCONTRATO.NRDIADTEMISSNF;
                V_IDTPDTVENC            :=  C_MODELOCONTRATO.IDTPDTVENC;
                V_NRDIATPDTVENC         :=  C_MODELOCONTRATO.NRDIAVENPARCFAT;
                V_IDSOMAFATUCONT        :=  C_MODELOCONTRATO.IDSOMAFATUCONTFATU;
                V_IDSOMAITGRUPFAT       :=  C_MODELOCONTRATO.IDSOMAITGRUPFAT;
                V_IDGERANFPARC          :=  C_MODELOCONTRATO.IDGERANFPARC;
                V_IDBLOQVRMEDIC         :=  C_MODELOCONTRATO.IDBLOQVRMEDIC;
                V_IDGERARATEIO          :=  C_MODELOCONTRATO.IDGERARATEIO;
                V_QTPARCELASFATU        :=  C_MODELOCONTRATO.QTPARCELASFATU;
                V_NRDIAVENCPARCELASFATU :=  C_MODELOCONTRATO.NRDIAVENCPARCELASFATU;
                V_IDAPURAAPONTAMENTO    :=  C_MODELOCONTRATO.IDAPURAAPONTAMENTO;
              END;
            END;
          ELSE
                V_CDPRODFATURA          :=  NULL;
                V_CDFILIALFATURA        :=  NULL;
                V_NRGRUPOFATURA         :=  C_MODELOCONTRATO.NRGRUPOFATURA;
                V_NRPARCFATURA          :=  NULL;
                V_IDFATURACONTR         :=  C_MODELOCONTRATO.IDFATURACONTR;
                V_CDMODPGTO             :=  C_MODELOCONTRATO.CDMODPGTO;
                V_IDQTDIASCOMPCON       :=  C_MODELOCONTRATO.IDQTDIASCOMPCON;
                V_NRQTDIASCOMPCON       :=  C_MODELOCONTRATO.NRQTDIASCOMPCON;
                V_IDTPCOMPETCONT        :=  C_MODELOCONTRATO.IDTPCOMPETCONT;
                V_NRDIACOMPETCONT       :=  C_MODELOCONTRATO.NRDIACOMPETCONT;
                V_IDTPFATUINCOMP        :=  C_MODELOCONTRATO.IDTPFATUINCOMP;
                V_IDTPDTEMISSNF         :=  C_MODELOCONTRATO.IDTPDTEMISSNF;
                V_NRDIADTEMISSNF        :=  C_MODELOCONTRATO.NRDIADTEMISSNF;
                V_IDTPDTVENC            :=  C_MODELOCONTRATO.IDTPDTVENC;
                V_NRDIATPDTVENC         :=  C_MODELOCONTRATO.NRDIAVENPARCFAT;
                V_IDSOMAFATUCONT        :=  C_MODELOCONTRATO.IDSOMAFATUCONTFATU;
                V_IDSOMAITGRUPFAT       :=  C_MODELOCONTRATO.IDSOMAITGRUPFAT;
                V_IDGERANFPARC          :=  C_MODELOCONTRATO.IDGERANFPARC;
                V_IDBLOQVRMEDIC         :=  C_MODELOCONTRATO.IDBLOQVRMEDIC;
                V_IDGERARATEIO          :=  C_MODELOCONTRATO.IDGERARATEIO;
                V_QTPARCELASFATU        :=  C_MODELOCONTRATO.QTPARCELASFATU;
                V_NRDIAVENCPARCELASFATU :=  C_MODELOCONTRATO.NRDIAVENCPARCELASFATU;
                V_IDAPURAAPONTAMENTO    :=  C_MODELOCONTRATO.IDAPURAAPONTAMENTO;
          END IF;

          NOVO_CODIGO_NT('FCT_CONTRATO', V_NRSEQCONTRATO,1);

          V_DTINICIOCONT := SYSDATE;

          IF C_ORCAMENTO.QTDIASCONTRATO IS NOT NULL THEN
             V_DTFINCONT    := V_DTINICIOCONT+TO_NUMBER(C_ORCAMENTO.QTDIASCONTRATO);
             V_PRAZO := C_ORCAMENTO.QTDIASCONTRATO;
          ELSE
             V_DTFINCONT    := V_DTINICIOCONT+TO_NUMBER(C_MODELOCONTRATO.NRDIASVIGCONT);
             V_PRAZO := C_MODELOCONTRATO.NRDIASVIGCONT;
          END IF;

          IF C_MODELOCONTRATO.DTPADREAJCONT IS NOT NULL THEN
             V_DTPADREAJCONT := (TO_DATE('01/'||C_MODELOCONTRATO.DTPADREAJCONT||TO_CHAR(V_DTINICIOCONT,'/YYYY')))+365;
          END IF;

          INSERT INTO FCT_CONTRATO
             (NRSEQCONTRATO,IDTPCONTRATO,CDFILIALORCA,NRVERSAOCONTRATO,NRCONTRATOFCT,NRSEQMODCONTRA,
              NRPARCNEGOCIO,DSREFERENCIACONT,DTINICIOCONTRATO,DTFIMCONTRATO,NRDIASPRAZOCONT,
              IDSITUACAOCONTRATO,NRDIAVENPARCFAT,CDTPINDFINCON,CDINDFINCONT,IDPERVALFINCON,
              DTPADREAJCONT,NRDIASPRORGCONT,QTPOSTOTRABCONT,IDORIGCONTRATO,IDQTDIASCOMPCON,
              IDTPCOMPETCONT,IDTPFATUINCOMP,IDTPDTEMISSNF,IDTPDTVENC,NRQTDIASCOMPCON,
              NRDIACOMPETCONT,NRDIADTEMISSNF, IDSOMAFATUCONT, IDFATURACONTR, CDMODPGTO, DTINICFATCONTR,
              NRORG, QTPARCELASFATU, NRDIAVENCPARCELASFATU, CDOPERRESPONSAVEL)
          VALUES
             (V_NRSEQCONTRATO, 'S', C_ORCAMENTO.CDFILIAL, 1, V_NRSEQCONTRATO, V_NRSEQMODCONTRATO,
             C_ORCAMENTO.NRPARCNEGOCIO, C_ORCAMENTO.DSREFERENCIAORCA, V_DTINICIOCONT, V_DTFINCONT, V_PRAZO,
             C_MODELOCONTRATO.IDSITUACAOCONTRATO, V_NRDIATPDTVENC, C_MODELOCONTRATO.CDTPINDFINCON, C_MODELOCONTRATO.CDINDFINCONT,
             C_MODELOCONTRATO.IDPERVALFINCON, V_DTPADREAJCONT, C_MODELOCONTRATO.NRDIASPRORGCONT, C_MODELOCONTRATO.QTPOSTOTRABCONT, 'G',
             V_IDQTDIASCOMPCON, V_IDTPCOMPETCONT, V_IDTPFATUINCOMP,
             V_IDTPDTEMISSNF, V_IDTPDTVENC, V_NRQTDIASCOMPCON,
             V_NRDIACOMPETCONT, V_NRDIADTEMISSNF, V_IDSOMAFATUCONT,
             V_IDFATURACONTR, V_CDMODPGTO, C_MODELOCONTRATO.DTINICFATCONTR,
             P_NRORG, V_QTPARCELASFATU, V_NRDIAVENCPARCELASFATU, C_ORCAMENTO.CDOPERRESPONSAVEL);

          NOVO_CODIGO_NT('NRSEQFATUCONTR', V_NRSEQFATUCONTR,1);

          INSERT INTO FCT_PARAMFATCONT (NRSEQFATUCONTR, NRSEQCONTRATO, CDPRODFATURA, CDFILIALFATURA,
                                        NRPARCFATURA, NRGRUPOFATURA, IDSOMAITGRUPFAT, IDSOMAFATUCONT,
                                        IDGERANFPARC, IDBLOQVRMEDIC, IDGERARATEIO, IDAPURAAPONTAMENTO, NRORG)
                           VALUES(V_NRSEQFATUCONTR, V_NRSEQCONTRATO, V_CDPRODFATURA, V_CDFILIALFATURA,
                                  V_NRPARCFATURA, V_NRGRUPOFATURA, V_IDSOMAITGRUPFAT, V_IDSOMAFATUCONT,
                                  V_IDGERANFPARC, V_IDBLOQVRMEDIC, V_IDGERARATEIO, V_IDAPURAAPONTAMENTO, P_NRORG);

          CRIA_MNEMONICO(P_NRORG,'C',V_NRSEQCONTRATO,V_NRCONTRATOFCT);

          UPDATE FCT_CONTRATO
             SET NRCONTRATOFCT = V_NRCONTRATOFCT
           WHERE NRORG         = P_NRORG
             AND NRSEQCONTRATO = V_NRSEQCONTRATO;


         /* Parãmetros de Faturamento novo */

          FOR C_PARAMFATNOVO IN (SELECT NRCAPAPARAMFATMODCON, NRSEQMODCONTRA, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                     IDTPFATURA, QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO, IDATIVO, NRORG
                                FROM FCT_CAPAPARAMFATMODCON
                               WHERE NRSEQMODCONTRA = V_NRSEQMODCONTRATO
                                 AND NRORG = P_NRORG) LOOP

            IF C_ORCAMENTO.NRTIPOORCAMENTO IS NOT NULL THEN

                BEGIN
                    SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA, IDTPFATURA,
                           QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO
                      INTO V_NRGRUPOFATURA_FNOVO, V_CDPRODFATURA_FNOVO, V_CDFILIALFATURA_FNOVO, V_NRPARCFATURA_FNOVO, V_IDTPFATURA_FNOVO,
                           V_QTPARCELASFATU_FNOVO, V_IDTPCALCPARCINC_FNOVO, V_IDGERARATEIO_FNOVO, V_IDAPURAAPONTAMENTO_FNOVO
                      FROM FCT_CAPAPARAMFATESC
                     WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                       AND NRORG = P_NRORG;
                 EXCEPTION
                    WHEN NO_DATA_FOUND THEN BEGIN
                        V_NRGRUPOFATURA_FNOVO      :=  C_PARAMFATNOVO.NRGRUPOFATURA;
                        V_CDPRODFATURA_FNOVO       :=  C_PARAMFATNOVO.CDPRODFATURA;
                        V_CDFILIALFATURA_FNOVO     :=  C_PARAMFATNOVO.CDFILIALFATURA;
                        V_NRPARCFATURA_FNOVO       :=  C_PARAMFATNOVO.NRPARCFATURA;
                        V_IDTPFATURA_FNOVO         :=  C_PARAMFATNOVO.IDTPFATURA;
                        V_QTPARCELASFATU_FNOVO     :=  C_PARAMFATNOVO.QTPARCELASFATU;
                        V_IDTPCALCPARCINC_FNOVO    :=  C_PARAMFATNOVO.IDTPCALCPARCINC;
                        V_IDGERARATEIO_FNOVO       :=  C_PARAMFATNOVO.IDGERARATEIO;
                        V_IDAPURAAPONTAMENTO_FNOVO :=  C_PARAMFATNOVO.IDAPURAAPONTAMENTO;
                    END;
                END;

                V_VAL_PARC_ESC := 0;
                FOR C_PARC_ESC IN (SELECT NRPARAMFATESC, NRTIPOORCAMENTO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                          QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                     FROM FCT_PARAMFATESC
                                    WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                                      AND NRORG = P_NRORG) LOOP

                    NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);

                    INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                 QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                 NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                           VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_ESC.NRDIACOMPETINI, C_PARC_ESC.NRDIACOMPETFIN, C_PARC_ESC.IDMESCOMPETINI, C_PARC_ESC.IDMESCOMPETFIN,
                                   C_PARC_ESC.QTDIASAPURACAO, C_PARC_ESC.IDTPCALCVENC, C_PARC_ESC.NRDIACALCVENC, C_PARC_ESC.IDMESCALCVENC, C_PARC_ESC.QTDIASFATUVENC, 'S',
                                   P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

                     V_VAL_PARC_ESC := V_VAL_PARC_ESC+1;

                END LOOP;

                IF (V_VAL_PARC_ESC = 0) THEN

                    FOR C_PARC_MODC IN (SELECT NRPARAMFATMODCON, NRSEQMODCONTRA, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                               QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                          FROM FCT_PARAMFATMODCON
                                         WHERE NRSEQMODCONTRA = C_PARAMFATNOVO.NRSEQMODCONTRA
                                           AND NRORG = P_NRORG) LOOP

                            NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);

                            INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                         QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                         NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                                   VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_MODC.NRDIACOMPETINI, C_PARC_MODC.NRDIACOMPETFIN, C_PARC_MODC.IDMESCOMPETINI, C_PARC_MODC.IDMESCOMPETFIN,
                                           C_PARC_MODC.QTDIASAPURACAO, C_PARC_MODC.IDTPCALCVENC, C_PARC_MODC.NRDIACALCVENC, C_PARC_MODC.IDMESCALCVENC, C_PARC_MODC.QTDIASFATUVENC, 'S',
                                           P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

                    END LOOP;
                END IF;
            ELSE
                V_NRGRUPOFATURA_FNOVO      :=  C_PARAMFATNOVO.NRGRUPOFATURA;
                V_CDPRODFATURA_FNOVO       :=  C_PARAMFATNOVO.CDPRODFATURA;
                V_CDFILIALFATURA_FNOVO     :=  C_PARAMFATNOVO.CDFILIALFATURA;
                V_NRPARCFATURA_FNOVO       :=  C_PARAMFATNOVO.NRPARCFATURA;
                V_IDTPFATURA_FNOVO         :=  C_PARAMFATNOVO.IDTPFATURA;
                V_QTPARCELASFATU_FNOVO     :=  C_PARAMFATNOVO.QTPARCELASFATU;
                V_IDTPCALCPARCINC_FNOVO    :=  C_PARAMFATNOVO.IDTPCALCPARCINC;
                V_IDGERARATEIO_FNOVO       :=  C_PARAMFATNOVO.IDGERARATEIO;
                V_IDAPURAAPONTAMENTO_FNOVO :=  C_PARAMFATNOVO.IDAPURAAPONTAMENTO;

                FOR C_PARC_MODC IN (SELECT NRPARAMFATMODCON, NRSEQMODCONTRA, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                           QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO, NRORG
                                      FROM FCT_PARAMFATMODCON
                                     WHERE NRSEQMODCONTRA = C_PARAMFATNOVO.NRSEQMODCONTRA
                                       AND NRORG = P_NRORG) LOOP

                        NOVO_CODIGO_NT('FCT_PARAMFATCON', V_NRPARAMFATCON,1);

                        INSERT INTO FCT_PARAMFATCON (NRPARAMFATCON, NRSEQCONTRATO, NRDIACOMPETINI, NRDIACOMPETFIN, IDMESCOMPETINI, IDMESCOMPETFIN,
                                                     QTDIASAPURACAO, IDTPCALCVENC, NRDIACALCVENC, IDMESCALCVENC, QTDIASFATUVENC, IDATIVO,
                                                     NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                               VALUES (V_NRPARAMFATCON, V_NRSEQCONTRATO, C_PARC_MODC.NRDIACOMPETINI, C_PARC_MODC.NRDIACOMPETFIN, C_PARC_MODC.IDMESCOMPETINI, C_PARC_MODC.IDMESCOMPETFIN,
                                       C_PARC_MODC.QTDIASAPURACAO, C_PARC_MODC.IDTPCALCVENC, C_PARC_MODC.NRDIACALCVENC, C_PARC_MODC.IDMESCALCVENC, C_PARC_MODC.QTDIASFATUVENC, 'S',
                                       P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

                END LOOP;
            END IF;
            NOVO_CODIGO_NT('FCT_CAPAPARAMFATCON', V_NRCAPAPARAMFATCON,1);

            INSERT INTO FCT_CAPAPARAMFATCON(NRCAPAPARAMFATCON, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA, IDTPFATURA,
                                QTPARCELASFATU, IDTPCALCPARCINC, IDGERARATEIO, IDAPURAAPONTAMENTO, IDATIVO, NRORG, DTINCLUSAO,
                                NRORGINCLUSAO, CDOPERINCLUSAO)
                   VALUES(V_NRCAPAPARAMFATCON, V_NRSEQCONTRATO, V_NRGRUPOFATURA_FNOVO, V_CDPRODFATURA_FNOVO, V_CDFILIALFATURA_FNOVO, V_NRPARCFATURA_FNOVO, V_IDTPFATURA_FNOVO,
                          V_QTPARCELASFATU_FNOVO, V_IDTPCALCPARCINC_FNOVO, V_IDGERARATEIO_FNOVO, V_IDAPURAAPONTAMENTO_FNOVO, 'S', P_NRORG, SYSDATE,
                          P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

          END LOOP;

          FOR C_LOCAL IN (SELECT NRESTRUTURAM
                            FROM FCT_RELACESTRUTURAPROP
                           WHERE NRSEQORCAMENTO   = P_NRSEQORCAMENTO
                             AND NRORG            = P_NRORG
                             AND IDRELACESTRUTURA = 'PROPOSTA')
        LOOP

            NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NRRELACESTRUTCONT, 1);

            INSERT INTO FCT_RELACESTRUTURACONT (
                NRRELACESTRUTCONT,  NRESTRUTURAM,      NRSEQCONTRATO,
                NRITEMOCONTRATO,    IDRELACESTRUTURA,  VRITEMRATEIO,
                NRORG,              VRPERCRATEIO,      DTINCLUSAO
            )
            VALUES (
                V_NRRELACESTRUTCONT,  C_LOCAL.NRESTRUTURAM,  V_NRSEQCONTRATO,
                NULL,                 'CONTRATO',            NULL,
                P_NRORG,              NULL,                  SYSDATE
            );

        END LOOP;

          FOR C_ITEM IN (
              SELECT IT.CDPRECBASESERV, IT.CDSERVORCA, IT.CDPRODUTO, IT.SGUNIDADE,
                     IT.CDTPMEDIDASERV, IT.QTMEDIDAORCA, IT.IDFATURAORCA, IT.CDMODPGTO,
                     IT.NRGRUPOFATURA, IT.IDUNIDTEMPOLOCACAO, IT.QTITEMORCAMENTO,
                     IT.QTTEMPOLOCACAO,IT.NMITEMORCAMENTO, VRUNITITEMORCA, VRTOTALITEMORCA,
                     IT.DTINICFATORC, IT.IDMULTMEDVRTOT, IT.IDADICITEMORC, IT.IDADICCOBRITEMORC, IT.NRITEMORCAMENTO,
                     IT.QTPARCELASFATU, IT.NRDIAVENCPARCELASFATU, IT.NRTIPOORCAMENTO,
                     IT.VRPERCDESCORCA, IT.IDTPDESCORCA, IT.NMCONTRATUALITEMORCA, IT.VRUNITITEMORCATBLPRECO
                FROM FCT_ITEMORCAMENTO IT
               WHERE IT.NRORG          = P_NRORG
                 AND IT.NRSEQORCAMENTO = P_NRSEQORCAMENTO
                 AND IT.IDELEMENTO IS NULL
                 AND (IT.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO OR IT.NRTIPOORCAMENTO IS NULL)) LOOP

              IF C_ITEM.NRTIPOORCAMENTO IS NOT NULL THEN
                BEGIN
                  SELECT FCT_PARAMFATSRVESCO.CDPRODFATURA, FCT_PARAMFATSRVESCO.CDFILIALFATURA,  FCT_PARAMFATSRVESCO.NRGRUPOFATURA,
                         FCT_PARAMFATSRVESCO.NRPARCFATURA, FCT_PARAMFATSRVESCO.IDFATURACONTR, FCT_PARAMFATSRVESCO.CDMODPGTO,
                         FCT_PARAMFATSRVESCO.IDBLOQVRITMEDIC, FCT_PARAMFATSRVESCO.QTPARCELASFATU, FCT_PARAMFATSRVESCO.NRDIAVENCPARCELASFATU
                    INTO V_CDPRODFATURA_IT, V_CDFILIALFATURA_IT, V_NRGRUPOFATURA_IT,
                         V_NRPARCFATURA_IT, V_IDFATURACONTR_IT, V_CDMODPGTO_IT,
                         V_IDBLOQVRITMEDIC_IT, V_QTPARCELASFATU_IT, V_NRDIAVENCPARCELASFATU_IT
                    FROM FCT_PARAMFATSRVESCO
                   LEFT JOIN FCT_ITESCOPOPROPOSTA
                     ON FCT_PARAMFATSRVESCO.NRITESCOPOPROPOSTA = FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA
                    AND FCT_PARAMFATSRVESCO.NRTIPOORCAMENTO = FCT_ITESCOPOPROPOSTA.NRTIPOORCAMENTO
                    AND FCT_PARAMFATSRVESCO.NRORG = FCT_ITESCOPOPROPOSTA.NRORG
                  WHERE FCT_PARAMFATSRVESCO.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                    AND FCT_ITESCOPOPROPOSTA.CDSERVORCA = C_ITEM.CDSERVORCA
                    AND FCT_PARAMFATSRVESCO.NRORG = P_NRORG;
                EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                      V_CDPRODFATURA_IT :=  NULL;
                      V_CDFILIALFATURA_IT := NULL;
                      V_NRGRUPOFATURA_IT :=  C_ITEM.NRGRUPOFATURA;
                      V_NRPARCFATURA_IT :=  NULL;
                      V_IDFATURACONTR_IT := C_ITEM.IDFATURAORCA;
                      V_CDMODPGTO_IT := C_ITEM.CDMODPGTO;
                      V_IDBLOQVRITMEDIC_IT := 'N';
                      V_QTPARCELASFATU_IT := C_ITEM.CDMODPGTO;
                      V_NRDIAVENCPARCELASFATU_IT :=  C_ITEM.CDMODPGTO;
                  END;
                END;
              ELSE
                V_CDPRODFATURA_IT := NULL;
                V_CDFILIALFATURA_IT := NULL;
                V_NRGRUPOFATURA_IT := C_ITEM.NRGRUPOFATURA;
                V_NRPARCFATURA_IT := NULL;
                V_IDFATURACONTR_IT := C_ITEM.IDFATURAORCA;
                V_CDMODPGTO_IT := C_ITEM.CDMODPGTO;
                V_IDBLOQVRITMEDIC_IT := 'N';
                V_QTPARCELASFATU_IT := C_ITEM.CDMODPGTO;
                V_NRDIAVENCPARCELASFATU_IT :=  C_ITEM.CDMODPGTO;
              END IF;

             IF V_IDFATURACONTR_IT = 'O' THEN
                 V_QTPARCELASFATU_IT := NULL;
                 V_NRDIAVENCPARCELASFATU_IT := NULL;

              END IF;

              IF V_IDFATURACONTR_IT = 'P' THEN
                 V_CDMODPGTO_IT := NULL;
              END IF;

               IF ((V_IDFATURACONTR_IT = 'A') OR (V_IDFATURACONTR_IT = 'X')) THEN
                 V_QTPARCELASFATU_IT := NULL;
                 V_NRDIAVENCPARCELASFATU_IT := NULL;
                 V_CDMODPGTO_IT := NULL;
              END IF;

              NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NRITSEQCONTRATO, 1);

              INSERT INTO FCT_ITEMCONTRATO
                  (NRORG,NRITEMOCONTRATO, NRSEQCONTRATO,
                   CDPRODUTO,CDSERVORCA,SGUNIDADE,NMITEMCONTRATO,
                   QTITEMCONTRATO,CDTPMEDIDASERV,QTMEDIDACONTR, IDFATURACONTR,
                   CDMODPGTO,NRGRUPOFATURA,IDUNIDTEMPOSERV,QTTEMPOSERV,IDITEMATIVO,
                   VRUNITITEMCONT,VRTOTITEMCONT, DTINICFATCONTR, IDMULTMEDVRTOT,
                   IDADICITEMCONT, IDADICCOBRCONT,IDFATURAITEM,
                   QTPARCELASFATU, NRDIAVENCPARCELASFATU,
                   VRDESCONTO, IDTPDESCONTO, NRITEMORCAMENTO, NMCONTRATUALITEMCONT,
                   VRUNITITEMCONTTBLPRECO)
              VALUES
                (P_NRORG, V_NRITSEQCONTRATO, V_NRSEQCONTRATO,
                 C_ITEM.CDPRODUTO, C_ITEM.CDSERVORCA, C_ITEM.SGUNIDADE, C_ITEM.NMITEMORCAMENTO,
                 C_ITEM.QTITEMORCAMENTO, C_ITEM.CDTPMEDIDASERV, C_ITEM.QTMEDIDAORCA, V_IDFATURACONTR_IT,
                 V_CDMODPGTO_IT, V_NRGRUPOFATURA_IT, C_ITEM.IDUNIDTEMPOLOCACAO, C_ITEM.QTTEMPOLOCACAO, 'S',
                 C_ITEM.VRUNITITEMORCA, C_ITEM.VRTOTALITEMORCA, C_ITEM.DTINICFATORC, C_ITEM.IDMULTMEDVRTOT,
                 C_ITEM.IDADICITEMORC, C_ITEM.IDADICCOBRITEMORC, NVL(V_SOMAVALOR,'SIM'),
                 C_ITEM.QTPARCELASFATU, C_ITEM.NRDIAVENCPARCELASFATU,
                 C_ITEM.VRPERCDESCORCA, DECODE(C_ITEM.IDTPDESCORCA, 'N', 'S', C_ITEM.IDTPDESCORCA), C_ITEM.NRITEMORCAMENTO,
                 C_ITEM.NMCONTRATUALITEMORCA, C_ITEM.VRUNITITEMORCATBLPRECO);

                FOR C_ITELEMENTO IN (
                    SELECT IT.CDPRECBASESERV, IT.CDSERVORCA, IT.CDPRODUTO, IT.SGUNIDADE,
                     IT.CDTPMEDIDASERV, IT.QTMEDIDAORCA, IT.IDFATURAORCA, IT.CDMODPGTO,
                     IT.NRGRUPOFATURA, IT.IDUNIDTEMPOLOCACAO, IT.QTITEMORCAMENTO,
                     IT.QTTEMPOLOCACAO,IT.NMITEMORCAMENTO, VRUNITITEMORCA, VRTOTALITEMORCA,
                     IT.DTINICFATORC, IT.IDMULTMEDVRTOT, IT.IDADICITEMORC, IT.IDADICCOBRITEMORC, IT.NRITEMORCAMENTO,
                     IT.QTPARCELASFATU, IT.NRDIAVENCPARCELASFATU, IT.NRTIPOORCAMENTO,
                     IT.VRPERCDESCORCA, IT.IDTPDESCORCA, IT.NMCONTRATUALITEMORCA, IT.IDELEMENTO,
                     IT.VRUNITITEMORCATBLPRECO, IT.CDTPMEDIDAVARIAVEL
                FROM FCT_ITEMORCAMENTO IT
               WHERE IT.NRORG              = P_NRORG
                 AND IT.NRSEQORCAMENTO     = P_NRSEQORCAMENTO
                 AND IT.CDSERVORCA         = C_ITEM.CDSERVORCA
                 AND IT.NRITEMORCAMENTOPAI = C_ITEM.NRITEMORCAMENTO
                 AND IT.IDELEMENTO IS NOT NULL
                ) LOOP

                  NOVO_CODIGO_NT('FCT_ITEMCONTRATO', V_NRITELESEQCONTRATO, 1);

                  INSERT INTO FCT_ITEMCONTRATO
                      (NRORG, NRITEMOCONTRATO, NRSEQCONTRATO,
                       CDPRODUTO,CDSERVORCA,SGUNIDADE,NMITEMCONTRATO,
                       QTITEMCONTRATO,CDTPMEDIDASERV,QTMEDIDACONTR, IDFATURACONTR,
                       CDMODPGTO,NRGRUPOFATURA,IDUNIDTEMPOSERV,QTTEMPOSERV,IDITEMATIVO,
                       VRUNITITEMCONT,VRTOTITEMCONT, DTINICFATCONTR, IDMULTMEDVRTOT,
                       IDADICITEMCONT, IDADICCOBRCONT,IDFATURAITEM,
                       QTPARCELASFATU, NRDIAVENCPARCELASFATU,
                       VRDESCONTO, IDTPDESCONTO, NRITEMORCAMENTO, NMCONTRATUALITEMCONT, IDELEMENTO,
                       NRITEMCONTRATOPAI, VRUNITITEMCONTTBLPRECO, CDTPMEDIDAVARIAVEL)
                  VALUES
                    (P_NRORG, V_NRITELESEQCONTRATO, V_NRSEQCONTRATO,
                     C_ITELEMENTO.CDPRODUTO, C_ITELEMENTO.CDSERVORCA, C_ITELEMENTO.SGUNIDADE, C_ITELEMENTO.NMITEMORCAMENTO,
                     C_ITELEMENTO.QTITEMORCAMENTO, C_ITELEMENTO.CDTPMEDIDASERV, C_ITELEMENTO.QTMEDIDAORCA, V_IDFATURACONTR_IT,
                     V_CDMODPGTO_IT, V_NRGRUPOFATURA_IT, C_ITELEMENTO.IDUNIDTEMPOLOCACAO, C_ITELEMENTO.QTTEMPOLOCACAO, 'S',
                     C_ITELEMENTO.VRUNITITEMORCA, C_ITELEMENTO.VRTOTALITEMORCA, C_ITELEMENTO.DTINICFATORC, C_ITELEMENTO.IDMULTMEDVRTOT,
                     C_ITELEMENTO.IDADICITEMORC, C_ITELEMENTO.IDADICCOBRITEMORC, NVL(V_SOMAVALOR,'SIM'),
                     C_ITELEMENTO.QTPARCELASFATU, C_ITELEMENTO.NRDIAVENCPARCELASFATU,
                     C_ITELEMENTO.VRPERCDESCORCA, DECODE(C_ITELEMENTO.IDTPDESCORCA, 'N', 'S', C_ITELEMENTO.IDTPDESCORCA), C_ITELEMENTO.NRITEMORCAMENTO,
                     C_ITELEMENTO.NMCONTRATUALITEMORCA, C_ITELEMENTO.IDELEMENTO,
                     V_NRITSEQCONTRATO, C_ITELEMENTO.VRUNITITEMORCATBLPRECO, C_ITELEMENTO.CDTPMEDIDAVARIAVEL);
                END LOOP; --C_ITELEMENTO

                BEGIN
                    SELECT NRFORMPRECOSERVICO
                    INTO V_NRFORMPRECOSERVICO
                    FROM FCT_RELACFORMACAOPROP FORMPROP
                    WHERE FORMPROP.NRORG          = P_NRORG
                     AND FORMPROP.NRSEQORCAMENTO  = P_NRSEQORCAMENTO
                     AND FORMPROP.NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO;
               EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                        BEGIN
                            V_NRFORMPRECOSERVICO := NULL;
                        END;
               END;

                IF V_NRFORMPRECOSERVICO IS NOT NULL THEN
                    NOVO_CODIGO_NT('FCT_RELACFORMACAOCONT', V_NRRELACFORMACAOCONT, 1, P_NRORG);

                    INSERT INTO FCT_RELACFORMACAOCONT
                        (NRRELACFORMACAOCONT, NRFORMPRECOSERVICO, NRSEQCONTRATO,
                            NRITEMOCONTRATO, NRORG, IDATIVO, DTINCLUSAO, DTULTATU,
                            NRORGINCLUSAO, NRORGULTATU, CDOPERULTATU,
                            NRREAJUSCONTFORMPREC)
                    VALUES (V_NRRELACFORMACAOCONT, V_NRFORMPRECOSERVICO, V_NRSEQCONTRATO,
                            V_NRITSEQCONTRATO, P_NRORG, 'S', SYSDATE, NULL,
                            P_NRORG, NULL, NULL, NULL);
                END IF;

                FOR C_RATEIO IN (SELECT NRESTRUTURAM, VRITEMRATEIO, VRPERCRATEIO
                                   FROM FCT_RELACESTRUTURAPROP
                                  WHERE NRSEQORCAMENTO   = P_NRSEQORCAMENTO
                                    AND NRORG            = P_NRORG
                                    AND NRITEMORCAMENTO  = C_ITEM.NRITEMORCAMENTO
                                    AND IDRELACESTRUTURA = 'RATEIO')
                LOOP

                    NOVO_CODIGO_NT('NRRELACESTRUTCONT', V_NRRELACESTRUTCONT,1);

                    INSERT INTO FCT_RELACESTRUTURACONT (
                        NRRELACESTRUTCONT,  NRESTRUTURAM,      NRSEQCONTRATO,
                        NRITEMOCONTRATO,    IDRELACESTRUTURA,  VRITEMRATEIO,
                        NRORG,              VRPERCRATEIO,      DTINCLUSAO
                    )
                    VALUES (
                        V_NRRELACESTRUTCONT,  C_RATEIO.NRESTRUTURAM,  V_NRSEQCONTRATO,
                        V_NRITSEQCONTRATO,    'RATEIO',               C_RATEIO.VRITEMRATEIO,
                        P_NRORG,              C_RATEIO.VRPERCRATEIO,  SYSDATE
                    );

                END LOOP;

                NOVO_CODIGO_NT('NRSEQFATUITCONT', V_NRSEQFATUITCONT,1);

                 INSERT INTO FCT_PARAMFATITCONT (NRSEQFATUITCONT, NRITEMOCONTRATO, NRSEQCONTRATO, CDPRODFATURA,
                              CDFILIALFATURA, NRGRUPOFATURA, NRPARCFATURA, IDBLOQVRITMEDIC,
                              NRORG, IDATIVO, DTINCLUSAO)
                           VALUES(V_NRSEQFATUITCONT, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_CDPRODFATURA_IT,
                                  V_CDFILIALFATURA_IT, V_NRGRUPOFATURA_IT, V_NRPARCFATURA_IT, V_IDBLOQVRITMEDIC_IT,
                                  P_NRORG, 'S', SYSDATE);

                 /* Faturamento Novo */

                   SELECT COUNT (*) ITPROPOSTA
                     INTO V_ITPROPOSTA
                     FROM FCT_PARAMFATITPROP
                    WHERE NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO
                      AND NRSEQORCAMENTO = P_NRSEQORCAMENTO
                      AND NRORG = P_NRORG;

                   IF (V_ITPROPOSTA > 0) THEN

                      SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA,
                             NRPARCFATURA, IDTPFATURA, QTPARCELASFATU
                        INTO V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO,
                             V_NRPARCFATURA_ITFATNOVO, V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO
                        FROM FCT_PARAMFATITPROP
                       WHERE NRITEMORCAMENTO = C_ITEM.NRITEMORCAMENTO
                         AND NRSEQORCAMENTO = P_NRSEQORCAMENTO
                         AND NRORG = P_NRORG;

                        NOVO_CODIGO_NT('FCT_PARAMFATITCON', V_NRPARAMFATITCON,1);

                        INSERT INTO FCT_PARAMFATITCON (NRPARAMFATITCON, NRITEMOCONTRATO, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                                       IDTPFATURA, QTPARCELASFATU, IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                               VALUES (V_NRPARAMFATITCON, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO, V_NRPARCFATURA_ITFATNOVO,
                                       V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO, 'S', P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

                   ELSE

                       BEGIN
                           SELECT FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA
                            INTO  V_NRITESCOPOPROPOSTA_FAT
                            FROM FCT_PARAMFATITESC
                            JOIN FCT_ITESCOPOPROPOSTA
                              ON FCT_ITESCOPOPROPOSTA.NRITESCOPOPROPOSTA = FCT_PARAMFATITESC.NRITESCOPOPROPOSTA
                             AND FCT_ITESCOPOPROPOSTA.NRORG = FCT_PARAMFATITESC.NRORG
                           WHERE FCT_ITESCOPOPROPOSTA.NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                             AND FCT_ITESCOPOPROPOSTA.CDSERVORCA = C_ITEM.CDSERVORCA
                             AND FCT_ITESCOPOPROPOSTA.NRORG = P_NRORG;
                        EXCEPTION
                            WHEN NO_DATA_FOUND THEN BEGIN
                                V_NRITESCOPOPROPOSTA_FAT := NULL;
                            END;
                       END;

                       IF (V_NRITESCOPOPROPOSTA_FAT IS NOT NULL) THEN

                           SELECT NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA,
                                  NRPARCFATURA, IDTPFATURA, QTPARCELASFATU
                             INTO V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO,
                                  V_NRPARCFATURA_ITFATNOVO, V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO
                             FROM FCT_PARAMFATITESC
                            WHERE NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
                              AND NRITESCOPOPROPOSTA = V_NRITESCOPOPROPOSTA_FAT
                              AND NRORG = P_NRORG;

                              NOVO_CODIGO_NT('FCT_PARAMFATITCON', V_NRPARAMFATITCON,1);

                              INSERT INTO FCT_PARAMFATITCON (NRPARAMFATITCON, NRITEMOCONTRATO, NRSEQCONTRATO, NRGRUPOFATURA, CDPRODFATURA, CDFILIALFATURA, NRPARCFATURA,
                                                             IDTPFATURA, QTPARCELASFATU, IDATIVO, NRORG, DTINCLUSAO, NRORGINCLUSAO, CDOPERINCLUSAO)
                                     VALUES (V_NRPARAMFATITCON, V_NRITSEQCONTRATO, V_NRSEQCONTRATO, V_NRGRUPOFATURA_ITFATNOVO, V_CDPRODFATURA_ITFATNOVO, V_CDFILIALFATURA_ITFATNOVO, V_NRPARCFATURA_ITFATNOVO,
                                               V_IDTPFATURA_ITFATNOVO, V_QTPARCELASFATU_ITFATNOVO, 'S', P_NRORG, SYSDATE, P_NRORG, C_ORCAMENTO.CDOPERRESPONSAVEL);

                       END IF;
                   END IF;
          END LOOP;

          FOR C_REAJUSTE IN (SELECT NRSEQMODREAJUS, NMMODREAJUSCONTR, IDTPREAJUSTE,
                                   IDTPMESREAJUSTE, NRQTDREAJUSTE, NRORG, IDATIVO
                              FROM FCT_MODREAJUSTCONTR
                             WHERE NRSEQMODCONTRA = V_NRSEQMODCONTRATO) LOOP
               NOVO_CODIGO_NT('NRSEQREAJUS', V_NRSEQREAJUSTE,1);

                INSERT INTO FCT_REAJUSTCONTR
                      (NRSEQCONTRATO,NRSEQREAJUS, NMREAJUSCONTR,
                       IDTPREAJUSTE, IDTPMESREAJUSTE,NRQTDREAJUSTE,
                       IDATIVO, DTINCLUSAO)
                    VALUES
                      (V_NRSEQCONTRATO,V_NRSEQREAJUSTE, C_REAJUSTE.NMMODREAJUSCONTR,
                       C_REAJUSTE.IDTPREAJUSTE, C_REAJUSTE.IDTPMESREAJUSTE, C_REAJUSTE.NRQTDREAJUSTE,
                       'S',SYSDATE);


             FOR C_INDICE IN(SELECT CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR, NRORG
                           FROM FCT_MODINDCONTR
                          WHERE NRSEQMODREAJUS = C_REAJUSTE.NRSEQMODREAJUS )LOOP
                NOVO_CODIGO_NT('NRSEQINDCONTR', V_NRSEQINDCONTR,1);

                INSERT INTO FCT_INDICECONTR
                      (NRSEQINDCONTR,NRSEQREAJUS, NRSEQCONTRATO,
                       CDTPINDICE, IDPERVALOR, CDINDICE, VRPERCINDCONTR,
                       IDATIVO, DTINCLUSAO)
                    VALUES
                      (V_NRSEQINDCONTR,V_NRSEQREAJUSTE, V_NRSEQCONTRATO,
                       C_INDICE.CDTPINDICE, C_INDICE.IDPERVALOR, C_INDICE.CDINDICE,
                       C_INDICE.VRPERCINDCONTR, 'S',SYSDATE);

             END LOOP;
          END LOOP;

         FOR C_CONTRATODOC 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 TP.NRSEQMODCONTRATO
                                                       FROM FCT_TIPOORCAMENTO TP
                                                       INNER JOIN FCT_RELACESCOPOPROPOSTA REL
                                                       ON TP.NRTIPOORCAMENTO = REL.NRTIPOORCAMENTO
                                                       AND TP.NRORG           = REL.NRORG
                                                     WHERE REL.NRSEQORCAMENTO = C_ORCAMENTO.NRSEQORCAMENTO
                                                       AND REL.NRORG          = P_NRORG)
                              AND (IDSITUACAOCONTRATO = 'P'
                                    OR (IDSITUACAOCONTRATO IS NULL AND (SELECT COUNT(DOC.NRSEQMODDOCFCT)
                                        FROM FCT_MODELODOCCONTR DOC
                                        WHERE DOC.IDSITUACAOCONTRATO = 'P'
                                          AND DOC.NRSEQMODDOCFCT = FCT_MODELODOCCONTR.NRSEQMODDOCFCT) = 0))) MODCONT
             ON FCT_MODELODOC.NRORG = MODCONT.NRORG
             AND FCT_MODELODOC.NRSEQMODDOCFCT = MODCONT.NRSEQMODDOCFCT
             WHERE FCT_MODELODOC.NRORG = P_NRORG
         ) LOOP

             NOVO_CODIGO_NT('NRSEQCONTDOC', V_NRSEQCONTDOC,1);

             INSERT INTO FCT_CONTRATODOC (
                NRSEQCONTDOC,   NRSEQCONTRATO,    NRSEQMODDOCFCT,
                IDIDIOMA,       TXMODELODOCORCA,  NRORG,
                IDATIVO,        DTINCLUSAO,       NMARQUIVO,
                DSCAMINHOARQ,   DSTIPO,           VRTAMANHO,
                IDSITUACAOCONTRATO
             )
             VALUES (
                V_NRSEQCONTDOC,             V_NRSEQCONTRATO,                C_CONTRATODOC.NRSEQMODDOCFCT,
                C_CONTRATODOC.IDIDIOMA,     C_CONTRATODOC.TXMODELODOCORCA,  P_NRORG,
                'S',                        SYSDATE,                        C_CONTRATODOC.NMARQUIVO,
                C_CONTRATODOC.DSCAMINHOARQ, C_CONTRATODOC.DSTIPO,           C_CONTRATODOC.VRTAMANHO,
                C_CONTRATODOC.IDSITUACAOCONTRATO
             );

         END LOOP;

         FOR C_NEGOCIACAO IN (
             SELECT NRNEGOCIACAOPROPOSTA,
                    NRTIPOORCAMENTO,
                    IDTPFATURA,
                    CDFILIALFATURA,
                    NRPARCFATURA,
                    CDTIPOOPERFATURA,
                    CDSERIENF,
                    CDEMPRESA,
                    CDINSCESTA,
                    CDINSCMUNI,
                    VRTOTITEM,
                    VRPERCDESCITEM,
                    VRDESCITEM,
                    VRTOTITEMCOMDESC,
                    IDATIVO
               FROM FCT_NEGOCIACAOPROPOSTA
              WHERE NRSEQORCAMENTO  = P_NRSEQORCAMENTO
                AND NRORG           = P_NRORG
                AND NRTIPOORCAMENTO = C_ORCAMENTO.NRTIPOORCAMENTO
         ) LOOP

             NOVO_CODIGO_NT('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,          NRNEGOCIACAOPROPOSTA
             )
             VALUES (
                 V_NRNEGOCIACAOCONTRATO,        V_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,
                 C_NEGOCIACAO.IDATIVO,          P_NRORG,                           SYSDATE,
                 P_NRORG,                       C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
             );

             FOR C_ITNEGOCIACAO IN (
                 SELECT NRITNEGOCIACAOPROPOSTA,
                        NRITEMORCAMENTO,
                        NRITEMORCAMENTOPAI,
                        VRTOTITEM,
                        VRPERCDESCITEM,
                        VRDESCITEM,
                        VRTOTITEMCOMDESC,
                        CDSERVORCA,
                        CDPRODFATURA,
                        NRPARCFATURA,
                        IDATIVO
                   FROM FCT_ITNEGOCIACAOPROPOSTA
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP

                 BEGIN
                     SELECT NRITEMOCONTRATO, NRITEMCONTRATOPAI
                       INTO V_NRITEMOCONTRATO_NEGO, V_NRITEMCONTITPAI_NEGO
                       FROM FCT_ITEMCONTRATO
                      WHERE NRSEQCONTRATO   = V_NRSEQCONTRATO
                        AND NRITEMORCAMENTO = C_ITNEGOCIACAO.NRITEMORCAMENTO
                        AND NRORG           = P_NRORG;
                 EXCEPTION WHEN NO_DATA_FOUND THEN
                     V_NRITEMOCONTRATO_NEGO := NULL;
                 END;

                 NOVO_CODIGO_NT('FCT_ITNEGOCIACAOCONTRATO', V_NRITNEGOCIACAOCONTRATO, 1, P_NRORG);

                 INSERT INTO FCT_ITNEGOCIACAOCONTRATO (
                     NRITNEGOCIACAOCONTRATO, NRNEGOCIACAOCONTRATO,   NRITEMOCONTRATO,
                     NRITEMORCAMENTO,        NRITEMORCAMENTOPAI,     VRTOTITEM,
                     VRPERCDESCITEM,         VRDESCITEM,             VRTOTITEMCOMDESC,
                     CDSERVORCA,             CDPRODFATURA,           NRPARCFATURA,
                     IDATIVO,                NRORG,                  DTINCLUSAO,
                     NRORGINCLUSAO,          NRITNEGOCIACAOPROPOSTA, NRITEMCONTRATOPAI
                 ) VALUES (
                     V_NRITNEGOCIACAOCONTRATO,      V_NRNEGOCIACAOCONTRATO,                V_NRITEMOCONTRATO_NEGO,
                     NULL,                          NULL,                                  C_ITNEGOCIACAO.VRTOTITEM,
                     C_ITNEGOCIACAO.VRPERCDESCITEM, C_ITNEGOCIACAO.VRDESCITEM,             C_ITNEGOCIACAO.VRTOTITEMCOMDESC,
                     C_ITNEGOCIACAO.CDSERVORCA,     C_ITNEGOCIACAO.CDPRODFATURA,           C_ITNEGOCIACAO.NRPARCFATURA,
                     C_ITNEGOCIACAO.IDATIVO,        P_NRORG,                               SYSDATE,
                     P_NRORG,                       C_ITNEGOCIACAO.NRITNEGOCIACAOPROPOSTA, V_NRITEMCONTITPAI_NEGO
                 );

             END LOOP; --C_ITNEGOCIACAO

             FOR C_PARCELA_NEGO IN (
                 SELECT NRPARCELANEGOPROP,
                        QTDIASFATURAMENTO,
                        NRDIAVENCIMENTO,
                        VRPARCELA,
                        IDATIVO
                   FROM FCT_PARCELANEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP

                 NOVO_CODIGO_NT('FCT_PARCELANEGOCONT', V_NRPARCELANEGOCONT, 1, P_NRORG);

                 INSERT INTO FCT_PARCELANEGOCONT (
                     NRPARCELANEGOCONT, NRNEGOCIACAOCONTRATO, QTDIASFATURAMENTO,
                     NRDIAVENCIMENTO,   VRPARCELA,            IDATIVO,
                     NRORG,             DTINCLUSAO,           NRORGINCLUSAO,
                     NRPARCELANEGOPROP
                 )
                 VALUES (
                     V_NRPARCELANEGOCONT,              V_NRNEGOCIACAOCONTRATO,   C_PARCELA_NEGO.QTDIASFATURAMENTO,
                     C_PARCELA_NEGO.NRDIAVENCIMENTO,   C_PARCELA_NEGO.VRPARCELA, C_PARCELA_NEGO.IDATIVO,
                     P_NRORG,                          SYSDATE,                  P_NRORG,
                     C_PARCELA_NEGO.NRPARCELANEGOPROP
                 );

             END LOOP; --C_PARCELA_NEGO

             FOR C_DESCPERIODO_NEGO IN (
                 SELECT NRDESCPERIODONEGOPROP,
                        VRPERCDESCITEM,
                        VRDESCITEM,
                        VRTOTITEMCOMDESC,
                        QTMESESDESC,
                        DTFINALVALIDADEDESC,
                        IDATIVO
                   FROM FCT_DESCPERIODONEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP

                 NOVO_CODIGO_NT('FCT_DESCPERIODONEGOCONT', V_NRDESCPERIODONEGOCONT, 1, P_NRORG);

                 INSERT INTO FCT_DESCPERIODONEGOCONT (
                     NRDESCPERIODONEGOCONT, NRNEGOCIACAOCONTRATO, VRPERCDESCITEM,
                     VRDESCITEM,            VRTOTITEMCOMDESC,     QTMESESDESC,
                     DTFINALVALIDADEDESC,   IDATIVO,              NRORG,
                     DTINCLUSAO,            NRORGINCLUSAO,        NRDESCPERIODONEGOPROP
                 )
                 VALUES (
                     V_NRDESCPERIODONEGOCONT,                V_NRNEGOCIACAOCONTRATO,              C_DESCPERIODO_NEGO.VRPERCDESCITEM,
                     C_DESCPERIODO_NEGO.VRDESCITEM,          C_DESCPERIODO_NEGO.VRTOTITEMCOMDESC, C_DESCPERIODO_NEGO.QTMESESDESC,
                     C_DESCPERIODO_NEGO.DTFINALVALIDADEDESC, C_DESCPERIODO_NEGO.IDATIVO,          P_NRORG,
                     SYSDATE,                                P_NRORG,                             C_DESCPERIODO_NEGO.NRDESCPERIODONEGOPROP
                 );

             END LOOP; --C_DESCPERIODO_NEGO

             FOR C_COMPET IN (
                 SELECT NRDIACOMPETINI,
                        NRDIACOMPETFIN,
                        IDMESCOMPETINI,
                        IDMESCOMPETFIN,
                        QTDIASAPURACAO,
                        IDTPCALCVENC,
                        NRDIACALCVENC,
                        IDMESCALCVENC,
                        QTDIASFATUVENC,
                        IDATIVO
                   FROM FCT_COMPETENCIANEGOPROP
                  WHERE NRNEGOCIACAOPROPOSTA = C_NEGOCIACAO.NRNEGOCIACAOPROPOSTA
                    AND NRORG                = P_NRORG
             ) LOOP

                 NOVO_CODIGO_NT('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
                 )
                 VALUES (
                     V_NRCOMPETENCIANEGOCONT, V_NRNEGOCIACAOCONTRATO,  C_COMPET.NRDIACOMPETINI,
                     C_COMPET.NRDIACOMPETFIN, C_COMPET.IDMESCOMPETINI, C_COMPET.IDMESCOMPETFIN,
                     C_COMPET.QTDIASAPURACAO, C_COMPET.IDTPCALCVENC,   C_COMPET.NRDIACALCVENC,
                     C_COMPET.IDMESCALCVENC,  C_COMPET.QTDIASFATUVENC, C_COMPET.IDATIVO,
                     P_NRORG,                 SYSDATE,                 P_NRORG
                 );

             END LOOP; --C_COMPET

         END LOOP; --C_NEGOCIACAO

      END LOOP;

        FOR C_ELEMENTOS IN (
            SELECT NRCOMPSERVICO,
              NRITCOMPSERVICO,
              IDESCOLHIDO,
              CDSERVORCA,
              QTSERVORCA,
              CDTPMEDIDASERV,
              QTMEDSERVORCA,
              VRUNITSERVORCA,
              VRTOTSERVORCA,
              IDELEMENTO,
              IDELEMENTOPAI,
              IDTIPOELEMENTO,
              IDSERVOBRIGCOMP,
              QTMEDIDAVARIAVEL,
              QTMEDIDACALC
          FROM FCT_TRABSERVORCAMENTO
          WHERE NRSEQORCAMENTO  = P_NRSEQORCAMENTO
            AND NRORG           = P_NRORG
        ) LOOP

            NOVO_CODIGO_NT('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
            ) VALUES (
                V_NRTRABSERVCONT,            V_NRSEQCONTRATO,              C_ORCAMENTO.NRTIPOORCAMENTO,
                C_ELEMENTOS.NRCOMPSERVICO,   C_ELEMENTOS.NRITCOMPSERVICO,  C_ELEMENTOS.IDESCOLHIDO,
                C_ELEMENTOS.CDSERVORCA,      C_ELEMENTOS.QTSERVORCA,       C_ELEMENTOS.CDTPMEDIDASERV,
                C_ELEMENTOS.QTMEDSERVORCA,   C_ELEMENTOS.VRUNITSERVORCA,   C_ELEMENTOS.VRTOTSERVORCA,
                C_ELEMENTOS.IDELEMENTO,      C_ELEMENTOS.IDELEMENTOPAI,    C_ELEMENTOS.IDTIPOELEMENTO,
                C_ELEMENTOS.IDSERVOBRIGCOMP, C_ELEMENTOS.QTMEDIDAVARIAVEL, C_ELEMENTOS.QTMEDIDACALC,
                P_NRORG,                     'S',                          SYSDATE,
                NULL,                        P_NRORG,                      C_ORCAMENTO.CDOPERRESPONSAVEL,
                NULL,                        NULL
            );
        END LOOP; -- C_ELEMENTOS

        IF(C_ORCAMENTO.IDUTILIZAVARPRECO = 'S') THEN
            FOR C_TPMEDIDA IN(
                SELECT NRSEQORCAMENTO,
                CDTPMEDIDAVARIAVEL,
                QTMEDIDAVARIAVEL,
                IDELEMENTORAIZ,
                QTFRANQUIA
            FROM FCT_RELACMEDIDAPROPOSTA
            WHERE NRSEQORCAMENTO    = P_NRSEQORCAMENTO
                AND NRORG           = P_NRORG
            ) LOOP

                NOVO_CODIGO_NT('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
                ) VALUES (
                    V_NRMEDIDACONTRATO,
                    V_NRSEQCONTRATO,
                    C_TPMEDIDA.CDTPMEDIDAVARIAVEL,
                    C_TPMEDIDA.QTMEDIDAVARIAVEL,
                    C_TPMEDIDA.IDELEMENTORAIZ,
                    C_TPMEDIDA.QTFRANQUIA,
                    P_NRORG,
                    SYSDATE,
                    NULL,
                    P_NRORG,
                    C_ORCAMENTO.CDOPERRESPONSAVEL,
                    NULL,
                    NULL,
                    'S'
                );
            END LOOP; -- C_TPMEDIDA
        END IF;

        FOR C_COMPSERVICO IN(
            SELECT NRCOMPSERVICO,
                NMCOMPSERVICO,
                NRCOMPSERVICOPAI,
                IDCOMPOBRIGATORIA,
                IDESCOLHIDO
            FROM FCT_COMPSERVORCAMENTO
            WHERE NRSEQORCAMENTO    = P_NRSEQORCAMENTO
                AND NRORG           = P_NRORG
        ) LOOP

            NOVO_CODIGO_NT('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_NRSEQCONTRATO,
                C_COMPSERVICO.NRCOMPSERVICO,
                C_COMPSERVICO.NMCOMPSERVICO,
                C_COMPSERVICO.NRCOMPSERVICOPAI,
                C_COMPSERVICO.IDCOMPOBRIGATORIA,
                C_COMPSERVICO.IDESCOLHIDO,
                P_NRORG,
                'S',
                SYSDATE,
                NULL,
                P_NRORG,
                C_ORCAMENTO.CDOPERRESPONSAVEL,
                NULL,
                NULL
            );

        END LOOP; -- C_COMPSERVICO

      IF V_NRSEQMODCONTRATO IS NOT NULL THEN
          NOVO_CODIGO_NT('FCT_REFEORCACONT', V_NRSEQREFEORCCONT,1);

          INSERT INTO FCT_REFEORCACONT
            (NRSEQREFEORCCONT,  NRSEQORCAMENTO,   NRSEQCONTRATO, IDCONTRATIVO,
             NRORG, DTINCLUSAO, NRTIPOORCAMENTO, IDATIVO)
          VALUES
            (V_NRSEQREFEORCCONT, P_NRSEQORCAMENTO, V_NRSEQCONTRATO,'A',
             P_NRORG,            SYSDATE,          C_ORCAMENTO.NRTIPOORCAMENTO,
             'S');
      END IF;
  END LOOP;

  P_NRSEQCONTRATO := V_NRSEQCONTRATO;
END;