CREATE OR REPLACE FUNCTION COMPOSICAO_PRODUTO_ORCA (P_CDFILIAL        IN  VARCHAR2,
                                  P_CDPRODUTO       IN  VARCHAR2,
                                  P_CDTPCUSTO       IN  VARCHAR2,
                                  P_QTPRODUTO       IN  FLOAT,
                                  P_IDVERIFCALC     IN  VARCHAR2,
                                  P_DATAATUAL       IN  DATE DEFAULT SYSDATE)RETURN FLOAT
IS

    V_VRCOMPCUSTO     DOUBLE PRECISION;
    V_VRCUSTO         DOUBLE PRECISION;
    V_COTLOCAL        DOUBLE PRECISION;
    V_COTPADRAO       DOUBLE PRECISION;
    V_CDALMOX         VARCHAR2(6);
    V_CDLOCAL         VARCHAR2(6);
    V_IDUTILLOTE      VARCHAR2(1);
    V_NRLOTEESTQ      VARCHAR2(20);
    V_NRSUBLOTE       VARCHAR2(4);
BEGIN
   V_VRCUSTO     := 0;
   V_VRCOMPCUSTO := 0;
   V_IDUTILLOTE  := '';
   V_NRLOTEESTQ  := ' ';
   V_NRSUBLOTE   := ' ';
   SELECT COUNT(*)
     INTO V_COTLOCAL
     FROM ROTFABLOCAL R
    WHERE (R.CDFILIAL  = P_CDFILIAL   )
      AND (R.CDPRODUTO = P_CDPRODUTO );

   IF V_COTLOCAL > 0 THEN
      /* Composicao Local */
      FOR C_COMPLOCAL IN (SELECT R.CDPRODUTO, R.CDSUBPRODLOC, R.QTSUBPRODLOC
                            FROM ROTFABLOCAL R
                           WHERE (R.CDFILIAL  = P_CDFILIAL   )
                             AND (R.CDPRODUTO = P_CDPRODUTO )
                           ORDER BY R.NRSEQPRODLOC)LOOP
          V_VRCOMPCUSTO := COMPOSICAO_PRODUTO_ORCA(P_CDFILIAL, C_COMPLOCAL.CDSUBPRODLOC, P_CDTPCUSTO, C_COMPLOCAL.QTSUBPRODLOC, P_IDVERIFCALC, P_DATAATUAL);
          V_VRCUSTO     := V_VRCUSTO + (V_VRCOMPCUSTO * P_QTPRODUTO);
      END LOOP;
      RETURN (V_VRCUSTO);
   ELSE
      SELECT COUNT(*)
        INTO V_COTPADRAO
        FROM ROTFABRICA R
       WHERE (R.CDPRODUTO    = P_CDPRODUTO);

      IF V_COTPADRAO > 0 THEN
         /*Composicao Padrao*/
         FOR C_COMPPADRAO IN (SELECT R.CDPRODUTO, R.CDSUBPRODUTO, R.QTSUBPRODROT
                                FROM ROTFABRICA R
                               WHERE (R.CDPRODUTO    = P_CDPRODUTO)
                               ORDER BY R.CDPRODUTO)LOOP
            V_VRCOMPCUSTO := COMPOSICAO_PRODUTO_ORCA(P_CDFILIAL, C_COMPPADRAO.CDSUBPRODUTO, P_CDTPCUSTO, C_COMPPADRAO.QTSUBPRODROT, P_IDVERIFCALC, P_DATAATUAL);
            V_VRCUSTO     := V_VRCUSTO + (V_VRCOMPCUSTO * P_QTPRODUTO);
         END LOOP;
         RETURN (V_VRCUSTO);
      ELSE
          /*Este select foi acrescentado para verificar se a filial utiliza lote. Caso ela nao utilize, a rotina segue da forma como sempre foi. Contudo, se ela utilizar, faz-se
		    necessario buscar o numero do lote e passa-lo como parametro para a funcao CUSTO_PRODUTO_LCEST. Se nao fizer isso e a filial utilizar lote, os parametros de lote e 
			sub-lote seriam passados como ' ' e o select da funcao CUSTO_PRODUTO_LCEST nao retornaria nada, o que nao seria condizente com a realidade, uma vez que teria custo 
			para o produto, porem o mesmo possui lote.*/	      
		  BEGIN       
             SELECT IDUTILLOTE
               INTO V_IDUTILLOTE
               FROM PARAMFILIAL 
              WHERE CDFILIAL = P_CDFILIAL;
          EXCEPTION
              WHEN NO_DATA_FOUND THEN
                  V_IDUTILLOTE := 'N';
          END;
         
         IF (V_IDUTILLOTE = 'N') THEN         
            BEGIN
					 SELECT DISTINCT CASE PA.IDUTILALMOX WHEN 'S' THEN NVL(PF.CDALMOXPRCLI, PA.CDALMOXARIFE) ELSE ' ' END CDALMOX,
										  CASE PA.IDUTILLCESTQ WHEN 'S' THEN NVL(PF.CDLOCALPRCLI, PA.CDLOCALESTOQ) ELSE ' ' END CDLOCAL
						INTO V_CDALMOX, V_CDLOCAL
						FROM PRODFILI PF, PARAMFILIAL PA, PRODUTO PR, DEPARTAMENTO DE
					  WHERE PA.CDFILIAL     = P_CDFILIAL
						 AND PR.CDPRODUTO    = P_CDPRODUTO
						 AND PR.CDDEPTPEDORC = DE.CDDEPTO
						 AND PA.CDFILIAL     = DE.CDFILIPEDORC
						 AND PF.CDPRODUTO    = PR.CDPRODUTO
						 AND PA.CDFILIAL     = PF.CDFILIAL;
				EXCEPTION
					WHEN NO_DATA_FOUND THEN
						V_CDALMOX := NULL;
						V_CDLOCAL := NULL;
				END;
            V_VRCUSTO := CUSTO_PRODUTO_LCEST(P_CDFILIAL, P_CDPRODUTO, P_CDTPCUSTO,
                                             P_DATAATUAL, P_DATAATUAL,  V_CDALMOX, V_CDLOCAL);
				RETURN (V_VRCUSTO * P_QTPRODUTO);
         ELSE
				BEGIN
					  SELECT DISTINCT CASE PA.IDUTILALMOX WHEN 'S' THEN NVL(PF.CDALMOXPRCLI, PA.CDALMOXARIFE) ELSE ' ' END CDALMOX,
										  CASE PA.IDUTILLCESTQ WHEN 'S' THEN NVL(PF.CDLOCALPRCLI, PA.CDLOCALESTOQ) ELSE ' ' END CDLOCAL
						INTO V_CDALMOX, V_CDLOCAL
						FROM PRODFILI PF, PARAMFILIAL PA, PRODUTO PR, DEPARTAMENTO DE
					  WHERE PA.CDFILIAL     = P_CDFILIAL
						 AND PR.CDPRODUTO    = P_CDPRODUTO
						 AND PR.CDDEPTPEDORC = DE.CDDEPTO
						 AND PA.CDFILIAL     = DE.CDFILIPEDORC
						 AND PF.CDPRODUTO    = PR.CDPRODUTO
						 AND PA.CDFILIAL     = PF.CDFILIAL;      
				EXCEPTION
					WHEN NO_DATA_FOUND THEN
						V_CDALMOX := NULL;
						V_CDLOCAL := NULL;				
				END;
				
				BEGIN
					SELECT MAX(NRLOTEESTQ), MAX(NRSUBLOTE)
                 INTO V_NRLOTEESTQ, V_NRSUBLOTE
                 FROM POSESTDIA
                WHERE CDFILIAL      = P_CDFILIAL
                  AND CDPRODUTO     = P_CDPRODUTO
                  AND CDALMOXARIFE  = V_CDALMOX
                  AND CDLOCALESTOQ  = V_CDLOCAL
                  AND DTPOSIESTQ    <= (SELECT MAX(P.DTPOSIESTQ) DTPOSIESTQ
                                          FROM POSESTDIA P
                                         WHERE P.CDFILIAL     = P_CDFILIAL
                                           AND P.CDPRODUTO    = P_CDPRODUTO
                                           AND P.CDALMOXARIFE = V_CDALMOX
                                           AND P.CDLOCALESTOQ = V_CDLOCAL
                                           AND P.DTPOSIESTQ   <= P_DATAATUAL+1)
                  AND NRLOTEESTQ    =  (SELECT MAX(NRLOTEESTQ) NRLOTEESTQ
                                          FROM POSESTDIA P
                                         WHERE P.CDFILIAL     = P_CDFILIAL
                                           AND P.CDPRODUTO    = P_CDPRODUTO
                                           AND P.CDALMOXARIFE = V_CDALMOX
                                           AND P.CDLOCALESTOQ = V_CDLOCAL
                                           AND P.DTPOSIESTQ   <= P_DATAATUAL+1);
            EXCEPTION
					WHEN NO_DATA_FOUND THEN
						V_NRLOTEESTQ := NULL;
						V_NRSUBLOTE  := NULL;
				END;				
            V_VRCUSTO := CUSTO_PRODUTO_LCEST(P_CDFILIAL, P_CDPRODUTO, P_CDTPCUSTO, P_DATAATUAL, P_DATAATUAL,
                                             V_CDALMOX, V_CDLOCAL, V_NRLOTEESTQ, V_NRSUBLOTE);
            RETURN (V_VRCUSTO * P_QTPRODUTO);
         END IF;
      END IF;
   END IF;
END;
/