USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[emitente] ADD 
[idnControleCreditoFlex] [bit] NULL
GO
ALTER TABLE [dbo].[parceiro] ADD 
[idnControleCreditoFlex] [bit] NULL
GO
ALTER TABLE [dbo].[pedidoProduto] ADD 
[precoVendaTabelado] [decimal] (18,4) NULL
GO
ALTER TABLE [dbo].[ProdutoClassificacao] ADD 
[idnChapaVincada] [bit] NULL,
[vinco1] [int] NULL,
[vinco2] [int] NULL,
[vinco3] [int] NULL,
[vinco4] [int] NULL,
[vinco5] [int] NULL
GO
CREATE TABLE [dbo].[MovimentoContaFlex]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idFilial] [int] NOT NULL,
	[idVendedor] [int] NOT NULL,
	[idPedido] [int] NULL,
	[valorFlex] [decimal] (18,4) NOT NULL,
	[idnCancelado] [bit] NOT NULL,
	[motivoCancelamento] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[dataHora] [datetime] NOT NULL,
	[idnAjuste] [bit] NOT NULL,
	[idOperadorAjuste] [int] NULL,
	[idNotaFiscal] [int] NULL,
	[motivoAjuste] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	CONSTRAINT [PK_MovimentoFlex] 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].[MovimentoContaFlexItens]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idMovimentoContaFlex] [int] NOT NULL,
	[idPedidoProduto] [int] NOT NULL,
	[valorTabelado] [decimal] (18,4) NOT NULL,
	[valorAplicado] [decimal] (18,4) NOT NULL,
	[valorFlex] [decimal] (18,4) NOT NULL,
	[quantidade] [decimal] (18,4) NOT NULL,
	[valorFlexTotal] [decimal] (18,4) NOT NULL,
	CONSTRAINT [PK_MovimentoContaFlexItens] 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

ALTER FUNCTION [dbo].[comissaoVendedor2]
(
	@dataIniInf date,
	@dataFinInf date,
	@idVendedorInf int,
	@idEmitenteInf int,
	@idnconsiderarDataAberturaOSInf bit, -- Para o caso de OS onde o cliente deseja a data da abertura da OS em vez da data da fatura.
	@tipoIntervalo varchar(20), -- Servirá para considerar o intervalo definido nas metas ('Dias','Semanas','Meses')
	@idnConsiderarValoresFreteInf bit, -- Considerar valor do frete na comissão
	@idnConsiderarServicoOSInf bit,
	@idnConsiderarLiquidacoesParciaisInf bit
)
RETURNS
@Resultado TABLE 
(
	vendedor_id int,
	vendedor_nome varchar(60),
	valorRecebido decimal(18,4),
	percComissaoRecebimento decimal(18,4),
	valorComissaoRecebimento decimal(18,4),
	valorGeracao decimal(18,4),
	percComissaoGeracao decimal(18,4),
	valorComissaoGeracao decimal(18,4),
	valorComissaoFixaGeracao decimal(18,4),
	Fatura_id int,
	FaturaParcela_id int,
	DocumentoOrigem_id int,
	ProdutoGrupo_id int,
	codigoAgrupamento varchar(100),
	dscAgrupamento varchar(500),
	idnRecebimentoForaPeriodo bit,
	qtdeLinhas int -- campo para conseguir coletar e calcular a comissão fixa
)
AS
BEGIN
	declare @dataIni datetime = @dataIniInf
	declare @dataFin datetime = @dataFinInf
	declare @idVendedor int = @idVendedorInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idnconsiderarDataAberturaOS int = @idnconsiderarDataAberturaOSInf
	declare @idnParametroRecebimento bit;
	declare @idnConsiderarServicoOS bit = 0;
	declare @idnConsiderarLiquidacoesParciais bit = 0;
	declare @idnConsiderarValoresFrete bit = 0
	
	set @idnParametroRecebimento = (select top 1 case when pc.idnRecebimento = 1 then 1 else 0 end from ParametrosComissoes pc where idnRecebimento = 1)
	if(@idnConsiderarValoresFreteInf > 0)
		set @idnConsiderarValoresFrete = @idnConsiderarValoresFreteInf;
	if(@idnConsiderarServicoOSInf > 0)
		set @idnConsiderarServicoOS = @idnConsiderarServicoOSInf;
	if(@idnConsiderarLiquidacoesParciaisInf > 0) 
		set @idnConsiderarLiquidacoesParciais = @idnConsiderarLiquidacoesParciaisInf;

	--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
	)
	--Tabela utilizada para calcular comissão fixa
	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
	)

	--Tabelas para registrar vendas de cada tela
	declare @GrupoProdutos TABLE
	(
		idProdutoGrupo int,
		produtoNF_id 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,
		osProduto_id int,
		codigoAgrupamento varchar(100),
		dscAgrupamento varchar(500),
		idVendedor int,
		fantasia varchar(60),
		idFatura int,
		idFaturaParcela int,
		valor decimal(18,4),
		valorParcelas decimal (18,4),
		valorFatura decimal (18,4),
		idnRecebimentosForaPeriodo bit, -- Irá validar recebimentos que foram recebidos no periodo definido porem por vendas fora desse periodo para levatantamento de comissão de recebimento sobre grupo de produtos
		idnConsiderarServicoOS bit
	)

	declare @GrupoProdutosPedido TABLE
	(
		idProdutoGrupo int,
		pedidoProduto_id 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 distinct pr.idGrupo, nfp.id ,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
		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 produtoGrupo pg on pr.idGrupo = pg.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 and @idnConsiderarLiquidacoesParciais = 0)
			BEGIN
				-- Recebimentos para Geração por Grupo do Produto onde as vendas foram feitas fora do periodo definido
				INSERT INTO @GrupoProdutos
				select distinct pr.idGrupo, nfp.id, 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
				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 produtoGrupo pg on pr.idGrupo = pg.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 (coalesce(fp.idnBaixado,0) != 1)
				and (fp.id not in(select gp.idFaturaParcela from @GrupoProdutos gp))
			END	
		if(@idnParametroRecebimento = 1 and @idnConsiderarLiquidacoesParciais = 1)
			BEGIN
				INSERT INTO @GrupoProdutos
				select distinct pr.idGrupo, nfp.id ,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
				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 produtoGrupo pg on pr.idGrupo = pg.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 < fp.valor)
				AND (coalesce(fp.idnBaixado,0) != 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 distinct pr.idGrupo, osp.id, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(osp.total,0) as valor, fp.valor, f.valor, 0, 0
		from OrdemServicoProduto osp
		inner join produto pr on pr.id = osp.idProduto
		inner join ordemservico os on os.id = osp.idOrdemServico
		inner join Fatura f on f.idOrdemServico = os.id
		inner join FaturaParcela fp on fp.idFatura = f.id
		left join produtoGrupo pg on pr.idGrupo = pg.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 and @idnConsiderarLiquidacoesParciais = 0)
			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 distinct pr.idGrupo, osp.id, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(osp.total,0) as valor, fp.valor, f.valor, 1, 0
				from OrdemServicoProduto osp
				inner join produto pr on pr.id = osp.idProduto
				inner join ordemservico os on os.id = osp.idOrdemServico
				left join produtoGrupo pg on pr.idGrupo = pg.id
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where (CAST(cm.dataHora as date)  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND (coalesce(fp.idnBaixado,0) != 1)
				and (fp.id not in (select gpos.idFaturaParcela from @GrupoProdutosOS gpos))
			END
		if(@idnParametroRecebimento = 1 and @idnConsiderarLiquidacoesParciais = 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 distinct pr.idGrupo, osp.id, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(osp.total,0) as valor, fp.valor, f.valor, 1, 0
				from OrdemServicoProduto osp
				inner join produto pr on pr.id = osp.idProduto
				inner join ordemservico os on os.id = osp.idOrdemServico
				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 produtoGrupo pg on pr.idGrupo = pg.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 < fp.valor)
				AND (coalesce(fp.idnBaixado,0) != 1)
				and (fp.id not in (select gpos.idFaturaParcela from @GrupoProdutosOS gpos))
			END
		if(@idnConsiderarServicoOS = 1)
			BEGIN
				INSERT INTO @GrupoProdutosOS
				select distinct null, oss.id, null, null, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(oss.total,0) as valor, fp.valor, f.valor, 0, 1
				from OrdemServicoServico oss
				inner join ordemservico os on os.id = oss.idOrdemServico
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				left join parceiro pa on pa.id = f.idVendedor
				where ((@idnconsiderarDataAberturaOS = 0 and (CAST(f.dataFatura as date))  between @dataIni and @dataFin) or (@idnconsiderarDataAberturaOS = 1 and (Cast(os.dataHora as date)) between @dataIni and @dataFin))
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				and ((fp.idnBaixado != 1) or (fp.idnBaixado is null))
				and ((os.idnCancelada != 1) or (os.idnCancelada is null))
			END
		if(@idnConsiderarServicoOS = 1 and @idnParametroRecebimento = 1 and @idnConsiderarLiquidacoesParciais = 0)
			BEGIN
				INSERT INTO @GrupoProdutosOS
				select distinct null, oss.id, null, null, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(oss.total,0) as valor, fp.valor, f.valor, 1, 1
				from OrdemServicoServico oss
				inner join ordemservico os on os.id = oss.idOrdemServico
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where (CAST(cm.dataHora as date)  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo = 0)
				AND (coalesce(fp.idnBaixado,0) != 1)
				and (fp.id not in (select gpos.idFaturaParcela from @GrupoProdutosOS gpos))
			END
		if(@idnConsiderarServicoOS = 1 and @idnParametroRecebimento = 1 and @idnConsiderarLiquidacoesParciais = 1)
			BEGIN
				INSERT INTO @GrupoProdutosOS
				select distinct null, oss.id, null, null, f.idVendedor, pa.fantasia, f.id, fp.id, coalesce(oss.total,0) as valor, fp.valor, f.valor, 1, 1
				from OrdemServicoServico oss
				inner join ordemservico os on os.id = oss.idOrdemServico
				inner join Fatura f on f.idOrdemServico = os.id
				inner join FaturaParcela fp on fp.idFatura = f.id
				inner join FaturaParcelaPagamento fpp on fpp.idFaturaParcela = fp.id
				inner join caixamovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
				left join parceiro pa on pa.id = f.idVendedor
				where (CAST(cm.dataHora as date)  between @dataIni and @dataFin)
				and ((f.idVendedor = @idVendedor) or (@idVendedor = 0 and f.idVendedor is not null))
				and ((os.idEmitente = @idEmitente) or (@idEmitente = 0))
				and (f.idnReceitaDespesa = '+')
				AND (fp.saldo < 0)
				AND (coalesce(fp.idnBaixado,0) != 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 distinct pr.idGrupo, pp.id, 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 and @idnConsiderarLiquidacoesParciais = 0)
			BEGIN
				-- Recebimentos de Pedidos para Geração por Grupo do Produto de recebimento
				INSERT INTO @GrupoProdutosPedido
				select distinct pr.idGrupo, pp.id, 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 (coalesce(fp.idnBaixado,0) != 1)
				and ((p.idnFaturado = 1) and (p.idnCancelado != 1))
				and (fp.id not in (select gpp.idfaturaparcela from @GrupoProdutosPedido gpp))
			END
		if(@idnParametroRecebimento = 1 and @idnConsiderarLiquidacoesParciais = 1)
			BEGIN
				-- Recebimentos de Pedidos para Geração por Grupo do Produto de recebimento
				INSERT INTO @GrupoProdutosPedido
				select distinct pr.idGrupo, pp.id, 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 < fp.valor)
				AND (coalesce(fp.idnBaixado,0) != 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 idFaturaParcela 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
		if(@idnParametroRecebimento = 1)
			BEGIN
				--Calcula o Percentual recebido perante o valor de CaixaMovimento e aloca percentualmente o valor com base no valor do produto
				Update @Resultado set valorRecebido = (select sum(cm.valor)
				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 (@idnConsiderarLiquidacoesParciais = 0))
					or ((@idnConsiderarLiquidacoesParciais = 1 ) and (fp.saldo < fp.valor) and (fp.id = FaturaParcela_id))))
				--and (coalesce(fp.idnBaixado,0) != 1)
				--Valida a quantidade do saldo pois quando liquidado parcial, se tirar relatorio retroativo puxa também na liquidação parcial
				--and (fpp.saldoCapitalAnterior = valorCapital)

				--Calcula o perncentual pelo item, alterado devido a necessidade de somar pela tabela caixaMovimento
				Update @Resultado set valorRecebido = valorRecebido / fp.valor * 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 (@idnConsiderarLiquidacoesParciais = 0))
					or ((@idnConsiderarLiquidacoesParciais = 1 ) and (fp.saldo < fp.valor) and (fp.id = FaturaParcela_id)))
			END
		
		--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].[MovimentoSaldoFlex]
(
	@idFilial int, 
	@idVendedor int = 0,
	@dataHoraCompetencia datetime
)
RETURNS 
@Resultado TABLE 
(
	idFilial int, 
	idVendedor int,
	valorFlex decimal(18,4),
	idnCancelado bit,
	motivoCancelamento varchar(500),
	dataHora datetime,
	idnAjuste bit,
	idOperadorAjuste int null
)
AS
BEGIN

	INSERT INTO @Resultado
	SELECT m.idFilial, m.idVendedor, m.valorFlex, m.idnCancelado, m.motivoCancelamento, m.dataHora, m.idnAjuste, m.idOperadorAjuste
	FROM MovimentoContaFlex m
	WHERE (m.dataHora < @dataHoraCompetencia)
	and (m.idFilial = @idFilial)
	and (m.idVendedor = @idVendedor or @idVendedor = 0)
	
	RETURN 
END
GO
CREATE FUNCTION [dbo].[SaldoContaFlex]
(
	@idFilial int,
	@idVendedor int = 0,
	@dataHoraCompetencia datetime
)
RETURNS 
@Resultado TABLE 
(
	idFilial int,
	razaoSocialFilial varchar(100),
	idVendedor int,
	razaoSocialVendedor varchar(100),
	saldoFlex decimal(18,4)
)
AS
BEGIN
	
	INSERT INTO @Resultado
	SELECT mov.idFilial, em.razaosocial, mov.idVendedor, ven.razaosocial, SUM(mov.valorFlex)
	FROM MovimentoSaldoFlex(@idFilial, @idVendedor, @dataHoraCompetencia) mov
	INNER JOIN emitente em on em.id = mov.idFilial
	INNER JOIN parceiro ven on ven.id = mov.idVendedor
	WHERE (mov.idnCancelado = 0)
	group by mov.idFilial, em.razaosocial, mov.idVendedor, ven.razaosocial
	
	RETURN 
END
GO
ALTER TABLE [dbo].[MovimentoContaFlex] ADD CONSTRAINT [FK_MovimentoContaFlex_emitente] FOREIGN KEY
	(
		[idFilial]
	)
	REFERENCES [dbo].[emitente]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoContaFlex] ADD CONSTRAINT [FK_MovimentoContaFlex_Operador] FOREIGN KEY
	(
		[idOperadorAjuste]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoContaFlex] ADD CONSTRAINT [FK_MovimentoContaFlex_parceiro] FOREIGN KEY
	(
		[idVendedor]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoContaFlex] ADD CONSTRAINT [FK_MovimentoContaFlex_pedido] FOREIGN KEY
	(
		[idPedido]
	)
	REFERENCES [dbo].[pedido]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoContaFlexItens] ADD CONSTRAINT [FK_MovimentoContaFlexItens_MovimentoContaFlex] FOREIGN KEY
	(
		[idMovimentoContaFlex]
	)
	REFERENCES [dbo].[MovimentoContaFlex]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[MovimentoContaFlexItens] ADD CONSTRAINT [FK_MovimentoContaFlexItens_pedidoProduto] FOREIGN KEY
	(
		[idPedidoProduto]
	)
	REFERENCES [dbo].[pedidoProduto]
	(
		[id]
	)
GO
INSERT dbo.configuracaoNovo(nomeParametro, descricaoSimplificada, descricaoDetalhada, tipoValor, valor, grupo, subgrupo, tamanhoValorMaximo, idnParametroMultilinhas, idnParametroRadio, idnParametroSelecaoPasta, idnPermiteAlteracaoApenasPorAdmins, idnCampoSenha, tabelaSelecao, filtroSelecao, validacaoRegularExpression, dataInclusao, idnPermiteSelecaoMultiplaOpcoes) VALUES (N'idnAtualizarParceiroImportarXmlCTe', 'Atualizar dados do Parceiro ao importar XML no CTe', 'Ao marcar esta opção, ao importar um XML na emissão de CTe, o sistema vai atualizar os dados do Parceiro que estiverem diferentes do XML', 'bool', 'False', 'CTe', 'Configurações do CTe', NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO, REVISAO) VALUES(500, 758, GETDATE(),1);