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;
  V_NEXT               VARCHAR2(01);
  V_CDFILISUBGR        VARCHAR2(04);
  V_CDFILIALDRO        VARCHAR2(04);
  V_CDGRUPPROD         VARCHAR2(10);
BEGIN
   SELECT CASE WHEN COUNT(1) = 0 THEN 'N' ELSE 'S' END
     INTO V_NEXT
     FROM ORCAMENTOGOP
    WHERE IDVERSORCAGOP = 'NEXT'
      AND ROWNUM = 1;
      
   FOR C_ITEMAUTF IN (SELECT DISTINCT PRODUTO.CDARVPROD, PRODUTO.CDPRODUTO
                        FROM ITEMAUTF, PRODUTO
                       WHERE ITEMAUTF.CDPRODUTO  = PRODUTO.CDPRODUTO
                         AND ITEMAUTF.CDFILDEST  = P_CDFILDEST
                         AND ITEMAUTF.NRAUTOFORN = P_NRAUTOFORN
                         ORDER BY PRODUTO.CDARVPROD DESC )
   LOOP
      IF V_NEXT = 'N' THEN
         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' )
                            INNER JOIN APROVAORCAGOP A
                                    ON A.NRORCAMENTOGOP = O.NRORCAMENTOGOP
                            INNER JOIN ITORCAMESGOP IM
                                    ON IM.NRITEMORCAOP = I.NRITEMORCAOP
                            INNER JOIN ITDETALORCAMESGOP IDP
                                    ON IDP.NRITORCAMESGOP = IM.NRITORCAMESGOP
                            INNER JOIN PRODUTO PROD
                                    ON PROD.CDPRODUTO = IDP.CDPRODUTO
                        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;
      ELSE
         /* NEXT */
         SELECT MAX(CDFILIAL), MAX(CDGRUPPROD)
           INTO V_CDFILIALDRO, V_CDGRUPPROD
           FROM PARFILIALROP
          WHERE CDFILIAL = TIPOPARAM_DRO(P_CDFILDEST);
          
         SELECT NVL(MAX(X.CDFILIAL), MAX(X.CDFILIPADRAO)) CDFILISUBGR
           INTO V_CDFILISUBGR
           FROM (SELECT DISTINCT CDFILISUBGR AS CDFILIAL, '' AS CDFILIPADRAO
                   FROM PRSUBGRPROD
                  WHERE CDGRUPPROD  = V_CDGRUPPROD
                    AND CDFILISUBGR = P_CDFILDEST
                  UNION ALL
                 SELECT DISTINCT '' AS CDFILIAL, CDFILISUBGR AS CDFILIPADRAO
                   FROM PRSUBGRPROD
                  WHERE CDGRUPPROD  = V_CDGRUPPROD
                    AND CDFILISUBGR = 'P') X;
                             
         FOR C_ITEM IN (SELECT PROD.CDARVPROD, ABS(IDP.VRORCAMENTO) VRORCAMENTO
                          FROM HISTORCAMENTOGOP O INNER JOIN HISTITEMORCAGOP I ON I.NRHISTORCAMENTOGOP = O.NRHISTORCAMENTOGOP
                                                                              AND I.IDTIPOORCAOP IN ('CONSUMO','DESPENTRADA','DESPDIVERSA')
                                                                              AND I.NRVERSAO = VERSAOORCA_GOP(I.NRHISTORCAMENTOGOP, I.IDTIPOORCAOP)
                                                  INNER JOIN HISTITORCAMESGOP IM ON IM.NRHISTITEMORCAGOP = I.NRHISTITEMORCAGOP
                                                  INNER JOIN HISTITDETALORCAMESGOP IDP ON IDP.NRHISTITORCAMESGOP = IM.NRHISTITORCAMESGOP
                                                  INNER JOIN PRODUTO PROD ON PROD.CDPRODUTO = IDP.CDPRODUTO
                         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 IDP.CDPRODUTO IS NOT NULL
                           AND INSTR(C_ITEMAUTF.CDARVPROD, PROD.CDARVPROD) = 1
                         UNION
                         SELECT PROD.CDARVPROD, ABS(IDP.VRORCAMENTO) VRORCAMENTO
                          FROM HISTORCAMENTOGOP O INNER JOIN HISTITEMORCAGOP I ON I.NRHISTORCAMENTOGOP = O.NRHISTORCAMENTOGOP
                                                                              AND I.IDTIPOORCAOP IN ('DESPENTRADA','DESPDIVERSA')
                                                                              AND I.NRVERSAO = VERSAOORCA_GOP(I.NRHISTORCAMENTOGOP, I.IDTIPOORCAOP)
                                                  INNER JOIN HISTITORCAMESGOP IM ON IM.NRHISTITEMORCAGOP = I.NRHISTITEMORCAGOP
                                                  INNER JOIN HISTITDETALORCAMESGOP IDP ON IDP.NRHISTITORCAMESGOP = IM.NRHISTITORCAMESGOP
                                                  INNER JOIN PRODUTO PROD ON PROD.CDPRODUTO = C_ITEMAUTF.CDPRODUTO
                         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 IDP.CDCONTCTBL IS NOT NULL
                           AND CTBL_PRODUTO(PROD.CDPRODUTO,'E') LIKE IDP.CDCONTCTBL||'%'
                           AND (NOT EXISTS (SELECT PPR.CDFILIAL
                                              FROM PRODUTOROP PPR, PRODUTO PP
                                             WHERE PPR.IDTPPRODUTOROP = 'CO'
                                               AND PPR.CDFILIAL = V_CDFILIALDRO
                                               AND PPR.CDPRODUTO = PP.CDPRODUTO
                                               AND PROD.CDARVPROD LIKE PP.CDARVPROD||'%')
                                OR EXISTS (SELECT PPR.CDFILIAL
                                             FROM PRODUTOROP PPR, PRODUTO PP
                                            WHERE PPR.IDTPPRODUTOROP = 'OX'
                                              AND PPR.CDFILIAL = V_CDFILIALDRO
                                              AND PPR.CDPRODUTO = PP.CDPRODUTO
                                              AND PROD.CDARVPROD LIKE PP.CDARVPROD||'%'))
                         UNION
                        SELECT PROD.CDARVPROD, ABS(IDP.VRORCAMENTO) VRORCAMENTO
                          FROM HISTORCAMENTOGOP O INNER JOIN HISTITEMORCAGOP I ON I.NRHISTORCAMENTOGOP = O.NRHISTORCAMENTOGOP
                                                                              AND I.IDTIPOORCAOP IN ('DESPENTRADA','DESPDIVERSA')
                                                                              AND I.NRVERSAO = VERSAOORCA_GOP(I.NRHISTORCAMENTOGOP, I.IDTIPOORCAOP)
                                                  INNER JOIN HISTITORCAMESGOP IM ON IM.NRHISTITEMORCAGOP = I.NRHISTITEMORCAGOP
                                                  INNER JOIN HISTITDETALORCAMESGOP IDP ON IDP.NRHISTITORCAMESGOP = IM.NRHISTITORCAMESGOP
                                                  INNER JOIN PRODUTO PROD ON PROD.CDPRODUTO = C_ITEMAUTF.CDPRODUTO
                                                  INNER JOIN (SELECT X.CDTPCTPAGAR
                                                                FROM (SELECT PCP.CDTPCTPAGAR
                                                                        FROM PRODUTO PCP
                                                                       WHERE C_ITEMAUTF.CDARVPROD LIKE PCP.CDARVPROD||'%'
                                                                         AND PCP.CDTPCTPAGAR IS NOT NULL
                                                                         AND PCP.CDARVPROD IS NOT NULL
                                                                       ORDER BY PCP.CDNVPRODUTO DESC) X
                                                               WHERE ROWNUM = 1) CP ON CP.CDTPCTPAGAR = IDP.CDTPCTPAGAR
                         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 IDP.CDTPCTPAGAR IS NOT NULL
                         UNION
                        SELECT PROD.CDARVPROD, ABS(IDP.VRORCAMENTO) VRORCAMENTO
                          FROM HISTORCAMENTOGOP O INNER JOIN HISTITEMORCAGOP I ON I.NRHISTORCAMENTOGOP = O.NRHISTORCAMENTOGOP
                                                                              AND I.IDTIPOORCAOP IN ('CONSUMO','DESPENTRADA','DESPDIVERSA')
                                                                              AND I.NRVERSAO = VERSAOORCA_GOP(I.NRHISTORCAMENTOGOP, I.IDTIPOORCAOP)
                                                  INNER JOIN HISTITORCAMESGOP IM ON IM.NRHISTITEMORCAGOP = I.NRHISTITEMORCAGOP
                                                  INNER JOIN HISTITDETALORCAMESGOP IDP ON IDP.NRHISTITORCAMESGOP = IM.NRHISTITORCAMESGOP
                                                  INNER JOIN PRODUTO PROD ON PROD.CDPRODUTO = C_ITEMAUTF.CDPRODUTO
                                                  INNER JOIN PRODUTO PSG ON PROD.CDARVPROD LIKE PSG.CDARVPROD||'%'
                                                  INNER JOIN NVSUBGRPROD N ON N.CDPRODUTO = PSG.CDPRODUTO
                         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 IDP.CDSUBGRPROD IS NOT NULL
                           AND N.CDSUBGRPROD = IDP.CDSUBGRPROD
                           AND N.CDFILISUBGR = V_CDFILISUBGR
                           AND N.CDGRUPPROD  = V_CDGRUPPROD
                         ORDER BY 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 IF;
   END LOOP;
   RETURN(V_VALOR_DEMANDA);
END;
/
