CREATE OR REPLACE PROCEDURE FCT_CANCELAR_APURA_MEDICAO (
    P_NRMEDICAOFATURA  IN VARCHAR2, 
    P_NRSEQCONTRATO    IN VARCHAR2,
    P_NRORG            IN NUMBER,
    P_CDOPERADOR       IN VARCHAR2
)
AS
   V_NRFATURACONT FCT_FATURACONT.NRFATURACONT%TYPE;
   V_IDPARCAGRUP  FCT_RELACAGRUPCONTFAT.IDPARCAGRUP%TYPE;
   V_QTAGRUP NUMBER;

   -- VARIAVEIS DE NEGOCIACAO DE CONTRATO APROVADO
   V_VRPARCELANEGOCIA     FCT_PARCELASNEGCONTR.VRPARCELANEGOCIA%TYPE;
   V_IDTIPONEGOCIA        FCT_NEGCONTRATO.IDTIPONEGOCIA%TYPE;
   V_VRFATURACONT         FLOAT;
   V_SOMA_VRNEGOCIADOIT   FLOAT;
   V_SOMA_VRCONSIDERADOIT FLOAT;
   V_SOMA_VRVENCIMENTOIT  FLOAT;
   V_VRVENCIMENTO         FLOAT;
   V_VRNEGOCIADOIT        FLOAT;
BEGIN
     FOR C_MEDICAO 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 = '4'
         ORDER BY NRMEDICAOFATURA
     ) LOOP
        
        BEGIN 
          SELECT NRFATURACONT, IDPARCAGRUP
            INTO V_NRFATURACONT, V_IDPARCAGRUP
            FROM FCT_RELACAGRUPCONTFAT 
           WHERE NRSEQCONTRATO   = C_MEDICAO.NRSEQCONTRATO
             AND NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
             AND NRORG           = C_MEDICAO.NRORG;
        EXCEPTION WHEN NO_DATA_FOUND THEN
          V_NRFATURACONT := NULL;
        END;

        FOR C_FATURA IN (
            SELECT NRFATURACONT, NRSEQCONTRATO, IDSITUACAO, VRVENCIMENTO, VRNEGCONTR, VRFALTAFATURAR, VRFATURADO, NRPARCELASNEGCONTR
              FROM FCT_FATURACONT
             WHERE NRFATURACONT = V_NRFATURACONT 
                  OR (V_NRFATURACONT IS NULL 
                 AND NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
                 AND NRSEQCONTRATO   = C_MEDICAO.NRSEQCONTRATO
                 AND NRORG           = P_NRORG)
        ) LOOP

           IF (C_FATURA.IDSITUACAO = '1') THEN
              DELETE FROM FCT_ITFATURACONT
               WHERE NRFATURACONT    = C_FATURA.NRFATURACONT
                 AND NRSEQCONTRATO   = C_MEDICAO.NRSEQCONTRATO
                 AND NRORG           = P_NRORG
                 AND NRITEMOCONTRATO IN (SELECT NRITEMOCONTRATO
                                           FROM FCT_ITMEDICAOFATURA
                                          WHERE NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA);

              DELETE FROM FCT_RELACAGRUPCONTFAT
               WHERE NRFATURACONT    = C_FATURA.NRFATURACONT
                 AND NRSEQCONTRATO   = C_MEDICAO.NRSEQCONTRATO
                 AND NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
                 AND NRORG           = P_NRORG;
                   
              SELECT COUNT(*)
                INTO V_QTAGRUP
                FROM FCT_RELACAGRUPCONTFAT
               WHERE NRFATURACONT    = C_FATURA.NRFATURACONT
                 AND NRORG           = P_NRORG;

              IF(V_IDPARCAGRUP = 'N' OR V_QTAGRUP = 0) THEN
                
                DELETE FROM FCT_FATURACONT
                 WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                   AND NRORG        = P_NRORG;
                
              ELSE 
                
                -- Verifica se a parcela tem valor negociado para fazer os tratamentos necessarios
                IF (C_FATURA.VRNEGCONTR IS NOT NULL) THEN

                   SELECT SUM(VRNEGCONTR),
                          SUM(NVL(VRNEGCONTR, VRVENCIMENTO)),
                          SUM(VRVENCIMENTO)
                     INTO V_SOMA_VRNEGOCIADOIT,
                          V_SOMA_VRCONSIDERADOIT,
                          V_SOMA_VRVENCIMENTOIT
                     FROM FCT_ITFATURACONT
                    WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                      AND NRORG        = P_NRORG;

                   /* Se tem valor negociado e essa negociacao foi feita para o grupo de faturamento, sera buscado os dados da negociacao
                      para recalcular o novo valor da fatura ao retirar a medicao informada => IF
                      Se o valor negociado veio dos itens, o valor da fatura e atualizado com a soma dos itens => ELSE */
                   IF (C_FATURA.NRPARCELASNEGCONTR IS NOT NULL) THEN
                       
                       SELECT PARC.VRPARCELANEGOCIA,
                             NEG.IDTIPONEGOCIA
                        INTO V_VRPARCELANEGOCIA,
                             V_IDTIPONEGOCIA
                        FROM FCT_PARCELASNEGCONTR PARC
                       INNER JOIN FCT_NEGCONTRATO NEG
                          ON PARC.NRNEGCONTRATO = NEG.NRNEGCONTRATO
                       WHERE PARC.NRPARCELASNEGCONTR = C_FATURA.NRPARCELASNEGCONTR
                         AND NEG.NRORG               = P_NRORG;

                      IF (V_IDTIPONEGOCIA = 'VF') THEN
                          V_VRFATURACONT := V_VRPARCELANEGOCIA;

                      ELSIF (V_IDTIPONEGOCIA = 'DP') THEN
                          V_VRFATURACONT := V_SOMA_VRVENCIMENTOIT - (V_SOMA_VRVENCIMENTOIT * V_VRPARCELANEGOCIA / 100);

                      ELSIF (V_IDTIPONEGOCIA = 'DV') THEN
                          V_VRFATURACONT := V_SOMA_VRVENCIMENTOIT - V_VRPARCELANEGOCIA;

                      ELSIF (V_IDTIPONEGOCIA = 'AP') THEN
                          V_VRFATURACONT := V_SOMA_VRVENCIMENTOIT + (V_SOMA_VRVENCIMENTOIT * V_VRPARCELANEGOCIA / 100);

                      ELSIF (V_IDTIPONEGOCIA = 'AV') THEN
                          V_VRFATURACONT := V_SOMA_VRVENCIMENTOIT + V_VRPARCELANEGOCIA;

                      END IF;

                      V_VRFATURACONT := ROUND(V_VRFATURACONT, 2);

                      UPDATE FCT_FATURACONT
                         SET VRVENCIMENTO   = VRVENCIMENTO - C_MEDICAO.VRMEDICAO,
                             VRNEGCONTR     = V_VRFATURACONT,
                             VRFALTAFATURAR = V_VRFATURACONT
                       WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                         AND NRORG        = P_NRORG;

                       SELECT VRVENCIMENTO
                         INTO V_VRVENCIMENTO
                         FROM FCT_FATURACONT
                        WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                          AND NRORG        = P_NRORG;

                      -- Atualiza o valor negociado dos itens rateando o valor negociado da parcela - INICIO
                      FOR C_ITENS IN (
                          SELECT NRITFATURACONT,
                                 VRVENCIMENTO,
                                 VRNEGCONTR,
                                 VRFALTAFATURAR,
                                 VRFATURADO
                            FROM FCT_ITFATURACONT
                           WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                             AND NRORG        = P_NRORG
                      ) LOOP

                          IF (V_VRFATURACONT = 0 OR V_VRVENCIMENTO = 0) THEN
                              V_VRNEGOCIADOIT := 0;

                          ELSIF (V_IDTIPONEGOCIA = 'VF') THEN
                              V_VRNEGOCIADOIT := V_VRFATURACONT / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO;

                          ELSIF (V_IDTIPONEGOCIA = 'DP') THEN
                              V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO - (C_ITENS.VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);

                          ELSIF (V_IDTIPONEGOCIA = 'DV') THEN
                              V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO - (V_VRPARCELANEGOCIA / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO);

                          ELSIF (V_IDTIPONEGOCIA = 'AP') THEN
                              V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO + (C_ITENS.VRVENCIMENTO * V_VRPARCELANEGOCIA / 100);

                          ELSIF (V_IDTIPONEGOCIA = 'AV') THEN
                              V_VRNEGOCIADOIT := C_ITENS.VRVENCIMENTO + (V_VRPARCELANEGOCIA / V_VRVENCIMENTO * C_ITENS.VRVENCIMENTO);

                          END IF;

                          V_VRNEGOCIADOIT := ROUND(V_VRNEGOCIADOIT, 2);

                          UPDATE FCT_ITFATURACONT
                             SET VRNEGCONTR     = V_VRNEGOCIADOIT,
                                 VRFALTAFATURAR = V_VRNEGOCIADOIT
                           WHERE NRITFATURACONT = C_ITENS.NRITFATURACONT
                             AND NRORG          = P_NRORG;

                      END LOOP;
                      -- Atualiza o valor negociado dos itens rateando o valor negociado da parcela - FIM

                   -- Se o valor negociado veio dos itens, o valor da parcela e atualizado com a soma dos itens
                   ELSE

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

                      UPDATE FCT_FATURACONT
                          SET VRVENCIMENTO   = VRVENCIMENTO - C_MEDICAO.VRMEDICAO,
                              VRNEGCONTR     = V_SOMA_VRNEGOCIADOIT,
                              VRFALTAFATURAR = V_SOMA_VRCONSIDERADOIT
                        WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                          AND NRORG        = P_NRORG;

                   END IF; --C_FATURA.NRPARCELASNEGCONTR IS NOT NULL

                -- Se a parcela nao tem valor negociado, seu valor e atualizado apenas subtraindo o valor da medicao informada
                ELSE

                    UPDATE FCT_FATURACONT 
                       SET VRVENCIMENTO   = VRVENCIMENTO - C_MEDICAO.VRMEDICAO,
                           VRFALTAFATURAR = VRFALTAFATURAR - C_MEDICAO.VRMEDICAO
                     WHERE NRFATURACONT = C_FATURA.NRFATURACONT
                       AND NRORG        = P_NRORG; 

                END IF; --C_FATURA.VRNEGCONTR IS NOT NULL

              END IF;

              -- Atualiza a medicao para a situacao 'Calculada'
              UPDATE FCT_MEDICAOFATURA
                 SET IDSITUACAO   = '3',
                     NRORGULTATU  = P_NRORG,
                     DTULTATU     = SYSDATE,
                     CDOPERULTATU = P_CDOPERADOR
               WHERE NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
                 AND NRORG           = P_NRORG;
           END IF;
        END LOOP;
    END LOOP;
END;
/