CREATE OR REPLACE PROCEDURE FCT_GERAR_PARCELAS_APURACAO (
    P_NRSEQCONTRATO   IN VARCHAR2,
    P_NRMEDICAOFATURA IN VARCHAR2,
    P_NRORG           IN NUMBER,
    P_CDOPERADOR      IN VARCHAR2
)
AS

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

BEGIN

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

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

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

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

            EXCEPTION WHEN NO_DATA_FOUND THEN
              V_NRFATURACONTAGRUP := NULL;
            END;

            V_NRFATURACONT := V_NRFATURACONTAGRUP;
            IF (V_NRFATURACONTAGRUP IS NOT NULL) THEN
                V_IDPARCAGRUP  := 'S';
            END IF;

        ELSE
            BEGIN
                SELECT NRFATURACONT
                INTO V_NRFATURACONT
                FROM FCT_RELACAGRUPCONTFAT RELACFAT
                WHERE RELACFAT.NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
                  AND RELACFAT.NRSEQCONTRATO   = C_APUR.NRSEQCONTRATO
                  AND RELACFAT.NRORG           = P_NRORG;
            EXCEPTION WHEN NO_DATA_FOUND THEN
                V_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_APUR.CDFILIALFATURA,
                C_APUR.NRPARCFATURA,
                C_APUR.CDTIPOOPERFATURA,
                C_APUR.CDSERIENF,
                C_APUR.CDEMPRESA,
                C_APUR.CDINSCESTA,
                C_APUR.CDINSCMUNI,
                'X',
                '1',
                V_DTINICOMPET,
                V_DTFINCOMPET,
                C_APUR.DTLIMITEAPU,
                C_APUR.DTVENCIMENTO,
                C_APUR.NRDIASVENCIMENTO,
                C_APUR.QTDIASFATUVENC,
                V_VRVENCIMENTO,
                0,
                V_VRVENCIMENTO,
                NULL,
                NULL,
                NULL,
                NULL,
                'N',
                'S',
                P_NRORG,
                SYSDATE,
                P_NRORG,
                P_CDOPERADOR
            );

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

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

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

        IF (V_IDPARCAGRUP = 'S') THEN

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

        END IF;

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

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

        END LOOP;
    END LOOP;
END;