USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[emitente] ADD 
[usuarioSystaxCockpit] [varchar] (100) COLLATE Latin1_General_CI_AS NULL,
[senhaSystaxCockpit] [varchar] (100) COLLATE Latin1_General_CI_AS NULL,
[chaveBancoSystaxCockpit] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
[idnConsideraEnderecoXMLNFSeIPM] [bit] NULL
GO
ALTER TABLE [dbo].[NFProduto] ADD 
[idnImpostosCalculadosSystax] [bit] NULL
GO
ALTER TABLE [dbo].[operacao] ADD 
[idnUtilizaSystax] [bit] NULL,
[naturezaOperacaoSystax] [varchar] (20) COLLATE Latin1_General_CI_AS NULL,
[perfilRemetenteSystax] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[parceiro] ADD 
[perfilDestinatarioSystax] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[ProdutoPreco] ALTER COLUMN [preco] [decimal] (18,10) NULL
GO
ALTER TABLE [dbo].[ProdutoPreco] ALTER COLUMN [precoMinimo] [decimal] (18,10) NULL
GO
ALTER TABLE [dbo].[veiculo] ADD 
[idProprietarioANTT] [int] NULL
GO
CREATE TABLE [dbo].[PedidoOperacaoStatusParceiro]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idParceiro] [int] NOT NULL,
	[idOperacao] [int] NOT NULL,
	[idForma] [int] NULL,
	CONSTRAINT [PK_PedidoOperacaoStatusParceiro] 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].[OperadorSessao]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idOperador] [int] NULL,
	[dataLogin] [datetime] NULL,
	[dataLogout] [datetime] NULL,
	CONSTRAINT [PK_OperadorSessao] 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].[NFProdutoSystax]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idNFProduto] [int] NOT NULL,
	[dataCalculo] [date] NULL,
	[ufOrigem] [varchar] (5) COLLATE Latin1_General_CI_AS NULL,
	[ufDestino] [varchar] (5) COLLATE Latin1_General_CI_AS NULL,
	[naturezaOperacao] [varchar] (20) COLLATE Latin1_General_CI_AS NULL,
	[perfilRemetente] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
	[perfilDestinatario] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
	[jsonRetorno] [nvarchar] (max) COLLATE Latin1_General_CI_AS NULL,
	CONSTRAINT [PK_NFProdutoSystax] 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].[EmailSaidaStatus]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[emailDestinatario] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[idnEmailEnviado] [bit] NOT NULL,
	[dataHora] [datetime] NOT NULL,
	[descricaoErro] [varchar] (max) COLLATE Latin1_General_CI_AS NULL,
	[idRegistro] [int] NULL,
	[tabelaRegistro] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	CONSTRAINT [PK_EmailEnviadoStatus] 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_EmailSaidaStatus_idRegistro_TabelaRegistro] ON [dbo].[EmailSaidaStatus]
(
	[idRegistro] ASC,
	[tabelaRegistro] 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].[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,10),
		custoCalculado decimal(18,4),
		refFabrica varchar(50),
		precoMinimo decimal(18,10)
)
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 @exibirCustoLetras bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnMostrarCustoEmLetras'))
	
	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;
	
	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarPedidosFaturadosNoEstoque'))


	
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,10),
		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	  (coalesce(pe.idnIgnorarEstoque, 0) = 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))

		
	--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
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
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,10),
	idnOferta bit,
	precoMinimo decimal(18,10)
)
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].[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),
		codigoBarras varchar(50),
		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,10),
		precoMinimo decimal(18,10),
		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(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarPedidosFaturadosNoEstoque'))


	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.codigoBarras, '') +
				coalesce(pc.codigoBarras, '') +
                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	  (coalesce(pe.idnIgnorarEstoque, 0) = 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))	

		
	--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),
			   (case when pc.codigoBarras is not null then pc.codigoBarras else pr.codigoBarras 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(valorMinimo, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as precoMinimo,
			   (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), (case when pc.codigoBarras is not null then pc.codigoBarras else pr.codigoBarras 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),
		codigoProdutoNF varchar(60),
		precoCadastro decimal(18,4), 
		precoEntradaCadastro decimal(18,4),
		idGrupo int null,
		dscGrupo varchar(100) null,
		idConta int,
		dscConta varchar(200),
		precoCalculado decimal(18,10),
		custoCalculado decimal(18,4),
		refFabrica varchar(50),
		idMarca int,
		dscMarca varchar(200),
		dscGenero 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,10)
)
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 = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnMostrarCustoEmLetras'))
	
	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;
	
	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarPedidosFaturadosNoEstoque'))


	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	  (coalesce(pe.idnIgnorarEstoque, 0) = 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))	

		
	--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,
			   (case when pr.codigoNotaFiscal != '' then pr.codigoNotaFiscal else ies.codigoProdutoClasse end),
			   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,
			   pgen.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),
			   (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
		left join ProdutoGenero pgen on pgen.id = pr.idProdutoGenero
		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, (case when pr.codigoNotaFiscal != '' then pr.codigoNotaFiscal else ies.codigoProdutoClasse end), 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, pgen.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].[comissaoVendedor2]
(
	@dataIniInf date,
	@dataFinInf date,
	@idVendedorInf int,
	@idEmitenteInf int,
	@idnconsiderarDataAberturaOSInf bit, -- Para o caso de OS onde o cliente deseja a data da abertura da OS em vez da data da fatura.
	@tipoIntervalo varchar(20), -- Servirá para considerar o intervalo definido nas metas ('Dias','Semanas','Meses')
	@idnConsiderarValoresFreteInf bit, -- Considerar valor do frete na comissão
	@idnConsiderarServicoOSInf bit
)
RETURNS
@Resultado TABLE 
(
	vendedor_id int,
	vendedor_nome varchar(60),
	valorRecebido decimal(18,4),
	percComissaoRecebimento decimal(18,4),
	valorComissaoRecebimento decimal(18,4),
	valorGeracao decimal(18,4),
	percComissaoGeracao decimal(18,4),
	valorComissaoGeracao decimal(18,4),
	valorComissaoFixaGeracao decimal(18,4),
	Fatura_id int,
	FaturaParcela_id int,
	DocumentoOrigem_id int,
	ProdutoGrupo_id int,
	codigoAgrupamento varchar(100),
	dscAgrupamento varchar(500),
	idnRecebimentoForaPeriodo bit,
	qtdeLinhas int -- campo para conseguir coletar e calcular a comissão fixa
)
AS
BEGIN

	declare @dataIni datetime = @dataIniInf
	declare @dataFin datetime = @dataFinInf
	declare @idVendedor int = @idVendedorInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idnconsiderarDataAberturaOS int = @idnconsiderarDataAberturaOSInf
	declare @idnParametroRecebimento bit;
	declare @idnConsiderarServicoOS bit = 0
	set @idnParametroRecebimento = (select top 1 case when pc.idnRecebimento = 1 then 1 else 0 end from ParametrosComissoes pc where idnRecebimento = 1)
	declare @idnConsiderarValoresFrete bit
	set @idnConsiderarValoresFrete = 0
	if(@idnConsiderarValoresFreteInf > 0)
		set @idnConsiderarValoresFrete = @idnConsiderarValoresFreteInf;
	if(@idnConsiderarServicoOSInf > 0)
		set @idnConsiderarServicoOS = @idnConsiderarServicoOSInf;

	--Condiciona caso o cliente parametrizou meta, qual será o intervalo para o calculo
	declare @Dias int;
	declare @Semanas int;
	declare @Meses int;
	declare @vendaTotalEquipe decimal(18,4);
	declare @vendaTotalVendedorSemAgrupamento decimal(18,4);

	set @Dias = DATEDIFF(d, @dataIni, @dataFin)
	set @Semanas = DATEDIFF(wk, @dataIni, @dataFin)
	set @Meses = DATEDIFF(m, @dataIni, @dataFin)

	--Condições em caso é selecionado o meses ou semanas e a quantidade de dias é inferior o resultado retornado é 0

	set @Dias = CASE WHEN @Dias > 0 then @Dias else 1 end
	set @Semanas = CASE WHEN @Semanas > 0 then @Dias else 1 end
	set @Meses = CASE WHEN @Meses > 0 then @Dias else 1 end

	--Tabela utilizada para calcular comissão fixa
	declare @LinhasVendedores TABLE
	(
		idVendedorLinhas int null,
		qtdeLinhasPVendedor int,
		valorComissaoFixaGeracao2 decimal(18,4),
		idGrupoProdutoLinhas int null,
		idVerificaExistenciaComissao int,
		qtdeLinhasAgrupadas int
	)
	declare @LinhasVendedores2 TABLE
	(
		idVerificaExistenciaComissao2 int,
		qtdeLinhasAgrupadas2 int, 
		idVendedorLinhas2 int null,
		idGrupoProdutoLinhas int default null
	)
	
	--Tabela utilizada para verificar se a meta é atingida
	declare @TotalVendasVendedores TABLE
	(
		valorTotalVendido decimal (18,4),
		idVendedor int,
		ProdutoGrupoVendas_id int
	)

	declare @TotalVendasVendedoresSemAgrupamento TABLE
	(
		valorTotalVendido decimal (18,4),
		idVendedor int
	)
	
	declare @TotalVendasAgrupamentos TABLE
	(
		valorTotalVendido decimal (18,4),
		idAgrupamentoProduto int
	)

	declare @GrupoProdutos TABLE
	(
		idProdutoGrupo int,
		idProduto int,
		codigoAgrupamento varchar(100),
		dscAgrupamento varchar(500),
		idVendedor int,
		fantasia varchar(60),
		idFatura int,
		idFaturaParcela int,
		valor decimal(18,4),
		valorParcelas decimal (18,4),
		valorFatura decimal (18,4),
		idDocumentoOrigem int,
		idnRecebimentosForaPeriodo bit -- Irá validar recebimentos que foram recebidos no periodo definido porem por vendas fora desse periodo para levatantamento de comissão de recebimento sobre grupo de produtos
		
	)
	
	declare @GrupoProdutosOS TABLE
	(
		idProdutoGrupo int,
		codigoAgrupamento varchar(100),
		dscAgrupamento varchar(500),
		idVendedor int,
		fantasia varchar(60),
		idFatura int,
		idFaturaParcela int,
		valor decimal(18,4),
		valorParcelas decimal (18,4),
		valorFatura decimal (18,4),
		idnRecebimentosForaPeriodo bit, -- Irá validar recebimentos que foram recebidos no periodo definido porem por vendas fora desse periodo para levatantamento de comissão de recebimento sobre grupo de produtos
		idnConsiderarServicoOS bit
	)

	declare @GrupoProdutosPedido TABLE
	(
		idProdutoGrupo int,
		codigoAgrupamento varchar(100),
		dscAgrupamento varchar(500),
		idVendedor int,
		fantasia varchar(60),
		idFatura int,
		idFaturaParcela int,
		valor decimal(18,4),
		valorParcelas decimal (18,4),
		valorFatura decimal (18,4),
		idnRecebimentosForaPeriodo bit -- Irá validar recebimentos que foram recebidos no periodo definido porem por vendas fora desse periodo para levatantamento de comissão de recebimento sobre grupo de produtos
	)
	BEGIN
		-- Vendas para Geração por Grupo do Produto
		INSERT INTO @GrupoProdutos
		select pr.idGrupo, nfp.idProduto, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id,
		(nfp.vprod + (case when @idnConsiderarValoresFrete = 1 then coalesce(nfp.vfrete, 0) else 0 end) + coalesce(nfp.vseg, 0) + coalesce(nfp.voutro, 0) + coalesce(nfp.ipivalor, 0) + coalesce(nfp.icmsstvalor, 0) - coalesce(nfp.vdesc, 0)) as valor, 
		fp.valor, f.valor, case when pf.idNotaFiscal = nf.id then pf.idPedido when osf.idNotaFiscal = nf.id then osf.idOrdemServico else null end, 0
		from NFProduto nfp
		inner join produto pr on pr.id = nfp.idProduto
		inner join nfemitente nfe on nfe.idnotafiscal = nfp.idNotaFiscal
		left join produtoGrupo pg on pr.idGrupo = pg.id
		inner join notafiscal nf on nf.id = nfp.idNotaFiscal
		inner join Fatura f on f.idNotaFiscal = nf.id
		inner join FaturaParcela fp on fp.idFatura = f.id
		left join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
		left join parceiro pa on pa.id = f.idVendedor
		left join pedidoFaturado pf on pf.idNotaFiscal = nf.id
		left join OrdemServicoFaturada osf on osf.idNotaFiscal = nf.id
		where (CAST(f.dataFatura as date) between @dataIni and @dataFin)
		and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
		and (nf.nfeCstat = 100 or nf.nfeCstat = 150)
		and (nf.nfeTpAmb = 1)
		and ((nfe.idEmitente = @idEmitente) or (@idEmitente = 0))
		and (f.idnReceitaDespesa = '+')

		if(@idnParametroRecebimento = 1)
			BEGIN
				-- Recebimentos para Geração por Grupo do Produto onde as vendas foram feitas fora do periodo definido
				INSERT INTO @GrupoProdutos
				select pr.idGrupo, nfp.idProduto, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id,
				(nfp.vprod + (case when @idnConsiderarValoresFrete = 1 then coalesce(nfp.vfrete, 0) else 0 end) + coalesce(nfp.vseg, 0) + coalesce(nfp.voutro, 0) + coalesce(nfp.ipivalor, 0) + coalesce(nfp.icmsstvalor, 0) - coalesce(nfp.vdesc, 0)) as valor, 
				fp.valor, f.valor, case when pf.idNotaFiscal = nf.id then pf.idPedido when osf.idNotaFiscal = nf.id then osf.idOrdemServico else null end, 1
				from NFProduto nfp
				inner join produto pr on pr.id = nfp.idProduto
				inner join nfemitente nfe on nfe.idnotafiscal = nfp.idNotaFiscal
				left join produtoGrupo pg on pr.idGrupo = pg.id
				inner join notafiscal nf on nf.id = nfp.idNotaFiscal
				inner join Fatura f on f.idNotaFiscal = nf.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join CaixaMovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				left join pedidoFaturado pf on pf.idNotaFiscal = nf.id
				left join OrdemServicoFaturada osf on osf.idNotaFiscal = nf.id
				where(CAST(cm.dataHora as date) between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and (nf.nfeCstat = 100 or nf.nfeCstat = 150)
				and (nf.nfeTpAmb = 1)
				and ((nfe.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and (fp.id not in(select gp.idFaturaParcela from @GrupoProdutos gp))
				
			END		
		-- Ordem Serviços para Geração por Grupo do Produto
		INSERT INTO @GrupoProdutosOS
		select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(osp.total,0) as valor, fp.valor, f.valor, 0, 0
		from OrdemServicoProduto osp
		inner join produto pr on pr.id = osp.idProduto
		inner join ordemservico os on os.id = osp.idOrdemServico
		left join produtoGrupo pg on pr.idGrupo = pg.id
		inner join Fatura f on f.idOrdemServico = os.id
		inner join FaturaParcela fp on fp.idFatura = f.id
		left join parceiro pa on pa.id = f.idVendedor
		where ((@idnconsiderarDataAberturaOS = 0 and (CAST(f.dataFatura as date))  between @dataIni and @dataFin) or (@idnconsiderarDataAberturaOS = 1 and (Cast(os.dataHora as date)) between @dataIni and @dataFin))
		and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
		and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
		and (f.idnReceitaDespesa = '+')
		and ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
		and ((os.idnCancelada != 1) or (os.idnCancelada is null))
		if(@idnParametroRecebimento = 1)
			BEGIN
				-- Recebimentos de OS fora do periodo da Emissão para Geração de comissão de recebimento por Grupo do Produto
				INSERT INTO @GrupoProdutosOS
				select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(osp.total,0) as valor, fp.valor, f.valor, 1, 0
				from OrdemServicoProduto osp
				inner join produto pr on pr.id = osp.idProduto
				inner join ordemservico os on os.id = osp.idOrdemServico
				left join produtoGrupo pg on pr.idGrupo = pg.id
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where (CAST(cm.dataHora as date)  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and (fp.id not in (select gpos.idFaturaParcela from @GrupoProdutosOS gpos))
			END
		if(@idnConsiderarServicoOS = 1)
			BEGIN
				INSERT INTO @GrupoProdutosOS
				select null, null, null, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(oss.total,0) as valor, fp.valor, f.valor, 0, 1
				from OrdemServicoServico oss
				inner join ordemservico os on os.id = oss.idOrdemServico
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				left join parceiro pa on pa.id = f.idVendedor
				where ((@idnconsiderarDataAberturaOS = 0 and (CAST(f.dataFatura as date))  between @dataIni and @dataFin) or (@idnconsiderarDataAberturaOS = 1 and (Cast(os.dataHora as date)) between @dataIni and @dataFin))
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				and ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and ((os.idnCancelada != 1) or (os.idnCancelada is null))
			END
		if(@idnConsiderarServicoOS = 1 and @idnParametroRecebimento = 1)
			BEGIN
				INSERT INTO @GrupoProdutosOS
				select null, null, null, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(oss.total,0) as valor, fp.valor, f.valor, 1, 1
				from OrdemServicoServico oss
				inner join ordemservico os on os.id = oss.idOrdemServico
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where (CAST(cm.dataHora as date)  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and (fp.id not in (select gpos.idFaturaParcela from @GrupoProdutosOS gpos))
			END

		-- Pedidos para Geração por Grupo do Produto
		INSERT INTO @GrupoProdutosPedido
		select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(pp.vprod,0) as valor, fp.valor, f.valor, 0
		from pedidoProduto pp
		inner join produto pr on pr.id = pp.idProduto
		inner join pedido p on p.id = pp.idPedido
		left join produtoGrupo pg on pr.idGrupo = pg.id
		inner join Fatura f on f.idPedido = p.id
		inner join FaturaParcela fp on fp.idFatura = f.id
		left join parceiro pa on pa.id = f.idVendedor
		where ((CAST(f.dataFatura as date))  between @dataIni and @dataFin)
		and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
		and ((p.idEmitente = @idEmitente) or (@idEmitente = 0))
		and (f.idnReceitaDespesa = '+')
		and (p.idnFaturado = 1) 
		and ((p.idnCancelado != 1) or (p.idnCancelado is null))
		if(@idnParametroRecebimento = 1)
			BEGIN
				-- Recebimentos de Pedidos para Geração por Grupo do Produto de recebimento
				INSERT INTO @GrupoProdutosPedido
				select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(pp.vprod,0) as valor, fp.valor, f.valor, 1
				from pedidoProduto pp
				inner join produto pr on pr.id = pp.idProduto
				inner join pedido p on p.id = pp.idPedido
				left join produtoGrupo pg on pr.idGrupo = pg.id
				inner join Fatura f on f.idPedido = p.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where ((CAST(cm.dataHora as date))  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((p.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and ((p.idnFaturado = 1) and (p.idnCancelado != 1))
				and (fp.id not in (select gpp.idfaturaparcela from @GrupoProdutosPedido gpp))
			END

		-- Adicionando Informações na tabela
		INSERT INTO @Resultado
		select gp.idVendedor, pa.fantasia, 0, 0, 0,
		(gp.valorParcelas / gp.valorFatura * gp.valor), -- Calculo p/ definir a % do valor em relação a fatura parcela levando em consideração que uma parcela no recebimento possa se enquadrar ou não na relação
		0, 0, 0, gp.idFatura, gp.idFaturaParcela, gp.idDocumentoOrigem, gp.idProdutoGrupo, gp.codigoAgrupamento, gp.dscAgrupamento, idnRecebimentosForaPeriodo, 
		ROW_NUMBER() OVER(ORDER BY gp.idVendedor ASC)
		from @GrupoProdutos gp
		left join parceiro pa on pa.id = gp.idVendedor

		-- Adicioando informações de OS
		INSERT INTO @Resultado
		select gp.idVendedor, pa.fantasia, 0, 0, 0,
		(gp.valorParcelas / gp.valorFatura * gp.valor), -- Calculo p/ definir a % do valor em relação a fatura parcela levando em consideração que uma parcela no recebimento possa se enquadrar ou não na relação
		0, 0, 0, gp.idFatura, gp.idFaturaParcela, null, gp.idProdutoGrupo, gp.codigoAgrupamento, gp.dscAgrupamento, idnRecebimentosForaPeriodo, 
		ROW_NUMBER() OVER(ORDER BY gp.idVendedor ASC)
		from @GrupoProdutosOS gp
		left join parceiro pa on pa.id = gp.idVendedor

		-- Adicionando Pedidos
		INSERT INTO @Resultado
		select gp.idVendedor, pa.fantasia, 0, 0, 0,
		(gp.valorParcelas / gp.valorFatura * gp.valor), -- Calculo p/ definir a % do valor em relação a fatura parcela levando em consideração que uma parcela no recebimento possa se enquadrar ou não na relação 
		0, 0, 0, gp.idFatura, gp.idFaturaParcela, null, gp.idProdutoGrupo, gp.codigoAgrupamento, gp.dscAgrupamento, idnRecebimentosForaPeriodo, 
		ROW_NUMBER() OVER(ORDER BY gp.idVendedor ASC)
		from @GrupoProdutosPedido gp
		left join parceiro pa on pa.id = gp.idVendedor

		-- Adicionando Comissão da Geração fatura avulsa
		INSERT INTO @Resultado
		select f.idVendedor, pa.fantasia, 0, 0, 0,fp.valor,
		0, 0, 0, f.id, fp.id, null, null, null, null, 0, ROW_NUMBER() OVER(ORDER BY f.idVendedor ASC)
		from Fatura f
		left join parceiro pa on pa.id = f.idVendedor
		inner join FaturaParcela fp on fp.idFatura = f.id
		where CAST(f.dataFatura as date) between @dataIni and @dataFin
		and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
		and (f.idnReceitaDespesa = '+')
		and ((f.idEmitente = @idEmitente) or (@idEmitente = 0))
		and ((select count(*) from FaturaParcela fp where fp.idFatura = f.id and coalesce(fp.idnBaixado, 0) = 0) > 0) --ignora as parcelas baixadas
		and (fp.id not in (select idFatura from @GrupoProdutos)) --ignora os códigos das Faturas que já foram incluídas pelas vendas (Para não duplicar)
		and ((f.idNotaFiscal is null) and (f.idOrdemServico is null) and (f.idPedido is null))
		
		-- Registrando os valores recebidos referente as vendas realizadas
		Update @Resultado set valorRecebido = valorGeracao from FaturaParcela fp
		inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
		inner join CaixaMovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
		where CAST(cm.dataHora as date) between @dataIni and @dataFin
		and ((fp.idnQuitada = 1) AND (fp.id = FaturaParcela_id))
		and ((fp.idnBaixado is null) or (fp.idnBaixado != 1))
		--Valida a quantidade do saldo pois quando liquidado parcial, se tirar relatorio retroativo puxa também na liquidação parcial
		and (fpp.saldoCapitalAnterior = valorCapital)
		
		--INICIO DOS CALCULOS
		--Coleta valor da Soma total para verificar qual meta foi atingida com base na opção selecionada
		Insert into @TotalVendasVendedores select CASE @tipoIntervalo WHEN 'Dias' then sum(valorGeracao)/@Dias
													 WHEN 'Semanas' then sum(valorGeracao)/@Semanas
													 WHEN 'Meses' then sum(valorGeracao)/@Meses
													 ELSE 0 END, vendedor_id, ProdutoGrupo_id from @Resultado group by vendedor_id, ProdutoGrupo_id
													 

		set @vendaTotalEquipe = (select CASE @tipoIntervalo WHEN 'Dias' then sum(valorGeracao)/@Dias
													 WHEN 'Semanas' then sum(valorGeracao)/@Semanas
													 WHEN 'Meses' then sum(valorGeracao)/@Meses
													 ELSE 0 END from @Resultado)

		insert into @TotalVendasVendedoresSemAgrupamento select CASE @tipoIntervalo WHEN 'Dias' then sum(valorGeracao)/@Dias
													 WHEN 'Semanas' then sum(valorGeracao)/@Semanas
													 WHEN 'Meses' then sum(valorGeracao)/@Meses
													 ELSE 0 END, vendedor_id from @Resultado group by vendedor_id

		insert into @TotalVendasAgrupamentos select CASE @tipoIntervalo WHEN 'Dias' then sum(valorGeracao)/@Dias
													 WHEN 'Semanas' then sum(valorGeracao)/@Semanas
													 WHEN 'Meses' then sum(valorGeracao)/@Meses
													 ELSE 0 END, ProdutoGrupo_id from @Resultado group by ProdutoGrupo_id
		INSERT into @LinhasVendedores 
		select vendedor_id, count(qtdeLinhas), 0, ProdutoGrupo_id, 0, 0 from @Resultado group by vendedor_id, ProdutoGrupo_id

		--Altera o Percentual de Comissão quando possuir Vendedor e Agrupamento definidos nos parametros
		UPDATE @Resultado set percComissaoGeracao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc 
		inner join @TotalVendasVendedores tvv on tvv.idVendedor = pc.idVendedor
		where (tvv.valorTotalVendido between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = ProdutoGrupo_id) and (tvv.ProdutoGrupoVendas_id = ProdutoGrupo_id)), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where (pc.idnComissaoFaturas = 1) and (pc.idnRecebimento = 1) and (pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = ProdutoGrupo_id)), 0)

		--Altera o Percentual de Comissão quando possuir Vendedor mas NÃO possuir Agrupamento definido nos parametros
		UPDATE @Resultado set percComissaoGeracao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc 
		inner join @TotalVendasVendedores tvv on tvv.idVendedor = pc.idVendedor
		where ((tvv.valorTotalVendido between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor = vendedor_id) and (pc.idGrupoProduto is null))), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where ((pc.idnComissaoFaturas = 1) and (pc.idnRecebimento = 1) and (pc.idVendedor = vendedor_id) and (pc.idGrupoProduto is null))), 0)
		where ((percComissaoGeracao = 0) and (percComissaoRecebimento = 0))

		--Altera o Percentual de Comissão quando NÃO possuir Vendedor mas possuir Agrupamento definido nos parametros
		UPDATE @Resultado set percComissaoGeracao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc
		inner join @TotalVendasAgrupamentos tva on tva.idAgrupamentoProduto = pc.idGrupoProduto
		where ((tva.valorTotalVendido between pc.valorMetaMinima and pc.valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor is null) and (pc.idGrupoProduto = ProdutoGrupo_id))), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where (pc.idnComissaoFaturas = 1) and (pc.idnRecebimento = 1) and (pc.idVendedor is null) and (pc.idGrupoProduto = ProdutoGrupo_id)), 0)
		where ((percComissaoGeracao = 0) and (percComissaoRecebimento = 0))

		--Altera o Percentual de Comissão quando NÃO possuir Vendedor e nem Agrupamento definidos nos parametros
		UPDATE @Resultado set percComissaoGeracao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc 
		where (@vendaTotalEquipe between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor is null) and (pc.idGrupoProduto is null)), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where (pc.idnComissaoFaturas = 1) and (pc.idnRecebimento = 1) and (pc.idVendedor is null) and (pc.idGrupoProduto is null)), 0)
		where ((percComissaoGeracao = 0) and (percComissaoRecebimento = 0))
		
		--Altera o valor da Comissão
		UPDATE @Resultado set valorComissaoGeracao = (valorGeracao * percComissaoGeracao) / 100,
		valorComissaoRecebimento = (valorRecebido * percComissaoRecebimento) / 100;

		--Coleta o valor de comissão fixa em cada vendedor passando para todos os produtos o valor total da comissão fixa em cada condição
		--COM vendedor e COM agrupamento
		UPDATE @Resultado set valorComissaoFixaGeracao = coalesce((select top 1 pc.valorComissaoFixa from ParametrosComissoes pc 
		inner join @TotalVendasVendedores tvv on tvv.idVendedor = pc.idVendedor
		where (tvv.valorTotalVendido between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = ProdutoGrupo_id)), 0)
		
		--COM vendedor SEM agrupamento
		UPDATE @Resultado set valorComissaoFixaGeracao = coalesce((select top 1 pc.valorComissaoFixa from ParametrosComissoes pc 
		inner join @TotalVendasVendedoresSemAgrupamento tvv on tvv.idVendedor = pc.idVendedor
		where ((tvv.valorTotalVendido between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor = vendedor_id) and (pc.idGrupoProduto is null))), 0)
		where (valorComissaoFixaGeracao = 0)
		
		--SEM vendedor e COM agrupamento
		UPDATE @Resultado set valorComissaoFixaGeracao = coalesce((select top 1 pc.valorComissaoFixa from ParametrosComissoes pc
		where (@vendaTotalEquipe between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor is null) and (pc.idGrupoProduto = ProdutoGrupo_id)), 0)
		where (valorComissaoFixaGeracao = 0)
		
		--SEM vendedor e SEM agrupamento
		UPDATE @Resultado set valorComissaoFixaGeracao = coalesce((select top 1 pc.valorComissaoFixa from ParametrosComissoes pc
		where (@vendaTotalEquipe between pc.valorMetaMinima and valorMetaMaxima) and (pc.idnComissaoFaturas = 1) and (pc.idnGeracao = 1) and 
		(pc.idVendedor is null) and (pc.idGrupoProduto is null)), 0)
		where (valorComissaoFixaGeracao = 0)

		--Passa a info para tabela para em seguida dividir pela quantidade de linhas, diluindo assim o valor da comissão fixa nos produtos vendidos
		--COM vendedor COM agrupamento
		update @LinhasVendedores set valorComissaoFixaGeracao2 = coalesce((select top 1 valorComissaoFixaGeracao from @Resultado 
		where (vendedor_id = idVendedorLinhas) and (ProdutoGrupo_id = idGrupoProdutoLinhas)),0)
		
		--COM vendedor SEM agrupamento
		update @LinhasVendedores set valorComissaoFixaGeracao2 = coalesce((select top 1 valorComissaoFixaGeracao from @Resultado 
		where (vendedor_id = idVendedorLinhas) and (ProdutoGrupo_id is null)),0)
		where (valorComissaoFixaGeracao2 = 0)
		
		--SEM vendedor e COM agrupamento
		update @LinhasVendedores set valorComissaoFixaGeracao2 = coalesce((select top 1 valorComissaoFixaGeracao from @Resultado 
		where (vendedor_id is null) and (ProdutoGrupo_id = idGrupoProdutoLinhas)),0)
		where (valorComissaoFixaGeracao2 = 0)

		--SEM vendedor e SEM agrupamento
		update @LinhasVendedores set valorComissaoFixaGeracao2 = coalesce((select top 1 valorComissaoFixaGeracao from @Resultado 
		where (vendedor_id is null) and (ProdutoGrupo_id is null)),0)
		where (valorComissaoFixaGeracao2 = 0)

		-- Confere a possibilidade de comissão existente
		update @LinhasVendedores set idVerificaExistenciaComissao = 1 from ParametrosComissoes where (idVendedor = idVendedorLinhas) and (idGrupoProduto = idGrupoProdutoLinhas)
		update @LinhasVendedores set idVerificaExistenciaComissao = 2 from ParametrosComissoes where (idVendedor = idVendedorLinhas) and (idGrupoProduto is null) and (idVerificaExistenciaComissao = 0)
		update @LinhasVendedores set idVerificaExistenciaComissao = 3 from ParametrosComissoes where (idVendedor is null) and (idGrupoProduto = idGrupoProdutoLinhas) and (idVerificaExistenciaComissao = 0)
		update @LinhasVendedores set idVerificaExistenciaComissao = 4 from ParametrosComissoes where (idVendedor is null) and (idGrupoProduto is null) and (idVerificaExistenciaComissao = 0)

		-- Insere na tabela para atualização posterior de linhas agrupadas
		insert into @LinhasVendedores2 
		select idVerificaExistenciaComissao, sum(qtdeLinhasPVendedor), idVendedorLinhas, idGrupoProdutoLinhas from @LinhasVendedores where idVerificaExistenciaComissao = 1 group by idVerificaExistenciaComissao,  idVendedorLinhas, idGrupoProdutoLinhas
		
		insert into @LinhasVendedores2 
		select idVerificaExistenciaComissao, sum(qtdeLinhasPVendedor), idVendedorLinhas, null from @LinhasVendedores where idVerificaExistenciaComissao = 2 group by idVerificaExistenciaComissao, idVendedorLinhas
		
		insert into @LinhasVendedores2 
		select idVerificaExistenciaComissao, sum(qtdeLinhasPVendedor), idVendedorLinhas, idGrupoProdutoLinhas from @LinhasVendedores where idVerificaExistenciaComissao = 3 group by idVerificaExistenciaComissao, idGrupoProdutoLinhas, idVendedorLinhas
		
		insert into @LinhasVendedores2 
		select idVerificaExistenciaComissao, sum(qtdeLinhasPVendedor), idVendedorLinhas, null from @LinhasVendedores where idVerificaExistenciaComissao = 4 group by idVerificaExistenciaComissao, idVendedorLinhas

		update @LinhasVendedores set qtdeLinhasAgrupadas = lv2.qtdeLinhasAgrupadas2 from @LinhasVendedores2 lv2 where idVerificaExistenciaComissao = lv2.idVerificaExistenciaComissao2 and idVendedorLinhas = idVendedorLinhas2

		-- Atualiza o valor da comissão fixa divida pela quantidade de lançamentos registrados de forma a soma bater com o valor definido na comissão fixa
		UPDATE @Resultado set valorComissaoFixaGeracao = lv.valorComissaoFixaGeracao2/qtdeLinhasPVendedor from @LinhasVendedores lv 
		inner join ParametrosComissoes pc on pc.idVendedor = lv.idVendedorLinhas
		where (lv.idVendedorLinhas = vendedor_id) and (ProdutoGrupo_id = idGrupoProdutoLinhas) and (pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = ProdutoGrupo_id) and (lv.idVerificaExistenciaComissao = 1)

		UPDATE @Resultado set valorComissaoFixaGeracao = lv.valorComissaoFixaGeracao2/qtdeLinhasAgrupadas from @LinhasVendedores lv
		inner join ParametrosComissoes pc on pc.idVendedor = lv.idVendedorLinhas
		where (lv.idVendedorLinhas = vendedor_id) and (lv.idGrupoProdutoLinhas is null) and (valorComissaoFixaGeracao2 = valorComissaoFixaGeracao) and (pc.idVendedor = vendedor_id) and (lv.idVerificaExistenciaComissao = 2)

		UPDATE @Resultado set valorComissaoFixaGeracao = lv.valorComissaoFixaGeracao2/qtdeLinhasPVendedor from @LinhasVendedores lv
		inner join ParametrosComissoes pc on pc.idGrupoProduto = lv.idGrupoProdutoLinhas
		where (ProdutoGrupo_id = idGrupoProdutoLinhas) and (valorComissaoFixaGeracao2 = valorComissaoFixaGeracao) and (pc.idGrupoProduto = ProdutoGrupo_id) and (vendedor_id = lv.idVendedorLinhas) and (pc.idVendedor is null) and (lv.idVerificaExistenciaComissao = 3)

		UPDATE @Resultado set valorComissaoFixaGeracao = lv.valorComissaoFixaGeracao2/qtdeLinhasAgrupadas from @LinhasVendedores lv
		where (valorComissaoFixaGeracao2 = valorComissaoFixaGeracao) and (lv.idVendedorLinhas = vendedor_id) and (lv.idVerificaExistenciaComissao = 4)
	END
	RETURN
END
GO
-- =============================================
-- Author:		Name
-- Create date: 
-- Description:	
-- =============================================
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,10),
		idnOferta bit,
		valorMinimo decimal(18,10)
)
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 TABLE [dbo].[NFProdutoSystax] ADD CONSTRAINT [FK_NFProdutoSystax_NFProduto] FOREIGN KEY
	(
		[idNFProduto]
	)
	REFERENCES [dbo].[NFProduto]
	(
		[id]
	)
GO

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

ALTER TABLE [dbo].[veiculo] ADD CONSTRAINT [FK_veiculo_parceiroProprietarioANTT] FOREIGN KEY
	(
		[idProprietarioANTT]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression]) VALUES ('idnIncluirNumeroCiotInfAdicionaisMDFe', 'Incluir o número do CIOT nas Informações Complementares do MDFe', 'Selecione esta opção quando desejar que o número do CIOT seja incluído automaticamente nas Informações Complementares de Interesse do Contribuinte', 'bool', 'False', 'MDFe', 'Configurações do MDFe',null,0,0,0,0,0,null,null,null)
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression]) VALUES ('mensagemEmailCIOT', 'Mensagem Email', '', 'varchar', 'Olá,<br/><br/>Você está recebendo em anexo o PDF do CIOT, gerado por: <b>%razaoSocialContratante% - CNPJ: %cnpjContratante%.<br/><br/>Contratado: %razaoSocialContratado% - CNPJ/CPF: %cpfCnpjContratado%.<br/><br/>Destinatário: %razaoSocialDestinatario% - CNPJ/CPF: %cpfCnpjDestinatario%.</b><br/><br/><i>Este e-mail foi enviado automaticamente, caso tenha alguma dúvida, entre em contato.</i>', 'Email', 'CIOT',null,1,0,0,0,0,null,null,null)
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO, REVISAO) VALUES(475, 733, GETDATE(),1);
