create or replace PROCEDURE FCT_SUSPENDER_PARCELAS_FATURA (
    P_NRSEQCONTRATO    IN FCT_CONTRATO.NRSEQCONTRATO%TYPE,
    P_NRORG            IN NUMBER,
    P_DTSUSPENSAO      IN DATE
) AS

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

BEGIN

    -- 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
        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 IDSITUACAO IN('1', '5')
            AND RELACCONT.NRMEDICAOFATURA IS NULL
            AND (((PARCELA.DTINICOMPET >= P_DTSUSPENSAO) OR (PARCELA.DTFINCOMPET > P_DTSUSPENSAO)) OR (P_DTSUSPENSAO IS NULL))
            AND (PARCELA.DTINICOMPET BETWEEN NVL(CONT.DTINIVIGENCONT, CONT.DTINICIOCONTRATO) AND NVL(CONT.DTFINVIGENCONT, CONT.DTFIMCONTRATO))
    ) LOOP

        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
                UPDATE FCT_FATURACONT
                SET VRVENCIMENTO   = VRVENCIMENTO - V_VRVENCIMENTO
                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 LOOP;

    /* DELETA MEDICOES SEM PARCELA GERADA */

    DELETE FROM FCT_MEDICAOFATURA
   WHERE NRSEQCONTRATO = P_NRSEQCONTRATO
     AND IDSITUACAO <> '4'
     AND (((DTINICOMPET >= P_DTSUSPENSAO) OR (DTFINCOMPET > P_DTSUSPENSAO)) OR (P_DTSUSPENSAO IS NULL))
     AND NRORG = P_NRORG;

  /* DELETA MEDICOES COM PARCELA GERADA QUE AINDA ESTIVEREM PENDENDENTES */

    FOR C_PARC IN (SELECT FCT_RELACAGRUPCONTFAT.NRMEDICAOFATURA
                     FROM FCT_RELACAGRUPCONTFAT
                     JOIN FCT_FATURACONT 
                       ON FCT_FATURACONT.NRFATURACONT = FCT_RELACAGRUPCONTFAT.NRFATURACONT 
                      AND FCT_FATURACONT.NRORG = FCT_RELACAGRUPCONTFAT.NRORG
                    WHERE FCT_RELACAGRUPCONTFAT.NRSEQCONTRATO = P_NRSEQCONTRATO
                      AND FCT_RELACAGRUPCONTFAT.NRMEDICAOFATURA IS NOT NULL
                      AND FCT_FATURACONT.IDSITUACAO IN ('1', '5')
                      AND (((FCT_FATURACONT.DTINICOMPET >= P_DTSUSPENSAO) OR (FCT_FATURACONT.DTFINCOMPET > P_DTSUSPENSAO)) OR (P_DTSUSPENSAO IS NULL))
                      AND FCT_RELACAGRUPCONTFAT.NRORG = P_NRORG) LOOP
        
        FCT_CANCELAR_APURA_MEDICAO('_'||C_PARC.NRMEDICAOFATURA||'_', '_'||P_NRSEQCONTRATO||'_', P_NRORG, '1');

        DELETE FROM FCT_MEDICAOFATURA
         WHERE NRMEDICAOFATURA = C_PARC.NRMEDICAOFATURA
           AND IDSITUACAO = '3'
           AND NRORG = P_NRORG;

    END LOOP;
END;
/