IF EXISTS (SELECT * FROM SYSOBJECTS O, SYSUSERS U
            WHERE O.NAME = 'GERA_PED_OL_EXPEDICAO' AND
                  TYPE   = 'P'                     AND
                  U.UID  = O.UID                   AND
                  U.NAME = USER)

   DROP PROCEDURE GERA_PED_OL_EXPEDICAO;
GO

CREATE  PROCEDURE GERA_PED_OL_EXPEDICAO (@P_CDFILDEST  VARCHAR(4),
                                         @P_CDFILLANC  VARCHAR(4),
                                         @P_NRPEDEXOL  VARCHAR(10),
                                         @P_CDFATPRECO VARCHAR(3))
AS
DECLARE @V_IDENVIOITMPEDOL          VARCHAR(1);
DECLARE @V_CDFILIOPELOG             VARCHAR(4);
DECLARE @V_CDCLIENTE                VARCHAR(21);
DECLARE @V_CDMODPGTO                VARCHAR(5);
DECLARE @V_CDVENDEDOR               VARCHAR(4);
DECLARE @V_IDLANCPED                VARCHAR(1);
DECLARE @V_IDSITPEDIDO              VARCHAR(1);
DECLARE @V_IDSITITEMPED             VARCHAR(1);
DECLARE @V_NRPEDIDO                 VARCHAR(10);
DECLARE @V_PXM_NRPEDIDO             VARCHAR(20);
DECLARE @V_NOVO_NRPEDIDO            VARCHAR(10);
DECLARE @V_NMOPERADOR               VARCHAR(40);
DECLARE @V_CDOPELANPED              VARCHAR(12);
DECLARE @V_CDFORMPGTO               VARCHAR(2);
DECLARE @V_IDTPFORPGTPED            VARCHAR(1);
DECLARE @V_NRDIAPGFIXPED            NUMERIC(2);
DECLARE @V_NRPARCPGTOPED            NUMERIC(2);
DECLARE @V_CDTIPORECE               VARCHAR(3);
DECLARE @V_DTENTPED                 DATETIME;
DECLARE @V_DTPEDIDO                 DATETIME;
DECLARE @V_DTPEDIDO1                DATETIME;
DECLARE @V_NRITEMPED                VARCHAR(10);
DECLARE @V_NOVO_NRITEMPED           VARCHAR(10);
DECLARE @V_CDPRECOBASE              VARCHAR(2);
DECLARE @V_CDPRECOBASE1             VARCHAR(2);
DECLARE @V_VRPREUNITPED             FLOAT;
DECLARE @V_HRENTRPROD               VARCHAR(4);
DECLARE @V_CDPRODESTO               VARCHAR(10);
DECLARE @V_VRPESOITPED              FLOAT;
DECLARE @V_COUNTITM                 INTEGER;
DECLARE @C_ITMPEDIDO_CDPRODUTO      VARCHAR(10)
DECLARE @C_ITMPEDIDO_DTPROGENPEOL   DATETIME
DECLARE @C_ITMPEDIDO_QTPROGENPEOL   FLOAT;
DECLARE @C_ITMPEDIDO_CDMARCA        VARCHAR(5);
DECLARE @V_IDTRANSPRINC             VARCHAR(1);
DECLARE @P_INCONSITM                VARCHAR(20);
DECLARE @V_IDTPIJURTRAN             VARCHAR(1);
DECLARE @V_NRINSJURTRAN             VARCHAR(20);
DECLARE @V_CDTIPTRANS               VARCHAR(4);
DECLARE @V_VRFATOCONV               FLOAT;
DECLARE @V_PEDIDO                   VARCHAR(12);

BEGIN
   SELECT @V_CDFILIOPELOG = MAX(P.CDFILIOPELOG)
     FROM PEDIDOEXOL P
    WHERE P.CDFILDEST  = @P_CDFILDEST
      AND P.CDFILLANC  = @P_CDFILLANC
      AND P.NRPEDEXOL  = @P_NRPEDEXOL;

   SELECT @V_IDENVIOITMPEDOL  = ISNULL(MAX(IDENVIOITMPEDOL), 'N')
     FROM PARASUPRI
    WHERE PARASUPRI.CDFILIAL = (SELECT ISNULL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
                                  FROM FILIAL
                                 WHERE FILIAL.CDFILIAL = @V_CDFILIOPELOG);

   IF (@V_IDENVIOITMPEDOL = 'S') BEGIN
      SET @P_INCONSITM = NULL;
      SELECT @V_CDCLIENTE  = MAX(P.CDCLIENTE),
             @V_CDMODPGTO  = MAX(P.CDMODPGTO),
             @V_CDVENDEDOR = MAX(P.CDVENDEDOR),
             @V_IDLANCPED  = ISNULL(MAX(IDLANCPED), '1')
        FROM PARAMPEDIDO P
       WHERE CDFILIAL = @P_CDFILDEST;

      IF @V_CDCLIENTE IS NULL BEGIN
          SET @P_INCONSITM = 'ERRO_CLIENTE';
      END;

      IF ((@V_CDMODPGTO IS NULL) AND (@P_INCONSITM IS NULL)) BEGIN
          SET @P_INCONSITM = 'ERRO_MODPGTO';
      END;

      IF ((@V_CDVENDEDOR IS NULL) AND (@P_INCONSITM IS NULL))BEGIN
          SET @P_INCONSITM = 'ERRO_VENDEDOR';
      END;

      SELECT @V_IDTPIJURTRAN = MAX(B.IDTPIJURTRAN),
             @V_NRINSJURTRAN = MAX(B.NRINSJURTRAN),
             @V_CDTIPTRANS   = MAX(B.CDTIPTRANS)
      FROM
         RELFILTRAS A, TRANSPORT B
      WHERE
         A.CDFILIAL     = @P_CDFILDEST    AND
         A.IDTRANSPRINC = 'S'            AND
         A.IDTPIJURTRAN = B.IDTPIJURTRAN AND
         A.NRINSJURTRAN = B.NRINSJURTRAN;

      IF (((@V_CDTIPTRANS IS NULL) OR (@V_IDTPIJURTRAN IS NULL)) AND (@P_INCONSITM IS NULL))BEGIN
         SET @P_INCONSITM = 'ERRO_TRANSPORT';
      END;

      IF @P_INCONSITM IS NOT NULL BEGIN
         UPDATE ITEMPEDEXOL
            SET DSINCONITMOLEXP = @P_INCONSITM,
                IDEXPTITMOLEXP  = 'N'
          WHERE CDFILDEST       = @P_CDFILDEST
            AND CDFILLANC       = @P_CDFILLANC
            AND NRPEDEXOL       = @P_NRPEDEXOL;
      END
      ELSE BEGIN
         IF @V_IDLANCPED = '1' BEGIN
            SET @V_IDSITPEDIDO  = '1';
            SET @V_IDSITITEMPED = '1';
         END;

         IF @V_IDLANCPED = '2' BEGIN
            SET @V_IDSITPEDIDO  = '2';
            SET @V_IDSITITEMPED = '2';
         END;

         IF @V_IDLANCPED = '3' BEGIN
            SET @V_IDSITPEDIDO  = '2';
            SET @V_IDSITITEMPED = '3';
         END;

         SELECT @V_NRPEDIDO = MAX(P.NRPEDIDO)
           FROM PEDIDO P, ITEMPEDIDO IP
          WHERE P.CDFILIAL    = IP.CDFILIAL
            AND P.NRPEDIDO    = IP.NRPEDIDO
            AND P.CDFILIAL    = @V_CDFILIOPELOG
            AND P.CDCLIENTE   = @V_CDCLIENTE
            AND P.CDFILIALPED = @P_CDFILDEST
            AND P.IDSITPEDIDO IN ('1','2')
            AND (CHARINDEX(@V_CDFILIOPELOG+@P_CDFILLANC+@P_CDFILDEST+@P_NRPEDEXOL, IP.DSITEMPED) > 0);

         SELECT @V_DTPEDIDO = CONVERT(VARCHAR, GETDATE(), 103)
           FROM PARAMGERAL;

         SELECT @V_DTPEDIDO1 = CONVERT(VARCHAR, GETDATE()+1, 103)
           FROM PARAMGERAL;

         SELECT @V_CDFORMPGTO       = MAX(CDFORMPGTO),
                @V_IDTPFORPGTPED    = MAX(IDTPFORPGTOMOD),
                @V_CDTIPORECE       = MAX(CDTIPORECE),
                @V_NRDIAPGFIXPED    = MAX(NRDIAPGFIXMOD),
                @V_NRPARCPGTOPED    = MAX(NRPARCPGTOMOD)
           FROM MODPGTO
          WHERE CDMODPGTO = @V_CDMODPGTO;

         SELECT @V_CDPRECOBASE = MAX(CDPRECOBASE)
           FROM PRECOBASECLI
          WHERE CDCLIENTE = @V_CDCLIENTE
            AND IDPRBASEPRIN = 'S';

         IF @V_CDPRECOBASE IS NULL BEGIN
            SELECT @V_CDPRECOBASE1 = MAX(CDPRECOBASE)
              FROM PRECOUTI
             WHERE PRECOUTI.CDMODPGTO = @V_CDMODPGTO
               AND PRECOUTI.CDFILIAL  = @P_CDFILDEST;
         END
         ELSE BEGIN
            SET @V_CDPRECOBASE1 = @V_CDPRECOBASE;
         END;
         IF @V_NRPEDIDO IS NULL BEGIN
            SET @V_PEDIDO = 'PEDIDO'+@V_CDFILIOPELOG;
            EXEC NOVO_CODIGO @V_PEDIDO, @P_SEQUENCIAL = @V_PXM_NRPEDIDO OUTPUT, @P_QTDE = 1;
            SET @V_NOVO_NRPEDIDO = SUBSTRING(@V_PXM_NRPEDIDO, 11, 10);

            EXEC NMUSUARIO @P_NMUSUARIO = @V_NMOPERADOR;

            SELECT @V_CDOPELANPED = MAX(CDOPERADOR)
              FROM OPERADOR
             WHERE NMOPERADOR LIKE @V_NMOPERADOR;

            IF @V_CDOPELANPED IS NULL BEGIN
               SELECT @V_CDOPELANPED = MAX(CDOPERADOR)
                 FROM OPERADOR;

            END;

            INSERT INTO PEDIDO
                   (CDFILIAL, NRPEDIDO, IDSITPEDIDO, CDCLIENTE, IDPRIOPED, DTPEDIDO, DTENTPED,
                   CDFORMPGTO, IDTPFORPGTPED, NRDIAPGFIXPED, NRPARCPGTOPED,  CDPRECOBASE, CDTIPORECE, CDVENDEDOR,
                   CDMODPGTO, DTHRLANPED, CDOPELANPED, IDPEDIDOIMPR, IDTIPOPEDIDO, IDORIGPED, CDFILIALPED, IDTPIJURTRAN, NRINSJURTRAN, CDTIPTRANS)
            VALUES (@V_CDFILIOPELOG, @V_NOVO_NRPEDIDO, @V_IDSITPEDIDO, @V_CDCLIENTE, '3',  @V_DTPEDIDO, @V_DTPEDIDO,
                   @V_CDFORMPGTO, @V_IDTPFORPGTPED, @V_NRDIAPGFIXPED, @V_NRPARCPGTOPED, @V_CDPRECOBASE1, @V_CDTIPORECE, @V_CDVENDEDOR,
                   @V_CDMODPGTO, GETDATE(), @V_CDOPELANPED, 'N', '1', '9', @P_CDFILDEST, @V_IDTPIJURTRAN, @V_NRINSJURTRAN, @V_CDTIPTRANS);
            IF @V_IDTPFORPGTPED = 'V' BEGIN
               INSERT INTO PRAZOPGTOPED (CDFILIAL, NRPEDIDO, NRDIASPGTOPED, VRPERCPGTOPED)
               SELECT @P_CDFILDEST, @V_NOVO_NRPEDIDO, NRDIASMODPGTO, VRPERCMODPGTO
                 FROM PRAZOMODPGTO
                WHERE CDMODPGTO = @V_CDMODPGTO;
            END;
         END
         ELSE BEGIN
            SET @V_NOVO_NRPEDIDO = @V_NRPEDIDO;
         END;
         SET @V_COUNTITM = 0;
         DECLARE C_ITMPEDIDO CURSOR FOR
             SELECT ITEMPEDEXOL.CDPRODUTO,
                    ITEMPEDEXOL.DTPROGENPEOL,
                    ITEMPEDEXOL.QTPROGENPEOL,
                    ITEMPEDEXOL.CDMARCA
               FROM ITEMPEDEXOL
              WHERE ITEMPEDEXOL.CDFILDEST    = @P_CDFILDEST
                AND ITEMPEDEXOL.CDFILLANC    = @P_CDFILLANC
                AND ITEMPEDEXOL.NRPEDEXOL    = @P_NRPEDEXOL
                AND ISNULL(ITEMPEDEXOL.IDEXPTITMOLEXP, 'N')  = 'N'
              ORDER BY ITEMPEDEXOL.DTPROGENPEOL, ITEMPEDEXOL.CDPRODUTO
         OPEN C_ITMPEDIDO;
         FETCH NEXT FROM C_ITMPEDIDO INTO @C_ITMPEDIDO_CDPRODUTO,
                                          @C_ITMPEDIDO_DTPROGENPEOL,
                                          @C_ITMPEDIDO_QTPROGENPEOL,
                                          @C_ITMPEDIDO_CDMARCA;
         WHILE (@@FETCH_STATUS = 0) BEGIN
            SELECT @V_NRITEMPED = MAX(NRITEMPED)
              FROM ITEMPEDIDO
             WHERE CDFILIAL     = @V_CDFILIOPELOG
               AND NRPEDIDO     = @V_NOVO_NRPEDIDO;

            IF @V_NRITEMPED IS NULL BEGIN
               SET @V_NOVO_NRITEMPED = '0000000001';
            END
            ELSE BEGIN
               SELECT @V_NOVO_NRITEMPED = RIGHT(REPLICATE('0','10') + CONVERT(VARCHAR, (CONVERT(NUMERIC, @V_NRITEMPED) + 1)), '10') FROM PARAMGERAL;
            END;

            SELECT @V_VRPREUNITPED = ISNULL(MAX(VRITEPREBASE), (-1))
              FROM ITEMPREBASE
             WHERE (CDPRODUTO   = @C_ITMPEDIDO_CDPRODUTO)
               AND (CDPRECOBASE = @V_CDPRECOBASE1)
               AND @V_DTPEDIDO BETWEEN (CONVERT(VARCHAR, DTINIVALIPB, 103)) AND (ISNULL(CONVERT(VARCHAR, DTFIMVALIPB, 103), @V_DTPEDIDO1));

            IF (ISNULL(@V_VRPREUNITPED, -1) <= 0)  BEGIN
               SELECT @V_CDPRODESTO = CDPRODESTO,
                      @V_VRFATOCONV = VRFATOCONV
                 FROM PRODUTO
                WHERE (CDPRODUTO   = @C_ITMPEDIDO_CDPRODUTO);
               SET @V_VRPREUNITPED = ISNULL(@V_VRFATOCONV,1)*(TEKNISA.CUSTO_PRODUTO(@V_CDFILIOPELOG, @V_CDPRODESTO, '6', @V_DTPEDIDO, GETDATE()));
            END;

            IF @P_CDFATPRECO IS NOT NULL BEGIN
               SELECT @V_VRPREUNITPED = ISNULL((MAX(P.VRFATPRECO)), (0))
                 FROM FATORPRECO F, PRODFATOR P
                WHERE (F.CDFATPRECO = @P_CDFATPRECO)               AND
                      (F.CDFATPRECO = P.CDFATPRECO)                AND
                      (P.CDPRODUTO  = @C_ITMPEDIDO_CDPRODUTO);
            END;
            IF (ISNULL(@V_VRPREUNITPED, -1) > 0)  BEGIN
               SET @V_COUNTITM =  @V_COUNTITM + 1;

               SET @V_DTENTPED = CONVERT( DATETIME, @V_DTENTPED+ ' '+ CONVERT( VARCHAR, GETDATE(),108));

               IF (DATEPART(hh, @C_ITMPEDIDO_DTPROGENPEOL) = 0) AND (DATEPART(mi, @C_ITMPEDIDO_DTPROGENPEOL) = 0) BEGIN
                  SELECT @V_HRENTRPROD = MAX(HRENTRPROD)
                    FROM PARAMPRODMRP
                   WHERE CDPRODUTO = @V_CDPRODESTO
                     AND CDFILIAL  = @P_CDFILDEST;

                  IF(@V_HRENTRPROD IS NOT NULL)AND(@V_HRENTRPROD <> '0000') BEGIN
                     SET @V_DTENTPED = CONVERT(DATETIME,CONVERT(VARCHAR, CONVERT( VARCHAR, @C_ITMPEDIDO_DTPROGENPEOL,103)+' '+(SUBSTRING(@V_HRENTRPROD,1,2)+':'+SUBSTRING(@V_HRENTRPROD,3,2))))
                  END;
               END;

               INSERT INTO ITEMPEDIDO
                      (CDFILIAL, NRPEDIDO, NRITEMPED, IDSITITEMPED, CDPRODUTO,
                      QTITEMPED, VRPREUNITPED, QTEXPITEMPED, DTENTITPED, DSITEMPED, CDOPERADOR, VRPESOITPED, VRPRTABITPED,
                      CDFATPRECO)
               VALUES (@V_CDFILIOPELOG, @V_NOVO_NRPEDIDO, @V_NOVO_NRITEMPED, @V_IDSITITEMPED, @C_ITMPEDIDO_CDPRODUTO,
                      @C_ITMPEDIDO_QTPROGENPEOL, @V_VRPREUNITPED, 0, @V_DTENTPED,
                      'OL ==>'+' Site Destino: '+@P_CDFILDEST+' - Pedido OL: '+@P_NRPEDEXOL+' - '+@V_CDFILIOPELOG+
                      @P_CDFILLANC+@P_CDFILDEST+@P_NRPEDEXOL+@C_ITMPEDIDO_CDMARCA+@C_ITMPEDIDO_CDPRODUTO, @V_CDOPELANPED, @V_VRPESOITPED, @V_VRPREUNITPED,
                      @P_CDFATPRECO);

               UPDATE ITEMPEDEXOL
                  SET DSINCONITMOLEXP =  @V_CDFILIOPELOG+@V_NOVO_NRPEDIDO+@V_NOVO_NRITEMPED,
                      IDEXPTITMOLEXP  = 'S'
                WHERE CDFILDEST       = @P_CDFILDEST
                  AND CDFILLANC       = @P_CDFILLANC
                  AND NRPEDEXOL       = @P_NRPEDEXOL
                  AND CDPRODUTO       = @C_ITMPEDIDO_CDPRODUTO
                  AND CDMARCA         = @C_ITMPEDIDO_CDMARCA;

            END
            ELSE BEGIN
               IF @P_CDFATPRECO IS NULL BEGIN
                  SET @P_INCONSITM = 'ERRO_VRPRECBASE';
               END BEGIN
                  SET @P_INCONSITM = 'ERRO_VRFATOPRECO';
               END;
               UPDATE ITEMPEDEXOL
                  SET DSINCONITMOLEXP = @P_INCONSITM,
                      IDEXPTITMOLEXP  = 'N'
                WHERE CDFILDEST       = @P_CDFILDEST
                  AND CDFILLANC       = @P_CDFILLANC
                  AND NRPEDEXOL       = @P_NRPEDEXOL
                  AND CDPRODUTO       = @C_ITMPEDIDO_CDPRODUTO
                  AND CDMARCA         = @C_ITMPEDIDO_CDMARCA;
            END;
            FETCH NEXT FROM C_ITMPEDIDO INTO @C_ITMPEDIDO_CDPRODUTO,
                                             @C_ITMPEDIDO_DTPROGENPEOL,
                                             @C_ITMPEDIDO_QTPROGENPEOL,
                                             @C_ITMPEDIDO_CDMARCA;
         END;
         CLOSE C_ITMPEDIDO;
         DEALLOCATE C_ITMPEDIDO;
         IF (@V_COUNTITM = 0 AND (@P_INCONSITM IN ('ERRO_VRPRECBASE', 'ERRO_VRFATOPRECO')))  BEGIN
            DELETE
             FROM PEDIDO
            WHERE CDFILIAL = @V_CDFILIOPELOG
              AND NRPEDIDO = @V_NOVO_NRPEDIDO
              AND NOT EXISTS (SELECT 1
                                FROM ITEMPEDIDO
                               WHERE ITEMPEDIDO.CDFILIAL = PEDIDO.CDFILIAL
                                 AND ITEMPEDIDO.NRPEDIDO = PEDIDO.NRPEDIDO);
            IF @V_IDTPFORPGTPED = 'V' BEGIN
               DELETE PRAZOPGTOPED
                WHERE CDFILIAL = @P_CDFILDEST
                  AND NRPEDIDO = @V_NOVO_NRPEDIDO;
            END;
         END;
      END;
   END;
END;
GO


-- VERSAO --
EXEC ATUVEROBJ 'GERA_PED_OL_EXPEDICAO','6.05.xxx';
GO

