USE [TryNFeOnline]
GO
ALTER TABLE [dbo].[configuracoes] ADD 
[idnExibirEstoqueProdutoTodasContasNFCe] [bit] NULL,
[idnExibirCanhotoDACTE] [bit] NULL
GO
ALTER TABLE [dbo].[notafiscal] ADD 
[idnObtidoStatusAutomaticamente] [bit] NULL
GO
CREATE TABLE [dbo].[Dashboard]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[descricao] [varchar] (100) COLLATE Latin1_General_CI_AS NULL,
	[idDashboardGrupo] [int] NULL,
	[xml] [xml] NULL,
	CONSTRAINT [PK_Dashboard] PRIMARY KEY CLUSTERED
	(
		[id] ASC
	) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY  = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[DashboardGrupos]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[descricao] [varchar] (100) COLLATE Latin1_General_CI_AS NOT NULL,
	CONSTRAINT [PK_DashboardGrupos] PRIMARY KEY CLUSTERED
	(
		[id] ASC
	) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY  = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER PROCEDURE [dbo].[ESTOQUE_PRODUTOS_ALTERADOS]
	@dataUltimaSincronizacaoInf datetime,
	@idEmitenteInf int,
	@idContaInf int,
	@idnIgnorarAlteracoesEstoqueInf bit = 0
AS
BEGIN

	SET NOCOUNT ON;

	declare @dataUltimaSincronizacao datetime = @dataUltimaSincronizacaoInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idConta int = @idContaInf;
	declare @idnIgnorarAlteracoesEstoque bit = @idnIgnorarAlteracoesEstoqueInf;
	
	declare @ProdutosLista as ListaProdutos;
	
	declare @ProdutosAlterados as TABLE
	(
		idProduto int,
		idProdutoClasse int
	)
	
	--Registros Removidos
	INSERT INTO @ProdutosAlterados
	select reg.idProduto, reg.idProdutoClassificacao
	from RegistrosRemovidos reg
	where (CAST(reg.dataExclusao as datetime) >= @dataUltimaSincronizacao)
	and (reg.idProduto is not null)
	
	--Produtos Alterados
	INSERT INTO @ProdutosAlterados
	select pr.id, pc.id
	from produto pr
	left join ProdutoClassificacao pc on pc.idProduto = pr.id
	where ((CAST(pr.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
	or (CAST(pc.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao))
	
	--Preços Adicionados/Alterados
	INSERT INTO @ProdutosAlterados
	select pp.idProduto, pp.idProdutoClassificacao
	from ProdutoPreco pp
	where (CAST(pp.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
	
	
	--Daqui para baixo Alteracoes de Estoque
	IF (@idnIgnorarAlteracoesEstoque = 1)
	BEGIN
		declare @Resultado TABLE 
		(
			idProduto int,
			idProdutoClassificacao int NULL,	
			dscProdutoClasse varchar(240),			
			qtd decimal(18,4),
			unidadeMedida varchar(30),
			codigoProdutoClasse varchar(50),
			precoCadastro decimal(18,4), 
			precoEntradaCadastro decimal(18,4),
			idGrupo int null,
			dscGrupo varchar(100) null,
			idConta int,
			dscConta varchar(200),
			precoCalculado decimal(18,4),
			custoCalculado decimal(18,4),
			refFabrica varchar(50)
		)

		INSERT INTO @Resultado
		SELECT DISTINCT 
			   p.idProduto,
			   p.idProdutoClasse,
			   (case when p.idProdutoClasse is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			   0,
			   (case when p.idProdutoClasse is not null then (case when pc.ucom is not null then pc.ucom else pr.ucom end) else pr.ucom end),
			   (case when p.idProdutoClasse is not null then cast(pr.id as varchar(20)) + REPLACE(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) end),
			   (case when p.idProdutoClasse is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			   (case when p.idProdutoClasse is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			   pr.idGrupo,
			   pg.descricao,
			   0,
			   '',
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente,p.idProduto, p.idProdutoClasse, null)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProduto(@idEmitente,p.idProduto, p.idProdutoClasse)) as custoCalculado,
			   pr.refFabrica
		from @ProdutosAlterados p
		inner join produto pr on pr.id = p.idProduto
		left join ProdutoClassificacao pc on pc.idProduto = pr.id
		left join produtoGrupo pg on pg.id = pr.idGrupo

		SELECT * FROM @Resultado
	END
	ELSE
	BEGIN
		--Notas de Entrada / Saida
		INSERT INTO @ProdutosAlterados
		select np.idProduto, np.idProdutoClassificacao
		from NFProduto np
		inner join notafiscal nf on nf.id = np.idNotaFiscal
		inner join nfemitente nfe on nfe.idnotafiscal = np.idnotafiscal
		inner join produto pr on pr.id = np.idProduto
		inner join operacao op on op.id = nf.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = nf.idOperacao
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and (nf.nfeTpAmb = 1)
		and (cast(nf.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and (nfe.idEmitente = @idEmitente)
		and (pr.idnControlaEstoque = 1)
		and ((ecp.idConta = @idConta) or (@idConta = 0))
	
		--Ajustes de Estoque
		INSERT INTO @ProdutosAlterados
		select ea.idProduto, ea.idProdutoClassificacao
		from estoqueAjustes ea
		inner join produto pr on pr.id = ea.idProduto
		inner join operacao op on op.id = ea.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = ea.idOperacao
		where (cast(ea.data as datetime) >= @dataUltimaSincronizacao)
		and (ea.idEmitente = @idEmitente)
		and (pr.idnControlaEstoque = 1)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and ((ecp.idConta = @idConta) or (@idConta = 0))
	
		--Produtos alocados nas Ordens de Servico
		INSERT INTO @ProdutosAlterados
		select osp.idProduto, osp.idProdutoClassificacao
		from OrdemServicoProduto osp
		inner join produto pr on pr.id = osp.idProduto
		inner join OrdemServico os on os.id = osp.idOrdemServico
		inner join operacao op on op.id = os.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = os.idOperacao
		where (cast(os.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
		and (os.idEmitente = @idEmitente)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and (pr.idnControlaEstoque = 1)
		and ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((os.idnCancelada = 0) or (os.idnCancelada is null))
	
		--Pedidos
		INSERT INTO @ProdutosAlterados
		select pp.idProduto, pp.idProdutoClassificacao
		from pedidoProduto pp
		inner join produto pr on pr.id = pp.idProduto
		inner join pedido pe on pe.id = pp.idPedido
		inner join operacao op on op.id = pe.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = pe.idOperacao
		where (cast(pe.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
		and ((pe.idnFaturado is null) or (pe.idnFaturado = 0))
		and ((pe.idnCancelado is null) or (pe.idnCancelado = 0))
		and ((pe.idnProducao = 1)
		or (((pe.idnProducao is null) or (pe.idnProducao = 0)) and ((op.idnConsiderarEstoqueApenasPedidoEmProducao is null) or (op.idnConsiderarEstoqueApenasPedidoEmProducao = 0))))
		and (pe.idEmitente = @idEmitente)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and (pr.idnControlaEstoque = 1)
		and ((ecp.idConta = @idConta) or (@idConta = 0))
	
		--Condicional
		INSERT INTO @ProdutosAlterados
		select cp.idProduto, cp.idProdutoClassificacao
		from CondicionalProduto cp
		inner join produto pr on pr.id = cp.idProduto
		inner join Condicional co on co.id = cp.idCondicional		
		inner join operacao op on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = co.idOperacao
		where (cast(co.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
		and ((co.idnFechado is null) or (co.idnFechado = 0))
		and (co.idEmitente = @idEmitente)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and (pr.idnControlaEstoque = 1)
		and ((ecp.idConta = @idConta) or (@idConta = 0))
	
		--Consignacao (Só existe entrada no caso da consignação
		INSERT INTO @ProdutosAlterados
		select cp.idProduto, cp.idProdutoClassificacao
		from ConsignacaoProduto cp
		inner join produto pr on pr.id = cp.idProduto
		inner join Consignacao co on co.id = cp.idConsignacao		
		inner join operacao op on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = co.idOperacao
		where (cast(co.dataUltimaAlteracao as datetime) >= @dataUltimaSincronizacao)
		and (co.idEmitente = @idEmitente)
		and ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and (pr.idnControlaEstoque = 1)
		and ((ecp.idConta = @idConta) or (@idConta = 0))
	END
	
	INSERT INTO @ProdutosLista
	SELECT DISTINCT pa.idProduto, pa.idProdutoClasse from @ProdutosAlterados pa
	
	SELECT * FROM EstoqueProdutos2(null, @idEmitente, 0, 0, 1, 0, 1, 1, @ProdutosLista, 1, 1)
    
END
GO
ALTER TABLE [dbo].[Dashboard] ADD CONSTRAINT [FK_DashBoard_DashBoardGrupos] FOREIGN KEY
	(
		[idDashboardGrupo]
	)
	REFERENCES [dbo].[DashboardGrupos]
	(
		[id]
	)
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(392, 650, GETDATE());