IF EXISTS (SELECT * FROM SYSOBJECTS O, SYSUSERS U
            WHERE O.NAME = 'CONTABILIZA_EST_AJUIMPL' AND
                    TYPE = 'P' 	                     AND
	           U.UID = O.UID                     AND
	          U.NAME = USER)
   DROP PROCEDURE CONTABILIZA_EST_AJUIMPL
GO
                                                                                              
CREATE PROCEDURE CONTABILIZA_EST_AJUIMPL(
   @P_NRLISTA  VARCHAR(10))
AS
BEGIN
   DECLARE @V_CUSTESTFILI       VARCHAR(02);
   DECLARE @V_CUSTESTFILIAJUST  VARCHAR(02);
   DECLARE @V_CDSEQUENCIAL      VARCHAR(20);
   DECLARE @V_NRLANCLOTE        VARCHAR(06);
   DECLARE @V_GERLOTE           VARCHAR(01);
   DECLARE @V_CDEMPRESA         VARCHAR(02);
   DECLARE @V_IDCONTCCUS        VARCHAR(01);
   DECLARE @V_CDHISTPADR        VARCHAR(04);
   DECLARE @V_DSHISTPADR        VARCHAR(1000);
   DECLARE @V_CDLOTE            VARCHAR(20);
   DECLARE @V_IDRETORNA         VARCHAR(01);
   DECLARE @V_CDCHAVE           VARCHAR(14);
                                                                                              
   /* VARIAVEIS DO CURSOR C_LISTA */
   DECLARE @C_LISTA_CDFILIMOVI  VARCHAR(04);
   DECLARE @C_LISTA_DTLANCMIN   DATETIME;
   DECLARE @C_LISTA_DTLANCMAX   DATETIME;
                                                                                              
   /* VARIAVEIS DO CURSOR C_EST_AJUIMPL */
   DECLARE @C_EST_AJUIMPL_CDFILLANCMEST    VARCHAR(04);
   DECLARE @C_EST_AJUIMPL_NRLANCMOVIEST    VARCHAR(10);
   DECLARE @C_EST_AJUIMPL_IDTIPOMOVIEST    VARCHAR(01);
   DECLARE @C_EST_AJUIMPL_QTLANCAMENTO     DOUBLE PRECISION;
   DECLARE @C_EST_AJUIMPL_CDFILIMOVIEST    VARCHAR(04);
   DECLARE @C_EST_AJUIMPL_DTLANCMOVIEST    DATETIME;
   DECLARE @C_EST_AJUIMPL_CDPRODMOVIEST    VARCHAR(20);
   DECLARE @C_EST_AJUIMPL_CDCONTCTBL       VARCHAR(20);
   DECLARE @C_EST_AJUIMPL_VRCUSTPROD       DOUBLE PRECISION;
   DECLARE @C_EST_AJUIMPL_VRCUSTPRODAJUST  DOUBLE PRECISION;
   DECLARE @C_EST_AJUIMPL_CDCENTCUST       VARCHAR(04);
   DECLARE @C_EST_AJUIMPL_CDCONTCTBENTR    VARCHAR(20);
                                                                                              
                                                                                              
   EXEC EXCLUI_LANCCONTABIL '05', @P_NRLISTA;
                                                                                              
   DECLARE C_LISTA CURSOR FOR 
      SELECT LA.CDFILIMOVI, 
             MIN(LA.DTLANCESTQ) AS DTLANCMIN,
             MAX(LA.DTLANCESTQ) AS DTLANCMAX
        FROM LANCTOESTOQ LA, LISTA L
       WHERE LA.CDFILIAL   = SUBSTRING(L.CDLISTA, 01, 04)
         AND LA.NRLANCESTQ = SUBSTRING(L.CDLISTA, 05, 10)
         AND L.NRLISTA     = @P_NRLISTA
       GROUP BY LA.CDFILIMOVI  
       ORDER BY LA.CDFILIMOVI;
                                                                                              
   OPEN C_LISTA;
   FETCH NEXT FROM C_LISTA INTO @C_LISTA_CDFILIMOVI, @C_LISTA_DTLANCMIN, @C_LISTA_DTLANCMAX;
                                                                                              
   WHILE (@@FETCH_STATUS = 0) BEGIN
        SELECT @V_CUSTESTFILI = CDTIPCUSTEST 
          FROM PARAMFILIAL
         WHERE CDFILIAL = @C_LISTA_CDFILIMOVI; 
                                                                                               
        EXEC NOVO_CODIGO 'MOVIESTOQUE', @V_CDSEQUENCIAL, 01;
        SET @V_CDSEQUENCIAL = SUBSTRING(@V_CDSEQUENCIAL, 11, 10);
        SET @V_CUSTESTFILIAJUST = ISNULL(@V_CUSTESTFILI, 03);
        EXEC MOVIMENTACAO_ESTOQUE @C_LISTA_CDFILIMOVI, '', '', '', 01, @C_LISTA_DTLANCMIN, @C_LISTA_DTLANCMAX, '1', 'zzzzzzzzzz', 03,
                                  @V_CUSTESTFILIAJUST, @V_CDSEQUENCIAL, 'S';
                                                                                               
        SET @V_NRLANCLOTE = 0;
        SET @V_CDCHAVE    = '0';
                                                                                               
        DECLARE C_EST_AJUIMPL CURSOR FOR 
           SELECT  I.CDFILLANCMEST, I.NRLANCMOVIEST, I.IDTIPOMOVIEST,
                   I.QTLANCAMENTO,  I.CDFILIMOVIEST, I.DTLANCMOVIEST, I.CDPRODMOVIEST,
                   (CASE IDTIPOMOVIEST WHEN '0' THEN TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST,'I',I.CDFILIMOVIEST) ELSE TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST,'A',I.CDFILIMOVIEST)END) AS CDCONTCTBL,
                   SUM(ROUND(I.VRDIFECUST, 02)) AS VRCUSTPROD,
                   ISNULL(ISNULL(PF.CDCCUSTENTRF, PD.CDCCUSTENTR), FILIAL.CDCENTCUST) AS CDCENTCUST,
                   TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST, 'E', I.CDFILIMOVIEST)    AS CDCONTCTBENTR
             FROM RELAT_MOVIEST I, PRODUTO PD, PRODFILI PF, FILIAL, LISTA L
            WHERE (I.NRRELATMOVI   = @V_CDSEQUENCIAL)
              AND (I.CDFILIMOVIEST *= PF.CDFILIAL)
              AND (I.CDPRODMOVIEST *= PF.CDPRODUTO)
              AND (I.CDPRODMOVIEST *= PD.CDPRODUTO)
              AND (I.CDFILIMOVIEST = FILIAL.CDFILIAL)
              AND (I.CDFILLANCMEST = SUBSTRING(L.CDLISTA, 01, 04))
              AND (I.NRLANCMOVIEST = SUBSTRING(L.CDLISTA, 05, 10))
              AND (L.NRLISTA       = @P_NRLISTA)
            GROUP BY I.CDFILLANCMEST, I.NRLANCMOVIEST,I.QTLANCAMENTO, I.CDFILIMOVIEST,
                    I.DTLANCMOVIEST, I.CDPRODMOVIEST, I.IDTIPOMOVIEST,
                    TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST, 'E', I.CDFILIMOVIEST),
                    ISNULL(ISNULL(PF.CDCCUSTENTRF, PD.CDCCUSTENTR), FILIAL.CDCENTCUST),
                    (CASE IDTIPOMOVIEST WHEN '0' THEN TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST,'I',I.CDFILIMOVIEST) ELSE TEKNISA.CONTCTBL_PRODUTO(I.CDPRODMOVIEST,'A',I.CDFILIMOVIEST)END)
           HAVING SUM(ROUND(I.VRDIFECUST, 02)) <> 0;
                                                                                               
        OPEN C_EST_AJUIMPL;
        FETCH NEXT FROM C_EST_AJUIMPL INTO @C_EST_AJUIMPL_CDFILLANCMEST, @C_EST_AJUIMPL_NRLANCMOVIEST, @C_EST_AJUIMPL_IDTIPOMOVIEST,
                                           @C_EST_AJUIMPL_QTLANCAMENTO,  @C_EST_AJUIMPL_CDFILIMOVIEST, @C_EST_AJUIMPL_DTLANCMOVIEST,
                                           @C_EST_AJUIMPL_CDPRODMOVIEST, @C_EST_AJUIMPL_CDCONTCTBL,    @C_EST_AJUIMPL_VRCUSTPROD,
                                           @C_EST_AJUIMPL_CDCENTCUST,    @C_EST_AJUIMPL_CDCONTCTBENTR;
                                                                                                                 
        WHILE (@@FETCH_STATUS = 0) BEGIN
           IF @V_CDCHAVE = '0' BEGIN
              SELECT @V_CDEMPRESA = CDEMPRESA
                FROM FILIAL
               WHERE FILIAL.CDFILIAL = @C_EST_AJUIMPL_CDFILIMOVIEST;
                                                              
              EXEC GERA_LOTECONTABIL @V_CDEMPRESA, '05', '', @C_EST_AJUIMPL_CDFILIMOVIEST, @C_EST_AJUIMPL_DTLANCMOVIEST,
                                     '', '', @V_CDLOTE, @V_NRLANCLOTE;
           END;
                                                                                                                 
           IF NOT EXISTS(SELECT CDHISTPADRAJIMP, DSHISTPADR
                           FROM PARAMESTOQUE, HISTPADR
                          WHERE CDHISTPADRAJIMP = CDHISTPADR) BEGIN
               SET @V_CDHISTPADR = '';
               SET @V_DSHISTPADR = '';
           END
           ELSE BEGIN
               SELECT @V_CDHISTPADR = CDHISTPADRAJIMP, 
                      @V_DSHISTPADR = DSHISTPADR
                 FROM PARAMESTOQUE, HISTPADR
                WHERE CDHISTPADRAJIMP = CDHISTPADR;
           END;
                                                                                                                 
           SET @C_EST_AJUIMPL_VRCUSTPRODAJUST = ROUND(@C_EST_AJUIMPL_VRCUSTPROD, 02);
           EXEC NOVA_PARTIDA @V_CDEMPRESA, @V_CDLOTE, @C_EST_AJUIMPL_DTLANCMOVIEST, @V_NRLANCLOTE, 
                             @C_EST_AJUIMPL_CDCONTCTBL,V_CDHISTPADR, @V_DSHISTPADR, @C_EST_AJUIMPL_VRCUSTPRODAJUST, '',
                             '', '05', @C_EST_AJUIMPL_NRLANCMOVIEST, 'S';
                                                                                                                 
           SELECT @V_IDCONTCCUS = IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL = @C_EST_AJUIMPL_CDCONTCTBL;
                                                                                                                 
           IF (@C_EST_AJUIMPL_CDCENTCUST IS NOT NULL) BEGIN
              IF (@V_IDCONTCCUS <> 'O') BEGIN
                 SET @C_EST_AJUIMPL_VRCUSTPRODAJUST = ROUND(@C_EST_AJUIMPL_VRCUSTPROD, 02); 
                 EXEC RATEIO_PARTIDA @V_CDEMPRESA, @V_CDLOTE, @C_EST_AJUIMPL_DTLANCMOVIEST, @V_NRLANCLOTE, 
                                     @C_EST_AJUIMPL_CDFILIMOVIEST, @C_EST_AJUIMPL_CDCENTCUST, @C_EST_AJUIMPL_VRCUSTPRODAJUST;
              END;
           END;
                                                                                                                 
           SET @C_EST_AJUIMPL_VRCUSTPRODAJUST = ROUND(@C_EST_AJUIMPL_VRCUSTPROD * -1, 02);
           EXEC NOVA_PARTIDA @V_CDEMPRESA, @V_CDLOTE, @C_EST_AJUIMPL_DTLANCMOVIEST, @V_NRLANCLOTE,
                             @C_EST_AJUIMPL_CDCONTCTBENTR, @V_CDHISTPADR, @V_DSHISTPADR,
                             @C_EST_AJUIMPL_VRCUSTPRODAJUST, '', '', '05', @C_EST_AJUIMPL_NRLANCMOVIEST, 'S';
                                                                                                                 
           SELECT @V_IDCONTCCUS = IDCONTCCUS
             FROM CONTCTBL
            WHERE CDCONTCTBL = @C_EST_AJUIMPL_CDCONTCTBENTR;
                                                                                                                 
           IF (@C_EST_AJUIMPL_CDCENTCUST IS NOT NULL) BEGIN
              IF (@V_IDCONTCCUS <> 'O') BEGIN
                 SET @C_EST_AJUIMPL_VRCUSTPRODAJUST = ROUND(@C_EST_AJUIMPL_VRCUSTPROD, 02);
                 EXEC RATEIO_PARTIDA @V_CDEMPRESA, @V_CDLOTE, @C_EST_AJUIMPL_DTLANCMOVIEST, @V_NRLANCLOTE,
                                     @C_EST_AJUIMPL_CDFILIMOVIEST, @C_EST_AJUIMPL_CDCENTCUST, @C_EST_AJUIMPL_VRCUSTPRODAJUST;
              END;
           END;
                                                                                                                 
           IF (@V_CDCHAVE <> @C_EST_AJUIMPL_CDFILLANCMEST + @C_EST_AJUIMPL_NRLANCMOVIEST) BEGIN
              INSERT INTO RELALESTLANCLOT
                  (CDEMPRESA, CDLOTE, NRLANCLOTE, NRSEQLANLOTE,CDFILIAL, NRLANCESTQ)
              VALUES
                  (@V_CDEMPRESA, @V_CDLOTE, @V_NRLANCLOTE, '00001', @C_EST_AJUIMPL_CDFILLANCMEST, @C_EST_AJUIMPL_NRLANCMOVIEST);
                                                                                                                 
              IF (TEKNISA.CONFERE_PARTIDA(@V_CDEMPRESA, @V_CDLOTE, @V_NRLANCLOTE, @C_EST_AJUIMPL_DTLANCMOVIEST) = 'V') BEGIN
                 UPDATE LANCTOESTOQ
                    SET IDSTATUSCTBEST = 'C'
                  WHERE CDFILIAL   = @C_EST_AJUIMPL_CDFILLANCMEST
                    AND NRLANCESTQ = @C_EST_AJUIMPL_NRLANCMOVIEST;
              END
              ELSE BEGIN
                 UPDATE LANCTOESTOQ
                    SET IDSTATUSCTBEST = 'E'
                  WHERE CDFILIAL   = @C_EST_AJUIMPL_CDFILLANCMEST
                    AND NRLANCESTQ = @C_EST_AJUIMPL_NRLANCMOVIEST;
              END;
           END;
                                                                                                                 
           SET @V_CDCHAVE = @C_EST_AJUIMPL_CDFILLANCMEST + @C_EST_AJUIMPL_NRLANCMOVIEST;
                                                                                                                 
           FETCH NEXT FROM C_EST_AJUIMPL INTO @C_EST_AJUIMPL_CDFILLANCMEST, @C_EST_AJUIMPL_NRLANCMOVIEST, @C_EST_AJUIMPL_IDTIPOMOVIEST,
                                              @C_EST_AJUIMPL_QTLANCAMENTO,  @C_EST_AJUIMPL_CDFILIMOVIEST, @C_EST_AJUIMPL_DTLANCMOVIEST,
                                              @C_EST_AJUIMPL_CDPRODMOVIEST, @C_EST_AJUIMPL_CDCONTCTBL,    @C_EST_AJUIMPL_VRCUSTPROD,
                                              @C_EST_AJUIMPL_CDCENTCUST,    @C_EST_AJUIMPL_CDCONTCTBENTR;
        END;
        CLOSE C_EST_AJUIMPL;
        DEALLOCATE C_EST_AJUIMPL;
                                                                                                                 
        FETCH NEXT FROM C_LISTA INTO @C_LISTA_CDFILIMOVI, @C_LISTA_DTLANCMIN, @C_LISTA_DTLANCMAX;
   END;
   CLOSE C_LISTA;
   DEALLOCATE C_LISTA;
                                                                                                                 
   DELETE FROM LISTA
    WHERE NRLISTA = @P_NRLISTA;
END
GO