/*===-  Criação dos Types para Function  -===*/

DROP TYPE FCT_BUSCA_PRECOMEDICAO_TABLE;
/

DROP TYPE FCT_BUSCA_PRECOMEDICAO_TYPE;
/

CREATE OR REPLACE TYPE FCT_BUSCA_PRECOMEDICAO_TYPE AS OBJECT
   (NRCONTRATOFCT VARCHAR2(4000),
    NRSEQCONTRATO VARCHAR2(4000),
    NRMEDICAOFATURA VARCHAR2(4000),
    NRGRUPOFATURA NUMBER,
    CDFILIALFATURA VARCHAR2(4),
    NMFILIALFATURA VARCHAR2(30),
    NRPARCFATURA  NUMBER,
    NMPARCFATURA VARCHAR2(250),
    IDTPFATURA  VARCHAR2(1),
    IDSITUACAO CHAR(1),
    DTINICOMPET DATE,
    DTFINCOMPET DATE,
    DTLIMITEAPU DATE,
    DTVENCIMENTO DATE,
    NRDIASVENCIMENTO NUMBER,
    QTDIASFATUVENC NUMBER,
    PRECOMEDICAO FLOAT(126),
    IDATIVO CHAR(1),
    NRORG NUMBER,
    DTINCLUSAO DATE,
    NRORGINCLUSAO NUMBER,
    CDOPERINCLUSAO VARCHAR2(12),
    DTULTATU DATE,
    NRORGULTATU NUMBER,
    CDOPERULTATU VARCHAR2(12),
    DSREFERENCIACONT VARCHAR2(4000),
    NRMEDICAOFATURAAUX NUMBER,
    NRAGRUPAMENTO NUMBER,
    VRNEGCONTR FLOAT);
/

CREATE OR REPLACE TYPE FCT_BUSCA_PRECOMEDICAO_TABLE AS TABLE OF FCT_BUSCA_PRECOMEDICAO_TYPE;
/

/*===-  Criação da Function FCT_BUSCA_PRECOMEDICAO  -===*/
CREATE OR REPLACE FUNCTION FCT_BUSCA_PRECOMEDICAO(P_NRPARCNEGOCIO IN PARCNEGOCIO.NRPARCNEGOCIO%TYPE,
                                                  P_NRORG IN FCT_CONTRATO.NRORG%TYPE)
RETURN FCT_BUSCA_PRECOMEDICAO_TABLE PIPELINED
IS
OUT_RECORD FCT_BUSCA_PRECOMEDICAO_TYPE := FCT_BUSCA_PRECOMEDICAO_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                                       NULL, NULL, NULL, NULL, NULL,
                                                                       NULL, NULL, NULL, NULL, NULL,
                                                                       NULL, NULL, NULL, NULL, NULL,
                                                                       NULL, NULL, NULL, NULL, NULL,
                                                                       NULL, NULL, NULL, NULL);
V_MEDICAO             NUMBER;
V_NRSEQORCAMENTO      FCT_ORCAMENTO.NRSEQORCAMENTO%TYPE;
V_NRORCAMODELO        FCT_ORCAMENTO.NRORCAMENTOMODELO%TYPE;
V_ESCOPOFATURA        FCT_ORCAMENTO.NRTIPOORCAMENTO%TYPE;
V_VALORTOTALITEM      NUMBER;
V_VALORMINIMO         NUMBER;
V_QTMINIMA            NUMBER;
V_QTMEDIDA            NUMBER;
V_VALORITEM           NUMBER;
V_VALORVARIACAO       NUMBER;
V_IDELEMENTORAIZ      FCT_RELACMEDIDAPROPOSTA.IDELEMENTORAIZ%TYPE;
V_CDTPMEDIDAVARIAVEL  FCT_RELACMEDIDAPROPOSTA.CDTPMEDIDAVARIAVEL%TYPE;
V_QTMEDIDAVARIAVEL    FCT_RELACMEDIDAPROPOSTA.QTMEDIDAVARIAVEL%TYPE;
V_NRMEDICAOFATURAAUX  FCT_MEDICAOFATURA.NRMEDICAOFATURA%TYPE;

-- VARIAVEIS DE NEGOCIACAO DE CONTRATO APROVADO
V_VRNEGOCIADO        FLOAT;
V_NRPARCELASNEGCONTR FCT_PARCELASNEGCONTR.NRPARCELASNEGCONTR%TYPE;
V_VRPARCELANEGOCIA   FCT_PARCELASNEGCONTR.VRPARCELANEGOCIA%TYPE;
V_IDTIPONEGOCIA      FCT_NEGCONTRATO.IDTIPONEGOCIA%TYPE;


BEGIN

    FOR C_MEDICOESCALC IN (
        SELECT CASE WHEN NRAGRUPAMENTO > 0 THEN
                  NMAGRUPAMENTO
               ELSE
                  LISTAGG(NRCONTRATOFCT, '_') WITHIN GROUP (ORDER BY NRMEDICAOFATURA)
               END AS NRCONTRATOFCT,
               LISTAGG(NRSEQCONTRATO, '_') WITHIN GROUP (ORDER BY NRMEDICAOFATURA) AS NRSEQCONTRATO,
               LISTAGG(NRMEDICAOFATURA, ',') WITHIN GROUP (ORDER BY NRMEDICAOFATURA) AS NRMEDICAOFATURA,
               NRGRUPOFATURA,
               CDFILIALFATURA,
               NMFILIALFATURA,
               NRPARCFATURA,
               NMPARCFATURA,
               IDTPFATURA,
               IDSITUACAO,
               DTINICOMPET,
               DTFINCOMPET,
               DTLIMITEAPU,
               DTVENCIMENTO,
               NRDIASVENCIMENTO,
               QTDIASFATUVENC,
               IDATIVO,
               NRORG,
               CASE WHEN NRAGRUPAMENTO > 0 THEN
                  DSOBSAGRUPAMENTO
               ELSE
                  LISTAGG(DSREFERENCIACONT, ',') WITHIN GROUP (ORDER BY NRMEDICAOFATURA)
               END AS DSREFERENCIACONT,
               CDTIPOOPERFATURA,
               CDSERIENF,
               CDEMPRESA,
               CDINSCESTA,
               CDINSCMUNI,
               SUM(VRMEDICAO) AS VRMEDICAO,
               SUM(VRNEGCONTR) AS VRNEGCONTR,
               SUM(NVL(VRNEGCONTR, VRMEDICAO)) AS VRCONSIDERADO,
               CASE WHEN NRAGRUPAMENTO > 0 THEN
                   NRAGRUPAMENTO
               ELSE
                   NULL
               END AS NRAGRUPAMENTO
        FROM (
            SELECT CONT.NRCONTRATOFCT,
                   CONT.NRSEQCONTRATO,
                   MED.NRMEDICAOFATURA,
                   MED.NRGRUPOFATURA,
                   MED.CDFILIALFATURA,
                   FILIMED.NMFILIAL AS NMFILIALFATURA,
                   MED.NRPARCFATURA,
                   PARCMED.NMPRINCIPALPARC AS NMPARCFATURA,
                   'M' AS IDTPFATURA,
                   MED.IDSITUACAO,
                   MED.DTINICOMPET,
                   MED.DTFINCOMPET,
                   MED.DTLIMITEAPU,
                   MED.DTVENCIMENTO,
                   MED.NRDIASVENCIMENTO,
                   MED.QTDIASFATUVENC,
                   MED.IDATIVO,
                   MED.NRORG,
                   CONT.DSREFERENCIACONT,
                   MED.CDTIPOOPERFATURA,
                   MED.CDSERIENF,
                   MED.CDEMPRESA,
                   MED.CDINSCESTA,
                   MED.CDINSCMUNI,
                   MED.VRMEDICAO,
                   MED.VRNEGCONTR,
                   NVL(RAC.NRAGRUPAMENTO, 0-ROWNUM) AS NRAGRUPAMENTO,
                   AGRU.NMAGRUPAMENTO,
                   AGRU.DSOBSAGRUPAMENTO
              FROM FCT_MEDICAOFATURA MED
              LEFT JOIN FCT_CONTRATO CONT
                ON MED.NRSEQCONTRATO = CONT.NRSEQCONTRATO
               AND MED.NRORG         = CONT.NRORG
             INNER JOIN FILIAL FILIMED
                ON MED.CDFILIALFATURA = FILIMED.CDFILIAL
               AND MED.NRORG          = FILIMED.NRORG
             INNER JOIN PARCNEGOCIO PARCMED
                ON MED.NRPARCFATURA = PARCMED.NRPARCNEGOCIO
               AND MED.NRORG        = PARCMED.NRORG
              LEFT JOIN FCT_RELACAGRUPAMENTOCONT RAC
                ON MED.NRSEQCONTRATO = RAC.NRSEQCONTRATO
               AND MED.NRORG         = RAC.NRORG
              LEFT JOIN FCT_AGRUPAMENTO AGRU
                ON RAC.NRAGRUPAMENTO = AGRU.NRAGRUPAMENTO
               AND RAC.NRORG         = AGRU.NRORG
             WHERE MED.IDSITUACAO   = '3'
               AND MED.NRORG        = P_NRORG
               AND MED.NRPARCFATURA = P_NRPARCNEGOCIO
               AND CONT.IDATIVO     = 'S'
          )
         GROUP BY NRGRUPOFATURA,
                  CDFILIALFATURA,
                  NMFILIALFATURA,
                  NRPARCFATURA,
                  NMPARCFATURA,
                  IDTPFATURA,
                  IDSITUACAO,
                  DTINICOMPET,
                  DTFINCOMPET,
                  DTLIMITEAPU,
                  DTVENCIMENTO,
                  NRDIASVENCIMENTO,
                  QTDIASFATUVENC,
                  IDATIVO,
                  NRORG,
                  CDTIPOOPERFATURA,
                  CDSERIENF,
                  CDEMPRESA,
                  CDINSCESTA,
                  CDINSCMUNI,
                  NRAGRUPAMENTO,
                  NMAGRUPAMENTO,
                  DSOBSAGRUPAMENTO
    ) LOOP

        V_VRNEGOCIADO := C_MEDICOESCALC.VRNEGCONTR;

        IF (V_VRNEGOCIADO IS NULL AND C_MEDICOESCALC.NRAGRUPAMENTO IS NOT NULL) THEN

            BEGIN
                SELECT PARC.NRPARCELASNEGCONTR,
                       PARC.VRPARCELANEGOCIA,
                       NEG.IDTIPONEGOCIA
                  INTO V_NRPARCELASNEGCONTR,
                       V_VRPARCELANEGOCIA,
                       V_IDTIPONEGOCIA
                  FROM FCT_PARCELASNEGCONTR PARC
                 INNER JOIN FCT_NEGCONTRATO NEG
                    ON PARC.NRNEGCONTRATO = NEG.NRNEGCONTRATO
                 WHERE ( TRUNC(C_MEDICOESCALC.DTINICOMPET) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA)
                        OR TRUNC(C_MEDICOESCALC.DTFINCOMPET) BETWEEN TRUNC(PARC.DTINIPARCNEGOCIA) AND TRUNC(PARC.DTFIMPARCNEGOCIA) )
                   AND NEG.NRPARCNEGOCIO    = C_MEDICOESCALC.NRPARCFATURA
                   AND NEG.NRAGRUPAMENTO    = C_MEDICOESCALC.NRAGRUPAMENTO
                   AND NEG.CDTIPOOPERFATURA = C_MEDICOESCALC.CDTIPOOPERFATURA
                   AND NEG.CDSERIENF        = C_MEDICOESCALC.CDSERIENF
                   AND NEG.CDEMPRESA        = C_MEDICOESCALC.CDEMPRESA
                   AND NEG.CDINSCESTA       = C_MEDICOESCALC.CDINSCESTA
                   AND NEG.CDINSCMUNI       = C_MEDICOESCALC.CDINSCMUNI
                   AND NEG.NRORG            = P_NRORG
                   AND NEG.NRITEMOCONTRATO  IS NULL
                   AND NEG.IDATIVO          = 'S'
                   AND PARC.IDATIVO         = 'S';
            EXCEPTION WHEN NO_DATA_FOUND THEN
                V_NRPARCELASNEGCONTR := NULL;
                V_VRPARCELANEGOCIA   := NULL;
                V_IDTIPONEGOCIA      := NULL;
            END;

            IF (V_NRPARCELASNEGCONTR IS NOT NULL) THEN

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

                ELSIF (V_IDTIPONEGOCIA = 'DP') THEN
                    V_VRNEGOCIADO := C_MEDICOESCALC.VRMEDICAO - (C_MEDICOESCALC.VRMEDICAO * V_VRPARCELANEGOCIA / 100);

                ELSIF (V_IDTIPONEGOCIA = 'DV') THEN
                    V_VRNEGOCIADO := C_MEDICOESCALC.VRMEDICAO - V_VRPARCELANEGOCIA;

                ELSIF (V_IDTIPONEGOCIA = 'AP') THEN
                    V_VRNEGOCIADO := C_MEDICOESCALC.VRMEDICAO + (C_MEDICOESCALC.VRMEDICAO * V_VRPARCELANEGOCIA / 100);

                ELSIF (V_IDTIPONEGOCIA = 'AV') THEN
                    V_VRNEGOCIADO := C_MEDICOESCALC.VRMEDICAO + V_VRPARCELANEGOCIA;

                END IF;

                V_VRNEGOCIADO := ROUND(V_VRNEGOCIADO, 2);

                IF (V_VRNEGOCIADO < 0) THEN
                    V_VRNEGOCIADO := 0;
                END IF;

            END IF; --V_NRPARCELASNEGCONTR IS NOT NULL

        END IF;

        OUT_RECORD.NRCONTRATOFCT := C_MEDICOESCALC.NRCONTRATOFCT;
        OUT_RECORD.NRSEQCONTRATO := C_MEDICOESCALC.NRSEQCONTRATO;
        OUT_RECORD.NRMEDICAOFATURA := C_MEDICOESCALC.NRMEDICAOFATURA;
        OUT_RECORD.NRGRUPOFATURA := C_MEDICOESCALC.NRGRUPOFATURA;
        OUT_RECORD.CDFILIALFATURA := C_MEDICOESCALC.CDFILIALFATURA;
        OUT_RECORD.NMFILIALFATURA := C_MEDICOESCALC.NMFILIALFATURA;
        OUT_RECORD.NRPARCFATURA := C_MEDICOESCALC.NRPARCFATURA;
        OUT_RECORD.NMPARCFATURA := C_MEDICOESCALC.NMPARCFATURA;
        OUT_RECORD.IDTPFATURA := C_MEDICOESCALC.IDTPFATURA;
        OUT_RECORD.IDSITUACAO := C_MEDICOESCALC.IDSITUACAO;
        OUT_RECORD.DTINICOMPET := C_MEDICOESCALC.DTINICOMPET;
        OUT_RECORD.DTFINCOMPET := C_MEDICOESCALC.DTFINCOMPET;
        OUT_RECORD.DTLIMITEAPU := C_MEDICOESCALC.DTLIMITEAPU;
        OUT_RECORD.DTVENCIMENTO := C_MEDICOESCALC.DTVENCIMENTO;
        OUT_RECORD.NRDIASVENCIMENTO := C_MEDICOESCALC.NRDIASVENCIMENTO;
        OUT_RECORD.QTDIASFATUVENC := C_MEDICOESCALC.QTDIASFATUVENC;
        OUT_RECORD.PRECOMEDICAO := C_MEDICOESCALC.VRMEDICAO;
        OUT_RECORD.IDATIVO := C_MEDICOESCALC.IDATIVO;
        OUT_RECORD.NRORG := C_MEDICOESCALC.NRORG;
        OUT_RECORD.DTINCLUSAO := NULL;--C_MEDICOESCALC.DTINCLUSAO;
        OUT_RECORD.NRORGINCLUSAO := NULL;--C_MEDICOESCALC.NRORGINCLUSAO;
        OUT_RECORD.CDOPERINCLUSAO := NULL;--C_MEDICOESCALC.CDOPERINCLUSAO;
        OUT_RECORD.DTULTATU := NULL;--C_MEDICOESCALC.DTULTATU;
        OUT_RECORD.NRORGULTATU := NULL;--C_MEDICOESCALC.NRORGULTATU;
        OUT_RECORD.CDOPERULTATU := NULL;--C_MEDICOESCALC.CDOPERULTATU;
        OUT_RECORD.DSREFERENCIACONT := C_MEDICOESCALC.DSREFERENCIACONT;
        OUT_RECORD.NRMEDICAOFATURAAUX := NULL;
        OUT_RECORD.NRAGRUPAMENTO := C_MEDICOESCALC.NRAGRUPAMENTO;
        OUT_RECORD.VRNEGCONTR := V_VRNEGOCIADO;
        PIPE ROW (OUT_RECORD);

    END LOOP; --C_MEDICOESCALC

   /*FOR C_MEDICOES IN (SELECT CONT.NRCONTRATOFCT, CONT.NRSEQCONTRATO, MED.NRMEDICAOFATURA, MED.NRGRUPOFATURA, MED.CDFILIALFATURA,
                            FILIMED.NMFILIAL AS NMFILIALFATURA, MED.NRPARCFATURA, PARCMED.NMPRINCIPALPARC AS NMPARCFATURA,
                            'M' AS IDTPFATURA, MED.IDSITUACAO, MED.DTINICOMPET, MED.DTFINCOMPET, MED.DTLIMITEAPU,
                            MED.DTVENCIMENTO, MED.NRDIASVENCIMENTO, MED.QTDIASFATUVENC, MED.IDATIVO, MED.NRORG,
                            MED.DTINCLUSAO, MED.NRORGINCLUSAO, MED.CDOPERINCLUSAO, MED.DTULTATU, MED.NRORGULTATU,
                            MED.CDOPERULTATU,  CONT.DSREFERENCIACONT
                       FROM FCT_MEDICAOFATURA MED
                       LEFT JOIN FCT_CONTRATO CONT
                              ON MED.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                             AND MED.NRORG = CONT.NRORG
                      INNER JOIN FILIAL FILIMED
                              ON MED.CDFILIALFATURA = FILIMED.CDFILIAL
                             AND MED.NRORG = FILIMED.NRORG
                      INNER JOIN PARCNEGOCIO PARCMED
                              ON MED.NRPARCFATURA = PARCMED.NRPARCNEGOCIO
                             AND MED.NRORG = PARCMED.NRORG
                           WHERE MED.IDSITUACAO IN ('1', '2')
                             AND MED.NRORG = P_NRORG
                             AND MED.NRPARCFATURA = P_NRPARCNEGOCIO
   ) LOOP
       BEGIN
           SELECT ORC.NRSEQORCAMENTO,ORC.NRORCAMENTOMODELO,
                  NVL(REF.NRTIPOORCAMENTO, ORC.NRTIPOORCAMENTO) AS NRTIPOORCAMENTO
             INTO V_NRSEQORCAMENTO, V_NRORCAMODELO, V_ESCOPOFATURA
             FROM FCT_REFEORCACONT REF
            INNER JOIN FCT_ORCAMENTO ORC
               ON REF.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
              AND REF.NRORG          = ORC.NRORG
            WHERE REF.NRSEQCONTRATO = C_MEDICOES.NRSEQCONTRATO
              AND REF.NRORG         = P_NRORG;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN BEGIN
              V_NRSEQORCAMENTO := NULL;
              V_NRORCAMODELO := NULL;
              V_ESCOPOFATURA := NULL;
          END;
       END;
       IF (V_NRSEQORCAMENTO IS NOT NULL) THEN
            V_MEDICAO := 0;
            FOR C_ITMEDICAO IN (SELECT ITMED.NRITMEDICAOFATURA, ITMED.NRMEDICAOFATURA, ITMED.NRSEQCONTRATO,
                                       ITMED.NRITEMOCONTRATO, ITMED.CDSERVORCA, ITMED.CDPRODFATURA,
                                       ITMED.IDSITUACAO, ITMED.VRITEMCONT AS VRTOTITEMCONT
                                  FROM FCT_ITMEDICAOFATURA ITMED
                                 WHERE ITMED.NRMEDICAOFATURA = C_MEDICOES.NRMEDICAOFATURA
                                   AND ITMED.NRORG           = P_NRORG) LOOP
                V_VALORTOTALITEM := 0;
                V_VALORMINIMO := 0;
                FOR C_ITENSCONT IN (SELECT DISTINCT ITEM.CDTPMEDIDASERV, ITEM.CDTPMEDIDAVARIAVEL, ITEM.NRSEQCONTRATO,
                                       ITEM.CDSERVORCA, SERV.NMSERVORCA, ITEM.VRUNITITEMCONTTBLPRECO,
                                       ITEM.VRUNITITEMCONT, ITEM.IDELEMENTO AS IDELEMENTORAIZ, ITEM.NMITEMCONTRATO AS NMELEMENTO,
                                       DECODE(VARIACAO.IDMULTIPVARIACAO, 'N', ITEM.VRUNITITEMCONT, ITEM.VRUNITITEMCONT * QTMEDIDACONTR) AS VRTOTAL,
                                       ITNEGO.IDTPDESCONTO, ITNEGO.VRPERCDESCITEM, ITNEGO.VRDESCITEM,
                                       FCT_MEDVARMEDICAOFATURA.QTMEDIDAVARIAVEL, FCT_MEDVARMEDICAOFATURA.QTMEDIDAMEDICAO, FCT_MEDVARMEDICAOFATURA.QTFRANQUIA,
                                       VARIACAO.VRPRECOVARIACAO, ITEM.VRTOTITEMCONT AS VRTOTALVARIACAO,
                                       DECODE(NVL(VARIACAO.IDMULTIPVARIACAO, 'N'), 'S', 'Sim', 'Não') AS IDMULTIPVARIACAO,
                                       DECODE(NVL(VARIACAO.IDMULTIPVARIACAO, 'N'), 'N', ITEM.QTMEDIDACONTR, ITEM.VRUNITITEMCONTTBLPRECO / DECODE(VARIACAO.VRPRECOVARIACAO, 0 ,1, VARIACAO.VRPRECOVARIACAO)) AS QTMEDIDA
                                  FROM FCT_ITEMCONTRATO ITEM
                                 INNER JOIN FCT_SERVICOORCA SERV
                                    ON ITEM.CDSERVORCA = SERV.CDSERVORCA
                                   AND ITEM.NRORG     = SERV.NRORG
                                 INNER JOIN FCT_MEDVARMEDICAOFATURA
                                    ON ITEM.IDELEMENTO                         = FCT_MEDVARMEDICAOFATURA.IDELEMENTORAIZ
                                   AND ITEM.CDSERVORCA                         = FCT_MEDVARMEDICAOFATURA.CDSERVORCA
                                   AND FCT_MEDVARMEDICAOFATURA.NRMEDICAOFATURA = C_ITMEDICAO.NRMEDICAOFATURA
                                  LEFT JOIN FCT_VARPRECBASESERVCONT VARIACAO
                                    ON ITEM.NRSEQCONTRATO     = VARIACAO.NRSEQCONTRATO
                                   AND ITEM.NRORG              = VARIACAO.NRORG
                                   AND ITEM.CDSERVORCA         = VARIACAO.CDSERVORCA
                                   AND ITEM.CDTPMEDIDASERV     = VARIACAO.CDTPMEDIDASERV
                                   AND ITEM.CDTPMEDIDAVARIAVEL = VARIACAO.CDTPMEDIDAVARIAVEL
                                   AND (DECODE(FCT_MEDVARMEDICAOFATURA.QTMEDIDAVARIAVEL, 0, 1, FCT_MEDVARMEDICAOFATURA.QTMEDIDAVARIAVEL) BETWEEN VARIACAO.QTMEDIDAINIVARIACAO AND VARIACAO.QTMEDIDAFIMVARIACAO)
                                  LEFT JOIN FCT_ITNEGOCIACAOCONTRATO ITNEGO
                                    ON ITNEGO.NRITEMOCONTRATO = ITEM.NRITEMOCONTRATO
                                   AND ITNEGO.NRORG = ITEM.NRORG
                                 WHERE ITEM.IDELEMENTO IS NOT NULL
                                   AND ITEM.NRSEQCONTRATO  = C_MEDICOES.NRSEQCONTRATO
                                   AND ITEM.NRORG          = P_NRORG
                                   AND ITEM.CDSERVORCA     = C_ITMEDICAO.CDSERVORCA) LOOP
                    BEGIN
                       SELECT IDELEMENTORAIZ, CDTPMEDIDAVARIAVEL, NRMEDICAOFATURA,
                              CASE WHEN MAX (QTMEDIDAVALIDAOM) >  MAX (QTMEDIDAVARIAVEL)
                                   THEN MAX (QTMEDIDAVALIDAOM)
                                   ELSE MAX (QTMEDIDAVARIAVEL)END AS QTMEDIDAVARIAVEL
                         INTO V_IDELEMENTORAIZ, V_CDTPMEDIDAVARIAVEL, V_NRMEDICAOFATURAAUX, V_QTMEDIDAVARIAVEL
                         FROM FCT_MEDVARMEDICAOFATURA
                        WHERE FCT_MEDVARMEDICAOFATURA.NRMEDICAOFATURA = (SELECT MAX(NRMEDICAOFATURA)
                                                                           FROM FCT_MEDICAOFATURA
                                                                          WHERE NRSEQCONTRATO = C_MEDICOES.NRSEQCONTRATO
                                                                            AND NRPARCFATURA  = P_NRPARCNEGOCIO
                                                                            AND DTINICOMPET  <= SYSDATE)
                          AND FCT_MEDVARMEDICAOFATURA.CDTPMEDIDAVARIAVEL = C_ITENSCONT.CDTPMEDIDAVARIAVEL
                          AND FCT_MEDVARMEDICAOFATURA.IDELEMENTORAIZ = C_ITENSCONT.IDELEMENTORAIZ
                          AND FCT_MEDVARMEDICAOFATURA.NRORG = P_NRORG
                          GROUP BY IDELEMENTORAIZ, CDTPMEDIDAVARIAVEL, NRMEDICAOFATURA;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN BEGIN
                            V_IDELEMENTORAIZ := NULL;
                            V_CDTPMEDIDAVARIAVEL := NULL;
                            V_NRMEDICAOFATURAAUX := NULL;
                            V_QTMEDIDAVARIAVEL := NULL;
                        END;
                    END;
                    IF (V_QTMEDIDAVARIAVEL IS NOT NULL) THEN
                            V_QTMINIMA := V_QTMEDIDAVARIAVEL - C_ITENSCONT.QTFRANQUIA;
                            IF (V_QTMINIMA > C_ITENSCONT.QTMEDIDAMEDICAO) THEN
                                V_QTMEDIDA := V_QTMINIMA;
                                V_VALORMINIMO := 0;
                            ELSE
                                V_QTMEDIDA := C_ITENSCONT.QTMEDIDAMEDICAO;
                            END IF;
                    ELSE
                        V_QTMEDIDA := C_ITENSCONT.QTMEDIDAMEDICAO;
                    END IF;
                    V_VALORITEM := C_ITENSCONT.VRPRECOVARIACAO * C_ITENSCONT.QTMEDIDA;
                    V_VALORVARIACAO := V_VALORITEM;
                    IF (C_ITENSCONT.VRUNITITEMCONTTBLPRECO <>  C_ITENSCONT.VRUNITITEMCONT) THEN
                        IF (V_VALORVARIACAO < C_ITENSCONT.VRUNITITEMCONT) THEN
                            V_VALORITEM := C_ITENSCONT.VRUNITITEMCONT;
                            IF (C_ITENSCONT.IDMULTIPVARIACAO = 'Sim') THEN
                                V_VALORITEM :=  V_VALORITEM * V_QTMEDIDA;
                            ELSE
                                 V_VALORITEM :=  V_VALORITEM * C_ITENSCONT.QTMEDIDA;
                            END IF;
                        ELSE
                             V_VALORITEM := V_VALORVARIACAO;
                            IF (C_ITENSCONT.IDMULTIPVARIACAO = 'Sim') THEN
                                V_VALORITEM := V_VALORITEM * C_ITENSCONT.QTMEDIDAMEDICAO;
                            END IF;
                       END IF;
                    ELSE
                        V_VALORITEM := V_VALORVARIACAO;
                        IF (C_ITENSCONT.IDMULTIPVARIACAO = 'Sim') THEN
                            V_VALORITEM := V_VALORITEM * V_QTMEDIDA;
                        END IF;
                    END IF;
                    IF (C_ITENSCONT.IDTPDESCONTO = 'P') THEN
                        V_VALORITEM := V_VALORITEM - (V_VALORITEM * C_ITENSCONT.VRPERCDESCITEM / 100);
                    ELSE
                        IF (C_ITENSCONT.IDTPDESCONTO = 'V') THEN
                         V_VALORITEM := V_VALORITEM - C_ITENSCONT.VRDESCITEM;
                        END IF;
                    END IF;
                    V_VALORTOTALITEM := V_VALORTOTALITEM + V_VALORITEM;
                END LOOP;
                V_MEDICAO := V_MEDICAO + V_VALORTOTALITEM;
            END LOOP;
       ELSE
           V_MEDICAO := 0;
       END IF;

       OUT_RECORD.NRCONTRATOFCT := C_MEDICOES.NRCONTRATOFCT;
       OUT_RECORD.NRSEQCONTRATO := C_MEDICOES.NRSEQCONTRATO;
       OUT_RECORD.NRMEDICAOFATURA := C_MEDICOES.NRMEDICAOFATURA;
       OUT_RECORD.NRGRUPOFATURA := C_MEDICOES.NRGRUPOFATURA;
       OUT_RECORD.CDFILIALFATURA := C_MEDICOES.CDFILIALFATURA;
       OUT_RECORD.NMFILIALFATURA := C_MEDICOES.NMFILIALFATURA;
       OUT_RECORD.NRPARCFATURA := C_MEDICOES.NRPARCFATURA;
       OUT_RECORD.NMPARCFATURA := C_MEDICOES.NMPARCFATURA;
       OUT_RECORD.IDTPFATURA := C_MEDICOES.IDTPFATURA;
       OUT_RECORD.IDSITUACAO := C_MEDICOES.IDSITUACAO;
       OUT_RECORD.DTINICOMPET := C_MEDICOES.DTINICOMPET;
       OUT_RECORD.DTFINCOMPET := C_MEDICOES.DTFINCOMPET;
       OUT_RECORD.DTLIMITEAPU := C_MEDICOES.DTLIMITEAPU;
       OUT_RECORD.DTVENCIMENTO := C_MEDICOES.DTVENCIMENTO;
       OUT_RECORD.NRDIASVENCIMENTO := C_MEDICOES.NRDIASVENCIMENTO;
       OUT_RECORD.QTDIASFATUVENC := C_MEDICOES.QTDIASFATUVENC;
       OUT_RECORD.PRECOMEDICAO := V_MEDICAO;
       OUT_RECORD.IDATIVO := C_MEDICOES.IDATIVO;
       OUT_RECORD.NRORG := C_MEDICOES.NRORG;
       OUT_RECORD.DTINCLUSAO := C_MEDICOES.DTINCLUSAO;
       OUT_RECORD.NRORGINCLUSAO := C_MEDICOES.NRORGINCLUSAO;
       OUT_RECORD.CDOPERINCLUSAO := C_MEDICOES.CDOPERINCLUSAO;
       OUT_RECORD.DTULTATU := C_MEDICOES.DTULTATU;
       OUT_RECORD.NRORGULTATU := C_MEDICOES.NRORGULTATU;
       OUT_RECORD.CDOPERULTATU := C_MEDICOES.CDOPERULTATU;
       OUT_RECORD.DSREFERENCIACONT := C_MEDICOES.DSREFERENCIACONT;
       OUT_RECORD.NRMEDICAOFATURAAUX := V_NRMEDICAOFATURAAUX;
       PIPE ROW (OUT_RECORD);
   END LOOP;*/
   RETURN;
END;
/
