CREATE OR REPLACE PROCEDURE GRAVA_ITEMPEDIDO (P_CDFILIAL       IN VARCHAR2, 
                                              P_NRPEDIDO       IN VARCHAR2,
                                              P_CDPRODUTO      IN VARCHAR2,
                                              P_QTITEMPED      IN NUMBER,
                                              P_VRPREUNITPED   IN NUMBER,
                                              P_CDFATPRECO     IN VARCHAR2,
                                              P_VRDESITPED     IN NUMBER,
                                              P_VRPESOITPED    IN NUMBER,
                                              P_VRPRTABITPED   IN NUMBER,
                                              P_VRPEDEMAXIPE   IN NUMBER,
                                              P_DTENTITPED     IN DATE,
                                              P_DTENTPED       IN DATE,
                                              P_NRITEMORCAMENTO IN NUMBER DEFAULT NULL,
                                              P_CDMENSERRO  OUT VARCHAR2,
                                              P_NRITEMPED   OUT VARCHAR2)

AS
   V_CTREG        NUMBER;
   V_DTINIVALIPB  DATE;
   V_DTFIMVALIPB  DATE;
   V_VRFATPRECOIT ITEMPEDIDO.VRFATPRECOIT%TYPE;
   V_IDSITITEMPED ITEMPEDIDO.IDSITITEMPED%TYPE;
   V_CDPRECOBASE  ITEMPREBASE.CDPRECOBASE%TYPE;
   V_CDMODPGTO    PEDIDO.CDMODPGTO%TYPE;
   V_VRPREUNITPED ITEMPEDIDO.VRPREUNITPED%TYPE;
   V_VRFATOCONV   PRODUTO.VRFATOCONV%TYPE;
   V_ERRO         VARCHAR2(400);
   V_CDOPELANPED  PEDIDO.CDOPELANPED%TYPE;
   V_NRITEMPED    ITEMPEDIDO.NRITEMPED%TYPE;
   V_CDVENDEDOR   VENDEDOR.CDVENDEDOR%TYPE;
   V_IDCTRLVENEXP PAREXPEDICAO.IDCTRLVENEXP%TYPE;
   V_DTENTITPED DATE;
   V_CDPRODESTO PRODUTO.CDPRODESTO%TYPE;
   V_HRENTRPROD   PARAMPRODMRP.HRENTRPROD%TYPE;
   V_NRORCAEVENTO PEDIDO.NRORCAEVENTO%TYPE;
   V_CDEMPRESA    EMPRESA.CDEMPRESA%TYPE;
   V_CDINSCESTA   INSCRESTAD.CDINSCESTA%TYPE;
   V_CDCLIENTE    CLIENTE.CDCLIENTE%TYPE;
   V_CDFILIALDEST FILIAL.CDFILIAL%TYPE;
   V_CDTIPOOPER   TIPOOPERAC.CDTIPOOPER%TYPE;
   V_IDORIGDESTOP TIPOOPERAC.IDORIGDESTOP%TYPE;
   V_IDEXIBIMPITPED PARAMPEDIDO.IDEXIBIMPITPED%TYPE;
   V_IDCALCPRECFAT  PARAMPEDIDO.IDCALCPRECFAT%TYPE;
   V_IDCUSEXP       PAREXPEDICAO.IDCUSEXP%TYPE;
   V_DTPROCESSA     PARAMFILIAL.DTPROCESSA%TYPE;
   V_VRCUSTPROD     ITEMPEDIDO.VRPREUNITPED%TYPE;
      V_DTPEDIDO    PEDIDO.DTPEDIDO%TYPE;
BEGIN
   P_CDMENSERRO := 'OK';
   V_ERRO := NULL;
   V_IDCTRLVENEXP := 'N';

   SELECT COUNT(*), NVL(MAX(IDEXIBIMPITPED), 'N'), NVL(MAX(IDCALCPRECFAT), 'E')
     INTO V_CTREG, V_IDEXIBIMPITPED, V_IDCALCPRECFAT
   FROM PARAMPEDIDO
   WHERE CDFILIAL = P_CDFILIAL;

   IF V_CTREG > 0 THEN
      SELECT IDLANCPED
      INTO   V_IDSITITEMPED
      FROM PARAMPEDIDO
      WHERE CDFILIAL = P_CDFILIAL;
   END IF;

   SELECT COUNT(*) INTO V_CTREG
   FROM PRODUTO
   WHERE CDPRODUTO = P_CDPRODUTO;

   V_NRORCAEVENTO := NULL;
   SELECT MAX(CDPRECOBASE), MAX(CDMODPGTO), MAX(CDOPELANPED), MAX(NRORCAEVENTO), MAX(DTPEDIDO)
   INTO V_CDPRECOBASE, V_CDMODPGTO, V_CDOPELANPED, V_NRORCAEVENTO, V_DTPEDIDO
   FROM PEDIDO
   WHERE CDFILIAL = P_CDFILIAL
     AND NRPEDIDO = P_NRPEDIDO;

   IF V_CTREG > 0 THEN
      SELECT MAX(VRFATOCONV) INTO V_VRFATOCONV
      FROM PRODUTO
      WHERE CDPRODUTO = P_CDPRODUTO;
   END IF;

   IF NOT P_CDFATPRECO IS NULL THEN
      SELECT COUNT(*) INTO V_CTREG
      FROM PRODFATOR
      WHERE CDFATPRECO = P_CDFATPRECO
        AND CDPRODUTO  = P_CDPRODUTO;

      IF V_CTREG > 0 THEN
         SELECT VRFATPRECO INTO V_VRFATPRECOIT
         FROM PRODFATOR
         WHERE CDFATPRECO = P_CDFATPRECO
           AND CDPRODUTO  = P_CDPRODUTO;
      ELSE
         V_VRFATPRECOIT := NULL;
      END IF;
   END IF;

   IF P_VRPREUNITPED IS NULL THEN
      IF V_VRFATPRECOIT IS NULL THEN
         SELECT MAX(VRITEPREBASE), MAX(DTINIVALIPB), NVL(MAX(DTFIMVALIPB),'31/12/9999')
         INTO V_VRPREUNITPED, V_DTINIVALIPB, V_DTFIMVALIPB
         FROM ITEMPREBASE
         WHERE CDPRECOBASE = V_CDPRECOBASE
           AND CDPRODUTO   = P_CDPRODUTO
           AND ((P_DTENTPED <= NVL(DTFIMVALIPB,P_DTENTPED) ) AND (P_DTENTPED >= DTINIVALIPB));

         IF V_VRPREUNITPED > 0 THEN
            IF(P_DTENTPED < V_DTINIVALIPB )OR(P_DTENTPED > V_DTFIMVALIPB) THEN
               V_ERRO := 'PRECOVENC;';
            END IF;
         END IF;
      ELSE
         IF (V_IDCALCPRECFAT = 'L') THEN
            SELECT NVL(MAX(IDCUSEXP), 3)
              INTO V_IDCUSEXP
              FROM PAREXPEDICAO
             WHERE CDFILIAL = P_CDFILIAL;

            SELECT NVL(MAX(DTPROCESSA),V_DTPEDIDO)
              INTO V_DTPROCESSA
              FROM PARAMFILIAL
             WHERE CDFILIAL = P_CDFILIAL;

            V_VRCUSTPROD := CUSTO_PRODUTO(P_CDFILIAL, P_CDPRODUTO, V_IDCUSEXP, V_DTPEDIDO, V_DTPROCESSA);

            V_VRPREUNITPED := V_VRCUSTPROD * V_VRFATPRECOIT;
         ELSE
            V_VRPREUNITPED := 1;
         END IF;
      END IF;
   ELSE
      V_VRPREUNITPED := ROUND(P_VRPREUNITPED, 2);
   END IF;

   -- Se nao for orcamento de eventos, e obrigatorio informar o valor unitario
   IF (V_NRORCAEVENTO IS NULL) OR (V_NRORCAEVENTO = '') then
      IF (V_VRPREUNITPED IS NULL) OR (V_VRPREUNITPED = 0) THEN
         V_ERRO := 'VRPREUNITPED;';
      END IF;

   -- Se for orcamento de eventos, o valor pode ser zero (nao nulo)
   ELSE
      IF (V_VRPREUNITPED IS NULL) THEN
         V_ERRO := 'VRPREUNITPED;';
      END IF;
   END IF;

   IF NOT V_CDMODPGTO IS NULL THEN
      SELECT NVL(MAX(IDLANCPEDMOD), V_IDSITITEMPED) INTO V_IDSITITEMPED
      FROM MODPGTO
      WHERE CDMODPGTO = V_CDMODPGTO;
   END IF;
   IF V_IDSITITEMPED IS NULL THEN
      V_ERRO := V_ERRO || 'IDSITITEMPED;';
   END IF;

   IF NOT V_ERRO IS NULL THEN
      P_CDMENSERRO := V_ERRO;
   END IF;

   SELECT COUNT(*) INTO V_CTREG
   FROM ITEMPEDIDO
   WHERE CDFILIAL = P_CDFILIAL
    AND  NRPEDIDO = P_NRPEDIDO;

   IF V_CTREG > 0 THEN
      SELECT MAX(NRITEMPED) INTO V_NRITEMPED
      FROM ITEMPEDIDO
      WHERE CDFILIAL = P_CDFILIAL
       AND  NRPEDIDO = P_NRPEDIDO;
   ELSE
      V_NRITEMPED := NULL;
   END IF;

   IF (V_NRITEMPED IS NULL)THEN
      V_NRITEMPED := LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM('0')) + 1)),10,'0');
   ELSE
      V_NRITEMPED := LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(V_NRITEMPED)) + 1)),10,'0');
   END IF;
   P_NRITEMPED := V_NRITEMPED;

   BEGIN
      SELECT
         CDPRODESTO
      INTO V_CDPRODESTO
      FROM PRODUTO
      WHERE
         CDPRODUTO = P_CDPRODUTO;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDPRODESTO := P_CDPRODUTO;
   END;

   V_DTENTITPED := TO_DATE(TO_CHAR(P_DTENTITPED,'DD/MM/YYYY')||TO_CHAR(SYSDATE,'HH24MI'), 'DD/MM/YYYYHH24MI');

   IF (TO_CHAR(P_DTENTITPED, 'HH24') = '00') AND (TO_CHAR(P_DTENTITPED, 'MI') = '00') THEN
      BEGIN
         SELECT HRENTRPROD INTO V_HRENTRPROD
         FROM PARAMPRODMRP
         WHERE CDPRODUTO = V_CDPRODESTO
           AND CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_HRENTRPROD := '0000';
      END;

      IF (NOT V_HRENTRPROD IS NULL) AND ( V_HRENTRPROD <> '0000') THEN
         V_DTENTITPED := TO_DATE(TO_CHAR(TO_CHAR(P_DTENTITPED,'DD/MM/YYYY')||' '||(SUBSTR(V_HRENTRPROD,1,2)||':'||SUBSTR(V_HRENTRPROD,3,2))), 'DD/MM/YYYY HH24:MI');
      END IF;
   END IF;

   IF P_CDMENSERRO = 'OK' THEN
      SELECT MAX(F.CDEMPRESA), MAX(F.CDINSCESTA), MAX(P.CDCLIENTE), MAX(P.CDFILIALPED),
             MAX(P.CDTIPOOPER), MAX(T.IDORIGDESTOP)
        INTO V_CDEMPRESA, V_CDINSCESTA, V_CDCLIENTE, V_CDFILIALDEST,
             V_CDTIPOOPER, V_IDORIGDESTOP
        FROM PEDIDO P, TIPOOPERAC T, FILIAL F
       WHERE P.CDFILIAL = P_CDFILIAL
         AND P.NRPEDIDO = P_NRPEDIDO
         AND P.CDTIPOOPER = T.CDTIPOOPER(+)
         AND P.IDENTRSAIDOP = T.IDENTRSAIDOP(+)
         AND P.CDFILIAL = F.CDFILIAL;

      INSERT INTO ITEMPEDIDO
         (CDFILIAL,     NRPEDIDO,     NRITEMPED,     IDSITITEMPED,
          CDPRODUTO,    QTITEMPED,    VRPREUNITPED,  CDFATPRECO,
          VRFATPRECOIT, VRDESITPED,   DTENTITPED,    VRPESOITPED,
          VRPRTABITPED, VRPEDEMAXIPE, QTEXPITEMPED,  QTITEMPED2,
          CDOPERADOR,   NRITEMORCAMENTO)
      VALUES
         (P_CDFILIAL,     P_NRPEDIDO,     V_NRITEMPED,     V_IDSITITEMPED,
          P_CDPRODUTO,    P_QTITEMPED,    V_VRPREUNITPED,  P_CDFATPRECO,
          V_VRFATPRECOIT, P_VRDESITPED,   V_DTENTITPED,    P_VRPESOITPED,
          P_VRPRTABITPED, P_VRPEDEMAXIPE, 0,               P_QTITEMPED * V_VRFATOCONV,
          V_CDOPELANPED,  P_NRITEMORCAMENTO);

      IF V_IDEXIBIMPITPED = 'S' THEN
         IMPOSTO_ITEMPEDIDO(V_CDEMPRESA,V_CDINSCESTA,V_CDCLIENTE, V_CDFILIALDEST,
                            P_CDFILIAL, P_NRPEDIDO, V_NRITEMPED, P_DTENTITPED,
                            V_CDTIPOOPER, V_IDORIGDESTOP);
      END IF;

      SELECT COUNT(*)INTO V_CTREG
      FROM PAREXPEDICAO
      WHERE CDFILIAL = P_CDFILIAL;

      IF V_CTREG > 0 THEN
         SELECT IDCTRLVENEXP
           INTO V_IDCTRLVENEXP
         FROM PAREXPEDICAO
         WHERE CDFILIAL = P_CDFILIAL;
      END IF;

      IF(V_IDCTRLVENEXP = 'S')THEN

         SELECT COUNT(*) INTO V_CTREG
         FROM PEDIDO
         WHERE
            CDFILIAL = P_CDFILIAL AND
            NRPEDIDO = P_NRPEDIDO;

         IF V_CTREG > 0 THEN
            SELECT CDVENDEDOR INTO V_CDVENDEDOR
            FROM PEDIDO
            WHERE
               CDFILIAL = P_CDFILIAL AND
               NRPEDIDO = P_NRPEDIDO;

            GERA_COMISSAOVEND( P_CDFILIAL, P_NRPEDIDO, V_CDVENDEDOR,  V_CDOPELANPED,
                               V_NRITEMPED, V_IDSITITEMPED, P_CDPRODUTO, V_VRPREUNITPED);

         END IF;
      END IF;
   END IF;
END;
/