USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[OrdemCargaPedidos] ADD 
[idNotaFiscalMDFe] [int] NULL,
[idOperacaoFaturarMDFe] [int] NULL,
[idnEntregaConcluida] [bit] NULL,
[motivoErroConferenciaCarregamento] [varchar] (400) COLLATE Latin1_General_CI_AS NULL,
[observacoesConferenciaCarregamento] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[observacoesConferenciaProducao] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[itemConferenciaProducao] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
[itemConferenciaCarregamento] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
[itemConferenciaControleQualidade] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
[observacoesConferenciaQualidade] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[codigoSerieModulos] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[codigoSerieInversores] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[codigoSerieTransformador] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
[idnConferidoControleQualidade] [bit] NULL,
[motivoErroConferenciaQualidade] [varchar] (400) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[operacao] ADD 
[idnDreConsiderarEntradaNoGrupoCustos] [bit] NULL
GO
ALTER TABLE [dbo].[NFProduto] ADD 
[valorStAvulso] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[mdfeMrPagamentoFrete] ADD 
[valorAdiantamento] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[produtoimposto] ADD 
[ipiCodigoEnquadramento] [varchar] (5) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[RegistroAtividades] ADD 
[idConsignacao] [int] NULL
GO
ALTER TABLE [dbo].[Contatos] ADD 
[idOperador] [int] NULL,
[idnIncluidoApp] [bit] NULL,
[idVendedorApp] [int] NULL,
[dataUltimaAlteracao] [datetime] NULL
GO
ALTER TABLE [dbo].[configuracoes] ADD 
[idnConsiderarPedidosFaturadosNoEstoque] [bit] NULL,
[bolinhaOrdemCarga] [int] NULL,
[idnNaoCarregarEmitenteLogadoTelas] [bit] NULL,
[idnIgnorarFilialAutorizacaoSupervisionada] [bit] NULL
GO
ALTER TABLE [dbo].[AgendaCompromissos] ADD 
[idUsuarioApp] [int] NULL
GO
CREATE TABLE [dbo].[OrdemCargaItemErros]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[descricao] [varchar] (200) COLLATE Latin1_General_CI_AS NOT NULL,
	CONSTRAINT [PK_OrdemCargaItemErros] 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

CREATE TABLE [dbo].[OrdemCargaMotivoErroConferenciaCarregamento]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[descricao] [varchar] (400) COLLATE Latin1_General_CI_AS NOT NULL,
	CONSTRAINT [PK_OrdemCargaMotivoErroConferenciaCarregamento] 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

CREATE TABLE [dbo].[OrdemCargaMotivoErroCQ]
(
	[id] [int] NOT NULL,
	[descricao] [varchar] (500) COLLATE Latin1_General_CI_AS NOT NULL,
	CONSTRAINT [PK_OrdemCargaMotivoErroCQ] 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

CREATE TABLE [dbo].[OrdemCargaPedidosConclusaoEntrega]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idOrdemCargaPedidos] [int] NULL,
	[descricao] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[tipoDocumento] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[arquivo] [varbinary] (max) NULL,
	CONSTRAINT [PK_OrdemCargaPedidosConclusaoEntrega] 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
CREATE NONCLUSTERED INDEX [IX_OrdemCargapedidosConclusaoEntrega_idOrdemCargaPedidos] ON [dbo].[OrdemCargaPedidosConclusaoEntrega]
(
	[idOrdemCargaPedidos] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY  = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


CREATE TABLE [dbo].[OrdemCargaConferenciaCarregamentoNovo]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idOrdemCargaPedido] [int] NOT NULL,
	[statusCarregamento] [varchar] (400) COLLATE Latin1_General_CI_AS NULL,
	[idnCarregamentoConcluido] [bit] NULL,
	[dataHora] [datetime] NULL,
	[idOperador] [int] NULL,
	[observacoes] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[idProdutoErroCarregamento] [int] NULL,
	CONSTRAINT [PK_OrdemCargaConferenciaCarregamentoNovo] 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
CREATE NONCLUSTERED INDEX [IX_OrdemCargaConfCarregamentoNovo_OperadorOrdem] ON [dbo].[OrdemCargaConferenciaCarregamentoNovo]
(
	[idOrdemCargaPedido] ASC,
	[idOperador] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY  = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


CREATE TABLE [dbo].[OrdemCargaConferenciaQualidade]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idOrdemCargaPedido] [int] NOT NULL,
	[statusCarregamento] [varchar] (400) COLLATE Latin1_General_CI_AS NULL,
	[idnConferenciaQualidadeConcluida] [bit] NULL,
	[dataHora] [datetime] NULL,
	[idOperador] [int] NULL,
	[idProdutoErroQualidade] [int] NULL,
	CONSTRAINT [PK_OrdemCargaConferenciaQualidade] 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
CREATE NONCLUSTERED INDEX [IX_OrdemCargaCQ_OperadorOrdem] ON [dbo].[OrdemCargaConferenciaQualidade]
(
	[idOrdemCargaPedido] ASC,
	[idOperador] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY  = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER FUNCTION [dbo].[PrecoProduto]
(
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@dataInf datetime = null
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int NULL,	
		dscProdutoClasse varchar(500),							
		valor decimal(18,4),
		idnOferta bit,
		valorMinimo decimal(18,4)
)
AS
BEGIN
	
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @dataAtual datetime = @dataInf;
	
	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimoPreco'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;

	if (@dataAtual is null)
		SET @dataAtual = (SELECT GETDATE());
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@idProdutoClassificacao > 0)
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		pcu.preco, COALESCE(pcu.idnOferta, 0), COALESCE(pcu.precoMinimo, 0)
		from ProdutoPreco pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao = @idProdutoClassificacao)
		order by pcu.dataVigencia desc
		
		declare @totalClasse int = (select COUNT(*) from @Resultado)
		if (@totalClasse = 0)
		BEGIN
			INSERT INTO @Resultado
			select TOP 1
			pcu.idProduto, pcu.idProdutoClassificacao, 
			(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
			pcu.preco, COALESCE(pcu.idnOferta, 0), COALESCE(pcu.precoMinimo, 0)
			from ProdutoPreco pcu
			inner join produto pr on pr.id = pcu.idProduto
			left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
			where (pcu.dataVigencia <= @dataAtual)
			and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
			and (pcu.idProduto = @idProduto)
			and (pcu.idProdutoClassificacao is null)
			order by pcu.dataVigencia desc
		END
	END
	ELSE
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		pcu.preco, COALESCE(pcu.idnOferta, 0), COALESCE(pcu.precoMinimo, 0)
		from ProdutoPreco pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao is null)
		order by pcu.dataVigencia desc
	END
	
	declare @totalRegistros int
	declare @descricaoSistema varchar(100)
	SET @totalRegistros = (select count(*) from @Resultado)
	SET @descricaoSistema = (select top 1 descricao from Menu where idnPadrao = 1)
	
	if ((@totalRegistros = 0) or (@descricaoSistema = 'NFE'))
	BEGIN
	--Se nao tem um custo definido, obtem o preco de venda no cadastro do produto
	    delete from @Resultado
		if (@idProdutoClassificacao > 0)
		BEGIN
		--Se foi informado classificacao, obtem os dados da classificacao
			INSERT INTO @Resultado
				select pc.idProduto, pc.id,
				pr.descricao + ' - ' + coalesce(pc.descricao, '') as dscProdutoClasse,
				(case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) as preco, 0, 0
				from ProdutoClassificacao pc
				inner join Produto pr on pr.id = pc.idProduto
				where (pc.id = @idProdutoClassificacao)
		END
		ELSE
		BEGIN
		--Se uma classificacaoo nao foi informada, obtem os dados do cadastro do produto
			INSERT INTO @Resultado
				select pr.id, null,
				pr.descricao,
				pr.vuncom, 0, 0
				from Produto pr			
				where (pr.id = @idProduto)		
		END
					
	END
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[PrecoProdutos]
(
	@idEmitenteInf int,
	@idGrupoInf int = 0,
	@idMarcaInf int = 0,
	@dataInicialInf datetime = null,
	@dataFinalInf datetime = null
)
RETURNS 
@Resultado TABLE 
(
	idProduto int,
	idProdutoClassificacao int NULL,
	preco decimal(18,4),
	idnOferta bit,
	precoMinimo decimal(18,4)
)
AS
BEGIN

	declare @idEmitente int = @idEmitenteInf;
	declare @dataAtual datetime = (SELECT GETDATE());
	declare @idGrupo int = @idGrupoInf;
	declare @idMarca int = @idMarcaInf;
	declare @dataInicial datetime = @dataInicialInf;
	declare @dataFinal datetime = @dataFinalInf;
	
	declare @idnAlteradosNoPeriodo bit = 0;
	if (@dataInicial is not null)
		SET @idnAlteradosNoPeriodo = 1;
	
	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimoPreco'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;


	declare @ProdutosLista as ListaProdutos;
	
	INSERT INTO @ProdutosLista
	select distinct p.id, pc.id
	from produto p 
	left join ProdutoClassificacao pc on pc.idProduto = p.id
	where (((p.idEmitente = @idEmitente) or (p.idEmitente is null)) or (@idEmitente = 0))
	and ((p.idnBaixa = 0) or (p.idnBaixa is null))
	and ((p.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
	and (((pc.idMarca = @idMarca) or ((pc.idMarca is null) and (p.idMarca = @idMarca))) or (@idMarca = 0))
	order by p.id
	
	INSERT INTO @Resultado
	select p.idProduto, p.idProdutoClassificacao, coalesce(a.preco, 0),	coalesce(a.idnOferta, 0), coalesce(a.precoMinimo, 0)
	from @ProdutosLista p
	OUTER APPLY
	(
		SELECT TOP 1 pp.preco, pp.idnOferta, pp.precoMinimo from ProdutoPreco pp 
		where (((pp.dataVigencia <= @dataAtual) and (@idnAlteradosNoPeriodo = 0))
		or ((pp.dataVigencia >= @dataInicial) and (pp.dataVigencia <= @dataFinal)))
		and ((pp.idFilial = @idEmitente)  or (@idEmitente = 0))
		and ((pp.idProduto = p.idProduto) 
		and ((pp.idProdutoClassificacao = p.idProdutoClassificacao) or (p.idProdutoClassificacao is null)) or ((pp.idProduto = p.idProduto) and (pp.idProdutoClassificacao is null)))
		order by pp.dataVigencia desc
	) a
	
	UPDATE @Resultado 
	SET	preco = p.vuncom
	FROM (
		SELECT pr.id, pc.id as idProdutoClasse, (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) as vuncom 
		FROM produto pr left join ProdutoClassificacao pc on pc.idProduto = pr.id) p
	WHERE 
		((p.id = idProduto)
		and ((p.idProdutoClasse = idProdutoClassificacao) or (idProdutoClassificacao is null)))
		and (preco = 0)
		and (@idnAlteradosNoPeriodo = 0)
	
	RETURN 
END
GO

ALTER FUNCTION [dbo].[CustoProdutoData] 
(
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@dataInf datetime = null
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int NULL,
		dscProdutoClasse varchar(500),							
		valor decimal(18,4),
		origemCusto varchar(50),
		idNotaFiscal int NULL
)
AS
BEGIN
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @dataAtual datetime = @dataInf;
	declare @idnConsiderarCustoMedio bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarCustoMedioComoCustoProduto'))
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@dataAtual is null)
		SET @dataAtual = (SELECT GETDATE());

	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimaCusto'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;
	
	
	if (@idProdutoClassificacao > 0)
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)), pcu.idNotaFiscal
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao = @idProdutoClassificacao)
		order by pcu.dataVigencia desc
		
		declare @totalClasse int = (select COUNT(*) from @Resultado)
		if (@totalClasse = 0)
		BEGIN
			INSERT INTO @Resultado
			select TOP 1
			pcu.idProduto, pcu.idProdutoClassificacao, 
			(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
			(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)), pcu.idNotaFiscal
			from ProdutoCusto pcu
			inner join produto pr on pr.id = pcu.idProduto
			left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
			where (pcu.dataVigencia <= @dataAtual)
			and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
			and (pcu.idProduto = @idProduto)
			and (pcu.idProdutoClassificacao is null)
			order by pcu.dataVigencia desc	
		END
	END
	ELSE
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)), pcu.idNotaFiscal
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao is null)
		order by pcu.dataVigencia desc	
	END
	
	declare @totalRegistros int
	declare @descricaoSistema varchar(100)
	SET @totalRegistros = (select count(*) from @Resultado)
	SET @descricaoSistema = (select top 1 descricao from Menu where idnPadrao = 1)
	
	if ((@totalRegistros = 0) or (@descricaoSistema = 'NFE'))
	BEGIN
	--Se n?o tem um custo definido, obtem o pre?o de entrada no cadastro do produto
		delete from @Resultado
		if (@idProdutoClassificacao > 0)
		BEGIN
		--Se foi informado classifica??o, obtem os dados da classifica??o
			INSERT INTO @Resultado
				select pc.idProduto, pc.id,
					pr.descricao + ' - ' + coalesce(pc.descricao, '') as dscProdutoClasse,
					(case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) as precoCusto,
					cast('CUSTOPADRAO' as varchar(50)), null
				from ProdutoClassificacao pc
				inner join Produto pr on pr.id = pc.idProduto
				where (pc.id = @idProdutoClassificacao)
		END
		ELSE
		BEGIN
		--Se uma classifica??o n?o foi informada, obtem os dados do cadastro do produto
			INSERT INTO @Resultado
				select pr.id, null,
					pr.descricao,
					pr.precoEntrada,
					cast('CUSTOPADRAO' as varchar(50)), null
				from Produto pr			
				where (pr.id = @idProduto)		
		END
					
	END
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[CustoProduto] 
(
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int NULL,
		dscProdutoClasse varchar(500),							
		valor decimal(18,4),
		origemCusto varchar(50)
)
AS
BEGIN
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @dataAtual datetime = (SELECT GETDATE());
	declare @idnConsiderarCustoMedio bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarCustoMedioComoCustoProduto'))
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;

	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimaCusto'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;
	

	
	if (@idProdutoClassificacao > 0)
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50))
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao = @idProdutoClassificacao)
		order by pcu.dataVigencia desc
		
		declare @totalClasse int = (select COUNT(*) from @Resultado)
		if (@totalClasse = 0)
		BEGIN
			INSERT INTO @Resultado
			select TOP 1
			pcu.idProduto, pcu.idProdutoClassificacao, 
			(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
			(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50))
			from ProdutoCusto pcu
			inner join produto pr on pr.id = pcu.idProduto
			left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
			where (pcu.dataVigencia <= @dataAtual)
			and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
			and (pcu.idProduto = @idProduto)
			and (pcu.idProdutoClassificacao is null)
			order by pcu.dataVigencia desc	
		END
	END
	ELSE
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50))
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		and (pcu.idProdutoClassificacao is null)
		order by pcu.dataVigencia desc	
	END
	
	declare @totalRegistros int
	declare @descricaoSistema varchar(100)
	
	SET @totalRegistros = (select count(*) from @Resultado)
	SET @descricaoSistema = (select top 1 descricao from Menu where idnPadrao = 1)
	
	
	if ((@totalRegistros = 0) or (@descricaoSistema = 'NFE'))
	BEGIN
	--Se n?o tem um custo definido, obtem o pre?o de entrada no cadastro do produto
		delete from @Resultado
		if (@idProdutoClassificacao > 0)
		BEGIN
		--Se foi informado classifica??o, obtem os dados da classifica??o
			INSERT INTO @Resultado
				select pc.idProduto, pc.id,
					pr.descricao + ' - ' + coalesce(pc.descricao, '') as dscProdutoClasse,
					(case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) as precoCusto,
					cast('CUSTOPADRAO' as varchar(50))
				from ProdutoClassificacao pc
				inner join Produto pr on pr.id = pc.idProduto
				where (pc.id = @idProdutoClassificacao)
		END
		ELSE
		BEGIN
		--Se uma classifica??o n?o foi informada, obtem os dados do cadastro do produto
			INSERT INTO @Resultado
				select pr.id, null,
					pr.descricao,
					pr.precoEntrada,
					cast('CUSTOPADRAO' as varchar(50))
				from Produto pr			
				where (pr.id = @idProduto)		
		END
					
	END
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[EstoqueProdutosConsulta] 
(
	@dataInf Datetime = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0, 
	@idGrupoInf int = 0,
	@idnMostrarProdutosBaixadosInf bit = 0,
	@idnMostrarProdutosQtdNegativaInf bit = 1,
	@idMarcaInf int = 0,
	@descricaoPesquisa varchar(500) = ''
)
RETURNS 
@Resultado TABLE 
(
		rowNumber int,
		idProduto int,
		idProdutoClassificacao int NULL,	
		dscProdutoClasse varchar(500),			
		qtd decimal(18,4),
		unidadeMedida varchar(30),
		cean varchar(25),
		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),
		idMarca int,
		dscMarca varchar(200),
		tipoItem varchar(4),
		qtdMinimaEstoque decimal(18,4),
		idFornecedor int,
		idEmitente int NULL,
		alturaMM int,
		comprimentoMM int,
		larguraMM int,
		peso decimal(18,4),
		idnPrecoOferta bit,
		custoCalculadoLetras varchar(50)
)
AS
BEGIN
	
	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;
	declare @idGrupo int = 0;
	declare @idnMostrarProdutosBaixados bit = @idnMostrarProdutosBaixadosInf;
	declare @idnMostrarProdutosQtdNegativa bit = @idnMostrarProdutosQtdNegativaInf;		
	declare @idMarca int = @idMarcaInf;
	
	if (@idGrupoInf > 0)
		SET @idGrupo = @idGrupoInf;
	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
		
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());		

	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;

	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(idnConsiderarPedidosFaturadosNoEstoque, 0) from configuracoes)


	declare @ItensPesquisa TABLE
	(
		idProduto int
	)

	if (@descricaoPesquisa = '')
		RETURN;

	INSERT into @ItensPesquisa
	select distinct pr.id 	
	from produto pr
	left join ProdutoClassificacao pc on pc.idProduto = pr.id
	left join marca mp on mp.id = pr.idMarca
	where   (((@descricaoPesquisa <> '') and (
			    (upper(pr.descricao) +
				--upper(pc.descricao) +
                coalesce(cast(pr.id as varchar(30)), '')  +
                coalesce(pr.observacoes, '')  +                
                coalesce(upper(pr.refFabrica), '')  +
				coalesce(upper(pc.refFabrica), '')  +
                coalesce(pr.ncm, '')  +
				coalesce(pc.ncm, '')  +
                coalesce(pr.codigoCest, '') +                
                coalesce(mp.descricao, '')  +
                coalesce(pr.ucom, '') + 
				coalesce(pc.ucom, '') +
                coalesce(pr.localizacao, '') + 
				coalesce(pc.localizacao, '') +
                coalesce(pr.cean, '') +
				coalesce(pc.cean, '') +
                coalesce(pr.codigoBarraEtiqueta, '') + 
				coalesce(pc.codigoBarraEtiqueta, '') +
                coalesce(pr.infComplementar, '') + 
				coalesce(pc.infComplementar, '') +
                coalesce(pr.tipoItem, '') +
                coalesce(pr.aplicacao, '') +
				coalesce(pc.aplicacao, '')) like '%' + @descricaoPesquisa + '%')) or (@descricaoPesquisa = ''))

	declare @TotalItensPesquisa int = 0;
	SET @TotalItensPesquisa = (select count(idProduto) from @ItensPesquisa);
	if (@TotalItensPesquisa = 0)
		RETURN;
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(500),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		precoEntradaCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200)		
	)
	
	--Notas de entrada / Saida
	INSERT INTO @ItensEntradaSaida
	select 
		np.idProduto, 
		np.idProdutoClassificacao, 
		(case when np.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when np.idProdutoClassificacao is not null then cast(pr.id as varchar(47)) + REPLACE(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) end),
		coalesce(np.vuncom, 0),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when np.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(np.ucom, '')),
		--Se não tem a quantidade real a ser considerada para o estoque, e as unidades de medida são diferentes, seleciona o fator de conversão
		(case when pr.ucom <> np.ucom and coalesce(np.qcomEstoque, 0) = 0 then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = np.idProduto) and (pu.unidadeMedida = np.ucom)) else 0 end) as fatorConversao,
		(case when 
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) * -1
			else
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) --Considera a quantidade a ser usada para o estoque caso tenha sido informada
			end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ecp.idConta, 
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join produtoClassificacao pc on pc.id = np.idProdutoClassificacao
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   (nf.nfeTpAmb = 1)
		and   (cast(nf.dataEmissao as date) <= @data)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (nfe.idEmitente = @idEmitente)		
		and   ((np.idProduto = @idProduto) or (@idProduto = 0))
		and   ((np.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   (((@TotalItensPesquisa > 0) and (np.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
	
	--Ajustes de estoque
	INSERT INTO @ItensEntradaSaida
		select 
			ea.idProduto, 
			ea.idProdutoClassificacao,
			(case when ea.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when ea.idProdutoClassificacao 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),
			ea.unitario, 
			(case when ea.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when ea.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom,'')),
			upper(coalesce(ea.unidadeMedida, '')),
			(case when pr.ucom <> ea.unidadeMedida then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = ea.idProduto) and (pu.unidadeMedida = ea.unidadeMedida)) else 0 end) as fatorConversao,
			(case when
				(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				ea.qtd * -1
				else
				ea.qtd end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ecp.idConta, 
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = ea.idProdutoClassificacao
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 
		left join notafiscal nf on nf.id = ea.idNotaFiscal
		where (cast(ea.data as date) <= @data)
		and   (ea.idEmitente = @idEmitente)
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   (((@TotalItensPesquisa > 0) and (ea.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((ea.idNotaFiscal is null) or (nf.nfeCstat = 100 or nf.nfeCstat = 150))
		
	--Produtos alocados nas ordens de servi?o
	INSERT INTO @ItensEntradaSaida
		select 
			osp.idProduto, 
			osp.idProdutoClassificacao,
			(case when osp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when osp.idProdutoClassificacao 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),
			osp.precoUnitario, 
			(case when osp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when osp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(osp.ucom, '')),
			(case when pr.ucom <> osp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = osp.idProduto) and (pu.unidadeMedida = osp.ucom)) else 0 end) as fatorConversao,
			(case when 
				(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				osp.quantidade * -1 else osp.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = osp.idProdutoClassificacao	
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 

		where ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		and   (os.idEmitente = @idEmitente)
		and   ((osp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((osp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and   (((@TotalItensPesquisa > 0) and (osp.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))

		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((os.idnCancelada = 0) or (os.idnCancelada is null))

	--Pedidos
	INSERT INTO @ItensEntradaSaida
		select
		pp.idProduto,
		pp.idProdutoClassificacao,
		(case when pp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when pp.idProdutoClassificacao 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),
		pp.vuncom, 
		(case when pp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when pp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = pp.idProduto) and (pu.unidadeMedida = pp.ucom)) else 0 end) as fatorConversao,
		(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(pp.qcom - coalesce(pp.qtdFaturada, 0)) * -1
			else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = pp.idProdutoClassificacao
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 
		where (cast(pe.dataPedido as date) <= @data)
		--and   (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado))))
		and   ((@idnConsiderarPedidosFaturadosNoEstoque = 1) or (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado)))))
		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   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((pp.idnCancelado is null) or (pp.idnCancelado = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (((@TotalItensPesquisa > 0) and (pp.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))	

		
	--Condicional
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      (cp.qcom - coalesce(cp.qtdDevolucao, 0)) * -1
		      else (cp.qcom - coalesce(cp.qtdDevolucao, 0)) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 

		where (cast(co.dataEmissao as date) <= @data)
		and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (((@TotalItensPesquisa > 0) and (cp.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		
	--Consignacao (Só existe entrada no caso da consignação
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      cp.qcom * -1
		      else cp.qcom end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		left join marca mp on mp.id = pr.idMarca 
		left join marca mc on mc.id = pc.idMarca 

		where (cast(co.data as date) <= @data)
		--and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and   (((@TotalItensPesquisa > 0) and (cp.idproduto in (select idProduto from @ItensPesquisa))) or (@TotalItensPesquisa = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))		
		

	--atualiza a qtd dos produtos com unidade de medida diferente da definida no cadastro e efetua a convers?o conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao												
	WHERE (unidadeMedidaConvertida <> '')
	and   (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		select /*case when @exibirCustoLetras = 1 then ROW_NUMBER() OVER (ORDER BY ies.idProduto) else 0 end*/
			   0,
			   ies.idProduto, 
			   ies.idProdutoClassificacao, 
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   (case when pc.cean is not null then pc.cean else pr.cean end),
			   ies.codigoProdutoClasse,
			   ies.precoCadastro,
			   ies.precoEntradaCadastro,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idConta,
			   ies.dscConta,
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProdutoData(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as custoCalculado,
			   (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end),
			   pr.idMarca,
			   mc.descricao as dscMarca,
			   pr.tipoItem,
			   coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0),
			   pr.idFornecedor,
			   pr.idEmitente,
			   coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0),
			   coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0),
			   coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0),
			   coalesce(pr.pesoProduto, 0),
			   (select top 1 coalesce(idnOferta, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)),
			   ''
		from @ItensEntradaSaida ies
		inner join produto pr on pr.id = ies.idProduto
		left join ProdutoClassificacao pc on pc.id = ies.idProdutoClassificacao
		left join marca mc on mc.id = pr.idMarca
		left join produtoGrupo pg on pg.id = pr.idGrupo
		WHERE ((pr.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
		and   ((pr.idMarca = @idMarca) or (@idMarca = 0))
	    group by ies.idProduto, ies.idProdutoClassificacao, ies.dscProduto, ies.unidadeMedida, (case when pc.cean is not null then pc.cean else pr.cean end), ies.codigoProdutoClasse, ies.precoCadastro, ies.precoEntradaCadastro, pr.idGrupo, pg.descricao, ies.idConta, ies.dscConta, (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end), pr.idMarca, mc.descricao, pr.tipoItem, coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0), pr.idFornecedor, pr.idEmitente, coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0), coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0), coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0), coalesce(pr.pesoProduto, 0)

		/*

		Custo em letras removido da seleção. Estava causando muita lentidão em clientes com movimentação significativa
		*/

		/*if (@exibirCustoLetras = 1)
		begin
			DECLARE @X VARCHAR(50)
			DECLARE @count int = (SELECT COUNT(rowNumber) FROM @Resultado)
			DECLARE @row int = 1
	    
			WHILE (@row <= @count)
			BEGIN
				SET @X = (select CAST(custoCalculado as varchar(50)) from @Resultado WHERE rowNumber = @row)
				SELECT @X = REPLACE(@X,numero,letra)
				FROM CustoLetra
			
				UPDATE @Resultado SET custoCalculadoLetras = @X
				WHERE rowNumber = @row
			
				SET @row += 1
			END
		end*/
	
	
	/*select * from @Resultado r
	where (((r.qtd > 0) and (@idnMostrarProdutosQtdNegativa = 0)) or (@idnMostrarProdutosQtdNegativa = 1))*/
	RETURN 
END
GO
ALTER FUNCTION [dbo].[EstoqueProdutos] 
(
	@dataInf Datetime = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0, 
	@idGrupoInf int = 0,
	@idnMostrarProdutosBaixadosInf bit = 0,
	@idnMostrarProdutosQtdNegativaInf bit = 1,
	@idMarcaInf int = 0
)
RETURNS 
@Resultado TABLE 
(
		rowNumber int,
		idProduto int,
		idProdutoClassificacao int NULL,	
		dscProdutoClasse varchar(500),			
		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),
		idMarca int,
		dscMarca varchar(200),
		tipoItem varchar(4),
		qtdMinimaEstoque decimal(18,4),
		idFornecedor int,
		idEmitente int NULL,
		alturaMM int,
		comprimentoMM int,
		larguraMM int,
		peso decimal(18,4),
		idnPrecoOferta bit,
		custoCalculadoLetras varchar(50),
		precoMinimo decimal(18,4)
)
AS
BEGIN
	
	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;
	declare @idGrupo int = 0;
	declare @idnMostrarProdutosBaixados bit = @idnMostrarProdutosBaixadosInf;
	declare @idnMostrarProdutosQtdNegativa bit = @idnMostrarProdutosQtdNegativaInf;		
	declare @idMarca int = @idMarcaInf;
	
	if (@idGrupoInf > 0)
		SET @idGrupo = @idGrupoInf;
	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
		
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());		

	declare @exibirCustoLetras bit;
	SET @exibirCustoLetras = (select idnMostrarCustoEmLetras from configuracoes);

	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;

	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(idnConsiderarPedidosFaturadosNoEstoque, 0) from configuracoes)


	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(500),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		precoEntradaCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200)		
	)
	
	--Notas de entrada / Saida
	INSERT INTO @ItensEntradaSaida
	select 
		np.idProduto, 
		np.idProdutoClassificacao, 
		(case when np.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when np.idProdutoClassificacao is not null then cast(pr.id as varchar(47)) + REPLACE(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) end),
		coalesce(np.vuncom, 0),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when np.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(np.ucom, '')),
		--Se não tem a quantidade real a ser considerada para o estoque, e as unidades de medida são diferentes, seleciona o fator de conversão
		(case when pr.ucom <> np.ucom and coalesce(np.qcomEstoque, 0) = 0 then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = np.idProduto) and (pu.unidadeMedida = np.ucom)) else 0 end) as fatorConversao,
		(case when 
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) * -1
			else
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) --Considera a quantidade a ser usada para o estoque caso tenha sido informada
			end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ecp.idConta, 
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join produtoClassificacao pc on pc.id = np.idProdutoClassificacao
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   (nf.nfeTpAmb = 1)
		and   (cast(nf.dataEmissao as date) <= @data)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (nfe.idEmitente = @idEmitente)		
		and   ((np.idProduto = @idProduto) or (@idProduto = 0))
		and   ((np.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
	
	--Ajustes de estoque
	INSERT INTO @ItensEntradaSaida
		select 
			ea.idProduto, 
			ea.idProdutoClassificacao,
			(case when ea.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when ea.idProdutoClassificacao 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),
			ea.unitario, 
			(case when ea.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when ea.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom,'')),
			upper(coalesce(ea.unidadeMedida, '')),
			(case when pr.ucom <> ea.unidadeMedida then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = ea.idProduto) and (pu.unidadeMedida = ea.unidadeMedida)) else 0 end) as fatorConversao,
			(case when
				(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				ea.qtd * -1
				else
				ea.qtd end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ecp.idConta, 
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = ea.idProdutoClassificacao
		left join notafiscal nf on nf.id = ea.idNotaFiscal
		where (cast(ea.data as date) <= @data)
		and   (ea.idEmitente = @idEmitente)
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((ea.idNotaFiscal is null) or (nf.nfeCstat = 100 or nf.nfeCstat = 150))
		
	--Produtos alocados nas ordens de servi?o
	INSERT INTO @ItensEntradaSaida
		select 
			osp.idProduto, 
			osp.idProdutoClassificacao,
			(case when osp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when osp.idProdutoClassificacao 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),
			osp.precoUnitario, 
			(case when osp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when osp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(osp.ucom, '')),
			(case when pr.ucom <> osp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = osp.idProduto) and (pu.unidadeMedida = osp.ucom)) else 0 end) as fatorConversao,
			(case when 
				(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				osp.quantidade * -1 else osp.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = osp.idProdutoClassificacao	
		where ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		and   (os.idEmitente = @idEmitente)
		and   ((osp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((osp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((os.idnCancelada = 0) or (os.idnCancelada is null))

	--Pedidos
	INSERT INTO @ItensEntradaSaida
		select
		pp.idProduto,
		pp.idProdutoClassificacao,
		(case when pp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when pp.idProdutoClassificacao 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),
		pp.vuncom, 
		(case when pp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when pp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = pp.idProduto) and (pu.unidadeMedida = pp.ucom)) else 0 end) as fatorConversao,
		(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(pp.qcom - coalesce(pp.qtdFaturada, 0)) * -1
			else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = pp.idProdutoClassificacao
		where (cast(pe.dataPedido as date) <= @data)
		--and   (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado))))
		and   ((@idnConsiderarPedidosFaturadosNoEstoque = 1) or (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado)))))
		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   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((pp.idnCancelado is null) or (pp.idnCancelado = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))	

		
	--Condicional
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      (cp.qcom - coalesce(cp.qtdDevolucao, 0)) * -1
		      else (cp.qcom - coalesce(cp.qtdDevolucao, 0)) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.dataEmissao as date) <= @data)
		and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		
	--Consignacao (Só existe entrada no caso da consignação
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      cp.qcom * -1
		      else cp.qcom end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.data as date) <= @data)
		--and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))		
		

	--atualiza a qtd dos produtos com unidade de medida diferente da definida no cadastro e efetua a convers?o conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao												
	WHERE (unidadeMedidaConvertida <> '')
	and   (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		select /*case when @exibirCustoLetras = 1 then ROW_NUMBER() OVER (ORDER BY ies.idProduto) else 0 end*/
			   0,
			   ies.idProduto, 
			   ies.idProdutoClassificacao, 
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProdutoClasse,
			   ies.precoCadastro,
			   ies.precoEntradaCadastro,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idConta,
			   ies.dscConta,
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProdutoData(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as custoCalculado,
			   (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end),
			   pr.idMarca,
			   mc.descricao as dscMarca,
			   pr.tipoItem,
			   coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0),
			   pr.idFornecedor,
			   pr.idEmitente,
			   coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0),
			   coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0),
			   coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0),
			   coalesce(pr.pesoProduto, 0),
			   (select top 1 coalesce(idnOferta, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)),
			   '',
			   (select top 1 coalesce(valorMinimo, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data))
		from @ItensEntradaSaida ies
		inner join produto pr on pr.id = ies.idProduto
		left join ProdutoClassificacao pc on pc.id = ies.idProdutoClassificacao
		left join marca mc on mc.id = pr.idMarca
		left join produtoGrupo pg on pg.id = pr.idGrupo
		WHERE ((pr.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
		and   ((pr.idMarca = @idMarca) or (@idMarca = 0))
	    group by ies.idProduto, ies.idProdutoClassificacao, ies.dscProduto, ies.unidadeMedida, ies.codigoProdutoClasse, ies.precoCadastro, ies.precoEntradaCadastro, pr.idGrupo, pg.descricao, ies.idConta, ies.dscConta, (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end), pr.idMarca, mc.descricao, pr.tipoItem, coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0), pr.idFornecedor, pr.idEmitente, coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0), coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0), coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0), coalesce(pr.pesoProduto, 0)

		/*

		Custo em letras removido da seleção. Estava causando muita lentidão em clientes com movimentação significativa
		*/

		/*if (@exibirCustoLetras = 1)
		begin
			DECLARE @X VARCHAR(50)
			DECLARE @count int = (SELECT COUNT(rowNumber) FROM @Resultado)
			DECLARE @row int = 1
	    
			WHILE (@row <= @count)
			BEGIN
				SET @X = (select CAST(custoCalculado as varchar(50)) from @Resultado WHERE rowNumber = @row)
				SELECT @X = REPLACE(@X,numero,letra)
				FROM CustoLetra
			
				UPDATE @Resultado SET custoCalculadoLetras = @X
				WHERE rowNumber = @row
			
				SET @row += 1
			END
		end*/
	
	
	/*select * from @Resultado r
	where (((r.qtd > 0) and (@idnMostrarProdutosQtdNegativa = 0)) or (@idnMostrarProdutosQtdNegativa = 1))*/
	RETURN 
END
GO
ALTER FUNCTION [dbo].[EstoqueMovimento]
(
	@dataInf Date = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0,
	@dataInicial Date = null
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),		
		numeroDocumento int null,
		dscOperacao varchar(100),
		data datetime,
		idGrupo int,
		dscGrupo varchar(100),
		idNF int
)
AS
BEGIN

	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;

	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;

	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(idnConsiderarPedidosFaturadosNoEstoque, 0) from configuracoes)
	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());
			
	
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),		
		numeroDocumento int null,
		dscOperacao varchar(100),
		data datetime,
		idNF int
	)
	
	--Notas de entrada / Saida
	INSERT INTO @ItensEntradaSaida
	select 
		np.idProduto, 
		np.idProdutoClassificacao, 
		(case when np.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when np.idProdutoClassificacao is not null then cast(pr.id as varchar(47)) + REPLACE(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) end),
		(case when np.qcom > 0 then (coalesce(np.vuncom, 0) - coalesce(np.vdesc / np.qcom, 0)) else (coalesce(np.vuncom, 0) - coalesce(np.vdesc, 0)) end),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(np.ucom, '')),
		--Se não tem a quantidade real a ser considerada para o estoque, e as unidades de medida são diferentes, seleciona o fator de conversão
		(case when pr.ucom <> np.ucom and coalesce(np.qcomEstoque, 0) = 0 then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = np.idProduto) and (pu.unidadeMedida = np.ucom)) else 0 end) as fatorConversao,
		(case when 
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) * -1
			else
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) --Considera a quantidade a ser usada para o estoque caso tenha sido informada
			end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ecp.idConta, 
		ec.descricao,
		(case when nf.numero > 0 then nf.numero else nf.numeroMovimento end),
		op.descricao as dscOperacao,
		nf.dataEmissao,
		nf.id
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join produtoClassificacao pc on pc.id = np.idProdutoClassificacao
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   (nf.nfeTpAmb = 1)
		and   (cast(nf.dataEmissao as date) <= @data)
		and   (((@dataInicial is not null) and (cast(nf.dataEmissao as date) >= @dataInicial)) or (@dataInicial is null))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (nfe.idEmitente = @idEmitente)		
		and   ((np.idProduto = @idProduto) or (@idProduto = 0))
		and   ((np.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
	
	--Ajustes de estoque
	INSERT INTO @ItensEntradaSaida
		select 
			ea.idProduto, 
			ea.idProdutoClassificacao,
			(case when ea.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when ea.idProdutoClassificacao 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),
			ea.unitario, 
			(case when ea.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(ea.unidadeMedida, '')),
			(case when pr.ucom <> ea.unidadeMedida then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = ea.idProduto) and (pu.unidadeMedida = ea.unidadeMedida)) else 0 end) as fatorConversao,
			(case when
				(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				ea.qtd * -1
				else
				ea.qtd end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ecp.idConta, 
			ec.descricao,
			null,
			op.descricao as dscOperacao,
			ea.data,
			0
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = ea.idProdutoClassificacao
		left join notafiscal nf on nf.id = ea.idNotaFiscal
		where (cast(ea.data as date) <= @data)
		and   (((@dataInicial is not null) and (cast(ea.data as date) >= @dataInicial)) or (@dataInicial is null))
		and   (ea.idEmitente = @idEmitente)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((ea.idNotaFiscal is null) or (nf.nfeCstat = 100 or nf.nfeCstat = 150))
		
	--Produtos alocados nas ordens de servi?o
	INSERT INTO @ItensEntradaSaida
		select 
			osp.idProduto, 
			osp.idProdutoClassificacao,
			(case when osp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when osp.idProdutoClassificacao 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),
			osp.precoUnitario, 
			(case when osp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(osp.ucom, '')),
			(case when pr.ucom <> osp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = osp.idProduto) and (pu.unidadeMedida = osp.ucom)) else 0 end) as fatorConversao,
			(case when 
				(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				osp.quantidade * -1 else osp.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			os.numeroOS,
			op.descricao,
			(case when osp.dataHora is not null then osp.dataHora else os.dataHora end),
			0
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = osp.idProdutoClassificacao	
		where ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		and   (((@dataInicial is not null) and (cast(os.dataHora as date) >= @dataInicial)) or (@dataInicial is null))
		and   (os.idEmitente = @idEmitente)
		and   ((osp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((osp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		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 @ItensEntradaSaida
		select
		pp.idProduto,
		pp.idProdutoClassificacao,
		(case when pp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when pp.idProdutoClassificacao 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),
		pp.vuncom, 
		(case when pp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = pp.idProduto) and (pu.unidadeMedida = pp.ucom)) else 0 end) as fatorConversao,
		(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(pp.qcom - coalesce(pp.qtdFaturada, 0)) * -1
			else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao,
		(case when pe.numeroPedido is not null then cast(pe.numeroPedido as int) else null end),
		op.descricao as dscOperacao,
		pe.dataPedido,
		0
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = pp.idProdutoClassificacao
		where (cast(pe.dataPedido as date) <= @data)
		and   (((@dataInicial is not null) and (cast(pe.dataPedido as date) >= @dataInicial)) or (@dataInicial is null))
		--and   (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado))))
		and   ((@idnConsiderarPedidosFaturadosNoEstoque = 1) or (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado)))))
		and   ((pe.idnCancelado is null) or (pe.idnCancelado = 0))
		and   (pe.idEmitente = @idEmitente)
		and   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and   ((ecp.idConta = @idConta) or (@idConta = 0))	
		
	--Condicional
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      (cp.qcom - (coalesce(cp.qtdDevolucao, 0)  + coalesce(cp.qtdFaturada, 0))) * -1
		      else (cp.qcom - (coalesce(cp.qtdDevolucao, 0)  + coalesce(cp.qtdFaturada, 0))) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			(case when co.numero is not null then cast(co.numero as int) else null end),
			op.descricao as dscOperacao,
			co.dataEmissao,
			0
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.dataEmissao as date) <= @data)
		and   (((@dataInicial is not null) and (cast(co.dataEmissao as date) >= @dataInicial)) or (@dataInicial is null))
		and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and   ((ecp.idConta = @idConta) or (@idConta = 0))

	--Consignacao
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      cp.qcom * -1
		      else cp.qcom end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			(case when co.numeroConsignacao is not null then cast(co.numeroConsignacao as int) else null end),
			op.descricao as dscOperacao,
			co.data,
			0
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.data as date) <= @data)
		and   (((@dataInicial is not null) and (cast(co.data as date) >= @dataInicial)) or (@dataInicial is null))
		--and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and   ((ecp.idConta = @idConta) or (@idConta = 0))		

	--atualiza a qtd e o preço dos produtos com unidade de medida diferente da definida no cadastro e efetua a conversão conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao, preco = preco / fatorConversao
	WHERE (unidadeMedidaConvertida <> '')
	and (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		SELECT ies.idProduto,
			   ies.idProdutoClassificacao,
			   ies.dscProduto,
			   ies.codigoProdutoClasse,
			   ies.preco,
			   ies.precoCadastro,
			   ies.unidadeMedida,
			   ies.unidadeMedidaConvertida,
			   ies.fatorConversao,
			   ies.qtd,
			   ies.idOperacao,
			   ies.idnOperacao,
			   ies.idConta,
			   ies.dscConta,
			   ies.numeroDocumento,
			   ies.dscOperacao,
			   ies.data,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idNF
	from @ItensEntradaSaida ies
	inner join produto pr on pr.id = ies.idProduto
	left join produtoGrupo pg on pg.id = pr.idGrupo
	order by ies.data
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[CustoProdutoDataRelatorio] 
(
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@dataInf datetime = null
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int NULL,
		dscProdutoClasse varchar(2000),						
		valor decimal(18,4),
		origemCusto varchar(50), 
		idNotaFiscal int null, 
		idAjusteEstoque int null
)
AS
BEGIN
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @dataAtual date = @dataInf;
	declare @idnConsiderarCustoMedio bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarCustoMedioComoCustoProduto'))
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@dataAtual is null)
		SET @dataAtual = (SELECT GETDATE());
	
	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimaCusto'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;
	

	if (@idProdutoClassificacao > 0)
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)),
		pcu.idNotaFiscal, pcu.idAjusteEstoque
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		--and (pcu.idProdutoClassificacao = @idProdutoClassificacao)
		and (pcu.idNotaFiscal is not null)
		order by pcu.dataVigencia desc
		
		declare @totalClasse int = (select COUNT(*) from @Resultado)
		if (@totalClasse = 0)
		BEGIN
			INSERT INTO @Resultado
			select TOP 1
			pcu.idProduto, pcu.idProdutoClassificacao, 
			(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
			(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)),
			pcu.idNotaFiscal, pcu.idAjusteEstoque
			from ProdutoCusto pcu
			inner join produto pr on pr.id = pcu.idProduto
			left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
			where (pcu.dataVigencia <= @dataAtual)
			and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
			and (pcu.idProduto = @idProduto)
			--and (pcu.idProdutoClassificacao is null)
			and (pcu.idNotaFiscal is not null)
			order by pcu.dataVigencia desc	
		END
	END
	ELSE
	BEGIN
		INSERT INTO @Resultado
		select TOP 1
		pcu.idProduto, pcu.idProdutoClassificacao, 
		(case when pcu.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end) as dscProdutoClasse,
		(case when @idnConsiderarCustoMedio = 1 then pcu.custoMedio else pcu.precoCusto end), cast('CUSTO' as varchar(50)),
		pcu.idNotaFiscal, pcu.idAjusteEstoque
		from ProdutoCusto pcu
		inner join produto pr on pr.id = pcu.idProduto
		left join ProdutoClassificacao pc on pc.id = pcu.idProdutoClassificacao
		where (pcu.dataVigencia <= @dataAtual)
		and ((pcu.idFilial = @idEmitente) or (@idEmitente = 0))
		and (pcu.idProduto = @idProduto)
		--and (pcu.idProdutoClassificacao is null)
		and (pcu.idNotaFiscal is not null)
		order by pcu.dataVigencia desc	
	END
	
	declare @totalRegistros int
	SET @totalRegistros = (select count(*) from @Resultado)
	
	if @totalRegistros = 0
	BEGIN
	--Se n?o tem um custo definido, obtem o pre?o de entrada no cadastro do produto
		if (@idProdutoClassificacao > 0)
		BEGIN
		--Se foi informado classifica??o, obtem os dados da classifica??o
			INSERT INTO @Resultado
				select pc.idProduto, pc.id,
					pr.descricao + ' - ' + coalesce(pc.descricao, '') as dscProdutoClasse,
					(case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) as precoCusto,
					cast('CUSTOPADRAO' as varchar(50)),
					null,null
				from ProdutoClassificacao pc
				inner join Produto pr on pr.id = pc.idProduto
				where (pc.id = @idProdutoClassificacao)
		END
		ELSE
		BEGIN
		--Se uma classifica??o n?o foi informada, obtem os dados do cadastro do produto
			INSERT INTO @Resultado
				select pr.id, null,
					pr.descricao,
					pr.precoEntrada,
					cast('CUSTOPADRAO' as varchar(50)),
					null, null
				from Produto pr			
				where (pr.id = @idProduto)		
		END
					
	END
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[CustoProdutos]
(
	@idEmitenteInf int,
	@idGrupoInf int = 0,
	@idMarcaInf int = 0,
	@dataInicialInf datetime = null,
	@dataFinalInf datetime = null
)
RETURNS 
@Resultado TABLE 
(
	idProduto int,
	idProdutoClassificacao int NULL,
	custo decimal(18,4)
)
AS
BEGIN

	declare @idEmitente int = @idEmitenteInf;
	declare @dataAtual datetime = (SELECT GETDATE());
	declare @idGrupo int = @idGrupoInf;
	declare @idMarca int = @idMarcaInf;
	declare @dataInicial datetime = @dataInicialInf;
	declare @dataFinal datetime = @dataFinalInf;
	
	declare @idnAlteradosNoPeriodo bit = 0;
	if (@dataInicial is not null)
		SET @idnAlteradosNoPeriodo = 1;
	
	declare @idnPuxarSempreUltimoPreco bit = 0;

	SET @idnPuxarSempreUltimoPreco = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnSemprePuxarUltimoPreco'))

	if (@idnPuxarSempreUltimoPreco = 1)
		SET @idEmitente = 0;

	declare @idnConsiderarCustoMedio bit = 0;
	
	SET @idnConsiderarCustoMedio = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarCustoMedioComoCustoProduto'))


	declare @ProdutosLista as ListaProdutos;

	INSERT INTO @ProdutosLista
	select distinct p.id, pc.id
	from produto p 
	left join ProdutoClassificacao pc on pc.idProduto = p.id
	where (((p.idEmitente = @idEmitente) or (p.idEmitente is null)) or (@idEmitente = 0))
	and ((p.idnBaixa = 0) or (p.idnBaixa is null))
	and ((p.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
	and (((pc.idMarca = @idMarca) or ((pc.idMarca is null) and (p.idMarca = @idMarca))) or (@idMarca = 0))
	order by p.id

	INSERT INTO @Resultado
	select p.idProduto, p.idProdutoClassificacao, coalesce((select TOP 1 (case when @idnConsiderarCustoMedio = 1 then pc.custoMedio else pc.precoCusto end) from ProdutoCusto pc 
	where (((pc.dataVigencia <= @dataAtual) and (@idnAlteradosNoPeriodo = 0))
	or ((pc.dataVigencia >= @dataInicial) and (pc.dataVigencia <= @dataFinal)))
	and ((pc.idFilial = @idEmitente)  or (@idEmitente = 0))
	and ((pc.idProduto = p.idProduto) 
	and ((pc.idProdutoClassificacao = p.idProdutoClassificacao) or (p.idProdutoClassificacao is null)) or ((pc.idProduto = p.idProduto) and (pc.idProdutoClassificacao is null)))
	order by pc.dataVigencia desc), 0)
	from @ProdutosLista p
	
	UPDATE @Resultado 
	SET	custo = p.precoCusto
	FROM (
		SELECT pr.id, pc.id as idProdutoClasse, (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) as precoCusto 
		FROM produto pr left join ProdutoClassificacao pc on pc.idProduto = pr.id) p
	WHERE 
		((p.id = idProduto)
		and ((p.idProdutoClasse = idProdutoClassificacao) or (idProdutoClassificacao is null)))
		and (custo = 0)
		and (@idnAlteradosNoPeriodo = 0)
	
	RETURN 
END
GO
ALTER FUNCTION [dbo].[EstoqueProdutos2]
(
	@dataInf Datetime = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0, 
	@idGrupoInf int = 0,
	@idnMostrarProdutosBaixadosInf bit = 0,
	@idnMostrarProdutosQtdNegativaInf bit = 1,
    @Produtos ListaProdutos READONLY,
	@selecaoMultipla int = 0,
	@idnRetornarTodosProdutos bit = 0
)
RETURNS 
@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),
		precoMinimo decimal(18,4)
)
AS
BEGIN
	
	
	
	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;
	declare @idGrupo int = 0;
	declare @idnMostrarProdutosBaixados bit = @idnMostrarProdutosBaixadosInf;
	declare @idnMostrarProdutosQtdNegativa bit = @idnMostrarProdutosQtdNegativaInf;
	
	if (@idGrupoInf > 0)
		SET @idGrupo = @idGrupoInf;
	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
		
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());
		
	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;

	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(idnConsiderarPedidosFaturadosNoEstoque, 0) from configuracoes)

	
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		precoEntradaCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200)		
	)
	
	--Notas de entrada / Saida
	INSERT INTO @ItensEntradaSaida
	select 
		np.idProduto, 
		np.idProdutoClassificacao, 
		(case when np.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when np.idProdutoClassificacao is not null then cast(pr.id as varchar(47)) + REPLACE(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) end),
		coalesce(np.vuncom, 0),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when np.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(np.ucom, '')),
		--Se não tem a quantidade real a ser considerada para o estoque, e as unidades de medida são diferentes, seleciona o fator de conversão
		(case when pr.ucom <> np.ucom and coalesce(np.qcomEstoque, 0) = 0 then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = np.idProduto) and (pu.unidadeMedida = np.ucom)) else 0 end) as fatorConversao,
		(case when 
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) * -1
			else
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) --Considera a quantidade a ser usada para o estoque caso tenha sido informada
			end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ecp.idConta, 
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join produtoClassificacao pc on pc.id = np.idProdutoClassificacao
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   (nf.nfeTpAmb = 1)
		and   (cast(nf.dataEmissao as date) <= @data)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (nfe.idEmitente = @idEmitente)
		and   ((np.idProduto = @idProduto) or (@idProduto = 0))
		and   ((np.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (((@selecaoMultipla = 1) and  (np.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((np.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (np.idProdutoClassificacao is null))
		and   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
	
	--Ajustes de estoque
	INSERT INTO @ItensEntradaSaida
		select 
			ea.idProduto, 
			ea.idProdutoClassificacao,
			(case when ea.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when ea.idProdutoClassificacao 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),
			ea.unitario, 
			(case when ea.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when ea.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom,'')),
			upper(coalesce(ea.unidadeMedida, '')),
			(case when pr.ucom <> ea.unidadeMedida then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = ea.idProduto) and (pu.unidadeMedida = ea.unidadeMedida)) else 0 end) as fatorConversao,
			(case when
				(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				ea.qtd * -1
				else
				ea.qtd end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ecp.idConta, 
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = ea.idProdutoClassificacao
		left join notafiscal nf on nf.id = ea.idNotaFiscal
		where (cast(ea.data as date) <= @data)
		and   (ea.idEmitente = @idEmitente)
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (((@selecaoMultipla = 1) and  (ea.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((ea.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (ea.idProdutoClassificacao is null))
		and   (pr.idnControlaEstoque = 1)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((ea.idNotaFiscal is null) or (nf.nfeCstat = 100 or nf.nfeCstat = 150))
		
	--Produtos alocados nas ordens de serviço
	INSERT INTO @ItensEntradaSaida
		select 
			osp.idProduto, 
			osp.idProdutoClassificacao,
			(case when osp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when osp.idProdutoClassificacao 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),
			osp.precoUnitario, 
			(case when osp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when osp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(osp.ucom, '')),
			(case when pr.ucom <> osp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = osp.idProduto) and (pu.unidadeMedida = osp.ucom)) else 0 end) as fatorConversao,
			(case when 
				(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				osp.quantidade * -1 else osp.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = osp.idProdutoClassificacao
		where ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		and   (os.idEmitente = @idEmitente)
		and   ((osp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((osp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (((@selecaoMultipla = 1) and  (osp.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((osp.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (osp.idProdutoClassificacao is null))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((os.idnCancelada = 0) or (os.idnCancelada is null))

	--Pedidos
	INSERT INTO @ItensEntradaSaida
		select
		pp.idProduto,
		pp.idProdutoClassificacao,
		(case when pp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when pp.idProdutoClassificacao 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),
		pp.vuncom, 
		(case when pp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when pp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = pp.idProduto) and (pu.unidadeMedida = pp.ucom)) else 0 end) as fatorConversao,
		(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(pp.qcom - coalesce(pp.qtdFaturada, 0)) * -1
			else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = pp.idProdutoClassificacao
		where (cast(pe.dataPedido as date) <= @data)
		--and   (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado))))
		and   ((@idnConsiderarPedidosFaturadosNoEstoque = 1) or (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado)))))
		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   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((pp.idnCancelado is null) or (pp.idnCancelado = 0))
		and   (((@selecaoMultipla = 1) and  (pp.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((pp.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (pp.idProdutoClassificacao is null))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))

		
	--Condicional
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      (cp.qcom - (coalesce(cp.qtdDevolucao, 0) + coalesce(cp.qtdFaturada, 0))) * -1
		      else (cp.qcom - (coalesce(cp.qtdDevolucao, 0) + coalesce(cp.qtdFaturada, 0))) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao
		where (cast(co.dataEmissao as date) <= @data)
		and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (((@selecaoMultipla = 1) and  (cp.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((cp.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (cp.idProdutoClassificacao is null))		
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))


	--Consignacao (Só existe entrada no caso da consignação
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao 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),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      cp.qcom * -1
		      else cp.qcom end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao
		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
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao
		where (cast(co.data as date) <= @data)
		--and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (((@selecaoMultipla = 1) and  (cp.idProduto in (select idProduto from @Produtos))) or (@selecaoMultipla = 0))
		and   (((@selecaoMultipla = 1) and  ((cp.idProdutoClassificacao in (select idProdutoClassificacao from @Produtos))) or (@selecaoMultipla = 0)) or (cp.idProdutoClassificacao is null))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		
	
	--Adiciona os Produtos sem Movimentacao, quando o parametro @idnRetornarTodosProdutos for 1
	INSERT INTO @ItensEntradaSaida
	SELECT p.idProduto, p.idProdutoClassificacao,
	(case when p.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
	(case when p.idProdutoClassificacao 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),
	0 as preco, 
	(case when p.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
	(case when p.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
	upper(coalesce(pr.ucom, '')),
	upper(coalesce(pr.ucom, '')),
	0 as fatorConversao,
	0 as qtd,
	0 as idOperacao,
	'=',
	ec.id,
	ec.descricao
	FROM @Produtos p
	inner join produto pr on pr.id = p.idProduto
	left join ProdutoClassificacao pc on pc.id = p.idProdutoClassificacao
	inner join EstoqueConta ec on ec.id = @idConta
	WHERE (@idnRetornarTodosProdutos = 1)
	and ((not exists (select null from @ItensEntradaSaida ies where p.idProduto = ies.idProduto)) or (p.idProdutoClassificacao is not null))
	and (not exists (select null from @ItensEntradaSaida ies where p.idProdutoClassificacao = ies.idProdutoClassificacao))
	
	
	--atualiza a qtd dos produtos com unidade de medida diferente da definida no cadastro e efetua a convers?o conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao												
	WHERE (unidadeMedidaConvertida <> '')
	and   (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		select ies.idProduto, 
			   ies.idProdutoClassificacao, 
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProdutoClasse,
			   ies.precoCadastro,
			   ies.precoEntradaCadastro,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idConta,
			   ies.dscConta,			   
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente,ies.idProduto, ies.idProdutoClassificacao, @data)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProduto(@idEmitente,ies.idProduto, ies.idProdutoClassificacao)) as custoCalculado,
			   pr.refFabrica,
			   (select top 1 coalesce(valorMinimo, 0) from PrecoProduto(@idEmitente,ies.idProduto, ies.idProdutoClassificacao, @data))
		from @ItensEntradaSaida ies
		inner join produto pr on pr.id = ies.idProduto
		left join produtoGrupo pg on pg.id = pr.idGrupo
		WHERE ((pr.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
	    group by ies.idProduto, ies.idProdutoClassificacao, ies.dscProduto, ies.unidadeMedida, ies.codigoProdutoClasse, ies.precoCadastro, ies.precoEntradaCadastro, pr.idGrupo, pg.descricao, ies.idConta, ies.dscConta, pr.refFabrica	    	    			
	
	/*select * from @Resultado r
	where (((r.qtd > 0) and (@idnMostrarProdutosQtdNegativa = 0)) or (@idnMostrarProdutosQtdNegativa = 1))*/
	RETURN 
END
GO
ALTER PROCEDURE [dbo].[TRYNFE_ATUALIZA_STATUS_SERVIDOR]
AS
BEGIN
	SET NOCOUNT ON;
	
	UPDATE configuracaoNovo SET valor = (SELECT GETDATE()) WHERE nomeParametro = 'dataUltimaVerificacaoServidor';
END
GO
ALTER PROCEDURE [dbo].[TRYNFE_VERIFICA_SERVIDOR] 
AS
BEGIN
	SET NOCOUNT ON;
	
	DECLARE @Resultado TABLE
	(
		tempoUltimaConsulta INT
	)
		INSERT INTO @Resultado
						SELECT DATEDIFF(minute, (SELECT COALESCE(valor, (SELECT GETDATE())) FROM ConfiguracoesValorParametro('dataUltimaVerificacaoServidor')), (SELECT GETDATE()))
						
			SELECT * FROM @Resultado
END
GO

ALTER PROCEDURE [dbo].[TRYNFE_ATUALIZA_CANCELAMENTO] 
(
	@nota_id integer,
    @cstat integer,
    @dhrecbto datetime,
    @nprot varchar(60),
    @motivo varchar(1000) = null,
    @xmlPedido varchar(MAX) = null,
    @xmlRetorno varchar(MAX) = null,
	@nfeacao integer
)	
AS
BEGIN 
  DECLARE @idn_cancelada bit;
  set @idn_cancelada = 0;

  if (@nprot is not null) 
    set @idn_cancelada = 1;

  if (@motivo is not null)
  begin
	UPDATE notafiscal SET
		nfeMotivo = @motivo,
		idnCancelada = @idn_cancelada,
		nfeAcao = 10
	WHERE id = @nota_id;
  end

  if (@dhrecbto is not null)
  begin
    UPDATE notafiscal SET
        nfeDhRecbto = @dhrecbto
    WHERE id = @nota_id;
  end

  if ((@nprot is not null) and (@nprot != ''))
  begin
    UPDATE notafiscal SET
        nfeProtCancelamento = @nprot
    WHERE id = @nota_id;
  end

  if ((@cstat is not null) and (@cstat != ''))
  begin
    UPDATE notafiscal SET
        nfeCstat = @cstat
    WHERE id = @nota_id;
  end
  
  if ((@xmlPedido is not null) and (@xmlPedido  != ''))
  begin
	UPDATE notafiscal SET
		xmlPedidoCancelamento = @xmlPedido
	WHERE id = @nota_id;
  end
  
  if ((@xmlRetorno is not null) and (@xmlRetorno != ''))
  begin
	UPDATE notafiscal SET
		xmlRetornoCancelamento = @xmlRetorno
	WHERE id = @nota_id;
  end
  
  if ((@nfeacao is not null) and (@nfeacao != ''))
  begin
    UPDATE notafiscal SET
        nfeAcao = @nfeacao
    WHERE id = @nota_id;
  end
END
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),
			precoMinimo decimal(18,4)
		)

		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,
			   (select top 1 coalesce(valorMinimo, 0) from PrecoProduto(@idEmitente, p.idProduto, p.idProdutoClasse, null))
		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))
		(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))
	
	
		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
END
GO
CREATE FUNCTION [dbo].[ConfiguracoesValorParametro]
(	
	@nomeParametro varchar(100)
)
RETURNS TABLE 
AS
RETURN 
(
	SELECT valor FROM configuracaoNovo
	WHERE nomeParametro = @nomeParametro
)
GO
CREATE TRIGGER [dbo].[TGR_CONFIGURACOES_AU]
   ON  [dbo].[configuracoes]
   AFTER UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	SELECT *
	INTO #Inserted
	FROM inserted;

	declare @modifiedColumnsList NVARCHAR(4000),
	@TABLE_NAME varchar(100),
	@Pos int,
	@ColumnListItem NVARCHAR(500),
	@sqlInserted nvarchar(1000),
	@sql nvarchar(MAX),
	@newValue nvarchar(MAX),
	@RecordPk VARCHAR(50) ,
    @RecordPkName VARCHAR(50)

	SET @TABLE_NAME = 'configuracoes'
	SET @modifiedColumnsList = STUFF(( SELECT   ',' + name
                                   FROM  sys.columns
                                   WHERE object_id = OBJECT_ID (@TABLE_NAME)
                                         AND SUBSTRING(COLUMNS_UPDATED(),
                                                          ( ( column_id
                                                          - 1 ) / 8 + 1 ),
                                                          1) & ( POWER(2,
                                                          ( ( column_id
                                                          - 1 ) % 8 + 1 )
                                                          - 1) ) = POWER(2,
                                                          ( column_id - 1 )
                                                          % 8)
									FOR
									XML PATH('')
                                 ), 1, 1, '');

	WHILE LEN(@modifiedColumnsList) > 0
	BEGIN
		SET @Pos = CHARINDEX(',', @modifiedColumnsList);
		IF @Pos = 0
			BEGIN
				SET @ColumnListItem = @modifiedColumnsList
			END;
		ELSE
			BEGIN
				SET @ColumnListItem = SUBSTRING(@modifiedColumnsList, 1, @Pos - 1);
			END;
		
		set @sqlInserted = N'SELECT @newValueOut=' + @ColumnListItem
            + ' FROM #Inserted';
			
		EXEC sp_executesql @sqlInserted, N'@newValueOut varchar(MAX) output', @newValueOut = @newValue output;
		
		IF @newValue is not null
			set @sql = N'UPDATE configuracaoNovo SET valor = ' + QUOTENAME(@newValue, '''') + ' WHERE nomeParametro = ' + QUOTENAME(@ColumnListItem, '''')
		ELSE
			set @sql = N'UPDATE configuracaoNovo SET valor = null WHERE nomeParametro = ' + QUOTENAME(@ColumnListItem, '''')

		EXEC (@sql)
		
		IF @Pos = 0
            BEGIN
                SET @modifiedColumnsList = '';
            END;
        ELSE
            BEGIN
           -- start substring at the character after the first comma
                SET @modifiedColumnsList = SUBSTRING(@modifiedColumnsList,
                                                     @Pos + 1,
                                                     LEN(@modifiedColumnsList)
                                                     - @Pos);
            END;
	END
	
	UPDATE configuracaoNovo SET valor = 'false' WHERE tipoValor = 'bool' and valor = '0'
	UPDATE configuracaoNovo SET valor = 'true' WHERE tipoValor = 'bool' and valor = '1'
END
GO
CREATE TRIGGER [dbo].[TGR_CONTATOS_AD]
   ON  Contatos
   AFTER DELETE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    DECLARE @ID int

	SELECT @ID = id from deleted

	INSERT INTO RegistrosRemovidos([idRegistroExcluido],[indTipoRegistro],[dataExclusao]) VALUES (@ID, 'Contatos', GETDATE())

END
GO
CREATE TRIGGER [dbo].[TGR_CONTATOS_AU]
   ON  Contatos
   AFTER INSERT,UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    DECLARE @ID int

	SELECT @ID = id from inserted

	UPDATE Contatos SET dataUltimaAlteracao = GETDATE()
	WHERE id = @ID

END
GO
ALTER TABLE [dbo].[OrdemCargaPedidosConclusaoEntrega] ADD CONSTRAINT [FK_OrdemCargaPedidosConclusaoEntrega_OrdemCargaPedidos] FOREIGN KEY
	(
		[idOrdemCargaPedidos]
	)
	REFERENCES [dbo].[OrdemCargaPedidos]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaCarregamentoNovo] ADD CONSTRAINT [FK_OrdemCargaConferenciaCarregamentoNovo_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaCarregamentoNovo] ADD CONSTRAINT [FK_OrdemCargaConferenciaCarregamentoNovo_OrdemCargaPedidos] FOREIGN KEY
	(
		[idOrdemCargaPedido]
	)
	REFERENCES [dbo].[OrdemCargaPedidos]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaCarregamentoNovo] ADD CONSTRAINT [FK_OrdemCargaConferenciaCarregamentoNovo_produto] FOREIGN KEY
	(
		[idProdutoErroCarregamento]
	)
	REFERENCES [dbo].[produto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaQualidade] ADD CONSTRAINT [FK_OrdemCargaConferenciaQualidade_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaQualidade] ADD CONSTRAINT [FK_OrdemCargaConferenciaQualidade_OrdemCargaPedidos] FOREIGN KEY
	(
		[idOrdemCargaPedido]
	)
	REFERENCES [dbo].[OrdemCargaPedidos]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemCargaConferenciaQualidade] ADD CONSTRAINT [FK_OrdemCargaConferenciaQualidade_produto] FOREIGN KEY
	(
		[idProdutoErroQualidade]
	)
	REFERENCES [dbo].[produto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[Contatos] ADD CONSTRAINT [FK_Contatos_parceiroVendedorApp] FOREIGN KEY
	(
		[idVendedorApp]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[Contatos] ADD CONSTRAINT [FK_Contatos_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemCargaPedidos] ADD CONSTRAINT [FK_OrdemCargaPedidos_operacaoMDFe] FOREIGN KEY
	(
		[idOperacaoFaturarMDFe]
	)
	REFERENCES [dbo].[operacao]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[AgendaCompromissos] ADD CONSTRAINT [FK_AgendaCompromissos_parceiroUsuarioApp] FOREIGN KEY
	(
		[idUsuarioApp]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemCargaPedidos] ADD CONSTRAINT [FK_OrdemCargaPedidos_notafiscalMDFe] FOREIGN KEY
	(
		[idNotaFiscalMDFe]
	)
	REFERENCES [dbo].[notafiscal]
	(
		[id]
	)
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[OBTER_NUMERO_BOLINHA]
	-- Add the parameters for the stored procedure here
	@numeroPedidos int
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	declare @ultimoNumero int = 0


	SET @ultimoNumero = (select coalesce(bolinhaOrdemCarga, 0) from configuracoes);

	if (@ultimoNumero = 600) 
	BEGIN
	update configuracoes set bolinhaOrdemCarga = 1
	SET @ultimoNumero = 1;
	END
	ELSE
	if ((@ultimoNumero + @numeroPedidos) >= 600)
	BEGIN	
	update configuracoes set bolinhaOrdemCarga = 1
	SET @ultimoNumero = @ultimoNumero + 1;
	end
	else
	begin
	update configuracoes set bolinhaOrdemCarga = (@ultimoNumero + @numeroPedidos)
	SET @ultimoNumero = @ultimoNumero + 1;
	END

	select @ultimoNumero;
END
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[SP_ConfiguracoesValorParametroNovo]
	@nomeParametro nvarchar(100)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
declare @qtdRegistros int = 0;

SET @qtdRegistros = (select count(nomeParametro) from configuracaoNovo);
declare @Resultado TABLE
(
	valor varchar(max)
)
if (@qtdRegistros > 0)
BEGIN
	INSERT into @Resultado
	SELECT valor FROM configuracaoNovo
	WHERE nomeParametro = @nomeParametro
END
ELSE
BEGIN

declare @sql nvarchar(500) = 'SELECT ' + @nomeParametro + ' FROM configuracoes';
declare @retorno varchar(max);
exec @retorno = sp_executesql @sql;

INSERT into @Resultado(valor) values (@retorno)
END

	
	select * from @Resultado
END
GO
CREATE PROCEDURE [dbo].[CONFIGURACOES_ATUALIZAR_VALOR_PARAMETRO]
	@nomeParametro varchar(80), 
	@valor varchar(MAX)
AS
BEGIN
	SET NOCOUNT ON;

    UPDATE configuracaoNovo SET valor = @valor WHERE nomeParametro = @nomeParametro
END
GO
UPDATE configuracoes SET versaoMinimaAppPedidos = '12'
GO
INSERT INTO configuracaoNovo
SELECT
    c.name 'Column Name',
'',
'',
    t.Name 'Data type',
null, null, null, null, null, null, null, null, null, null, null, null
FROM    
    sys.columns c
INNER JOIN
    sys.types t ON c.user_type_id = t.user_type_id
WHERE
    c.object_id = OBJECT_ID('configuracoes') and c.name <> 'id'


declare @nomeColuna varchar(100);
declare @valorObtidoColuna varchar(MAX);

DECLARE configuracao CURSOR FOR
SELECT nomeParametro from configuracaoNovo;

OPEN configuracao;
FETCH NEXT FROM configuracao into @nomeColuna;

declare @query nvarchar(MAX);
declare @querySelect nvarchar(MAX);


while (@@FETCH_STATUS =0)
BEGIN
SET @querySelect = '(select ' + REPLACE(@nomeColuna,'''','') + ' from dbo.configuracoes)';
SET @query = 'update configuracaoNovo SET valor = ' + @querySelect + ' where nomeParametro = ''' + @nomeColuna + '''';

EXEC sp_executeSQL @query

FETCH NEXT from configuracao INTO @nomeColuna
END

CLOSE configuracao
DEALLOCATE configuracao
GO
UPDATE configuracaoNovo SET tipoValor = 'bool' WHERE tipoValor = 'bit'
UPDATE configuracaoNovo SET valor = 'false' WHERE tipoValor = 'bool' and valor = '0'
UPDATE configuracaoNovo SET valor = 'true' WHERE tipoValor = 'bool' and valor = '1'
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor]) VALUES ('idnExecutadoVerificacaoConfigNovo', '', '', 'bool', 'False')
GO
INSERT [dbo].[PedidoOperacoesStatus] ([identificador], [idOperacao], [idCustomizacao], [descricao], [exibirMonitoramento], [ordemMonitoramento]) VALUES (N'AGUARDANDO_CQ', NULL, NULL, N'Aguardando Controle de Qualidade', 1, 4)
GO
update PedidoOperacoesStatus set ordemMonitoramento = 3 where identificador = 'AGUARDANDO_CARREGAMENTO'
update PedidoOperacoesStatus set ordemMonitoramento = 4 where identificador = 'AGUARDANDO_CQ'
update PedidoOperacoesStatus set ordemMonitoramento = 5 where identificador = 'AGUARDANDO_FATURAMENTO'
update PedidoOperacoesStatus set ordemMonitoramento = 1 where identificador = 'AGUARDANDO_NOMEACAO_VEICULO'
update PedidoOperacoesStatus set ordemMonitoramento = 2 where identificador = 'AGUARDANDO_PRODUCAO'
update PedidoOperacoesStatus set ordemMonitoramento = 7 where identificador = 'ENTREGA_CONCLUIDA'
update PedidoOperacoesStatus set ordemMonitoramento = 6 where identificador = 'LIBERADO_PARA_ENTREGA'
GO
update ordemcarga set status = 'AGUARDANDO_CARREGAMENTO' where status = 'LIBERADO_PARA_EXPEDICAO'
GO
update PedidoOperacoesStatus set exibirMonitoramento = 0 where identificador = 'LIBERADO_PARA_EXPEDICAO'
GO
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaErrosProducao] ON 
GO
INSERT [dbo].[OrdemCargaErrosProducao] ([id], [descricao]) VALUES (1, N'Material faltante')
GO
INSERT [dbo].[OrdemCargaErrosProducao] ([id], [descricao]) VALUES (2, N'Material em excesso')
GO
INSERT [dbo].[OrdemCargaErrosProducao] ([id], [descricao]) VALUES (3, N'Material errado')
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaErrosProducao] OFF
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaItemErros] ON 
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (1, N'Miscelânea')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (2, N'Stringbox')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (3, N'Módulo')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (4, N'Perfil')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (5, N'Cabo')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (6, N'Inversor')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (8, N'Autotransformador')
GO
INSERT [dbo].[OrdemCargaItemErros] ([id], [descricao]) VALUES (9, N'Vários itens - descrever')
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaItemErros] OFF
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaMotivoErroConferenciaCarregamento] ON 
GO
INSERT [dbo].[OrdemCargaMotivoErroConferenciaCarregamento] ([id], [descricao]) VALUES (1, N'Material faltante')
GO
INSERT [dbo].[OrdemCargaMotivoErroConferenciaCarregamento] ([id], [descricao]) VALUES (2, N'Material em excesso')
GO
INSERT [dbo].[OrdemCargaMotivoErroConferenciaCarregamento] ([id], [descricao]) VALUES (3, N'Material errado')
GO
SET IDENTITY_INSERT [dbo].[OrdemCargaMotivoErroConferenciaCarregamento] OFF
GO
INSERT [dbo].[OrdemCargaMotivoErroCQ] ([id], [descricao]) VALUES (1, N'Material faltante')
GO
INSERT [dbo].[OrdemCargaMotivoErroCQ] ([id], [descricao]) VALUES (2, N'Material em excesso')
GO
INSERT [dbo].[OrdemCargaMotivoErroCQ] ([id], [descricao]) VALUES (3, N'Material errado')
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(443, 701, GETDATE());
