CREATE OR REPLACE FUNCTION QUERY_ITEM_CMP99000(P_CDFILCENTCMP     IN VARCHAR2,
                                               P_NRAPURPREC       IN VARCHAR2,
                                               P_CDFORNECED       IN VARCHAR2,
                                               P_CDMARCA          IN VARCHAR2,
                                               P_CDFILIAL         IN VARCHAR2,
                                               P_CDPRODINI        IN VARCHAR2,
                                               P_CDPRODFIN        IN VARCHAR2,
                                               P_TIPOTELA         IN VARCHAR2,
                                               P_CDTIPOCUSTO      IN VARCHAR2,
                                               P_UM_REGISTRO      IN VARCHAR2 DEFAULT NULL
                                               )RETURN QUERY_ITEM_CMP99000_TABLE PIPELINED
IS
   OUT_RECORD QUERY_ITEM_CMP99000_TYPE := QUERY_ITEM_CMP99000_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, 0, 0, 0, 0,
                                                                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                                                    0, 0, 0, 0, 0, 0, 0, 0, 0);
   V_CONTADOR         NUMERIC := 0;
   V_NMPRODUTOOL      PRODUTO.NMPRODUTO%TYPE;
   V_CDARVPRODOL      PRODUTO.CDARVPROD%TYPE;
   V_CDPRODARVOL      RELACPRODOL.CDPRODARVOL%TYPE;
   V_VRPRECUNIAP      ITMAPURPREC.VRPRECUNIAP%TYPE;
   V_CHAVE_CDARV      VARCHAR2(30) := '_';
   V_IDITMSELPREVCMP  ITMAPURPREC.IDITMSELPREVCMP%TYPE;
   V_VRTOTALEST       FLOAT;
   V_VRTOTALFILEST    FLOAT;
   V_VRTOTALCMP       FLOAT;
   V_UM_REGISTRO      VARCHAR2(2) := NVL(P_UM_REGISTRO, 'NN');
   V_CHAVE_CDARV2     VARCHAR2(30) := '_';
BEGIN
   SELECT NVL(SUM(QTESTOQUE * (NVL(CUSTO_PRODUTO(CDFILIAP, CDPRODESTO, P_CDTIPOCUSTO, SYSDATE, SYSDATE), 0))), 0)
     INTO V_VRTOTALEST
     FROM (SELECT DISTINCT ITMAPURPREC.QTESTOQUE, ITMAPURPREC.CDFILIAP, PRODUTO.CDPRODESTO
             FROM ITMAPURPREC, PRODUTO
            WHERE CDCENTITMAP = P_CDFILCENTCMP
              AND NRSEQITMAP  = P_NRAPURPREC
              AND ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO
              AND PRODUTO.CDPRODUTO     = PRODUTO.CDPRODESTO
              AND ( ( INSTR(P_CDFILIAL, ITMAPURPREC.CDFILIAP) > 0 ) OR ( P_CDFILIAL = 'T' ) )
              AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'));

   SELECT SUM(ITMAPURPREC.QTACOMP * ITMAPURPREC.VRPRECUNIAP), COUNT(NRSEQITMAP)
     INTO V_VRTOTALCMP, V_CONTADOR
     FROM ITMAPURPREC, PRODUTO
    WHERE CDCENTITMAP = P_CDFILCENTCMP
      AND NRSEQITMAP  = P_NRAPURPREC
      AND ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO
      AND PRODUTO.CDPRODUTO     = PRODUTO.CDPRODESTO
      AND ( ( INSTR(P_CDFILIAL, ITMAPURPREC.CDFILIAP) > 0 ) OR ( P_CDFILIAL = 'T' ) )
      AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z');

   FOR C_FILIAL IN (SELECT CDFILIAL
                      FROM FILIAL
                     WHERE ( ( INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0 ) OR ( P_CDFILIAL = 'T' ) )
                       AND NVL(FILIAL.IDCNTRRESC, 'S') = 'N'
                       AND NVL(FILIAL.CDREGIAO, 'W') <> 'W')
   LOOP
      V_CHAVE_CDARV2 := '_';
      V_CHAVE_CDARV  := '_';
      SELECT NVL(SUM(QTESTOQUE * (NVL(CUSTO_PRODUTO(CDFILIAP, CDPRODESTO, P_CDTIPOCUSTO, SYSDATE, SYSDATE), 0))), 0)
        INTO V_VRTOTALFILEST
        FROM (SELECT DISTINCT ITMAPURPREC.QTESTOQUE, ITMAPURPREC.CDFILIAP, PRODUTO.CDPRODESTO
                FROM ITMAPURPREC, PRODUTO
               WHERE CDCENTITMAP = P_CDFILCENTCMP
                 AND NRSEQITMAP  = P_NRAPURPREC
                 AND ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO
                 AND PRODUTO.CDPRODUTO       = PRODUTO.CDPRODESTO
                 AND ITMAPURPREC.CDFILIAP    = C_FILIAL.CDFILIAL
                 AND PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'));
      FOR C_ITEM IN(SELECT CDCENTITMAP||NRSEQITMAP||CDREGITMAP||CDFORNITMAP||NRCOLEITMAP||
                           TO_CHAR(DTENTRAPUT, 'DD/MM/YYYY')||CDFILIAP||CDPRODITMAP||CDMARCITMAP ID,
                           ITMAPURPREC.CDFORNITMAP AS CDFORNECED, ITMAPURPREC.NRSEQITMAP AS NRAPURPREC,
                           'U' AS IDCHECK, FILIAL.CDFILIAL CDFILSOLI, FILIAL.NMFILIAL,
                           FILIAL.CDFILIAL || ' - ' || RPAD(SUBSTR(FILIAL.NMFILIAL, 1, 5), 5, ' ') DSFILIALC,
                           CASE P_TIPOTELA
                              WHEN 'G'
                              THEN FILIAL.CDFILIAL || ' - ' || FILIAL.NMFILIAL
                              ELSE CASE
                                      WHEN LENGTH(FILIAL.NMCOMPRZSFIL||FILIAL.SGFILIAL) <> 0
                                      THEN LPAD(NVL(NMCOMPRZSFIL, '0'), 2, '0') || ' - ' || RPAD(SUBSTR(NVL(FILIAL.SGFILIAL, '    '), 1, 4), 4, ' ')|| ' - ' || FILIAL.NMFILIAL
                                      ELSE FILIAL.CDFILIAL || ' - ' || FILIAL.NMFILIAL
                                   END
                           END DSFILIAL, APURPRECO.CDFILLANC CDFILLAN,
                           FILIAL.SGFILIAL,
                           NRSEQITMAP NRSOLICMP, PRODUTO.CDPRODUTO, DTENTRAPUT DTPROGENTR, QTACOMP QTSOLIPROD,
                           PRODUTO.NMPRODUTO, PRODUTO.CDARVPROD, PRODUTO.SGUNIDADE,
                           PRODUTO.CDARVPROD || ' - ' || PRODUTO.NMPRODUTO DSPRODUTO, MARCA.CDMARCA, MARCA.NMMARCA,
                           MARCA.CDMARCA || ' - ' || MARCA.NMMARCA DSMARCA, ITMAPURPREC.VRPRECUNIAP VRCUSTO,
                           (CUSTO_PRODUTO(FILIAL.CDFILIAL, PRODUTO.CDPRODESTO, P_CDTIPOCUSTO, SYSDATE, SYSDATE))*PRODUTO.VRFATOCONV VRPRECUNIAP,
                           ITMAPURPREC.NRORG, APURPRECO.QTDIAESTOQUE,
                           ITMAPURPREC.QTCONSUMODIA, ITMAPURPREC.QTESTOQUE, ITMAPURPREC.QTDURACAEST, ITMAPURPREC.QTCONSUMODIASEST,
                           ITMAPURPREC.QTITEMPED, ITMAPURPREC.QTPROGENTAF, ITMAPURPREC.QTENTRADAS, ITMAPURPREC.QTSAIDAS,
                           ITMAPURPREC.QTACOMP * ITMAPURPREC.VRPRECUNIAP VRCUSTOTOTAL, FORNECEDOR.NRINSJURFORN, FORNECEDOR.NMFANTFORN,
                           ITMAPURPREC.CDEXPRODFORN,
                           ((SELECT SUM(I.QTACOMP)
                             FROM ITMAPURPREC I
                            WHERE I.CDCENTITMAP     = P_CDFILCENTCMP
                              AND I.NRSEQITMAP      = P_NRAPURPREC
                              AND I.CDPRODITMAP     = ITMAPURPREC.CDPRODITMAP
                              AND I.NRCOLEITMAP     = ITMAPURPREC.NRCOLEITMAP
                              AND I.CDFORNITMAP     = ITMAPURPREC.CDFORNITMAP)) QTTOTAL,
                            ((SELECT SUM(I.QTACOMP * I.VRPRECUNIAP)
                             FROM ITMAPURPREC I
                            WHERE I.CDCENTITMAP     = P_CDFILCENTCMP
                              AND I.NRSEQITMAP      = P_NRAPURPREC
                              AND I.CDPRODITMAP     = ITMAPURPREC.CDPRODITMAP
                              AND I.NRCOLEITMAP     = ITMAPURPREC.NRCOLEITMAP
                              AND I.CDFORNITMAP     = ITMAPURPREC.CDFORNITMAP)) QTTOTALAF,
                           SUM(ITMAPURPREC.QTACOMP * ITMAPURPREC.VRPRECUNIAP) OVER (PARTITION BY ITMAPURPREC.NRSEQITMAP, ITMAPURPREC.CDFILIAP) VRTOTALFILCMP,
                           V_VRTOTALCMP VRTOTALCMP,
                           V_VRTOTALFILEST VRTOTALFILEST,
                           V_VRTOTALEST VRTOTALEST,
                           FILIAL.IDFUNCAOFILI, ITMAPURPREC.CDFORNITMAP, ENDEFILI.SGESTADO, MUNICIPIO.NMMUNICIPIO,
                           ((SELECT MAX(NVL(I.IDITMSELPREVCMP, 'N'))
                             FROM ITMAPURPREC I
                            WHERE I.CDCENTITMAP     = P_CDFILCENTCMP
                              AND I.NRSEQITMAP      = P_NRAPURPREC
                              AND I.CDPRODITMAP     = ITMAPURPREC.CDPRODITMAP
                              AND I.NRCOLEITMAP     = ITMAPURPREC.NRCOLEITMAP
                              AND I.CDFORNITMAP     = ITMAPURPREC.CDFORNITMAP)) MAX_IDITMSELPREVCMP,
                           FILIAL.NMCOMPRZSFIL, PRODUTO.VRFATOCONV, PRODUTO.CDPRODESTO,
                           V_CONTADOR CONTADOR,
                           NVL(ITMAPURPREC.IDITMSELPREVCMP, 'N') IDITMSELPREVCMP,
                           NVL(PRODUTO.CDPRODINTE, PRODUTO.CDARVPROD) CDPRODINTE
                      FROM ITMAPURPREC, PRODUTO, FILIAL, MARCA, APURPRECO, FORNECEDOR, ENDEFILI, MUNICIPIO
                     WHERE ITMAPURPREC.CDCENTITMAP = APURPRECO.CDFILCENTCMP
                       AND ITMAPURPREC.NRSEQITMAP = APURPRECO.NRAPURPREC
                       AND ITMAPURPREC.CDCENTITMAP = P_CDFILCENTCMP
                       AND ((NVL(ITMAPURPREC.IDITMSELPREVCMP, 'N') = 'N' AND  P_TIPOTELA = 'G') OR (P_TIPOTELA = 'C'))
                       AND ( ( INSTR(P_CDFORNECED, ITMAPURPREC.CDFORNITMAP) > 0 ) OR ( P_CDFORNECED = 'T' ) )
                       AND ITMAPURPREC.NRSEQITMAP = P_NRAPURPREC
                       AND ITMAPURPREC.CDFILIAP = FILIAL.CDFILIAL
                       AND ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO
                       AND ITMAPURPREC.CDMARCITMAP = MARCA.CDMARCA
                       AND ( ( INSTR(P_CDMARCA, ITMAPURPREC.CDMARCITMAP) > 0 ) OR ( P_CDMARCA = 'T' ) )
                       AND FILIAL.CDFILIAL = C_FILIAL.CDFILIAL
                       AND ITMAPURPREC.CDFORNITMAP = FORNECEDOR.CDFORNECED
                       AND ( PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z') )
                       AND ENDEFILI.CDFILIAL = FILIAL.CDFILIAL
                       AND NVL(ENDEFILI.IDTPENDEFILI, 'T') = 'P'
                       AND ENDEFILI.CDPAIS = MUNICIPIO.CDPAIS
                       AND ENDEFILI.SGESTADO = MUNICIPIO.SGESTADO
                       AND ENDEFILI.CDMUNICIPIO = MUNICIPIO.CDMUNICIPIO
                     ORDER BY PRODUTO.CDARVPROD, CASE
                                                    WHEN P_TIPOTELA = 'G'
                                                    THEN FILIAL.CDFILIAL || ' - ' || FILIAL.NMFILIAL
                                                    ELSE CASE
                                                            WHEN LENGTH(FILIAL.NMCOMPRZSFIL||FILIAL.SGFILIAL) <> 0
                                                            THEN LPAD(NVL(NMCOMPRZSFIL, '0'), 2, '0') || ' - ' || RPAD(SUBSTR(NVL(FILIAL.SGFILIAL, '    '), 1, 4), 4, ' ')|| ' - ' || FILIAL.NMFILIAL
                                                            ELSE FILIAL.CDFILIAL || ' - ' || FILIAL.NMFILIAL
                                                         END
                                                 END)
      LOOP
         V_NMPRODUTOOL  := NULL;
         V_CDARVPRODOL  := NULL;
         IF C_ITEM.IDFUNCAOFILI = 'O' THEN
            SELECT MAX(PRODUTOOL.NMPRODUTO), MAX(PRODUTOOL.CDARVPROD), MAX(RELACPRODOL.CDPRODARVOL)
              INTO V_NMPRODUTOOL, V_CDARVPRODOL, V_CDPRODARVOL
              FROM RELACPRODOL, PRODUTO PRODUTOOL
             WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
               AND RELACPRODOL.CDPRARVORIG = C_ITEM.CDPRODUTO
               AND RELACPRODOL.CDMARCA     = C_ITEM.CDMARCA;
         END IF;
         IF P_TIPOTELA = 'C' THEN
            IF V_CHAVE_CDARV <> C_ITEM.CDARVPROD THEN
               SELECT AVG((CUSTO_PRODUTO(FILIAL.CDFILIAL, C_ITEM.CDPRODESTO, P_CDTIPOCUSTO, SYSDATE, SYSDATE))*C_ITEM.VRFATOCONV) W
                 INTO V_VRPRECUNIAP
                 FROM FILIAL
                WHERE ( ( INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0 ) OR ( P_CDFILIAL = 'T' ) )
                  AND CUSTO_PRODUTO(FILIAL.CDFILIAL, C_ITEM.CDPRODESTO, P_CDTIPOCUSTO, SYSDATE, SYSDATE) > 0;
               V_CHAVE_CDARV := C_ITEM.CDARVPROD;
            END IF;
         ELSE
            V_VRPRECUNIAP := C_ITEM.VRPRECUNIAP;
         END IF;
         IF ((P_TIPOTELA = 'G') OR ((P_TIPOTELA = 'C')))THEN
            OUT_RECORD.ID               := C_ITEM.ID;
            OUT_RECORD.CDFORNECED       := C_ITEM.CDFORNECED;
            OUT_RECORD.CDFORNECED_OLD   := C_ITEM.CDFORNECED;
            OUT_RECORD.NRAPURPREC       := C_ITEM.NRAPURPREC;
            OUT_RECORD.NRINSJURFORN     := C_ITEM.NRINSJURFORN;
            OUT_RECORD.NMFANTFORN       := C_ITEM.NMFANTFORN;
            OUT_RECORD.CDEXPRODFORN     := C_ITEM.CDEXPRODFORN;
            OUT_RECORD.IDCHECK          := C_ITEM.IDCHECK;
            OUT_RECORD.CDFILSOLI        := C_ITEM.CDFILSOLI;
            OUT_RECORD.NMFILIAL         := C_ITEM.NMFILIAL;
            OUT_RECORD.DSFILIALC        := C_ITEM.DSFILIALC;
            OUT_RECORD.DSTIPO           := 'CMP';
            OUT_RECORD.DSFILIAL         := C_ITEM.DSFILIAL;
            OUT_RECORD.CDFILLAN         := C_ITEM.CDFILLAN;
            OUT_RECORD.NRSOLICMP        := C_ITEM.NRSOLICMP;
            OUT_RECORD.CDPRODUTO        := C_ITEM.CDPRODUTO;
            OUT_RECORD.DTPROGENTR       := C_ITEM.DTPROGENTR;
            OUT_RECORD.NMPRODUTO        := C_ITEM.NMPRODUTO;
            OUT_RECORD.CDARVPROD        := C_ITEM.CDARVPROD;
            OUT_RECORD.SGUNIDADE        := C_ITEM.SGUNIDADE;
            OUT_RECORD.DSPRODUTO        := C_ITEM.DSPRODUTO;
            OUT_RECORD.CDMARCA          := C_ITEM.CDMARCA;
            OUT_RECORD.NMMARCA          := C_ITEM.NMMARCA;
            OUT_RECORD.DSMARCA          := C_ITEM.DSMARCA;
            OUT_RECORD.VRCUSTO          := C_ITEM.VRCUSTO;
            OUT_RECORD.QTSOLIPROD       := C_ITEM.QTSOLIPROD;
            OUT_RECORD.VRPRECUNIAP      := V_VRPRECUNIAP;
            OUT_RECORD.NRORG            := C_ITEM.NRORG;
            OUT_RECORD.QTDIAESTOQUE     := C_ITEM.QTDIAESTOQUE;
            OUT_RECORD.QTCONSUMODIA     := C_ITEM.QTCONSUMODIA;
            OUT_RECORD.QTESTOQUE        := C_ITEM.QTESTOQUE;
            OUT_RECORD.QTDURACAEST      := C_ITEM.QTDURACAEST;
            OUT_RECORD.QTCONSUMODIASEST := C_ITEM.QTCONSUMODIASEST;
            OUT_RECORD.QTITEMPED        := C_ITEM.QTITEMPED;
            OUT_RECORD.QTPROGENTAF      := C_ITEM.QTPROGENTAF;
            OUT_RECORD.QTENTRADAS       := C_ITEM.QTENTRADAS;
            OUT_RECORD.QTSAIDAS         := C_ITEM.QTSAIDAS;
            OUT_RECORD.VRCUSTOTOTAL     := C_ITEM.VRCUSTOTOTAL;
            OUT_RECORD.QTTOTAL          := C_ITEM.QTTOTAL;
            OUT_RECORD.NMPRODUTOOL      := V_NMPRODUTOOL;
            OUT_RECORD.CDARVPRODOL      := V_CDARVPRODOL;
            OUT_RECORD.CDFILCENTCMP     := P_CDFILCENTCMP;
            OUT_RECORD.SGESTADO         := C_ITEM.SGESTADO;
            OUT_RECORD.NMMUNICIPIO      := C_ITEM.NMMUNICIPIO;
            OUT_RECORD.CONTADOR         := C_ITEM.CONTADOR;
            OUT_RECORD.IDITMSELPREVCMP  := C_ITEM.IDITMSELPREVCMP;
            OUT_RECORD.NMCOMPRZSFIL     := C_ITEM.NMCOMPRZSFIL;
            OUT_RECORD.VRTOTALFILCMP    := C_ITEM.VRTOTALFILCMP;
            OUT_RECORD.VRTOTALCMP       := C_ITEM.VRTOTALCMP;
            OUT_RECORD.VRTOTALFILEST    := C_ITEM.VRTOTALFILEST;
            OUT_RECORD.VRTOTALEST       := C_ITEM.VRTOTALEST;
            OUT_RECORD.VRCUSTOEST       := C_ITEM.VRPRECUNIAP*C_ITEM.QTESTOQUE;
            OUT_RECORD.SGFILIAL         := C_ITEM.SGFILIAL;
            OUT_RECORD.CDPRODINTE       := C_ITEM.CDPRODINTE;
            IF C_ITEM.MAX_IDITMSELPREVCMP = 'S' THEN
               OUT_RECORD.QTTOTALAF      := NVL(C_ITEM.QTTOTALAF, 0);
               OUT_RECORD.QTTOTALCMP     := 0;
            ELSE
               OUT_RECORD.QTTOTALAF      := 0;
               OUT_RECORD.QTTOTALCMP     := NVL(C_ITEM.QTTOTALAF, 0);
            END IF;
            IF P_TIPOTELA  = 'C' THEN
               OUT_RECORD.QTESTOQUE     := TRUNC(C_ITEM.QTESTOQUE);
               OUT_RECORD.QTSOLIPROD    := TRUNC(C_ITEM.QTSOLIPROD);
               /*OUT_RECORD.NMPRODUTO     := RPAD(SUBSTR(C_ITEM.NMPRODUTO, 1, 20), 20, '. .');*/
               OUT_RECORD.NRINSJURFORN  := C_ITEM.NRINSJURFORN||' - '||C_ITEM.NMFANTFORN;
               IF NVL(C_ITEM.VRCUSTO, 0) = 0 THEN
                  /*C_ITEM.VRCUSTO              := NULL;*/
                  OUT_RECORD.NRINSJURFORN     := NULL;
                  OUT_RECORD.NMFANTFORN       := NULL;
                  /*OUT_RECORD.CDEXPRODFORN     := NULL;
                  OUT_RECORD.CDFORNECED       := NULL;*/
               END IF;
            END IF;
            IF (SUBSTR(V_UM_REGISTRO, 2, 1) = 'S') THEN
               IF V_CHAVE_CDARV2 <> C_ITEM.CDARVPROD THEN
                  V_CHAVE_CDARV2 := C_ITEM.CDARVPROD;
                  PIPE ROW (OUT_RECORD);
               END IF;
            ELSE
               PIPE ROW (OUT_RECORD);
            END IF;

            IF ((P_TIPOTELA  = 'C') AND (V_UM_REGISTRO = 'NN'))THEN
               OUT_RECORD.DSFILIALC     := C_ITEM.DSFILIALC;
               OUT_RECORD.DSTIPO        := 'EST';
               OUT_RECORD.QTESTOQUE     := TRUNC(C_ITEM.QTESTOQUE);
               OUT_RECORD.QTSOLIPROD    := TRUNC(C_ITEM.QTESTOQUE);
               PIPE ROW (OUT_RECORD);
            END IF;
            IF SUBSTR(V_UM_REGISTRO, 1, 1) = 'S' THEN
               EXIT;
            END IF;
         END IF;
      END LOOP;
   END LOOP;
END;
/