USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[nfDestinatario] ADD 
[idEnderecoParceiro] [int] NULL
GO
ALTER FUNCTION [dbo].[EstoqueProdutos] 
(
	@dataInf Datetime = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0, 
	@idGrupoInf int = 0,
	@idnMostrarProdutosBaixadosInf bit = 0,
	@idnMostrarProdutosQtdNegativaInf bit = 1,
	@idMarcaInf int = 0
)
RETURNS 
@Resultado TABLE 
(
		rowNumber int,
		idProduto int,
		idProdutoClassificacao int NULL,	
		dscProdutoClasse varchar(500),			
		qtd decimal(18,4),
		unidadeMedida varchar(30),
		codigoProdutoClasse varchar(50),
		precoCadastro decimal(18,4), 
		precoEntradaCadastro decimal(18,4),
		idGrupo int null,
		dscGrupo varchar(100) null,
		idConta int,
		dscConta varchar(200),
		precoCalculado decimal(18,4),
		custoCalculado decimal(18,4),
		refFabrica varchar(50),
		idMarca int,
		dscMarca varchar(200),
		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,4)
)
AS
BEGIN
	
	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;
	declare @idGrupo int = 0;
	declare @idnMostrarProdutosBaixados bit = @idnMostrarProdutosBaixadosInf;
	declare @idnMostrarProdutosQtdNegativa bit = @idnMostrarProdutosQtdNegativaInf;		
	declare @idMarca int = @idMarcaInf;
	
	if (@idGrupoInf > 0)
		SET @idGrupo = @idGrupoInf;
	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
		
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());		

	declare @exibirCustoLetras bit = (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 ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))	

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

	--atualiza a qtd dos produtos com unidade de medida diferente da definida no cadastro e efetua a convers?o conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao												
	WHERE (unidadeMedidaConvertida <> '')
	and   (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		select /*case when @exibirCustoLetras = 1 then ROW_NUMBER() OVER (ORDER BY ies.idProduto) else 0 end*/
			   0,
			   ies.idProduto, 
			   ies.idProdutoClassificacao, 
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProdutoClasse,
			   ies.precoCadastro,
			   ies.precoEntradaCadastro,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idConta,
			   ies.dscConta,
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProdutoData(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as custoCalculado,
			   (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end),
			   pr.idMarca,
			   mc.descricao as dscMarca,
			   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, 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
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER FUNCTION [dbo].[PontosFidelidade]
(	
	@idParceiroStr varchar(max)
)
RETURNS 
	@resultado table
	(
		idProgramaFidelidade int,
		pontuacao int,
		idnVencido bit,
		idnAbatido bit,
		validade date,
		idParceiro int
	)
AS
BEGIN
	
	declare @pontuacaoParceiro table
	(
		idprogramaFidelidade int,
		idnReceitaDespesa char(1),
		pontuacao int,
		validade date,
		parceiro_id int,
		dataEmissao datetime,
		idNotaFiscal int,
		idPedido int,
		idOS int,
		idnAbatimento bit,
		idOperacao int
	)
	
	declare @abatimentosParceiro table
	(
		idprogramaFidelidade int,
		idnReceitaDespesa char(1),
		pontuacao int,
		validade date,
		parceiro_id int,
		dataEmissao datetime,
		idNotaFiscal int,
		idPedido int,
		idOS int,
		idnAbatimento bit,
		idOperacao int
	)
	
	declare @idParceiroTable Table
	(
		parceiro_id int not null
	)
	
	insert into @idParceiroTable select * from ConvertStringToTable(@idParceiroStr)

	insert into @pontuacaoParceiro select id, idnReceitaDespesa, pontuacao, validade, idParceiro, dataEmissao, idNotaFiscal, idPedido, idOS, idnAbatimento, idOperacao from ProgramaFidelidade pf inner join @idParceiroTable pt on pt.parceiro_id = pf.idParceiro where (idParceiro = parceiro_id) and (idnReceitaDespesa = '+') and (idnCancelado = 0 or idnCancelado is null) order by validade
	
	insert into @abatimentosParceiro select id, idnReceitaDespesa, pontuacao, validade, idParceiro, dataEmissao, idNotaFiscal, idPedido, idOS, idnAbatimento, idOperacao from ProgramaFidelidade pf inner join @idParceiroTable pt on pt.parceiro_id = pf.idParceiro where (idParceiro = parceiro_id) and (idnReceitaDespesa = '-') and (idnCancelado = 0 or idnCancelado is null) order by dataEmissao
	
	DECLARE @idprogramaFidelidadeAbatimento int
	DECLARE @pontuacaoAbatimento int
	DECLARE @dataEmissaoAbatimento date
	DECLARE @parceiro_id_abatimento int
	
	DECLARE MY_CURSOR CURSOR 
	  LOCAL STATIC READ_ONLY FORWARD_ONLY
	FOR 
	SELECT DISTINCT idprogramaFidelidade, pontuacao, dataEmissao, parceiro_id
	FROM @abatimentosParceiro
	
	OPEN MY_CURSOR
	FETCH NEXT FROM MY_CURSOR INTO @idprogramaFidelidadeAbatimento, @pontuacaoAbatimento, @dataEmissaoAbatimento, @parceiro_id_abatimento
	WHILE @@FETCH_STATUS = 0
	BEGIN 
		DECLARE @idprograma int
		DECLARE @pontuacao int
		DECLARE @validade date
		DECLARE @parceiro_id int
		DECLARE MY_CURSOR2 CURSOR 
		LOCAL STATIC READ_ONLY FORWARD_ONLY
			FOR 
			SELECT DISTINCT idprogramaFidelidade, pontuacao, validade, parceiro_id
			FROM @pontuacaoParceiro where validade >= @dataEmissaoAbatimento
		OPEN MY_CURSOR2
		FETCH NEXT FROM MY_CURSOR2 INTO @idprograma, @pontuacao, @validade, @parceiro_id
	    WHILE @pontuacaoAbatimento > 0
		BEGIN
			IF @parceiro_id is null
				FETCH NEXT FROM MY_CURSOR2 INTO @idprograma, @pontuacao, @validade, @parceiro_id
			IF @pontuacaoAbatimento >= @pontuacao and @parceiro_id_abatimento = @parceiro_id
				BEGIN
					insert @resultado values(@idprograma, @pontuacao, 0, 1, @validade, @parceiro_id)
					delete from @pontuacaoParceiro where idprogramaFidelidade = @idprograma
					set @pontuacaoAbatimento = @pontuacaoAbatimento - @pontuacao
				END
			ELSE IF @pontuacaoAbatimento < @pontuacao and @parceiro_id_abatimento = @parceiro_id
				BEGIN
					--FETCH NEXT FROM MY_CURSOR2 INTO @idprograma, @pontuacao, @validade, @parceiro_id
					insert @resultado values(@idprograma, @pontuacaoAbatimento, 0, 1, @validade, @parceiro_id)
					update @pontuacaoParceiro set pontuacao = @pontuacao - @pontuacaoAbatimento where idprogramaFidelidade = @idprograma
					set @pontuacaoAbatimento = @pontuacaoAbatimento - @pontuacao
				END
			FETCH NEXT FROM MY_CURSOR2 INTO @idprograma, @pontuacao, @validade, @parceiro_id
		END
		CLOSE MY_CURSOR2
		DEALLOCATE MY_CURSOR2
	
	    FETCH NEXT FROM MY_CURSOR INTO @idprogramaFidelidadeAbatimento, @pontuacaoAbatimento, @dataEmissaoAbatimento, @parceiro_id_abatimento
	END
	CLOSE MY_CURSOR
	DEALLOCATE MY_CURSOR
	
	
	insert into @resultado select idprogramaFidelidade, pontuacao, 1, 0, validade, parceiro_id from @pontuacaoParceiro where validade < SYSDATETIME()
	delete from @pontuacaoParceiro where validade < SYSDATETIME()

	insert into @resultado select idprogramaFidelidade, pontuacao, 0, 0, validade, parceiro_id from @pontuacaoParceiro
		
	RETURN 
END
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(467, 725, GETDATE());