CREATE OR REPLACE FUNCTION GERA_HISTCOMPCOTVAL (P_DATAINI DATE,
                                                P_DATAFIN DATE,
                                                P_CDREGIAO VARCHAR2,
                                                P_CDFORNECED VARCHAR2,
                                                P_CDPRODINI VARCHAR2,
                                                P_CDPRODFIN VARCHAR2) RETURN SUP_HISTCOMPCOTVAL_TABLE PIPELINED
AS
   V_PAGINA NUMBER := 1;
   V_MES NUMBER := 1;
   V_CDREGIAO VARCHAR2(4000);
   V_CDFORNECED VARCHAR2(4000);
   V_PRECO FLOAT;
   LINHA SUP_HISTCOMPCOTVAL_ROW := SUP_HISTCOMPCOTVAL_ROW(0,NULL, NULL, NULL, 
                                                          NULL, NULL, NULL, NULL, NULL,
                                                          NULL,NULL,
                                                          NULL, 0, NULL, 0, NULL, 0,
                                                          NULL, 0, NULL, 0, NULL, 0,
                                                          NULL, 0, NULL, 0, NULL, 0,
                                                          NULL, 0, NULL, 0, NULL, 0);
BEGIN
   V_CDREGIAO := CASE WHEN P_CDREGIAO IS NULL OR P_CDREGIAO = '' THEN 'T' ELSE P_CDREGIAO END;
   V_CDFORNECED := CASE WHEN P_CDFORNECED IS NULL OR P_CDFORNECED = '' THEN 'T' ELSE P_CDFORNECED END;

   FOR C_ITEMCOLE IN (SELECT REGIAO.CDREGIAO,
                             REGIAO.NMREGIAO,
                             FORNECEDOR.CDFORNECED,
                             FORNECEDOR.NMRAZSOCFORN, 
                             FORNECEDOR.NMFANTFORN, 
                             FORNECEDOR.IDTPIJURFORN, 
                             FORNECEDOR.NRINSJURFORN,
                             PRODUTO.CDPRODUTO,
                             PRODUTO.NMPRODUTO, 
                             PRODUTO.CDARVPROD           
                        FROM PRODUTO, FORNECEDOR, REGIAO
                       WHERE PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')
                         AND EXISTS (SELECT 1
                                       FROM ITEMCOLE
                                      WHERE ITEMCOLE.CDPRODUTO = PRODUTO.CDPRODUTO
                                        AND ITEMCOLE.CDFORNECED = FORNECEDOR.CDFORNECED
                                        AND ITEMCOLE.CDREGIAO = REGIAO.CDREGIAO
                                        AND ((INSTR(V_CDREGIAO, ITEMCOLE.CDREGIAO) > 0) OR (V_CDREGIAO = 'T'))
                                        AND ((INSTR(V_CDFORNECED, ITEMCOLE.CDFORNECED) > 0) OR (V_CDFORNECED = 'T'))
                                        AND ITEMCOLE.DTINIVALITM <= P_DATAFIN
                                        AND ITEMCOLE.DTFINVALITM >= P_DATAINI)
   ) LOOP
      LINHA.MES01 := NULL;
      LINHA.PRECO01 := NULL;
      LINHA.MES02 := NULL;
      LINHA.PRECO02 := NULL;
      LINHA.MES03 := NULL;
      LINHA.PRECO03 := NULL;
      LINHA.MES04 := NULL;
      LINHA.PRECO04 := NULL;
      LINHA.MES05 := NULL;
      LINHA.PRECO05 := NULL;
      LINHA.MES06 := NULL;
      LINHA.PRECO06 := NULL;
      LINHA.MES07 := NULL;
      LINHA.PRECO07 := NULL;
      LINHA.MES08 := NULL;
      LINHA.PRECO08 := NULL;
      LINHA.MES09 := NULL;
      LINHA.PRECO09 := NULL;
      LINHA.MES10 := NULL;
      LINHA.PRECO10 := NULL;
      LINHA.MES11 := NULL;
      LINHA.PRECO11 := NULL;
      LINHA.MES12 := NULL;
      LINHA.PRECO12 := NULL;

      LINHA.CDPRODUTO := C_ITEMCOLE.CDPRODUTO;
      LINHA.NMPRODUTO := C_ITEMCOLE.NMPRODUTO;
      LINHA.CDARVPROD := C_ITEMCOLE.CDARVPROD;
      LINHA.CDFORNECED := C_ITEMCOLE.CDFORNECED;
      LINHA.NMRAZSOCFORN := C_ITEMCOLE.NMRAZSOCFORN;
      LINHA.NMFANTFORN := C_ITEMCOLE.NMFANTFORN;
      LINHA.IDTPIJURFORN := C_ITEMCOLE.IDTPIJURFORN;
      LINHA.NRINSJURFORN := C_ITEMCOLE.NRINSJURFORN;
      LINHA.CDREGIAO := C_ITEMCOLE.CDREGIAO;
      LINHA.NMREGIAO := C_ITEMCOLE.NMREGIAO;

      V_PAGINA := 1;
      V_MES := 1;
      FOR C_DATA IN (SELECT DISTINCT DTMES
                       FROM DATA
                      WHERE DTDATA BETWEEN P_DATAINI AND P_DATAFIN
                      ORDER BY DTMES) 
      LOOP
         IF(V_MES > 12) THEN
            PIPE ROW (LINHA);

            V_PAGINA := V_PAGINA + 1;
            V_MES := 1;
            LINHA.MES01 := NULL;
            LINHA.PRECO01 := NULL;
            LINHA.MES02 := NULL;
            LINHA.PRECO02 := NULL;
            LINHA.MES03 := NULL;
            LINHA.PRECO03 := NULL;
            LINHA.MES04 := NULL;
            LINHA.PRECO04 := NULL;
            LINHA.MES05 := NULL;
            LINHA.PRECO05 := NULL;
            LINHA.MES06 := NULL;
            LINHA.PRECO06 := NULL;
            LINHA.MES07 := NULL;
            LINHA.PRECO07 := NULL;
            LINHA.MES08 := NULL;
            LINHA.PRECO08 := NULL;
            LINHA.MES09 := NULL;
            LINHA.PRECO09 := NULL;
            LINHA.MES10 := NULL;
            LINHA.PRECO10 := NULL;
            LINHA.MES11 := NULL;
            LINHA.PRECO11 := NULL;
            LINHA.MES12 := NULL;
            LINHA.PRECO12 := NULL;
         END IF;

         SELECT MIN(ITEMCOLE.VRPRECUNIITM) PRECO
           INTO V_PRECO
           FROM ITEMCOLE
          WHERE CDREGIAO = C_ITEMCOLE.CDREGIAO
            AND CDFORNECED = C_ITEMCOLE.CDFORNECED
            AND CDPRODUTO = C_ITEMCOLE.CDPRODUTO
            AND ITEMCOLE.DTINIVALITM <= P_DATAFIN
            AND ITEMCOLE.DTFINVALITM >= P_DATAINI
            AND C_DATA.DTMES BETWEEN TRUNC(DTINIVALITM, 'MM') AND TRUNC(DTFINVALITM, 'MM');

         V_PRECO := NVL(V_PRECO, 0.00);

         LINHA.NRPAGINA := V_PAGINA;

         IF V_MES = 1 THEN
            LINHA.MES01 := C_DATA.DTMES;
            LINHA.PRECO01 := V_PRECO;
         ELSIF V_MES = 2 THEN
            LINHA.MES02 := C_DATA.DTMES;
            LINHA.PRECO02 := V_PRECO;
         ELSIF V_MES = 3 THEN
            LINHA.MES03 := C_DATA.DTMES;
            LINHA.PRECO03 := V_PRECO;
         ELSIF V_MES = 4 THEN
            LINHA.MES04 := C_DATA.DTMES;
            LINHA.PRECO04 := V_PRECO;
         ELSIF V_MES = 5 THEN
            LINHA.MES05 := C_DATA.DTMES;
            LINHA.PRECO05 := V_PRECO;
         ELSIF V_MES = 6 THEN
            LINHA.MES06 := C_DATA.DTMES;
            LINHA.PRECO06 := V_PRECO;
         ELSIF V_MES = 7 THEN
            LINHA.MES07 := C_DATA.DTMES;
            LINHA.PRECO07 := V_PRECO;
         ELSIF V_MES = 8 THEN
            LINHA.MES08 := C_DATA.DTMES;
            LINHA.PRECO08 := V_PRECO;
         ELSIF V_MES = 9 THEN
            LINHA.MES09 := C_DATA.DTMES;
            LINHA.PRECO09 := V_PRECO;
         ELSIF V_MES = 10 THEN
            LINHA.MES10 := C_DATA.DTMES;
            LINHA.PRECO10 := V_PRECO;
         ELSIF V_MES = 11 THEN
            LINHA.MES11 := C_DATA.DTMES;
            LINHA.PRECO11 := V_PRECO;
         ELSIF V_MES = 12 THEN
            LINHA.MES12 := C_DATA.DTMES;
            LINHA.PRECO12 := V_PRECO;
         END IF;

         V_MES := V_MES + 1;
      END LOOP;

      PIPE ROW (LINHA);
   END LOOP;
   RETURN;
END;
/