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 (PARTITION BY CDREGIAO) 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;
/
