USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[classificacaotributaria] ADD 
[idConfiguracao] [int] NULL
GO
ALTER TABLE [dbo].[ContratoProduto] ADD 
[valorLocacao] [decimal] (18,4) NULL
GO
IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'dbo.CurvaABC') 
    AND xtype IN (N'TF')
)
    DROP FUNCTION [dbo].[CurvaABC]
GO
ALTER TABLE [dbo].[operacao] ADD 
[cfopInt] [varchar] (6) COLLATE Latin1_General_CI_AS NULL,
[cfopExt] [varchar] (6) COLLATE Latin1_General_CI_AS NULL
GO
ALTER FUNCTION [dbo].[EstoqueMovimento]
(
	@dataInf Date = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0,
	@dataInicial Date = null
)
RETURNS 
@Resultado TABLE 
(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),		
		numeroDocumento varchar(50) null,
		dscOperacao varchar(100),
		data datetime,
		idGrupo int,
		dscGrupo varchar(100),
		idNF int
)
AS
BEGIN

	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;

	--declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;

	--SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(idnConsiderarPedidosFaturadosNoEstoque, 0) from configuracoes)
	
	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;
	
	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarPedidosFaturadosNoEstoque'))

	
	if (@idContaInf > 0)
		SET @idConta = @idContaInf;
	
	if (@idProdutoClassificacaoInf > 0)
		SET @idProdutoClassificacao = @idProdutoClassificacaoInf;
	
	if (@idProdutoInf > 0)
		SET @idProduto = @idProdutoInf;
	
	if (@data is null)
		SET @data = (SELECT GETDATE());
			
	
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(240),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),		
		numeroDocumento varchar(50) null,
		dscOperacao varchar(100),
		data datetime,
		idNF int
	)
	
	--Notas de entrada / Saida
	INSERT INTO @ItensEntradaSaida
	select 
		np.idProduto, 
		np.idProdutoClassificacao, 
		(case when np.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when np.idProdutoClassificacao is not null then cast(pr.id as varchar(47)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(50)) end),
		(case when np.qcom > 0 then (coalesce(np.vuncom, 0) - coalesce(np.vdesc / np.qcom, 0)) else (coalesce(np.vuncom, 0) - coalesce(np.vdesc, 0)) end),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(np.ucom, '')),
		--Se não tem a quantidade real a ser considerada para o estoque, e as unidades de medida são diferentes, seleciona o fator de conversão
		(case when pr.ucom <> np.ucom and coalesce(np.qcomEstoque, 0) = 0 then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = np.idProduto) and (pu.unidadeMedida = np.ucom)) else 0 end) as fatorConversao,
		(case when 
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) * -1
			else
			(case when coalesce(np.qcomEstoque, 0) != 0 then np.qcomEstoque else np.qcom end) --Considera a quantidade a ser usada para o estoque caso tenha sido informada
			end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ecp.idConta, 
		ec.descricao,
		(case when nf.numero > 0 then nf.numero else nf.numeroMovimento end),
		op.descricao as dscOperacao,
		(case when nfc.dataEntradaEstoque is not null then cast(nfc.dataEntradaEstoque as date) else (cast(nf.dataEmissao as date)) end),
		nf.id
		from nfproduto np
		inner join notafiscal nf on nf.id = np.idNotaFiscal
		inner join nfemitente nfe on nfe.idnotafiscal = np.idnotafiscal
		inner join produto pr on pr.id = np.idProduto
		inner join operacao op on op.id = nf.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = nf.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join NFEstoqueContas nfc on nfc.idNotaFiscal = nf.id and nfc.idContaEstoque = ecp.idConta
		left join produtoClassificacao pc on pc.id = np.idProdutoClassificacao
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   (nf.nfeTpAmb = 1)
		--and   (cast(nf.dataEmissao as date) <= @data)
		and   ((case when nfc.dataEntradaEstoque is not null then cast(nfc.dataEntradaEstoque as date) else (cast(nf.dataEmissao as date)) end) <= @data)
		and   (((@dataInicial is not null) and ((case when nfc.dataEntradaEstoque is not null then cast(nfc.dataEntradaEstoque as date) else (cast(nf.dataEmissao as date)) end) >= @dataInicial)) or (@dataInicial is null))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (nfe.idEmitente = @idEmitente)		
		and   ((np.idProduto = @idProduto) or (@idProduto = 0))
		and   ((np.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and	  (coalesce(nf.idnIgnorarEstoque, 0) = 0)
		and ((coalesce(nfc.idnHabilitado, 0) = 1) or (nfc.id is null))
	
	--Ajustes de estoque
	INSERT INTO @ItensEntradaSaida
		select 
			ea.idProduto, 
			ea.idProdutoClassificacao,
			(case when ea.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when ea.idProdutoClassificacao is not null then cast(pr.id as varchar(20)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(20)) end),
			ea.unitario, 
			(case when ea.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(ea.unidadeMedida, '')),
			(case when pr.ucom <> ea.unidadeMedida then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = ea.idProduto) and (pu.unidadeMedida = ea.unidadeMedida)) else 0 end) as fatorConversao,
			(case when
				(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				ea.qtd * -1
				else
				ea.qtd end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ecp.idConta, 
			ec.descricao,
			ea.numeroDocumento,
			op.descricao as dscOperacao,
			ea.data,
			0
		from estoqueAjustes ea
		inner join produto pr on pr.id = ea.idProduto
		inner join operacao op on op.id = ea.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = ea.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = ea.idProdutoClassificacao
		left join notafiscal nf on nf.id = ea.idNotaFiscal
		where (cast(ea.data as date) <= @data)
		and   (((@dataInicial is not null) and (cast(ea.data as date) >= @dataInicial)) or (@dataInicial is null))
		and   (ea.idEmitente = @idEmitente)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((ea.idNotaFiscal is null) or (nf.nfeCstat = 100 or nf.nfeCstat = 150))
		
	--Produtos alocados nas ordens de servi?o
	INSERT INTO @ItensEntradaSaida
		select 
			osp.idProduto, 
			osp.idProdutoClassificacao,
			(case when osp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when osp.idProdutoClassificacao is not null then cast(pr.id as varchar(20)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(20)) end),
			osp.precoUnitario, 
			(case when osp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(osp.ucom, '')),
			(case when pr.ucom <> osp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = osp.idProduto) and (pu.unidadeMedida = osp.ucom)) else 0 end) as fatorConversao,
			(case when 
				(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
				osp.quantidade * -1 else osp.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			os.numeroOS,
			op.descricao,
			(case when osp.dataHora is not null then osp.dataHora else os.dataHora end),
			0
		from OrdemServicoProduto osp
		inner join produto pr on pr.id = osp.idProduto
		inner join OrdemServico os on os.id = osp.idOrdemServico
		inner join operacao op on op.id = os.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = os.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = osp.idProdutoClassificacao	
		where ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		and   (((@dataInicial is not null) and (cast(os.dataHora as date) >= @dataInicial)) or (@dataInicial is null))
		and   (os.idEmitente = @idEmitente)
		and   ((osp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((osp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((os.idnCancelada = 0) or (os.idnCancelada is null))
	
	--Pedidos
	INSERT INTO @ItensEntradaSaida
		select
		pp.idProduto,
		pp.idProdutoClassificacao,
		(case when pp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
		(case when pp.idProdutoClassificacao is not null then cast(pr.id as varchar(20)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(20)) end),
		pp.vuncom, 
		(case when pp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom then (select top 1 pu.fatorConversao from produtoUnidade pu where (pu.idProduto = pp.idProduto) and (pu.unidadeMedida = pp.ucom)) else 0 end) as fatorConversao,
		(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
			(pp.qcom - coalesce(pp.qtdFaturada, 0)) * -1
			else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao,
		(case when pe.numeroPedido is not null then cast(pe.numeroPedido as int) else null end),
		op.descricao as dscOperacao,
		pe.dataPedido,
		0
		from pedidoProduto pp
		inner join produto pr on pr.id = pp.idProduto
		inner join pedido pe on pe.id = pp.idPedido
		inner join operacao op on op.id = pe.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = pe.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = pp.idProdutoClassificacao
		where (cast(pe.dataPedido as date) <= @data)
		and   (((@dataInicial is not null) and (cast(pe.dataPedido as date) >= @dataInicial)) or (@dataInicial is null))
		--and   (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado))))
		and   ((@idnConsiderarPedidosFaturadosNoEstoque = 1) or (((pe.idnFaturado is null) or (pe.idnFaturado = 0)) or ((coalesce(pe.idnFaturado, 0) <> 0) and (pe.id not in (select idPedido from pedidoFaturado)))))
		and   ((pe.idnCancelado is null) or (pe.idnCancelado = 0))
		and   (pe.idEmitente = @idEmitente)
		and   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and	  (coalesce(pe.idnIgnorarEstoque, 0) = 0)
		and   ((ecp.idConta = @idConta) or (@idConta = 0))	
		
	--Condicional
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao is not null then cast(pr.id as varchar(20)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(20)) end),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      (cp.qcom - (coalesce(cp.qtdDevolucao, 0)  + coalesce(cp.qtdFaturada, 0))) * -1
		      else (cp.qcom - (coalesce(cp.qtdDevolucao, 0)  + coalesce(cp.qtdFaturada, 0))) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			(case when co.numero is not null then cast(co.numero as int) else null end),
			op.descricao as dscOperacao,
			co.dataEmissao,
			0
		from CondicionalProduto cp
		inner join produto pr on pr.id = cp.idProduto
		inner join Condicional co on co.id = cp.idCondicional		
		inner join operacao op on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = co.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.dataEmissao as date) <= @data)
		and   (((@dataInicial is not null) and (cast(co.dataEmissao as date) >= @dataInicial)) or (@dataInicial is null))
		and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and   ((ecp.idConta = @idConta) or (@idConta = 0))

	--Consignacao
	INSERT INTO @ItensEntradaSaida
		select 
			cp.idProduto, 
			cp.idProdutoClassificacao,
			(case when cp.idProdutoClassificacao is not null then pr.descricao + ' - ' + coalesce(pc.descricao, '') else pr.descricao end),
			(case when cp.idProdutoClassificacao is not null then cast(pr.id as varchar(20)) + replace((case when pc.sequencia > 999 then STR(pc.sequencia, 4) else STR(pc.sequencia, 3) end), space(1), '0') else cast(pr.id as varchar(20)) end),
			cp.vuncom, 
			(case when cp.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
			upper(coalesce(pr.ucom, '')),
			upper(coalesce(cp.ucom, '')),
			0 as fatorConversao,
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then
		      cp.qcom * -1
		      else cp.qcom end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
			ec.id,
			ec.descricao,
			(case when co.numeroConsignacao is not null then cast(co.numeroConsignacao as int) else null end),
			op.descricao as dscOperacao,
			co.data,
			0
		from ConsignacaoProduto cp
		inner join produto pr on pr.id = cp.idProduto
		inner join Consignacao co on co.id = cp.idConsignacao		
		inner join operacao op on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp on ecp.idOperacao = co.idOperacao
		inner join EstoqueConta ec on ec.id = ecp.idConta
		left join ProdutoClassificacao pc on pc.id = cp.idProdutoClassificacao	
		where (cast(co.data as date) <= @data)
		and   (((@dataInicial is not null) and (cast(co.data as date) >= @dataInicial)) or (@dataInicial is null))
		--and   ((co.idnFechado is null) or (co.idnFechado = 0))
		and   (co.idEmitente = @idEmitente)
		and   ((cp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((cp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)		
		and   ((ecp.idConta = @idConta) or (@idConta = 0))		

	--atualiza a qtd e o preço dos produtos com unidade de medida diferente da definida no cadastro e efetua a conversão conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao, preco = preco / fatorConversao
	WHERE (unidadeMedidaConvertida <> '')
	and (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		SELECT ies.idProduto,
			   ies.idProdutoClassificacao,
			   ies.dscProduto,
			   ies.codigoProdutoClasse,
			   ies.preco,
			   ies.precoCadastro,
			   ies.unidadeMedida,
			   ies.unidadeMedidaConvertida,
			   ies.fatorConversao,
			   ies.qtd,
			   ies.idOperacao,
			   ies.idnOperacao,
			   ies.idConta,
			   ies.dscConta,
			   ies.numeroDocumento,
			   ies.dscOperacao,
			   ies.data,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idNF
	from @ItensEntradaSaida ies
	inner join produto pr on pr.id = ies.idProduto
	left join produtoGrupo pg on pg.id = pr.idGrupo
	order by ies.data
	
	RETURN 
END
GO
CREATE FUNCTION [dbo].[CurvaABC]
(
	@dataIni datetime,
	@dataFin datetime,
	@idEmitente int = 0,
	@porcTipoAInf decimal(18,4),
	@porcTipoBInf decimal (18,4)
)
RETURNS 
@Resultado TABLE 
(
		emitente varchar(500),
		--dataVenda datetime,
		descricaoProduto varchar(500),
		unidadeMedida varchar(30),
		quantidade decimal(18,4),
		valorProduto decimal(18,4),
		tipoABC char
)
AS
BEGIN	
	
	declare @ABC TABLE
	(
		emitente varchar(500),
		--dataVenda datetime,
		descricaoProduto varchar(500),
		unidadeMedida varchar(30),
		quantidade decimal(18,4),
		valorProduto decimal(18,4),
		tipoABC char,
		contadorLinhas int,
		totalLinhas int
	)

	insert into @ABC select nfem.razaosocial, 
		--case when nf.dataCompetencia is not null then nf.dataCompetencia when nf.dataEmissaoNotaFiscal is not null then nf.dataEmissaoNotaFiscal else nf.dataEmissao END, 
		nfp.descricao, nfp.ucom, sum(nfp.qcom), sum(nfp.vprod),
		null, ROW_NUMBER() OVER (ORDER BY sum(nfp.qcom) DESC) AS RowNumber, 0
		from nfproduto nfp
		inner join notafiscal nf on nf.id = nfp.idNotaFiscal
		inner join operacao op on op.id = nf.idOperacao
		inner join nfEmitente nfem on nfem.idNotaFiscal = nf.id
		where cast(nf.dataEmissao as date) between @dataIni and @dataFin
		and (nf.tipodocumento = 1)
		and (op.idnCompraVenda = 1)
		and (nf.nfeCstat in (100,150))
		and (nf.nfetpamb = 1)
		group by nfp.descricao, nfp.ucom, nfem.razaosocial
		order by sum(nfp.qcom) DESC
	
	update @ABC set totalLinhas = (select max(contadorLinhas) from @ABC)
	update @ABC set tipoABC = 'A' where contadorLinhas <= (select totalLinhas * @porcTipoAInf /100)
	update @ABC set tipoABC = 'B' where contadorLinhas <= (select totalLinhas * (@porcTipoBInf+ @porcTipoAInf) /100) and tipoABC is null
	update @ABC set tipoABC = 'C' where tipoABC is null

	insert into @Resultado select emitente,descricaoProduto, unidadeMedida, quantidade, valorProduto, tipoABC from @ABC

	RETURN 
END
GO
INSERT [dbo].[Dashboard] ([descricao], [idDashboardGrupo], [xml]) VALUES (N'Curva ABC', 1, N'<Dashboard CurrencyCulture="pt-BR"><Title Text="Dashboard" /><DataSources><SqlDataSource Name="Fonte de dados SQL 1" ComponentName="dashboardSqlDataSource1"><Connection Name="localhost_Closing_Connection" ProviderKey="MSSqlServer"><Parameters><Parameter Name="server" Value="localhost" /><Parameter Name="database" Value="TryNFeOnline" /><Parameter Name="useIntegratedSecurity" Value="True" /><Parameter Name="read only" Value="1" /><Parameter Name="generateConnectionHelper" Value="false" /><Parameter Name="userid" Value="" /><Parameter Name="password" Value="" /></Parameters></Connection><Query Type="CustomSqlQuery" Name="Query"><Parameter Name="dataIni" Type="DevExpress.DataAccess.Expression">(System.DateTime)(?DataInicial)</Parameter><Parameter Name="dataFin" Type="DevExpress.DataAccess.Expression">(System.DateTime)(?DataFinal)</Parameter><Parameter Name="idEmitente" Type="DevExpress.DataAccess.Expression">(System.Int32)(?idEmitente)</Parameter><Parameter Name="porcTipoA" Type="DevExpress.DataAccess.Expression">(System.Decimal)(?PorcentagemTipoA)</Parameter><Parameter Name="porcTipoB" Type="DevExpress.DataAccess.Expression">(System.Decimal)(?PorcentagemTipoB)</Parameter><Sql>select * from CurvaABC(@dataIni,@dataFin,@idEmitente,@porcTipoA,@porcTipoB)</Sql></Query><ResultSchema><DataSet Name="Fonte de dados SQL 1"><View Name="Query"><Field Name="emitente" Type="String" /><Field Name="descricaoProduto" Type="String" /><Field Name="unidadeMedida" Type="String" /><Field Name="quantidade" Type="Decimal" /><Field Name="valorProduto" Type="Decimal" /><Field Name="tipoABC" Type="String" /></View></DataSet></ResultSchema><ConnectionOptions CloseConnection="true" DbCommandTimeout="2500" /></SqlDataSource></DataSources><Parameters><Parameter Name="DataInicial" Type="System.DateTime" Value="2020-01-01T00:00:00" Description="DataInicial" /><Parameter Name="DataFinal" Type="System.DateTime" Value="2023-12-01T00:00:00" Description="DataFinal" /><Parameter Name="idEmitente" Type="System.Int32" Value="0" Description="idEmitente" /><Parameter Name="PorcentagemTipoA" Type="System.Decimal" Value="20" Description="Porcentagem Tipo A" /><Parameter Name="PorcentagemTipoB" Type="System.Decimal" Value="30" Description="Porcentagem Tipo B" /></Parameters><Items><Grid ComponentName="gridDashboardItem1" Name="Grade de Produtos" DataSource="dashboardSqlDataSource1" DataMember="Query"><InteractivityOptions MasterFilterMode="Multiple" /><DataItems><Dimension DataMember="descricaoProduto" DefaultId="DataItem0" /><Dimension DataMember="tipoABC" DefaultId="DataItem1" /><Measure DataMember="valorProduto" DefaultId="DataItem2"><NumericFormat FormatType="Currency" Unit="Ones" /></Measure><Measure DataMember="quantidade" DefaultId="DataItem3"><NumericFormat FormatType="Number" Unit="Ones" /></Measure></DataItems><GridColumns><GridDimensionColumn Name="Produto"><Dimension DefaultId="DataItem0" /></GridDimensionColumn><GridDimensionColumn Name="Classificação ABC"><Dimension DefaultId="DataItem1" /></GridDimensionColumn><GridMeasureColumn Name="Quantidade"><Measure DefaultId="DataItem3" /></GridMeasureColumn><GridMeasureColumn Name="Valor"><Measure DefaultId="DataItem2" /></GridMeasureColumn></GridColumns><GridOptions ColumnWidthMode="Manual" /></Grid><Pie ComponentName="pieDashboardItem1" Name="Curva ABC Baseada no Valor Faturado por Tipo" DataSource="dashboardSqlDataSource1" DataMember="Query"><InteractivityOptions MasterFilterMode="Multiple" /><DataItems><Dimension DataMember="tipoABC" DefaultId="DataItem0" /><Measure DataMember="valorProduto" Name=" " DefaultId="DataItem1" /></DataItems><Arguments><Argument DefaultId="DataItem0" /></Arguments><Values><Value DefaultId="DataItem1" /></Values></Pie><Pie ComponentName="pieDashboardItem2" Name="Curva ABC Baseada na Quantidade de Produtos por Tipo" DataSource="dashboardSqlDataSource1" DataMember="Query"><InteractivityOptions MasterFilterMode="Multiple" /><DataItems><Dimension DataMember="tipoABC" DefaultId="DataItem1" /><Measure DataMember="descricaoProduto" Name=" " SummaryType="Count" DefaultId="DataItem0" /></DataItems><Arguments><Argument DefaultId="DataItem1" /></Arguments><ColorScheme><Entry DataSource="dashboardSqlDataSource1" DataMember="Query" Color="-2807267"><DimensionKeys><DimensionKey><Definition DataMember="tipoABC" /><Value Type="System.String" Value="A" /></DimensionKey></DimensionKeys></Entry><Entry DataSource="dashboardSqlDataSource1" DataMember="Query" Color="-14430159"><DimensionKeys><DimensionKey><Definition DataMember="tipoABC" /><Value Type="System.String" Value="B" /></DimensionKey></DimensionKeys></Entry><Entry DataSource="dashboardSqlDataSource1" DataMember="Query" Color="-13224755"><DimensionKeys><DimensionKey><Definition DataMember="tipoABC" /><Value Type="System.String" Value="C" /></DimensionKey></DimensionKeys></Entry></ColorScheme><Values><Value DefaultId="DataItem0" /></Values></Pie></Items><LayoutTree><LayoutGroup Weight="100"><LayoutItem DashboardItem="gridDashboardItem1" Weight="44.8443579766537" /><LayoutGroup Orientation="Vertical" Weight="55.1556420233463"><LayoutItem DashboardItem="pieDashboardItem2" Weight="49.922958397534671" /><LayoutItem DashboardItem="pieDashboardItem1" Weight="50.077041602465329" /></LayoutGroup></LayoutGroup></LayoutTree></Dashboard>')
GO
UPDATE classificacaotributaria SET idConfiguracao = id
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression]) VALUES ('idnObrigarInserirCentrosCustoFatura', 'Exigir inserir os Centros de Custo na Fatura', 'Selecione esta opção quando desejar que seja obrigatório a inclusão do Centro de Custo no cadastro da Fatura. Esta opção permite o correto controle, evitando um possível "esquecimento" na inclusão do Centro de Custo desejado.', 'bool', 'False', 'Geral', 'Configurações Gerais',null,0,0,0,1,0,null,null,null)
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression]) VALUES ('idnHabilitarCampoIndTotalProduto', 'Habilitar o campo "Valor do Produto NÃO compõe o total da nota"', 'Selecione esta opção quando desejar habilitar o campo mencionado, na tela de Cadastro do Produto, e ao editar o item na Nota Fiscal.', 'bool', 'False', 'Geral', 'Configurações do Produto',null,0,0,0,0,0,null,null,null)
GO
UPDATE selecao SET filtro = '(coalesce(idnInativo, 0) = 0)' where tabela = 'CustoComposicao'
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO, REVISAO) VALUES(480, 738, GETDATE(),1);