IF EXISTS (SELECT * FROM SYS.triggers WHERE NAME = 'TRG_EST_SNGPC_SAIDA_ESTOQUE_INSERT') 
BEGIN
	DROP TRIGGER TRG_EST_SNGPC_SAIDA_ESTOQUE_INSERT
END


SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER dbo.TRG_EST_SNGPC_SAIDA_ESTOQUE_INSERT ON dbo.EST_SNGPC_SAIDA
WITH EXECUTE AS CALLER
FOR INSERT
AS
BEGIN

	-- DECLARAÇÃO DAS VARIÁVEIS
	DECLARE @CD_SAI     INT;
	DECLARE @CD_MOV_ANT INT;
	DECLARE @CD_MOV_POS INT;
	DECLARE @CD_EMP     INT;
	DECLARE @CD_FILIAL  INT;
	DECLARE @CD_PROD    INT;
	DECLARE @DT_MOV     DATETIME;
	DECLARE @QT_LOTE    INT;

	-- DEFINIÇÃO DAS VARIÁVEIS
	SELECT
		@CD_SAI      = I.CD_SAI_SNGPC
		, @CD_EMP    = I.CD_EMP
		, @CD_FILIAL = I.CD_FILIAL
		, @CD_PROD   = A.CD_PROD
		, @DT_MOV    = I.DT_MOV
		, @QT_LOTE   = I.QT_LOTE
	FROM
		INSERTED I
		INNER JOIN EST_PROD_EST_SNGPC_LOTE A ON
			I.CD_LOTE = A.CD_LOTE

	-- SELECIONA A MOVIMENTAÇÃO ANTERIOR
	SELECT 
		TOP 1
		@CD_MOV_ANT = CD_MOV
	FROM
		EST_SNGPC_ENT_SAI
	WHERE
		CD_EMP        = @CD_EMP
		AND CD_FILIAL = @CD_FILIAL
		AND CD_PROD   = @CD_PROD
		AND (DT_MOV < @DT_MOV OR DT_MOV = @DT_MOV)
	ORDER BY
		DT_MOV DESC
		, CD_MOV DESC;

	-- SELECIONAR A MOVIMENTAÇÃO POSTERIOR
	SELECT 
		TOP 1
		@CD_MOV_POS = CD_MOV
	FROM
		EST_SNGPC_ENT_SAI
	WHERE
		CD_EMP        = @CD_EMP
		AND CD_FILIAL = @CD_FILIAL
		AND CD_PROD   = @CD_PROD
		AND (DT_MOV > @DT_MOV OR DT_MOV = @DT_MOV)
	ORDER BY
		DT_MOV
		, CD_MOV;

	/******************************************************************/
	/* PROCESSO PARA INSERÇÃO DO REGISTRO NA TABELA EST_SNGPC_ENT_SAI */
	/******************************************************************/

	-- VERIFICA SE EXISTE MOVIMENTAÇÃO ANTERIOR
	IF @CD_MOV_ANT IS NULL
		-- SE NÃO EXISTIR MOVIMENTAÇÃO ANTERIOR
		BEGIN
			-- VERIFICA SE EXISTE MOVIMENTAÇÃO POSTERIOR
			IF @CD_MOV_POS IS NULL
				-- SE NÃO EXISTIR MOVIMENTAÇÃO POSTERIOR
				BEGIN
					-- INSERE O REGISTRO PEGANDO O ESTOQUE DA EST_PROD_EST_SNGPC_LOTE_CPL
					INSERT INTO EST_SNGPC_ENT_SAI (CD_SAI_SNGPC, CD_EMP, CD_FILIAL, CD_PROD, DT_MOV, QT_FINAL)
					SELECT
						SAI.CD_SAI_SNGPC
						, SAI.CD_EMP
						, SAI.CD_FILIAL
						, LOT.CD_PROD
						, SAI.DT_MOV
						, QTD.QT_LOTE - @QT_LOTE
					FROM
						EST_SNGPC_SAIDA AS SAI
						INNER JOIN EST_PROD_EST_SNGPC_LOTE AS LOT ON
							SAI.CD_LOTE = LOT.CD_LOTE
						INNER JOIN (
							SELECT
								CPL.CD_EMP
								, CPL.CD_FILIAL
								, LOT.CD_PROD
								, SUM(CPL.QT_LOTE) AS QT_LOTE
							FROM
								EST_PROD_EST_SNGPC_LOTE AS LOT
								INNER JOIN EST_PROD_EST_SNGPC_LOTE_CPL AS CPL ON
									LOT.CD_LOTE = CPL.CD_LOTE
							WHERE
								CPL.CD_EMP        = @CD_EMP
								AND CPL.CD_FILIAL = @CD_FILIAL
								AND LOT.CD_PROD   = @CD_PROD
							GROUP BY
								CPL.CD_EMP
								, CPL.CD_FILIAL
								, LOT.CD_PROD	
						) AS QTD ON
							SAI.CD_EMP        = QTD.CD_EMP
							AND SAI.CD_FILIAL = QTD.CD_FILIAL
							AND LOT.CD_PROD   = QTD.CD_PROD
					WHERE
						SAI.CD_SAI_SNGPC = @CD_SAI;
				END
			ELSE
				-- SE EXISTIR MOVIMENTAÇÃO POSTERIOR
				BEGIN
					-- INSERE O REGISTRO PEGANDO O ESTOQUE DA MOVIMENTAÇÃO POSTERIOR
					INSERT INTO EST_SNGPC_ENT_SAI (CD_SAI_SNGPC, CD_EMP, CD_FILIAL, CD_PROD, DT_MOV, QT_FINAL)
					SELECT
						@CD_SAI
						, @CD_EMP
						, @CD_FILIAL
						, @CD_PROD
						, @DT_MOV
						, (
							CASE
								WHEN A.CD_ENT_SNGPC IS NOT NULL THEN
									(A.QT_FINAL - B.QT_LOTE) - @QT_LOTE
								ELSE
									(A.QT_FINAL + C.QT_LOTE) - @QT_LOTE
							END
						)
					FROM
						EST_SNGPC_ENT_SAI A
						LEFT JOIN EST_SNGPC_ENTRADA B ON
							A.CD_ENT_SNGPC = B.CD_ENT_SNGPC
						LEFT JOIN EST_SNGPC_SAIDA C ON
							A.CD_SAI_SNGPC = C.CD_SAI_SNGPC
					WHERE
						A.CD_MOV = @CD_MOV_POS;
				END;
		END
	ELSE
		-- SE EXISTE MOVIMENTAÇÃO ANTERIOR
		BEGIN
			-- INSERE O REGISTRO PEGANDO O ESTOQUE DA MOVIMENTAÇÃO ANTERIOR
			INSERT INTO EST_SNGPC_ENT_SAI (CD_SAI_SNGPC, CD_EMP, CD_FILIAL, CD_PROD, DT_MOV, QT_FINAL)
			SELECT
				@CD_SAI
				, @CD_EMP
				, @CD_FILIAL
				, @CD_PROD
				, @DT_MOV
				, QT_FINAL - @QT_LOTE
			FROM
				EST_SNGPC_ENT_SAI
			WHERE
				CD_MOV = @CD_MOV_ANT;
		END;

	/**********************************************/
	/* PROCESSO PARA ATUALIZAÇÃO DO ESTOQUE FINAL */
	/* DOS REGISTROS NA TABELA EST_SNGPC_ENT_SAI  */
	/**********************************************/

	-- ATUALIZA O ESTOQUE DE TODAS AS MOVIMENTAÇÕES POSTERIORES
	UPDATE
		EST_SNGPC_ENT_SAI
	SET
		QT_FINAL = QT_FINAL - @QT_LOTE
	WHERE
		CD_EMP        = @CD_EMP
		AND CD_FILIAL = @CD_FILIAL
		AND CD_PROD   = @CD_PROD
		AND DT_MOV    > @DT_MOV;

END
GO