CREATE OR REPLACE PROCEDURE FCT_GERAR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE, 
    P_NRORG         IN NUMBER,
    P_CDOPERADOR    IN VARCHAR2,
    P_IDRENOVACAO   IN NUMBER DEFAULT 0 /*ID se o contrato esta sendo renovado: 0 = false, 1 = true*/
)
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_IDTPCALCVENC_PF       FCT_CAPAPARAMFATESC.IDTPCALCVENC%TYPE;
    V_QTDIASFATUVENC_PF     FCT_CAPAPARAMFATESC.QTDIASFATUVENC%TYPE;
    V_NRDIACALCVENC_PF      FCT_CAPAPARAMFATESC.NRDIACALCVENC%TYPE;
    V_IDMESCALCVENC_PF      FCT_CAPAPARAMFATESC.IDMESCALCVENC%TYPE;
    V_QTDIASAPURACAO_PF     FCT_CAPAPARAMFATESC.QTDIASAPURACAO%TYPE;
    V_IDTPCALCPARCINC       FCT_CAPAPARAMFATESC.IDTPCALCPARCINC%TYPE;
    V_QTDIASCOMPETATUAL     NUMBER;
    V_QTDIASCOMPET          NUMBER;
    V_QTDIASPERIODINC       NUMBER;
    V_VRTOTITEMCOMDESC      FLOAT;
    V_VRDESCITEM            FLOAT;
    V_VRPERCDESCITEM        FLOAT;
    V_IDSITUACAO            CHAR(1);
    V_VALIDAMEDIDACONT      NUMBER;
    V_VRVENCIMENTOINC       FLOAT;
    V_PROX_DTINICOMPET      DATE;
    V_PROX_DTFINCOMPET      DATE;
    V_PERIODOINCOMP         CHAR(1);
    V_IDSITUACAO_PROX       CHAR(1);
    V_VRPERCDESCPERIODO     FLOAT;
    V_CONT                  NUMBER;
    V_IDSITUACAOPARCELA     CHAR(1);
    V_DIAFINCOMPETATUAL     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_ULTDIAMES             FCT_COMPETENCIANEGOCONT.NRDIACOMPETINI%TYPE;
    V_NRAGRUPAMENTO         FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_IDPARCAGRUP           FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
    V_EXISTE_PARCELA  INTEGER;
    V_QTMEDSERVICO    INTEGER;
    V_VRTOTITEMCONT   FLOAT;
    V_VRITEMCONT      FLOAT;
    
    -- RATEIO
    V_NRRATEIOITEMFAT   FCT_RATEIOITFATURACONT.NRRATEIOITEMFAT%TYPE;
    V_COUNTITENSRATEIO  NUMBER;
    V_IDGERARATEIO      VARCHAR2(1);
    V_NRPARCFATURA      NUMBER;
    
    -- VARIAVEIS DE NEGOCIACAO DE CONTRATO APROVADO
    V_NRPARCELASNEGCONTR    FCT_PARCELASNEGCONTR.NRPARCELASNEGCONTR%TYPE;
    V_VRPARCELANEGOCIA      FCT_PARCELASNEGCONTR.VRPARCELANEGOCIA%TYPE;
    V_IDTIPONEGOCIA         FCT_NEGCONTRATO.IDTIPONEGOCIA%TYPE;
    V_NRPARCELASNEGCONTR_IT FCT_PARCELASNEGCONTR.NRPARCELASNEGCONTR%TYPE;
    V_VRPARCELANEGOCIA_IT   FCT_PARCELASNEGCONTR.VRPARCELANEGOCIA%TYPE;
    V_VRPARCELANEGOCIA_EL   FLOAT;
    V_VRSOMAELEMENTOS       FLOAT;
    V_VRNEGOCIADOEL         FLOAT;
    V_IDTIPONEGOCIA_IT      FCT_NEGCONTRATO.IDTIPONEGOCIA%TYPE;
    V_VRNEGOCIADO           FLOAT;
    V_VRNEGOCIADOIT         FLOAT;
    V_VRVENCIMENTO          FLOAT;
    V_SOMA_VRNEGOCIADOIT    FLOAT;
    V_SOMA_VRCONSIDERADOIT  FLOAT;

    V_DATA_INICIO_REAJUSTE DATE;
BEGIN
    -- Manda deletar as parcelas e medicoes no caso de regeracao 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;
    
    /* PARTE ABAIXO FOI COMENTADA POIS ROTINA DE REAJUSTE DEVE SER REVISADA:
    - Aguardar tarefa de historico de preco
    - Ao reajustar, possibilitar informar a data do reajuste
    - Parametrizar qual valor deve ser considerado na regeracao de parcelas: se considera o valor novo para as parcelas retroativo ou se considera o valor novo so a partir da data do ultimo reajuste

    BEGIN    
        SELECT MAX(DTINCLUSAO)
          INTO V_DATA_INICIO_REAJUSTE
          FROM FCT_CONTRATOREAJUSTE
         WHERE FCT_CONTRATOREAJUSTE.NRSEQCONTRATO = P_NRSEQCONTRATO;
    EXCEPTION WHEN NO_DATA_FOUND THEN
        V_DATA_INICIO_REAJUSTE := NULL;
    END;
    */

    FOR C_NEGOCIACAO IN (
        SELECT NEG.NRSEQCONTRATO,
               NEG.NRTIPOORCAMENTO,
               NEG.IDTPFATURA,
               NVL(NEG.VRPERCDESCITEM, 0) AS VRPERCDESCITEM,
               NVL(NEG.VRDESCITEM, 0) AS VRDESCITEM,
               NEG.VRTOTITEM,
               NEG.VRTOTITEMCOMDESC,
               NVL(CONT.DTINIVIGENCONT, CONT.DTINICIOCONTRATO) AS DTINICIOCONTRATO, -- data de  inicio 
               NVL(CONT.DTFINVIGENCONT, CONT.DTFIMCONTRATO) AS DTFIMCONTRATO,
               NEG.NRNEGOCIACAOCONTRATO,
               NEG.CDFILIALFATURA,
               NEG.NRPARCFATURA,
               NEG.CDTIPOOPERFATURA,
               NEG.CDSERIENF,
               NEG.CDEMPRESA,
               NEG.CDINSCESTA,
               NEG.CDINSCMUNI,
               (SELECT COUNT(*)
                  FROM FCT_ITNEGOCIACAOCONTRATO
                 WHERE NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                   AND NRORG                = NEG.NRORG
                   AND NRITEMORCAMENTOPAI   IS NULL) AS QTITEM,
               --NVL(CONT.IDGERARATEIO, 'N') AS IDGERARATEIO,
               CONT.IDAGRUPPARC,
               RELESCONT.IDLOCALTOMADORNF,
               NEG.NRESTRUTURAM,
               EST.NRPARCNEGOCIO AS NRPARCESTRUTURA,
               NEG.CDTRIBPRODPADR,
               NEG.CDPAISFAT,
               NEG.SGESTADOFAT,
               NEG.CDMUNICIPIOFAT,
               NEG.IDNATUOPER
          FROM FCT_NEGOCIACAOCONTRATO NEG
         INNER JOIN FCT_CONTRATO CONT
            ON NEG.NRSEQCONTRATO = CONT.NRSEQCONTRATO
           AND NEG.NRORG         = CONT.NRORG
          LEFT JOIN FCT_RELACESTRUTURACONT RELESCONT
            ON NEG.NRSEQCONTRATO = RELESCONT.NRSEQCONTRATO
           AND NEG.NRESTRUTURAM  = RELESCONT.NRESTRUTURAM
          LEFT JOIN ESTRUTURAM EST
            ON NEG.NRESTRUTURAM = EST.NRESTRUTURAM
         WHERE NEG.NRSEQCONTRATO = P_NRSEQCONTRATO
           AND NEG.NRORG         = P_NRORG
           AND (P_IDRENOVACAO = 0 OR (P_IDRENOVACAO = 1 AND NEG.IDTPFATURA <> 'P'))
    ) LOOP
        V_NRFATURACONT := NULL;
        V_IDPARCAGRUP  := 'N';
        
        /* PARTE ABAIXO FOI COMENTADA POIS ROTINA DE REAJUSTE DEVE SER REVISADA:
        - Aguardar tarefa de historico de preco
        - Ao reajustar, possibilitar informar a data do reajuste
        - Parametrizar qual valor deve ser considerado na regeracao de parcelas: se considera o valor novo para as parcelas retroativo ou se considera o valor novo so a partir da data do ultimo reajuste

        V_DATA_INICIO_REAJUSTE := TRUNC(NVL(V_DATA_INICIO_REAJUSTE, C_NEGOCIACAO.DTINICIOCONTRATO));

        IF (V_DATA_INICIO_REAJUSTE NOT BETWEEN C_NEGOCIACAO.DTINICIOCONTRATO AND C_NEGOCIACAO.DTFIMCONTRATO) THEN
            V_DATA_INICIO_REAJUSTE := C_NEGOCIACAO.DTINICIOCONTRATO;
        END IF;
        */

        V_DATA_INICIO_REAJUSTE := C_NEGOCIACAO.DTINICIOCONTRATO;

        /*
        IDTPFATURA
        A = Periodico (valor de parcela fixo)
        X = Periodico (Valor Apurado por Medicao)
        P = Parcelamento (Quantidade de Parcelas)
        */
        IF (C_NEGOCIACAO.IDTPFATURA = 'P') THEN
            IF (C_NEGOCIACAO.VRTOTITEMCOMDESC > 0) THEN
                V_QTDIASFATURAMENTO_ANT := -1;
                V_CONT := 0;
                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;
                    V_CONT := V_CONT+1;
                    SELECT COUNT(*)
                      INTO V_EXISTE_PARCELA
                      FROM FCT_FATURACONT FAT
                     INNER JOIN FCT_RELACAGRUPCONTFAT REL
                        ON FAT.NRFATURACONT = REL.NRFATURACONT
                       AND FAT.NRORG        = REL.NRORG
                     WHERE REL.NRSEQCONTRATO      = P_NRSEQCONTRATO
                       AND FAT.IDSITUACAO         <> '1'
                       AND FAT.IDTPFATURA         = C_NEGOCIACAO.IDTPFATURA
                       AND TRUNC(FAT.DTINICOMPET) = TRUNC(V_DTINICOMPET_ATUAL)
                       AND TRUNC(FAT.DTFINCOMPET) = TRUNC(V_DTFINCOMPET_ATUAL);
                    IF (V_EXISTE_PARCELA = 0) THEN
                        SELECT DISTINCT NVL(PFIT.IDTPCALCVENC, PFESC.IDTPCALCVENC) AS IDTPCALCVENC,
                               NVL(PFIT.QTDIASFATUVENC, PFESC.QTDIASFATUVENC) AS QTDIASFATUVENC,
                               NVL(PFIT.NRDIACALCVENC, PFESC.NRDIACALCVENC) AS NRDIACALCVENC,
                               NVL(PFIT.IDMESCALCVENC, PFESC.IDMESCALCVENC) AS IDMESCALCVENC,
                               NVL(PFIT.QTDIASAPURACAO, PFESC.QTDIASAPURACAO) AS QTDIASAPURACAO
                          INTO V_IDTPCALCVENC_PF,
                               V_QTDIASFATUVENC_PF,
                               V_NRDIACALCVENC_PF,
                               V_IDMESCALCVENC_PF,
                               V_QTDIASAPURACAO_PF
                          FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                         INNER JOIN FCT_NEGOCIACAOCONTRATO NEG
                            ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                           AND ITNEG.NRORG                = NEG.NRORG
                         INNER JOIN FCT_CAPAPARAMFATESC PFESC
                            ON NEG.NRTIPOORCAMENTO = PFESC.NRTIPOORCAMENTO
                           AND NEG.NRORG           = PFESC.NRORG
                          LEFT JOIN FCT_ITESCOPOPROPOSTA ITESC
                            ON NEG.NRTIPOORCAMENTO = ITESC.NRTIPOORCAMENTO
                           AND ITNEG.CDSERVORCA    = ITESC.CDSERVORCA
                           AND ITNEG.NRORG         = ITESC.NRORG
                          LEFT JOIN FCT_PARAMFATITESC PFIT
                            ON ITESC.NRITESCOPOPROPOSTA = PFIT.NRITESCOPOPROPOSTA
                           AND ITESC.NRORG              = PFIT.NRORG
                         WHERE ITNEG.NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                           AND ITNEG.NRORG                = P_NRORG
                           AND ITNEG.NRITEMCONTRATOPAI    IS NULL;
                        --INICIO: calculo da data de vencimento da NF
                        IF (C_PARCELAS.NRDIAVENCIMENTO IS NOT NULL) THEN
                            V_NRDIASVENCIMENTO := NULL;
                            V_QTDIASFATUVENC := NULL;
                            IF (C_PARCELAS.NRDIAVENCIMENTO > EXTRACT(DAY FROM LAST_DAY(V_DTFINCOMPET_ATUAL))) THEN
                                V_DTVENCIMENTO := LAST_DAY(V_DTFINCOMPET_ATUAL);
                            ELSE
                                V_DTVENCIMENTO := TO_DATE(LPAD(C_PARCELAS.NRDIAVENCIMENTO, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                            END IF;
                            IF (V_DTVENCIMENTO < V_DTFINCOMPET_ATUAL) THEN
                                V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                            END IF;
                            IF (V_IDTPCALCVENC_PF = '1' AND V_QTDIASFATUVENC_PF IS NOT NULL) THEN
                                V_QTDIASFATUVENC := V_QTDIASFATUVENC_PF;
                            END IF;
                        ELSE
                            IF (V_IDTPCALCVENC_PF = '1') THEN --dia fixo
                                V_NRDIASVENCIMENTO := NULL;
                                V_QTDIASFATUVENC := V_QTDIASFATUVENC_PF;
                                --data de vencimento para o mes atual
                                IF (V_NRDIACALCVENC_PF > EXTRACT(DAY FROM LAST_DAY(V_DTFINCOMPET_ATUAL))) THEN
                                    V_DTVENCIMENTO := LAST_DAY(V_DTFINCOMPET_ATUAL);
                                ELSE
                                    V_DTVENCIMENTO := TO_DATE(LPAD(V_NRDIACALCVENC_PF, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                                END IF;
                                IF (V_IDMESCALCVENC_PF = '1') THEN --mes anterior
                                    V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, -1);
                                ELSIF (V_IDMESCALCVENC_PF = '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 sera paralisada
                        BEGIN
                            SELECT '5' AS IDSITUACAO
                            INTO V_IDSITUACAO
                            FROM FCT_PARAMPARALISACAOCONT
                            WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                                AND NRORG       = P_NRORG
                                AND TRUNC(DTRETOMADAFATURA) > TRUNC(SYSDATE)
                                AND (TRUNC(DTINIPARALISACAO) BETWEEN TRUNC(V_DTINICOMPET_ATUAL) AND TRUNC(V_DTFINCOMPET_ATUAL)
                                    OR (TRUNC(DTRETOMADAFATURA) BETWEEN TRUNC(V_DTINICOMPET_ATUAL) AND TRUNC(V_DTFINCOMPET_ATUAL)))
                            GROUP BY 1;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                            V_IDSITUACAO := '1';
                        END;
                        V_NRFATURACONT := NULL;
                        V_IDPARCAGRUP  := 'N';
                        -- Verifica se existe 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 TRUNC(PARCELA.DTINICOMPET) = TRUNC(V_DTINICOMPET_ATUAL)
                                   AND TRUNC(PARCELA.DTFINCOMPET) = TRUNC(V_DTFINCOMPET_ATUAL);
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                                V_NRFATURACONT := NULL;
                            END;
                        END IF; --V_NRAGRUPAMENTO IS NOT NULL
                        IF(V_NRFATURACONT IS NULL) THEN
                            
                            V_NRPARCFATURA := C_NEGOCIACAO.NRPARCFATURA;
                            IF (C_NEGOCIACAO.IDAGRUPPARC = '2' AND C_NEGOCIACAO.IDLOCALTOMADORNF = 'S') THEN
                                V_NRPARCFATURA := C_NEGOCIACAO.NRPARCESTRUTURA;
                            END IF;

                            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,
                                NRPARCELA,
                                DTINICOMPET,
                                DTFINCOMPET,
                                DTLIMITEAPU,
                                DTVENCIMENTO,
                                NRDIASVENCIMENTO,
                                QTDIASFATUVENC,
                                VRVENCIMENTO,
                                VRFATURADO,
                                VRFALTAFATURAR,
                                IDFORMAFATURA,
                                DSJUSTIFICATIVA,
                                NRAPURACAO,
                                NRMEDICAOFATURA,
                                IDALTUSUARIO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO,
                                NRESTRUTURAM,
                                CDTRIBPRODPADR,
                                CDPAISFAT,
                                SGESTADOFAT,
                                CDMUNICIPIOFAT,
                                IDNATUOPER
                            )
                            VALUES (
                                V_NRFATURACONT,
                                NULL,
                                C_NEGOCIACAO.CDFILIALFATURA,
                                V_NRPARCFATURA,
                                C_NEGOCIACAO.CDTIPOOPERFATURA,
                                C_NEGOCIACAO.CDSERIENF,
                                C_NEGOCIACAO.CDEMPRESA,
                                C_NEGOCIACAO.CDINSCESTA,
                                C_NEGOCIACAO.CDINSCMUNI,
                                C_NEGOCIACAO.IDTPFATURA,
                                V_IDSITUACAO,
                                V_CONT,
                                V_DTINICOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL + V_QTDIASAPURACAO_PF,
                                V_DTVENCIMENTO,
                                V_NRDIASVENCIMENTO,
                                V_QTDIASFATUVENC,
                                ROUND(C_PARCELAS.VRPARCELA, 2),
                                0,
                                ROUND(C_PARCELAS.VRPARCELA, 2),
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                'N',
                                'S',
                                P_NRORG,
                                SYSDATE,
                                P_NRORG,
                                P_CDOPERADOR,
                                C_NEGOCIACAO.NRESTRUTURAM,
                                C_NEGOCIACAO.CDTRIBPRODPADR,
                                C_NEGOCIACAO.CDPAISFAT,
                                C_NEGOCIACAO.SGESTADOFAT,
                                C_NEGOCIACAO.CDMUNICIPIOFAT,
                                C_NEGOCIACAO.IDNATUOPER
                            );
                        ELSE
                            UPDATE FCT_FATURACONT
                               SET VRVENCIMENTO   = ROUND(VRVENCIMENTO + C_PARCELAS.VRPARCELA, 2),
                                   VRFALTAFATURAR = ROUND(VRVENCIMENTO + C_PARCELAS.VRPARCELA, 2)
                             WHERE NRFATURACONT  = V_NRFATURACONT
                               AND NRORG         = P_NRORG;
                        END IF; --V_NRFATURACONT IS NULL
                        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,      NRPARCELA)
                            VALUES (
                                  V_NRAGRUPCONTFAT,     V_NRFATURACONT,       V_IDPARCAGRUP,       P_NRSEQCONTRATO,
                                  P_NRORG,              'S',                  SYSDATE,             NULL,
                                  P_CDOPERADOR,         NULL,                 NULL,                NULL,
                                  P_NRORG,              C_PARCELAS.NRPARCELA);
                        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 * (C_NEGOCIACAO.VRDESCITEM / C_NEGOCIACAO.VRTOTITEM));
                            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,
                                ROUND(V_VRVENCIMENTOITEM, 2),
                                0,
                                ROUND(V_VRVENCIMENTOITEM, 2),
                                NULL,
                                NULL,
                                NULL,
                                'S',
                                P_NRORG,
                                SYSDATE,
                                P_NRORG,
                                P_CDOPERADOR
                            );
                        END LOOP; --C_ITNEGOCIACAO
                    END IF; --V_EXISTE_PARCELA = 0
                    V_QTDIASFATURAMENTO_ANT := C_PARCELAS.QTDIASFATURAMENTO;
                END LOOP; --C_PARCELAS
            END IF; --C_NEGOCIACAO.VRTOTITEMCOMDESC > 0
        ELSE --C_NEGOCIACAO.IDTPFATURA = A ou X
            BEGIN
                SELECT NVL(IDTPCALCPARCINC, 2)
                  INTO V_IDTPCALCPARCINC
                  FROM FCT_CAPAPARAMFATESC 
                 WHERE NRTIPOORCAMENTO = C_NEGOCIACAO.NRTIPOORCAMENTO
                   AND NRORG           = P_NRORG;
            EXCEPTION WHEN NO_DATA_FOUND THEN 
                V_IDTPCALCPARCINC := '2'; 
            END; 
            FOR C_COMPETENCIA IN (
                SELECT DISTINCT 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(V_DATA_INICIO_REAJUSTE)));
                IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETINI THEN
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(V_ULTDIAMES, 2, '0') || '/' || TO_CHAR(V_DATA_INICIO_REAJUSTE, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(V_DATA_INICIO_REAJUSTE, '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(V_DATA_INICIO_REAJUSTE, 'MM/YYYY'), 'DD/MM/YYYY');
                ELSE
                    V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETFIN, 2, '0') || '/' || TO_CHAR(V_DATA_INICIO_REAJUSTE, '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_ULTDIAMES := EXTRACT(DAY FROM(LAST_DAY(V_DTINICOMPET_ATUAL)));
                    IF V_ULTDIAMES < C_COMPETENCIA.NRDIACOMPETINI THEN
                        V_DTINICOMPET_ATUAL := LAST_DAY(V_DTINICOMPET_ATUAL) + 1;
                    ELSE
                        V_DTINICOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0') || '/' || TO_CHAR(V_DTINICOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                    END IF;

                    V_DIAFINCOMPETATUAL := EXTRACT(DAY FROM(V_DTFINCOMPET_ATUAL));
                    IF (V_DIAFINCOMPETATUAL > C_COMPETENCIA.NRDIACOMPETFIN) THEN
                        V_DTFINCOMPET_ATUAL := TO_DATE(LPAD(C_COMPETENCIA.NRDIACOMPETFIN, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                    END IF;

                    IF (V_DTINICOMPET_ATUAL > V_DTFINCOMPET_ATUAL) THEN
                        V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, -1);
                    END IF;
                    V_QTDIASCOMPET := (V_DTFINCOMPET_ATUAL - V_DTINICOMPET_ATUAL) + 1;

                    IF (V_DTINICOMPET_ATUAL < V_DATA_INICIO_REAJUSTE) THEN
                        IF (V_DTFINCOMPET_ATUAL < V_DATA_INICIO_REAJUSTE) THEN
                            V_DTINICOMPET_ATUAL := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                            V_DTFINCOMPET_ATUAL := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                            CONTINUE;
                        ELSE
                            V_DTINICOMPET_ATUAL := V_DATA_INICIO_REAJUSTE;
                        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
                    V_QTDIASCOMPETATUAL := (TRUNC(V_DTFINCOMPET_ATUAL) - TRUNC(V_DTINICOMPET_ATUAL)) + 1;
                    BEGIN
                        SELECT DESCPER.VRTOTITEMCOMDESC, DESCPER.VRDESCITEM, DESCPER.VRPERCDESCITEM
                        INTO V_VRTOTITEMCOMDESC, V_VRDESCITEM, V_VRPERCDESCPERIODO
                        FROM (SELECT VRTOTITEMCOMDESC,
                                     VRPERCDESCITEM,
                                     VRDESCITEM,
                                     QTMESESDESC,
                                     DTFINALVALIDADEDESC
                                FROM FCT_DESCPERIODONEGOCONT
                               WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                 AND NRORG                = P_NRORG
                                 AND V_DTINICOMPET_ATUAL  < DTFINALVALIDADEDESC
                                 AND NRORDEMAPLICADESC = (SELECT MIN(NRORDEMAPLICADESC)
                                                          FROM FCT_DESCPERIODONEGOCONT
                                                          WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                                             AND NRORG               = P_NRORG
                                                             AND V_DTINICOMPET_ATUAL < DTFINALVALIDADEDESC)
                               ORDER BY DTFINALVALIDADEDESC) DESCPER;
                    EXCEPTION WHEN NO_DATA_FOUND THEN
                        V_VRTOTITEMCOMDESC  := C_NEGOCIACAO.VRTOTITEMCOMDESC;
                        V_VRDESCITEM        := 0;
                        V_VRPERCDESCPERIODO := 0;
                    END;
                    -- Valida se a parcela gerada sera 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;
                    -- Faz o calculo do periodo para as parcelas incompletas
                    V_PERIODOINCOMP := 'N';
                    V_VRVENCIMENTOINC := 0;
                    IF(TO_CHAR(V_DTINICOMPET_ATUAL, 'DD') <> (LPAD(C_COMPETENCIA.NRDIACOMPETINI, 2, '0')) 
                        OR V_DTFINCOMPET_ATUAL <> LAST_DAY(V_DTFINCOMPET_ATUAL)) THEN
                        IF(V_IDTPCALCPARCINC <> '2' AND V_QTDIASCOMPET <> V_QTDIASCOMPETATUAL) THEN
                            V_VRVENCIMENTOINC := 0;
                            V_QTDIASPERIODINC := 0;
                            V_PERIODOINCOMP   := 'S';
                            IF V_IDTPCALCPARCINC = '3' THEN
                                V_PROX_DTINICOMPET := ADD_MONTHS(V_DTINICOMPET_ATUAL, 1);
                                V_PROX_DTFINCOMPET := ADD_MONTHS(V_DTFINCOMPET_ATUAL, 1);
                                IF (V_PROX_DTINICOMPET <= C_NEGOCIACAO.DTFIMCONTRATO) THEN
                                    BEGIN
                                        SELECT '5'
                                          INTO V_IDSITUACAO_PROX
                                          FROM FCT_PARAMPARALISACAOCONT
                                         WHERE NRSEQCONTRATO    = P_NRSEQCONTRATO
                                           AND NRORG            = P_NRORG
                                           AND DTRETOMADAFATURA > SYSDATE
                                           AND (DTINIPARALISACAO BETWEEN V_PROX_DTINICOMPET AND V_PROX_DTFINCOMPET
                                               OR (DTRETOMADAFATURA BETWEEN V_PROX_DTINICOMPET AND V_PROX_DTFINCOMPET))
                                         GROUP BY 1;
                                    EXCEPTION WHEN NO_DATA_FOUND THEN
                                        V_IDSITUACAO_PROX := '1';
                                    END;
                                    IF (V_IDSITUACAO = V_IDSITUACAO_PROX) THEN
                                        V_VRVENCIMENTOINC   := (V_VRTOTITEMCOMDESC / V_QTDIASCOMPET) * V_QTDIASCOMPETATUAL;
                                        V_QTDIASPERIODINC   := V_QTDIASCOMPETATUAL;
                                        V_DTINICOMPET_ATUAL := V_PROX_DTINICOMPET;
                                        V_DTFINCOMPET_ATUAL := V_PROX_DTFINCOMPET;
                                        CONTINUE;
                                    END IF; -- V_IDSITUACAO = V_IDSITUACAO_PROX
                                END IF; -- V_PROX_DTINICOMPET <= C_NEGOCIACAO.DTFIMCONTRATO
                            END IF; -- V_IDTPCALCPARCINC = 3
                            V_VRTOTITEMCOMDESC := (V_VRTOTITEMCOMDESC / V_QTDIASCOMPET) * V_QTDIASCOMPETATUAL;
                        END IF; -- V_IDTPCALCPARCINC <> 2 AND V_QTDIASCOMPET <> V_QTDIASCOMPETATUAL
                    END IF;
                    V_VRTOTITEMCOMDESC := V_VRTOTITEMCOMDESC + V_VRVENCIMENTOINC;
                    V_VRTOTITEMCOMDESC := ROUND(V_VRTOTITEMCOMDESC, 2);
                    IF (C_NEGOCIACAO.IDTPFATURA = 'A') THEN
                        IF (V_VRTOTITEMCOMDESC > 0) THEN
                            SELECT COUNT(*)
                              INTO V_EXISTE_PARCELA
                              FROM FCT_FATURACONT FAT
                             INNER JOIN FCT_RELACAGRUPCONTFAT REL
                                ON FAT.NRFATURACONT = REL.NRFATURACONT
                               AND FAT.NRORG        = REL.NRORG
                             WHERE REL.NRSEQCONTRATO      = P_NRSEQCONTRATO
                               AND FAT.IDSITUACAO         <> '1'
                               AND FAT.IDTPFATURA         = C_NEGOCIACAO.IDTPFATURA
                               AND REL.NRMEDICAOFATURA    IS NULL
                               AND TRUNC(FAT.DTINICOMPET) = TRUNC(V_DTINICOMPET_ATUAL)
                               AND TRUNC(FAT.DTFINCOMPET) = TRUNC(V_DTFINCOMPET_ATUAL);
                            IF (V_EXISTE_PARCELA = 0) THEN
                                -- Verifica se existe uma parcela pendente inserida para o agrupamento
                                IF(V_NRAGRUPAMENTO IS NOT NULL) THEN
                                    V_IDPARCAGRUP := 'S';
                                    -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE GRUPO DE FATURAMENTO - INICIO
                                    BEGIN
                                        SELECT PARC.NRPARCELASNEGCONTR,
                                               PARC.VRPARCELANEGOCIA,
                                               NEG.IDTIPONEGOCIA
                                          INTO V_NRPARCELASNEGCONTR,
                                               V_VRPARCELANEGOCIA,
                                               V_IDTIPONEGOCIA
                                          FROM FCT_PARCELASNEGCONTR PARC
                                         INNER JOIN FCT_NEGCONTRATO NEG
                                            ON PARC.NRNEGCONTRATO = NEG.NRNEGCONTRATO
                                         WHERE ( TRUNC(V_DTINICOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA)
                                                OR TRUNC(V_DTFINCOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA) )
                                           AND NEG.NRPARCNEGOCIO    = C_NEGOCIACAO.NRPARCFATURA
                                           AND NEG.NRAGRUPAMENTO   IN (SELECT NRAGRUPAMENTO
                                                                         FROM FCT_RELACAGRUPAMENTOCONT
                                                                        WHERE NRSEQCONTRATO = C_NEGOCIACAO.NRSEQCONTRATO)
                                           AND NEG.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                                           AND NEG.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                                           AND NEG.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                                           AND NEG.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                                           AND NEG.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                                           AND NEG.NRORG            = P_NRORG
                                           AND NEG.NRITEMOCONTRATO  IS NULL
                                           AND NEG.IDATIVO          = 'S'
                                           AND PARC.IDATIVO         = 'S';
                                    EXCEPTION WHEN NO_DATA_FOUND THEN
                                        V_NRPARCELASNEGCONTR := NULL;
                                        V_VRPARCELANEGOCIA := NULL;
                                        V_IDTIPONEGOCIA := NULL;
                                    END;
                                    -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE GRUPO DE FATURAMENTO - FIM
                                    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 TRUNC(PARCELA.DTINICOMPET) = TRUNC(V_DTINICOMPET_ATUAL)
                                           AND TRUNC(PARCELA.DTFINCOMPET) = TRUNC(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   = ROUND(VRVENCIMENTO + V_VRTOTITEMCOMDESC, 2),
                                           VRFALTAFATURAR = ROUND(VRVENCIMENTO + V_VRTOTITEMCOMDESC, 2)
                                    WHERE NRFATURACONT = V_NRFATURACONT
                                      AND NRORG        = P_NRORG;
                                ELSE
                                    V_NRPARCFATURA := C_NEGOCIACAO.NRPARCFATURA;
                                    IF (C_NEGOCIACAO.IDAGRUPPARC = '2' AND C_NEGOCIACAO.IDLOCALTOMADORNF = 'S') THEN
                                        V_NRPARCFATURA := C_NEGOCIACAO.NRPARCESTRUTURA;
                                    END IF;

                                    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,
                                        VRNEGCONTR,
                                        NRPARCELASNEGCONTR,
                                        NRESTRUTURAM,
                                        CDTRIBPRODPADR,
                                        CDPAISFAT,
                                        SGESTADOFAT,
                                        CDMUNICIPIOFAT,
                                        IDNATUOPER
                                    )
                                    VALUES (
                                        V_NRFATURACONT,
                                        NULL,
                                        C_NEGOCIACAO.CDFILIALFATURA,
                                        V_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,
                                        ROUND(V_VRTOTITEMCOMDESC, 2),
                                        0,
                                        ROUND(V_VRTOTITEMCOMDESC, 2),
                                        NULL,
                                        NULL,
                                        NULL,
                                        NULL,
                                        'N',
                                        'S',
                                        P_NRORG,
                                        SYSDATE,
                                        P_NRORG,
                                        P_CDOPERADOR,
                                        NULL,
                                        V_NRPARCELASNEGCONTR,
                                        C_NEGOCIACAO.NRESTRUTURAM,
                                        C_NEGOCIACAO.CDTRIBPRODPADR,
                                        C_NEGOCIACAO.CDPAISFAT,
                                        C_NEGOCIACAO.SGESTADOFAT,
                                        C_NEGOCIACAO.CDMUNICIPIOFAT,
                                        C_NEGOCIACAO.IDNATUOPER
                                    );
                                END IF; --V_NRFATURACONT IS NOT NULL
                                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;
                                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
                                    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;
                                    IF (V_VRDESCITEM > 0) THEN
                                        V_VRPERCDESCITEM := (V_VRDESCITEM / C_NEGOCIACAO.VRTOTITEMCOMDESC) * 100;
                                        V_VRVENCIMENTOITEM := V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * V_VRPERCDESCITEM / 100);
                                    END IF;
                                    V_VRVENCIMENTOITEM := ROUND(V_VRVENCIMENTOITEM, 2);
                                    V_VRNEGOCIADOIT := NULL;
                                    V_VRSOMAELEMENTOS := NULL;
                                    -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE ELEMENTO - INICIO
                                    FOR C_ITNEGOCIACAOEL 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 = C_ITNEGOCIACAO.NRITEMOCONTRATO 
                                    ) LOOP
                                        IF (V_VRSOMAELEMENTOS IS NULL) THEN
                                            V_VRSOMAELEMENTOS := 0;
                                        END IF;
                                            
                                        BEGIN
                                            SELECT PARC.NRPARCELASNEGCONTR,
                                                   PARC.VRPARCELANEGOCIA,
                                                   NEG.IDTIPONEGOCIA
                                              INTO V_NRPARCELASNEGCONTR_IT,
                                                   V_VRPARCELANEGOCIA_EL,
                                                   V_IDTIPONEGOCIA_IT
                                              FROM FCT_PARCELASNEGCONTR PARC
                                             INNER JOIN FCT_NEGCONTRATO NEG
                                                ON PARC.NRNEGCONTRATO = NEG.NRNEGCONTRATO
                                             WHERE ( TRUNC(V_DTINICOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA)
                                                    OR TRUNC(V_DTFINCOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA) )
                                               AND NEG.NRPARCNEGOCIO   = C_NEGOCIACAO.NRPARCFATURA
                                               AND NEG.NRSEQCONTRATO   = C_NEGOCIACAO.NRSEQCONTRATO
                                               AND NEG.NRITEMOCONTRATO = C_ITNEGOCIACAO.NRITEMOCONTRATO
                                               AND NEG.NRITEMELEMENTO  = C_ITNEGOCIACAOEL.NRITEMOCONTRATO
                                               AND NEG.NRORG           = P_NRORG
                                               AND NEG.IDATIVO         = 'S'
                                               AND PARC.IDATIVO        = 'S';
                                        EXCEPTION WHEN NO_DATA_FOUND THEN
                                            V_NRPARCELASNEGCONTR_IT := NULL;
                                            V_VRPARCELANEGOCIA_IT := NULL;
                                            V_IDTIPONEGOCIA_IT := NULL;
                                        END;
                                        IF (V_NRPARCELASNEGCONTR_IT IS NOT NULL) THEN
                                            IF (V_IDTIPONEGOCIA_IT = 'VF') THEN
                                                V_VRNEGOCIADOEL := V_VRPARCELANEGOCIA_EL;
                                            ELSIF (V_IDTIPONEGOCIA_IT = 'DP') THEN
                                                V_VRNEGOCIADOEL := C_ITNEGOCIACAOEL.VRTOTITEM - (C_ITNEGOCIACAOEL.VRTOTITEM * V_VRPARCELANEGOCIA_EL / 100);
                                            ELSIF (V_IDTIPONEGOCIA_IT = 'DV') THEN
                                                V_VRNEGOCIADOEL := C_ITNEGOCIACAOEL.VRTOTITEM - V_VRPARCELANEGOCIA_EL;
                                            ELSIF (V_IDTIPONEGOCIA_IT = 'AP') THEN
                                                V_VRNEGOCIADOEL := C_ITNEGOCIACAOEL.VRTOTITEM + (C_ITNEGOCIACAOEL.VRTOTITEM * V_VRPARCELANEGOCIA_EL / 100);
                                            ELSIF (V_IDTIPONEGOCIA_IT = 'AV') THEN
                                                V_VRNEGOCIADOEL := C_ITNEGOCIACAOEL.VRTOTITEM + V_VRPARCELANEGOCIA_EL;
                                            END IF;
                                            V_VRNEGOCIADOEL := ROUND(V_VRNEGOCIADOEL, 2);
                                            IF (V_VRNEGOCIADOEL < 0) THEN
                                                V_VRNEGOCIADOEL := 0;
                                            END IF;
                                            V_VRSOMAELEMENTOS := V_VRSOMAELEMENTOS + V_VRNEGOCIADOEL;
                                        ELSE
                                            V_VRSOMAELEMENTOS := V_VRSOMAELEMENTOS + C_ITNEGOCIACAOEL.VRTOTITEMCOMDESC;
                                        END IF;
                                        
                                    END LOOP;  -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE ELEMENTO - FIM

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

                                    IF(V_VRSOMAELEMENTOS = V_VRVENCIMENTOITEM) THEN
                                        V_VRSOMAELEMENTOS := NULL;
                                    END IF;
                                    V_VRNEGOCIADOIT := V_VRSOMAELEMENTOS;
                                    -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE ITEM (SERVICO) - INICIO
                                    BEGIN
                                        SELECT PARC.NRPARCELASNEGCONTR,
                                               PARC.VRPARCELANEGOCIA,
                                               NEG.IDTIPONEGOCIA
                                          INTO V_NRPARCELASNEGCONTR_IT,
                                               V_VRPARCELANEGOCIA_IT,
                                               V_IDTIPONEGOCIA_IT
                                          FROM FCT_PARCELASNEGCONTR PARC
                                         INNER JOIN FCT_NEGCONTRATO NEG
                                            ON PARC.NRNEGCONTRATO = NEG.NRNEGCONTRATO
                                         WHERE ( TRUNC(V_DTINICOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA)
                                                OR TRUNC(V_DTFINCOMPET_ATUAL) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA) )
                                           AND NEG.NRPARCNEGOCIO   = C_NEGOCIACAO.NRPARCFATURA
                                           AND NEG.NRSEQCONTRATO   = C_NEGOCIACAO.NRSEQCONTRATO
                                           AND NEG.NRITEMOCONTRATO = C_ITNEGOCIACAO.NRITEMOCONTRATO
                                           AND NEG.NRITEMELEMENTO  IS NULL
                                           AND NEG.NRORG           = P_NRORG
                                           AND NEG.IDATIVO         = 'S'
                                           AND PARC.IDATIVO        = 'S';
                                    EXCEPTION WHEN NO_DATA_FOUND THEN
                                        V_NRPARCELASNEGCONTR_IT := NULL;
                                        V_VRPARCELANEGOCIA_IT := NULL;
                                        V_IDTIPONEGOCIA_IT := NULL;
                                    END;
                                    IF (V_NRPARCELASNEGCONTR_IT IS NOT NULL) THEN
                                        
                                        IF (V_VRNEGOCIADOIT IS NULL) THEN
                                            V_VRNEGOCIADOIT := 0;
                                        END IF;

                                        IF (V_IDTIPONEGOCIA_IT = 'VF') THEN
                                            V_VRNEGOCIADOIT := V_VRPARCELANEGOCIA_IT + V_VRNEGOCIADOIT;
                                        ELSIF (V_IDTIPONEGOCIA_IT = 'DP') THEN
                                            V_VRNEGOCIADOIT := (V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * V_VRPARCELANEGOCIA_IT / 100)) + V_VRNEGOCIADOIT;
                                        ELSIF (V_IDTIPONEGOCIA_IT = 'DV') THEN
                                            V_VRNEGOCIADOIT := V_VRVENCIMENTOITEM - V_VRPARCELANEGOCIA_IT + V_VRNEGOCIADOIT;
                                        ELSIF (V_IDTIPONEGOCIA_IT = 'AP') THEN
                                            V_VRNEGOCIADOIT := (V_VRVENCIMENTOITEM + (V_VRVENCIMENTOITEM * V_VRPARCELANEGOCIA_IT / 100)) + V_VRNEGOCIADOIT;
                                        ELSIF (V_IDTIPONEGOCIA_IT = 'AV') THEN
                                            V_VRNEGOCIADOIT := V_VRVENCIMENTOITEM + V_VRPARCELANEGOCIA_IT + V_VRNEGOCIADOIT;
                                        END IF;
                                        V_VRNEGOCIADOIT := ROUND(V_VRNEGOCIADOIT, 2);
                                        IF (V_VRNEGOCIADOIT < 0) THEN
                                            V_VRNEGOCIADOIT := 0;
                                        END IF;
                                    END IF;
                                    -- VERIFICA SE EXISTE UMA NEGOCIACAO DE CONTRATO PARA ESTE CLIENTE COM ESTE ITEM (SERVICO) - FIM
                                    IF(V_PERIODOINCOMP = 'S' OR V_QTDIASPERIODINC <> 0) THEN
                                        V_VRVENCIMENTOITEM := (V_VRVENCIMENTOITEM / V_QTDIASCOMPET) * (V_QTDIASCOMPETATUAL + V_QTDIASPERIODINC);
                                        V_VRVENCIMENTOITEM := ROUND(V_VRVENCIMENTOITEM, 2);
                                    END IF;
                                    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,
                                        VRNEGCONTR,
                                        NRPARCELASNEGCONTR
                                    )
                                    VALUES (
                                        V_NRITFATURACONT,
                                        V_NRFATURACONT,
                                        P_NRSEQCONTRATO,
                                        C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                        C_ITNEGOCIACAO.CDPRODFATURA,
                                        V_IDSITUACAO,
                                        V_VRVENCIMENTOITEM,
                                        0,
                                        NVL(V_VRNEGOCIADOIT, V_VRVENCIMENTOITEM),
                                        NULL,
                                        NULL,
                                        NULL,
                                        'S',
                                        P_NRORG,
                                        SYSDATE,
                                        P_NRORG,
                                        P_CDOPERADOR,
                                        V_VRNEGOCIADOIT,
                                        V_NRPARCELASNEGCONTR_IT
                                    );
                                END LOOP; --C_ITNEGOCIACAO
                            SELECT VRVENCIMENTO
                              INTO V_VRVENCIMENTO
                              FROM FCT_FATURACONT
                             WHERE NRFATURACONT = V_NRFATURACONT
                               AND NRORG        = P_NRORG;
                            -- Se existe uma negociacao para este cliente com este grupo de faturamento (select feito mais acima), os valores sao calculados e aplicados - INICIO
                            IF (V_NRPARCELASNEGCONTR IS NOT NULL) THEN
                                IF (V_IDTIPONEGOCIA = 'VF') THEN
                                    V_VRNEGOCIADO := V_VRPARCELANEGOCIA;
                                ELSIF (V_IDTIPONEGOCIA = 'DP') THEN
                                    V_VRNEGOCIADO := V_VRVENCIMENTO - (V_VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);
                                ELSIF (V_IDTIPONEGOCIA = 'DV') THEN
                                    V_VRNEGOCIADO := V_VRVENCIMENTO - V_VRPARCELANEGOCIA;
                                ELSIF (V_IDTIPONEGOCIA = 'AP') THEN
                                    V_VRNEGOCIADO := V_VRVENCIMENTO + (V_VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);
                                ELSIF (V_IDTIPONEGOCIA = 'AV') THEN
                                    V_VRNEGOCIADO := V_VRVENCIMENTO + V_VRPARCELANEGOCIA;
                                END IF;
                                V_VRNEGOCIADO := ROUND(V_VRNEGOCIADO, 2);
                                IF (V_VRNEGOCIADO < 0) THEN
                                    V_VRNEGOCIADO := 0;
                                END IF;
                                UPDATE FCT_FATURACONT
                                   SET VRNEGCONTR     = V_VRNEGOCIADO,
                                       VRFALTAFATURAR = V_VRNEGOCIADO
                                  WHERE NRFATURACONT = V_NRFATURACONT
                                    AND NRORG        = P_NRORG;
                                FOR C_ITENS IN (
                                    SELECT NRITFATURACONT,
                                           VRVENCIMENTO,
                                           VRNEGCONTR,
                                           VRFALTAFATURAR,
                                           VRFATURADO
                                      FROM FCT_ITFATURACONT
                                     WHERE NRFATURACONT = V_NRFATURACONT
                                       AND NRORG        = P_NRORG
                                ) LOOP
                                    IF (V_VRNEGOCIADO = 0 OR V_VRVENCIMENTO = 0) THEN
                                        V_VRNEGOCIADOIT := 0;
                                    ELSIF (V_IDTIPONEGOCIA = 'VF') THEN
                                        V_VRNEGOCIADOIT := V_VRNEGOCIADO / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO;
                                    ELSIF (V_IDTIPONEGOCIA = 'DP') THEN
                                        V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO - (C_ITENS.VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);
                                    ELSIF (V_IDTIPONEGOCIA = 'DV') THEN
                                        V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO - (V_VRPARCELANEGOCIA / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO);
                                    ELSIF (V_IDTIPONEGOCIA = 'AP') THEN
                                        V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO + (C_ITENS.VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);
                                    ELSIF (V_IDTIPONEGOCIA = 'AV') THEN
                                        V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO + (V_VRPARCELANEGOCIA / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO);
                                    END IF;
                                    V_VRNEGOCIADOIT := ROUND(V_VRNEGOCIADOIT, 2);
                                    UPDATE FCT_ITFATURACONT
                                       SET VRNEGCONTR     = V_VRNEGOCIADOIT,
                                           VRFALTAFATURAR = V_VRNEGOCIADOIT
                                     WHERE NRITFATURACONT = C_ITENS.NRITFATURACONT
                                       AND NRORG          = P_NRORG;
                                END LOOP;
                            END IF;
                            SELECT SUM(NVL(VRNEGCONTR, VRVENCIMENTO)) AS SOMAVRCONSIDERADO,
                                   SUM(VRNEGCONTR) AS SOMAVRNEGCONTR
                              INTO V_SOMA_VRCONSIDERADOIT,
                                   V_SOMA_VRNEGOCIADOIT
                              FROM FCT_ITFATURACONT
                             WHERE NRFATURACONT = V_NRFATURACONT
                               AND NRORG        = P_NRORG;
                            IF (V_SOMA_VRNEGOCIADOIT IS NOT NULL) THEN
                                V_SOMA_VRNEGOCIADOIT := V_SOMA_VRCONSIDERADOIT;
                            END IF;
                            UPDATE FCT_FATURACONT
                               SET VRNEGCONTR     = V_SOMA_VRNEGOCIADOIT,
                                   VRFALTAFATURAR = V_SOMA_VRCONSIDERADOIT
                             WHERE NRFATURACONT = V_NRFATURACONT
                               AND NRORG        = P_NRORG;
                            -- Se existe uma negociacao para este cliente com este grupo de faturamento (select feito mais acima), os valores sao calculados e aplicados - FIM
                            END IF; --V_EXISTE_PARCELA = 0
                        END IF; --V_VRTOTITEMCOMDESC > 0
                    ELSE --C_NEGOCIACAO.IDTPFATURA = X
                        IF (V_VRPERCDESCPERIODO < 100) THEN
                            SELECT COUNT(*)
                              INTO V_EXISTE_PARCELA
                              FROM FCT_MEDICAOFATURA
                             WHERE NRSEQCONTRATO      = P_NRSEQCONTRATO
                               AND IDSITUACAO         <> '1'
                               AND TRUNC(DTINICOMPET) = TRUNC(V_DTINICOMPET_ATUAL)
                               AND TRUNC(DTFINCOMPET) = TRUNC(V_DTFINCOMPET_ATUAL);
                            
                            IF (V_EXISTE_PARCELA = 0) THEN
                                V_NRPARCFATURA := C_NEGOCIACAO.NRPARCFATURA;
                                IF (C_NEGOCIACAO.IDAGRUPPARC = '2' AND C_NEGOCIACAO.IDLOCALTOMADORNF = 'S') THEN
                                    V_NRPARCFATURA := C_NEGOCIACAO.NRPARCESTRUTURA;
                                END IF;

                                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,
                                    NRESTRUTURAM,
                                    CDTRIBPRODPADR,
                                    CDPAISFAT,
                                    SGESTADOFAT,
                                    CDMUNICIPIOFAT,
                                    IDNATUOPER
                                )
                                VALUES (
                                    V_NRMEDICAOFATURA,
                                    P_NRSEQCONTRATO,
                                    C_NEGOCIACAO.CDFILIALFATURA,
                                    V_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,
                                    C_NEGOCIACAO.NRESTRUTURAM,
                                    C_NEGOCIACAO.CDTRIBPRODPADR,
                                    C_NEGOCIACAO.CDPAISFAT,
                                    C_NEGOCIACAO.SGESTADOFAT,
                                    C_NEGOCIACAO.CDMUNICIPIOFAT,
                                    C_NEGOCIACAO.IDNATUOPER
                                );
                                FOR C_ITNEGOCIACAO IN (
                                    SELECT ITNEG.NRITEMOCONTRATO,
                                           ITNEG.VRPERCDESCITEM,
                                           ITNEG.VRDESCITEM,
                                           ITNEG.VRTOTITEMCOMDESC,
                                           ITNEG.CDPRODFATURA,
                                           ITNEG.CDSERVORCA,
                                           ITNEGPROP.NRITEMORCAMENTO,
                                           NVL((SELECT SUM(VRTOTITEM)
                                              FROM FCT_ITNEGOCIACAOCONTRATO
                                              WHERE (NRITEMCONTRATOPAI  = ITNEG.NRITEMOCONTRATO
                                                  OR NRITEMORCAMENTOPAI = ITNEG.NRITEMORCAMENTO)), ITNEG.VRTOTITEM) AS VRTOTITEM,
                                           ITCONT.NRESTRUTURAM
                                      FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                      LEFT JOIN FCT_ITNEGOCIACAOPROPOSTA ITNEGPROP
                                        ON ITNEG.NRITNEGOCIACAOPROPOSTA = ITNEGPROP.NRITNEGOCIACAOPROPOSTA
                                       AND ITNEG.NRORG                  = ITNEGPROP.NRORG
                                     INNER JOIN FCT_ITEMCONTRATO ITCONT
                                        ON ITNEG.NRITEMOCONTRATO = ITCONT.NRITEMOCONTRATO
                                       AND ITNEG.NRORG           = ITCONT.NRORG
                                     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;

                                    IF (V_VRDESCITEM > 0) THEN
                                        V_VRPERCDESCITEM := (V_VRDESCITEM / C_NEGOCIACAO.VRTOTITEMCOMDESC) * 100;
                                        V_VRVENCIMENTOITEM := V_VRVENCIMENTOITEM - (V_VRVENCIMENTOITEM * V_VRPERCDESCITEM / 100);
                                    END IF;

                                    SELECT COUNT(*)
                                      INTO V_QTMEDSERVICO
                                      FROM FCT_RELACMEDIDACONTRATO
                                     WHERE NRSEQCONTRATO  = P_NRSEQCONTRATO
                                       AND NRORG          = P_NRORG
                                       AND CDSERVORCA     = C_ITNEGOCIACAO.CDSERVORCA
                                       AND IDELEMENTORAIZ IS NULL;

                                    IF (V_QTMEDSERVICO = 0) THEN
                                        V_VRTOTITEMCONT := ROUND(C_ITNEGOCIACAO.VRTOTITEM, 2);
                                        V_VRITEMCONT := ROUND(V_VRVENCIMENTOITEM, 2);
                                    ELSE
                                        V_VRTOTITEMCONT := 0;
                                        V_VRITEMCONT := 0;
                                    END IF;

                                    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,
                                        NRESTRUTURAM
                                    )
                                    VALUES (
                                        V_NRITMEDICAOFATURA,
                                        V_NRMEDICAOFATURA,
                                        P_NRSEQCONTRATO,
                                        C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                        C_ITNEGOCIACAO.CDSERVORCA,
                                        C_ITNEGOCIACAO.CDPRODFATURA,
                                        V_IDSITUACAO,
                                        V_VRTOTITEMCONT,
                                        'S',
                                        P_NRORG,
                                        SYSDATE,
                                        P_NRORG,
                                        P_CDOPERADOR,
                                        NULL,
                                        NULL,
                                        NULL,
                                        V_VRITEMCONT,
                                        C_ITNEGOCIACAO.NRESTRUTURAM
                                    );

                                    FOR C_MEDIDASIT IN (
                                        SELECT DISTINCT ITVAR.IDELEMENTORAIZ,
                                               ITVAR.CDTPMEDIDAVARIAVEL,
                                               DECODE(ITVAR.IDPREVCOBRFUT, 'S', 0, ITVAR.QTMEDIDAVARIAVEL) AS QTMEDIDAVARIAVEL,
                                               DECODE(ITVAR.IDPREVCOBRFUT, 'S', 0, NVL(ITVAR.QTFRANQUIA, 0)) AS QTFRANQUIA,
                                               ITVAR.IDMULTIPVARIACAO
                                          FROM (
                                                SELECT REL.CDTPMEDIDAVARIAVEL,
                                                       REL.QTMEDIDAVARIAVEL,
                                                       REL.QTFRANQUIA,
                                                       ITCONT.NRORG,
                                                       ITCONT.NRSEQCONTRATO,
                                                       REL.IDELEMENTORAIZ,
                                                       VAR.IDMULTIPVARIACAO,
                                                       NEG.IDPREVCOBRFUT
                                                  FROM FCT_RELACMEDIDACONTRATO REL
                                                 INNER JOIN FCT_ITEMCONTRATO ITCONT
                                                    ON REL.NRSEQCONTRATO      = ITCONT.NRSEQCONTRATO
                                                   AND REL.CDTPMEDIDAVARIAVEL = ITCONT.CDTPMEDIDAVARIAVEL
                                                   AND REL.NRORG              = ITCONT.NRORG
                                                   AND REL.IDELEMENTORAIZ     = ITCONT.IDELEMENTO
                                                 INNER JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                                                    ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                                                 INNER JOIN FCT_NEGOCIACAOCONTRATO NEG
                                                    ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                                                 INNER JOIN FCT_VARPRECBASESERVCONT VAR
                                                    ON ITCONT.NRSEQCONTRATO      = VAR.NRSEQCONTRATO
                                                   AND ITCONT.CDSERVORCA         = VAR.CDSERVORCA
                                                   AND ITCONT.CDTPMEDIDASERV     = VAR.CDTPMEDIDASERV
                                                   AND ITCONT.CDTPMEDIDAVARIAVEL = VAR.CDTPMEDIDAVARIAVEL
                                                   AND DECODE(REL.QTMEDIDAVARIAVEL, 0, 1, REL.QTMEDIDAVARIAVEL) BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                                 WHERE ITCONT.NRITEMCONTRATOPAI = C_ITNEGOCIACAO.NRITEMOCONTRATO
                                                   AND ITCONT.NRORG             = P_NRORG
                                                 UNION ALL
                                                 SELECT REL.CDTPMEDIDAVARIAVEL,
                                                       REL.QTMEDIDAVARIAVEL,
                                                       REL.QTFRANQUIA,
                                                       ITCONT.NRORG,
                                                       ITCONT.NRSEQCONTRATO,
                                                       REL.IDELEMENTORAIZ,
                                                       'N' AS IDMULTIPVARIACAO,
                                                       NEG.IDPREVCOBRFUT
                                                  FROM FCT_RELACMEDIDACONTRATO REL
                                                 INNER JOIN FCT_ITEMCONTRATO ITCONT
                                                    ON REL.NRSEQCONTRATO      = ITCONT.NRSEQCONTRATO
                                                   AND REL.CDTPMEDIDAVARIAVEL = ITCONT.CDTPMEDIDAVARIAVEL
                                                   AND REL.NRORG              = ITCONT.NRORG
                                                   AND REL.IDELEMENTORAIZ     = ITCONT.IDELEMENTO
                                                 INNER JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                                                    ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                                                 INNER JOIN FCT_NEGOCIACAOCONTRATO NEG
                                                    ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                                                 INNER JOIN FCT_VARPRECBASESERVCONT VAR
                                                    ON ITCONT.NRSEQCONTRATO      = VAR.NRSEQCONTRATO
                                                   AND ITCONT.CDSERVORCA         = VAR.CDSERVORCA
                                                   AND ITCONT.CDTPMEDIDASERV     = VAR.CDTPMEDIDASERV
                                                   AND VAR.CDTPMEDIDAVARIAVEL    IS NULL
                                                 WHERE ITCONT.NRITEMCONTRATOPAI = C_ITNEGOCIACAO.NRITEMOCONTRATO
                                                   AND ITCONT.NRORG             = P_NRORG
                                                   AND (SELECT COUNT(*)
                                                          FROM FCT_VARPRECBASESERVCONT
                                                         WHERE NRSEQCONTRATO      = ITCONT.NRSEQCONTRATO
                                                           AND CDSERVORCA         = ITCONT.CDSERVORCA
                                                           AND CDTPMEDIDASERV     = ITCONT.CDTPMEDIDASERV
                                                           AND CDTPMEDIDAVARIAVEL = ITCONT.CDTPMEDIDAVARIAVEL) = 0
                                                 ORDER BY IDELEMENTORAIZ, CDTPMEDIDAVARIAVEL
                                           ) ITVAR
                                    ) 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,
                                            QTMEDIDAVENDIDA
                                        )
                                        VALUES (
                                            V_NRMEDVARMEDICAOFATURA,
                                            V_NRMEDICAOFATURA,
                                            C_MEDIDASIT.IDELEMENTORAIZ,
                                            C_ITNEGOCIACAO.CDSERVORCA,
                                            C_MEDIDASIT.CDTPMEDIDAVARIAVEL,
                                            0,
                                            ROUND(C_MEDIDASIT.QTMEDIDAVARIAVEL - C_MEDIDASIT.QTFRANQUIA, 2),
                                            C_MEDIDASIT.QTFRANQUIA,
                                            C_MEDIDASIT.IDMULTIPVARIACAO,
                                            'S',
                                            P_NRORG,
                                            SYSDATE,
                                            P_NRORG,
                                            P_CDOPERADOR,
                                            ROUND(C_MEDIDASIT.QTMEDIDAVARIAVEL, 2)
                                        );

                                    END LOOP;  -- C_MEDIDASIT

                                    FOR C_MEDIDAITSERVICO IN (
                                        SELECT DISTINCT REL.CDTPMEDIDAVARIAVEL,
                                               REL.QTMEDIDAVARIAVEL,
                                               NVL(REL.QTFRANQUIA, 0) AS QTFRANQUIA,
                                               ITCONT.NRORG,
                                               ITCONT.NRSEQCONTRATO,
                                               REL.IDELEMENTORAIZ,
                                               'S' AS IDMULTIPVARIACAO,
                                               REL.NRESTRUTURAM
                                          FROM FCT_RELACMEDIDACONTRATO REL
                                         INNER JOIN FCT_ITEMCONTRATO ITCONT
                                            ON REL.NRSEQCONTRATO      = ITCONT.NRSEQCONTRATO
                                           AND REL.CDTPMEDIDAVARIAVEL = ITCONT.CDTPMEDIDAVARIAVEL
                                           AND REL.NRORG              = ITCONT.NRORG
                                           AND REL.CDSERVORCA         = ITCONT.CDSERVORCA
                                           AND NVL(REL.NRESTRUTURAM, -1) = NVL(ITCONT.NRESTRUTURAM, -1)
                                         INNER JOIN FCT_VARPRECBASESERVCONT VAR
                                            ON ITCONT.NRSEQCONTRATO      = VAR.NRSEQCONTRATO
                                           AND ITCONT.CDSERVORCA         = VAR.CDSERVORCA
                                           AND (ITCONT.CDTPMEDIDASERV = VAR.CDTPMEDIDAVARIAVEL OR VAR.CDTPMEDIDAVARIAVEL IS NULL)
                                           AND DECODE(REL.QTMEDIDAVARIAVEL, 0, 1, REL.QTMEDIDAVARIAVEL) BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                         WHERE ITCONT.NRITEMOCONTRATO = C_ITNEGOCIACAO.NRITEMOCONTRATO
                                           AND ITCONT.NRORG           = P_NRORG
                                           AND REL.IDELEMENTORAIZ IS NULL
                                    ) LOOP
                                        
                                        NOVO_CODIGO_SC('FCT_MEDVARMEDICAOFATURA', V_NRMEDVARMEDICAOFATURA, 1, P_NRORG);
                                        INSERT INTO FCT_MEDVARMEDICAOFATURA (
                                            NRMEDVARMEDICAOFATURA, NRMEDICAOFATURA,    IDELEMENTORAIZ,
                                            CDSERVORCA,            CDTPMEDIDAVARIAVEL, QTMEDIDAMEDICAO,
                                            QTMEDIDAVARIAVEL,      QTFRANQUIA,         IDMULTIPVARIACAO,
                                            IDATIVO,               NRORG,              DTINCLUSAO,
                                            NRORGINCLUSAO,         CDOPERINCLUSAO,     QTMEDIDAVENDIDA,
                                            NRESTRUTURAM
                                        )
                                        VALUES (
                                            V_NRMEDVARMEDICAOFATURA,       V_NRMEDICAOFATURA,                    C_MEDIDAITSERVICO.IDELEMENTORAIZ,
                                            C_ITNEGOCIACAO.CDSERVORCA,     C_MEDIDAITSERVICO.CDTPMEDIDAVARIAVEL, 0,
                                            0,                             C_MEDIDAITSERVICO.QTFRANQUIA,         C_MEDIDAITSERVICO.IDMULTIPVARIACAO, 
                                            'S',                           P_NRORG,                              SYSDATE,                        
                                            P_NRORG,                       P_CDOPERADOR,                         ROUND(C_MEDIDAITSERVICO.QTMEDIDAVARIAVEL, 2),
                                            C_MEDIDAITSERVICO.NRESTRUTURAM
                                        );

                                    END LOOP; -- C_MEDIDAITSERVICO
                                END LOOP; -- C_ITNEGOCIACAO

                            END IF; --V_EXISTE_PARCELA = 0
                        END IF; --V_VRPERCDESCPERIODO < 100
                    END IF; --C_NEGOCIACAO.IDTPFATURA = A

                    V_VRVENCIMENTOINC := 0;
                    V_QTDIASPERIODINC := 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

        -- BUSCA O PARAMETRO DE VALIDACAO DO RATEIO
        BEGIN
            SELECT IDGERARATEIO
              INTO V_IDGERARATEIO
              FROM FCT_CAPAPARAMFATESC ESCOPO
             WHERE ESCOPO.NRTIPOORCAMENTO = C_NEGOCIACAO.NRTIPOORCAMENTO
               AND ESCOPO.NRORG           = P_NRORG;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            V_IDGERARATEIO := 'N';
        END;
        /** GERAR RATEIO ITENS **/
        IF (C_NEGOCIACAO.IDTPFATURA <> 'P' AND V_IDGERARATEIO = 'S') THEN
          BEGIN
              SELECT COUNT(NRESTRUTURAM)
              INTO V_COUNTITENSRATEIO
              FROM (SELECT DISTINCT  NRESTRUTURAM
                      FROM FCT_RELACESTRUTURACONT ESTCONT
                     WHERE ESTCONT.NRSEQCONTRATO = C_NEGOCIACAO.NRSEQCONTRATO
                       AND ESTCONT.NRORG         = P_NRORG
                       AND ESTCONT.NRESTRUTURAM IS NOT NULL
                       AND ESTCONT.IDRELACESTRUTURA = 'RATEIO'
                       AND (SELECT COUNT(*)
                              FROM FCT_ITEMCONTRATO ITEM
                              LEFT JOIN FCT_RELACESTRUTURACONT EST
                                ON ITEM.NRITEMOCONTRATO = EST.NRITEMOCONTRATO
                               AND ITEM.NRORG           = EST.NRORG
                             WHERE ITEM.NRSEQCONTRATO = C_NEGOCIACAO.NRSEQCONTRATO
                               AND ITEM.NRORG         = P_NRORG
                               AND EST.NRESTRUTURAM IS NULL) = 0);
          END;
          IF (V_COUNTITENSRATEIO > 1) THEN
              FOR C_ITENSRATEIO IN (
                  SELECT ESTCONT.NRESTRUTURAM,
                         LOCALM.CDCENTCUST,
                         ESTCONT.NRITEMOCONTRATO,
                         ITFATURA.VRVENCIMENTO,
                         ITFATURA.NRFATURACONT,
                         ITFATURA.NRITFATURACONT,
                         ESTCONT.VRPERCRATEIO,
                         ITFATURA.IDSITUACAO
                    FROM FCT_ITFATURACONT ITFATURA
                    JOIN FCT_RELACESTRUTURACONT ESTCONT
                      ON ITFATURA.NRITEMOCONTRATO = ESTCONT.NRITEMOCONTRATO
                     AND ITFATURA.NRORG           = ESTCONT.NRORG
                     AND ESTCONT.IDRELACESTRUTURA = 'RATEIO'
                    LEFT JOIN ESTRUTURAM LOCALM
                      ON ESTCONT.NRESTRUTURAM = LOCALM.NRESTRUTURAM
                     AND ESTCONT.NRORG        = LOCALM.NRORG
                   WHERE ITFATURA.NRSEQCONTRATO = C_NEGOCIACAO.NRSEQCONTRATO
                     AND ITFATURA.NRORG         = P_NRORG
              ) LOOP
                  NOVO_CODIGO_NT('FCT_RATEIOITFATURACONT', V_NRRATEIOITEMFAT, 1);
                  INSERT INTO FCT_RATEIOITFATURACONT (
                      NRRATEIOITEMFAT, NRITFATURACONT,  NRFATURACONT,
                      NRSEQCONTRATO,   NRITEMOCONTRATO, NRESTRUTURAM,
                      CDCENTCUST,      VRPERCENTRATEIO, VRRATEADO,
                      NRORG,           IDATIVO,         DTINCLUSAO,
                      DTULTATU,        NRORGINCLUSAO,   CDOPERINCLUSAO,
                      NRORGULTATU,     CDOPERULTATU,    IDSITUVENCRATEIO,
                      NRAPURACAO
                  )
                  VALUES (
                      V_NRRATEIOITEMFAT,          C_ITENSRATEIO.NRITFATURACONT,         C_ITENSRATEIO.NRFATURACONT,
                      C_NEGOCIACAO.NRSEQCONTRATO, C_ITENSRATEIO.NRITEMOCONTRATO,        C_ITENSRATEIO.NRESTRUTURAM,
                      C_ITENSRATEIO.CDCENTCUST,   ROUND(C_ITENSRATEIO.VRPERCRATEIO, 2), ROUND(C_ITENSRATEIO.VRVENCIMENTO * (C_ITENSRATEIO.VRPERCRATEIO/100), 2),
                      P_NRORG,                    'S',                                  SYSDATE,
                      NULL,                       P_NRORG,                              P_CDOPERADOR,
                      NULL,                       NULL,                                 C_ITENSRATEIO.IDSITUACAO,
                      NULL
                  );
              END LOOP; --C_ITENSRATEIO
          END IF; --V_COUNTITENSRATEIO > 1
        END IF; --C_NEGOCIACAO.IDTPFATURA <> P AND V_IDGERARATEIO = S
    END LOOP; --C_NEGOCIACAO
END;
/