CREATE OR REPLACE FUNCTION APROVA_ALCADAS( 
    P_CDFILIAL        IN VARCHAR2,
    P_CDOPERADOR      IN VARCHAR2,
    P_IDAPROVADO      IN VARCHAR2,
    P_IDCLASSIFIC     IN VARCHAR2,
    P_NRCONFIGALCADA  IN VARCHAR2,
    P_DTINCLUSAO_INI  IN DATE,
    P_DTINCLUSAO_FIN  IN DATE,
    P_TDTINCLUSAO     IN VARCHAR2,
    P_DTENTREGAAF_INI IN DATE,
    P_DTENTREGAAF_FIN IN DATE,
    P_TDTENTREGAAF    IN VARCHAR2) RETURN APROVA_ALCADAS_TABLE PIPELINED 
IS  
    OUT_RECORD APROVA_ALCADAS_TYPE := APROVA_ALCADAS_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); 

BEGIN 
    FOR C_ALCADAS IN (SELECT APROVALCADA.NRAPROVALCADA, APROVALCADA.NRCONFIGALCADA, 
                             CONFIGALCADA.NMALCADA, CONFIGALCADA.IDTIPOVRAPROV, 
                             APROVALCADA.CDFILDEST, APROVALCADA.CDFILLANC, 
                             APROVALCADA.NRDEMANDA, APROVALCADA.IDTPDEMANDA, 
                             APROVALCADA.IDCLASSIFIC, APROVALCADA.IDAPROVADO, 
                             APROVALCADA.DTINCLUSAO, ALCADAGERFILI.CDOPERADOR APROVADOR, 
                             ALCADAGERFILI.VRAPROVCMP, ALCADAGERFILI.IDEXIGJUSTIFICATIVA, FILIAL.NMFILIAL NMFILDEST, 
                             AUTOFORNE.VRTOTALAF, AUTOFORNE.DSMOTVAFALCADA, 
                             FORNECEDOR.NRINSJURFORN, FORNECEDOR.NMRAZSOCFORN, 
                             FORNECEDOR.NMFANTFORN, APROVALCADA.NRORG
                        FROM APROVALCADA INNER JOIN CONFIGALCADA ON APROVALCADA.NRCONFIGALCADA = CONFIGALCADA.NRCONFIGALCADA 
                                         INNER JOIN ALCADAGERFILI ON APROVALCADA.NRCONFIGALCADA = ALCADAGERFILI.NRCONFIGALCADA 
                                                                 AND APROVALCADA.CDFILDEST = ALCADAGERFILI.CDFILIAL 
                                                                 AND APROVALCADA.CDOPERADOR = ALCADAGERFILI.CDOPERADOR 
                                         INNER JOIN FILIAL ON APROVALCADA.CDFILDEST = FILIAL.CDFILIAL 
                                         INNER JOIN AUTOFORNE ON APROVALCADA.CDFILDEST = AUTOFORNE.CDFILDEST 
                                                             AND APROVALCADA.CDFILLANC = AUTOFORNE.CDFILLANC 
                                                             AND APROVALCADA.NRDEMANDA = AUTOFORNE.NRAUTOFORN 
                                         INNER JOIN FORNECEDOR ON AUTOFORNE.CDFORNECED = FORNECEDOR.CDFORNECED 
                       WHERE (INSTR(P_CDFILIAL, APROVALCADA.CDFILDEST) > 0 OR P_CDFILIAL = 'T') 
                         AND (INSTR(P_NRCONFIGALCADA, CONFIGALCADA.NRCONFIGALCADA) > 0 OR P_NRCONFIGALCADA = 'T') 
                         AND (INSTR(P_IDCLASSIFIC, APROVALCADA.IDCLASSIFIC) > 0 OR P_IDCLASSIFIC = 'T') 
                         AND (APROVALCADA.DTINCLUSAO BETWEEN P_DTINCLUSAO_INI AND P_DTINCLUSAO_FIN OR P_TDTINCLUSAO = 'T') 
                         AND APROVALCADA.IDAPROVADO = P_IDAPROVADO 
                         AND APROVALCADA.CDOPERADOR = P_CDOPERADOR
                         AND (P_IDAPROVADO != 'PENDENTE' OR (P_IDAPROVADO = 'PENDENTE' AND NVL(AUTOFORNE.IDBAIXAAF, '0') = '6'))
                         AND EXISTS (SELECT 1 
                                       FROM ITEMAUTF 
                                      WHERE ITEMAUTF.CDFILDEST = AUTOFORNE.CDFILDEST 
                                        AND ITEMAUTF.CDFILLANC = AUTOFORNE.CDFILLANC 
                                        AND ITEMAUTF.NRAUTOFORN = AUTOFORNE.NRAUTOFORN 
                                        AND (ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTREGAAF_INI AND P_DTENTREGAAF_FIN OR P_TDTENTREGAAF = 'T')))
    LOOP
        OUT_RECORD.NRAPROVALCADA        := C_ALCADAS.NRAPROVALCADA;
        OUT_RECORD.NRCONFIGALCADA       := C_ALCADAS.NRCONFIGALCADA; 
        OUT_RECORD.NMALCADA             := C_ALCADAS.NMALCADA;
        OUT_RECORD.IDTIPOVRAPROV        := C_ALCADAS.IDTIPOVRAPROV;
        OUT_RECORD.CDFILDEST            := C_ALCADAS.CDFILDEST;
        OUT_RECORD.CDFILLANC            := C_ALCADAS.CDFILLANC;
        OUT_RECORD.NRDEMANDA            := C_ALCADAS.NRDEMANDA;
        OUT_RECORD.IDTPDEMANDA          := C_ALCADAS.IDTPDEMANDA;
        OUT_RECORD.IDCLASSIFIC          := C_ALCADAS.IDCLASSIFIC;
        OUT_RECORD.IDAPROVADO           := C_ALCADAS.IDAPROVADO;
        OUT_RECORD.DTINCLUSAO           := C_ALCADAS.DTINCLUSAO; 
        OUT_RECORD.APROVADOR            := C_ALCADAS.APROVADOR; 
        OUT_RECORD.VRAPROVCMP           := C_ALCADAS.VRAPROVCMP; 
        OUT_RECORD.NMFILDEST            := C_ALCADAS.NMFILDEST; 
        OUT_RECORD.VRTOTALAF            := C_ALCADAS.VRTOTALAF; 
        OUT_RECORD.DSMOTVAFALCADA       := C_ALCADAS.DSMOTVAFALCADA; 
        OUT_RECORD.NRINSJURFORN         := C_ALCADAS.NRINSJURFORN; 
        OUT_RECORD.NMRAZSOCFORN         := C_ALCADAS.NMRAZSOCFORN; 
        OUT_RECORD.NMFANTFORN           := C_ALCADAS.NMFANTFORN; 
        OUT_RECORD.NRORG                := C_ALCADAS.NRORG;
        OUT_RECORD.IDEXIGJUSTIFICATIVA  := C_ALCADAS.IDEXIGJUSTIFICATIVA;
        
        SELECT MIN(ITEMAUTF.DTPROGENTAF) 
          INTO OUT_RECORD.DTPROGENTAF
          FROM ITEMAUTF 
         WHERE ITEMAUTF.CDFILDEST = C_ALCADAS.CDFILDEST 
           AND ITEMAUTF.CDFILLANC = C_ALCADAS.CDFILLANC 
           AND ITEMAUTF.NRAUTOFORN = C_ALCADAS.NRDEMANDA;
        
        SELECT MAX(ORCAMENTREALOC.VRORCAMENTO), 
               MAX(ORCAMENTREALOC.VRREALIZADO), 
               MAX(ORCAMENTREALOC.VRDIFERENCA)
          INTO OUT_RECORD.VRORCAMENTO, 
               OUT_RECORD.VRREALIZADO, 
               OUT_RECORD.VRDIFERENCA
          FROM ORCAMENTREALOC, PRODUTO
         WHERE ORCAMENTREALOC.IDORIGEM IN ('CONSUMO', 'DESPESA')
           AND PRODUTO.CDARVPROD LIKE ORCAMENTREALOC.CDNVLARVPROD || '%'
           AND EXISTS (SELECT 1
                         FROM ITEMAUTF 
                        WHERE ITEMAUTF.CDFILDEST = C_ALCADAS.CDFILDEST 
                          AND ITEMAUTF.CDFILLANC = C_ALCADAS.CDFILLANC 
                          AND ITEMAUTF.NRAUTOFORN = C_ALCADAS.NRDEMANDA
                          AND ITEMAUTF.CDPRODUTO = PRODUTO.CDPRODUTO
                          AND ITEMAUTF.CDFILDEST = ORCAMENTREALOC.CDFILIAL 
                          AND TO_DATE(TO_CHAR(ITEMAUTF.DTPROGENTAF, 'MM/YYYY'), 'MM/YYYY') = TO_DATE(TO_CHAR(ORCAMENTREALOC.DTMESPERIODO, 'MM/YYYY'), 'MM/YYYY'));
    
        PIPE ROW (OUT_RECORD);
    END LOOP;
END;
/
