USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[produto] ADD 
[valorAcrescimo] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[pedidoProduto] ADD 
[valorAcrescimoUnit] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[operacao] ADD 
[idnPermiteNaoInformarNumeroSerie] [bit] NULL
GO
ALTER TABLE [dbo].[produtoimposto] ADD 
[idnDesconsiderarFreteSeguroOutrosBaseCalculo] [bit] NULL
GO
ALTER TABLE [dbo].[configuracaoNovo] ADD 
[dataInclusao] [datetime] NULL
GO
ALTER TABLE [dbo].[EmitenteIntegracaoDelivery] ADD 
[dataUltimaAlteracao] [datetime] NULL
GO
CREATE TABLE [dbo].[MovimentoSerieProduto]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[numeroserie] [varchar] (100) COLLATE Latin1_General_CI_AS NOT NULL,
	[idnEntradaSaida] [char] (1) COLLATE Latin1_General_CI_AS NOT NULL,
	[idProduto] [int] NOT NULL,
	[idProdutoClassificacao] [int] NULL,
	[idnEstorno] [bit] NOT NULL,
	[idAjusteEstoque] [int] NULL,
	[idNFProduto] [int] NULL,
	[idOrdemServicoProduto] [int] NULL,
	[idPedidoProduto] [int] NULL,
	[historico] [varchar] (1000) COLLATE Latin1_General_CI_AS NULL,
	[idOperacao] [int] NULL,
	[custoItem] [decimal] (18,4) NULL,
	[precoVenda] [decimal] (18,4) NULL,
	[idEmitente] [int] NULL,
	CONSTRAINT [PK_MovimentoSerieProduto] 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].[parceiroIntegracao]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idParceiro] [int] NOT NULL,
	[idParceiroPlataforma] [varchar] (500) COLLATE Latin1_General_CI_AS NOT NULL,
	[Plataforma] [varchar] (100) COLLATE Latin1_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER FUNCTION [dbo].[comissaoVendedorDescontoVendas]
(	
	@dataIniInf datetime,
	@dataFinInf datetime,
	@idVendedorInf int = 0,
	@idEmitente int = 0,
	@idnConsiderarValorFreteInf bit = 0
)
RETURNS 
@Resultado TABLE 
(
	vendedor_id int,
	vendedor_nome varchar(60),
	numeroNota varchar(50),
	numeroMovimento varchar(50),
	percDesconto decimal(18,4),
	valorLiquido decimal(18,4),
	valorBruto decimal(18,4),
	valorRecebidoGerado decimal(18,4),
	valorComissao decimal(18,4),
	percComissao decimal(18,4),
	idnRecebimento bit,
	idnGeracao bit
)
AS
BEGIN

	declare @dataIni datetime = @dataIniInf;
	declare @dataFin datetime = @dataFinInf;
	declare @idVendedor int = 0;
	declare @idnConsiderarValorFrete bit;

	if (@idVendedorInf > 0)
		SET @idVendedor = @idVendedorInf;
	
	if (@idnConsiderarValorFreteInf > 0)
		SET @idnConsiderarValorFrete = @idnConsiderarValorFreteInf
	BEGIN
		--Comissão de Recebimento
		INSERT INTO @Resultado
		select f.idVendedor, pa.fantasia, nf.numero, nf.numeroMovimento,
		(case when @idnConsiderarValorFrete = 1 
		then (case when nt.icmsdesconto > 0 then ((nt.icmsdesconto / nt.icmsprodutosservicos) * 100) else 0 end)
		else (case when nt.icmsdesconto > 0 then ((nt.icmsdesconto / (nt.icmsprodutosservicos - nt.icmsfrete)) * 100) else 0 end)end) as percDesconto, 
		(case when @idnConsiderarValorFrete = 1 then nt.icmstotalnota else (nt.icmstotalnota - coalesce(nt.icmsfrete, 0))end) as valorLiquido ,
		nt.icmsprodutosservicos, (case when @idnConsiderarValorFrete = 1 then fpp.valor else fpp.valor - coalesce(nt.icmsfrete,0)end), 0, 0, 1, 0
		from FaturaParcelaPagamento fpp
		inner join FaturaParcela fp on fp.id = fpp.idFaturaParcela
		inner join Fatura f on f.id = fp.idFatura
		inner join notafiscal nf on nf.id = f.idNotaFiscal
		inner join nfEmitente nfe on nfe.idNotaFiscal = nf.id
		inner join NFTotal nt on nt.idNotaFiscal = nf.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 (f.idnReceitaDespesa = '+')
		and ((nfe.idEmitente = @idEmitente) or (@idEmitente = 0))
		and (nt.icmsprodutosservicos > 0))
		
		--Comissão de Geração
		INSERT INTO @Resultado
		select f.idVendedor, pa.fantasia, nf.numero, nf.numeroMovimento,
		(case when @idnConsiderarValorFrete = 1 
		then (case when nt.icmsdesconto > 0 then ((nt.icmsdesconto / nt.icmsprodutosservicos) * 100) else 0 end)
		else (case when nt.icmsdesconto > 0 then ((nt.icmsdesconto / (nt.icmsprodutosservicos - nt.icmsfrete)) * 100) else 0 end)end) as percDesconto, 
		(case when @idnConsiderarValorFrete = 1 then nt.icmstotalnota else (nt.icmstotalnota - coalesce(nt.icmsfrete, 0))end) as valorLiquido, 
		nt.icmsprodutosservicos, (case when @idnConsiderarValorFrete = 1 then f.valor else f.valor - coalesce(nt.icmsfrete,0)end), 0, 0, 0, 1
		from Fatura f
		inner join notafiscal nf on nf.id = f.idNotaFiscal
		inner join nfemitente nfe on nfe.idnotafiscal = nf.id
		inner join NFTotal nt on nt.idNotaFiscal = nf.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 (f.idnReceitaDespesa = '+')
		and (nf.nfeCstat = 100 or nfeCstat = 150)
		and ((nfe.idEmitente = @idEmitente) or (@idEmitente = 0))
		and (nf.nfeTpAmb = 1)
		and (nt.icmsprodutosservicos > 0))
		
		--Altera o Percentual de Comissão dos Recebimentos
		UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc
		where (pc.idnComissaoDescontoVendas = 1)
		and (pc.idnRecebimento = 1)
		and ((pc.idnComDesconto = 0 and percDesconto = 0)
		or ((percDesconto > 0) and (cast(percDesconto as decimal) between pc.percDescontoInicial and pc.percDescontoFinal)))
		and (pc.idVendedor = vendedor_id)), 0)
		where (idnRecebimento = 1)
		
		UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc
		where (pc.idnComissaoDescontoVendas = 1)
		and (pc.idnRecebimento = 1)
		and ((pc.idnComDesconto = 0 and percDesconto = 0)
		or ((percDesconto > 0) and (cast(percDesconto as decimal) between pc.percDescontoInicial and pc.percDescontoFinal)))
		and (pc.idVendedor is null)), 0)
		where (percComissao = 0) and (idnRecebimento = 1)
		
		--Altera o Percentual de Comissão da Geração
		UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc
		where (pc.idnComissaoDescontoVendas = 1)
		and (pc.idnGeracao = 1)
		and ((pc.idnComDesconto = 0 and percDesconto = 0)
		or ((percDesconto > 0) and (cast(percDesconto as decimal) between pc.percDescontoInicial and pc.percDescontoFinal)))
		and (pc.idVendedor = vendedor_id)), 0)
		where (idnGeracao = 1)
		
		UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc
		where (pc.idnComissaoDescontoVendas = 1)
		and (pc.idnGeracao = 1)
		and ((pc.idnComDesconto = 0 and percDesconto = 0)
		or ((percDesconto > 0) and (cast(percDesconto as decimal) between pc.percDescontoInicial and pc.percDescontoFinal)))
		and (pc.idVendedor is null)), 0)
		where (percComissao = 0) and (idnGeracao = 1)
		
		--Altera o Valor da Comissão
		UPDATE @Resultado set valorComissao = (valorRecebidoGerado * percComissao) / 100
	END
	
	RETURN 

END
GO
ALTER FUNCTION [dbo].[ComissaoSobreMargemLucro]
(
	@dataIni datetime,
	@dataFin datetime,
	@idVendedor int = 0,
	@idEmitente int = 0,
	@idnComissaoRepresentante bit = 0,
	@idnConsiderarValorFreteInf bit = 0
)
RETURNS 
@Resultado TABLE 
(
	codigoProduto varchar(50),
	descricaoProduto varchar(120),
	quantidade decimal(18,4),
	precoCusto decimal(18, 4),
	precoVendaUnitario decimal(18, 4),
	precoVenda decimal(18, 4),
	margemDiferenca decimal(18, 2),
	percComissao decimal(18, 4),
	valorComissao decimal(18,4),
	numeroNF int,
	numeroMovimento int,
	dataEmissao date,
	destinatario_id int,
	destinatario_fantasia varchar(60),
	vendedor_id int,
	vendedor_nome varchar(60)
)
AS
BEGIN
	
	DECLARE @idnConsiderarValorFrete bit = 0
	if(@idnConsiderarValorFreteInf > 0)
		SET @idnConsiderarValorFrete = @idnConsiderarValorFreteInf

	INSERT INTO @Resultado
	SELECT (case when nfp.sequenciaClassificacao is not null then cast(nfp.idProduto as varchar(20)) + '/' + cast(nfp.sequenciaClassificacao as varchar(20)) else cast(nfp.idProduto as varchar(20)) end), 
	nfp.descricao, nfp.qcom, nfp.precoCusto,
	((nfp.vprod + (case when @idnConsiderarValorFrete = 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)) / nfp.qcom), 
	(nfp.vprod + (case when @idnConsiderarValorFrete = 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)), 0, 0, 0,
	nf.numero, nf.numeroMovimento, nf.dataEmissao, nd.idParceiro, nd.fantasia,
	(case when @idnComissaoRepresentante = 0 then pa.id else rep.id end), (case when @idnComissaoRepresentante = 0 then pa.fantasia else rep.fantasia end)
	from NFProduto nfp
	inner join nfemitente nfe on nfe.idnotafiscal = nfp.idNotaFiscal
	inner join notafiscal nf on nf.id = nfp.idNotaFiscal
	left join nfDestinatario nd on nd.idNotaFiscal = nf.id
	left join parceiro pa on pa.id = nf.idVendedor
	left join parceiro rep on rep.id = nf.idRepresentante
	where (
	(CAST(nf.dataEmissao as date) between @dataIni and @dataFin)
	and (((@idnComissaoRepresentante = 0) and ((nf.idVendedor = @idVendedor) or (@idVendedor = 0 and nf.idVendedor is not null)))
	or ((@idnComissaoRepresentante = 1) and ((nf.idRepresentante = @idVendedor) or (@idVendedor = 0 and nf.idRepresentante is not null))))
	and (nf.nfeCstat = 100 or nf.nfeCstat = 150)
	and (nf.nfeTpAmb = 1)
	and ((nfe.idEmitente = @idEmitente) or (@idEmitente = 0))
	and (nf.tipodocumento = 1))

	--calcula a margem entre o custo e o preço de venda
	UPDATE @Resultado SET margemDiferenca = ((precoVendaUnitario - precoCusto) / precoCusto) * 100
	WHERE (precoCusto > 0)

	--Altera o Percentual de Comissão quando possuir Vendedor definido nos parametros
	UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc 
	where (pc.idnComissaoMargemLucro = 1) 
	and (idnComissaoRepresentante = @idnComissaoRepresentante)
	and ((margemDiferenca > 0) and (margemDiferenca between pc.percMargemLucroInicial and pc.percMargemLucroFinal))
	and (pc.idVendedor = vendedor_id)), 0)

	--Altera o Percentual de Comissão quando NÃO possuir Vendedor definido nos parametros
	UPDATE @Resultado set percComissao = coalesce((select top 1 pc.percComissaoGeracao from ParametrosComissoes pc 
	where (pc.idnComissaoMargemLucro = 1)
	and (idnComissaoRepresentante = @idnComissaoRepresentante)
	and ((margemDiferenca > 0) and (margemDiferenca between pc.percMargemLucroInicial and pc.percMargemLucroFinal))
	and (pc.idVendedor is null)), 0)
	where (percComissao = 0)

	--Altera o valor da Comissão
	UPDATE @Resultado set valorComissao = (precoVenda * percComissao) / 100
	
	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
)
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;
	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

	--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
	)

	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
		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
			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

		-- 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))
		
		
		--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
CREATE FUNCTION [dbo].[EstoqueSerieProduto] 
(
	@numeroSerieInf varchar(100),
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0
)
RETURNS 
@Resultado TABLE 
(
		numeroSerie varchar(100),
		idProduto int,
		idProdutoClassificacao int NULL,	
		dscProdutoClasse varchar(500),			
		codigoProdutoClasse varchar(50),
		qtd decimal(18,4)
)
AS
BEGIN
	INSERT into @Resultado
	select msp.numeroSerie, msp.idProduto, msp.idprodutoclassificacao, 
	(case when msp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
	(case when msp.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),
	sum((case when msp.idnEntradaSaida = '+' then 1 else -1 end)) as qtd
	from MovimentoSerieProduto msp
	inner join produto pr on pr.id = msp.idProduto
	left join ProdutoClassificacao pc on pc.id = msp.idProdutoClassificacao
	group by msp.numeroSerie, msp.idProduto, msp.idprodutoclassificacao, 
	(case when msp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
	(case when msp.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)

	RETURN 
END
GO
CREATE FUNCTION [dbo].[comissaoVendedorDiferencialTabelado]
(	
	@idVendedorInf int = 0,
	@idEmitente int = 0
)
RETURNS 
@Resultado TABLE 
(
	notafiscalProduto_id int,
	vendedor_id int,
	vendedor_nome varchar(60),
	fatura_id int,
	valorFatura decimal(18,4),
	valorComissaoDiferencial decimal(18,4),
	dataFatura datetime,
	condicaoPagamento_id int,
	condicaoPagamentoDescricao varchar(200),
	precoVariacao_id int
)
AS
BEGIN

	declare @idVendedor int = 0;

	if (@idVendedorInf > 0)
		SET @idVendedor = @idVendedorInf;

	Declare @Vendas TABLE 
	(
		notafiscalProduto_id int,
		vendedor_id int,
		vendedor_nome varchar(60),
		fatura_id int,
		valorFaturaParcela decimal(18,4),
		dataFatura datetime,
		condicaoPagamento_id int,
		condicaoPagamentoDescricao varchar(200),
		variacaoPreco_id int,
		notafiscal_id int,
		produto_id int,
		precoProdutoVenda decimal(18,4),
		precoProdutoVendido decimal(18,4),
		quantidadeVendida decimal(18,4),
		quantidade decimal (18,4)
	)

	BEGIN
		insert into @Vendas 
		select DISTINCT nfp.id, f.idVendedor, ve.razaosocial, f.id, f.valor, f.dataFatura, f.idCondicaoPagamento, cp.descricao, 0, 
		nfp.idNotaFiscal, nfp.idProduto, 0, nfp.vuncom, nfp.qcom - coalesce(nfp.vdesc, 0) + coalesce(nfp.voutro,0), nfp.qcom
		from fatura f
		inner join FaturaParcela fp on fp.idFatura = f.id
		inner join CondicaoPagamento cp on cp.id = f.idCondicaoPagamento
		inner join parceiro ve on ve.id = f.idVendedor
		inner join NFProduto nfp on nfp.idNotaFiscal = f.idNotaFiscal
		inner join ProdutoPreco pp on pp.idProduto = nfp.idProduto
		where (f.idnReceitaDespesa = '+')
		and (fp.idnBaixado = 0 or fp.idnBaixado is null)
		and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))

		update @Vendas set variacaoPreco_id = (select top 1 id 
		from PrecoVariacao pv
		where (pv.dataInicioVigencia <= dataFatura and pv.dataFimVigencia >= dataFatura)
		and ((pv.idCondicaoPagamento = condicaoPagamento_id) or (pv.idCondicaoPagamento is null))
		and ((pv.idVendedor = vendedor_id) or (pv.idVendedor is null)))
		

		update @Vendas set precoProdutoVenda = (select top 1 case when pv.idnAcrescimo = 1 then
																(case when pv.idnValor = 1 then pp.preco + pv.percentualValorVariacao
																	when pv.idnPercentual = 1 then pp.preco * (1+(pv.percentualValorVariacao/100))end)
															when pv.idnDesconto = 1 then
																(case when pv.idnValor = 1 then pp.preco - pv.percentualValorVariacao
																	when pv.idnPercentual = 1 then pp.preco - (pp.preco*(pv.percentualValorVariacao/100))end)
															else pp.preco end
		from ProdutoPreco pp 
		left join PrecoVariacao pv on pv.id = variacaoPreco_id
		where (pp.dataVigencia <= dataFatura)
		and (pp.idProduto = produto_id)
		and ((pv.idVendedor = vendedor_id) or (pv.idVendedor is null))
		order by pp.dataVigencia DESC)


		insert into @Resultado
		select distinct notafiscalProduto_id, vendedor_id, vendedor_nome, fatura_id, valorFaturaParcela, 
		quantidade*(precoProdutoVendido - precoProdutoVenda), 
		dataFatura, condicaoPagamento_id, condicaoPagamentoDescricao, ve.variacaoPreco_id
		from @Vendas ve
	END
	RETURN 
END
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER [dbo].[TGR_CONFIGURACAONOVO_AI]
   ON  [dbo].[configuracaoNovo]
   AFTER INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for trigger here
	DECLARE @NomeParametro varchar(80);

	SELECT @NomeParametro = nomeParametro from inserted
	
	UPDATE configuracaoNovo set dataInclusao = GETDATE()
	where nomeParametro = @NomeParametro
END
GO
ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_emitente] FOREIGN KEY
	(
		[idEmitente]
	)
	REFERENCES [dbo].[emitente]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_estoqueAjustes] FOREIGN KEY
	(
		[idAjusteEstoque]
	)
	REFERENCES [dbo].[estoqueAjustes]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_NFProduto] FOREIGN KEY
	(
		[idNFProduto]
	)
	REFERENCES [dbo].[NFProduto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_operacao] FOREIGN KEY
	(
		[idOperacao]
	)
	REFERENCES [dbo].[operacao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_OrdemServicoProduto] FOREIGN KEY
	(
		[idOrdemServicoProduto]
	)
	REFERENCES [dbo].[OrdemServicoProduto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_pedidoProduto] FOREIGN KEY
	(
		[idPedidoProduto]
	)
	REFERENCES [dbo].[pedidoProduto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_produto] FOREIGN KEY
	(
		[idProduto]
	)
	REFERENCES [dbo].[produto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoSerieProduto] ADD CONSTRAINT [FK_MovimentoSerieProduto_ProdutoClassificacao] FOREIGN KEY
	(
		[idProdutoClassificacao]
	)
	REFERENCES [dbo].[ProdutoClassificacao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[parceiroIntegracao] ADD CONSTRAINT [FK_parceiroIntegracao_parceiro] FOREIGN KEY
	(
		[idParceiro]
	)
	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 ('idnNaoSelecionarGerarBoletos', 'Desmarcar a opção "Gerar Boletos" quando utilizado a Forma de Pagamento "BOLETO"', 'Selecione esta opção quando desejar que a opção "Gerar Boletos" venha desmarcada por padrão, quando utilizado a forma de pagamento BOLETO.', 'bool', 'False', 'Geral', 'Configurações Gerais',null,0,0,0,0,0,null,null,null)
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(457, 715, GETDATE());
