DROP TYPE FCT_CCUSTO_CONTRATO_TABLE
/

DROP TYPE FCT_CCUSTO_CONTRATO_TYPE
/

CREATE TYPE FCT_CCUSTO_CONTRATO_TYPE AS OBJECT (
    NRSEQCONTRATO      NUMBER,
    NRCONTRATOFCT      VARCHAR2(30),
    DTAPROVACAO        DATE,
    NRSEQORCAMENTO     NUMBER,
    NRORCAMENTO        VARCHAR2(30),
    DTACEITEORCA       DATE,
    NRTIPOORCAMENTO    NUMBER,
    NMTIPOORCAMENTO    VARCHAR2(100),
    IDTPFATURA         VARCHAR2(1),
    DSTPFATURA         VARCHAR2(100),
    IDSITUACAOCONTRATO VARCHAR2(1),
    NRPARCNEGOCIO      NUMBER,
    NMPRINCIPALPARC    VARCHAR2(250),
    NMSECUNDARIPARC    VARCHAR2(250),
    NRINSCRICAOPARC    VARCHAR2(20),
    NMITEMCONTRATO     VARCHAR2(250),
    CDSERVORCA         NUMBER,
    NMSERVORCA         VARCHAR2(100),
    IDELEMENTO         VARCHAR2(100),
    CDCENTCUST         VARCHAR2(4),
    NMCENTCUST         VARCHAR2(100),
    QTMEDIDAITEMCONT   FLOAT,
    QTMEDIDAVARIAVEL   FLOAT,
    CDTPMEDIDAVARIAVEL NUMBER,
    DSTPMEDIDAVARIAVEL VARCHAR2(400),
    VRTOTSERVORCA      FLOAT,
    VRTOTAL_ACR_DESC   FLOAT,
    IDDELPHI           VARCHAR2(1),
    DTINICOMPET        DATE,
    DTFINCOMPET        DATE,
    QTMEDIDAMEDICAO    FLOAT,
    VRITEMCONTCOMDESC  FLOAT,
    NRORG              NUMBER,
    MMD                VARCHAR2(1),
    DFE                VARCHAR2(1),
    PAG                VARCHAR2(1),
    REC                VARCHAR2(1),
    BCO                VARCHAR2(1),
    SUP                VARCHAR2(1),
    FIS                VARCHAR2(1),
    FAI                VARCHAR2(1),
    QFO                VARCHAR2(1),
    MEQ                VARCHAR2(1),
    DIE                VARCHAR2(1),
    CMP                VARCHAR2(1),
    ATE                VARCHAR2(1),
    BDL                VARCHAR2(1),
    OPL                VARCHAR2(1),
    AEV                VARCHAR2(1),
    SITE               VARCHAR2(1),
    WEB                VARCHAR2(1),
    MQU                VARCHAR2(1),
    FID                VARCHAR2(1),
    FSF                VARCHAR2(1),
    HOS                VARCHAR2(1),
    MER                VARCHAR2(1),
    PAH                VARCHAR2(1),
    DIH                VARCHAR2(1),
    AGL                VARCHAR2(1),
    CVI                VARCHAR2(1),
    MAC                VARCHAR2(1),
    SEM                VARCHAR2(1),
    INV                VARCHAR2(1),
    OPR                VARCHAR2(1),
    CLD                VARCHAR2(1),
    GNU                VARCHAR2(1),
    PLA                VARCHAR2(1),
    COC                VARCHAR2(1),
    FAC                VARCHAR2(1),
    ORE                VARCHAR2(1),
    MMN                VARCHAR2(1),
    AGE                VARCHAR2(1),
    DLV                VARCHAR2(1),
    DLW                VARCHAR2(1),
    GSQ                VARCHAR2(1),
    CTB                VARCHAR2(1),
    SCL                VARCHAR2(1),
    NCH                VARCHAR2(1),
    PDO                VARCHAR2(1),
    FCT                VARCHAR2(1),
    REL                VARCHAR2(1),
    DLA                VARCHAR2(1),
    DCA                VARCHAR2(1),
    DCO                VARCHAR2(1),
    FPG                VARCHAR2(1),
    GRA                VARCHAR2(1),
    TFC                VARCHAR2(1),
    EST                VARCHAR2(1),
    GPA                VARCHAR2(1),
    CDP                VARCHAR2(1),
    VND                VARCHAR2(1),
    FSL                VARCHAR2(1),
    ADM                VARCHAR2(1),
    FAM                VARCHAR2(1),
    GOP                VARCHAR2(1),
    SUV                VARCHAR2(1),
    TFL                VARCHAR2(1),
    SCM                VARCHAR2(1),
    FOS                VARCHAR2(1),
    MME                VARCHAR2(1),
    ZMT                VARCHAR2(1),
    APV                VARCHAR2(1),
    CDF                VARCHAR2(1),
    EXP                VARCHAR2(1),
    CUS                VARCHAR2(1),
    DIC                VARCHAR2(1),
    OPM                VARCHAR2(1),
    CRM                VARCHAR2(1),
    PDM                VARCHAR2(1),
    HRM                VARCHAR2(1),
    DFS                VARCHAR2(1),
    PED                VARCHAR2(1),
    QPR                VARCHAR2(1),
    GQL                VARCHAR2(1),
    PME                VARCHAR2(1),
    ORD                VARCHAR2(1),
    PCP                VARCHAR2(1),
    DSERRO             VARCHAR2(4000)
)
/

CREATE TYPE FCT_CCUSTO_CONTRATO_TABLE AS TABLE OF FCT_CCUSTO_CONTRATO_TYPE
/

CREATE OR REPLACE FUNCTION FCT_CCUSTO_CONTRATO_DELPHI (
    P_IDRETORNO VARCHAR2 DEFAULT 'T',
    P_NRSEQCONTRATO NUMBER DEFAULT NULL
)
RETURN FCT_CCUSTO_CONTRATO_TABLE PIPELINED
IS
    OUT_RECORD FCT_CCUSTO_CONTRATO_TYPE := FCT_CCUSTO_CONTRATO_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, 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, 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, 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, NULL, NULL);
    V_SOMA         FLOAT;
    V_DSERRO       VARCHAR2(4000);
    V_TEM_REGISTRO BOOLEAN;
    V_INDICE       NUMBER;

    TYPE CCUSTO_CONTRATO_REC IS RECORD (
        NRSEQCONTRATO      NUMBER,
        NRCONTRATOFCT      VARCHAR2(30),
        DTAPROVACAO        DATE,
        NRSEQORCAMENTO     NUMBER,
        NRORCAMENTO        VARCHAR2(30),
        DTACEITEORCA       DATE,
        NRTIPOORCAMENTO    NUMBER,
        NMTIPOORCAMENTO    VARCHAR2(100),
        IDTPFATURA         VARCHAR2(1),
        DSTPFATURA         VARCHAR2(100),
        IDSITUACAOCONTRATO VARCHAR2(1),
        NRPARCNEGOCIO      NUMBER,
        NMPRINCIPALPARC    VARCHAR2(250),
        NMSECUNDARIPARC    VARCHAR2(250),
        NRINSCRICAOPARC    VARCHAR2(20),
        NMITEMCONTRATO     VARCHAR2(250),
        CDSERVORCA         NUMBER,
        NMSERVORCA         VARCHAR2(100),
        IDELEMENTO         VARCHAR2(100),
        CDCENTCUST         VARCHAR2(4),
        NMCENTCUST         VARCHAR2(100),
        QTMEDIDACONTR      FLOAT,
        QTMEDIDAVARIAVEL   FLOAT,
        CDTPMEDIDAVARIAVEL NUMBER,
        DSTPMEDIDAVARIAVEL VARCHAR2(400),
        VRTOTSERVORCA      FLOAT,
        VRTOTAL_ACR_DESC   FLOAT,
        IDDELPHI           VARCHAR2(1),
        DTINICOMPET        DATE,
        DTFINCOMPET        DATE,
        QTMEDIDAMEDICAO    FLOAT,
        VRITEMCONTCOMDESC  FLOAT,
        DSERRO             VARCHAR2(4000)
    );

    TYPE CCUSTO_CONTRATO_TAB IS TABLE OF CCUSTO_CONTRATO_REC INDEX BY BINARY_INTEGER;
    V_CCUSTO_CONTRATO CCUSTO_CONTRATO_TAB;

BEGIN
    FOR C_CONTRATOS IN (
        SELECT NRSEQCONTRATO,
               NRCONTRATOFCT,
               CDCENTCUST,
               ROUND((SELECT SUM(VRTOTITEMCOMDESC)
                  FROM FCT_NEGOCIACAOCONTRATO
                 WHERE NRSEQCONTRATO = FCT_CONTRATO.NRSEQCONTRATO), 2) AS VRCONTRATO,
               (SELECT COUNT(*)
                  FROM FCT_TRABSERVCONTRATO
                 WHERE NRSEQCONTRATO = FCT_CONTRATO.NRSEQCONTRATO) AS QTTRAB,
               NRORG
          FROM FCT_CONTRATO
         WHERE IDATIVO = 'S'
           AND IDSITUACAOCONTRATO = 'A'
           AND NRSEQCONTRATO = NVL(P_NRSEQCONTRATO, NRSEQCONTRATO)
    ) LOOP

        IF (C_CONTRATOS.QTTRAB > 0) THEN

            V_DSERRO := NULL;
            V_SOMA := 0;
            V_INDICE := 1;

            BEGIN

                V_CCUSTO_CONTRATO.DELETE;

                FOR C_RELATORIO IN (
                    SELECT CONTRATOS.NRSEQCONTRATO,
                           CONTRATOS.NRCONTRATOFCT,
                           (SELECT MIN(DTAPROVCONTR)
                              FROM FCT_APROVACONTRATO
                             WHERE NRSEQCONTRATO = CONTRATOS.NRSEQCONTRATO) AS DTAPROVACAO,
                           CONTRATOS.NRSEQORCAMENTO,
                           CONTRATOS.NRORCAMENTO,
                           CONTRATOS.DTACEITEORCA,
                           CONTRATOS.NRTIPOORCAMENTO,
                           CONTRATOS.NMTIPOORCAMENTO,
                           CONTRATOS.IDTPFATURA,
                           DECODE(CONTRATOS.IDTPFATURA, 'P', 'Parcelamento', 'X', 'Periodico - Medicao', 'A', 'Periodico - Valor Fixo') AS DSTPFATURA,
                           CONTRATOS.IDSITUACAOCONTRATO,
                           CONTRATOS.NRPARCNEGOCIO,
                           CONTRATOS.NMPRINCIPALPARC,
                           CONTRATOS.NMSECUNDARIPARC,
                           CONTRATOS.NRINSCRICAOPARC,
                           CONTRATOS.NMITEMCONTRATO,
                           CONTRATOS.CDSERVORCA,
                           CONTRATOS.NMSERVORCA,
                           CONTRATOS.IDELEMENTO,
                           CONTRATOS.CDCENTCUST,
                           CONTRATOS.NMCENTCUST,
                           CONTRATOS.QTMEDIDACONTR,
                           CONTRATOS.CDTPMEDIDASERV,
                           CONTRATOS.DSTPMEDIDASERV,
                           CONTRATOS.QTMEDIDAVARIAVEL,
                           CONTRATOS.CDTPMEDIDAVARIAVEL,
                           CONTRATOS.DSTPMEDIDAVARIAVEL,
                           CONTRATOS.VRTOTSERVORCA,
                           CONTRATOS.VRACRESCIMO,
                           CONTRATOS.VRPERCRELATIVO,
                           CASE CONTRATOS.VRACRESCIMO
                               WHEN 0 THEN
                                   ROUND(
                                       CONTRATOS.VRTOTSERVORCA
                                   , 2)
                               ELSE
                                   ROUND(
                                       DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100))
                                   , 2)
                           END AS VRTOTAL_ACR,
                           CONTRATOS.VRPERCDESC,
                           CONTRATOS.VRPRECOVARIACAO,
                           CONTRATOS.VRUNITITEMCONTTBLPRECO,
                           CASE CONTRATOS.VRACRESCIMO
                               WHEN 0 THEN
                                   ROUND(
                                       CONTRATOS.VRTOTSERVORCA - (CONTRATOS.VRTOTSERVORCA * CONTRATOS.VRPERCDESC / 100)
                                   , 2)
                               ELSE
                                   ROUND(
                                       DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100)) - 
                                       (DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100))) *
                                       CONTRATOS.VRPERCDESC / 100
                                   , 2)
                           END AS VRTOTAL_ACR_DESC,
                           CONTRATOS.IDDELPHI,
                           MEDICAO.DTINICOMPET,
                           MEDICAO.DTFINCOMPET,
                           MEDICAO.QTMEDIDAMEDICAO,
                           MEDICAO.VRITEMCONTCOMDESC
                      FROM (
                        SELECT ITCONT.NRSEQCONTRATO,
                               CONT.NRCONTRATOFCT,
                               ORC.NRSEQORCAMENTO,
                               ORC.NRORCAMENTO,
                               ORC.DTACEITEORCA,
                               CONT.NRTIPOORCAMENTO,
                               ESCOPO.NMTIPOORCAMENTO,
                               NEG.IDTPFATURA,
                               CONT.IDSITUACAOCONTRATO,
                               CONT.NRPARCNEGOCIO,
                               PARC.NMPRINCIPALPARC,
                               PARC.NMSECUNDARIPARC,
                               PARC.NRINSCRICAOPARC,
                               ITCONT.NMITEMCONTRATO,
                               ITCONT.CDSERVORCA,
                               SERV.NMSERVORCA,
                               ITCONT.IDELEMENTO,
                               TRAB.CDCENTCUST,
                               CENTCUST.NMCENTCUST,
                               ITCONT.CDTPMEDIDASERV,
                               MEDIDA.DSTPMEDIDASERV,
                               ITCONT.QTMEDIDACONTR,
                               ITCONT.CDTPMEDIDAVARIAVEL,
                               MEDIDAVAR.DSTPMEDIDASERV AS DSTPMEDIDAVARIAVEL,
                               TRAB.VRTOTSERVORCA,
                               ITCONT.VRUNITITEMCONTTBLPRECO,
                               ITCONT.VRUNITITEMCONT,
                               ITCONT.VRTOTITEMCONT,
                               VARPREC.VRPRECOVARIACAO,
                               MEDVAR.QTMEDIDAVARIAVEL,
                               CASE
                                   WHEN ITCONT.VRUNITITEMCONTTBLPRECO > ITCONT.VRUNITITEMCONT THEN
                                       ITCONT.VRUNITITEMCONT - VARPREC.VRPRECOVARIACAO
                                   ELSE
                                       ITCONT.VRUNITITEMCONT - ITCONT.VRUNITITEMCONTTBLPRECO
                               END AS VRACRESCIMO,
                               CASE
                                   WHEN ITCONT.VRUNITITEMCONTTBLPRECO > ITCONT.VRUNITITEMCONT THEN
                                       DECODE(VARPREC.VRPRECOVARIACAO, 0, 1, TRAB.VRTOTSERVORCA) / DECODE(VARPREC.VRPRECOVARIACAO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELETOTAL), VARPREC.VRPRECOVARIACAO) * DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELEMENTOS), 1) * 100
                                   ELSE
                                       DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, 1, TRAB.VRTOTSERVORCA) / DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELETOTAL), ITCONT.VRUNITITEMCONTTBLPRECO) * DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELEMENTOS), 1) * 100
                               END AS VRPERCRELATIVO,
                               
                               DECODE(NVL(NEG.VRPERCDESCITEM, 0), 0, NVL(ITNEG.VRPERCDESCITEM, 0), NVL(NEG.VRPERCDESCITEM, 0)) AS VRPERCDESC,
                               CASE WHEN
                                  OMP.DSLINHAPRODUTO IS NOT NULL AND
                                  OMP.IDTPLINHAPRODUTO IS NOT NULL AND
                                  OMP.IDMODOPROC IS NOT NULL THEN
                                    'S'
                                ELSE
                                    'N'
                               END AS IDDELPHI,
                               TRAB.QTDELEMENTOS,
                               TRAB.QTDPRODUTOS
                          FROM FCT_ITEMCONTRATO ITCONT
                          JOIN FCT_CONTRATO CONT
                            ON ITCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                          LEFT JOIN FCT_REFEORCACONT REFE
                            ON CONT.NRSEQCONTRATO = REFE.NRSEQCONTRATO
                          LEFT JOIN FCT_ORCAMENTO ORC
                            ON REFE.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                          LEFT JOIN FCT_TIPOORCAMENTO ESCOPO
                            ON CONT.NRTIPOORCAMENTO = ESCOPO.NRTIPOORCAMENTO
                          JOIN PARCNEGOCIO PARC
                            ON CONT.NRPARCNEGOCIO = PARC.NRPARCNEGOCIO
                          JOIN FCT_SERVICOORCA SERV
                            ON ITCONT.CDSERVORCA = SERV.CDSERVORCA
                          JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                            ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                          JOIN FCT_NEGOCIACAOCONTRATO NEG
                            ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                          LEFT JOIN FCT_TIPOMEDIDASERV MEDIDA
                            ON ITCONT.CDTPMEDIDASERV = MEDIDA.CDTPMEDIDASERV
                          LEFT JOIN FCT_TIPOMEDIDASERV MEDIDAVAR
                            ON ITCONT.CDTPMEDIDAVARIAVEL = MEDIDAVAR.CDTPMEDIDASERV
                          LEFT JOIN FCT_SERVICOORCA ELEMENTO
                            ON ITCONT.IDELEMENTO = ELEMENTO.IDELEMENTO
                          LEFT JOIN FCT_RELACMEDIDACONTRATO MEDVAR
                            ON ITCONT.NRSEQCONTRATO      = MEDVAR.NRSEQCONTRATO
                           AND ITCONT.IDELEMENTO         = MEDVAR.IDELEMENTORAIZ
                           AND ITCONT.CDTPMEDIDAVARIAVEL = MEDVAR.CDTPMEDIDAVARIAVEL
                          LEFT JOIN (
                              SELECT DISTINCT NRSEQCONTRATO,
                                     CDSERVORCA,
                                     CDTPMEDIDASERV,
                                     CDTPMEDIDAVARIAVEL,
                                     QTMEDIDAINIVARIACAO,
                                     QTMEDIDAFIMVARIACAO,
                                     MAX(VRPRECOVARIACAO) AS VRPRECOVARIACAO,
                                     IDMULTIPVARIACAO
                                FROM FCT_VARPRECBASESERVCONT
                               WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                               GROUP BY NRSEQCONTRATO,
                                     CDSERVORCA,
                                     CDTPMEDIDASERV,
                                     CDTPMEDIDAVARIAVEL,
                                     QTMEDIDAINIVARIACAO,
                                     QTMEDIDAFIMVARIACAO,
                                     IDMULTIPVARIACAO
                          ) VARPREC
                            ON ITCONT.NRSEQCONTRATO      = VARPREC.NRSEQCONTRATO
                           AND ITCONT.CDSERVORCA         = VARPREC.CDSERVORCA
                           AND ITCONT.CDTPMEDIDAVARIAVEL = VARPREC.CDTPMEDIDAVARIAVEL
                           AND ITCONT.CDTPMEDIDASERV     = VARPREC.CDTPMEDIDASERV
                           AND MEDVAR.QTMEDIDAVARIAVEL   BETWEEN VARPREC.QTMEDIDAINIVARIACAO AND VARPREC.QTMEDIDAFIMVARIACAO
                          LEFT JOIN OM_PRODUTO OMP
                            ON ELEMENTO.IDTIPOELEMENTO = 'P'
                           AND REPLACE(ITCONT.IDELEMENTO, 'P_', '') = TO_CHAR(OMP.ID)
                          JOIN (
                                SELECT NRSEQCONTRATO,
                                       IDELEMENTORAIZ,
                                       CDSERVORCA,
                                       CDCENTCUST,
                                       DECODE(QTDPRODUTOS, 0, VRTOTSERVORCA, (VRTOTSERVORCA / QTDPRODUTOS / QTDPRODTOTAL * QTDPRODUTOS)) AS VRTOTSERVORCA,
                                       QTDELEMENTOS,
                                       QTDPRODUTOS,
                                       QTDELETOTAL,
                                       QTDPRODTOTAL
                                  FROM (
                                    SELECT NRSEQCONTRATO,
                                           IDELEMENTORAIZ,
                                           CDSERVORCA,
                                           CDCENTCUST,
                                           SUM(VRTOTSERVORCA) AS VRTOTSERVORCA,
                                           SUM(QTELEMENTOS) AS QTDELEMENTOS,
                                           SUM(QTPRODUTOS) AS QTDPRODUTOS,
                                           QTDELETOTAL,
                                           QTDPRODTOTAL
                                      FROM (
                                        SELECT TBL.*,
                                               SUM(QTELEMENTOS) OVER (PARTITION BY NRSEQCONTRATO, IDELEMENTORAIZ, CDSERVORCA) AS QTDELETOTAL,
                                               SUM(QTPRODUTOS) OVER (PARTITION BY NRSEQCONTRATO, IDELEMENTORAIZ, CDSERVORCA) AS QTDPRODTOTAL
                                          FROM (
                                            SELECT TRAB.NRSEQCONTRATO,
                                                   TRAB.IDELEMENTO,
                                                   TRAB.CDSERVORCA,
                                                   TRAB.QTSERVORCA,
                                                   TRAB.QTMEDSERVORCA,
                                                   TRAB.QTMEDIDAVARIAVEL,
                                                   TRAB.QTMEDIDACALC,
                                                   TRAB.VRUNITSERVORCA,
                                                   TRAB.VRTOTSERVORCA,
                                                   NVL(TRAB.CDCENTCUST, C_CONTRATOS.CDCENTCUST) AS CDCENTCUST,
                                                   RAIZ.IDELEMENTORAIZ,
                                                   0 AS QTELEMENTOS,
                                                   1 AS QTPRODUTOS
                                              FROM FCT_TRABSERVCONTRATO TRAB
                                              JOIN (SELECT TRAB.*,
                                                    CONNECT_BY_ROOT IDELEMENTO AS IDELEMENTORAIZ
                                                      FROM (
                                                        SELECT DISTINCT NRSEQCONTRATO,
                                                               IDELEMENTO,
                                                               IDELEMENTOPAI
                                                          FROM FCT_TRABSERVCONTRATO
                                                         WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      ) TRAB
                                                    CONNECT BY PRIOR IDELEMENTO = IDELEMENTOPAI
                                                      START WITH IDELEMENTO IN (SELECT DISTINCT IDELEMENTO
                                                                                  FROM FCT_ITEMCONTRATO
                                                                                 WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                                                   AND IDELEMENTO IS NOT NULL)) RAIZ
                                                ON TRAB.NRSEQCONTRATO = RAIZ.NRSEQCONTRATO
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTO
                                             WHERE TRAB.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                               AND TRAB.IDESCOLHIDO = 'S'
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTORAIZ
                                             UNION ALL
                                             SELECT DISTINCT TRAB.NRSEQCONTRATO,
                                                   TRAB.IDELEMENTO,
                                                   TRAB.CDSERVORCA,
                                                   TRAB.QTSERVORCA,
                                                   TRAB.QTMEDSERVORCA,
                                                   TRAB.QTMEDIDAVARIAVEL,
                                                   TRAB.QTMEDIDACALC,
                                                   TRAB.VRUNITSERVORCA,
                                                   TRAB.VRTOTSERVORCA,
                                                   NVL(TRAB.CDCENTCUST, C_CONTRATOS.CDCENTCUST) AS CDCENTCUST,
                                                   RAIZ.IDELEMENTORAIZ,
                                                   1 AS QTELEMENTOS,
                                                   0 AS QTPRODUTOS
                                              FROM FCT_TRABSERVCONTRATO TRAB
                                              JOIN (SELECT TRAB.*,
                                                    CONNECT_BY_ROOT IDELEMENTO AS IDELEMENTORAIZ
                                                      FROM (
                                                        SELECT DISTINCT NRSEQCONTRATO,
                                                               IDELEMENTO,
                                                               IDELEMENTOPAI
                                                          FROM FCT_TRABSERVCONTRATO
                                                         WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      ) TRAB
                                                    CONNECT BY PRIOR IDELEMENTO = IDELEMENTOPAI
                                                      START WITH IDELEMENTO IN (SELECT DISTINCT IDELEMENTO
                                                                                  FROM FCT_ITEMCONTRATO
                                                                                 WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                                                   AND IDELEMENTO IS NOT NULL)) RAIZ
                                                ON TRAB.NRSEQCONTRATO = RAIZ.NRSEQCONTRATO
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTO
                                             WHERE TRAB.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                               AND TRAB.IDESCOLHIDO = 'S'
                                               AND TRAB.IDELEMENTO <> RAIZ.IDELEMENTORAIZ
                                             ORDER BY CDSERVORCA, IDELEMENTO
                                        ) TBL
                                    )
                                    WHERE CDSERVORCA IS NOT NULL
                                    GROUP BY NRSEQCONTRATO,
                                        IDELEMENTORAIZ,
                                        CDSERVORCA,
                                        CDCENTCUST,
                                        QTDELETOTAL,
                                        QTDPRODTOTAL
                                   ORDER BY CDSERVORCA
                                  )
                          ) TRAB
                          ON ITCONT.NRSEQCONTRATO = TRAB.NRSEQCONTRATO
                         AND ITCONT.IDELEMENTO = TRAB.IDELEMENTORAIZ
                         AND ITCONT.CDSERVORCA = TRAB.CDSERVORCA
                        LEFT JOIN CENTCUST
                          ON TRAB.CDCENTCUST = CENTCUST.CDCENTCUST
                       WHERE ITCONT.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                         AND ITCONT.IDELEMENTO IS NOT NULL
                       ORDER BY ITCONT.CDSERVORCA,
                                ITCONT.IDELEMENTO DESC
                    ) CONTRATOS
                    LEFT JOIN (
                        SELECT MED.NRSEQCONTRATO,
                               MED.IDSITUACAO,
                               MED.DTINICOMPET,
                               MED.DTFINCOMPET,
                               MEDVAR.CDSERVORCA,
                               MEDVAR.IDELEMENTORAIZ,
                               MEDVAR.QTMEDIDAMEDICAO,
                               MEDVAR.VRITEMCONTCOMDESC
                          FROM FCT_MEDICAOFATURA MED
                          JOIN (
                              SELECT DISTINCT MV.CDSERVORCA,
                                     MV.IDELEMENTORAIZ,
                                     MV.QTMEDIDAMEDICAO,
                                     MV.VRITEMCONTCOMDESC,
                                     MV.NRMEDICAOFATURA
                                FROM FCT_MEDVARMEDICAOFATURA MV
                                JOIN FCT_MEDICAOFATURA MF
                                  ON MV.NRMEDICAOFATURA = MF.NRMEDICAOFATURA
                               WHERE MF.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                          ) MEDVAR
                            ON MED.NRMEDICAOFATURA = MEDVAR.NRMEDICAOFATURA
                         WHERE MED.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                           AND MED.DTINICOMPET IN (SELECT MAX(DTINICOMPET)
                                                     FROM FCT_MEDICAOFATURA
                                                    WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      AND IDSITUACAO IN ('3','4'))
                    ) MEDICAO
                    ON CONTRATOS.NRSEQCONTRATO = MEDICAO.NRSEQCONTRATO
                   AND CONTRATOS.CDSERVORCA = MEDICAO.CDSERVORCA
                   AND CONTRATOS.IDELEMENTO = MEDICAO.IDELEMENTORAIZ
                ) LOOP

                    V_SOMA := V_SOMA + C_RELATORIO.VRTOTAL_ACR_DESC;

                    V_CCUSTO_CONTRATO(V_INDICE).NRSEQCONTRATO := C_RELATORIO.NRSEQCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRCONTRATOFCT := C_RELATORIO.NRCONTRATOFCT;
                    V_CCUSTO_CONTRATO(V_INDICE).DTAPROVACAO := C_RELATORIO.DTAPROVACAO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRSEQORCAMENTO := C_RELATORIO.NRSEQORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRORCAMENTO := C_RELATORIO.NRORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).DTACEITEORCA := C_RELATORIO.DTACEITEORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).NRTIPOORCAMENTO := C_RELATORIO.NRTIPOORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).NMTIPOORCAMENTO := C_RELATORIO.NMTIPOORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).IDTPFATURA := C_RELATORIO.IDTPFATURA;
                    V_CCUSTO_CONTRATO(V_INDICE).DSTPFATURA := C_RELATORIO.DSTPFATURA;
                    V_CCUSTO_CONTRATO(V_INDICE).IDSITUACAOCONTRATO := C_RELATORIO.IDSITUACAOCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRPARCNEGOCIO := C_RELATORIO.NRPARCNEGOCIO;
                    V_CCUSTO_CONTRATO(V_INDICE).NMPRINCIPALPARC := C_RELATORIO.NMPRINCIPALPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NMSECUNDARIPARC := C_RELATORIO.NMSECUNDARIPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NRINSCRICAOPARC := C_RELATORIO.NRINSCRICAOPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NMITEMCONTRATO := C_RELATORIO.NMITEMCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).CDSERVORCA := C_RELATORIO.CDSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).NMSERVORCA := C_RELATORIO.NMSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).IDELEMENTO := C_RELATORIO.IDELEMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).CDCENTCUST := C_RELATORIO.CDCENTCUST;
                    V_CCUSTO_CONTRATO(V_INDICE).NMCENTCUST := C_RELATORIO.NMCENTCUST;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDACONTR := C_RELATORIO.QTMEDIDACONTR;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDAVARIAVEL := C_RELATORIO.QTMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).CDTPMEDIDAVARIAVEL := C_RELATORIO.CDTPMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).DSTPMEDIDAVARIAVEL := C_RELATORIO.DSTPMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).VRTOTSERVORCA := C_RELATORIO.VRTOTSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).VRTOTAL_ACR_DESC := C_RELATORIO.VRTOTAL_ACR_DESC;
                    V_CCUSTO_CONTRATO(V_INDICE).IDDELPHI := C_RELATORIO.IDDELPHI;
                    V_CCUSTO_CONTRATO(V_INDICE).DTINICOMPET := C_RELATORIO.DTINICOMPET;
                    V_CCUSTO_CONTRATO(V_INDICE).DTFINCOMPET := C_RELATORIO.DTFINCOMPET;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDAMEDICAO := C_RELATORIO.QTMEDIDAMEDICAO;
                    V_CCUSTO_CONTRATO(V_INDICE).VRITEMCONTCOMDESC := C_RELATORIO.VRITEMCONTCOMDESC;
                    V_CCUSTO_CONTRATO(V_INDICE).DSERRO := NULL;

                    V_INDICE := V_INDICE + 1;

                END LOOP; --C_RELATORIO

                IF (ABS(ROUND(V_SOMA, 2) - C_CONTRATOS.VRCONTRATO) > 2) THEN
                    V_DSERRO := 'Valor da soma dos itens rateados por centro de custo esta diferente do valor total do contrato (soma da negociacao de valores).';
                END IF;

            EXCEPTION WHEN OTHERS THEN
                --RAISE_APPLICATION_ERROR(-20000, 'CONTRATO: ' || C_CONTRATOS.NRCONTRATOFCT || ' (' || C_CONTRATOS.NRSEQCONTRATO || ') - ERRO: ' || SQLERRM);
                V_DSERRO := SUBSTR(SQLERRM, 1, 4000);
            END;

            V_TEM_REGISTRO := FALSE;
            FOR I IN 1..V_CCUSTO_CONTRATO.COUNT LOOP

                V_TEM_REGISTRO := TRUE;

                OUT_RECORD.MMD := NULL;
                OUT_RECORD.DFE := NULL;
                OUT_RECORD.PAG := NULL;
                OUT_RECORD.REC := NULL;
                OUT_RECORD.BCO := NULL;
                OUT_RECORD.SUP := NULL;
                OUT_RECORD.FIS := NULL;
                OUT_RECORD.FAI := NULL;
                OUT_RECORD.QFO := NULL;
                OUT_RECORD.MEQ := NULL;
                OUT_RECORD.DIE := NULL;
                OUT_RECORD.CMP := NULL;
                OUT_RECORD.ATE := NULL;
                OUT_RECORD.BDL := NULL;
                OUT_RECORD.OPL := NULL;
                OUT_RECORD.AEV := NULL;
                OUT_RECORD.SITE := NULL;
                OUT_RECORD.WEB := NULL;
                OUT_RECORD.MQU := NULL;
                OUT_RECORD.FID := NULL;
                OUT_RECORD.FSF := NULL;
                OUT_RECORD.HOS := NULL;
                OUT_RECORD.MER := NULL;
                OUT_RECORD.PAH := NULL;
                OUT_RECORD.DIH := NULL;
                OUT_RECORD.AGL := NULL;
                OUT_RECORD.CVI := NULL;
                OUT_RECORD.MAC := NULL;
                OUT_RECORD.SEM := NULL;
                OUT_RECORD.INV := NULL;
                OUT_RECORD.OPR := NULL;
                OUT_RECORD.CLD := NULL;
                OUT_RECORD.GNU := NULL;
                OUT_RECORD.PLA := NULL;
                OUT_RECORD.COC := NULL;
                OUT_RECORD.FAC := NULL;
                OUT_RECORD.ORE := NULL;
                OUT_RECORD.MMN := NULL;
                OUT_RECORD.AGE := NULL;
                OUT_RECORD.DLV := NULL;
                OUT_RECORD.DLW := NULL;
                OUT_RECORD.GSQ := NULL;
                OUT_RECORD.CTB := NULL;
                OUT_RECORD.SCL := NULL;
                OUT_RECORD.NCH := NULL;
                OUT_RECORD.PDO := NULL;
                OUT_RECORD.FCT := NULL;
                OUT_RECORD.REL := NULL;
                OUT_RECORD.DLA := NULL;
                OUT_RECORD.DCA := NULL;
                OUT_RECORD.DCO := NULL;
                OUT_RECORD.FPG := NULL;
                OUT_RECORD.GRA := NULL;
                OUT_RECORD.TFC := NULL;
                OUT_RECORD.EST := NULL;
                OUT_RECORD.GPA := NULL;
                OUT_RECORD.CDP := NULL;
                OUT_RECORD.VND := NULL;
                OUT_RECORD.FSL := NULL;
                OUT_RECORD.ADM := NULL;
                OUT_RECORD.FAM := NULL;
                OUT_RECORD.GOP := NULL;
                OUT_RECORD.SUV := NULL;
                OUT_RECORD.TFL := NULL;
                OUT_RECORD.SCM := NULL;
                OUT_RECORD.FOS := NULL;
                OUT_RECORD.MME := NULL;
                OUT_RECORD.ZMT := NULL;
                OUT_RECORD.APV := NULL;
                OUT_RECORD.CDF := NULL;
                OUT_RECORD.EXP := NULL;
                OUT_RECORD.CUS := NULL;
                OUT_RECORD.DIC := NULL;
                OUT_RECORD.OPM := NULL;
                OUT_RECORD.CRM := NULL;
                OUT_RECORD.PDM := NULL;
                OUT_RECORD.HRM := NULL;
                OUT_RECORD.DFS := NULL;
                OUT_RECORD.PED := NULL;
                OUT_RECORD.QPR := NULL;
                OUT_RECORD.GQL := NULL;
                OUT_RECORD.PME := NULL;
                OUT_RECORD.ORD := NULL;
                OUT_RECORD.PCP := NULL;
                
                IF (P_IDRETORNO = 'T' OR
                    (P_IDRETORNO = 'O' AND V_DSERRO IS NULL) OR
                    (P_IDRETORNO = 'E' AND V_DSERRO IS NOT NULL)) THEN

                    IF (V_CCUSTO_CONTRATO(I).IDDELPHI = 'S') THEN

                        FOR C_ELEMENTOS IN (
                            SELECT DISTINCT ELE.IDELEMENTO,
                                   OPE.CDSISTEMA
                              FROM FCT_TRABSERVCONTRATO ELE
                              JOIN OM_PRODUTO_ELEMENTO OPE
                                ON REPLACE(ELE.IDELEMENTOPAI, 'P_', '') = TO_CHAR(OPE.NRPRODUTO_ID)
                               AND REPLACE(ELE.IDELEMENTO, ELE.IDELEMENTOPAI || '_M_', '') = OPE.UNIQUE_ID
                             WHERE ELE.NRSEQCONTRATO = V_CCUSTO_CONTRATO(I).NRSEQCONTRATO
                               AND ELE.IDESCOLHIDO = 'S'
                               AND ELE.IDELEMENTOPAI IS NOT NULL
                        ) LOOP

                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MMD') THEN
                                OUT_RECORD.MMD := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DFE') THEN
                                OUT_RECORD.DFE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PAG') THEN
                                OUT_RECORD.PAG := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_REC') THEN
                                OUT_RECORD.REC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_BCO') THEN
                                OUT_RECORD.BCO := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SUP') THEN
                                OUT_RECORD.SUP := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FIS') THEN
                                OUT_RECORD.FIS := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FAI') THEN
                                OUT_RECORD.FAI := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_QFO') THEN
                                OUT_RECORD.QFO := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MEQ') THEN
                                OUT_RECORD.MEQ := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DIE') THEN
                                OUT_RECORD.DIE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CMP') THEN
                                OUT_RECORD.CMP := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_ATE') THEN
                                OUT_RECORD.ATE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_BDL') THEN
                                OUT_RECORD.BDL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_OPL') THEN
                                OUT_RECORD.OPL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_AEV') THEN
                                OUT_RECORD.AEV := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SITE') THEN
                                OUT_RECORD.SITE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_WEB') THEN
                                OUT_RECORD.WEB := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MQU') THEN
                                OUT_RECORD.MQU := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'FID_WEB') THEN
                                OUT_RECORD.FID := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FSF') THEN
                                OUT_RECORD.FSF := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_HOS') THEN
                                OUT_RECORD.HOS := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MER') THEN
                                OUT_RECORD.MER := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PAH') THEN
                                OUT_RECORD.PAH := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DIH') THEN
                                OUT_RECORD.DIH := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_AGL') THEN
                                OUT_RECORD.AGL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CVI') THEN
                                OUT_RECORD.CVI := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MAC') THEN
                                OUT_RECORD.MAC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SEM') THEN
                                OUT_RECORD.SEM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_INV') THEN
                                OUT_RECORD.INV := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_OPR') THEN
                                OUT_RECORD.OPR := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CLD') THEN
                                OUT_RECORD.CLD := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GNU') THEN
                                OUT_RECORD.GNU := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PLA') THEN
                                OUT_RECORD.PLA := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_COC') THEN
                                OUT_RECORD.COC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FAC') THEN
                                OUT_RECORD.FAC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_ORE') THEN
                                OUT_RECORD.ORE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MMN') THEN
                                OUT_RECORD.MMN := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_AGE') THEN
                                OUT_RECORD.AGE := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DLV') THEN
                                OUT_RECORD.DLV := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'DLW_WEB') THEN
                                OUT_RECORD.DLW := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GSQ') THEN
                                OUT_RECORD.GSQ := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA IN ('WEB_CTB', 'ALI_CTB')) THEN
                                OUT_RECORD.CTB := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SCL') THEN
                                OUT_RECORD.SCL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB-NCH') THEN
                                OUT_RECORD.NCH := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PDO') THEN
                                OUT_RECORD.PDO := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FCT') THEN
                                OUT_RECORD.FCT := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_REL') THEN
                                OUT_RECORD.REL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'DLA_WEB') THEN
                                OUT_RECORD.DLA := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB-DCA') THEN
                                OUT_RECORD.DCA := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB-DCO') THEN
                                OUT_RECORD.DCO := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WIN_FPG') THEN
                                OUT_RECORD.FPG := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GRA') THEN
                                OUT_RECORD.GRA := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_TFC') THEN
                                OUT_RECORD.TFC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_EST') THEN
                                OUT_RECORD.EST := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GPA') THEN
                                OUT_RECORD.GPA := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CDP') THEN
                                OUT_RECORD.CDP := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_VND') THEN
                                OUT_RECORD.VND := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FSL') THEN
                                OUT_RECORD.FSL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_ADM') THEN
                                OUT_RECORD.ADM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FAM') THEN
                                OUT_RECORD.FAM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GOP') THEN
                                OUT_RECORD.GOP := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SUV') THEN
                                OUT_RECORD.SUV := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_TFL') THEN
                                OUT_RECORD.TFL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_SCM') THEN
                                OUT_RECORD.SCM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_FOS') THEN
                                OUT_RECORD.FOS := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_MME') THEN
                                OUT_RECORD.MME := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB-ZMT') THEN
                                OUT_RECORD.ZMT := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_APV') THEN
                                OUT_RECORD.APV := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CDF') THEN
                                OUT_RECORD.CDF := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_EXP') THEN
                                OUT_RECORD.EXP := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CUS') THEN
                                OUT_RECORD.CUS := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DIC') THEN
                                OUT_RECORD.DIC := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_OPM') THEN
                                OUT_RECORD.OPM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_CRM') THEN
                                OUT_RECORD.CRM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PDM') THEN
                                OUT_RECORD.PDM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_HRM') THEN
                                OUT_RECORD.HRM := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_DFS') THEN
                                OUT_RECORD.DFS := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PED') THEN
                                OUT_RECORD.PED := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_QPR') THEN
                                OUT_RECORD.QPR := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_GQL') THEN
                                OUT_RECORD.GQL := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PME') THEN
                                OUT_RECORD.PME := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB-ORD') THEN
                                OUT_RECORD.ORD := 'X';
                            END IF;
                            IF (C_ELEMENTOS.CDSISTEMA = 'WEB_PCP') THEN
                                OUT_RECORD.PCP := 'X';
                            END IF;

                        END LOOP;

                    END IF;

                    OUT_RECORD.NRSEQCONTRATO := V_CCUSTO_CONTRATO(I).NRSEQCONTRATO;
                    OUT_RECORD.NRCONTRATOFCT := V_CCUSTO_CONTRATO(I).NRCONTRATOFCT;
                    OUT_RECORD.DTAPROVACAO := V_CCUSTO_CONTRATO(I).DTAPROVACAO;
                    OUT_RECORD.NRSEQORCAMENTO := V_CCUSTO_CONTRATO(I).NRSEQORCAMENTO;
                    OUT_RECORD.NRORCAMENTO := V_CCUSTO_CONTRATO(I).NRORCAMENTO;
                    OUT_RECORD.DTACEITEORCA := V_CCUSTO_CONTRATO(I).DTACEITEORCA;
                    OUT_RECORD.NRTIPOORCAMENTO := V_CCUSTO_CONTRATO(I).NRTIPOORCAMENTO;
                    OUT_RECORD.NMTIPOORCAMENTO := V_CCUSTO_CONTRATO(I).NMTIPOORCAMENTO;
                    OUT_RECORD.IDTPFATURA := V_CCUSTO_CONTRATO(I).IDTPFATURA;
                    OUT_RECORD.DSTPFATURA := V_CCUSTO_CONTRATO(I).DSTPFATURA;
                    OUT_RECORD.IDSITUACAOCONTRATO := V_CCUSTO_CONTRATO(I).IDSITUACAOCONTRATO;
                    OUT_RECORD.NRPARCNEGOCIO := V_CCUSTO_CONTRATO(I).NRPARCNEGOCIO;
                    OUT_RECORD.NMPRINCIPALPARC := V_CCUSTO_CONTRATO(I).NMPRINCIPALPARC;
                    OUT_RECORD.NMSECUNDARIPARC := V_CCUSTO_CONTRATO(I).NMSECUNDARIPARC;
                    OUT_RECORD.NRINSCRICAOPARC := V_CCUSTO_CONTRATO(I).NRINSCRICAOPARC;
                    OUT_RECORD.NMITEMCONTRATO := V_CCUSTO_CONTRATO(I).NMITEMCONTRATO;
                    OUT_RECORD.CDSERVORCA := V_CCUSTO_CONTRATO(I).CDSERVORCA;
                    OUT_RECORD.NMSERVORCA := V_CCUSTO_CONTRATO(I).NMSERVORCA;
                    OUT_RECORD.IDELEMENTO := V_CCUSTO_CONTRATO(I).IDELEMENTO;
                    OUT_RECORD.CDCENTCUST := V_CCUSTO_CONTRATO(I).CDCENTCUST;
                    OUT_RECORD.NMCENTCUST := V_CCUSTO_CONTRATO(I).NMCENTCUST;
                    OUT_RECORD.QTMEDIDAITEMCONT := V_CCUSTO_CONTRATO(I).QTMEDIDACONTR;
                    OUT_RECORD.QTMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).QTMEDIDAVARIAVEL;
                    OUT_RECORD.CDTPMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).CDTPMEDIDAVARIAVEL;
                    OUT_RECORD.DSTPMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).DSTPMEDIDAVARIAVEL;
                    OUT_RECORD.VRTOTSERVORCA := V_CCUSTO_CONTRATO(I).VRTOTSERVORCA;
                    OUT_RECORD.VRTOTAL_ACR_DESC := V_CCUSTO_CONTRATO(I).VRTOTAL_ACR_DESC;
                    OUT_RECORD.IDDELPHI := V_CCUSTO_CONTRATO(I).IDDELPHI;
                    OUT_RECORD.DTINICOMPET := V_CCUSTO_CONTRATO(I).DTINICOMPET;
                    OUT_RECORD.DTFINCOMPET := V_CCUSTO_CONTRATO(I).DTFINCOMPET;
                    OUT_RECORD.QTMEDIDAMEDICAO := V_CCUSTO_CONTRATO(I).QTMEDIDAMEDICAO;
                    OUT_RECORD.VRITEMCONTCOMDESC := V_CCUSTO_CONTRATO(I).VRITEMCONTCOMDESC;
                    OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                    OUT_RECORD.DSERRO := V_DSERRO;
                    PIPE ROW (OUT_RECORD);

                END IF;

            END LOOP;

            IF (NOT V_TEM_REGISTRO AND P_IDRETORNO IN ('T', 'E')) THEN

                OUT_RECORD.NRSEQCONTRATO := C_CONTRATOS.NRSEQCONTRATO;
                OUT_RECORD.NRCONTRATOFCT := C_CONTRATOS.NRCONTRATOFCT;
                OUT_RECORD.DTAPROVACAO := NULL;
                OUT_RECORD.NRSEQORCAMENTO := NULL;
                OUT_RECORD.NRORCAMENTO := NULL;
                OUT_RECORD.DTACEITEORCA := NULL;
                OUT_RECORD.NRTIPOORCAMENTO := NULL;
                OUT_RECORD.NMTIPOORCAMENTO := NULL;
                OUT_RECORD.IDTPFATURA := NULL;
                OUT_RECORD.DSTPFATURA := NULL;
                OUT_RECORD.IDSITUACAOCONTRATO := NULL;
                OUT_RECORD.NRPARCNEGOCIO := NULL;
                OUT_RECORD.NMPRINCIPALPARC := NULL;
                OUT_RECORD.NMSECUNDARIPARC := NULL;
                OUT_RECORD.NRINSCRICAOPARC := NULL;
                OUT_RECORD.NMITEMCONTRATO := NULL;
                OUT_RECORD.CDSERVORCA := NULL;
                OUT_RECORD.NMSERVORCA := NULL;
                OUT_RECORD.IDELEMENTO := NULL;
                OUT_RECORD.CDCENTCUST := NULL;
                OUT_RECORD.NMCENTCUST := NULL;
                OUT_RECORD.QTMEDIDAITEMCONT := NULL;
                OUT_RECORD.QTMEDIDAVARIAVEL := NULL;
                OUT_RECORD.CDTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.DSTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.VRTOTSERVORCA := NULL;
                OUT_RECORD.VRTOTAL_ACR_DESC := NULL;
                OUT_RECORD.IDDELPHI := NULL;
                OUT_RECORD.DTINICOMPET := NULL;
                OUT_RECORD.DTFINCOMPET := NULL;
                OUT_RECORD.QTMEDIDAMEDICAO := NULL;
                OUT_RECORD.VRITEMCONTCOMDESC := NULL;
                OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                OUT_RECORD.DSERRO := NVL(V_DSERRO, 'Consulta nao retornou nenhum item para o contrato.');
                PIPE ROW (OUT_RECORD);

            END IF;

        ELSE

            V_TEM_REGISTRO := FALSE;

            FOR C_RELATORIO IN (
                SELECT CONT.NRSEQCONTRATO,
                       CONT.NRCONTRATOFCT,
                       (SELECT MIN(DTAPROVCONTR)
                          FROM FCT_APROVACONTRATO
                         WHERE NRSEQCONTRATO = CONT.NRSEQCONTRATO) AS DTAPROVACAO,
                       ORC.NRSEQORCAMENTO,
                       ORC.NRORCAMENTO,
                       ORC.DTACEITEORCA,
                       CONT.NRTIPOORCAMENTO,
                       ESCOPO.NMTIPOORCAMENTO,
                       NEG.IDTPFATURA,
                       DECODE(NEG.IDTPFATURA, 'P', 'Parcelamento', 'X', 'Periodico - Medicao', 'A', 'Periodico - Valor Fixo') AS DSTPFATURA,
                       CONT.IDSITUACAOCONTRATO,
                       CONT.NRPARCNEGOCIO,
                       PARC.NMPRINCIPALPARC,
                       PARC.NMSECUNDARIPARC,
                       PARC.NRINSCRICAOPARC,
                       ITCONT.NMITEMCONTRATO,
                       ITCONT.CDSERVORCA,
                       SERV.NMSERVORCA,
                       ITCONT.IDELEMENTO,
                       CONT.CDCENTCUST,
                       CENTCUST.NMCENTCUST,
                       ITCONT.QTMEDIDACONTR,
                       ITCONT.CDTPMEDIDASERV,
                       MEDIDA.DSTPMEDIDASERV,
                       ITCONT.QTMEDIDACONTR AS QTMEDIDAVARIAVEL,
                       ITCONT.CDTPMEDIDAVARIAVEL,
                       MEDIDAVAR.DSTPMEDIDASERV AS DSTPMEDIDAVARIAVEL,
                       ITCONT.VRTOTITEMCONT AS VRTOTSERVORCA,
                       DECODE(NVL(ITNEG.VRPERCDESCITEM, 0), 0, DECODE(NVL(NEG.VRPERCDESCITEM, 0), 0, ITCONT.VRTOTITEMCONT, ITCONT.VRTOTITEMCONT - (ITCONT.VRTOTITEMCONT * NVL(NEG.VRPERCDESCITEM, 0) / 100)), ITNEG.VRTOTITEMCOMDESC) AS VRTOTAL_ACR_DESC,
                       'N' AS IDDELPHI,
                       MEDICAO.DTINICOMPET,
                       MEDICAO.DTFINCOMPET,
                       MEDICAO.QTMEDIDAMEDICAO,
                       MEDICAO.VRITEMCONTCOMDESC
                  FROM FCT_ITEMCONTRATO ITCONT
                  JOIN FCT_CONTRATO CONT
                    ON ITCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                  LEFT JOIN FCT_REFEORCACONT REFE
                    ON CONT.NRSEQCONTRATO = REFE.NRSEQCONTRATO
                  LEFT JOIN FCT_ORCAMENTO ORC
                    ON REFE.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                  LEFT JOIN FCT_TIPOORCAMENTO ESCOPO
                    ON CONT.NRTIPOORCAMENTO = ESCOPO.NRTIPOORCAMENTO
                  JOIN PARCNEGOCIO PARC
                    ON CONT.NRPARCNEGOCIO = PARC.NRPARCNEGOCIO
                  JOIN FCT_SERVICOORCA SERV
                    ON ITCONT.CDSERVORCA = SERV.CDSERVORCA
                  JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                    ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                  JOIN FCT_NEGOCIACAOCONTRATO NEG
                    ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                  LEFT JOIN FCT_TIPOMEDIDASERV MEDIDA
                    ON ITCONT.CDTPMEDIDASERV = MEDIDA.CDTPMEDIDASERV
                  LEFT JOIN FCT_TIPOMEDIDASERV MEDIDAVAR
                    ON ITCONT.CDTPMEDIDAVARIAVEL = MEDIDAVAR.CDTPMEDIDASERV
                  LEFT JOIN CENTCUST
                    ON CONT.CDCENTCUST = CENTCUST.CDCENTCUST
                  LEFT JOIN (
                        SELECT MED.NRSEQCONTRATO,
                               MED.IDSITUACAO,
                               MED.DTINICOMPET,
                               MED.DTFINCOMPET,
                               MEDVAR.CDSERVORCA,
                               MEDVAR.QTMEDIDAMEDICAO,
                               MEDVAR.VRITEMCONTCOMDESC
                          FROM FCT_MEDICAOFATURA MED
                          JOIN (
                              SELECT DISTINCT MV.CDSERVORCA,
                                     MV.QTMEDIDAMEDICAO,
                                     MV.VRITEMCONTCOMDESC,
                                     MV.NRMEDICAOFATURA
                                FROM FCT_MEDVARMEDICAOFATURA MV
                                JOIN FCT_MEDICAOFATURA MF
                                  ON MV.NRMEDICAOFATURA = MF.NRMEDICAOFATURA
                               WHERE MF.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                 AND MV.IDELEMENTORAIZ IS NULL
                          ) MEDVAR
                            ON MED.NRMEDICAOFATURA = MEDVAR.NRMEDICAOFATURA
                         WHERE MED.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                           AND MED.DTINICOMPET IN (SELECT MAX(DTINICOMPET)
                                                     FROM FCT_MEDICAOFATURA
                                                    WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      AND IDSITUACAO IN ('3','4'))
                    ) MEDICAO
                    ON ITCONT.NRSEQCONTRATO = MEDICAO.NRSEQCONTRATO
                   AND ITCONT.CDSERVORCA = MEDICAO.CDSERVORCA
                 WHERE ITCONT.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
            ) LOOP

                V_TEM_REGISTRO := TRUE;

                IF (P_IDRETORNO IN ('T', 'O')) THEN

                    OUT_RECORD.NRSEQCONTRATO := C_RELATORIO.NRSEQCONTRATO;
                    OUT_RECORD.NRCONTRATOFCT := C_RELATORIO.NRCONTRATOFCT;
                    OUT_RECORD.DTAPROVACAO := C_RELATORIO.DTAPROVACAO;
                    OUT_RECORD.NRSEQORCAMENTO := C_RELATORIO.NRSEQORCAMENTO;
                    OUT_RECORD.NRORCAMENTO := C_RELATORIO.NRORCAMENTO;
                    OUT_RECORD.DTACEITEORCA := C_RELATORIO.DTACEITEORCA;
                    OUT_RECORD.NRTIPOORCAMENTO := C_RELATORIO.NRTIPOORCAMENTO;
                    OUT_RECORD.NMTIPOORCAMENTO := C_RELATORIO.NMTIPOORCAMENTO;
                    OUT_RECORD.IDTPFATURA := C_RELATORIO.IDTPFATURA;
                    OUT_RECORD.DSTPFATURA := C_RELATORIO.DSTPFATURA;
                    OUT_RECORD.IDSITUACAOCONTRATO := C_RELATORIO.IDSITUACAOCONTRATO;
                    OUT_RECORD.NRPARCNEGOCIO := C_RELATORIO.NRPARCNEGOCIO;
                    OUT_RECORD.NMPRINCIPALPARC := C_RELATORIO.NMPRINCIPALPARC;
                    OUT_RECORD.NMSECUNDARIPARC := C_RELATORIO.NMSECUNDARIPARC;
                    OUT_RECORD.NRINSCRICAOPARC := C_RELATORIO.NRINSCRICAOPARC;
                    OUT_RECORD.NMITEMCONTRATO := C_RELATORIO.NMITEMCONTRATO;
                    OUT_RECORD.CDSERVORCA := C_RELATORIO.CDSERVORCA;
                    OUT_RECORD.NMSERVORCA := C_RELATORIO.NMSERVORCA;
                    OUT_RECORD.IDELEMENTO := C_RELATORIO.IDELEMENTO;
                    OUT_RECORD.CDCENTCUST := C_RELATORIO.CDCENTCUST;
                    OUT_RECORD.NMCENTCUST := C_RELATORIO.NMCENTCUST;
                    OUT_RECORD.QTMEDIDAITEMCONT := C_RELATORIO.QTMEDIDACONTR;
                    OUT_RECORD.QTMEDIDAVARIAVEL := C_RELATORIO.QTMEDIDAVARIAVEL;
                    OUT_RECORD.CDTPMEDIDAVARIAVEL := C_RELATORIO.CDTPMEDIDAVARIAVEL;
                    OUT_RECORD.DSTPMEDIDAVARIAVEL := C_RELATORIO.DSTPMEDIDAVARIAVEL;
                    OUT_RECORD.VRTOTSERVORCA := C_RELATORIO.VRTOTSERVORCA;
                    OUT_RECORD.VRTOTAL_ACR_DESC := C_RELATORIO.VRTOTAL_ACR_DESC;
                    OUT_RECORD.IDDELPHI := C_RELATORIO.IDDELPHI;
                    OUT_RECORD.DTINICOMPET := C_RELATORIO.DTINICOMPET;
                    OUT_RECORD.DTFINCOMPET := C_RELATORIO.DTFINCOMPET;
                    OUT_RECORD.QTMEDIDAMEDICAO := C_RELATORIO.QTMEDIDAMEDICAO;
                    OUT_RECORD.VRITEMCONTCOMDESC := C_RELATORIO.VRITEMCONTCOMDESC;
                    OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                    OUT_RECORD.DSERRO := NULL;
                    PIPE ROW (OUT_RECORD);

                END IF;

            END LOOP;

            IF (NOT V_TEM_REGISTRO AND P_IDRETORNO IN ('T', 'E')) THEN

                OUT_RECORD.NRSEQCONTRATO := C_CONTRATOS.NRSEQCONTRATO;
                OUT_RECORD.NRCONTRATOFCT := C_CONTRATOS.NRCONTRATOFCT;
                OUT_RECORD.DTAPROVACAO := NULL;
                OUT_RECORD.NRSEQORCAMENTO := NULL;
                OUT_RECORD.NRORCAMENTO := NULL;
                OUT_RECORD.DTACEITEORCA := NULL;
                OUT_RECORD.NRTIPOORCAMENTO := NULL;
                OUT_RECORD.NMTIPOORCAMENTO := NULL;
                OUT_RECORD.IDTPFATURA := NULL;
                OUT_RECORD.DSTPFATURA := NULL;
                OUT_RECORD.IDSITUACAOCONTRATO := NULL;
                OUT_RECORD.NRPARCNEGOCIO := NULL;
                OUT_RECORD.NMPRINCIPALPARC := NULL;
                OUT_RECORD.NMSECUNDARIPARC := NULL;
                OUT_RECORD.NRINSCRICAOPARC := NULL;
                OUT_RECORD.NMITEMCONTRATO := NULL;
                OUT_RECORD.CDSERVORCA := NULL;
                OUT_RECORD.NMSERVORCA := NULL;
                OUT_RECORD.IDELEMENTO := NULL;
                OUT_RECORD.CDCENTCUST := NULL;
                OUT_RECORD.NMCENTCUST := NULL;
                OUT_RECORD.QTMEDIDAITEMCONT := NULL;
                OUT_RECORD.QTMEDIDAVARIAVEL := NULL;
                OUT_RECORD.CDTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.DSTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.VRTOTSERVORCA := NULL;
                OUT_RECORD.VRTOTAL_ACR_DESC := NULL;
                OUT_RECORD.IDDELPHI := NULL;
                OUT_RECORD.DTINICOMPET := NULL;
                OUT_RECORD.DTFINCOMPET := NULL;
                OUT_RECORD.QTMEDIDAMEDICAO := NULL;
                OUT_RECORD.VRITEMCONTCOMDESC := NULL;
                OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                OUT_RECORD.DSERRO := NVL(V_DSERRO, 'Consulta nao retornou nenhum item para o contrato.');
                PIPE ROW (OUT_RECORD);

            END IF;

        END IF;

    END LOOP; --C_CONTRATOS
END;
/

/* ======================================================================================================================================================================== */
/* ======================================================================================================================================================================== */

CREATE OR REPLACE FUNCTION FCT_CCUSTO_CONTRATO (
    P_IDRETORNO VARCHAR2 DEFAULT 'T',
    P_NRSEQCONTRATO NUMBER DEFAULT NULL
)
RETURN FCT_CCUSTO_CONTRATO_TABLE PIPELINED
IS
    OUT_RECORD FCT_CCUSTO_CONTRATO_TYPE := FCT_CCUSTO_CONTRATO_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, 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, 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, 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, NULL, NULL);
    V_SOMA         FLOAT;
    V_DSERRO       VARCHAR2(4000);
    V_TEM_REGISTRO BOOLEAN;
    V_INDICE       NUMBER;

    TYPE CCUSTO_CONTRATO_REC IS RECORD (
        NRSEQCONTRATO      NUMBER,
        NRCONTRATOFCT      VARCHAR2(30),
        DTAPROVACAO        DATE,
        NRSEQORCAMENTO     NUMBER,
        NRORCAMENTO        VARCHAR2(30),
        DTACEITEORCA       DATE,
        NRTIPOORCAMENTO    NUMBER,
        NMTIPOORCAMENTO    VARCHAR2(100),
        IDTPFATURA         VARCHAR2(1),
        DSTPFATURA         VARCHAR2(100),
        IDSITUACAOCONTRATO VARCHAR2(1),
        NRPARCNEGOCIO      NUMBER,
        NMPRINCIPALPARC    VARCHAR2(250),
        NMSECUNDARIPARC    VARCHAR2(250),
        NRINSCRICAOPARC    VARCHAR2(20),
        NMITEMCONTRATO     VARCHAR2(250),
        CDSERVORCA         NUMBER,
        NMSERVORCA         VARCHAR2(100),
        IDELEMENTO         VARCHAR2(100),
        CDCENTCUST         VARCHAR2(4),
        NMCENTCUST         VARCHAR2(100),
        QTMEDIDACONTR      FLOAT,
        QTMEDIDAVARIAVEL   FLOAT,
        CDTPMEDIDAVARIAVEL NUMBER,
        DSTPMEDIDAVARIAVEL VARCHAR2(400),
        VRTOTSERVORCA      FLOAT,
        VRTOTAL_ACR_DESC   FLOAT,
        IDDELPHI           VARCHAR2(1),
        DTINICOMPET        DATE,
        DTFINCOMPET        DATE,
        QTMEDIDAMEDICAO    FLOAT,
        VRITEMCONTCOMDESC  FLOAT,
        DSERRO             VARCHAR2(4000)
    );

    TYPE CCUSTO_CONTRATO_TAB IS TABLE OF CCUSTO_CONTRATO_REC INDEX BY BINARY_INTEGER;
    V_CCUSTO_CONTRATO CCUSTO_CONTRATO_TAB;

BEGIN
    FOR C_CONTRATOS IN (
        SELECT NRSEQCONTRATO,
               NRCONTRATOFCT,
               CDCENTCUST,
               ROUND((SELECT SUM(VRTOTITEMCOMDESC)
                  FROM FCT_NEGOCIACAOCONTRATO
                 WHERE NRSEQCONTRATO = FCT_CONTRATO.NRSEQCONTRATO), 2) AS VRCONTRATO,
               (SELECT COUNT(*)
                  FROM FCT_TRABSERVCONTRATO
                 WHERE NRSEQCONTRATO = FCT_CONTRATO.NRSEQCONTRATO) AS QTTRAB,
               NRORG
          FROM FCT_CONTRATO
         WHERE IDATIVO = 'S'
           AND IDSITUACAOCONTRATO = 'A'
           AND NRSEQCONTRATO = NVL(P_NRSEQCONTRATO, NRSEQCONTRATO)
    ) LOOP

        IF (C_CONTRATOS.QTTRAB > 0) THEN

            V_DSERRO := NULL;
            V_SOMA := 0;
            V_INDICE := 1;

            BEGIN

                V_CCUSTO_CONTRATO.DELETE;

                FOR C_RELATORIO IN (
                    SELECT CONTRATOS.NRSEQCONTRATO,
                           CONTRATOS.NRCONTRATOFCT,
                           (SELECT MIN(DTAPROVCONTR)
                              FROM FCT_APROVACONTRATO
                             WHERE NRSEQCONTRATO = CONTRATOS.NRSEQCONTRATO) AS DTAPROVACAO,
                           CONTRATOS.NRSEQORCAMENTO,
                           CONTRATOS.NRORCAMENTO,
                           CONTRATOS.DTACEITEORCA,
                           CONTRATOS.NRTIPOORCAMENTO,
                           CONTRATOS.NMTIPOORCAMENTO,
                           CONTRATOS.IDTPFATURA,
                           DECODE(CONTRATOS.IDTPFATURA, 'P', 'Parcelamento', 'X', 'Periodico - Medicao', 'A', 'Periodico - Valor Fixo') AS DSTPFATURA,
                           CONTRATOS.IDSITUACAOCONTRATO,
                           CONTRATOS.NRPARCNEGOCIO,
                           CONTRATOS.NMPRINCIPALPARC,
                           CONTRATOS.NMSECUNDARIPARC,
                           CONTRATOS.NRINSCRICAOPARC,
                           CONTRATOS.NMITEMCONTRATO,
                           CONTRATOS.CDSERVORCA,
                           CONTRATOS.NMSERVORCA,
                           CONTRATOS.IDELEMENTO,
                           CONTRATOS.CDCENTCUST,
                           CONTRATOS.NMCENTCUST,
                           CONTRATOS.QTMEDIDACONTR,
                           CONTRATOS.CDTPMEDIDASERV,
                           CONTRATOS.DSTPMEDIDASERV,
                           CONTRATOS.QTMEDIDAVARIAVEL,
                           CONTRATOS.CDTPMEDIDAVARIAVEL,
                           CONTRATOS.DSTPMEDIDAVARIAVEL,
                           CONTRATOS.VRTOTSERVORCA,
                           CONTRATOS.VRACRESCIMO,
                           CONTRATOS.VRPERCRELATIVO,
                           CASE CONTRATOS.VRACRESCIMO
                               WHEN 0 THEN
                                   ROUND(
                                       CONTRATOS.VRTOTSERVORCA
                                   , 2)
                               ELSE
                                   ROUND(
                                       DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100))
                                   , 2)
                           END AS VRTOTAL_ACR,
                           CONTRATOS.VRPERCDESC,
                           CONTRATOS.VRPRECOVARIACAO,
                           CONTRATOS.VRUNITITEMCONTTBLPRECO,
                           CASE CONTRATOS.VRACRESCIMO
                               WHEN 0 THEN
                                   ROUND(
                                       CONTRATOS.VRTOTSERVORCA - (CONTRATOS.VRTOTSERVORCA * CONTRATOS.VRPERCDESC / 100)
                                   , 2)
                               ELSE
                                   ROUND(
                                       DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100)) - 
                                       (DECODE(CONTRATOS.VRTOTSERVORCA, 0,
                                              CONTRATOS.VRTOTITEMCONT * CONTRATOS.VRPERCRELATIVO / 100,
                                              CONTRATOS.VRTOTSERVORCA + (CONTRATOS.VRACRESCIMO * CONTRATOS.VRPERCRELATIVO / 100))) *
                                       CONTRATOS.VRPERCDESC / 100
                                   , 2)
                           END AS VRTOTAL_ACR_DESC,
                           CONTRATOS.IDDELPHI,
                           MEDICAO.DTINICOMPET,
                           MEDICAO.DTFINCOMPET,
                           MEDICAO.QTMEDIDAMEDICAO,
                           MEDICAO.VRITEMCONTCOMDESC
                      FROM (
                        SELECT ITCONT.NRSEQCONTRATO,
                               CONT.NRCONTRATOFCT,
                               ORC.NRSEQORCAMENTO,
                               ORC.NRORCAMENTO,
                               ORC.DTACEITEORCA,
                               CONT.NRTIPOORCAMENTO,
                               ESCOPO.NMTIPOORCAMENTO,
                               NEG.IDTPFATURA,
                               CONT.IDSITUACAOCONTRATO,
                               CONT.NRPARCNEGOCIO,
                               PARC.NMPRINCIPALPARC,
                               PARC.NMSECUNDARIPARC,
                               PARC.NRINSCRICAOPARC,
                               ITCONT.NMITEMCONTRATO,
                               ITCONT.CDSERVORCA,
                               SERV.NMSERVORCA,
                               ITCONT.IDELEMENTO,
                               TRAB.CDCENTCUST,
                               CENTCUST.NMCENTCUST,
                               ITCONT.CDTPMEDIDASERV,
                               MEDIDA.DSTPMEDIDASERV,
                               ITCONT.QTMEDIDACONTR,
                               ITCONT.CDTPMEDIDAVARIAVEL,
                               MEDIDAVAR.DSTPMEDIDASERV AS DSTPMEDIDAVARIAVEL,
                               TRAB.VRTOTSERVORCA,
                               ITCONT.VRUNITITEMCONTTBLPRECO,
                               ITCONT.VRUNITITEMCONT,
                               ITCONT.VRTOTITEMCONT,
                               VARPREC.VRPRECOVARIACAO,
                               MEDVAR.QTMEDIDAVARIAVEL,
                               CASE
                                   WHEN ITCONT.VRUNITITEMCONTTBLPRECO > ITCONT.VRUNITITEMCONT THEN
                                       ITCONT.VRUNITITEMCONT - VARPREC.VRPRECOVARIACAO
                                   ELSE
                                       ITCONT.VRUNITITEMCONT - ITCONT.VRUNITITEMCONTTBLPRECO
                               END AS VRACRESCIMO,
                               CASE
                                   WHEN ITCONT.VRUNITITEMCONTTBLPRECO > ITCONT.VRUNITITEMCONT THEN
                                       DECODE(VARPREC.VRPRECOVARIACAO, 0, 1, TRAB.VRTOTSERVORCA) / DECODE(VARPREC.VRPRECOVARIACAO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELETOTAL), VARPREC.VRPRECOVARIACAO) * DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELEMENTOS), 1) * 100
                                   ELSE
                                       DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, 1, TRAB.VRTOTSERVORCA) / DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELETOTAL), ITCONT.VRUNITITEMCONTTBLPRECO) * DECODE(ITCONT.VRUNITITEMCONTTBLPRECO, 0, DECODE(TRAB.QTDELETOTAL, 0, 1, TRAB.QTDELEMENTOS), 1) * 100
                               END AS VRPERCRELATIVO,
                               
                               DECODE(NVL(NEG.VRPERCDESCITEM, 0), 0, NVL(ITNEG.VRPERCDESCITEM, 0), NVL(NEG.VRPERCDESCITEM, 0)) AS VRPERCDESC,
                               NULL AS IDDELPHI,
                               TRAB.QTDELEMENTOS,
                               TRAB.QTDPRODUTOS
                          FROM FCT_ITEMCONTRATO ITCONT
                          JOIN FCT_CONTRATO CONT
                            ON ITCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                          LEFT JOIN FCT_REFEORCACONT REFE
                            ON CONT.NRSEQCONTRATO = REFE.NRSEQCONTRATO
                          LEFT JOIN FCT_ORCAMENTO ORC
                            ON REFE.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                          LEFT JOIN FCT_TIPOORCAMENTO ESCOPO
                            ON CONT.NRTIPOORCAMENTO = ESCOPO.NRTIPOORCAMENTO
                          JOIN PARCNEGOCIO PARC
                            ON CONT.NRPARCNEGOCIO = PARC.NRPARCNEGOCIO
                          JOIN FCT_SERVICOORCA SERV
                            ON ITCONT.CDSERVORCA = SERV.CDSERVORCA
                          JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                            ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                          JOIN FCT_NEGOCIACAOCONTRATO NEG
                            ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                          LEFT JOIN FCT_TIPOMEDIDASERV MEDIDA
                            ON ITCONT.CDTPMEDIDASERV = MEDIDA.CDTPMEDIDASERV
                          LEFT JOIN FCT_TIPOMEDIDASERV MEDIDAVAR
                            ON ITCONT.CDTPMEDIDAVARIAVEL = MEDIDAVAR.CDTPMEDIDASERV
                          LEFT JOIN FCT_SERVICOORCA ELEMENTO
                            ON ITCONT.IDELEMENTO = ELEMENTO.IDELEMENTO
                          LEFT JOIN FCT_RELACMEDIDACONTRATO MEDVAR
                            ON ITCONT.NRSEQCONTRATO      = MEDVAR.NRSEQCONTRATO
                           AND ITCONT.IDELEMENTO         = MEDVAR.IDELEMENTORAIZ
                           AND ITCONT.CDTPMEDIDAVARIAVEL = MEDVAR.CDTPMEDIDAVARIAVEL
                          LEFT JOIN (
                              SELECT DISTINCT NRSEQCONTRATO,
                                     CDSERVORCA,
                                     CDTPMEDIDASERV,
                                     CDTPMEDIDAVARIAVEL,
                                     QTMEDIDAINIVARIACAO,
                                     QTMEDIDAFIMVARIACAO,
                                     MAX(VRPRECOVARIACAO) AS VRPRECOVARIACAO,
                                     IDMULTIPVARIACAO
                                FROM FCT_VARPRECBASESERVCONT
                               WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                               GROUP BY NRSEQCONTRATO,
                                     CDSERVORCA,
                                     CDTPMEDIDASERV,
                                     CDTPMEDIDAVARIAVEL,
                                     QTMEDIDAINIVARIACAO,
                                     QTMEDIDAFIMVARIACAO,
                                     IDMULTIPVARIACAO
                          ) VARPREC
                            ON ITCONT.NRSEQCONTRATO      = VARPREC.NRSEQCONTRATO
                           AND ITCONT.CDSERVORCA         = VARPREC.CDSERVORCA
                           AND ITCONT.CDTPMEDIDAVARIAVEL = VARPREC.CDTPMEDIDAVARIAVEL
                           AND ITCONT.CDTPMEDIDASERV     = VARPREC.CDTPMEDIDASERV
                           AND MEDVAR.QTMEDIDAVARIAVEL   BETWEEN VARPREC.QTMEDIDAINIVARIACAO AND VARPREC.QTMEDIDAFIMVARIACAO
                          JOIN (
                                SELECT NRSEQCONTRATO,
                                       IDELEMENTORAIZ,
                                       CDSERVORCA,
                                       CDCENTCUST,
                                       DECODE(QTDPRODUTOS, 0, VRTOTSERVORCA, (VRTOTSERVORCA / QTDPRODUTOS / QTDPRODTOTAL * QTDPRODUTOS)) AS VRTOTSERVORCA,
                                       QTDELEMENTOS,
                                       QTDPRODUTOS,
                                       QTDELETOTAL,
                                       QTDPRODTOTAL
                                  FROM (
                                    SELECT NRSEQCONTRATO,
                                           IDELEMENTORAIZ,
                                           CDSERVORCA,
                                           CDCENTCUST,
                                           SUM(VRTOTSERVORCA) AS VRTOTSERVORCA,
                                           SUM(QTELEMENTOS) AS QTDELEMENTOS,
                                           SUM(QTPRODUTOS) AS QTDPRODUTOS,
                                           QTDELETOTAL,
                                           QTDPRODTOTAL
                                      FROM (
                                        SELECT TBL.*,
                                               SUM(QTELEMENTOS) OVER (PARTITION BY NRSEQCONTRATO, IDELEMENTORAIZ, CDSERVORCA) AS QTDELETOTAL,
                                               SUM(QTPRODUTOS) OVER (PARTITION BY NRSEQCONTRATO, IDELEMENTORAIZ, CDSERVORCA) AS QTDPRODTOTAL
                                          FROM (
                                            SELECT TRAB.NRSEQCONTRATO,
                                                   TRAB.IDELEMENTO,
                                                   TRAB.CDSERVORCA,
                                                   TRAB.QTSERVORCA,
                                                   TRAB.QTMEDSERVORCA,
                                                   TRAB.QTMEDIDAVARIAVEL,
                                                   TRAB.QTMEDIDACALC,
                                                   TRAB.VRUNITSERVORCA,
                                                   TRAB.VRTOTSERVORCA,
                                                   NVL(TRAB.CDCENTCUST, C_CONTRATOS.CDCENTCUST) AS CDCENTCUST,
                                                   RAIZ.IDELEMENTORAIZ,
                                                   0 AS QTELEMENTOS,
                                                   1 AS QTPRODUTOS
                                              FROM FCT_TRABSERVCONTRATO TRAB
                                              JOIN (SELECT TRAB.*,
                                                    CONNECT_BY_ROOT IDELEMENTO AS IDELEMENTORAIZ
                                                      FROM (
                                                        SELECT DISTINCT NRSEQCONTRATO,
                                                               IDELEMENTO,
                                                               IDELEMENTOPAI
                                                          FROM FCT_TRABSERVCONTRATO
                                                         WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      ) TRAB
                                                    CONNECT BY PRIOR IDELEMENTO = IDELEMENTOPAI
                                                      START WITH IDELEMENTO IN (SELECT DISTINCT IDELEMENTO
                                                                                  FROM FCT_ITEMCONTRATO
                                                                                 WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                                                   AND IDELEMENTO IS NOT NULL)) RAIZ
                                                ON TRAB.NRSEQCONTRATO = RAIZ.NRSEQCONTRATO
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTO
                                             WHERE TRAB.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                               AND TRAB.IDESCOLHIDO = 'S'
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTORAIZ
                                             UNION ALL
                                             SELECT DISTINCT TRAB.NRSEQCONTRATO,
                                                   TRAB.IDELEMENTO,
                                                   TRAB.CDSERVORCA,
                                                   TRAB.QTSERVORCA,
                                                   TRAB.QTMEDSERVORCA,
                                                   TRAB.QTMEDIDAVARIAVEL,
                                                   TRAB.QTMEDIDACALC,
                                                   TRAB.VRUNITSERVORCA,
                                                   TRAB.VRTOTSERVORCA,
                                                   NVL(TRAB.CDCENTCUST, C_CONTRATOS.CDCENTCUST) AS CDCENTCUST,
                                                   RAIZ.IDELEMENTORAIZ,
                                                   1 AS QTELEMENTOS,
                                                   0 AS QTPRODUTOS
                                              FROM FCT_TRABSERVCONTRATO TRAB
                                              JOIN (SELECT TRAB.*,
                                                    CONNECT_BY_ROOT IDELEMENTO AS IDELEMENTORAIZ
                                                      FROM (
                                                        SELECT DISTINCT NRSEQCONTRATO,
                                                               IDELEMENTO,
                                                               IDELEMENTOPAI
                                                          FROM FCT_TRABSERVCONTRATO
                                                         WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      ) TRAB
                                                    CONNECT BY PRIOR IDELEMENTO = IDELEMENTOPAI
                                                      START WITH IDELEMENTO IN (SELECT DISTINCT IDELEMENTO
                                                                                  FROM FCT_ITEMCONTRATO
                                                                                 WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                                                   AND IDELEMENTO IS NOT NULL)) RAIZ
                                                ON TRAB.NRSEQCONTRATO = RAIZ.NRSEQCONTRATO
                                               AND TRAB.IDELEMENTO = RAIZ.IDELEMENTO
                                             WHERE TRAB.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                               AND TRAB.IDESCOLHIDO = 'S'
                                               AND TRAB.IDELEMENTO <> RAIZ.IDELEMENTORAIZ
                                             ORDER BY CDSERVORCA, IDELEMENTO
                                        ) TBL
                                    )
                                    WHERE CDSERVORCA IS NOT NULL
                                    GROUP BY NRSEQCONTRATO,
                                        IDELEMENTORAIZ,
                                        CDSERVORCA,
                                        CDCENTCUST,
                                        QTDELETOTAL,
                                        QTDPRODTOTAL
                                   ORDER BY CDSERVORCA
                                  )
                          ) TRAB
                          ON ITCONT.NRSEQCONTRATO = TRAB.NRSEQCONTRATO
                         AND ITCONT.IDELEMENTO = TRAB.IDELEMENTORAIZ
                         AND ITCONT.CDSERVORCA = TRAB.CDSERVORCA
                        LEFT JOIN CENTCUST
                          ON TRAB.CDCENTCUST = CENTCUST.CDCENTCUST
                       WHERE ITCONT.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                         AND ITCONT.IDELEMENTO IS NOT NULL
                       ORDER BY ITCONT.CDSERVORCA,
                                ITCONT.IDELEMENTO DESC
                    ) CONTRATOS
                    LEFT JOIN (
                        SELECT MED.NRSEQCONTRATO,
                               MED.IDSITUACAO,
                               MED.DTINICOMPET,
                               MED.DTFINCOMPET,
                               MEDVAR.CDSERVORCA,
                               MEDVAR.IDELEMENTORAIZ,
                               MEDVAR.QTMEDIDAMEDICAO,
                               MEDVAR.VRITEMCONTCOMDESC
                          FROM FCT_MEDICAOFATURA MED
                          JOIN (
                              SELECT DISTINCT MV.CDSERVORCA,
                                     MV.IDELEMENTORAIZ,
                                     MV.QTMEDIDAMEDICAO,
                                     MV.VRITEMCONTCOMDESC,
                                     MV.NRMEDICAOFATURA
                                FROM FCT_MEDVARMEDICAOFATURA MV
                                JOIN FCT_MEDICAOFATURA MF
                                  ON MV.NRMEDICAOFATURA = MF.NRMEDICAOFATURA
                               WHERE MF.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                          ) MEDVAR
                            ON MED.NRMEDICAOFATURA = MEDVAR.NRMEDICAOFATURA
                         WHERE MED.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                           AND MED.DTINICOMPET IN (SELECT MAX(DTINICOMPET)
                                                     FROM FCT_MEDICAOFATURA
                                                    WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      AND IDSITUACAO IN ('3','4'))
                    ) MEDICAO
                    ON CONTRATOS.NRSEQCONTRATO = MEDICAO.NRSEQCONTRATO
                   AND CONTRATOS.CDSERVORCA = MEDICAO.CDSERVORCA
                   AND CONTRATOS.IDELEMENTO = MEDICAO.IDELEMENTORAIZ
                ) LOOP

                    V_SOMA := V_SOMA + C_RELATORIO.VRTOTAL_ACR_DESC;

                    V_CCUSTO_CONTRATO(V_INDICE).NRSEQCONTRATO := C_RELATORIO.NRSEQCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRCONTRATOFCT := C_RELATORIO.NRCONTRATOFCT;
                    V_CCUSTO_CONTRATO(V_INDICE).DTAPROVACAO := C_RELATORIO.DTAPROVACAO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRSEQORCAMENTO := C_RELATORIO.NRSEQORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRORCAMENTO := C_RELATORIO.NRORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).DTACEITEORCA := C_RELATORIO.DTACEITEORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).NRTIPOORCAMENTO := C_RELATORIO.NRTIPOORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).NMTIPOORCAMENTO := C_RELATORIO.NMTIPOORCAMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).IDTPFATURA := C_RELATORIO.IDTPFATURA;
                    V_CCUSTO_CONTRATO(V_INDICE).DSTPFATURA := C_RELATORIO.DSTPFATURA;
                    V_CCUSTO_CONTRATO(V_INDICE).IDSITUACAOCONTRATO := C_RELATORIO.IDSITUACAOCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).NRPARCNEGOCIO := C_RELATORIO.NRPARCNEGOCIO;
                    V_CCUSTO_CONTRATO(V_INDICE).NMPRINCIPALPARC := C_RELATORIO.NMPRINCIPALPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NMSECUNDARIPARC := C_RELATORIO.NMSECUNDARIPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NRINSCRICAOPARC := C_RELATORIO.NRINSCRICAOPARC;
                    V_CCUSTO_CONTRATO(V_INDICE).NMITEMCONTRATO := C_RELATORIO.NMITEMCONTRATO;
                    V_CCUSTO_CONTRATO(V_INDICE).CDSERVORCA := C_RELATORIO.CDSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).NMSERVORCA := C_RELATORIO.NMSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).IDELEMENTO := C_RELATORIO.IDELEMENTO;
                    V_CCUSTO_CONTRATO(V_INDICE).CDCENTCUST := C_RELATORIO.CDCENTCUST;
                    V_CCUSTO_CONTRATO(V_INDICE).NMCENTCUST := C_RELATORIO.NMCENTCUST;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDACONTR := C_RELATORIO.QTMEDIDACONTR;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDAVARIAVEL := C_RELATORIO.QTMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).CDTPMEDIDAVARIAVEL := C_RELATORIO.CDTPMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).DSTPMEDIDAVARIAVEL := C_RELATORIO.DSTPMEDIDAVARIAVEL;
                    V_CCUSTO_CONTRATO(V_INDICE).VRTOTSERVORCA := C_RELATORIO.VRTOTSERVORCA;
                    V_CCUSTO_CONTRATO(V_INDICE).VRTOTAL_ACR_DESC := C_RELATORIO.VRTOTAL_ACR_DESC;
                    V_CCUSTO_CONTRATO(V_INDICE).IDDELPHI := C_RELATORIO.IDDELPHI;
                    V_CCUSTO_CONTRATO(V_INDICE).DTINICOMPET := C_RELATORIO.DTINICOMPET;
                    V_CCUSTO_CONTRATO(V_INDICE).DTFINCOMPET := C_RELATORIO.DTFINCOMPET;
                    V_CCUSTO_CONTRATO(V_INDICE).QTMEDIDAMEDICAO := C_RELATORIO.QTMEDIDAMEDICAO;
                    V_CCUSTO_CONTRATO(V_INDICE).VRITEMCONTCOMDESC := C_RELATORIO.VRITEMCONTCOMDESC;
                    V_CCUSTO_CONTRATO(V_INDICE).DSERRO := NULL;

                    V_INDICE := V_INDICE + 1;

                END LOOP; --C_RELATORIO

                IF (ABS(ROUND(V_SOMA, 2) - C_CONTRATOS.VRCONTRATO) > 2) THEN
                    V_DSERRO := 'Valor da soma dos itens rateados por centro de custo esta diferente do valor total do contrato (soma da negociacao de valores).';
                END IF;

            EXCEPTION WHEN OTHERS THEN
                --RAISE_APPLICATION_ERROR(-20000, 'CONTRATO: ' || C_CONTRATOS.NRCONTRATOFCT || ' (' || C_CONTRATOS.NRSEQCONTRATO || ') - ERRO: ' || SQLERRM);
                V_DSERRO := SUBSTR(SQLERRM, 1, 4000);
            END;

            V_TEM_REGISTRO := FALSE;
            FOR I IN 1..V_CCUSTO_CONTRATO.COUNT LOOP

                V_TEM_REGISTRO := TRUE;

                IF (P_IDRETORNO = 'T' OR
                    (P_IDRETORNO = 'O' AND V_DSERRO IS NULL) OR
                    (P_IDRETORNO = 'E' AND V_DSERRO IS NOT NULL)) THEN

                    OUT_RECORD.NRSEQCONTRATO := V_CCUSTO_CONTRATO(I).NRSEQCONTRATO;
                    OUT_RECORD.NRCONTRATOFCT := V_CCUSTO_CONTRATO(I).NRCONTRATOFCT;
                    OUT_RECORD.DTAPROVACAO := V_CCUSTO_CONTRATO(I).DTAPROVACAO;
                    OUT_RECORD.NRSEQORCAMENTO := V_CCUSTO_CONTRATO(I).NRSEQORCAMENTO;
                    OUT_RECORD.NRORCAMENTO := V_CCUSTO_CONTRATO(I).NRORCAMENTO;
                    OUT_RECORD.DTACEITEORCA := V_CCUSTO_CONTRATO(I).DTACEITEORCA;
                    OUT_RECORD.NRTIPOORCAMENTO := V_CCUSTO_CONTRATO(I).NRTIPOORCAMENTO;
                    OUT_RECORD.NMTIPOORCAMENTO := V_CCUSTO_CONTRATO(I).NMTIPOORCAMENTO;
                    OUT_RECORD.IDTPFATURA := V_CCUSTO_CONTRATO(I).IDTPFATURA;
                    OUT_RECORD.DSTPFATURA := V_CCUSTO_CONTRATO(I).DSTPFATURA;
                    OUT_RECORD.IDSITUACAOCONTRATO := V_CCUSTO_CONTRATO(I).IDSITUACAOCONTRATO;
                    OUT_RECORD.NRPARCNEGOCIO := V_CCUSTO_CONTRATO(I).NRPARCNEGOCIO;
                    OUT_RECORD.NMPRINCIPALPARC := V_CCUSTO_CONTRATO(I).NMPRINCIPALPARC;
                    OUT_RECORD.NMSECUNDARIPARC := V_CCUSTO_CONTRATO(I).NMSECUNDARIPARC;
                    OUT_RECORD.NRINSCRICAOPARC := V_CCUSTO_CONTRATO(I).NRINSCRICAOPARC;
                    OUT_RECORD.NMITEMCONTRATO := V_CCUSTO_CONTRATO(I).NMITEMCONTRATO;
                    OUT_RECORD.CDSERVORCA := V_CCUSTO_CONTRATO(I).CDSERVORCA;
                    OUT_RECORD.NMSERVORCA := V_CCUSTO_CONTRATO(I).NMSERVORCA;
                    OUT_RECORD.IDELEMENTO := V_CCUSTO_CONTRATO(I).IDELEMENTO;
                    OUT_RECORD.CDCENTCUST := V_CCUSTO_CONTRATO(I).CDCENTCUST;
                    OUT_RECORD.NMCENTCUST := V_CCUSTO_CONTRATO(I).NMCENTCUST;
                    OUT_RECORD.QTMEDIDAITEMCONT := V_CCUSTO_CONTRATO(I).QTMEDIDACONTR;
                    OUT_RECORD.QTMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).QTMEDIDAVARIAVEL;
                    OUT_RECORD.CDTPMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).CDTPMEDIDAVARIAVEL;
                    OUT_RECORD.DSTPMEDIDAVARIAVEL := V_CCUSTO_CONTRATO(I).DSTPMEDIDAVARIAVEL;
                    OUT_RECORD.VRTOTSERVORCA := V_CCUSTO_CONTRATO(I).VRTOTSERVORCA;
                    OUT_RECORD.VRTOTAL_ACR_DESC := V_CCUSTO_CONTRATO(I).VRTOTAL_ACR_DESC;
                    OUT_RECORD.IDDELPHI := V_CCUSTO_CONTRATO(I).IDDELPHI;
                    OUT_RECORD.DTINICOMPET := V_CCUSTO_CONTRATO(I).DTINICOMPET;
                    OUT_RECORD.DTFINCOMPET := V_CCUSTO_CONTRATO(I).DTFINCOMPET;
                    OUT_RECORD.QTMEDIDAMEDICAO := V_CCUSTO_CONTRATO(I).QTMEDIDAMEDICAO;
                    OUT_RECORD.VRITEMCONTCOMDESC := V_CCUSTO_CONTRATO(I).VRITEMCONTCOMDESC;
                    OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                    OUT_RECORD.DSERRO := V_DSERRO;
                    PIPE ROW (OUT_RECORD);

                END IF;

            END LOOP;

            IF (NOT V_TEM_REGISTRO AND P_IDRETORNO IN ('T', 'E')) THEN

                OUT_RECORD.NRSEQCONTRATO := C_CONTRATOS.NRSEQCONTRATO;
                OUT_RECORD.NRCONTRATOFCT := C_CONTRATOS.NRCONTRATOFCT;
                OUT_RECORD.DTAPROVACAO := NULL;
                OUT_RECORD.NRSEQORCAMENTO := NULL;
                OUT_RECORD.NRORCAMENTO := NULL;
                OUT_RECORD.DTACEITEORCA := NULL;
                OUT_RECORD.NRTIPOORCAMENTO := NULL;
                OUT_RECORD.NMTIPOORCAMENTO := NULL;
                OUT_RECORD.IDTPFATURA := NULL;
                OUT_RECORD.DSTPFATURA := NULL;
                OUT_RECORD.IDSITUACAOCONTRATO := NULL;
                OUT_RECORD.NRPARCNEGOCIO := NULL;
                OUT_RECORD.NMPRINCIPALPARC := NULL;
                OUT_RECORD.NMSECUNDARIPARC := NULL;
                OUT_RECORD.NRINSCRICAOPARC := NULL;
                OUT_RECORD.NMITEMCONTRATO := NULL;
                OUT_RECORD.CDSERVORCA := NULL;
                OUT_RECORD.NMSERVORCA := NULL;
                OUT_RECORD.IDELEMENTO := NULL;
                OUT_RECORD.CDCENTCUST := NULL;
                OUT_RECORD.NMCENTCUST := NULL;
                OUT_RECORD.QTMEDIDAITEMCONT := NULL;
                OUT_RECORD.QTMEDIDAVARIAVEL := NULL;
                OUT_RECORD.CDTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.DSTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.VRTOTSERVORCA := NULL;
                OUT_RECORD.VRTOTAL_ACR_DESC := NULL;
                OUT_RECORD.IDDELPHI := NULL;
                OUT_RECORD.DTINICOMPET := NULL;
                OUT_RECORD.DTFINCOMPET := NULL;
                OUT_RECORD.QTMEDIDAMEDICAO := NULL;
                OUT_RECORD.VRITEMCONTCOMDESC := NULL;
                OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                OUT_RECORD.DSERRO := NVL(V_DSERRO, 'Consulta nao retornou nenhum item para o contrato.');
                PIPE ROW (OUT_RECORD);

            END IF;

        ELSE

            V_TEM_REGISTRO := FALSE;

            FOR C_RELATORIO IN (
                SELECT CONT.NRSEQCONTRATO,
                       CONT.NRCONTRATOFCT,
                       (SELECT MIN(DTAPROVCONTR)
                          FROM FCT_APROVACONTRATO
                         WHERE NRSEQCONTRATO = CONT.NRSEQCONTRATO) AS DTAPROVACAO,
                       ORC.NRSEQORCAMENTO,
                       ORC.NRORCAMENTO,
                       ORC.DTACEITEORCA,
                       CONT.NRTIPOORCAMENTO,
                       ESCOPO.NMTIPOORCAMENTO,
                       NEG.IDTPFATURA,
                       DECODE(NEG.IDTPFATURA, 'P', 'Parcelamento', 'X', 'Periodico - Medicao', 'A', 'Periodico - Valor Fixo') AS DSTPFATURA,
                       CONT.IDSITUACAOCONTRATO,
                       CONT.NRPARCNEGOCIO,
                       PARC.NMPRINCIPALPARC,
                       PARC.NMSECUNDARIPARC,
                       PARC.NRINSCRICAOPARC,
                       ITCONT.NMITEMCONTRATO,
                       ITCONT.CDSERVORCA,
                       SERV.NMSERVORCA,
                       ITCONT.IDELEMENTO,
                       CONT.CDCENTCUST,
                       CENTCUST.NMCENTCUST,
                       ITCONT.QTMEDIDACONTR,
                       ITCONT.CDTPMEDIDASERV,
                       MEDIDA.DSTPMEDIDASERV,
                       ITCONT.QTMEDIDACONTR AS QTMEDIDAVARIAVEL,
                       ITCONT.CDTPMEDIDAVARIAVEL,
                       MEDIDAVAR.DSTPMEDIDASERV AS DSTPMEDIDAVARIAVEL,
                       ITCONT.VRTOTITEMCONT AS VRTOTSERVORCA,
                       DECODE(NVL(ITNEG.VRPERCDESCITEM, 0), 0, DECODE(NVL(NEG.VRPERCDESCITEM, 0), 0, ITCONT.VRTOTITEMCONT, ITCONT.VRTOTITEMCONT - (ITCONT.VRTOTITEMCONT * NVL(NEG.VRPERCDESCITEM, 0) / 100)), ITNEG.VRTOTITEMCOMDESC) AS VRTOTAL_ACR_DESC,
                       NULL AS IDDELPHI,
                       MEDICAO.DTINICOMPET,
                       MEDICAO.DTFINCOMPET,
                       MEDICAO.QTMEDIDAMEDICAO,
                       MEDICAO.VRITEMCONTCOMDESC
                  FROM FCT_ITEMCONTRATO ITCONT
                  JOIN FCT_CONTRATO CONT
                    ON ITCONT.NRSEQCONTRATO = CONT.NRSEQCONTRATO
                  LEFT JOIN FCT_REFEORCACONT REFE
                    ON CONT.NRSEQCONTRATO = REFE.NRSEQCONTRATO
                  LEFT JOIN FCT_ORCAMENTO ORC
                    ON REFE.NRSEQORCAMENTO = ORC.NRSEQORCAMENTO
                  LEFT JOIN FCT_TIPOORCAMENTO ESCOPO
                    ON CONT.NRTIPOORCAMENTO = ESCOPO.NRTIPOORCAMENTO
                  JOIN PARCNEGOCIO PARC
                    ON CONT.NRPARCNEGOCIO = PARC.NRPARCNEGOCIO
                  JOIN FCT_SERVICOORCA SERV
                    ON ITCONT.CDSERVORCA = SERV.CDSERVORCA
                  JOIN FCT_ITNEGOCIACAOCONTRATO ITNEG
                    ON ITCONT.NRITEMOCONTRATO = ITNEG.NRITEMOCONTRATO
                  JOIN FCT_NEGOCIACAOCONTRATO NEG
                    ON ITNEG.NRNEGOCIACAOCONTRATO = NEG.NRNEGOCIACAOCONTRATO
                  LEFT JOIN FCT_TIPOMEDIDASERV MEDIDA
                    ON ITCONT.CDTPMEDIDASERV = MEDIDA.CDTPMEDIDASERV
                  LEFT JOIN FCT_TIPOMEDIDASERV MEDIDAVAR
                    ON ITCONT.CDTPMEDIDAVARIAVEL = MEDIDAVAR.CDTPMEDIDASERV
                  LEFT JOIN CENTCUST
                    ON CONT.CDCENTCUST = CENTCUST.CDCENTCUST
                  LEFT JOIN (
                        SELECT MED.NRSEQCONTRATO,
                               MED.IDSITUACAO,
                               MED.DTINICOMPET,
                               MED.DTFINCOMPET,
                               MEDVAR.CDSERVORCA,
                               MEDVAR.QTMEDIDAMEDICAO,
                               MEDVAR.VRITEMCONTCOMDESC
                          FROM FCT_MEDICAOFATURA MED
                          JOIN (
                              SELECT DISTINCT MV.CDSERVORCA,
                                     MV.QTMEDIDAMEDICAO,
                                     MV.VRITEMCONTCOMDESC,
                                     MV.NRMEDICAOFATURA
                                FROM FCT_MEDVARMEDICAOFATURA MV
                                JOIN FCT_MEDICAOFATURA MF
                                  ON MV.NRMEDICAOFATURA = MF.NRMEDICAOFATURA
                               WHERE MF.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                 AND MV.IDELEMENTORAIZ IS NULL
                          ) MEDVAR
                            ON MED.NRMEDICAOFATURA = MEDVAR.NRMEDICAOFATURA
                         WHERE MED.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                           AND MED.DTINICOMPET IN (SELECT MAX(DTINICOMPET)
                                                     FROM FCT_MEDICAOFATURA
                                                    WHERE NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
                                                      AND IDSITUACAO IN ('3','4'))
                    ) MEDICAO
                    ON ITCONT.NRSEQCONTRATO = MEDICAO.NRSEQCONTRATO
                   AND ITCONT.CDSERVORCA = MEDICAO.CDSERVORCA
                 WHERE ITCONT.NRSEQCONTRATO = C_CONTRATOS.NRSEQCONTRATO
            ) LOOP

                V_TEM_REGISTRO := TRUE;

                IF (P_IDRETORNO IN ('T', 'O')) THEN

                    OUT_RECORD.NRSEQCONTRATO := C_RELATORIO.NRSEQCONTRATO;
                    OUT_RECORD.NRCONTRATOFCT := C_RELATORIO.NRCONTRATOFCT;
                    OUT_RECORD.DTAPROVACAO := C_RELATORIO.DTAPROVACAO;
                    OUT_RECORD.NRSEQORCAMENTO := C_RELATORIO.NRSEQORCAMENTO;
                    OUT_RECORD.NRORCAMENTO := C_RELATORIO.NRORCAMENTO;
                    OUT_RECORD.DTACEITEORCA := C_RELATORIO.DTACEITEORCA;
                    OUT_RECORD.NRTIPOORCAMENTO := C_RELATORIO.NRTIPOORCAMENTO;
                    OUT_RECORD.NMTIPOORCAMENTO := C_RELATORIO.NMTIPOORCAMENTO;
                    OUT_RECORD.IDTPFATURA := C_RELATORIO.IDTPFATURA;
                    OUT_RECORD.DSTPFATURA := C_RELATORIO.DSTPFATURA;
                    OUT_RECORD.IDSITUACAOCONTRATO := C_RELATORIO.IDSITUACAOCONTRATO;
                    OUT_RECORD.NRPARCNEGOCIO := C_RELATORIO.NRPARCNEGOCIO;
                    OUT_RECORD.NMPRINCIPALPARC := C_RELATORIO.NMPRINCIPALPARC;
                    OUT_RECORD.NMSECUNDARIPARC := C_RELATORIO.NMSECUNDARIPARC;
                    OUT_RECORD.NRINSCRICAOPARC := C_RELATORIO.NRINSCRICAOPARC;
                    OUT_RECORD.NMITEMCONTRATO := C_RELATORIO.NMITEMCONTRATO;
                    OUT_RECORD.CDSERVORCA := C_RELATORIO.CDSERVORCA;
                    OUT_RECORD.NMSERVORCA := C_RELATORIO.NMSERVORCA;
                    OUT_RECORD.IDELEMENTO := C_RELATORIO.IDELEMENTO;
                    OUT_RECORD.CDCENTCUST := C_RELATORIO.CDCENTCUST;
                    OUT_RECORD.NMCENTCUST := C_RELATORIO.NMCENTCUST;
                    OUT_RECORD.QTMEDIDAITEMCONT := C_RELATORIO.QTMEDIDACONTR;
                    OUT_RECORD.QTMEDIDAVARIAVEL := C_RELATORIO.QTMEDIDAVARIAVEL;
                    OUT_RECORD.CDTPMEDIDAVARIAVEL := C_RELATORIO.CDTPMEDIDAVARIAVEL;
                    OUT_RECORD.DSTPMEDIDAVARIAVEL := C_RELATORIO.DSTPMEDIDAVARIAVEL;
                    OUT_RECORD.VRTOTSERVORCA := C_RELATORIO.VRTOTSERVORCA;
                    OUT_RECORD.VRTOTAL_ACR_DESC := C_RELATORIO.VRTOTAL_ACR_DESC;
                    OUT_RECORD.IDDELPHI := C_RELATORIO.IDDELPHI;
                    OUT_RECORD.DTINICOMPET := C_RELATORIO.DTINICOMPET;
                    OUT_RECORD.DTFINCOMPET := C_RELATORIO.DTFINCOMPET;
                    OUT_RECORD.QTMEDIDAMEDICAO := C_RELATORIO.QTMEDIDAMEDICAO;
                    OUT_RECORD.VRITEMCONTCOMDESC := C_RELATORIO.VRITEMCONTCOMDESC;
                    OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                    OUT_RECORD.DSERRO := NULL;
                    PIPE ROW (OUT_RECORD);

                END IF;

            END LOOP;

            IF (NOT V_TEM_REGISTRO AND P_IDRETORNO IN ('T', 'E')) THEN

                OUT_RECORD.NRSEQCONTRATO := C_CONTRATOS.NRSEQCONTRATO;
                OUT_RECORD.NRCONTRATOFCT := C_CONTRATOS.NRCONTRATOFCT;
                OUT_RECORD.DTAPROVACAO := NULL;
                OUT_RECORD.NRSEQORCAMENTO := NULL;
                OUT_RECORD.NRORCAMENTO := NULL;
                OUT_RECORD.DTACEITEORCA := NULL;
                OUT_RECORD.NRTIPOORCAMENTO := NULL;
                OUT_RECORD.NMTIPOORCAMENTO := NULL;
                OUT_RECORD.IDTPFATURA := NULL;
                OUT_RECORD.DSTPFATURA := NULL;
                OUT_RECORD.IDSITUACAOCONTRATO := NULL;
                OUT_RECORD.NRPARCNEGOCIO := NULL;
                OUT_RECORD.NMPRINCIPALPARC := NULL;
                OUT_RECORD.NMSECUNDARIPARC := NULL;
                OUT_RECORD.NRINSCRICAOPARC := NULL;
                OUT_RECORD.NMITEMCONTRATO := NULL;
                OUT_RECORD.CDSERVORCA := NULL;
                OUT_RECORD.NMSERVORCA := NULL;
                OUT_RECORD.IDELEMENTO := NULL;
                OUT_RECORD.CDCENTCUST := NULL;
                OUT_RECORD.NMCENTCUST := NULL;
                OUT_RECORD.QTMEDIDAITEMCONT := NULL;
                OUT_RECORD.QTMEDIDAVARIAVEL := NULL;
                OUT_RECORD.CDTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.DSTPMEDIDAVARIAVEL := NULL;
                OUT_RECORD.VRTOTSERVORCA := NULL;
                OUT_RECORD.VRTOTAL_ACR_DESC := NULL;
                OUT_RECORD.IDDELPHI := NULL;
                OUT_RECORD.DTINICOMPET := NULL;
                OUT_RECORD.DTFINCOMPET := NULL;
                OUT_RECORD.QTMEDIDAMEDICAO := NULL;
                OUT_RECORD.VRITEMCONTCOMDESC := NULL;
                OUT_RECORD.NRORG := C_CONTRATOS.NRORG;
                OUT_RECORD.DSERRO := NVL(V_DSERRO, 'Consulta nao retornou nenhum item para o contrato.');
                PIPE ROW (OUT_RECORD);

            END IF;

        END IF;

    END LOOP; --C_CONTRATOS
END;
/