CREATE OR REPLACE FUNCTION EXIBE_VENCIMENTO_AF(P_CDFILDEST  AUTOFORNE.CDFILDEST%TYPE,
                                               P_CDFILLANC  AUTOFORNE.CDFILLANC%TYPE,
                                               P_NRAUTOFORN AUTOFORNE.NRAUTOFORN%TYPE)
                                               RETURN EXIBE_VENCIMENTO_AF_TABLE PIPELINED
IS
   OUT_RECORD EXIBE_VENCIMENTO_AF_TYPE := EXIBE_VENCIMENTO_AF_TYPE (NULL, NULL, NULL, NULL,
                                                                    NULL, NULL, NULL, 0);
   V_DSTPCTPAGAR      VARCHAR2(40);
BEGIN
   FOR C_ITEM IN(SELECT P_CDFILDEST CDFILDEST, P_CDFILLANC CDFILLANC, P_NRAUTOFORN NRAUTOFORN, CDTPCTPAGAR, NRLANCTONF
                   FROM (SELECT MAX(PROD.CDTPCTPAGAR) CDTPCTPAGAR, ITEMAUTF.NRLANCTONF
                           FROM PRODUTO PROD, ITEMAUTF, AUTOFORNE,
                                (SELECT P.CDPRODUTO, P.CDARVPROD,
                                        (SELECT NVL(MAX(PRODUTO.CDARVPROD), 'W')
                                           FROM PRODUTO
                                          WHERE PRODUTO.CDTPCTPAGAR IS NOT NULL
                                            AND PRODUTO.CDARVPROD = SUBSTR(P.CDARVPROD, 1, LENGTH(PRODUTO.CDARVPROD))) PRODTPCTPAGAR
                                   FROM ITEMAUTF, PRODUTO P
                                  WHERE ITEMAUTF.CDPRODUTO  = P.CDPRODUTO
                                    AND ITEMAUTF.CDFILDEST  = P_CDFILDEST
                                    AND ITEMAUTF.CDFILLANC  = P_CDFILLANC
                                    AND ITEMAUTF.NRAUTOFORN = P_NRAUTOFORN) I
                          WHERE I.PRODTPCTPAGAR     = PROD.CDARVPROD
                            AND ITEMAUTF.CDPRODUTO  = I.CDPRODUTO
                            AND ITEMAUTF.CDFILDEST  = P_CDFILDEST
                            AND ITEMAUTF.CDFILLANC  = P_CDFILLANC
                            AND ITEMAUTF.NRAUTOFORN = P_NRAUTOFORN
                            AND ITEMAUTF.CDFILDEST  = AUTOFORNE.CDFILDEST
                            AND ITEMAUTF.CDFILLANC  = AUTOFORNE.CDFILLANC
                            AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN
                            AND NVL(AUTOFORNE.CDTPCTPAGAR, 'W') = 'W'
                          GROUP BY ITEMAUTF.NRLANCTONF)
                  UNION
                 SELECT AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, AUTOFORNE.CDTPCTPAGAR, MAX(ITEMAUTF.NRLANCTONF) NRLANCTONF
                   FROM AUTOFORNE, ITEMAUTF
                  WHERE AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST
                    AND AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC
                    AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
                    AND AUTOFORNE.CDFILDEST = P_CDFILDEST
                    AND AUTOFORNE.CDFILLANC = P_CDFILLANC
                    AND AUTOFORNE.NRAUTOFORN = P_NRAUTOFORN
                    AND NVL(AUTOFORNE.CDTPCTPAGAR, 'W') <> 'W'
                 GROUP BY AUTOFORNE.CDFILDEST, AUTOFORNE.CDFILLANC, AUTOFORNE.NRAUTOFORN, AUTOFORNE.CDTPCTPAGAR)
   LOOP
      SELECT MAX(DSTPCTPAGAR)
        INTO V_DSTPCTPAGAR
        FROM TIPOCTPAGAR
       WHERE CDTPCTPAGAR =  C_ITEM.CDTPCTPAGAR;
      FOR C_VENCIMENTO IN (SELECT DTVENCIMENTO, VRVENCIMENTO
                             FROM TRAB_VENCIMENTO, NOTAFISCAL
                            WHERE NOTAFISCAL.CDFILIAL   = TRAB_VENCIMENTO.CDFILIALVENC
                              AND NOTAFISCAL.NRLANCTONF = TRAB_VENCIMENTO.NRLANCTONFVENC
                              AND NOTAFISCAL.NRLANCTONF = C_ITEM.NRLANCTONF
                              AND NOTAFISCAL.CDFILIAL   = C_ITEM.CDFILLANC)

      LOOP
         OUT_RECORD.CDFILDEST      := C_ITEM.CDFILDEST;
         OUT_RECORD.CDFILLANC      := C_ITEM.CDFILLANC;
         OUT_RECORD.NRAUTOFORN     := C_ITEM.NRAUTOFORN;
         OUT_RECORD.CDTPCTPAGAR    := C_ITEM.CDTPCTPAGAR;
         OUT_RECORD.DSTPCTPAGAR    := V_DSTPCTPAGAR;
         OUT_RECORD.NRLANCTONF     := C_ITEM.NRLANCTONF;
         OUT_RECORD.DTVENCIMENTO   := C_VENCIMENTO.DTVENCIMENTO;
         OUT_RECORD.VRVENCIMENTO   := C_VENCIMENTO.VRVENCIMENTO;
         PIPE ROW (OUT_RECORD);
      END LOOP;
   END LOOP;
END;
/