DROP FUNCTION CURVA_ABC_PROD_FORN_CMP
/

DROP FUNCTION CURVA_ABC_AF_NF_CMP
/

DROP TYPE CURVA_ABC_PROD_FORN_CMP_TABLE
/

DROP TYPE CURVA_ABC_PROD_FORN_CMP_TYPE
/

CREATE TYPE CURVA_ABC_PROD_FORN_CMP_TYPE AS
OBJECT(LISTA_REGIAO     VARCHAR2(1000),
       CDREGIAO         VARCHAR2(3),
       NMREGIAO         VARCHAR2(30),
       LISTA_FILIAL     VARCHAR2(1000),
       CDFILIAL         VARCHAR2(4),
       NMFILIAL         VARCHAR2(30),
       LISTA_GRUPFILI   VARCHAR2(1000),
       CDPRODUTO        VARCHAR2(10),
       CDARVPROD        VARCHAR2(20),
       NMPRODUTO        VARCHAR2(50),
       SGUNIDADE        VARCHAR2(10),
       DTENTRINI        DATE,
       DTENTRFIN        DATE,
       DTGERAINI        DATE,
       DTGERAFIN        DATE,
       CDPRODINICIAL    VARCHAR2(20),
       NMDPRODINICIAL   VARCHAR2(50),
       CDPRODFINAL      VARCHAR2(20),
       NMPRODFINAL      VARCHAR2(50),
       CDOPERADOR       VARCHAR2(12),
       NMOPERADOR       VARCHAR2(40),
       CDFORNECED       VARCHAR2(21),
       NRINSJURFORN     VARCHAR2(20),
       IDTPIJURFORN     VARCHAR2(1),
       NMRAZSOCFORN     VARCHAR2(100),
       NMFANTFORN       VARCHAR2(40),
       CDGRUPPROD       VARCHAR2(10),
       NMGRUPPROD       VARCHAR2(40),
       TIPOCURVA        VARCHAR2(1),
       CDOPERGESTOR     VARCHAR2(12),
       NMOPERGESTOR     VARCHAR2(40),
       EXIBE_PROD       VARCHAR2(1),
       RELATORIO        VARCHAR2(1),

       QTTOT            FLOAT,
       VRMED            FLOAT,
       VRTOT            FLOAT,
       VRPERCENTG       FLOAT,
       VRPECURVA        FLOAT,
       VRTOTCURVA       FLOAT,
       VRTOTG           FLOAT,
       VRTOTPROD        FLOAT,
       VRCUSTO          FLOAT)
/

CREATE TYPE CURVA_ABC_PROD_FORN_CMP_TABLE AS TABLE OF CURVA_ABC_PROD_FORN_CMP_TYPE
/

CREATE OR REPLACE FUNCTION CURVA_ABC_AF_NF_CMP (P_RELATORIO       IN VARCHAR2,
                                                P_DADO            IN VARCHAR2,
                                                P_CDGRUPFILI      IN VARCHAR2,
                                                P_TCDGRUPFILI     IN VARCHAR2,
                                                P_EXIBE_GRUPFILI  IN VARCHAR2,
                                                P_CDREGIAO        IN VARCHAR2,
                                                P_TCDREGIAO       IN VARCHAR2,
                                                P_EXIBE_REGIAO    IN VARCHAR2,
                                                P_CDFILIAL        IN VARCHAR2,
                                                P_TCDFILIAL       IN VARCHAR2,
                                                P_EXIBE_FILIAL    IN VARCHAR2,
                                                P_DTENTRINI       IN DATE,
                                                P_DTENTRFIN       IN DATE,
                                                P_TDTENTREGA      IN VARCHAR2,
                                                P_DTGERAINI       IN DATE,
                                                P_DTGERAFIN       IN DATE,
                                                P_TDTGERACAO      IN VARCHAR2,
                                                P_CDNVPRODUTO     IN VARCHAR2,
                                                P_SUBGRUPO        IN VARCHAR2,
                                                P_TSUBGRUPO       IN VARCHAR2,
                                                P_CDFORNECED      IN VARCHAR2,
                                                P_TCDFORNECED     IN VARCHAR2,

                                                P_CDOPERADOR      IN VARCHAR2,
                                                P_TCDOPERADOR     IN VARCHAR2,

                                                P_CDPRODINI       IN VARCHAR2,
                                                P_CDPRODFIN       IN VARCHAR2,
                                                P_IDBAIXAAF       IN VARCHAR2,
                                                P_TIDBAIXAAF      IN VARCHAR2,
                                                P_IDAFEXPIRADA    IN VARCHAR2,
                                                P_TIDAFEXPIRADA   IN VARCHAR2,
                                                P_CONSISTE_BAIXA  IN VARCHAR2,
                                                P_VALOR_EFETIVADO IN VARCHAR2,
                                                P_IDFILIATIVA     IN VARCHAR2,
                                                P_TIDFILIATIVA    IN VARCHAR2,
                                                P_FILIAL_LOGADA   IN VARCHAR2,
                                                P_EXIBE_PROD      IN VARCHAR2,
                                                P_CUSTO           IN VARCHAR2, /*UTILIZADO APENAS EM NF, PARA GRAVAR O VALOR DO RESPECTIVO CUSTO NO LUGAR DO CUSTO DO ITEM DE NF*/
                                                P_OPERADORLOG     IN VARCHAR2)
 RETURN CURVA_ABC_PROD_FORN_CMP_TABLE PIPELINED
IS
  V_CDGRUPPROD   VARCHAR2(10);
  V_CDNVPRODUTO  NUMERIC;
  TYPE CURTYPE   IS REF CURSOR;
  C_BASE         CURTYPE;

  V_CDFILDEST    ITEMAUTF.CDFILDEST%TYPE;
  V_NMFILIAL     FILIAL.NMFILIAL%TYPE;
  V_CDREGIAO     FILIAL.CDREGIAO%TYPE;
  V_NMREGIAO     REGIAO.NMREGIAO%TYPE;
  V_CDARVPROD    PRODUTO.CDARVPROD%TYPE;
  V_SGUNIDADE    PRODUTO.SGUNIDADE%TYPE;
  V_NMPRODUTO    PRODUTO.NMPRODUTO%TYPE;
  V_IDTPIJURFORN FORNECEDOR.IDTPIJURFORN%TYPE;
  V_NRINSJURFORN FORNECEDOR.NRINSJURFORN%TYPE;
  V_NMRAZSOCFORN FORNECEDOR.NMRAZSOCFORN%TYPE;
  V_CDOPERGESTOR OPERADOR.CDOPERADOR%TYPE;
  V_NMOPERGESTOR OPERADOR.NMOPERADOR%TYPE;
  V_QTTOT        FLOAT;
  V_VRMED        FLOAT;
  V_VRTOT        FLOAT;
  V_RELATORIO    VARCHAR2(1) := P_RELATORIO;
  V_DTENTRSAID   DATE;
  V_CDPRODESTO   PRODUTO.CDPRODESTO%TYPE;
  V_VRFATOCONV   PRODUTO.VRFATOCONV%TYPE;
  V_NRLANCTONF   ITEMPRODUTO.NRLANCTONF%TYPE;
  V_NRSEQITPROD  ITEMPRODUTO.NRSEQITPROD%TYPE;
  V_IDRESTRFILIOPER VARCHAR2(1);
  V_LISTA_FILIAL    VARCHAR2(1000);
  V_LISTA_REGIAO    VARCHAR2(1000);
  V_CONTADOR        NUMERIC := 0;
  V_CONTADORTOTAL   NUMERIC;
  V_IDFILIATIVA     VARCHAR2(1) := P_IDFILIATIVA;
OUT_RECORD CURVA_ABC_PROD_FORN_CMP_TYPE := CURVA_ABC_PROD_FORN_CMP_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);
BEGIN
   IF P_IDFILIATIVA = 'N' THEN
      V_IDFILIATIVA := 'S';
   ELSIF P_IDFILIATIVA = 'S' THEN
      V_IDFILIATIVA := 'N';
   END IF;
   SELECT NVL(MAX(CDGRUPPROD), '0')
     INTO V_CDGRUPPROD
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL    = P_FILIAL_LOGADA;
   SELECT LENGTH(MAX(CDARVPROD))
     INTO V_CDNVPRODUTO
     FROM PRODUTO
    WHERE CDNVPRODUTO = P_CDNVPRODUTO;
   IF P_EXIBE_PROD = 'S' THEN
      V_RELATORIO := 'P';
   END IF;
   SELECT NVL(MAX(IDRESTRFILIOPER), 'N')
     INTO V_IDRESTRFILIOPER
     FROM PARAMGERAL;
   IF P_DADO = 'A' THEN
      IF P_VALOR_EFETIVADO = 'N' THEN
         OPEN C_BASE FOR
            SELECT ITEMAUTF.CDFILDEST, FIL.NMFILIAL,
                   FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.QTPROGENTAF, ITEMAUTF.QTPROGENTAF * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.VRPREUNIAF, ITEMAUTF.VRPREUNIAF/PRODUTO.VRFATOCONV)  AS VRMED,
                   ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF AS VRTOT,
                   ITEMAUTF.DTPROGENTAF DTENTRSAID, ITEMAUTF.NRAUTOFORN NRLANCTONF, '' NRSEQITPROD,
                   COUNT(ITEMAUTF.VRPREUNIAF) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,
                   ITEMAUTF, AUTOFORNE,
                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = V_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = ITEMAUTF.CDFILDEST)
               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
               AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
               AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
               AND AUTOFORNE.CDFORNECED = FORNECEDOR.CDFORNECED
               AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)
               AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
               AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
               AND (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
               AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
               AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
               AND NVL(AUTOFORNE.IDBAIXAAF,'0')              <> '6'
               AND (ITEMAUTF.CDPRODUTO                        = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO                        = PRODESTO.CDPRODUTO)
               AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, '0')) > 0) OR (P_TIDBAIXAAF  = 'T'))
               AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
               AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
               AND ((NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = P_IDAFEXPIRADA) OR (P_TIDAFEXPIRADA =  'T'))

               AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0'

               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = ITEMAUTF.CDFILDEST))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, ITEMAUTF.CDFILDEST;
      ELSE
         OPEN C_BASE FOR
            SELECT DISTINCT ITEMAUTF.CDFILDEST, FIL.NMFILIAL, FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.QTPROGENTAF, ITEMAUTF.QTPROGENTAF * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMAUTF.VRPREUNIAF, ITEMAUTF.VRPREUNIAF/PRODUTO.VRFATOCONV)  AS VRMED,
                   ITEMAUTF.QTPROGENTAF * ITEMAUTF.VRPREUNIAF AS VRTOT,
                   ITEMAUTF.DTPROGENTAF DTENTRSAID, ITEMAUTF.NRAUTOFORN NRLANCTONF, '' NRSEQITPROD,
                   COUNT(ITEMAUTF.VRPREUNIAF) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,

                   (SELECT  NOTAFISCAL.CDFILIRECE CDFILDEST, NOTAFISCAL.CDFILIAL CDFILLANC, NOTAFISCAL.NRLANCTONF NRAUTOFORN, ITEMPRODUTO.CDPRODUTO, NOTAFISCAL.DTENTRSAID DTPROGENTAF, 'N' IDITAFMIGRADA,
                           ITEMPRODUTO.QTITEMPROD QTPROGENTAF,
                           ITEMPRODUTO.VRUNITITEM VRPREUNIAF,
                           NOTAFISCAL.CDFORNECED
                      FROM NOTAFISCAL, ITEMPRODUTO, PRODUTO, FILIAL
                     WHERE NOTAFISCAL.CDFILIAL      = ITEMPRODUTO.CDFILIAL
                       AND NOTAFISCAL.NRLANCTONF    = ITEMPRODUTO.NRLANCTONF
                       AND NOTAFISCAL.CDFILIRECE    = FILIAL.CDFILIAL
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((INSTR(P_CDFORNECED, NOTAFISCAL.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                       AND ITEMPRODUTO.CDPRODUTO    = PRODUTO.CDPRODUTO
                       AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
                       AND NOTAFISCAL.IDENTRSAIDOP = 'E'
                       AND EXISTS(SELECT 1
                                    FROM ITEMAUTF, AUTOFORNE, NFRELACAF, PRODUTO PR
                                   WHERE NFRELACAF.CDFILIAL      = NOTAFISCAL.CDFILIAL
                                     AND NFRELACAF.NRLANCTONF    = NOTAFISCAL.NRLANCTONF
                                     AND ITEMAUTF.CDFILDEST      = NFRELACAF.CDFILDEST
                                     AND ITEMAUTF.CDFILLANC      = NFRELACAF.CDFILLANC
                                     AND ITEMAUTF.NRAUTOFORN     = NFRELACAF.NRAUTOFORN
                                     AND ITEMAUTF.CDMARCA        = NFRELACAF.CDMARCA
                                     AND ITEMAUTF.CDPRODUTO      = NFRELACAF.CDPRODUTO
                                     AND ITEMAUTF.DTPROGENTAF    = NFRELACAF.DTPROGENTAF
                                     AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                                     AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
                                     AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
                                     AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
                                     AND (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
                                     AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
                                     AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
                                     AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, '0')) > 0) OR (P_TIDBAIXAAF  = 'T'))
                                     AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
                                     AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
                                     AND ((NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = P_IDAFEXPIRADA) OR (P_TIDAFEXPIRADA =  'T'))
                                     AND ITEMAUTF.CDPRODUTO      = PR.CDPRODUTO
                                     AND PR.CDPRODESTO           = PRODUTO.CDPRODESTO

                                     AND (PR.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
                                     AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
                                     AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0'
                                     AND NVL(ITEMAUTF.IDBAIXITMAF, '0') IN ('1', '2'))
                     UNION
                    SELECT ITEMAUTF.CDFILDEST, ITEMAUTF.CDFILLANC, ITEMAUTF.NRAUTOFORN, ITEMAUTF.CDPRODUTO, ITEMAUTF.DTPROGENTAF, ITEMAUTF.IDITAFMIGRADA,
                           NVL(ITEMAUTF.QTPROGENTAF, 0) - NVL(ITEMAUTF.QTEFETENTRAF, 0) QTPROGENTAF,
                           ITEMAUTF.VRPREUNIAF,
                           AUTOFORNE.CDFORNECED
                      FROM ITEMAUTF, AUTOFORNE, PRODUTO
                     WHERE (ITEMAUTF.CDFILDEST                        = AUTOFORNE.CDFILDEST)
                       AND (ITEMAUTF.CDFILLANC                        = AUTOFORNE.CDFILLANC)
                       AND (ITEMAUTF.NRAUTOFORN                       = AUTOFORNE.NRAUTOFORN)
                       AND ITEMAUTF.CDPRODUTO      = PRODUTO.CDPRODUTO
                       AND ((INSTR(P_CDFORNECED, AUTOFORNE.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
                       AND ((INSTR(P_CDOPERADOR, AUTOFORNE.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
                       AND NVL(AUTOFORNE.IDBAIXAAF,'0')              NOT IN ('3', '4', '5', '6')
                       AND NVL(ITEMAUTF.IDBAIXITMAF, '0') IN ('0', '1')
                       AND ((INSTR(P_IDBAIXAAF, NVL(AUTOFORNE.IDBAIXAAF, '0')) > 0) OR (P_TIDBAIXAAF  = 'T'))
                       AND (AUTOFORNE.IDSITUATUAAF                   IS NULL)
                       AND (NVL(AUTOFORNE.IDAFFORALIM, 'N')          = 'N')
                       AND (NVL(AUTOFORNE.IDAFEXPIRADA, 'N')         = 'N')
                       AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
                       AND ((AUTOFORNE.DTAUTOFORN BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
                       AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
                       AND NVL(ITEMAUTF.IDITAFMIGRADA, 'N')||NVL(ITEMAUTF.IDBAIXITMAF, '0') <> 'S0') ITEMAUTF,

                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = V_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = ITEMAUTF.CDFILDEST)
               AND ITEMAUTF.CDFORNECED = FORNECEDOR.CDFORNECED
               AND (ITEMAUTF.CDPRODUTO                        = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO                        = PRODESTO.CDPRODUTO)
               AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)

               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = ITEMAUTF.CDFILDEST))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, ITEMAUTF.CDFILDEST;
      END IF;
   ELSE
      IF P_CUSTO IS NULL THEN
         OPEN C_BASE FOR
            SELECT NOTAFISCAL.CDFILIRECE, FIL.NMFILIAL, FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMPRODUTO.QTITEMPROD, ITEMPRODUTO.QTITEMPROD * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMPRODUTO.VRUNITITEM, ITEMPRODUTO.VRUNITITEM/ PRODUTO.VRFATOCONV)  AS VRMED,
                   (ITEMPRODUTO.QTITEMPROD * ITEMPRODUTO.VRUNITITEM) VRTOT,
                   NOTAFISCAL.DTENTRSAID, ITEMPRODUTO.NRLANCTONF, ITEMPRODUTO.NRSEQITPROD,
                   COUNT(ITEMPRODUTO.VRUNITITEM) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,
                   ITEMPRODUTO, NOTAFISCAL, TIPOOPERAC,
                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = V_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = NOTAFISCAL.CDFILIRECE)
               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
               AND ((NOTAFISCAL.DTENTRSAID BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
               AND NOTAFISCAL.CDFORNECED = FORNECEDOR.CDFORNECED
               AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)
               AND ((INSTR(P_CDFORNECED, NOTAFISCAL.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
               --AND ((INSTR(P_CDOPERADOR, NOTAFISCAL.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
               --AND ((ITEMPRODUTO.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
               AND ITEMPRODUTO.CDFILIAL    = NOTAFISCAL.CDFILIAL
               AND ITEMPRODUTO.NRLANCTONF  = NOTAFISCAL.NRLANCTONF
               AND NOTAFISCAL.CDTIPOOPER   = TIPOOPERAC.CDTIPOOPER
               AND TIPOOPERAC.IDENTRSAIDOP = NOTAFISCAL.IDENTRSAIDOP
               AND NOTAFISCAL.IDENTRSAIDOP = 'E'
               AND (((TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'N' ))
                OR (( TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'S' ) AND (NVL(TIPOOPERAC.IDOPERDEVONF, 'N')  <> 'S')))
               AND (ITEMPRODUTO.CDPRODUTO  = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO     = PRODESTO.CDPRODUTO)
               /*AND NVL(NOTAFISCAL.CDFORNECED, '{')  = CASE
                                                         WHEN LENGTH(P_CUSTO) > 0
                                                         THEN NVL(NOTAFISCAL.CDFORNECED, '}')
                                                         ELSE NVL(NOTAFISCAL.CDFORNECED, '{')
                                                      END*/
               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = NOTAFISCAL.CDFILIRECE))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, NOTAFISCAL.CDFILIRECE;
      ELSE
         OPEN C_BASE FOR
            SELECT NOTAFISCAL.CDFILIRECE, FIL.NMFILIAL, FIL.CDREGIAO, FIL.NMREGIAO,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO)
                      ELSE ''
                   END AS CDARVPROD,
                   CASE V_RELATORIO
                      WHEN 'P'
                      THEN DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), PRODUTO.SGUNIDADE, PRODESTO.SGUNIDADE)
                      ELSE ''
                   END AS SGUNIDADE,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.IDTPIJURFORN
                      ELSE ''
                   END IDTPIJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NRINSJURFORN
                      ELSE ''
                   END NRINSJURFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.NMRAZSOCFORN
                      ELSE ''
                   END NMRAZSOCFORN,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN FORNECEDOR.CDOPERGESTOR
                      ELSE ''
                   END CDOPERGESTOR ,
                   CASE P_RELATORIO
                      WHEN 'F'
                      THEN OPERADOR.NMOPERADOR
                      ELSE ''
                   END NMOPERGESTOR,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), ITEMPRODUTO.QTITEMPROD, ITEMPRODUTO.QTITEMPROD * PRODUTO.VRFATOCONV) AS QTTOT,
                   DECODE(PRODUTO.CDARVPROD, SUBSTR(PRODUTO.CDARVPROD, 1, V_CDNVPRODUTO), (CUSTO_PRODUTO(NOTAFISCAL.CDFILIRECE, PRODUTO.CDPRODESTO, P_CUSTO, NOTAFISCAL.DTENTRSAID, SYSDATE)*(PRODUTO.VRFATOCONV)), CUSTO_PRODUTO(NOTAFISCAL.CDFILIRECE, PRODUTO.CDPRODESTO, P_CUSTO, NOTAFISCAL.DTENTRSAID, SYSDATE))  AS VRMED,
                   (ITEMPRODUTO.QTITEMPROD * ((CUSTO_PRODUTO(NOTAFISCAL.CDFILIRECE, PRODUTO.CDPRODESTO, P_CUSTO, NOTAFISCAL.DTENTRSAID, SYSDATE)*(PRODUTO.VRFATOCONV)))) VRTOT,
                   NOTAFISCAL.DTENTRSAID, ITEMPRODUTO.NRLANCTONF, ITEMPRODUTO.NRSEQITPROD,
                   COUNT(CUSTO_PRODUTO(NOTAFISCAL.CDFILIRECE, PRODUTO.CDPRODESTO, P_CUSTO, NOTAFISCAL.DTENTRSAID, SYSDATE)*(PRODUTO.VRFATOCONV)) OVER () CONTADORTOTAL
              FROM PRODUTO, PRODUTO PRODESTO, FORNECEDOR, OPERADOR,
                   ITEMPRODUTO, NOTAFISCAL, TIPOOPERAC,
                   (SELECT FILIAL.CDFILIAL, FILIAL.NMFILIAL, FILIAL.CDREGIAO, REGIAO.NMREGIAO
                      FROM FILIAL, REGIAO
                     WHERE FILIAL.CDREGIAO = REGIAO.CDREGIAO
                       AND ((INSTR(P_CDFILIAL, FILIAL.CDFILIAL) > 0) OR (P_TCDFILIAL   = 'T'))
                       AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) <> 0) OR (P_TCDREGIAO  = 'T'))
                       AND ((FILIAL.IDCNTRRESC                  = V_IDFILIATIVA) OR (P_TIDFILIATIVA  = 'T'))
                       AND ((V_IDRESTRFILIOPER = 'N') OR EXISTS (SELECT 1
				                                                     		        FROM FILIOPER
				                                                     		       WHERE FILIOPER.CDFILIAL = FILIAL.CDFILIAL
				                                                     		         AND FILIOPER.CDOPERADOR = P_OPERADORLOG))
                       AND ((P_TCDGRUPFILI = 'T') OR
                            EXISTS (SELECT 1
                                      FROM FILGRUPFILI
                                     WHERE FILGRUPFILI.CDFILIAL = FILIAL.CDFILIAL
                                      AND (FILGRUPFILI.CDGRUPFILI                     = P_CDGRUPFILI)))) FIL
             WHERE (FIL.CDFILIAL = NOTAFISCAL.CDFILIRECE)
               AND (PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'))
               AND ((NOTAFISCAL.DTENTRSAID BETWEEN P_DTGERAINI AND P_DTGERAFIN) OR (P_TDTGERACAO = 'T'))
               AND NOTAFISCAL.CDFORNECED = FORNECEDOR.CDFORNECED
               AND FORNECEDOR.CDOPERGESTOR = OPERADOR.CDOPERADOR(+)
               AND ((INSTR(P_CDFORNECED, NOTAFISCAL.CDFORNECED) > 0)  OR (P_TCDFORNECED = 'T'))
               --AND ((INSTR(P_CDOPERADOR, NOTAFISCAL.CDOPERADOR) > 0)  OR (P_TCDOPERADOR = 'T'))
               --AND ((ITEMPRODUTO.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTREGA = 'T'))
               AND ITEMPRODUTO.CDFILIAL    = NOTAFISCAL.CDFILIAL
               AND ITEMPRODUTO.NRLANCTONF  = NOTAFISCAL.NRLANCTONF
               AND NOTAFISCAL.CDTIPOOPER   = TIPOOPERAC.CDTIPOOPER
               AND TIPOOPERAC.IDENTRSAIDOP = NOTAFISCAL.IDENTRSAIDOP
               AND NOTAFISCAL.IDENTRSAIDOP = 'E'
               AND (((TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'N' ))
                OR (( TIPOOPERAC.IDGERANFCMP  = 'S') AND (P_DADO = 'S' ) AND (NVL(TIPOOPERAC.IDOPERDEVONF, 'N')  <> 'S')))
               AND (ITEMPRODUTO.CDPRODUTO  = PRODUTO.CDPRODUTO)
               AND (PRODUTO.CDPRODESTO     = PRODESTO.CDPRODUTO)
               /*AND NVL(NOTAFISCAL.CDFORNECED, '{')  = CASE
                                                         WHEN LENGTH(P_CUSTO) > 0
                                                         THEN NVL(NOTAFISCAL.CDFORNECED, '}')
                                                         ELSE NVL(NOTAFISCAL.CDFORNECED, '{')
                                                      END*/
               AND ((P_TSUBGRUPO = 'T') OR (EXISTS (SELECT CDGRUPPROD
                                                      FROM PRSUBGRPROD
                                                     WHERE (PRSUBGRPROD.CDGRUPPROD   = V_CDGRUPPROD)
                                                       AND ((PRSUBGRPROD.CDFILISUBGR = 'P') OR (PRSUBGRPROD.CDFILISUBGR  = NOTAFISCAL.CDFILIRECE))
                                                       AND (PRSUBGRPROD.CDPRODUTO    = PRODUTO.CDPRODUTO)
                                                       AND (INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) <> 0))))
             ORDER BY FIL.CDREGIAO, NOTAFISCAL.CDFILIRECE;

      END IF;
   END IF;
   LOOP
      FETCH C_BASE INTO V_CDFILDEST, V_NMFILIAL, V_CDREGIAO, V_NMREGIAO,
                        V_CDARVPROD, V_SGUNIDADE, V_IDTPIJURFORN,
                        V_NRINSJURFORN, V_NMRAZSOCFORN, V_CDOPERGESTOR, V_NMOPERGESTOR,
                        V_QTTOT, V_VRMED, V_VRTOT, V_DTENTRSAID, V_NRLANCTONF, V_NRSEQITPROD,
                        V_CONTADORTOTAL;
      EXIT WHEN C_BASE%NOTFOUND;
      V_CONTADOR := V_CONTADOR+1;
      V_NMPRODUTO  := '';
      V_CDPRODESTO := '';
      IF LENGTH(V_CDARVPROD) > 0 THEN
         SELECT MAX(NMPRODUTO), MAX(CDPRODESTO), NVL(MAX(PRODUTO.VRFATOCONV), 1)
           INTO V_NMPRODUTO, V_CDPRODESTO, V_VRFATOCONV
           FROM PRODUTO
          WHERE CDARVPROD = V_CDARVPROD;
      END IF;
      /*IF NVL(P_CUSTO, 'W') <> 'W' THEN
         OUT_RECORD.VRCUSTO := ((CUSTO_PRODUTO(V_CDFILDEST, V_CDPRODESTO, P_CUSTO, V_DTENTRSAID, SYSDATE))*(V_VRFATOCONV));
      END IF; */
      IF P_EXIBE_FILIAL = 'C' THEN
         IF V_LISTA_FILIAL IS NULL THEN
            V_LISTA_FILIAL    := V_LISTA_FILIAL||V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ';
         ELSE
            IF INSTR(V_LISTA_FILIAL||'_', V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ') = 0 THEN
               V_LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL||V_CDFILDEST||' - '||SUBSTR(V_NMFILIAL, 1, 15)||' / ', 1, 1000);
            END IF;
         END IF;
      END IF;
      IF P_EXIBE_REGIAO = 'L' THEN
         IF V_LISTA_REGIAO IS NULL THEN
            V_LISTA_REGIAO    := V_LISTA_REGIAO||V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ';
         ELSE
            IF INSTR(V_LISTA_REGIAO||'_', V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ') = 0 THEN
               V_LISTA_REGIAO := SUBSTR(V_LISTA_REGIAO||V_CDREGIAO||' - '||SUBSTR(V_NMREGIAO, 1, 15)||' / ', 1, 1000);
            END IF;
         END IF;
      END IF;
      IF V_CONTADORTOTAL = V_CONTADOR THEN
         OUT_RECORD.LISTA_REGIAO := SUBSTR(V_LISTA_REGIAO, 1, LENGTH(V_LISTA_REGIAO)-3);
         OUT_RECORD.LISTA_FILIAL := SUBSTR(V_LISTA_FILIAL, 1, LENGTH(V_LISTA_FILIAL)-3);
      END IF;
      OUT_RECORD.CDFILIAL         := V_CDFILDEST;
      OUT_RECORD.NMFILIAL         := V_NMFILIAL;
      OUT_RECORD.CDREGIAO         := V_CDREGIAO;
      OUT_RECORD.NMREGIAO         := V_NMREGIAO;
      OUT_RECORD.CDFILIAL         := V_CDFILDEST;
      OUT_RECORD.NMFILIAL         := V_NMFILIAL;
      OUT_RECORD.CDARVPROD        := V_CDARVPROD;
      OUT_RECORD.SGUNIDADE        := V_SGUNIDADE;
      OUT_RECORD.NMPRODUTO        := V_NMPRODUTO;
      OUT_RECORD.QTTOT            := V_QTTOT;
      OUT_RECORD.VRMED            := V_VRMED;
      /*IF NVL(P_CUSTO, 'W') = 'W' THEN
         OUT_RECORD.VRTOT         := V_VRTOT;
      ELSE
         OUT_RECORD.VRTOT := (V_VRMED - OUT_RECORD.VRCUSTO)*V_QTTOT;
      END IF;*/
      OUT_RECORD.VRTOT            := V_VRTOT;
      OUT_RECORD.IDTPIJURFORN     := V_IDTPIJURFORN;
      OUT_RECORD.NRINSJURFORN     := V_NRINSJURFORN;
      OUT_RECORD.NMRAZSOCFORN     := V_NMRAZSOCFORN;
      OUT_RECORD.CDOPERGESTOR     := V_CDOPERGESTOR;
      OUT_RECORD.NMOPERGESTOR     := V_NMOPERGESTOR;
      PIPE ROW (OUT_RECORD);
   END LOOP;
   CLOSE C_BASE;
END;
/

CREATE OR REPLACE FUNCTION CURVA_ABC_PROD_FORN_CMP (P_RELATORIO       IN VARCHAR2,
                                                    P_DADO            IN VARCHAR2,
                                                    P_CDGRUPFILI      IN VARCHAR2,
                                                    P_TCDGRUPFILI     IN VARCHAR2,
                                                    P_EXIBE_GRUPFILI  IN VARCHAR2,
                                                    P_CDREGIAO        IN VARCHAR2,
                                                    P_TCDREGIAO       IN VARCHAR2,
                                                    P_EXIBE_REGIAO    IN VARCHAR2,
                                                    P_CDFILIAL        IN VARCHAR2,
                                                    P_TCDFILIAL       IN VARCHAR2,
                                                    P_EXIBE_FILIAL    IN VARCHAR2,
                                                    P_DTENTRINI       IN DATE,
                                                    P_DTENTRFIN       IN DATE,
                                                    P_TDTENTREGA      IN VARCHAR2,
                                                    P_DTGERAINI       IN DATE,
                                                    P_DTGERAFIN       IN DATE,
                                                    P_TDTGERACAO      IN VARCHAR2,
                                                    P_CDNVPRODUTO     IN VARCHAR2,
                                                    P_SUBGRUPO        IN VARCHAR2,
                                                    P_TSUBGRUPO       IN VARCHAR2,
                                                    P_CDFORNECED      IN VARCHAR2,
                                                    P_TCDFORNECED     IN VARCHAR2,

                                                    P_CDOPERADOR      IN VARCHAR2,
                                                    P_TCDOPERADOR     IN VARCHAR2,

                                                    P_CDPRODINI       IN VARCHAR2,
                                                    P_CDPRODFIN       IN VARCHAR2,
                                                    P_IDBAIXAAF       IN VARCHAR2,
                                                    P_TIDBAIXAAF      IN VARCHAR2,
                                                    P_IDAFEXPIRADA    IN VARCHAR2,
                                                    P_TIDAFEXPIRADA   IN VARCHAR2,
                                                    P_CONSISTE_BAIXA  IN VARCHAR2,
                                                    P_VALOR_EFETIVADO IN VARCHAR2,
                                                    P_IDFILIATIVA     IN VARCHAR2,
                                                    P_TIDFILIATIVA    IN VARCHAR2,
                                                    P_FILIAL_LOGADA   IN VARCHAR2,
                                                    P_EXIBE_PROD      IN VARCHAR2,
                                                    P_CUSTO           IN VARCHAR2,
                                                    P_OPERADORLOG     IN VARCHAR2)
 RETURN CURVA_ABC_PROD_FORN_CMP_TABLE PIPELINED
IS
  V_CDGRUPPROD        VARCHAR2(10);
  V_NMGRUPFILI        VARCHAR2(1000);
  V_CDPRODINICIAL     VARCHAR2(20);
  V_NMDPRODINICIAL    VARCHAR2(50);
  V_CDPRODFINAL       VARCHAR2(20);
  V_NMPRODFINAL       VARCHAR2(50);
  V_VRPECURVAA        FLOAT;
  V_VRPECURVAB        FLOAT;
  V_VRPECURVA         FLOAT := 0;
  V_TIPOCURVA         VARCHAR2(1) := 'A';
  V_VRTOTCURVA        FLOAT := 0;
  V_CHAVE             VARCHAR2(100) := '_';
  V_EXIBE_FILIAL      VARCHAR2(1);
  V_IDRESTRFILIOPER   VARCHAR2(1);
OUT_RECORD CURVA_ABC_PROD_FORN_CMP_TYPE := CURVA_ABC_PROD_FORN_CMP_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);
BEGIN
/*RAISE_APPLICATION_ERROR(-20501, P_RELATORIO||'-'||P_DADO||'-'||P_CDGRUPFILI||'-'||P_TCDGRUPFILI||'-'||P_EXIBE_GRUPFILI||'-'||P_CDREGIAO||'-'||P_TCDREGIAO||'-'||P_EXIBE_REGIAO
||'-'||P_CDFILIAL||'-'||P_TCDFILIAL||'-'||P_EXIBE_FILIAL||'-'||P_DTENTRINI||'-'||P_DTENTRFIN||'-'||P_TDTENTREGA||'-'||P_DTGERAINI||'-'||
P_DTGERAFIN||'-'||P_TDTGERACAO||'-'||P_CDNVPRODUTO||'-'||P_SUBGRUPO||'-'||P_TSUBGRUPO||'-'||P_CDFORNECED||'-'||P_TCDFORNECED||'-'||
P_CDOPERADOR||'-'||P_TCDOPERADOR||'-'||P_CDPRODINI||'-'||P_CDPRODFIN||'-'||P_IDBAIXAAF||'-'||P_TIDBAIXAAF||'-'||P_IDAFEXPIRADA
||'-'||P_TIDAFEXPIRADA||'-'||P_CONSISTE_BAIXA||'-'||P_VALOR_EFETIVADO||'-'||P_IDFILIATIVA||'-'||P_TIDFILIATIVA||'-'||P_FILIAL_LOGADA||'-'||P_EXIBE_PROD||'-'||P_CUSTO||'_');*/
   SELECT NVL(MAX(CDGRUPPROD), '0')
     INTO V_CDGRUPPROD
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL    = P_FILIAL_LOGADA;
   IF NVL(P_TCDGRUPFILI, 'S') <> 'T' AND P_EXIBE_GRUPFILI = 'S' THEN
      SELECT MAX(P_CDGRUPFILI||' - '||NMGRUPFILI)
        INTO V_NMGRUPFILI
        FROM GRUPFILI
       WHERE CDGRUPFILI =  P_CDGRUPFILI;
   END IF;
   SELECT MAX(CDARVPROD), MAX(NMPRODUTO)
     INTO V_CDPRODINICIAL, V_NMDPRODINICIAL
     FROM PRODUTO
    WHERE CDARVPROD = P_CDPRODINI;
      SELECT MAX(CDARVPROD), MAX(NMPRODUTO)
     INTO V_CDPRODFINAL, V_NMPRODFINAL
     FROM PRODUTO
    WHERE CDARVPROD = P_CDPRODFIN;
   SELECT NVL(MAX(VRPECURVAA), 70), NVL(MAX(VRPECURVAB), 20), NVL(MAX(IDRESTRFILIOPER), 'N')
     INTO V_VRPECURVAA, V_VRPECURVAB, V_IDRESTRFILIOPER
     FROM PARAMGERAL;
   V_EXIBE_FILIAL := P_EXIBE_FILIAL;
   IF P_EXIBE_FILIAL = 'L' THEN
      V_EXIBE_FILIAL := 'S';
   END IF;
   FOR C_BASE IN (SELECT TOT.CDREGIAO, TOT.NMREGIAO, TOT.CDFILDEST,
                         TOT.NMFILIAL, SUBSTR(RPAD(TOT.CDARVPROD, 20, ' '), 1, 20) AS CDARVPROD,
                         TOT.SGUNIDADE, TOT.NMPRODUTO,
                         TOT.QTTOT, TOT.VRMED, TOT.VRMED_F, TOT.VRTOT,
                         SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO)) VRTOTG,
                         SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO), CASE P_RELATORIO||P_EXIBE_PROD
                                                                                                 WHEN 'FS'
                                                                                                 THEN TOT.CDARVPROD
                                                                                                 ELSE ''
                                                                                              END) VRTOTPROD,
                         (((TOT.VRTOT)/(SUM(TOT.VRTOT) OVER (PARTITION BY NVL(TOT.CDFILDEST, TOT.CDREGIAO), CASE P_RELATORIO||P_EXIBE_PROD
                                                                                                               WHEN 'FS'
                                                                                                               THEN TOT.CDARVPROD
                                                                                                               ELSE ''
                                                                                                            END))*10000000)/100000) VRPERCENTG,
                         TOT.IDTPIJURFORN, TOT.NRINSJURFORN, TOT.NMRAZSOCFORN, TOT.CDOPERGESTOR, TOT.NMOPERGESTOR, TOT.VRCUSTO,
                         LISTA_REGIAO, LISTA_FILIAL
                    FROM (SELECT CASE V_EXIBE_FILIAL
                                    WHEN 'S'
                                    THEN PROD.CDFILDEST
                                    ELSE ''
                                 END CDFILDEST, CASE V_EXIBE_FILIAL
                                                   WHEN 'S'
                                                   THEN PROD.NMFILIAL
                                                   ELSE ''
                                                END NMFILIAL,
                                 CASE P_EXIBE_REGIAO
                                    WHEN 'S'
                                    THEN PROD.CDREGIAO
                                    ELSE ''
                                 END CDREGIAO, CASE P_EXIBE_REGIAO
                                                  WHEN 'S'
                                                  THEN PROD.NMREGIAO
                                                  ELSE ''
                                               END NMREGIAO,
                                 AVG(VRMED) AS VRMED_F,
                                 SUM(PROD.QTTOT) AS QTTOT, (SUM(PROD.VRTOT)/SUM(PROD.QTTOT)) AS VRMED,
                                 SUM(PROD.VRTOT) AS VRTOT,
                                 PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO, PROD.IDTPIJURFORN, PROD.NRINSJURFORN, PROD.NMRAZSOCFORN,
                                 PROD.CDOPERGESTOR, PROD.NMOPERGESTOR, PROD.VRCUSTO, CASE
                                                                                        WHEN LENGTH(P_CUSTO) > 0
                                                                                        THEN 0--PROD.VRMED
                                                                                        ELSE 0
                                                                                     END VRMED_L,
                                 LISTA_REGIAO, LISTA_FILIAL
                            FROM (SELECT CDFILIAL CDFILDEST, NMFILIAL, CDREGIAO, NMREGIAO, CDARVPROD, QTTOT, VRMED, SGUNIDADE, VRTOT,
                                         IDTPIJURFORN, NRINSJURFORN, NMRAZSOCFORN, CDOPERGESTOR, NMOPERGESTOR, NMPRODUTO, VRCUSTO,
                                         MAX(LISTA_REGIAO) OVER () LISTA_REGIAO,
                                         MAX(LISTA_FILIAL) OVER () LISTA_FILIAL
                                    FROM TABLE(CURVA_ABC_AF_NF_CMP(P_RELATORIO, P_DADO, P_CDGRUPFILI, P_TCDGRUPFILI, P_EXIBE_GRUPFILI,
                                                                   P_CDREGIAO, P_TCDREGIAO, P_EXIBE_REGIAO, P_CDFILIAL, P_TCDFILIAL,
                                                                   V_EXIBE_FILIAL, P_DTENTRINI, P_DTENTRFIN, P_TDTENTREGA, P_DTGERAINI,
                                                                   P_DTGERAFIN, P_TDTGERACAO, P_CDNVPRODUTO, P_SUBGRUPO, P_TSUBGRUPO,
                                                                   P_CDFORNECED, P_TCDFORNECED, P_CDOPERADOR, P_TCDOPERADOR, P_CDPRODINI,
                                                                   P_CDPRODFIN, P_IDBAIXAAF, P_TIDBAIXAAF, P_IDAFEXPIRADA, P_TIDAFEXPIRADA,
                                                                   P_CONSISTE_BAIXA, P_VALOR_EFETIVADO, P_IDFILIATIVA, P_TIDFILIATIVA, P_FILIAL_LOGADA,
                                                                   P_EXIBE_PROD, P_CUSTO, P_OPERADORLOG) )) PROD
                                   GROUP BY CASE V_EXIBE_FILIAL
                                               WHEN 'S'
                                               THEN PROD.CDFILDEST
                                               ELSE ''
                                            END, CASE V_EXIBE_FILIAL
                                                    WHEN 'S'
                                                    THEN PROD.NMFILIAL
                                                    ELSE ''
                                                 END,
                                            CASE P_EXIBE_REGIAO
                                               WHEN 'S'
                                               THEN PROD.CDREGIAO
                                               ELSE ''
                                            END, CASE P_EXIBE_REGIAO
                                                    WHEN 'S'
                                                    THEN PROD.NMREGIAO
                                                    ELSE ''
                                                 END, PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO,
                                                 PROD.CDARVPROD, PROD.SGUNIDADE, PROD.NMPRODUTO, PROD.IDTPIJURFORN, PROD.NRINSJURFORN, PROD.NMRAZSOCFORN,
                                                 PROD.CDOPERGESTOR, PROD.NMOPERGESTOR, PROD.VRCUSTO, CASE
                                                                                                        WHEN LENGTH(P_CUSTO) > 0
                                                                                                        THEN 0--PROD.VRMED
                                                                                                        ELSE 0
                                                                                                     END, LISTA_REGIAO, LISTA_FILIAL) TOT
                   WHERE TOT.VRTOT > 0
                   ORDER BY TOT.CDREGIAO, TOT.CDFILDEST, CASE P_RELATORIO||P_EXIBE_PROD
                                                            WHEN 'FS'
                                                            THEN SUBSTR(RPAD(TOT.CDARVPROD, 20, ' '), 1, 20)
                                                            ELSE ''
                                                         END, TOT.VRTOT DESC

)
   LOOP
      IF V_CHAVE <> NVL(C_BASE.CDREGIAO, 'Y')||NVL(C_BASE.CDFILDEST, 'W')||CASE P_RELATORIO||P_EXIBE_PROD
                                                                              WHEN 'FS'
                                                                              THEN C_BASE.CDARVPROD
                                                                              ELSE ''
                                                                           END THEN
         V_CHAVE := NVL(C_BASE.CDREGIAO, 'Y')||NVL(C_BASE.CDFILDEST, 'W')||CASE P_RELATORIO||P_EXIBE_PROD
                                                                               WHEN 'FS'
                                                                               THEN C_BASE.CDARVPROD
                                                                               ELSE ''
                                                                            END;
         V_VRPECURVA   := 0;
         V_VRTOTCURVA  := 0;
         V_TIPOCURVA   := 'A';
      END IF;
      OUT_RECORD.LISTA_REGIAO     := C_BASE.LISTA_REGIAO;
      OUT_RECORD.LISTA_FILIAL     := C_BASE.LISTA_FILIAL;
      OUT_RECORD.CDREGIAO         := C_BASE.CDREGIAO;
      OUT_RECORD.NMREGIAO         := C_BASE.NMREGIAO;
      OUT_RECORD.CDFILIAL         := C_BASE.CDFILDEST;
      OUT_RECORD.NMFILIAL         := C_BASE.NMFILIAL;
      OUT_RECORD.CDPRODUTO        := '';
      OUT_RECORD.CDARVPROD        := C_BASE.CDARVPROD;
      OUT_RECORD.NMPRODUTO        := C_BASE.NMPRODUTO;
      OUT_RECORD.SGUNIDADE        := C_BASE.SGUNIDADE;
      OUT_RECORD.DTENTRINI        := P_DTENTRINI;
      OUT_RECORD.DTENTRFIN        := P_DTENTRFIN;
      OUT_RECORD.DTGERAINI        := P_DTGERAINI;
      OUT_RECORD.DTGERAFIN        := P_DTGERAFIN;
      OUT_RECORD.CDPRODINICIAL    := V_CDPRODINICIAL;
      OUT_RECORD.NMDPRODINICIAL   := V_NMDPRODINICIAL;
      OUT_RECORD.CDPRODFINAL      := V_CDPRODFINAL;
      OUT_RECORD.NMPRODFINAL      := V_NMPRODFINAL;
      OUT_RECORD.CDOPERADOR       := '';
      OUT_RECORD.NMOPERADOR       := '';
      OUT_RECORD.CDFORNECED       := '';
      OUT_RECORD.NRINSJURFORN     := C_BASE.NRINSJURFORN;
      OUT_RECORD.IDTPIJURFORN     := C_BASE.IDTPIJURFORN;
      OUT_RECORD.NMRAZSOCFORN     := C_BASE.NMRAZSOCFORN;
      OUT_RECORD.CDOPERGESTOR     := C_BASE.CDOPERGESTOR;
      OUT_RECORD.NMOPERGESTOR     := C_BASE.NMOPERGESTOR;

      OUT_RECORD.NMFANTFORN       := '';
      OUT_RECORD.CDGRUPPROD       := '';
      OUT_RECORD.NMGRUPPROD       := '';
      OUT_RECORD.QTTOT            := C_BASE.QTTOT;
      OUT_RECORD.VRTOTPROD        := C_BASE.VRTOTPROD;
      IF P_RELATORIO = 'F' THEN
         OUT_RECORD.VRMED            := C_BASE.VRMED_F;
      ELSE
         OUT_RECORD.VRMED            := C_BASE.VRMED;
      END IF;
      OUT_RECORD.VRTOT            := C_BASE.VRTOT;
      OUT_RECORD.VRTOTG           := C_BASE.VRTOTG;
      IF C_BASE.VRTOTG = 0 THEN
         OUT_RECORD.VRPERCENTG       := 0;
         OUT_RECORD.TIPOCURVA        := '';
      ELSE
         OUT_RECORD.VRPERCENTG       := C_BASE.VRPERCENTG;
      END IF;
      V_VRTOTCURVA                   := V_VRTOTCURVA+C_BASE.VRTOT;
      OUT_RECORD.VRTOTCURVA          := V_VRTOTCURVA;

      V_VRPECURVA                    := V_VRPECURVA+C_BASE.VRPERCENTG;
      OUT_RECORD.VRPECURVA           := V_VRPECURVA;
      OUT_RECORD.TIPOCURVA           := V_TIPOCURVA;
      IF (V_VRPECURVA >= V_VRPECURVAA) AND (V_TIPOCURVA = 'A') THEN
         V_VRPECURVA   := 0;
         V_VRTOTCURVA  := 0;
         V_TIPOCURVA   := 'B';
      END IF;
      IF V_VRPECURVA >= V_VRPECURVAB AND (V_TIPOCURVA = 'B')THEN
          V_VRPECURVA   := 0;
          V_VRTOTCURVA  := 0;
          V_TIPOCURVA   := 'C';
      END IF;
      OUT_RECORD.VRCUSTO        :=  C_BASE.VRCUSTO;
      OUT_RECORD.EXIBE_PROD     :=  P_EXIBE_PROD;
      OUT_RECORD.RELATORIO      :=  P_RELATORIO;
      OUT_RECORD.LISTA_GRUPFILI := V_NMGRUPFILI;
      PIPE ROW (OUT_RECORD);
   END LOOP;
END;
/