CREATE OR REPLACE FUNCTION VALOR_DEMANDA(P_CDFILDEST      IN VARCHAR2,
                                         P_NRAUTOFORN     IN VARCHAR2,
                                         P_IDPERIODOORCA  IN VARCHAR2,
                                         P_NRPERIODOORCA  IN VARCHAR2,
                                         P_DTPROGENTAF    IN DATE) RETURN NUMBER IS
V_VALOR_DEMANDA NUMBER := 0;

BEGIN
   FOR C_ITEMAUTF IN (SELECT DISTINCT PRODUTO.CDARVPROD
                        FROM ITEMAUTF, PRODUTO
                       WHERE ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                         AND ITEMAUTF.CDFILDEST  = P_CDFILDEST
                         AND ITEMAUTF.NRAUTOFORN = P_NRAUTOFORN
                         ORDER BY PRODUTO.CDARVPROD DESC )
   LOOP
      FOR C_ITEM IN(SELECT PROD.CDARVPROD CDARVPROD, IDP.VRORCAMENTO
                      FROM ORCAMENTOGOP O
                         INNER JOIN ITEMORCAGOP I
                                 ON I.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                                    AND I.IDTIPOORCAOP IN ( 'CONSUMO', 'DESPENTRADA',
                                                            'DESPDIVERSA' )
                         --  AND I.NRORG = O.NRORG
                         INNER JOIN APROVAORCAGOP A
                                 ON A.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                         --  AND A.NRORG = O.NRORG
                         INNER JOIN ITORCAMESGOP IM
                                 ON IM.NRITEMORCAOP = I.NRITEMORCAOP
                         --   AND IM.NRORG = I.NRORG
                         INNER JOIN ITDETALORCAMESGOP IDP
                                 ON IDP.NRITORCAMESGOP = IM.NRITORCAMESGOP
                         -- AND IDP.NRORG = IM.NRORG
                         INNER JOIN PRODUTO PROD
                                 ON PROD.CDPRODUTO = IDP.CDPRODUTO
                    --    AND PROD.NRORG = IDP.NRORG
                    WHERE  O.CDFILIAL = P_CDFILDEST
                         AND O.IDPERIODOORCA = NVL(P_IDPERIODOORCA, O.IDPERIODOORCA)
                         AND O.NRPERIODOORCA = NVL(P_NRPERIODOORCA, O.NRPERIODOORCA)
                         AND O.NRANOORCAGOP = TO_CHAR(TO_DATE(P_DTPROGENTAF), 'YYYY')
                         AND TO_CHAR(IM.DTORCAMENTO, 'MM') = TO_CHAR(TO_DATE(P_DTPROGENTAF), 'MM')
                         AND IDP.VRORCAMENTO IS NOT NULL
                         AND INSTR(C_ITEMAUTF.CDARVPROD, PROD.CDARVPROD) = 1
                         ORDER BY PROD.CDARVPROD DESC)
      LOOP
         FOR C_VALOR IN(SELECT NVL(SUM(ITEMAUTF.VRPREUNIAF * ITEMAUTF.QTPROGENTAF), 0)-C_ITEM.VRORCAMENTO VR_TOTAL_AF
                          FROM ITEMAUTF, AUTOFORNE, PRODUTO
                         WHERE AUTOFORNE.CDFILDEST                      = ITEMAUTF.CDFILDEST
                           AND AUTOFORNE.CDFILLANC                      = ITEMAUTF.CDFILLANC
                           AND AUTOFORNE.NRAUTOFORN                     = ITEMAUTF.NRAUTOFORN
                           AND TO_CHAR(ITEMAUTF.DTPROGENTAF, 'MM/YYYY') = TO_CHAR(TO_DATE(P_DTPROGENTAF), 'MM/YYYY')
                           AND NVL(ITEMAUTF.IDBAIXITMAF, '1')    IN ( '1', '2' )
                           AND NVL(AUTOFORNE.IDBAIXAAF, '1') NOT IN ( '3', '4', '5', '6')
                           AND ITEMAUTF.CDFILDEST                 = P_CDFILDEST
                           AND ITEMAUTF.NRAUTOFORN               <> P_NRAUTOFORN
                           AND AUTOFORNE.IDSITUATUAAF IS NULL
                           AND AUTOFORNE.IDAFFORALIM = 'N'
                           AND NVL(AUTOFORNE.IDAFEXPIRADA, 'N') = 'N'
                           AND NVL(AUTOFORNE.IDSITAFALCADA, 'PENDENTE') <> 'RECUSADA'
                           AND ITEMAUTF.CDPRODUTO     =             PRODUTO.CDPRODUTO
                           AND PRODUTO.CDARVPROD LIKE C_ITEM.CDARVPROD||'%')
          LOOP
             IF C_VALOR.VR_TOTAL_AF > 0 THEN
                V_VALOR_DEMANDA := V_VALOR_DEMANDA+C_VALOR.VR_TOTAL_AF;
             END IF;
          END LOOP;
          EXIT;
      END LOOP;
      EXIT;
   END LOOP;
   RETURN(V_VALOR_DEMANDA);
END;
/