CREATE OR REPLACE PROCEDURE FCT_GERAR_PARCELAS_FATURA (
    P_NRSEQCONTRATO IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG         IN NUMBER,
    P_CDOPERADOR    IN VARCHAR2
)
AS
    V_QTDIASFATURAMENTO_ANT NUMBER;
    V_DTINICOMPET_ATUAL     DATE;
    V_DTFINCOMPET_ATUAL     DATE;
    V_NRDIASVENCIMENTO      NUMBER;
    V_QTDIASFATUVENC        NUMBER;
    V_DTVENCIMENTO          DATE;
    V_VRDIFERENCA           FLOAT;
    V_VRVENCIMENTOITEM      FLOAT;
    V_SOMA_VRVENCIMENTOITEM FLOAT;
    V_COUNT_ITEM            NUMBER;
    V_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_VRTOTITEMCOMDESC      FLOAT;
    V_VRDESCITEM            FLOAT;
    V_VRPERCDESCITEM        FLOAT;
    V_IDSITUACAO            CHAR(1);
    V_VALIDAMEDIDACONT      NUMBER;

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

    V_ULTDIAMES             FCT_COMPETENCIANEGOCONT.NRDIACOMPETINI%TYPE;
    V_NRAGRUPAMENTO         FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_IDPARCAGRUP           FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;

    V_EXISTE_PARCELA  INTEGER;

    -- Manda deletar as parcelas e mediAAues no caso de regeraAAo do faturamento
    -- RATEIO
    V_NRRATEIOITEMFAT   FCT_RATEIOITFATURACONT.NRRATEIOITEMFAT%TYPE;
    V_COUNTITENSRATEIO  NUMBER;
    V_IDGERARATEIO      VARCHAR2(1);
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;

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

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

            IF (C_NEGOCIACAO.VRTOTITEMCOMDESC > 0) THEN

                V_QTDIASFATURAMENTO_ANT := -1;

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

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

                    SELECT 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       IN ('3', '4')
                           AND FAT.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                           AND FAT.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                           AND FAT.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                           AND FAT.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                           AND FAT.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                           AND FAT.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                           AND FAT.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                           AND FAT.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                           AND TO_CHAR(FAT.DTINICOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'DD/MM/YYYY')
                           AND TO_CHAR(FAT.DTFINCOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTFINCOMPET_ATUAL, 'DD/MM/YYYY');

                    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;
                            V_DTVENCIMENTO := TO_DATE(LPAD(C_PARCELAS.NRDIAVENCIMENTO, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');
                            IF (V_DTVENCIMENTO < V_DTFINCOMPET_ATUAL) THEN
                                V_DTVENCIMENTO := ADD_MONTHS(V_DTVENCIMENTO, 1);
                            END IF;

                            IF (V_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
                                V_DTVENCIMENTO := TO_DATE(LPAD(V_NRDIACALCVENC_PF, 2, '0') || '/' || TO_CHAR(V_DTFINCOMPET_ATUAL, 'MM/YYYY'), 'DD/MM/YYYY');

                                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 DTRETOMADAFATURA > SYSDATE
                                AND (DTINIPARALISACAO BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL
                                    OR (DTRETOMADAFATURA BETWEEN V_DTINICOMPET_ATUAL AND V_DTFINCOMPET_ATUAL))
                            GROUP BY 1;
                        EXCEPTION WHEN NO_DATA_FOUND THEN
                            V_IDSITUACAO := '1';
                        END;

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

                        -- Verifica se 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 PARCELA.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                                   AND PARCELA.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                                   AND PARCELA.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                                   AND PARCELA.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                                   AND PARCELA.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                                   AND PARCELA.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                                   AND PARCELA.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                                   AND TO_CHAR(PARCELA.DTINICOMPET, 'DD/MM/YYYY') = V_DTINICOMPET_ATUAL
                                   AND TO_CHAR(PARCELA.DTFINCOMPET, 'DD/MM/YYYY') = V_DTFINCOMPET_ATUAL;
                            EXCEPTION WHEN NO_DATA_FOUND THEN
                                V_NRFATURACONT := NULL;
                            END;
                        END IF;

                        IF(V_NRFATURACONT IS NULL) THEN
                            NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
                            INSERT INTO FCT_FATURACONT (
                                NRFATURACONT,
                                NRSEQCONTRATO,
                                CDFILIALFATURA,
                                NRPARCFATURA,
                                CDTIPOOPERFATURA,
                                CDSERIENF,
                                CDEMPRESA,
                                CDINSCESTA,
                                CDINSCMUNI,
                                IDTPFATURA,
                                IDSITUACAO,
                                DTINICOMPET,
                                DTFINCOMPET,
                                DTLIMITEAPU,
                                DTVENCIMENTO,
                                NRDIASVENCIMENTO,
                                QTDIASFATUVENC,
                                VRVENCIMENTO,
                                VRFATURADO,
                                VRFALTAFATURAR,
                                IDFORMAFATURA,
                                DSJUSTIFICATIVA,
                                NRAPURACAO,
                                NRMEDICAOFATURA,
                                IDALTUSUARIO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO
                            )
                            VALUES (
                                V_NRFATURACONT,
                                NULL,
                                C_NEGOCIACAO.CDFILIALFATURA,
                                C_NEGOCIACAO.NRPARCFATURA,
                                C_NEGOCIACAO.CDTIPOOPERFATURA,
                                C_NEGOCIACAO.CDSERIENF,
                                C_NEGOCIACAO.CDEMPRESA,
                                C_NEGOCIACAO.CDINSCESTA,
                                C_NEGOCIACAO.CDINSCMUNI,
                                C_NEGOCIACAO.IDTPFATURA,
                                V_IDSITUACAO,
                                V_DTINICOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL,
                                V_DTFINCOMPET_ATUAL + V_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
                            );
                        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;

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

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

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

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

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

                            NOVO_CODIGO_SC('FCT_ITFATURACONT', V_NRITFATURACONT, 1, P_NRORG);
                            INSERT INTO FCT_ITFATURACONT (
                                NRITFATURACONT,
                                NRFATURACONT,
                                NRSEQCONTRATO,
                                NRITEMOCONTRATO,
                                CDPRODFATURA,
                                IDSITUACAO,
                                VRVENCIMENTO,
                                VRFATURADO,
                                VRFALTAFATURAR,
                                IDFORMAFATURA,
                                DSJUSTIFICATIVA,
                                NRAPURACAO,
                                IDATIVO,
                                NRORG,
                                DTINCLUSAO,
                                NRORGINCLUSAO,
                                CDOPERINCLUSAO
                            )
                            VALUES (
                                V_NRITFATURACONT,
                                V_NRFATURACONT,
                                P_NRSEQCONTRATO,
                                C_ITNEGOCIACAO.NRITEMOCONTRATO,
                                C_ITNEGOCIACAO.CDPRODFATURA,
                                V_IDSITUACAO,
                                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'

            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(C_NEGOCIACAO.DTINICIOCONTRATO)));

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

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

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

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

                WHILE (V_DTINICOMPET_ATUAL <= C_NEGOCIACAO.DTFIMCONTRATO) LOOP

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

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

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

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

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

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

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

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

                    ELSE --quantidade de dias apos data de emissao

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

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

                    BEGIN
                        SELECT DESCPER.VRTOTITEMCOMDESC, DESCPER.VRDESCITEM
                        INTO V_VRTOTITEMCOMDESC, V_VRDESCITEM
                        FROM (SELECT VRTOTITEMCOMDESC,
                                     VRPERCDESCITEM,
                                     VRDESCITEM,
                                     QTMESESDESC,
                                     DTFINALVALIDADEDESC
                                FROM FCT_DESCPERIODONEGOCONT
                               WHERE NRNEGOCIACAOCONTRATO = C_NEGOCIACAO.NRNEGOCIACAOCONTRATO
                                 AND NRORG                = P_NRORG
                                 AND V_DTINICOMPET_ATUAL  < DTFINALVALIDADEDESC
                                 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;
                    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;

                    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       IN ('3', '4')
                               AND FAT.IDTPFATURA       = C_NEGOCIACAO.IDTPFATURA
                               AND FAT.CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                               AND FAT.NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                               AND FAT.CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                               AND FAT.CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                               AND FAT.CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                               AND FAT.CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                               AND FAT.CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                               AND REL.NRMEDICAOFATURA  IS NULL
                               AND TO_CHAR(FAT.DTINICOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'DD/MM/YYYY')
                               AND TO_CHAR(FAT.DTFINCOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTFINCOMPET_ATUAL, 'DD/MM/YYYY');

                            IF (V_EXISTE_PARCELA = 0) THEN

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

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

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

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

                                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;

                                    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

                        END IF; --V_VRTOTITEMCOMDESC > 0

                    ELSE --C_NEGOCIACAO.IDTPFATURA = 'X'

                        SELECT COUNT(*)
                          INTO V_EXISTE_PARCELA
                          FROM FCT_MEDICAOFATURA
                         WHERE NRSEQCONTRATO    = P_NRSEQCONTRATO
                           AND IDSITUACAO       <> '1'
                           AND CDFILIALFATURA   = C_NEGOCIACAO.CDFILIALFATURA
                           AND NRPARCFATURA     = C_NEGOCIACAO.NRPARCFATURA
                           AND CDTIPOOPERFATURA = C_NEGOCIACAO.CDTIPOOPERFATURA
                           AND CDSERIENF        = C_NEGOCIACAO.CDSERIENF
                           AND CDINSCMUNI       = C_NEGOCIACAO.CDINSCMUNI
                           AND CDINSCESTA       = C_NEGOCIACAO.CDINSCESTA
                           AND CDEMPRESA        = C_NEGOCIACAO.CDEMPRESA
                           AND TO_CHAR(DTINICOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTINICOMPET_ATUAL, 'DD/MM/YYYY')
                           AND TO_CHAR(DTFINCOMPET, 'DD/MM/YYYY') = TO_CHAR(V_DTFINCOMPET_ATUAL, 'DD/MM/YYYY');

                        IF (V_EXISTE_PARCELA = 0) THEN

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

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

                            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
                                  FROM FCT_ITNEGOCIACAOCONTRATO ITNEG
                                  LEFT JOIN FCT_ITNEGOCIACAOPROPOSTA ITNEGPROP
                                    ON ITNEG.NRITNEGOCIACAOPROPOSTA = ITNEGPROP.NRITNEGOCIACAOPROPOSTA
                                   AND ITNEG.NRORG                  = ITNEGPROP.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;

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

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

                                FOR C_MEDIDASIT IN (
                                    SELECT ITVAR.IDELEMENTORAIZ,
                                           ITVAR.CDTPMEDIDAVARIAVEL,
                                           ITVAR.QTMEDIDAVARIAVEL,
                                           NVL(ITVAR.QTFRANQUIA, 0) AS QTFRANQUIA,
                                           ITVAR.IDMULTIPVARIACAO
                                      FROM (
                                            SELECT REL.CDTPMEDIDAVARIAVEL,
                                                   REL.QTMEDIDAVARIAVEL,
                                                   REL.QTFRANQUIA,
                                                   ITCONT.NRORG,
                                                   ITCONT.NRSEQCONTRATO,
                                                   REL.IDELEMENTORAIZ,
                                                   VAR.IDMULTIPVARIACAO
                                              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_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
                                              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_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
                                     /*WHERE V_VALIDAMEDIDACONT > 0

                                     UNION ALL

                                    SELECT ITVAR.IDELEMENTORAIZ,
                                        ITVAR.CDTPMEDIDAVARIAVEL,
                                        ITVAR.QTMEDIDAVARIAVEL,
                                        NVL(ITVAR.QTFRANQUIA, 0) AS QTFRANQUIA,
                                        ITVAR.IDMULTIPVARIACAO
                                        FROM (
                                            SELECT REL.CDTPMEDIDAVARIAVEL,
                                                REL.QTMEDIDAVARIAVEL,
                                                REL.QTFRANQUIA,
                                                ITORC.NRORG,
                                                ITORC.NRSEQORCAMENTO,
                                                REL.IDELEMENTORAIZ,
                                                VAR.IDMULTIPVARIACAO,
                                                VAR.CDTPMEDIDAVARIAVEL AS MEDIDAVAR
                                            FROM FCT_RELACMEDIDAPROPOSTA REL
                                            INNER JOIN FCT_ITEMORCAMENTO ITORC
                                                ON REL.NRSEQORCAMENTO     = ITORC.NRSEQORCAMENTO
                                               AND REL.CDTPMEDIDAVARIAVEL = ITORC.CDTPMEDIDAVARIAVEL
                                               AND REL.NRORG              = ITORC.NRORG
                                               AND REL.IDELEMENTORAIZ     = ITORC.IDELEMENTO
                                            INNER JOIN FCT_VARPRECBASESERVORCA VAR
                                                ON ITORC.NRSEQORCAMENTO     = VAR.NRSEQORCAMENTO
                                               AND ITORC.CDSERVORCA         = VAR.CDSERVORCA
                                               AND ITORC.CDTPMEDIDASERV     = VAR.CDTPMEDIDASERV
                                               AND ITORC.CDTPMEDIDAVARIAVEL = NVL(VAR.CDTPMEDIDAVARIAVEL, ITORC.CDTPMEDIDAVARIAVEL)
                                               AND DECODE(REL.QTMEDIDAVARIAVEL, 0, 1, REL.QTMEDIDAVARIAVEL) BETWEEN VAR.QTMEDIDAINIVARIACAO AND VAR.QTMEDIDAFIMVARIACAO
                                            WHERE ITORC.NRITEMORCAMENTOPAI = C_ITNEGOCIACAO.NRITEMORCAMENTO
                                              AND ITORC.NRORG      = P_NRORG
                                            ORDER BY VAR.CDTPMEDIDAVARIAVEL) ITVAR
                                        WHERE ROWNUM = 1
                                       AND V_VALIDAMEDIDACONT = 0*/
                                ) 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,
                                        ROUND(C_MEDIDASIT.QTMEDIDAVARIAVEL, 2),
                                        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
                            END LOOP; -- C_ITNEGOCIACAO

                        END IF; --V_EXISTE_PARCELA = 0

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

                    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;
        END IF;
    END LOOP; --C_NEGOCIACAO
END;
/