
/* Tecnisa - Tecnologia em Inform�tica

 Nome: 0316_CUSFUN_CUSTO_PRODUTO

 Descri��o:
 Fun��o para c�lculo do custo do produto de acordo com a tabela TIPOCUSTO
_________________________________________________________________________
_________________________________________________________________________
   01 Custo M�dio L�quido Atual
   02 Custo M�dio Bruto Atual
   03 Custo M�dio L�quido da �poca
   04 Custo M�dio Bruto da �poca
   06 Custo de Cota��o (Lista de Pre�os)
   07 Custo da �ltima compra(AF)
   08 Custo L�quido da �poca (�ltima Compra)
   09 Custo Bruto da �poca (�ltima Compra)
   10 Custo de Cota��o(Lista de Pre�os com Imposto)
   20 Custo M�dio L�quido Atual
   21 Custo M�dio L�quido Atual
   22 Custo M�dio Bruto Atual
   23 Custo M�dio Bruto Atual
   24 Custo M�dio L�quido da �poca
   25 Custo M�dio L�quido da �poca
   26 Custo M�dio Bruto da �poca
   27 Custo M�dio Bruto da �poca
   28 Custo da �ltima Compra (NF)
   29 Custo da �ltima Compra (NF)
   30 Custo de Cota��o (Lista de Pre�os)
   31 Custo de Cota��o (Lista de Pre�os)
   32 Custo da �ltima Compra(AF)
   33 Custo da �ltima Compra(AF)
   34 Custo M�dio Atualizado
   35 Custo M�dio Atualizado
   40 Custo M�dio L�quido Atual(Log�stica)
   41 Custo M�dio Bruto Atual(Log�stica)
   42 Custo M�dio L�quido da �poca(Log�stica)
   43 Custo M�dio Bruto da �poca(Log�stica)
   44 Custo de Cota��o (Lista de Pre�os - Log�stica)
   45 Custo da �ltima compra(AF-Log�stica)
   46 Custo de Compra Liquido da �poca(Log�stica)
   47 Custo de Compra Bruto da �poca(Log�stica)
   48 Custo de Cota��o-Lista de Pre�o Imposto(Log�stica)
   49 Custo M�dio L�quido Atual(Log�stca)
   50 Custo M�dio L�quido Atual(Log�stica)
   51 Custo M�dio Bruto Atual(Log�stica)
   52 Custo M�dio Bruto Atual(Log�stica)
   53 Custo M�dio L�quido da �poca(Log�stica)
   54 Custo M�dio L�quido da �poca(Log�stica)
   55 Custo M�dio Bruto da �poca(Log�stica)
   56 Custo M�dio Bruto da �poca(Log�stica)
   57 Custo da �ltima Compra (NF - Log�stica)
   58 Custo da �ltima Compra (NF - Log�stica)
   59 Custo da �ltima Compra(AF - Log�stica)
   60 Custo da �ltima Compra(AF - Log�stica)
   61 Custo de Cota��o (Lista de Pre�os - Log�stica)
   62 Custo de Cota��o (Lista de Pre�os - Log�stica)
   63 Custo M�dio Cont�bil
   64 Custo Objetivo

 Cria��o:
 13/10/2003 - Roberto A. Lopes Martins

 @C:\WEB_507\SQL\END_CONV\ORACLE\0316_CUSFUNO_CUSTO_PRODUTO.SQL
*/

CREATE OR REPLACE FUNCTION CUSTO_PRODUTO(
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_CDPRODUTO    IN PRODUTO.CDPRODUTO%TYPE,
   P_NRTIPOCUSTO  IN NUMBER,
   P_DTREFERENCIA IN DATE,
   P_DTATUAL      IN DATE) RETURN NUMBER IS

   V_VRCUSTO      NUMBER;
   V_SEM_IMPOSTO  NUMBER;
   V_DTREFERENCIA DATE;
   V_DTREFERENCIA_MAIS_UM DATE;

   V_QTESTDIACON    POSESTCONS.QTESTDIACON%TYPE;
   V_QTESTANTCON    POSESTCONS.QTESTANTCON%TYPE;
   V_VRESTDIACON    POSESTCONS.VRESTDIACON%TYPE;
   V_VRESTDIACOM1   POSESTCONS.VRESTDIACOM1%TYPE;
   V_VRESTDIACOM2   POSESTCONS.VRESTDIACOM2%TYPE;
   V_VRESTANTCON    POSESTCONS.VRESTANTCON%TYPE;
   V_VRESTANTCOM1   POSESTCONS.VRESTANTCOM1%TYPE;
   V_VRESTANTCOM2   POSESTCONS.VRESTANTCOM2%TYPE;
   V_VRESTBRUTCON   POSESTCONS.VRESTBRUTCON%TYPE;
   V_VRESTBRUTCM1   POSESTCONS.VRESTBRUTCM1%TYPE;
   V_VRESTBRUTCM2   POSESTCONS.VRESTBRUTCM2%TYPE;
   V_VRBRUTANTCON   POSESTCONS.VRBRUTANTCON%TYPE;
   V_VRBRUTANTCM1   POSESTCONS.VRBRUTANTCM1%TYPE;
   V_VRBRUTANTCM2   POSESTCONS.VRBRUTANTCM2%TYPE;

   V_VRULTCOMPR     CUSTOCMPPROD.VRLIQCMPPROD%TYPE;
   V_VRULTCOMPRM1   CUSTOCMPPROD.VRLIQCMPPRM1%TYPE;
   V_VRULTCOMPRM2   CUSTOCMPPROD.VRLIQCMPPRM2%TYPE;

   V_VRCUSPRLISTP   CUSTOSUP.VRCUSPRLISTP%TYPE;
   V_VRCUSPRLISM1   CUSTOSUP.VRCUSPRLISM1%TYPE;
   V_VRCUSPRLISM2   CUSTOSUP.VRCUSPRLISM2%TYPE;
   V_VRCUSLIPRIMP   CUSTOSUP.VRCUSLIPRIMP%TYPE;
   V_VRPRCUSTOAF    CUSTOSUP.VRPRCUSTOAF%TYPE;
   V_VRPRCUSAFM1    CUSTOSUP.VRPRCUSAFM1%TYPE;
   V_VRPRCUSAFM2    CUSTOSUP.VRPRCUSAFM2%TYPE;

   V_IDUTILDTPROC   VARCHAR2(1);
 
/*CUSTO LOGISTICO*/
   V_VRCLOGCON      POSESTCONS.VRCLOGCON%TYPE;
   V_VRCLOGCONANT   POSESTCONS.VRCLOGCONANT%TYPE;
   V_VRCLOGCONM1    POSESTCONS.VRCLOGCONM1%TYPE;
   V_VRCLOGCONAM1   POSESTCONS.VRCLOGCONAM1%TYPE;
   V_VRCLOGCONM2    POSESTCONS.VRCLOGCONM2%TYPE;
   V_VRCLOGCONAM2   POSESTCONS.VRCLOGCONAM2%TYPE;
   V_VRSEGUCON      POSESTCONS.VRSEGUCON%TYPE;
   V_VRSEGUCONANT   POSESTCONS.VRSEGUCONANT%TYPE;
   V_VRSEGUCONM1    POSESTCONS.VRSEGUCONM1%TYPE;
   V_VRSEGUCONAM1   POSESTCONS.VRSEGUCONAM1%TYPE;
   V_VRSEGUCONM2    POSESTCONS.VRSEGUCONM2%TYPE;
   V_VRSEGUCONAM2   POSESTCONS.VRSEGUCONAM2%TYPE;

   V_VRPESOBRUTPR   NUMBER;
   V_VRPECUSTOLOG   NUMBER;
   V_VRVRCUSTOLOG   NUMBER;
   V_VRPESEGURLOG   NUMBER;
   V_VRCUSTOLOG     NUMBER;
   V_VRCUSTOSEG     NUMBER;
   V_VRLIQCMPPROD   NUMBER;
   V_VRBRUCMPPROD   NUMBER;
   V_VRLIQCMPPRM1   NUMBER;
   V_VRLIQCMPPRM2   NUMBER;
   V_VRCUSTLOGCMP   NUMBER;
   V_VRCUSTLCMPM1   NUMBER;
   V_VRCUSTLCMPM2   NUMBER;
   V_VRSEGULOGCMP   NUMBER;
   V_VRSEGULCMPM1   NUMBER;
   V_VRSEGULCMPM2   NUMBER;
   V_CDFORNCUSTAF   VARCHAR2(21);
   V_CDPRODCUSTAF   VARCHAR2(10);
   V_CDPRODACOR     CUSTOSUP.CDPRODACOR%TYPE;
   V_CDPRODLIST     CUSTOSUP.CDPRODLIST%TYPE;
   V_FORNECEDOR     FORNECEDOR.CDFORNECED%TYPE;
   V_CDFORNECACOR   FORNECEDOR.CDFORNECED%TYPE;
   V_CDFORNECLIST   FORNECEDOR.CDFORNECED%TYPE;
   V_CDFORNEOL      FORNECEDOR.CDFORNECED%TYPE;
   V_CDPRODUTO      POSESTDIA.CDPRODUTO%TYPE;
   V_CDFILIAL       FILIAL.CDFILIAL%TYPE;
   V_VRFATOCONV     PRODUTO.CDPRODUTO%TYPE;
   V_DTPOSICAO      DATE; 

   W_N                       CHAR(1):= 'N';
   W_0001                VARCHAR2(4):= '0001';
   V_ZERO                     FLOAT := 0;
   V_UM                       FLOAT := 1;

   V_CDFILCENTCMP     VARCHAR2(04);
   V_IDUTLMARPREFOL   VARCHAR2(01) := 'N';
   V_IDFUNCAOFILI     VARCHAR2(01);
   V_IDTIPOAPUR       PARASUPRI.IDTIPOAPUR%TYPE;
   V_AUXPRECOL        FLOAT;
   V_IDUTCUSLIPR      VARCHAR2(01);

   V_IDUTILCONSSOLIOL VARCHAR2(1) := '';
BEGIN

   V_VRCUSTO      := 0;
   V_VRCUSTLOGCMP := 0;
   V_VRSEGULOGCMP := 0;
   V_VRCLOGCON    := 0;
   V_VRSEGUCON    := 0;
   V_VRCUSTLCMPM1 := 0;
   V_VRSEGULCMPM1 := 0;
   V_VRCUSTLCMPM2 := 0;
   V_VRSEGULCMPM2 := 0;
   V_VRSEGUCONANT := 0;
   V_VRSEGUCONM1  := 0;
   V_VRSEGUCONAM1 := 0;
   V_VRSEGUCONM2  := 0;
   V_VRSEGUCONAM2 := 0;


   IF P_NRTIPOCUSTO IN (1,2,3,4,20,21,22,23,24,25,26,27,40,41,42,43,49,50,53,54) THEN /*Custos que tem valores na tabela POSESTCONS*/

      IF (P_NRTIPOCUSTO IN (1,2,20,21,22,23,40,41,49,50,51,52)) THEN         /*Custo M�dio Atual*/
         SELECT NVL(IDUTILDTPROC, W_N)
         INTO V_IDUTILDTPROC
         FROM PARAMGERAL
         WHERE CDPARGERAL = W_0001;
         IF V_IDUTILDTPROC = W_N THEN
            V_DTREFERENCIA := P_DTATUAL;
         ELSE
            SELECT NVL(DTPROCESSA, P_DTATUAL)
            INTO V_DTREFERENCIA
            FROM PARAMFILIAL P
            WHERE CDFILIAL = P_CDFILIAL;
         END IF;
      ELSE
         V_DTREFERENCIA := P_DTREFERENCIA;                 /*Custo M�dio da �poca*/
      END IF;

      V_DTREFERENCIA_MAIS_UM := V_DTREFERENCIA + 1;

      BEGIN      
         SELECT DTPOSESTCON 
         INTO V_DTPOSICAO
         FROM (SELECT DTPOSESTCON 
               FROM POSESTCONS PD 
               WHERE CDFILIAL = P_CDFILIAL 
                 AND CDPRODUTO = P_CDPRODUTO
                 AND DTPOSESTCON <= V_DTREFERENCIA_MAIS_UM AND 
               DTPOSESTCON IS NOT NULL 
               ORDER BY DTPOSESTCON DESC  
               ) 
         WHERE ROWNUM = 1;
      EXCEPTION
         WHEN OTHERS THEN
            V_DTPOSICAO := NULL;
      END;

      BEGIN
         SELECT NVL(QTESTDIACON,V_ZERO),  NVL(QTESTANTCON,V_ZERO),  NVL(VRESTDIACON,V_ZERO),
                NVL(VRESTDIACOM1,V_ZERO), NVL(VRESTDIACOM2,V_ZERO), NVL(VRESTANTCON,V_ZERO),
                NVL(VRESTANTCOM1,V_ZERO), NVL(VRESTANTCOM2,V_ZERO), NVL(VRESTBRUTCON,V_ZERO),
                NVL(VRESTBRUTCM1,V_ZERO), NVL(VRESTBRUTCM2,V_ZERO), NVL(VRBRUTANTCON,V_ZERO),
                NVL(VRBRUTANTCM1,V_ZERO), NVL(VRBRUTANTCM2,V_ZERO), NVL(VRCLOGCON,V_ZERO),
                NVL(VRCLOGCONANT,V_ZERO), NVL(VRCLOGCONM1,V_ZERO),  NVL(VRCLOGCONAM1,V_ZERO),
                NVL(VRCLOGCONM2,V_ZERO),  NVL(VRCLOGCONAM2,V_ZERO), NVL(VRSEGUCON,V_ZERO),
                NVL(VRSEGUCONANT,V_ZERO), NVL(VRSEGUCONM1,V_ZERO),  NVL(VRSEGUCONAM1,V_ZERO),
                NVL(VRSEGUCONM2,V_ZERO),  NVL(VRSEGUCONAM2,V_ZERO)
         INTO V_QTESTDIACON,  V_QTESTANTCON,  V_VRESTDIACON,
              V_VRESTDIACOM1, V_VRESTDIACOM2, V_VRESTANTCON,
              V_VRESTANTCOM1, V_VRESTANTCOM2, V_VRESTBRUTCON,
              V_VRESTBRUTCM1, V_VRESTBRUTCM2, V_VRBRUTANTCON,
              V_VRBRUTANTCM1, V_VRBRUTANTCM2, V_VRCLOGCON,
              V_VRCLOGCONANT, V_VRCLOGCONM1,  V_VRCLOGCONAM1,
              V_VRCLOGCONM2,  V_VRCLOGCONAM2, V_VRSEGUCON,
              V_VRSEGUCONANT, V_VRSEGUCONM1,  V_VRSEGUCONAM1,
              V_VRSEGUCONM2,  V_VRSEGUCONAM2
         FROM POSESTCONS P
         WHERE CDFILIAL    = P_CDFILIAL  AND
               CDPRODUTO   = P_CDPRODUTO AND
               DTPOSESTCON = V_DTPOSICAO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN BEGIN
            V_QTESTDIACON   := 0;     V_QTESTANTCON    := 0;    V_VRESTDIACON    := 0;
            V_VRESTDIACOM1  := 0;     V_VRESTDIACOM2   := 0;    V_VRESTANTCON    := 0;
            V_VRESTANTCOM1  := 0;     V_VRESTANTCOM2   := 0;    V_VRESTBRUTCON   := 0;
            V_VRESTBRUTCM1  := 0;     V_VRESTBRUTCM2   := 0;    V_VRBRUTANTCON   := 0;
            V_VRBRUTANTCM1  := 0;     V_VRBRUTANTCM2   := 0;    V_VRCLOGCON      := 0;
            V_VRCLOGCONANT  := 0;     V_VRCLOGCONM1    := 0;    V_VRCLOGCONAM1   := 0;
            V_VRCLOGCONM2   := 0;     V_VRCLOGCONAM2   := 0;    V_VRSEGUCON      := 0;
            V_VRSEGUCONANT  := 0;     V_VRSEGUCONM1    := 0;    V_VRSEGUCONAM1   := 0;
            V_VRSEGUCONM2   := 0;     V_VRSEGUCONAM2   := 0;
         END;
      END;

      IF (V_QTESTDIACON <> 0) THEN
         V_VRESTDIACON  := (V_VRESTDIACON/V_QTESTDIACON);
         V_VRESTDIACOM1 := (V_VRESTDIACOM1/V_QTESTDIACON);
         V_VRESTDIACOM2 := (V_VRESTDIACOM2/V_QTESTDIACON);
         V_VRESTBRUTCON := (V_VRESTBRUTCON/V_QTESTDIACON);
         V_VRESTBRUTCM1 := (V_VRESTBRUTCM1/V_QTESTDIACON);
         V_VRESTBRUTCM2 := (V_VRESTBRUTCM2/V_QTESTDIACON);

         V_VRCLOGCON    := (V_VRCLOGCON/V_QTESTDIACON);
         V_VRCLOGCONM1  := (V_VRCLOGCONM1/V_QTESTDIACON);
         V_VRCLOGCONM2  := (V_VRCLOGCONM2/V_QTESTDIACON);
         V_VRSEGUCON    := (V_VRSEGUCON/V_QTESTDIACON);
         V_VRSEGUCONM1  := (V_VRSEGUCONM1/V_QTESTDIACON);
         V_VRSEGUCONM2  := (V_VRSEGUCONM2/V_QTESTDIACON);

      ELSIF (V_QTESTANTCON <> 0) THEN
         V_VRESTDIACON  := (V_VRESTANTCON/V_QTESTANTCON);
         V_VRESTDIACOM1 := (V_VRESTANTCOM1/V_QTESTANTCON);
         V_VRESTDIACOM2 := (V_VRESTANTCOM2/V_QTESTANTCON);
         V_VRESTBRUTCON := (V_VRBRUTANTCON/V_QTESTANTCON);
         V_VRESTBRUTCM1 := (V_VRBRUTANTCM1/V_QTESTANTCON);
         V_VRESTBRUTCM2 := (V_VRBRUTANTCM2/V_QTESTANTCON);

         V_VRCLOGCON    := (V_VRCLOGCONANT/V_QTESTANTCON);
         V_VRCLOGCONM1  := (V_VRCLOGCONAM1/V_QTESTANTCON);
         V_VRCLOGCONM2  := (V_VRCLOGCONAM2/V_QTESTANTCON);
         V_VRSEGUCON    := (V_VRSEGUCONANT/V_QTESTANTCON);
         V_VRSEGUCONM1  := (V_VRSEGUCONAM1/V_QTESTANTCON);
         V_VRSEGUCONM2  := (V_VRSEGUCONAM2/V_QTESTANTCON);

      ELSE
         V_VRESTDIACON  := 0;
         V_VRESTDIACOM1 := 0;
         V_VRESTDIACOM2 := 0;
         V_VRESTBRUTCON := 0;
         V_VRESTBRUTCM1 := 0;
         V_VRESTBRUTCM2 := 0;

         V_VRCLOGCON    := 0;
         V_VRCLOGCONM1  := 0;
         V_VRCLOGCONM2  := 0;
         V_VRSEGUCON    := 0;
         V_VRSEGUCONM1  := 0;
         V_VRSEGUCONM2  := 0;

      END IF;

      IF P_NRTIPOCUSTO IN (1,3,40,42) THEN      /*Custo M�dio L�quido*/
         V_VRCUSTO := V_VRESTDIACON;
         IF P_NRTIPOCUSTO IN (40,42) THEN  /*Custo M�dio L�quido(Logistico)*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCON+ V_VRSEGUCON;
         END IF;
      ELSIF P_NRTIPOCUSTO IN (2,4,41,43) THEN   /*Custo M�dio Bruto*/
         V_VRCUSTO := V_VRESTBRUTCON;
          IF P_NRTIPOCUSTO IN (41,43) THEN  /*Custo M�dio Bruto(Logistico)*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCON + V_VRSEGUCON;
          END IF;
      ELSIF P_NRTIPOCUSTO IN (20,24,49,53) THEN /*Custo M�dio L�quido (�ndice 01)*/
         V_VRCUSTO := V_VRESTDIACOM1;

         IF P_NRTIPOCUSTO IN (49,53) THEN  /*Custo M�dio L�quido(Logistico) Indice 01*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCONM1+V_VRSEGUCONM1;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (21,25,40,54) THEN /*Custo M�dio L�quido (�ndice 02)*/
         V_VRCUSTO := V_VRESTDIACOM2;

         IF P_NRTIPOCUSTO IN (40,54) THEN  /*Custo M�dio L�quido(Logistico) Indice 02*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCONM2+V_VRSEGUCONM2;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (22,26,51,55) THEN /*Custo M�dio Bruto (�ndice 01)*/
         V_VRCUSTO := V_VRESTBRUTCM1;

         IF P_NRTIPOCUSTO IN (51,55) THEN  /*Custo M�dio Bruto(Logistico) Indice 01*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCONM1+V_VRSEGUCONM1;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (23,27,52,56) THEN /*Custo M�dio Bruto (�ndice 02)*/
         V_VRCUSTO := V_VRESTBRUTCM2;

         IF P_NRTIPOCUSTO IN (52,56) THEN  /*Custo M�dio Bruto(Logistico) Indice 02*/
            V_VRCUSTO := V_VRCUSTO + V_VRCLOGCONM2+V_VRSEGUCONM2;
         END IF;

      END IF;

   ELSIF P_NRTIPOCUSTO IN (6,7,10,30,31,32,33,44,48,45,59,60,61,62) THEN /*Custos que tem valores na tabela CUSTOSUP*/
      V_CDFORNEOL := NULL;
      IF P_NRTIPOCUSTO IN (44, 45, 48, 59, 60, 61, 62) THEN
         SELECT NVL(P.IDUTILCONSSOLIOL, 'N'), NVL(P.IDUTLMARPREFOL, 'N'), F.CDFILCENTCMP
           INTO V_IDUTILCONSSOLIOL, V_IDUTLMARPREFOL, V_CDFILCENTCMP
           FROM PARASUPRI P, FILIAL F
          WHERE F.CDFILIAL = P_CDFILIAL
            AND P.CDFILIAL = (NVL(F.CDFILCENTCMP, F.CDFILIAL));
         IF V_IDUTILCONSSOLIOL = 'S' THEN
            SELECT
               MAX(P.CDFILIOPELOG)
            INTO
               V_CDFILIAL
            FROM
               PARAMPRODSUP P
            WHERE
               P.CDFILIAL  = P_CDFILIAL AND
               P.CDPRODUTO = P_CDPRODUTO;
            IF V_CDFILIAL IS NULL THEN
               V_CDFILIAL := P_CDFILIAL;
            ELSE
               SELECT
                  MAX(CDFORNOPELOG), MAX(IDFUNCAOFILI)
               INTO
                  V_CDFORNEOL, V_IDFUNCAOFILI
               FROM
                  FILIAL 
               WHERE
                  FILIAL.CDFILIAL = V_CDFILIAL;
            END IF;
         ELSE
            V_CDFILIAL := P_CDFILIAL;
         END IF;
      ELSE
         V_CDFILIAL := P_CDFILIAL;
      END IF;

      IF P_NRTIPOCUSTO IN (6, 10, 30, 31, 44, 48, 61, 62) THEN
         V_VRCUSPRLISTP := NULL;

         IF V_IDFUNCAOFILI = 'O' AND V_IDUTLMARPREFOL = 'S' THEN
            V_IDUTLMARPREFOL :=  'X';
            
            SELECT NVL(MAX(VRCUSPRLISTP),V_ZERO), NVL(MAX(VRCUSPRLISM1),V_ZERO), NVL(MAX(VRCUSPRLISM2),V_ZERO),
                   NVL(MAX(VRCUSLIPRIMP),V_ZERO), MAX(CDPRODACOR),          MAX(CDPRODLIST),
                   MAX(CDFORNECLIST),        MAX(CDFORNECACOR)
              INTO V_VRCUSPRLISTP, V_VRCUSPRLISM1, V_VRCUSPRLISM2,
                   V_VRCUSLIPRIMP, V_CDPRODACOR,   V_CDPRODLIST,
                   V_CDFORNECLIST, V_CDFORNECACOR
              FROM CUSTOSUPRELACOL
             WHERE CDFILIALOL   = V_CDFILIAL  AND
                   CDFILIAL = P_CDFILIAL AND
                   CDPRODUTO  = P_CDPRODUTO AND
                   DTCUSTOSUP = (SELECT MAX(DTCUSTOSUP)
                                   FROM CUSTOSUPRELACOL
                                  WHERE CDFILIALOL  = V_CDFILIAL  AND
                                        CDFILIAL = P_CDFILIAL AND
                                        CDPRODUTO = P_CDPRODUTO AND
                                        VRCUSPRLISTP IS NOT NULL AND
                                        DTCUSTOSUP <= P_DTREFERENCIA);
         END IF;

         IF NVL(V_VRCUSPRLISTP,0) = 0 AND V_IDUTLMARPREFOL != 'X' THEN
            SELECT NVL(MAX(VRCUSPRLISTP),V_ZERO), NVL(MAX(VRCUSPRLISM1),V_ZERO), NVL(MAX(VRCUSPRLISM2),V_ZERO),
                   NVL(MAX(VRCUSLIPRIMP),V_ZERO), MAX(CDPRODACOR),          MAX(CDPRODLIST),
                   MAX(CDFORNECLIST),        MAX(CDFORNECACOR)
              INTO V_VRCUSPRLISTP, V_VRCUSPRLISM1, V_VRCUSPRLISM2,
                   V_VRCUSLIPRIMP, V_CDPRODACOR,   V_CDPRODLIST,
                   V_CDFORNECLIST, V_CDFORNECACOR
              FROM CUSTOSUP
             WHERE CDFILIAL   = V_CDFILIAL  AND
                   CDPRODUTO  = P_CDPRODUTO AND
                   DTCUSTOSUP = (SELECT MAX(DTCUSTOSUP)
                                   FROM CUSTOSUP
                                  WHERE CDFILIAL  = V_CDFILIAL  AND
                                        CDPRODUTO = P_CDPRODUTO AND
                                        VRCUSPRLISTP IS NOT NULL AND
                                        DTCUSTOSUP <= P_DTREFERENCIA);
         END IF;
      END IF;

      IF P_NRTIPOCUSTO IN (7, 32, 33, 45, 59, 60) THEN
         SELECT NVL(MAX(VRPRCUSTOAF),V_ZERO), NVL(MAX(VRPRCUSAFM1),V_ZERO), NVL(MAX(VRPRCUSAFM2),V_ZERO),
                MAX(CDFORNCUSTAF), MAX(CDPRODCUSTAF)
         INTO V_VRPRCUSTOAF, V_VRPRCUSAFM1, V_VRPRCUSAFM2, V_CDFORNCUSTAF,
              V_CDPRODCUSTAF
         FROM CUSTOSUP
         WHERE CDFILIAL   = V_CDFILIAL  AND
               CDPRODUTO  = P_CDPRODUTO AND
               DTCUSTOSUP = (SELECT MAX(DTCUSTOSUP)
                             FROM CUSTOSUP
                             WHERE CDFILIAL  = V_CDFILIAL  AND
                                   CDPRODUTO = P_CDPRODUTO AND
                                   VRPRCUSTOAF IS NOT NULL AND
                                   DTCUSTOSUP <= P_DTREFERENCIA);
      END IF;

 /*      Lista de pre�o e cota��o(Logistico)    [06,10][44,48]*/

      IF (V_CDPRODACOR IS NOT NULL) THEN
         V_CDPRODUTO   := V_CDPRODACOR;
         V_FORNECEDOR  := V_CDFORNECACOR;
      END IF;

      IF (V_CDPRODLIST IS NOT NULL) THEN
         V_CDPRODUTO    := V_CDPRODLIST;
         V_FORNECEDOR   := V_CDFORNECLIST;
      END IF;

      IF (V_CDPRODCUSTAF IS NOT NULL) THEN
         V_CDPRODUTO    := V_CDPRODCUSTAF;
         V_FORNECEDOR   := V_CDFORNCUSTAF;
      END IF;

      IF P_NRTIPOCUSTO IN (44, 45, 48, 59, 60, 61, 62) THEN
         SELECT
            NVL(MAX(VRFATOCONV), V_UM)
         INTO
            V_VRFATOCONV
         FROM
            PRODUTO
         WHERE
            PRODUTO.CDPRODUTO = V_CDPRODUTO;
         SELECT
            NVL(MAX(X.VRPESOBRUTPR),V_ZERO),
            NVL(MAX(VRPECUSTOLOG),V_ZERO),
            NVL(MAX(VRVRCUSTOLOG),V_ZERO),
            NVL(MAX(VRPESEGURLOG),V_ZERO)
         INTO
            V_VRPESOBRUTPR,
            V_VRPECUSTOLOG,
            V_VRVRCUSTOLOG,
            V_VRPESEGURLOG
         FROM
            PRODUTO P,
            CUSTOLOGIST C,
            (SELECT
                NVL(MAX(A.VRPESOBRUTPR),V_ZERO) VRPESOBRUTPR,
                MAX(P.CDPRODUTO) CDPRODUTO,
                MAX(C.DTINIVIGCLOG) DTINIVIGCLOG
             FROM
                PRODUTO P,
                CUSTOLOGIST C,
                PRODUTO A
             WHERE
                (INSTR(A.CDARVPROD,P.CDARVPROD) = V_UM)         AND
                A.CDPRODUTO    = V_CDPRODUTO                    AND
                P.CDPRODUTO    = C.CDPRODUTO                    AND
                C.CDFILIAL     = P_CDFILIAL                     AND
                C.CDFORNECED   = NVL(V_CDFORNEOL, V_FORNECEDOR) AND
                C.DTINIVIGCLOG = (SELECT MAX(DTINIVIGCLOG)
                                  FROM CUSTOLOGIST A, PRODUTO B, PRODUTO Q
                                  WHERE
                                     A.CDFILIAL     = C.CDFILIAL             AND
                                     A.CDFORNECED   = C.CDFORNECED           AND
                                     (INSTR(B.CDARVPROD,Q.CDARVPROD) = V_UM) AND
                                     B.CDPRODUTO    = V_CDPRODUTO            AND
                                     Q.CDPRODUTO    = A.CDPRODUTO            AND
                                     A.DTINIVIGCLOG <= P_DTREFERENCIA))X
         WHERE C.CDFILIAL     = P_CDFILIAL                     AND
               C.CDPRODUTO    = P.CDPRODUTO                    AND
               C.CDPRODUTO    = X.CDPRODUTO                    AND
               C.CDFORNECED   = NVL(V_CDFORNEOL, V_FORNECEDOR) AND
               C.DTINIVIGCLOG = X.DTINIVIGCLOG;
      END IF;

      IF V_VRFATOCONV IS NULL THEN
         V_VRFATOCONV := 1;
      END IF;

      IF P_NRTIPOCUSTO IN (6,44) THEN           /*Custo de Cota��o (Lista de Pre�os)*/

         V_VRCUSTO := V_VRCUSPRLISTP;

         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 44  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (7,45) THEN        /*Custo da �ltima compra(AF)*/
         V_VRCUSTO := V_VRPRCUSTOAF;
         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 45  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;
      ELSIF P_NRTIPOCUSTO IN (10,48) THEN        /*Custo de Cota��o(Lista de Pre�os com Imposto)*/

         V_VRCUSTO     := V_VRCUSLIPRIMP;
         V_SEM_IMPOSTO := V_VRCUSPRLISTP;

         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 48  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_SEM_IMPOSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (30,61) THEN       /*Custo de Cota��o (Lista de Pre�os) (�ndice 01)*/
         V_VRCUSTO := V_VRCUSPRLISM1;

         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 61  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;
      ELSIF P_NRTIPOCUSTO IN (31, 62) THEN       /*Custo de Cota��o (Lista de Pre�os) (�ndice 02)*/
         V_VRCUSTO := V_VRCUSPRLISM2;
         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 62  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (32,59) THEN       /*Custo da �ltima Compra(AF) (�ndice 01)*/
         V_VRCUSTO := V_VRPRCUSAFM1;
         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 59  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (33,60) THEN       /*Custo da �ltima Compra(AF) (�ndice 02)*/
         V_VRCUSTO := V_VRPRCUSAFM2;
         IF NVL(V_VRCUSTO, 0) > 0 THEN
            IF P_NRTIPOCUSTO = 60  THEN
               IF (V_VRVRCUSTOLOG > 0) AND (V_VRPESOBRUTPR > 0) THEN
                  V_VRCUSTOLOG := (V_VRPESOBRUTPR * V_VRVRCUSTOLOG)/V_VRFATOCONV;
               END IF;

               IF (V_VRPECUSTOLOG > 0) THEN
                  V_VRCUSTOLOG := (V_VRCUSTO * V_VRPECUSTOLOG)/100;
               END IF;

               IF (V_VRPESEGURLOG > 0) THEN
                  V_VRCUSTOSEG := (V_VRCUSTO * V_VRPESEGURLOG)/100;
               END IF;

               V_VRCUSTO := V_VRCUSTO + NVL(V_VRCUSTOLOG, 0) + NVL(V_VRCUSTOSEG, 0);
            END IF;
         END IF;
      END IF;

   ELSIF P_NRTIPOCUSTO IN (8,9,28,29,46,47) THEN

      SELECT NVL(MAX(VRLIQCMPPROD), V_ZERO), NVL(MAX(VRBRUCMPPROD), V_ZERO), NVL(MAX(VRLIQCMPPRM1), V_ZERO),
             NVL(MAX(VRLIQCMPPRM2), V_ZERO), NVL(MAX(VRCUSTLOGCMP), V_ZERO), NVL(MAX(VRCUSTLCMPM1), V_ZERO),
             NVL(MAX(VRCUSTLCMPM2), V_ZERO), NVL(MAX(VRSEGULOGCMP), V_ZERO), NVL(MAX(VRSEGULCMPM1), V_ZERO),
             NVL(MAX(VRSEGULCMPM2), V_ZERO)
      INTO  V_VRLIQCMPPROD, V_VRBRUCMPPROD, V_VRLIQCMPPRM1, V_VRLIQCMPPRM2, V_VRCUSTLOGCMP,
            V_VRCUSTLCMPM1, V_VRCUSTLCMPM2, V_VRSEGULOGCMP, V_VRSEGULCMPM1, V_VRSEGULCMPM2
      FROM CUSTOCMPPROD C,
          (SELECT MAX(NRLANCESTQ) NRLANCESTQ, MAX(CDPRODUTO) CDPRODUTO, MAX(DTCUSTCMPPRO) DTCUSTCMPPRO,
                  MAX(CDFILLANCEST) CDFILLANCEST
             FROM CUSTOCMPPROD
            WHERE CDFILIAL       = P_CDFILIAL
              AND CDPRODUTO      = P_CDPRODUTO
              AND DTCUSTCMPPRO   = (SELECT MAX(C.DTCUSTCMPPRO)
                                    FROM CUSTOCMPPROD C
                                    WHERE C.CDFILIAL = P_CDFILIAL
                                      AND C.CDPRODUTO = P_CDPRODUTO
                                      AND C.DTCUSTCMPPRO <= P_DTREFERENCIA)) P
      WHERE C.CDPRODUTO = P.CDPRODUTO
        AND C.DTCUSTCMPPRO = P.DTCUSTCMPPRO
        AND NVL(C.NRLANCESTQ, 'NULL') = NVL(P.NRLANCESTQ, 'NULL')
        AND NVL(C.CDFILLANCEST, 'NULL') = NVL(P.CDFILLANCEST, 'NULL')
        AND CDFILIAL = P_CDFILIAL;

      IF P_NRTIPOCUSTO IN (8,46) THEN
         V_VRCUSTO := V_VRLIQCMPPROD;
         IF P_NRTIPOCUSTO = 46 THEN
            V_VRCUSTO := V_VRCUSTO + V_VRCUSTLOGCMP + V_VRSEGULOGCMP;
         END IF;
      ELSIF P_NRTIPOCUSTO IN (9,47) THEN
         V_VRCUSTO := V_VRBRUCMPPROD;
         IF P_NRTIPOCUSTO = (47) THEN
            V_VRCUSTO := V_VRCUSTO + V_VRCUSTLOGCMP + V_VRSEGULOGCMP;
         END IF;
      ELSIF P_NRTIPOCUSTO IN (28,50) THEN

         V_VRCUSTO := V_VRLIQCMPPRM1;
         IF P_NRTIPOCUSTO = (50) THEN
            V_VRCUSTO := V_VRCUSTO + V_VRCUSTLCMPM1 + V_VRSEGULCMPM1;
         END IF;

      ELSIF P_NRTIPOCUSTO IN (29,51) THEN
         V_VRCUSTO := V_VRLIQCMPPRM2;

         IF P_NRTIPOCUSTO = (51) THEN
            V_VRCUSTO := V_VRCUSTO + V_VRCUSTLCMPM2 + V_VRSEGULCMPM2;
         END IF; 

      END IF;

   ELSIF P_NRTIPOCUSTO = 63 THEN
      SELECT NVL(MAX(C.VRCUSTOCTBL),0)
        INTO V_VRCUSTO
        FROM CUSTMEDCTBL C, DATA D
       WHERE C.CDFILIAL = P_CDFILIAL
         AND C.CDPRODUTO = P_CDPRODUTO
         AND D.DTDATA = P_DTREFERENCIA
         AND C.DTCOMPCTBL = D.DTMES;
   ELSIF P_NRTIPOCUSTO = 64 THEN
      SELECT NVL(MIN(VRPRECOBJETIVO), 0) VRPRECOBJETIVO
        INTO V_VRCUSTO
        FROM ITEMPRECOJETIVO, FILIAL
       WHERE FILIAL.CDFILIAL           = P_CDFILIAL
         AND ITEMPRECOJETIVO.CDFILIAL  = FILIAL.CDFILIAL
         AND ITEMPRECOJETIVO.CDREGIAO  = FILIAL.CDREGIAO
         AND ITEMPRECOJETIVO.CDPRODUTO = P_CDPRODUTO
         AND P_DTREFERENCIA BETWEEN ITEMPRECOJETIVO.DTINIVALITMOBJ AND ITEMPRECOJETIVO.DTFINVALITMOBJ;
   END IF;
   IF V_VRCUSTO < 0 THEN
      RETURN(0);
   ELSE
      RETURN(V_VRCUSTO);
   END IF;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CUSTO_PRODUTO','6.45.048'); END;
