CREATE OR REPLACE PROCEDURE FCT_EXCLUIR_PARCELAS_FATURA (
    P_NRSEQCONTRATO    IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG            IN NUMBER,
    P_DTRECISAOCONTR   IN DATE DEFAULT SYSDATE,
    P_IDTPEXCLUSAOPARC IN INTEGER DEFAULT 1
) AS

    V_AGRUPAMENTO    FCT_AGRUPAMENTO.NRAGRUPAMENTO%TYPE;
    V_VRVENCIMENTO   FCT_FATURACONT.VRVENCIMENTO%TYPE;
    V_DTRECISAOCONTR DATE;

    V_SOMA_VRNEGOCIADOIT   FLOAT;
    V_SOMA_VRCONSIDERADOIT FLOAT;

BEGIN

    IF P_DTRECISAOCONTR IS NULL THEN
        V_DTRECISAOCONTR := SYSDATE;
    ELSE
        V_DTRECISAOCONTR := P_DTRECISAOCONTR;
    END IF;

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

    FOR C_PARCAGRUP IN (
        SELECT PARCELA.NRFATURACONT, PARCELA.VRVENCIMENTO, PARCELA.NRORG, RELACCONT.NRMEDICAOFATURA, PARCELA.CDOPERINCLUSAO
          FROM FCT_FATURACONT PARCELA
         INNER JOIN FCT_RELACAGRUPCONTFAT RELACCONT
            ON PARCELA.NRFATURACONT = RELACCONT.NRFATURACONT
           AND PARCELA.NRORG        = RELACCONT.NRORG
         INNER JOIN FCT_CONTRATO CONT
            ON RELACCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
           AND RELACCONT.NRORG         = CONT.NRORG
         WHERE RELACCONT.NRSEQCONTRATO = P_NRSEQCONTRATO
           AND PARCELA.NRORG           = P_NRORG
           AND PARCELA.IDSITUACAO IN ('1', '5')
           AND ((P_IDTPEXCLUSAOPARC = 1) OR ((P_IDTPEXCLUSAOPARC = 2) AND (TRUNC(PARCELA.DTINICOMPET) >= TRUNC(V_DTRECISAOCONTR))))
           AND PARCELA.DTINICOMPET >= NVL(CONT.DTINIVIGENCONT, CONT.DTINICIOCONTRATO)
    ) LOOP

        IF (C_PARCAGRUP.NRMEDICAOFATURA IS NOT NULL) THEN

            -- Exclui a parcela de apuracao gerada atraves da medicao de faturamento.
            FCT_CANCELAR_APURA_MEDICAO('_'||C_PARCAGRUP.NRMEDICAOFATURA||'_', '_'||P_NRSEQCONTRATO||'_', P_NRORG, C_PARCAGRUP.CDOPERINCLUSAO);

            -- Cancela o calculo da medicao de faturamento
            FCT_CANCELAR_MEDICAO('_'||C_PARCAGRUP.NRMEDICAOFATURA||'_', '_'||P_NRSEQCONTRATO||'_', P_NRORG, C_PARCAGRUP.CDOPERINCLUSAO);

        ELSE

            IF (V_AGRUPAMENTO IS NULL) THEN
                DELETE FROM FCT_RELACAGRUPCONTFAT
                WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                  AND NRFATURACONT  = C_PARCAGRUP.NRFATURACONT
                  AND NRORG         = P_NRORG;

                DELETE FROM FCT_ITFATURACONT
                WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
                  AND NRORG        = P_NRORG;

                DELETE FROM FCT_FATURACONT
                WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
                  AND NRORG        = P_NRORG;
            ELSE
                SELECT SUM(VRVENCIMENTO)
                  INTO V_VRVENCIMENTO
                  FROM FCT_ITFATURACONT
                 WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
                   AND NRORG         = P_NRORG
                   AND NRFATURACONT  = C_PARCAGRUP.NRFATURACONT;

                DELETE FROM FCT_RELACAGRUPCONTFAT
                 WHERE NRFATURACONT  = C_PARCAGRUP.NRFATURACONT
                   AND NRORG         = P_NRORG
                   AND NRSEQCONTRATO = P_NRSEQCONTRATO;

                DELETE FROM FCT_ITFATURACONT
                 WHERE NRFATURACONT  = C_PARCAGRUP.NRFATURACONT
                   AND NRORG         = P_NRORG
                   AND NRSEQCONTRATO = P_NRSEQCONTRATO
                   AND NRAPURACAO    IS NULL;

                IF (C_PARCAGRUP.VRVENCIMENTO - V_VRVENCIMENTO = 0) THEN
                    DELETE FROM FCT_FATURACONT
                     WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
                       AND NRORG        = P_NRORG;
                ELSE
                    SELECT SUM(VRNEGCONTR),
                           SUM(NVL(VRNEGCONTR, VRVENCIMENTO))
                      INTO V_SOMA_VRNEGOCIADOIT,
                           V_SOMA_VRCONSIDERADOIT
                      FROM FCT_ITFATURACONT
                     WHERE NRORG         = P_NRORG
                       AND NRFATURACONT  = C_PARCAGRUP.NRFATURACONT;

                    IF (V_SOMA_VRNEGOCIADOIT IS NOT NULL) THEN
                        V_SOMA_VRNEGOCIADOIT := V_SOMA_VRCONSIDERADOIT;
                    END IF;

                    UPDATE FCT_FATURACONT
                       SET VRVENCIMENTO   = VRVENCIMENTO - V_VRVENCIMENTO,
                           VRNEGCONTR     = V_SOMA_VRNEGOCIADOIT,
                           VRFALTAFATURAR = V_SOMA_VRCONSIDERADOIT
                     WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
                       AND NRORG        = C_PARCAGRUP.NRORG;
                END IF;
            END IF;

            -- RATEIO
            DELETE FROM FCT_RATEIOITFATURACONT
            WHERE NRFATURACONT = C_PARCAGRUP.NRFATURACONT
              AND NRORG        = C_PARCAGRUP.NRORG;

        END IF;

    END LOOP;

    DELETE FROM FCT_MEDICAOFATURA
    WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
        AND NRORG       = P_NRORG
        AND IDSITUACAO IN ('1', '5')
        AND (P_IDTPEXCLUSAOPARC = 1 OR DTINICOMPET >= V_DTRECISAOCONTR);

END;
/