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_VALIDAAPUR         NUMBER;
    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, NRGRUPOFATURA, CDFILIALFATURA, NRPARCFATURA,
                         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 := C_APUR.NRSEQCONTRATO;
      -- VERIFICA SE O CONTRATO ESTÁ LIGADO A UM AGRUPAMENTO
      BEGIN 
        SELECT NRAGRUPAMENTO 
        INTO V_AGRUPAMENTO
        FROM FCT_RELACAGRUPAMENTOCONT 
        WHERE INSTR(P_NRSEQCONTRATO, '_' || TO_CHAR(NRSEQCONTRATO) || '_') > 0;
      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,
                PARCELA.DTINICOMPET,
                PARCELA.DTFINCOMPET
          INTO V_NRFATURACONTAGRUP, V_DTINICOMPET, V_DTFINCOMPET
          FROM FCT_RELACAGRUPAMENTOCONT AGRUPCONT
          INNER JOIN FCT_AGRUPAMENTO AGRUPAMENTO
            ON AGRUPCONT.NRAGRUPAMENTO = AGRUPAMENTO.NRAGRUPAMENTO
            AND AGRUPCONT.NRORG        = AGRUPAMENTO.NRORG
          INNER JOIN FCT_FATURACONT PARCELA
            ON AGRUPCONT.NRSEQCONTRATO    = PARCELA.NRSEQCONTRATO
            AND AGRUPAMENTO.NRORG         = PARCELA.NRORG
            AND AGRUPAMENTO.NRGRUPOFATURA = PARCELA.NRGRUPOFATURA
          INNER JOIN FCT_CONTRATO CONT
            ON AGRUPCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
            AND AGRUPCONT.NRORG        = CONT.NRORG
          WHERE AGRUPAMENTO.NRAGRUPAMENTO = V_AGRUPAMENTO
            AND V_DTINICOMPET BETWEEN PARCELA.DTINICOMPET AND PARCELA.DTFINCOMPET
            AND V_DTFINCOMPET BETWEEN PARCELA.DTINICOMPET AND PARCELA.DTFINCOMPET
            AND IDSITUACAO = '1';
        EXCEPTION WHEN NO_DATA_FOUND THEN
          V_NRFATURACONTAGRUP := NULL;
        END;
       
        IF(V_NRFATURACONTAGRUP IS NULL) THEN 
          V_VALIDAAPUR := 0;
        ELSE
            -- VALIDA O PERÍODO DE VIGÊNCIA DA PARCELA
            IF(V_DTINICOMPET IS NOT NULL AND TO_CHAR(V_DTINICOMPET, 'DD/MM/YY') > TO_CHAR(C_APUR.DTINICOMPET, 'DD/MM/YY')) THEN
              V_DTINICOMPET := C_APUR.DTINICOMPET;
            END IF;
            
            IF(V_DTFINCOMPET IS NOT NULL AND TO_CHAR(V_DTFINCOMPET, 'DD/MM/YY') > TO_CHAR(C_APUR.DTFINCOMPET, 'DD/MM/YY')) THEN
              V_DTFINCOMPET := C_APUR.DTFINCOMPET;
            END IF;
            V_VALIDAAPUR     := 1;
            V_NRFATURACONT   := V_NRFATURACONTAGRUP;
            V_VRVENCIMENTO   := C_APUR.VRMEDICAO;
            V_IDPARCAGRUP    := 'S';
            V_NRSEQCONTRATO  := NULL;
          END IF;
      ELSE 
         BEGIN
           SELECT COUNT(*)
             INTO V_VALIDAAPUR
             FROM FCT_FATURACONT
            WHERE NRMEDICAOFATURA = C_APUR.NRMEDICAOFATURA
              AND NRSEQCONTRATO = C_APUR.NRSEQCONTRATO
              AND NRORG = P_NRORG;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
             V_VALIDAAPUR := 0;
       END;
    END IF;
     IF (V_VALIDAAPUR = 0) THEN
        
        NOVO_CODIGO_SC('FCT_FATURACONT', V_NRFATURACONT, 1, P_NRORG);
        INSERT INTO  FCT_FATURACONT (NRFATURACONT, NRSEQCONTRATO, NRGRUPOFATURA, CDFILIALFATURA, NRPARCFATURA, IDTPFATURA, IDSITUACAO,
                      DTINICOMPET, DTFINCOMPET, DTLIMITEAPU, DTVENCIMENTO, NRDIASVENCIMENTO, QTDIASFATUVENC,
                      VRVENCIMENTO, VRFATURADO, VRFALTAFATURAR, IDFORMAFATURA, DSJUSTIFICATIVA, NRAPURACAO, NRMEDICAOFATURA,
                      IDATIVO, NRORG,  DTINCLUSAO,  NRORGINCLUSAO,  CDOPERINCLUSAO)
            VALUES (V_NRFATURACONT, V_NRSEQCONTRATO, C_APUR.NRGRUPOFATURA, C_APUR.CDFILIALFATURA, C_APUR.NRPARCFATURA, '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, C_APUR.NRMEDICAOFATURA,
                    '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);
      
       FOR C_ITENS IN (SELECT NRITMEDICAOFATURA, NRMEDICAOFATURA, NRSEQCONTRATO, NRITEMOCONTRATO, CDSERVORCA,
                                CDPRODFATURA, IDSITUACAO, VRTOTITEMCONT, IDATIVO, NRORG
                           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',
                             C_ITENS.VRTOTITEMCONT, 0, C_ITENS.VRTOTITEMCONT, NULL, NULL, NULL,
                             'S', P_NRORG, SYSDATE, P_NRORG, P_CDOPERADOR);

         END LOOP;  
   END LOOP;
END;