USE [TryNFeOnline]
GO
UPDATE [dbo].[Rotas] SET [valor] = 0.0 WHERE [valor] IS NULL
GO
ALTER TABLE [dbo].[ParametrosComissoes] ADD 
[valorMetaMinima] [decimal] (18,4) NULL,
[valorMetaMaxima] [decimal] (18,4) NULL,
[valorComissaoFixa] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[Rotas] ALTER COLUMN [valor] [numeric] (18,4) NOT NULL
GO
ALTER TABLE [dbo].[Rotas] ADD 
[idnBaixado] [bit] NULL
GO
CREATE 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')
)
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)
	
	
	--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 + coalesce(nfp.vfrete, 0) + 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 + coalesce(nfp.vfrete, 0) + 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)
			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 = '+')

		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)
			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))
		
		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)
			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
UPDATE ParametrosComissoes set valorMetaMinima = 0
UPDATE ParametrosComissoes set valorMetaMaxima = 100000000000
GO
update Telas set idnRestricaoAcesso = 1 where id = 160
update Telas set idnRestricaoAcesso = 1 where id = 161
GO
update menuitens set idnVisivel = 0 where id = 75
update menuitens set idnVisivel = 0 where id = 176
update menuitens set idnVisivel = 1 where id = 435
update menuitens set idnVisivel = 1 where id = 437
update menuitens set idnVisivel = 1 where id = 436
update menuitens set idnVisivel = 1 where id = 438
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(449, 707, GETDATE());