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

    V_NRSEQORCAMENTO  FCT_ORCAMENTO.NRSEQORCAMENTO%TYPE;
    V_VRTOTITEMCONT   FCT_ITEMCONTRATO.VRTOTITEMCONT%TYPE;
    V_VALIDAAPUR      NUMBER;

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 = '3') LOOP
      BEGIN
          SELECT COUNT(*)
            INTO V_VALIDAAPUR
            FROM FCT_FATURACONT
           WHERE NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
             AND NRSEQCONTRATO = C_MEDICAO.NRSEQCONTRATO
             AND NRORG = P_NRORG;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
            V_VALIDAAPUR := 0;
      END;

      IF (V_VALIDAAPUR = 0) THEN

          BEGIN
              SELECT NRSEQORCAMENTO
                INTO V_NRSEQORCAMENTO
                FROM FCT_REFEORCACONT
               WHERE NRSEQCONTRATO = C_MEDICAO.NRSEQCONTRATO
                 AND NRORG = P_NRORG;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
                V_NRSEQORCAMENTO := NULL;
          END;


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

            BEGIN
                SELECT VRTOTITEMCONT
                  INTO V_VRTOTITEMCONT
                  FROM FCT_ITEMCONTRATO
                 WHERE NRSEQCONTRATO = C_ITEM.NRSEQCONTRATO
                   AND NRITEMOCONTRATO = C_ITEM.NRITEMOCONTRATO
                   AND NRORG = P_NRORG;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    V_VRTOTITEMCONT := 0;
            END;

            UPDATE FCT_ITMEDICAOFATURA
               SET IDSITUACAO = '1',
                   VRTOTITEMCONT = V_VRTOTITEMCONT,
                   CDOPERULTATU = P_CDOPERADOR,
                   NRORGULTATU = P_NRORG,
                   DTULTATU = SYSDATE
             WHERE NRITMEDICAOFATURA = C_ITEM.NRITMEDICAOFATURA
               AND NRMEDICAOFATURA = C_ITEM.NRMEDICAOFATURA
               AND NRORG = P_NRORG;

          END LOOP;

          FOR C_MEDVAR IN ( SELECT NRMEDVARMEDICAOFATURA, NRMEDICAOFATURA, IDELEMENTORAIZ, CDSERVORCA,
                                    CDTPMEDIDAVARIAVEL, QTMEDIDAVARIAVEL, IDMULTIPVARIACAO, IDATIVO, NRORG
                               FROM FCT_MEDVARMEDICAOFATURA
                              WHERE NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
                                AND NRORG = P_NRORG
          ) LOOP
            --Buscar os itens na proposta pra saber a medida variavel e sua quantidade
            FOR C_MEDIDAS IN (
                SELECT MEDIDAS.IDELEMENTORAIZ,
                       MEDIDAS.NRTIPOORCAMENTO,
                       MEDIDAS.CDSERVORCA,
                       VARIACAO.CDTPMEDIDAVARIAVEL,
                       MEDIDAS.QTMEDIDAVARIAVEL,
                       VARIACAO.IDMULTIPVARIACAO
                 FROM (
                    SELECT ELEMENTOS.NRSEQORCAMENTO,
                           ELEMENTOS.NRTIPOORCAMENTO,
                           ELEMENTOS.CDSERVORCA,
                           ELEMENTOS.QTSERVORCA,
                           ELEMENTOS.CDTPMEDIDASERV,
                           SUM(ELEMENTOS.QTMEDSERVORCA) AS QTMEDSERVORCA,
                           SUM(ELEMENTOS.QTMEDIDACALC)  AS QTMEDIDACALC,
                           ELEMENTOS.QTMEDIDAVARIAVEL,
                           ELEMENTOS.VRUNITSERVORCA,
                           SUM(ELEMENTOS.VRTOTSERVORCA) AS VRTOTSERVORCA,
                           ELEMENTOS.IDELEMENTORAIZ,
                           ELEMENTOS.NRORG
                      FROM (
                          SELECT TRAB.NRSEQORCAMENTO,
                                 TRAB.NRTIPOORCAMENTO,
                                 TRAB.CDSERVORCA,
                                 TRAB.QTSERVORCA,
                                 TRAB.CDTPMEDIDASERV,
                                 TRAB.QTMEDSERVORCA,
                                 TRAB.QTMEDIDACALC,
                                 TRAB.QTMEDIDAVARIAVEL,
                                 TRAB.VRUNITSERVORCA,
                                 TRAB.VRTOTSERVORCA,
                                 CONNECT_BY_ROOT IDELEMENTO AS IDELEMENTORAIZ,
                                 TRAB.NRORG
                        FROM (
                            SELECT DISTINCT NRSEQORCAMENTO,
                                   NRTIPOORCAMENTO,
                                   IDESCOLHIDO,
                                   CDSERVORCA,
                                   QTSERVORCA,
                                   CDTPMEDIDASERV,
                                   QTMEDSERVORCA,
                                   QTMEDIDACALC,
                                   QTMEDIDAVARIAVEL,
                                   VRUNITSERVORCA,
                                   VRTOTSERVORCA,
                                   IDELEMENTO,
                                   IDELEMENTOPAI,
                                   NRORG
                              FROM FCT_TRABSERVORCAMENTO
                             WHERE NRSEQORCAMENTO = V_NRSEQORCAMENTO
                               AND NRORG          = P_NRORG
                               AND IDESCOLHIDO    = 'S'
                          ) TRAB
                       WHERE CDSERVORCA     = C_MEDVAR.CDSERVORCA
                         AND VRUNITSERVORCA IS NOT NULL
                     CONNECT BY PRIOR IDELEMENTO = IDELEMENTOPAI
                       START WITH IDELEMENTO IN (SELECT DISTINCT IDELEMENTO
                                                   FROM FCT_TRABSERVORCAMENTO
                                                  WHERE NRSEQORCAMENTO = TRAB.NRSEQORCAMENTO
                                                    AND NRORG          = TRAB.NRORG
                                                    AND IDESCOLHIDO    = 'S'
                                                    AND IDELEMENTOPAI  IS NULL)
                      ) ELEMENTOS
                     INNER JOIN FCT_SERVICOORCA
                        ON ELEMENTOS.CDSERVORCA = FCT_SERVICOORCA.CDSERVORCA
                       AND ELEMENTOS.NRORG      = FCT_SERVICOORCA.NRORG
                     GROUP BY ELEMENTOS.NRSEQORCAMENTO,
                              ELEMENTOS.NRTIPOORCAMENTO,
                              ELEMENTOS.CDSERVORCA,
                              ELEMENTOS.QTSERVORCA,
                              ELEMENTOS.CDTPMEDIDASERV,
                              ELEMENTOS.QTMEDIDAVARIAVEL,
                              ELEMENTOS.VRUNITSERVORCA,
                              ELEMENTOS.IDELEMENTORAIZ,
                              ELEMENTOS.NRORG
                     ORDER BY ELEMENTOS.IDELEMENTORAIZ,
                              ELEMENTOS.CDSERVORCA
                 ) MEDIDAS
                 LEFT JOIN FCT_TIPOMEDIDASERV MED
                   ON MEDIDAS.CDTPMEDIDASERV = MED.CDTPMEDIDASERV
                  AND MEDIDAS.NRORG          = MED.NRORG
                 LEFT JOIN FCT_SERVICOORCA ELE
                   ON MEDIDAS.IDELEMENTORAIZ = ELE.IDELEMENTO
                  AND MEDIDAS.NRORG          = ELE.NRORG
                INNER JOIN FCT_TIPOORCAMENTO ESCOPO
                   ON MEDIDAS.NRTIPOORCAMENTO = ESCOPO.NRTIPOORCAMENTO
                  AND MEDIDAS.NRORG           = ESCOPO.NRORG
                INNER JOIN FCT_SERVICOORCA SERV
                   ON MEDIDAS.CDSERVORCA = SERV.CDSERVORCA
                  AND MEDIDAS.NRORG      = SERV.NRORG
                 LEFT JOIN FCT_RELACMEDIDAPROPOSTA REL
                   ON MEDIDAS.NRSEQORCAMENTO = REL.NRSEQORCAMENTO
                  AND MEDIDAS.NRORG          = REL.NRORG
                  AND MEDIDAS.IDELEMENTORAIZ = REL.IDELEMENTORAIZ
                 LEFT JOIN (SELECT DISTINCT
                                   VAR.CDTPMEDIDASERV,
                                   VAR.CDTPMEDIDAVARIAVEL,
                                   VAR.IDMULTIPVARIACAO,
                                   TIPO.NRTIPOORCAMENTO,
                                   IT.CDSERVORCA,
                                   IT.NRORG
                              FROM FCT_VARIACAOPRECBASESERV VAR
                             INNER JOIN FCT_ITPRECBASESERV IT
                                ON VAR.NRSEQITPRECBSERV = IT.NRSEQITPRECBSERV
                               AND VAR.NRORG            = IT.NRORG
                             INNER JOIN FCT_TIPOORCAMENTO TIPO
                                ON IT.CDPRECBASESERV = TIPO.CDPRECBASESERV
                               AND IT.NRORG          = TIPO.NRORG
                ) VARIACAO
                  ON MEDIDAS.NRTIPOORCAMENTO = VARIACAO.NRTIPOORCAMENTO
                 AND MEDIDAS.CDSERVORCA     = VARIACAO.CDSERVORCA
                 AND MEDIDAS.NRORG          = VARIACAO.NRORG
                 AND REL.CDTPMEDIDAVARIAVEL = VARIACAO.CDTPMEDIDAVARIAVEL
               ORDER BY NRTIPOORCAMENTO, IDELEMENTORAIZ
            ) LOOP

                UPDATE FCT_MEDVARMEDICAOFATURA
                   SET QTMEDIDAVARIAVEL = C_MEDIDAS.QTMEDIDAVARIAVEL,
                       DTULTATU = SYSDATE,
                       CDOPERULTATU = P_CDOPERADOR,
                       NRORGULTATU = P_NRORG
                 WHERE NRMEDVARMEDICAOFATURA = C_MEDVAR.NRMEDVARMEDICAOFATURA
                   AND NRMEDICAOFATURA = C_MEDVAR.NRMEDICAOFATURA
                   AND NRORG = P_NRORG;

            END LOOP;
          END LOOP;

          UPDATE FCT_MEDICAOFATURA
             SET IDSITUACAO = 1,
                 VRMEDICAO = 0
           WHERE NRMEDICAOFATURA = C_MEDICAO.NRMEDICAOFATURA
             AND NRSEQCONTRATO = C_MEDICAO.NRSEQCONTRATO
             AND NRORG = P_NRORG;

        END IF;
    END LOOP;
END;