USE [TryNFeOnline]
GO


ALTER TABLE [dbo].[CondicionalFaturado] ADD 
[idCondicionalProduto] [int] NULL
GO
ALTER TABLE [dbo].[configuracoes] ADD 
[idnNaoGerarLotesCartoesAutomaticamente] [bit] NULL
GO
ALTER TABLE [dbo].[Conta] ADD 
[AdministradoraBoletoOnline] [varchar] (20) COLLATE Latin1_General_CI_AS NULL,
[chaveIntegracaoBoletoOnline] [varchar] (100) COLLATE Latin1_General_CI_AS NULL
GO
CREATE TABLE [dbo].[SpedIcmsCredito]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idFilial] [int] NOT NULL,
	[mesReferencia] [date] NOT NULL,
	[valorSaldoCredorTransportar] [decimal] (18,4) NOT NULL,
	CONSTRAINT [PK_SpedIcmsCredito] 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

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER FUNCTION [dbo].[comissaoVendedor]
(	
	@dataIniInf datetime,
	@dataFinInf datetime,
	@idVendedorInf int = 0
)
RETURNS 
@Resultado TABLE 
(
	vendedor_id int,
	vendedor_nome varchar(60),
	valorRecebido decimal(18,4),
	valorComissaoRecebimento decimal(18,4),
	percComissaoRecebimento decimal(18,4),
	valorGeracao decimal(18,4),
	valorComissaoGeracao decimal(18,4),
	percComissaoGeracao decimal(18,4),
	idnRecebimento bit,
	idnGeracao bit,
	idFatura int,
	idProdutoGrupo int,
	codigoAgrupamento varchar(100),
	dscAgrupamento varchar(500)
)
AS
BEGIN

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

	if (@idVendedorInf > 0)
		SET @idVendedor = @idVendedorInf;
	
	declare @GrupoProdutos TABLE
	(
		idProdutoGrupo int,
		codigoAgrupamento varchar(100),
		dscAgrupamento varchar(500),
		--idNotaFiscal int,
		idVendedor int,
		fantasia varchar(60),
		idFatura int,
		valor decimal(18,4),
		idnGeracao bit,
		idnRecebimento bit
	)
	
	BEGIN
		--Comissão do Recebimento por Grupo do Produto
		--(Não foi feito, pois precisa ser visto como fazer corretamente. Provavelmente deverá somar apenas quando a Fatura for totalmente quitada)
		--Exemplo: Venda de 2 produtos: 1 = R$ 100,00 - 2 = R$ 900,00. Gerado 2 parcelas de R$ 500,00. Como deverá ser calculado a comissão pelos produtos?
		/*INSERT INTO @GrupoProdutos
		select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.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)), 0, 1
		from FaturaParcelaPagamento fpp
		inner join FaturaParcela fp on fp.id = fpp.idFaturaParcela
		inner join Fatura f on f.id = fp.idFatura
		left join parceiro pa on pa.id = f.idVendedor
		inner join CaixaMovimento cm on cm.idFaturaParcelaPagamentoOrigem = fpp.id
		inner join notafiscal nf on nf.id = f.idNotaFiscal
		inner join NFProduto nfp on nfp.idNotaFiscal = nf.id
		inner join produto pr on pr.id = nfp.idProduto
		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 = '+'))*/
		
		
		--Comissão da Geração por Grupo do Produto
		INSERT INTO @GrupoProdutos
		select pr.idGrupo, pg.codigoAgrupamento, pg.dscAgrupamento, f.idVendedor, pa.fantasia, f.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)), 1, 0
		from NFProduto nfp
		inner join produto pr on pr.id = nfp.idProduto
		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
		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 = '+'))
	
		
		--Comissão do Recebimento
		INSERT INTO @Resultado
		select f.idVendedor, pa.fantasia, fpp.valor, 0, 0, 0, 0, 0, 1, 0, f.id, null, null, null
		from FaturaParcelaPagamento fpp
		inner join FaturaParcela fp on fp.id = fpp.idFaturaParcela
		inner join Fatura f on f.id = fp.idFatura
		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 (f.id not in (select idFatura from @GrupoProdutos))) --ignora os códigos das Faturas que já foram incluídas pelas vendas (Para não duplicar)


		--Comissão da Geração
		INSERT INTO @Resultado
		select f.idVendedor, pa.fantasia, 0, 0, 0, f.valor, 0, 0, 0, 1, f.id, null, null, null
		from Fatura f
		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 (f.id not in (select idFatura from @GrupoProdutos))) --ignora os códigos das Faturas que já foram incluídas pelas vendas (Para não duplicar)
		
		
		INSERT INTO @Resultado
		select p.idVendedor, p.fantasia, (case when p.idnRecebimento = 1 then p.valor else 0 end), 0, 0, 
		(case when p.idnGeracao = 1 then p.valor else 0 end), 0, 0, p.idnRecebimento, p.idnGeracao, p.idFatura, p.idProdutoGrupo, p.codigoAgrupamento, p.dscAgrupamento
		from @GrupoProdutos p
		
		
		--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 
		where (pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) and (pc.idnGeracao = 1) and (pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = idProdutoGrupo)), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where (pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) and (pc.idnRecebimento = 1) and (pc.idVendedor = vendedor_id) and (pc.idGrupoProduto = idProdutoGrupo)), 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 
		where ((pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) 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.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) 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 
		where (pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) and (pc.idnGeracao = 1) and (pc.idVendedor is null) and (pc.idGrupoProduto = idProdutoGrupo)), 0),
		percComissaoRecebimento = coalesce((select top 1 pc.percComissaoRecebimento from ParametrosComissoes pc 
		where (pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) and (pc.idnRecebimento = 1) and (pc.idVendedor is null) and (pc.idGrupoProduto = idProdutoGrupo)), 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 (pc.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) 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.idnComissaoDescontoVendas = 0 or pc.idnComissaoDescontoVendas is null) 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
		
	END
	
	RETURN 
END
GO
ALTER TABLE [dbo].[SpedIcmsCredito] ADD CONSTRAINT [FK_SpedIcmsCredito_emitente] FOREIGN KEY
	(
		[idFilial]
	)
	REFERENCES [dbo].[emitente]
	(
		[id]
	)
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO) VALUES(364, 622, GETDATE());