IF EXISTS (SELECT * FROM sysobjects O, sysusers U
          WHERE
            o.name = 'INCLUI_RESERVA_OL'  and
            type = 'P'                    and
            u.uid = o.uid                 and
            u.name = USER)
   DROP PROCEDURE INCLUI_RESERVA_OL;
GO

CREATE PROCEDURE INCLUI_RESERVA_OL
   @P_FILOPELOG    VARCHAR,
   @P_DTENTREGA    DATETIME,
   @P_DATAENT      VARCHAR,
   @P_ROTA         VARCHAR,
   @P_PEDOLEXTR    VARCHAR,
   @P_CDLOTENVIOL  VARCHAR,
   @P_SUBGRUPO     VARCHAR

AS

   DECLARE @V_CONTADOR        DOUBLE PRECISION;
   DECLARE @V_QUANT_ESTOQUE   DOUBLE PRECISION;
   DECLARE @V_ESTOQ_RESERVADO DOUBLE PRECISION;
   DECLARE @V_ESTOQUE_TOTAL   DOUBLE PRECISION;
   DECLARE @V_CDFILDEST       VARCHAR(4);
   DECLARE @V_CDFILLANC       VARCHAR(4);
   DECLARE @V_NRPEDEXOL       VARCHAR(10);
   DECLARE @V_CDMARCA         VARCHAR(5);
   DECLARE @V_CDPRODUTO       VARCHAR(10);
   DECLARE @V_DTPROGENPEOL    DATETIME;
   DECLARE @V_QTPROGENPEOL    DOUBLE PRECISION;
   DECLARE @V_CDFILIOPELOG    VARCHAR(4);
   DECLARE @V_DTPROGEMBARQ    DATETIME;
   DECLARE @V_ITEM_RESERVA    VARCHAR(10);

BEGIN
   SET @V_CONTADOR = 0;
   IF @P_ROTA IS NULL BEGIN
      DECLARE C_RESERVA CURSOR FOR
         SELECT I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO,
                I.DTPROGENPEOL, I.QTPROGENPEOL, P.CDFILIOPELOG, I.DTPROGEMBARQ
           FROM PEDIDOEXOL P, ITEMPEDEXOL I, FILIAL F
          WHERE P.CDFILIOPELOG = @P_FILOPELOG
            AND P.CDFILDEST = I.CDFILDEST
            AND P.CDFILLANC = I.CDFILLANC
            AND P.CDFILDEST = F.CDFILIAL
            AND (CASE @P_DATAENT WHEN '0' THEN I.DTPROGENPEOL ELSE I.DTPROGEMBARQ END = @P_DTENTREGA)
            AND P.CDFILDEST <> @P_FILOPELOG
            AND P.NRPEDEXOL = I.NRPEDEXOL
            AND I.IDBAIXAOLSAI IS NULL
            AND ((P.IDPEDEXOLEXTR = @P_PEDOLEXTR) OR (@P_PEDOLEXTR = 'T'))
            AND ((CHARINDEX(I.CDLOTENVITOL, @P_CDLOTENVIOL) > 0) OR (ISNULL(I.CDLOTENVITOL, @P_CDLOTENVIOL) = 'T'))
            AND ISNULL(I.IDITEMAJUSTE, 'N') = 'N'
            AND ISNULL(I.QTPROGENPEOL, 0) > 0
            AND (@P_SUBGRUPO =  'T' OR EXISTS (SELECT 1
                                                 FROM PRSUBGRPROD PR, PARASUPRI PA
                                                WHERE PR.CDPRODUTO  = I.CDPRODUTO AND
                                                      PR.CDGRUPPROD = PA.CDGRUPPROD   AND
                                                      ISNULL(F.CDFILCENTCMP, F.CDFILIAL) = PA.CDFILIAL AND
                                                      PR.CDFILISUBGR = 'P' AND
                                                      (CHARINDEX(PR.CDSUBGRPROD, @P_SUBGRUPO) > 0)))
          ORDER BY I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO
      OPEN C_RESERVA;
      FETCH NEXT FROM C_ITEMSOLI INTO @V_CDFILDEST,
                                      @V_CDFILLANC,
                                      @V_NRPEDEXOL,
                                      @V_CDMARCA,
                                      @V_CDPRODUTO,
                                      @V_DTPROGENPEOL,
                                      @V_QTPROGENPEOL,
                                      @V_CDFILIOPELOG,
                                      @V_DTPROGEMBARQ;
      SET @V_QUANT_ESTOQUE   = 0;
      SET @V_ESTOQ_RESERVADO = 0;
      SET @V_ESTOQUE_TOTAL   = 0;
      SELECT @V_QUANT_ESTOQUE = TEKNISA.CALC_ESTOQ_CONS(MAX(@P_FILOPELOG), (CASE MAX(R.CDPRODARVOL) WHEN MAX(P.CDPRODESTO) THEN MAX(R.CDPRODARVOL) ELSE MAX(PR.CDPRODUTO) END), MAX(CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() + 1, 103),103)))
        FROM RELACPRODOL R, PRODUTO P, PRODUTO PR
       WHERE P.CDPRODUTO   = R.CDPRODARVOL
         AND P.CDPRODESTO  = PR.CDPRODUTO
         AND R.CDPRARVORIG = @V_CDPRODUTO
         AND R.CDMARCA     = @V_CDMARCA;

      SELECT @V_ESTOQ_RESERVADO = SUM(QTRESERVESTOL)
        FROM RESERVAPEDEXOL
       WHERE CDPRODUTO    =  @V_CDPRODUTO
         AND CDMARCA      =  @V_CDMARCA
         AND CDFILRESOL   =  @P_FILOPELOG
         AND (CDFILDEST   <> @V_CDFILDEST
          OR CDFILLANC    <> @V_CDFILLANC
          OR NRPEDEXOL    <> @V_NRPEDEXOL
          OR DTPROGENPEOL <> @V_DTPROGENPEOL);

      SET @V_ESTOQUE_TOTAL = ISNULL(@V_QUANT_ESTOQUE,0) - (ISNULL(@V_ESTOQ_RESERVADO,0) + @V_QTPROGENPEOL);

      IF @V_ESTOQUE_TOTAL >= 0 BEGIN
         SET @V_ITEM_RESERVA = NULL;
         SELECT @V_ITEM_RESERVA = MAX(CDPRODUTO)
           FROM RESERVAPEDEXOL
          WHERE CDFILDEST     = @V_CDFILDEST
            AND CDFILLANC     = @V_CDFILLANC
            AND NRPEDEXOL     = @V_NRPEDEXOL
            AND DTPROGENPEOL  = @V_DTPROGENPEOL
            AND CDMARCA       = @V_CDMARCA
            AND CDPRODUTO     = @V_CDPRODUTO;
         IF @V_ITEM_RESERVA IS NULL BEGIN
            INSERT INTO RESERVAPEDEXOL (CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO,
                                        DTPROGENPEOL, QTRESERVESTOL, CDFILRESOL, DTRESEMBARQ)
            VALUES (@V_CDFILDEST, @V_CDFILLANC, @V_NRPEDEXOL, @V_CDMARCA,@V_CDPRODUTO,
                    @V_DTPROGENPEOL, @V_QTPROGENPEOL, @V_CDFILIOPELOG, @V_DTPROGEMBARQ);
         END
         ELSE BEGIN
            UPDATE RESERVAPEDEXOL
               SET QTRESERVESTOL = @V_QTPROGENPEOL
             WHERE CDFILDEST     = @V_CDFILDEST
               AND CDFILLANC     = @V_CDFILLANC
               AND NRPEDEXOL     = @V_NRPEDEXOL
               AND DTPROGENPEOL  = @V_DTPROGENPEOL
               AND CDMARCA       = @V_CDMARCA
               AND CDPRODUTO     = @V_CDPRODUTO
               AND QTRESERVESTOL <> @V_QTPROGENPEOL;
         END;
         SET @V_CONTADOR = @V_CONTADOR+1;
         IF @V_CONTADOR >= 500 BEGIN
            SET @V_CONTADOR = 0;
            COMMIT;
         END;
         COMMIT;
         CLOSE C_RESERVA;
         DEALLOCATE C_RESERVA;
      END;
   END
   ELSE BEGIN
      DECLARE C_RESERVA CURSOR FOR
         SELECT I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO,
                I.DTPROGENPEOL, I.QTPROGENPEOL, P.CDFILIOPELOG, I.DTPROGEMBARQ
           FROM PEDIDOEXOL P, ITEMPEDEXOL I, FILIAL F
          WHERE P.CDFILIOPELOG = @P_FILOPELOG
            AND P.CDFILDEST = I.CDFILDEST
            AND P.CDFILLANC = I.CDFILLANC
            AND P.CDFILDEST = F.CDFILIAL
            AND (CASE @P_DATAENT WHEN '0' THEN I.DTPROGENPEOL ELSE I.DTPROGEMBARQ END = @P_DTENTREGA)
            AND P.CDFILDEST <> @P_FILOPELOG
            AND P.NRPEDEXOL = I.NRPEDEXOL
            AND I.IDBAIXAOLSAI IS NULL
            AND ((P.IDPEDEXOLEXTR = @P_PEDOLEXTR) OR (@P_PEDOLEXTR = 'T'))
            AND ((CHARINDEX(I.CDLOTENVITOL, @P_CDLOTENVIOL) > 0) OR (ISNULL(I.CDLOTENVITOL, @P_CDLOTENVIOL) = 'T'))
            AND ISNULL(I.IDITEMAJUSTE, 'N') = 'N'
            AND ISNULL(I.QTPROGENPEOL, 0) > 0
            AND (@P_SUBGRUPO =  'T' OR EXISTS (SELECT 1
                                                 FROM PRSUBGRPROD PR, PARASUPRI PA
                                                WHERE PR.CDPRODUTO  = I.CDPRODUTO AND
                                                      PR.CDGRUPPROD = PA.CDGRUPPROD   AND
                                                      ISNULL(F.CDFILCENTCMP, F.CDFILIAL) = PA.CDFILIAL AND
                                                      PR.CDFILISUBGR = 'P' AND
                                                      (CHARINDEX(PR.CDSUBGRPROD, @P_SUBGRUPO) > 0)))
          ORDER BY I.CDFILDEST, I.CDFILLANC, I.NRPEDEXOL, I.CDMARCA, I.CDPRODUTO
      OPEN C_RESERVA;
      FETCH NEXT FROM C_ITEMSOLI INTO @V_CDFILDEST,
                                      @V_CDFILLANC,
                                      @V_NRPEDEXOL,
                                      @V_CDMARCA,
                                      @V_CDPRODUTO,
                                      @V_DTPROGENPEOL,
                                      @V_QTPROGENPEOL,
                                      @V_CDFILIOPELOG,
                                      @V_DTPROGEMBARQ;
      SET @V_QUANT_ESTOQUE   = 0;
      SET @V_ESTOQ_RESERVADO = 0;
      SET @V_ESTOQUE_TOTAL   = 0;
      SELECT @V_QUANT_ESTOQUE = TEKNISA.CALC_ESTOQ_CONS(MAX(@P_FILOPELOG), (CASE MAX(R.CDPRODARVOL) WHEN MAX(P.CDPRODESTO) THEN MAX(R.CDPRODARVOL) ELSE MAX(PR.CDPRODUTO) END), MAX(CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() + 1, 103),103)))
        FROM RELACPRODOL R, PRODUTO P, PRODUTO PR
       WHERE P.CDPRODUTO   = R.CDPRODARVOL
         AND P.CDPRODESTO  = PR.CDPRODUTO
         AND R.CDPRARVORIG = @V_CDPRODUTO
         AND R.CDMARCA     = @V_CDMARCA;

      SELECT @V_ESTOQ_RESERVADO = SUM(QTRESERVESTOL)
        FROM RESERVAPEDEXOL
       WHERE CDPRODUTO    =  @V_CDPRODUTO
         AND CDMARCA      =  @V_CDMARCA
         AND CDFILRESOL   =  @P_FILOPELOG
         AND (CDFILDEST   <> @V_CDFILDEST
          OR CDFILLANC    <> @V_CDFILLANC
          OR NRPEDEXOL    <> @V_NRPEDEXOL
          OR DTPROGENPEOL <> @V_DTPROGENPEOL);

      SET @V_ESTOQUE_TOTAL = ISNULL(@V_QUANT_ESTOQUE,0) - (ISNULL(@V_ESTOQ_RESERVADO,0) + @V_QTPROGENPEOL);

      IF @V_ESTOQUE_TOTAL >= 0 BEGIN
         SET @V_ITEM_RESERVA = NULL;
         SELECT @V_ITEM_RESERVA = MAX(CDPRODUTO)
           FROM RESERVAPEDEXOL
          WHERE CDFILDEST     = @V_CDFILDEST
            AND CDFILLANC     = @V_CDFILLANC
            AND NRPEDEXOL     = @V_NRPEDEXOL
            AND DTPROGENPEOL  = @V_DTPROGENPEOL
            AND CDMARCA       = @V_CDMARCA
            AND CDPRODUTO     = @V_CDPRODUTO;
         IF @V_ITEM_RESERVA IS NULL BEGIN
            INSERT INTO RESERVAPEDEXOL (CDFILDEST, CDFILLANC, NRPEDEXOL, CDMARCA, CDPRODUTO,
                                        DTPROGENPEOL, QTRESERVESTOL, CDFILRESOL, DTRESEMBARQ)
            VALUES (@V_CDFILDEST, @V_CDFILLANC, @V_NRPEDEXOL, @V_CDMARCA,@V_CDPRODUTO,
                    @V_DTPROGENPEOL, @V_QTPROGENPEOL, @V_CDFILIOPELOG, @V_DTPROGEMBARQ);
         END
         ELSE BEGIN
            UPDATE RESERVAPEDEXOL
               SET QTRESERVESTOL = @V_QTPROGENPEOL
             WHERE CDFILDEST     = @V_CDFILDEST
               AND CDFILLANC     = @V_CDFILLANC
               AND NRPEDEXOL     = @V_NRPEDEXOL
               AND DTPROGENPEOL  = @V_DTPROGENPEOL
               AND CDMARCA       = @V_CDMARCA
               AND CDPRODUTO     = @V_CDPRODUTO
               AND QTRESERVESTOL <> @V_QTPROGENPEOL;
         END;
         SET @V_CONTADOR = @V_CONTADOR+1;
         IF @V_CONTADOR >= 500 BEGIN
            SET @V_CONTADOR = 0;
            COMMIT;
         END ;
         COMMIT;
         CLOSE C_RESERVA;
         DEALLOCATE C_RESERVA;
      END;
   END
END;
GO

-- VERSAO --
EXEC ATUVEROBJ 'INCLUI_RESERVA_OL','5.50.xxx';
GO

