USE [TryNFeOnline]
GO

ALTER TABLE [dbo].[Fatura] ADD 
[idRepresentante] [int] NULL,
[idnGeradaAutomaticamente] [bit] NULL
GO
ALTER TABLE [dbo].[MDeConsultaNFe] ADD 
[chaveNFe] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
GO
CREATE TABLE [dbo].[MDeEventoAtorInteressado]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idEmitente] [int] NULL,
	[dataEvento] [datetime] NOT NULL,
	[tpAmb] [int] NULL,
	[nfeChave] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
	[cOrgao] [int] NULL,
	[cpfCnpjAutor] [varchar] (20) COLLATE Latin1_General_CI_AS NULL,
	[tpEvento] [varchar] (10) COLLATE Latin1_General_CI_AS NULL,
	[nSeqEvento] [int] NULL,
	[descEvento] [varchar] (100) COLLATE Latin1_General_CI_AS NULL,
	[cOrgaoAutor] [int] NULL,
	[tpAutor] [int] NULL,
	[cpfCnpjAutorizado] [varchar] (20) COLLATE Latin1_General_CI_AS NULL,
	[tpAutorizacao] [int] NULL,
	[xCondUso] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[Acao] [int] NULL,
	[cStat] [int] NULL,
	[xMotivo] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[verAplic] [varchar] (30) COLLATE Latin1_General_CI_AS NULL,
	[cStatEvento] [int] NULL,
	[xMotivoEvento] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	[dhRegEvento] [datetime] NULL,
	[nProt] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
	[xmlEnvio] [varchar] (max) COLLATE Latin1_General_CI_AS NULL,
	[xmlRetorno] [varchar] (max) COLLATE Latin1_General_CI_AS NULL,
	[numeroNFe] [int] NULL,
	CONSTRAINT [PK_MDeEventoAtorInteressado] 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 PROCEDURE [dbo].[TRYNFE_OBTERNOTAS]
  (
	-- Add the parameters for the stored procedure here
	@SERVICO_IN int
   )	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	declare @Resultado TABLE
	(
		NOTA_ID int,
		SERVICO int,
		NUM_RECIBO varchar(30),
		TP_AMB int,
		CODFILIAL int,
		CUF int,
		TP_EMIS int,
		idnEmiteNF bit,
		idnEmiteCte bit,
		idnEmiteMdfe bit,
		idnEmiteNFSe bit,
		idnEmiteNFCe bit,
		idnEmiteMDe bit,
		idnEmiteCTeOS bit,
		PADRAO_NFSe varchar(50),
		idnNovaVersao bit,
		versaoNFe int,
		versaoCTe int
	)
	
	if ((@SERVICO_IN = 0) or (@SERVICO_IN = 1)) 
	begin
				/*NOTA_ID int,
		SERVICO int,
		NUM_RECIBO varchar(30),
		TP_AMB int,
		CODFILIAL int,
		CUF int,
		TP_EMIS int*/
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 1 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 1)--Enviar Nota
		and   ((nf.idnEmiteNF = 1) or (nf.idnEmiteCte = 1) or (nf.idnEmiteCTeOS = 1) or (nf.idnEmiteMDFe = 1) or (nf.idnEmiteNFSe = 1) or (nf.idnEmiteNFCe = 1))

		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 21 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 21) --EPEC
		and   ((nf.idnEmiteNF = 1) or (nf.idnEmiteCte = 1) or (nf.idnEmiteMDFe = 1) or (nf.idnEmiteNFCe = 1))
				
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 2 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id 
		where (nf.nfeAcao = 2) --Cancelar Nota
		and   ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and   ((nf.idnEmiteNF = 1) or (nf.idnEmiteCte = 1) or (nf.idnEmiteCTeOS = 1) or (nf.idnEmiteMDFe = 1) or (nf.idnEmiteNFSe = 1) or (nf.idnEmiteNFCe = 1))
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 6 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id 		
		where (nf.nfeAcao = 6) --Verifica situa??o da nfe
		and   ((nf.idnEmiteNF = 1) or (nf.idnEmiteCte = 1) or (nf.idnEmiteCTeOS = 1) or (nf.idnEmiteMDFe = 1) or (nf.idnEmiteNFSe = 1) or (nf.idnEmiteNFCe = 1))
		
		INSERT INTO @Resultado
		select ni.id as NOTA_ID, 3 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ni.idemitente as CODFILIAL, null as CUF, null as TP_EMIS, ni.idnEmiteNF, ni.idnEmiteCte, 0, 0, ni.idnEmiteNFCe, 0, ni.idnEmiteCTeOS, null as PADRAO_NFSe, 1, 4, 4
		from inutilizacao ni
		where (ni.cstat is null) -- Se algum status j? foi definido, indica que o servi?o j? obteve uma resposta...
						
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 8 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, 0, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 100)    --Notas Recebidas
		and   (nf.idnEmiteNF = 0)
		
		INSERT INTO @Resultado
		select cc.id as NOTA_ID, 9 as SERVICO, null as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from nfCCe cc --Carta Correcao
		inner join notafiscal nf on nf.id = cc.idNotaFiscal
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id
		where (cc.cStat is null)
		
		INSERT INTO @Resultado
		select ev.id as NOTA_ID, 9 as SERVICO, null as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from NFEvento ev --Carta correcao
		inner join notafiscal nf on nf.id = ev.idNotaFiscal
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id
		where (ev.Acao = 1)

		INSERT INTO @Resultado
		select pd.id as NOTA_ID, 10 as SERVICO, null, pd.tpAmb, pd.idFilial, null, null, 0, 1, 0, 0, 0, 0, 0, null, 0, 4, coalesce(em.versaoCTe, 4)
		from ctePrestacaoDesacordo pd --Prestacao de Servico em Desacordo CTe
		inner join emitente em on em.id = pd.idFilial
		where (pd.cStat is null)
		
		INSERT INTO @Resultado
		select condutor.id as NOTA_ID, 11 as SERVICO, null as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from mdfeInclusaoCondutor condutor
		inner join notafiscal nf on nf.id = condutor.idNotaFiscal
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id
		where (condutor.cStat is null) --Evento de Inclusao de Condutor MDFe
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 12 as SERVICO, null as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL, 
		null as CUF, null as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id 		
		where (nf.nfeAcao = 12) --Evento Encerramento MDFe
		and (nf.idnEmiteMDFe = 1)

		INSERT INTO @Resultado
		select pagto.id as NOTA_ID, 13 as SERVICO, null as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from mdfeMrPagamentoFrete pagto
		inner join mdfeModalRodoviario m on m.id = pagto.idModalRodoviario
		inner join notafiscal nf on nf.id = m.idNotaFiscal
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id
		where (pagto.cStat is null) --Evento de Pagamento da Operacao de Transporte do MDFe
		and (pagto.idnEvento = 1)
		
		INSERT INTO @Resultado
		select mde.id as NOTA_ID, 15 as SERVICO, null as NUM_RECIBO, mde.tpAmb as TP_AMB, mde.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, 0, 0, 0, 0, 0, 1, 0, null as PADRAO_NFSe, 0, 4, 4
		from MDeConsultaNFe mde
		where (mde.acao = 1) --Consultar Notas Manifestacao
		and ((mde.dataHoraConsultar <= GETDATE()) or (mde.dataHoraConsultar is null))
		
		INSERT INTO @Resultado
		select ev.id as NOTA_ID, 16 as SERVICO, null as NUM_RECIBO, mde.tpAmb as TP_AMB, cons.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, 0, 0, 0, 0, 0, 1, 0, null as PADRAO_NFSe, 0, 4, 4
		from MDeEvento ev
		inner join MDeNotas mde on mde.id = ev.idMDeNota
		inner join MDeConsultaNFe cons on cons.id = mde.idMDeConsulta
		where (ev.Acao = 1) --Eventos Manifestacao Destinatario
		
		INSERT INTO @Resultado
		select mde.id as NOTA_ID, 17 as SERVICO, null as NUM_RECIBO, mde.tpAmb as TP_AMB, mde.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, 0, 0, 0, 0, 0, 1, 0, null as PADRAO_NFSe, 0, 4, 4
		from MDeDownloadNFe mde
		where (mde.Acao = 1) --Download XML
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 18 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 18) --Consultar Situacao Lote NFSe
		and   (nf.idnEmiteNFSe = 1)
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 19 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 19) --Consultar NFSe por RPS
		and   (nf.idnEmiteNFSe = 1)
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 20 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, nf.NFSePadrao as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id   
		where (nf.nfeAcao = 20) --Consultar URL NFSe
		and   (nf.idnEmiteNFSe = 1)
		
		INSERT INTO @Resultado
		select en.id as NOTA_ID, 22 as SERVICO, null as NUM_RECIBO, en.tpAmb as TP_AMB,
		en.idEmitente as CODFILIAL, null as CUF, null as TP_EMIS, 0, 0, 1, 0, 0, 0, 0, null as PADRAO_NFSe, 0, 4, 4
		from mdfeEncerrar en
		where (en.acao = 1) --Encerrar MDFe nao lancada sistema
		
		INSERT INTO @Resultado
		select nf.id as NOTA_ID, 23 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
		ne.idEmitente as CODFILIAL, null as CUF, nf.tpEmis as TP_EMIS, nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
		from notafiscal nf
		inner join nfEmitente ne on ne.idNotaFiscal = nf.id
		where (nf.nfeAcao = 23) --Duplicar nota
		and   ((nf.idnEmiteNF = 1) or (nf.idnEmiteCte = 1) or (nf.idnEmiteMDFe = 1) or (nf.idnEmiteNFCe = 1))
		
		INSERT INTO @Resultado
		select pd.id as NOTA_ID, 24 as SERVICO, null, pd.tpAmb, pd.idFilial, null, null, 0, 1, 0, 0, 0, 0, 0, null, 0, 4, coalesce(em.versaoCTe, 4)
		from ctePrestacaoDesacordo pd --Cancelar evento Prestacao Servico em Desacordo CTe
		inner join emitente em on em.id = pd.idFilial
		where (pd.acao = 2)

		INSERT INTO @Resultado
		select ev.id as NOTA_ID, 25 as SERVICO, null as NUM_RECIBO, ev.tpAmb as TP_AMB, ev.idEmitente as CODFILIAL,
		null as CUF, null as TP_EMIS, 0, 0, 0, 0, 0, 1, 0, null as PADRAO_NFSe, 0, 4, 4
		from MDeEventoAtorInteressado ev --Evento Ator Interessado
		where (ev.Acao = 1)
		
		SELECT * from @Resultado
		
	end
	
	if ((@SERVICO_IN = 0) or (@SERVICO_IN = 2))
	begin	    
			/*NOTA_ID int,
		SERVICO int,
		NUM_RECIBO varchar(30),
		TP_AMB int,
		CODFILIAL int,
		CUF int,
		TP_EMIS int*/
		INSERT INTO @Resultado
	    select nf.id, 5 as SERVICO, nf.nfeNrec as NUM_RECIBO, nf.nfeTpAmb as TP_AMB, ne.idEmitente as CODFILIAL,
	    es.codnacional as CUF, nf.tpEmis as TP_EMIS,  nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
	    from notafiscal nf
	    inner join nfEmitente ne on ne.idNotaFiscal = nf.id
	    inner join cidade ci on ci.id = ne.idCidade
		inner join estado es on es.UF = ci.uf and es.idPais = ci.idPais	    	    
	    where (nf.nfeAcao = 5) --Acao 5 ? pra verificar o status da nota..
	    and   (nf.nfeNrec is not null)
	    and   (nf.nfeCstat in (103,104,105))
	    and   (DATEDIFF(SECOND, coalesce(nf.dataAtualizacaoStatusNota, convert(date, GETDATE())), GETDATE()) > 15)
	    
	    select * from @Resultado
	end	

	if ((@SERVICO_IN = 0) or (@SERVICO_IN = 4))
	begin		
	  INSERT INTO @Resultado
	  select nf.id as NOTA_ID, 4 as SERVICO, null as NUM_RECIBO, null as TP_AMB,
	  ne.idEmitente as CODFILIAL, null as CUF, null as TP_EMIS,  nf.idnEmiteNF, nf.idnEmiteCte, nf.idnEmiteMDFe, nf.idnEmiteNFSe, nf.idnEmiteNFCe, 0, nf.idnEmiteCTeOS, null as PADRAO_NFSe, nf.idnNovaVersaoCTe, nf.versaoNFeNFCe, nf.versaoCTeCTeOS
	  from notafiscal nf
	  inner join nfEmitente ne on ne.idNotaFiscal = nf.id
      where (nf.nfeAcao = 4)
    end	
END
GO
ALTER FUNCTION [dbo].[EstoqueProdutos] 
(
	@dataInf Datetime = null,
	@idEmitenteInf int,
	@idProdutoInf int = 0,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0, 
	@idGrupoInf int = 0,
	@idnMostrarProdutosBaixadosInf bit = 0,
	@idnMostrarProdutosQtdNegativaInf bit = 1,
	@idMarcaInf int = 0
)
RETURNS 
@Resultado TABLE 
(
		rowNumber int,
		idProduto int,
		idProdutoClassificacao int NULL,
		sequenciaClassificacao int NULL,
		dscProdutoClasse varchar(500),
		qtd decimal(18,4),
		unidadeMedida varchar(30),
		codigoProdutoClasse varchar(50),
		codigoProdutoNF varchar(60),
		precoCadastro decimal(18,4),
		precoEntradaCadastro decimal(18,4),
		idGrupo int null,
		dscGrupo varchar(100) null,
		idConta int,
		dscConta varchar(200),
		precoCalculado decimal(28,10),
		custoCalculado decimal(18,4),
		refFabrica varchar(50),
		idMarca int,
		dscMarca varchar(200),
		dscGenero varchar(200),
		tipoItem varchar(4),
		qtdMinimaEstoque decimal(18,4),
		idFornecedor int,
		idEmitente int NULL,
		alturaMM int,
		comprimentoMM int,
		larguraMM int,
		peso decimal(18,4),
		pesoBruto decimal(18,4),
		idnPrecoOferta bit,
		custoCalculadoLetras varchar(50),
		precoMinimo decimal(28,10),
		custoContabil decimal(18,4)
)
AS
BEGIN
	
	declare @data datetime = @dataInf;
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = 0;
	declare @idProdutoClassificacao int = 0;
	declare @idConta int = 0;
	declare @idGrupo int = 0;
	declare @idnMostrarProdutosBaixados bit = @idnMostrarProdutosBaixadosInf;
	declare @idnMostrarProdutosQtdNegativa bit = @idnMostrarProdutosQtdNegativaInf;		
	declare @idMarca int = @idMarcaInf;
	
	if (@idGrupoInf > 0)
		SET @idGrupo = @idGrupoInf;
	
	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 @exibirCustoLetras bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnMostrarCustoEmLetras'))
	
	declare @idnConsiderarHoraNoEstoque bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarHoraNoEstoque'))
	
	declare @idnConsiderarPedidosFaturadosNoEstoque bit = 0;
	
	SET @idnConsiderarPedidosFaturadosNoEstoque = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarPedidosFaturadosNoEstoque'))
	
	declare @idnConsiderarDataEntregaPedidoNoEstoque bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarDataEntregaPedidoEstoque'));
	
	declare @idnConsiderarQtdConvertidaPedidoNoEstoque bit = (select coalesce(valor, 'false') from ConfiguracoesValorParametro('idnConsiderarQtdConvertidaPedidoEstoque'));

	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(500),
		codigoProdutoClasse varchar(50),
		preco decimal(18,4),
		precoCadastro decimal(18,4),
		precoEntradaCadastro 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)		
	)
	
	--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),
		coalesce(np.vuncom, 0),
		(case when np.idProdutoClassificacao is not null then (case when pc.vuncom > 0 then pc.vuncom else pr.vuncom end) else pr.vuncom end),
		(case when np.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada 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
		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 
		left join NFEstoqueContas nfc on nfc.idNotaFiscal = nf.id and nfc.idContaEstoque = ecp.idConta
		inner join EstoqueConta ec on ec.id = 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 
		(case when @idnConsiderarHoraNoEstoque = 1 then nfc.dataEntradaEstoque else cast(nfc.dataEntradaEstoque as date) end) else 
		((case when @idnConsiderarHoraNoEstoque = 1 then nf.dataEmissao else cast(nf.dataEmissao as date) end)) end) <= @data)
		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   ((np.idnItemCanceladoCF is null) or (np.idnItemCanceladoCF != 1))
		and   (pr.idnControlaEstoque = 1)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((coalesce(nfc.idnHabilitado, 0) = 1) or (nfc.id is null))
		and	  (coalesce(nf.idnIgnorarEstoque, 0) = 0)
	
	--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),
			(case when ea.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada 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
		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 ((case when @idnConsiderarHoraNoEstoque = 1 then ea.data else cast(ea.data as date) end) <= @data)
		and   (ea.idEmitente = @idEmitente)
		and   ((ea.idProduto = @idProduto) or (@idProduto = 0))
		and   ((ea.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   (pr.idnControlaEstoque = 1)
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		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),
			(case when osp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada 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
		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 
			(case when @idnConsiderarHoraNoEstoque = 1 then osp.dataHora else cast(osp.dataHora as date) end) else (case when @idnConsiderarHoraNoEstoque = 1 then os.datahora else cast(os.dataHora as date) end) end) <= @data)
		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 ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		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),
		(case when pp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada end),
		upper(coalesce(pr.ucom, '')),
		upper(coalesce(pp.ucom, '')),
		(case when pr.ucom <> pp.ucom and (@idnConsiderarQtdConvertidaPedidoNoEstoque = 0 or (@idnConsiderarQtdConvertidaPedidoNoEstoque = 1 and (coalesce(pp.qcomEstoque, 0) = 0))) 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 @idnConsiderarQtdConvertidaPedidoNoEstoque = 0 then (pp.qcom - coalesce(pp.qtdFaturada, 0)) 
		when @idnConsiderarQtdConvertidaPedidoNoEstoque = 1 and (coalesce(pp.qcomEstoque, 0) > 0) then (pp.qcomEstoque - (pp.multiplicadorQtd * coalesce(pp.qtdFaturada, 0))) 
		else (pp.qcom - coalesce(pp.qtdFaturada, 0)) end) *
			(case when (case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end) = '-' then -1 else 1 end),
		pe.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end),
		ec.id,
		ec.descricao
		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 ((case when @idnConsiderarHoraNoEstoque = 1 then (case when @idnConsiderarDataEntregaPedidoNoEstoque = 0 then pe.dataPedido when @idnConsiderarDataEntregaPedidoNoEstoque = 1 and pe.dataEntrega is not null then pe.dataEntrega else pe.dataPedido end) else cast((case when @idnConsiderarDataEntregaPedidoNoEstoque = 0 then pe.dataPedido when @idnConsiderarDataEntregaPedidoNoEstoque = 1 and pe.dataEntrega is not null then pe.dataEntrega else pe.dataPedido end) as date) end) <= @data)
		--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.idnProducao = 1)
		or (((pe.idnProducao is null) or (pe.idnProducao = 0)) and ((op.idnConsiderarEstoqueApenasPedidoEmProducao is null) or (op.idnConsiderarEstoqueApenasPedidoEmProducao = 0))))
		and   (pe.idEmitente = @idEmitente)
		and   ((pp.idProduto = @idProduto) or (@idProduto = 0))
		and   ((pp.idProdutoClassificacao = @idProdutoClassificacao) or (@idProdutoClassificacao = 0))
		and   ((pp.idnCancelado is null) or (pp.idnCancelado = 0))
		and   ((op.idnNaoCalcularEstoque is null) or (op.idnNaoCalcularEstoque = 0))
		and   (pr.idnControlaEstoque = 1)
		and	  (coalesce(pe.idnIgnorarEstoque, 0) = 0)
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,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),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada 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)) * -1
		      else (cp.qcom - coalesce(cp.qtdDevolucao, 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
		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 ((case when @idnConsiderarHoraNoEstoque = 1 then co.dataEmissao else cast(co.dataEmissao as date) end) <= @data)
		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 ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))
		
	--Consignacao (Só existe entrada no caso da consignação
	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),
			(case when cp.idProdutoClassificacao is not null then (case when pc.precoEntrada > 0 then pc.precoEntrada else pr.precoEntrada end) else pr.precoEntrada 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
		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 ((case when @idnConsiderarHoraNoEstoque = 1 then co.data else cast(co.data as date) end) <= @data)
		--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 ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pr.idnBaixa,0) = 0))
		and ((@idnMostrarProdutosBaixados = 1) OR (coalesce(pc.idnBaixado,0) = 0))
		and   ((ecp.idConta = @idConta) or (@idConta = 0))


	--atualiza a qtd dos produtos com unidade de medida diferente da definida no cadastro e efetua a convers?o conforme multiplicador	
	UPDATE @ItensEntradaSaida set qtd = qtd * fatorConversao												
	WHERE (unidadeMedidaConvertida <> '')
	and   (unidadeMedida <> unidadeMedidaConvertida)
	and (fatorConversao > 0)
	
	INSERT INTO @Resultado
		select /*case when @exibirCustoLetras = 1 then ROW_NUMBER() OVER (ORDER BY ies.idProduto) else 0 end*/
			   0,
			   ies.idProduto, 
			   ies.idProdutoClassificacao,
			   pc.sequencia,
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProdutoClasse,
			   (case when pr.codigoNotaFiscal != '' then pr.codigoNotaFiscal else ies.codigoProdutoClasse end),
			   ies.precoCadastro,
			   ies.precoEntradaCadastro,
			   pr.idGrupo,
			   pg.descricao,
			   ies.idConta,
			   ies.dscConta,
			   (select top 1 coalesce(valor, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as precoCalculado,
			   (select top 1 coalesce(valor, 0) from CustoProdutoData(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)) as custoCalculado,
			   (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end),
			   pr.idMarca,
			   mc.descricao as dscMarca,
			   pgen.descricao,
			   pr.tipoItem,
			   coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0),
			   pr.idFornecedor,
			   pr.idEmitente,
			   coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0),
			   coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0),
			   coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0),
			   coalesce(pr.pesoProduto, 0),
			   coalesce(pr.pesoBrutoProduto, 0),
			   (select top 1 coalesce(idnOferta, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)),
			   '',
			   (select top 1 coalesce(valorMinimo, 0) from PrecoProduto(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data)),
			   (select top 1 coalesce(custoContabil, 0) from CustoProdutoData(@idEmitente, ies.idProduto, ies.idProdutoClassificacao, @data))
		from @ItensEntradaSaida ies
		inner join produto pr on pr.id = ies.idProduto
		left join ProdutoClassificacao pc on pc.id = ies.idProdutoClassificacao
		left join marca mc on mc.id = pr.idMarca
		left join produtoGrupo pg on pg.id = pr.idGrupo
		left join ProdutoGenero pgen on pgen.id = pr.idProdutoGenero
		WHERE ((pr.idGrupo in (select idGrupo from ProdutoGruposFilhos(@idGrupo))) or (@idGrupo = 0))
		and   ((pr.idMarca = @idMarca) or (@idMarca = 0))
	    group by ies.idProduto, ies.idProdutoClassificacao, pc.sequencia, ies.dscProduto, ies.unidadeMedida, ies.codigoProdutoClasse, (case when pr.codigoNotaFiscal != '' then pr.codigoNotaFiscal else ies.codigoProdutoClasse end), ies.precoCadastro, ies.precoEntradaCadastro, pr.idGrupo, pg.descricao, ies.idConta, ies.dscConta, (case when len(pc.refFabrica) > 0 then pc.refFabrica else pr.refFabrica end), pr.idMarca, mc.descricao, pgen.descricao, pr.tipoItem, coalesce((case when pc.qtdEstoqueMinima > 0 then pc.qtdEstoqueMinima else pr.qtdEstoqueMinima end), 0), pr.idFornecedor, pr.idEmitente, coalesce((case when pc.alturaMM > 0 then pc.alturaMM else pr.alturaMM end), 0), coalesce((case when pc.comprimentoMM > 0 then pc.comprimentoMM else pr.comprimentoMM end), 0), coalesce((case when pc.larguraMM > 0 then pc.larguraMM else pr.larguraMM end), 0), coalesce(pr.pesoProduto, 0), coalesce(pr.pesoBrutoProduto, 0)

		/*

		Custo em letras removido da seleção. Estava causando muita lentidão em clientes com movimentação significativa
		*/

		/*if (@exibirCustoLetras = 1)
		begin
			DECLARE @X VARCHAR(50)
			DECLARE @count int = (SELECT COUNT(rowNumber) FROM @Resultado)
			DECLARE @row int = 1
	    
			WHILE (@row <= @count)
			BEGIN
				SET @X = (select CAST(custoCalculado as varchar(50)) from @Resultado WHERE rowNumber = @row)
				SELECT @X = REPLACE(@X,numero,letra)
				FROM CustoLetra
			
				UPDATE @Resultado SET custoCalculadoLetras = @X
				WHERE rowNumber = @row
			
				SET @row += 1
			END
		end*/
	
	
	/*select * from @Resultado r
	where (((r.qtd > 0) and (@idnMostrarProdutosQtdNegativa = 0)) or (@idnMostrarProdutosQtdNegativa = 1))*/
	RETURN 
END
GO
ALTER TABLE [dbo].[MDeEventoAtorInteressado] ADD CONSTRAINT [FK_MDeEventoAtorInteressado_emitente] FOREIGN KEY
	(
		[idEmitente]
	)
	REFERENCES [dbo].[emitente]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[Fatura] ADD CONSTRAINT [FK_Fatura_parceiroRepresentante] FOREIGN KEY
	(
		[idRepresentante]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO
UPDATE Fatura SET idnGeradaAutomaticamente = 1 WHERE idPedido is not null AND ROUND(valor, 2) = (select ROUND(p.valorPedido, 2) from pedido p where p.id = idPedido) 
GO
UPDATE configuracaoNovo SET descricaoSimplificada = 'Habilitar o controle de Liberação/Bloqueio do Sistema por Filial', descricaoDetalhada = 'Selecione esta opção quando o sistema possuir mais de uma Filial, onde o controle de liberação e bloqueio deverá ser realizado individualmente por empresa/cnpj.', grupo = 'Geral', subgrupo = 'Configurações Gerais', idnParametroMultilinhas = 0, idnParametroRadio = 0, idnParametroSelecaoPasta = 0, idnPermiteAlteracaoApenasPorAdmins = 1, idnCampoSenha = 0 WHERE nomeParametro = 'idnExecutarMetodoBloqueioFiliais'
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression],[idnPermiteSelecaoMultiplaOpcoes]) VALUES ('idnPermitirAlterarPedidoComLiquidacao', 'Permitir editar Pedidos com Liquidação de Parcelas', 'Selecione esta opção quando desejar que seja permitido editar o Pedido mesmo que possua liquidação de parcelas. Neste caso, as parcelas não serão recalculadas caso ocorra alteração de valor ou vencimento, sendo necessário um controle manual para os ajustes necessários.', 'bool', 'False', 'Pedido', 'Configurações do Pedido',null,0,0,0,0,0,null,null,null,0)
GO
INSERT INTO [selecao] ([tabela],[descricao],[camposListar],[campoChave],[campoRetorno],[filtro],[ordem],[nomeTela]) VALUES ('MDeNotas', 'Notas Manifestação', 'numeroNFe = Número, serieNFe = Série|45, dataEmissao = Data Emissão|100, id = Código, cpfCnpjEmitente = CPF/CNPJ Emitente|100, razaoSocialEmitente = Razão Social do Emitente|300, chaveNFe = Chave|300', 'id', 'chaveNFe', '(tpAmb = 1)', 'dataEmissao desc', null)
GO
UPDATE MenuItens set ordem = 2 where id = 26

GO
SET IDENTITY_INSERT [dbo].[Telas] ON 
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (427, N'Evento Ator Interessado NFe', N'Cadastros.ucConsEventoAtorInteressado, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
SET IDENTITY_INSERT [dbo].[Telas] OFF

GO
SET IDENTITY_INSERT [dbo].[MenuItens] ON 
GO
INSERT [dbo].[MenuItens] ([id], [idMenu], [descricao], [idTela], [idMenuItemPai], [ordem], [idnVisivel], [md5], [imagem]) VALUES (528, 1, N'Evento Ator Interessado - Transportador', 427, 22, 2, 1, NULL, NULL)
GO
INSERT [dbo].[MenuItens] ([id], [idMenu], [descricao], [idTela], [idMenuItemPai], [ordem], [idnVisivel], [md5], [imagem]) VALUES (529, 1, N'Evento Ator Interessado - Transportador', 427, 164, 1, 1, NULL, NULL)
GO
SET IDENTITY_INSERT [dbo].[MenuItens] OFF
GO
SET IDENTITY_INSERT [dbo].[Telas] ON 
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [imagem], [parametrosControle], [teclaAtalho1], [teclaAtalho2], [idnPermiteAbrirVarias], [qtdVezesAberta], [dataUltimaAbertura], [idnRestricaoAcesso], [idnBloquearAcessoPlanoBasico]) VALUES (426, N'Relatório de Comissões', N'Cadastros.ucRelatorioComissoes2, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, 1)
GO
SET IDENTITY_INSERT [dbo].[Telas] OFF
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] ON 
GO
INSERT [dbo].[MenuLateralItens] ([id], [idMenu], [descricao], [idTela], [idMenuLateralGrupo], [imagem], [ordem]) VALUES (484, 1, N'Relatório de Comissões', 426, 49, N'printer-2_32.png', 3)
GO
INSERT [dbo].[MenuLateralItens] ([id], [idMenu], [descricao], [idTela], [idMenuLateralGrupo], [imagem], [ordem]) VALUES (485, 2, N'Relatório de Comissões', 426, 49, N'printer-2_32.png', 3)
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] OFF
GO
BEGIN
    declare @tableUpdate table
    (
        idFatura int,
        representanteId int
    )

    insert into @tableUpdate select f.id, nf.idRepresentante from fatura f inner join notafiscal nf on nf.id = f.idNotaFiscal where nf.idRepresentante is not null

    insert into @tableUpdate select f.id, pe.idRepresentante from fatura f inner join pedido pe on pe.id = f.idPedido where pe.idRepresentante is not null

    update fatura set idRepresentante = representanteId from @tableUpdate where id = idFatura
END
GO
update MenuLateralItens set descricao = 'Relatório de Comissões (antiga)' where id = 245
update MenuLateralItens set descricao = 'Relatório de Comissões (antiga)' where id = 337
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO, REVISAO) VALUES(531, 789, GETDATE(),1);