USE [TryNFeOnline]
GO
ALTER TABLE [dbo].[OrdemProducao] DROP CONSTRAINT [PK_OrdemProducaoPedidos]
GO
ALTER TABLE [dbo].[estoqueAjustes] ADD 
[idOrdemProducao] [bigint] NULL,
[idnBaixaLoteReprocessamento] [bit] NULL
GO
ALTER TABLE [dbo].[ProdutoMontagem] ADD 
[idOrdemProducao] [bigint] NULL
GO
ALTER TABLE [dbo].[EtiquetasCard] ADD 
[aplicacao] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[NFSeServicos] ADD 
[descricaoPadraoNFSe] [varchar] (2000) COLLATE Latin1_General_CI_AS NULL
GO
ALTER TABLE [dbo].[operacao] ADD 
[idnConsiderarUltimoPrecoParceiroVenda] [bit] NULL,
[idnCalcularVariacaoSomenteFaturamento] [bit] NULL,
[idTabelaPreco] [int] NULL
GO
ALTER TABLE [dbo].[produtoComponentes] ADD 
[qtdProdutoFinal] [decimal] (18,4) NULL
GO
CREATE TABLE [dbo].[OperadorStatusOrdemProducao]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[identificadorStatus] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[idOperador] [int] NULL,
	CONSTRAINT [PK_OperadorStatusOrdemProducao] 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].[OrdemProducaoApontamento]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducao] [bigint] NOT NULL,
	[dataHoraInicio] [datetime] NULL,
	[dataHoraTermino] [datetime] NULL,
	[qtdProduzida] [decimal] (18,4) NOT NULL,
	[qtdVolumes] [decimal] (18,4) NULL,
	[idParceiroProducao] [int] NULL,
	[idOperador] [int] NOT NULL,
	[dataHoraRegistro] [datetime] NOT NULL,
	CONSTRAINT [PK_OrdemProducaoApontamento] 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].[OrdemProducaoConferenciaQualidade]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducao] [bigint] NOT NULL,
	[idOrdemProducaoApontamento] [bigint] NULL,
	[idControleQualidade] [int] NOT NULL,
	[dataHora] [datetime] NOT NULL,
	[idOperador] [int] NOT NULL,
	[idParceiroResponsavel] [int] NULL,
	[idnConferenciaAprovada] [bit] NOT NULL,
	[motivoReprovacao] [varchar] (500) COLLATE Latin1_General_CI_AS NULL,
	CONSTRAINT [PK_OrdemProducaoConferenciaQualidade] 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].[OrdemProducaoConferenciaQualidadeResultados]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducaoConferenciaQualidade] [bigint] NOT NULL,
	[idControleQualidadeParametro] [int] NOT NULL,
	[resultado] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	CONSTRAINT [PK_OrdemProducaoConferenciaQualidadeResultados] 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].[OrdemProducaoParametros]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idOperacaoAjusteEmpenho] [int] NULL,
	[idOperacaoAjusteEstorno] [int] NULL,
	[idOperacaoProducaoEntrada] [int] NULL,
	[idOperacaoProducaoSaida] [int] NULL,
	[idOperacaoAjusteReprocessamento] [int] NULL,
	CONSTRAINT [PK_OrdemProducaoParametros] 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].[OrdemProducaoInsumos]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducao] [bigint] NOT NULL,
	[idProduto] [int] NULL,
	[idProdutoClassificacao] [int] NULL,
	[quantidade] [decimal] (18,4) NULL,
	[quantidadeBaseInsumo] [decimal] (18,4) NULL,
	[percPerda] [decimal] (18,4) NULL,
	CONSTRAINT [PK_OrdemProducaoInsumos] 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].[OrdemProducaoListaStatus]
(
	[identificador] [varchar] (200) COLLATE Latin1_General_CI_AS NOT NULL,
	[descricao] [varchar] (100) COLLATE Latin1_General_CI_AS NULL,
	[indOrdem] [int] NOT NULL,
	[idnExibirMonitoramento] [bit] NOT NULL,
	[idnPermiteMoverManual] [bit] NOT NULL,
	CONSTRAINT [PK_OrdemProducaoListaStatus] PRIMARY KEY CLUSTERED
	(
		[identificador] 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].[ControleQualidadeParametros]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[idControleQualidade] [int] NOT NULL,
	[parametro] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[valorReferencia] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[idnInativo] [bit] NOT NULL,
	CONSTRAINT [PK_TipoConferenciaQualidadeParametros] 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].[OrdemProducaoStatus]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducao] [bigint] NOT NULL,
	[dataHora] [datetime] NOT NULL,
	[status] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[idOperador] [int] NOT NULL,
	CONSTRAINT [PK_OrdemProducaoStatus] 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].[OrdemProducaoEtiqueta]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[idOrdemProducao] [bigint] NULL,
	[idEtiquetaCard] [int] NULL,
	CONSTRAINT [PK_OrdemProducaoEtiqueta] 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].[ControleQualidade]
(
	[id] [int] IDENTITY (1,1) NOT NULL,
	[descricao] [varchar] (200) COLLATE Latin1_General_CI_AS NULL,
	[idnInativo] [bit] NOT NULL,
	CONSTRAINT [PK_TipoConferenciaQualidade] 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].[TempOrdemProducao]
(
	[id] [bigint] IDENTITY (1,1) NOT NULL,
	[dataAbertura] [datetime] NOT NULL,
	[status] [varchar] (200) COLLATE Latin1_General_CI_AS NOT NULL,
	[idOperador] [int] NOT NULL,
	[sequenciaCard] [int] NOT NULL,
	[motivoCancelamento] [varchar] (300) COLLATE Latin1_General_CI_AS NULL,
	[idEmitente] [int] NOT NULL,
	[dataInicio] [datetime] NULL,
	[dataTermino] [datetime] NULL,
	[idPedidoProduto] [int] NULL,
	[idProduto] [int] NOT NULL,
	[idProdutoClassificacao] [int] NULL,
	[quantidade] [decimal] (18,4) NULL,
	[quantidadeBaseProduto] [decimal] (18,4) NULL,
	[numeroLote] [varchar] (50) COLLATE Latin1_General_CI_AS NULL,
	[dataValidadeLote] [date] NULL,
	[dataPrevisaoInicio] [datetime] NULL,
	[dataPrevisaoTermino] [datetime] NULL,
	[observacoes] [varchar] (max) COLLATE Latin1_General_CI_AS NULL,
	[idnReprocessamento] [bit] NULL,
	[idProdutoLote] [int] NULL,
	[numeroLoteReprocessado] [varchar] (50) COLLATE Latin1_General_CI_AS NULL

) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[TempOrdemProducao] ON
INSERT INTO [dbo].[TempOrdemProducao] ([id],[dataAbertura],[status],[idOperador],[sequenciaCard],[motivoCancelamento],[idEmitente],[idProduto]) SELECT [id],[dataAbertura],[status],[idOperador],[sequenciaCard],[motivoCancelamento],0,0 FROM [dbo].[OrdemProducao]
SET IDENTITY_INSERT [dbo].[TempOrdemProducao] OFF
GO

DROP TABLE [dbo].[OrdemProducao]
GO
EXEC sp_rename N'[dbo].[TempOrdemProducao]',N'OrdemProducao', 'OBJECT'
GO

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER FUNCTION [dbo].[EstoqueProdutoLote]
(
	@idEmitenteInf int, 
	@idProdutoInf int,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0,
	@idProdutoLoteInf int = 0
)
RETURNS 
@Resultado TABLE 
(
	idLote int,
	numeroLote varchar(50),
	qtdLote decimal(18,4),
	dataFabricacao date,
	dataValidade date,
	idProduto int,
	idProdutoClassificacao int NULL,
	dscProduto varchar(500),
	qtd decimal(18,4),
	unidadeMedida varchar(30),
	codigoProduto varchar(50),
	idConta int,
	dscConta varchar(200)
)
AS
BEGIN
	
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = @idProdutoInf;
	declare @idProdutoClassificacao int = @idProdutoClassificacaoInf;
	declare @idConta int = @idContaInf;
	declare @idProdutoLote int = @idProdutoLoteInf;
		
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(500),
		codigoProduto varchar(50),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),
		idProdutoLote 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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) 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
		plm.quantidade * -1 else plm.quantidade end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
		plm.idProdutoLote
		from NFProduto np with (NOLOCK)
		inner join notafiscal nf with (NOLOCK) on nf.id = np.idNotaFiscal
		inner join nfEmitente nfe with (NOLOCK) on nfe.idnotafiscal = np.idnotafiscal
		inner join produto pr with (NOLOCK) on pr.id = np.idProduto
		inner join operacao op with (NOLOCK) on op.id = nf.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = nf.idOperacao
		left join NFEstoqueContas nfc with (NOLOCK) on nfc.idNotaFiscal = nf.id and nfc.idContaEstoque = ecp.idConta
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join produtoClassificacao pc with (NOLOCK) on pc.id = np.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idNFProduto = np.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and (nf.nfeTpAmb = 1)
		--and (cast(nf.dataEmissao as date) <= @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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		and ((coalesce(nfc.idnHabilitado, 0) = 1) or (nfc.id is null))
		and	  (coalesce(nf.idnIgnorarEstoque, 0) = 0)
	
	--Ajustes de estoque
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			plm.quantidade * -1 else plm.quantidade end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from estoqueAjustes ea with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = ea.idProduto
		inner join operacao op with (NOLOCK) on op.id = ea.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = ea.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = ea.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idEstoqueAjustes = ea.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (ea.idEmitente = @idEmitente)
		--and (cast(ea.data as date) <= @data)
		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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		
	--Produtos alocados nas ordens de serviço
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			plm.quantidade * -1 else plm.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from OrdemServicoProduto osp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = osp.idProduto
		inner join OrdemServico os with (NOLOCK) on os.id = osp.idOrdemServico
		inner join operacao op with (NOLOCK) on op.id = os.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = os.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = osp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idOrdemServicoProduto = osp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (os.idEmitente = @idEmitente)
		--and ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		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))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))

	--Pedidos
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			(plm.quantidade - coalesce((select plm2.quantidade from pedidoFaturado pf inner join NFProduto nfp on nfp.idNotaFiscal = pf.idNotaFiscal inner join ProdutoLoteMovimento plm2 on plm2.idNFProduto = nfp.id where pf.idPedido = pe.id and plm2.idProdutoLote = pl.id), 0)) * -1 
			else plm.quantidade - coalesce((select plm2.quantidade from pedidoFaturado pf inner join NFProduto nfp on nfp.idNotaFiscal = pf.idNotaFiscal inner join ProdutoLoteMovimento plm2 on plm2.idNFProduto = nfp.id where pf.idPedido = pe.id and plm2.idProdutoLote = pl.id), 0) end),
			pe.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from pedidoProduto pp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = pp.idProduto
		inner join pedido pe with (NOLOCK) on pe.id = pp.idPedido
		inner join operacao op with (NOLOCK) on op.id = pe.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = pe.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = pp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idPedidoProduto = pp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (pe.idEmitente = @idEmitente)
		--and (cast(pe.dataPedido as date) <= @data)
		and ((pe.idnFaturado is null) or (pe.idnFaturado = 0))
		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 ((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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		
	--Condicional
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
		    (plm.quantidade - coalesce((select plm2.quantidade from ProdutoLoteMovimento plm2 inner join CondicionalDevolucao cd on plm2.idCondicionalDevolucao = cd.id where cd.idCondicional = cp.idCondicional and plm2.idProdutoLote = pl.id), 0)) * -1 
		    else plm.quantidade - coalesce((select plm2.quantidade from ProdutoLoteMovimento plm2 inner join CondicionalDevolucao cd on plm2.idCondicionalDevolucao = cd.id where cd.idCondicional = cp.idCondicional and plm2.idProdutoLote = pl.id), 0) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from CondicionalProduto cp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = cp.idProduto
		inner join Condicional co with (NOLOCK) on co.id = cp.idCondicional		
		inner join operacao op with (NOLOCK) on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = co.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = cp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idCondicionalProduto = cp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (co.idEmitente = @idEmitente)
		--and (cast(co.dataEmissao as date) <= @data)
		and ((co.idnFechado is null) or (co.idnFechado = 0))
		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))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 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 pl.id,
			   pl.numero,
			   pl.quantidade,
			   pl.dataFabricacao,
			   pl.dataValidade,
			   ies.idProduto,
			   ies.idProdutoClassificacao,
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProduto,
			   ies.idConta,
			   ies.dscConta
		from @ItensEntradaSaida ies
		inner join ProdutoLote pl on pl.id = ies.idProdutoLote
	    group by pl.id, pl.numero, pl.quantidade, pl.dataFabricacao, pl.dataValidade, ies.idProduto, ies.idProdutoClassificacao, ies.dscProduto, ies.unidadeMedida, ies.codigoProduto, ies.idConta, ies.dscConta
	
	
	RETURN 
END
GO
CREATE FUNCTION [dbo].[CurvaABCAgrupamento]
(
	@dataIni datetime,
	@dataFin datetime,
	@idEmitente int = 0,
	@porcTipoAInf decimal(18,4),
	@porcTipoBInf decimal (18,4),
	@idAgrupamento int
)
RETURNS 
@Resultado TABLE 
(
		produto_id int,
		produtoClasse_id int,
		emitente varchar(500),
		descricaoProduto varchar(500),
		unidadeMedida varchar(30),
		quantidade decimal(18,4),
		valorProduto decimal(18,4),
		tipoABC char,
		saldoEstoque decimal(18,4),
		agrupamento varchar(100)
)
AS
BEGIN	
	
	declare @ABC TABLE
	(
		idProduto int,
		idProdutoclasse int,
		emitente varchar(500),
		descricaoProduto varchar(500),
		unidadeMedida varchar(30),
		quantidade decimal(18,4),
		valorProduto decimal(18,4),
		tipoABC char,
		contadorLinhas int,
		totalLinhas int,
		agrupamento varchar(100)
	)
	
	declare @lista ListaProdutos

	insert into @ABC 
		select nfp.idProduto, nfp.idProdutoClassificacao,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, pg.descricao as agrupamento
		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
		inner join produto p on p.id = nfp.idProduto
		left join produtoGrupo pg on pg.id = p.idGrupo
		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)
		and ((p.idGrupo = @idAgrupamento) or (@idAgrupamento = 0))
		group by nfp.idProduto, nfp.idProdutoClassificacao,nfp.descricao, nfp.ucom, nfem.razaosocial, pg.descricao
		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 idProduto, idProdutoclasse, emitente, descricaoProduto, unidadeMedida, quantidade, valorProduto, tipoABC, 0, agrupamento from @ABC

	insert into @lista select produto_id, produtoClasse_id from @Resultado

	update @Resultado set saldoEstoque = (select coalesce(qtd,0) from EstoqueProdutos2(null,@idEmitente,0,0,0,0,0,1,@lista,1,0) ep where ep.idProduto = produto_id and ep.idProdutoClassificacao = produtoClasse_id)

	RETURN 
END
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE FUNCTION [dbo].[ConsultaProdutoLote]
(
	@idEmitenteInf int, 
	@idProdutoInf int,
	@idProdutoClassificacaoInf int = 0,
	@idContaInf int = 0,
	@idProdutoLoteInf int = 0,
	@dataFabricacaoInicial date,
	@dataFabricacaoFinal date,
	@dataValidadeInicial date,
	@dataValidadeFinal date
)
RETURNS 
@Resultado TABLE 
(
	idLote int,
	numeroLote varchar(50),
	qtdLote decimal(18,4),
	dataFabricacao date,
	dataValidade date,
	idFornecedor int null,
	razaoSocialFornecedor varchar(60),
	idProduto int,
	idProdutoClassificacao int NULL,
	dscProduto varchar(500),
	qtd decimal(18,4),
	unidadeMedida varchar(30),
	codigoProduto varchar(50),
	idConta int,
	dscConta varchar(200),
	idFilial int,
	razaoSocialEmitente varchar(60)
)
AS
BEGIN
	
	declare @idEmitente int = @idEmitenteInf;
	declare @idProduto int = @idProdutoInf;
	declare @idProdutoClassificacao int = @idProdutoClassificacaoInf;
	declare @idConta int = @idContaInf;
	declare @idProdutoLote int = @idProdutoLoteInf;
		
	declare @ItensEntradaSaida TABLE
	(
		idProduto int,
		idProdutoClassificacao int,
		dscProduto varchar(500),
		codigoProduto varchar(50),
		unidadeMedida varchar(30),
		unidadeMedidaConvertida varchar(30),
		fatorConversao decimal(18,4),
		qtd decimal(18,4),
		idOperacao int,
		idnOperacao varchar(5),
		idConta int,
		dscConta varchar(200),
		idProdutoLote 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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(50)) 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
		plm.quantidade * -1 else plm.quantidade end),
		nf.idOperacao,
		(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
		plm.idProdutoLote
		from NFProduto np with (NOLOCK)
		inner join notafiscal nf with (NOLOCK) on nf.id = np.idNotaFiscal
		inner join nfEmitente nfe with (NOLOCK) on nfe.idnotafiscal = np.idnotafiscal
		inner join produto pr with (NOLOCK) on pr.id = np.idProduto
		inner join operacao op with (NOLOCK) on op.id = nf.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = nf.idOperacao
		left join NFEstoqueContas nfc with (NOLOCK) on nfc.idNotaFiscal = nf.id and nfc.idContaEstoque = ecp.idConta
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join produtoClassificacao pc with (NOLOCK) on pc.id = np.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idNFProduto = np.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (pl.dataFabricacao between @dataFabricacaoInicial and @dataFabricacaoFinal)
		and (pl.dataValidade between @dataValidadeInicial and @dataValidadeFinal)
		and ((nf.nfeCstat = 100) or (nf.nfeCstat = 150))
		and (nf.nfeTpAmb = 1)
		--and (cast(nf.dataEmissao as date) <= @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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		and ((coalesce(nfc.idnHabilitado, 0) = 1) or (nfc.id is null))
		and	  (coalesce(nf.idnIgnorarEstoque, 0) = 0)
	
	--Ajustes de estoque
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			plm.quantidade * -1 else plm.quantidade end),
			ea.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when ea.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from estoqueAjustes ea with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = ea.idProduto
		inner join operacao op with (NOLOCK) on op.id = ea.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = ea.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = ea.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idEstoqueAjustes = ea.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (ea.idEmitente = @idEmitente)
		and (pl.dataFabricacao between @dataFabricacaoInicial and @dataFabricacaoFinal)
		and (pl.dataValidade between @dataValidadeInicial and @dataValidadeFinal)
		--and (cast(ea.data as date) <= @data)
		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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		
	--Produtos alocados nas ordens de serviço
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			plm.quantidade * -1 else plm.quantidade end),
			os.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from OrdemServicoProduto osp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = osp.idProduto
		inner join OrdemServico os with (NOLOCK) on os.id = osp.idOrdemServico
		inner join operacao op with (NOLOCK) on op.id = os.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = os.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = osp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idOrdemServicoProduto = osp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (os.idEmitente = @idEmitente)
		and (pl.dataFabricacao between @dataFabricacaoInicial and @dataFabricacaoFinal)
		and (pl.dataValidade between @dataValidadeInicial and @dataValidadeFinal)
		--and ((case when osp.dataHora is not null then cast(osp.dataHora as date) else cast(os.dataHora as date) end) <= @data)
		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))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))

	--Pedidos
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
			(plm.quantidade - coalesce((select plm2.quantidade from pedidoFaturado pf inner join NFProduto nfp on nfp.idNotaFiscal = pf.idNotaFiscal inner join ProdutoLoteMovimento plm2 on plm2.idNFProduto = nfp.id where pf.idPedido = pe.id and plm2.idProdutoLote = pl.id), 0)) * -1 
			else plm.quantidade - coalesce((select plm2.quantidade from pedidoFaturado pf inner join NFProduto nfp on nfp.idNotaFiscal = pf.idNotaFiscal inner join ProdutoLoteMovimento plm2 on plm2.idNFProduto = nfp.id where pf.idPedido = pe.id and plm2.idProdutoLote = pl.id), 0) end),
			pe.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from pedidoProduto pp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = pp.idProduto
		inner join pedido pe with (NOLOCK) on pe.id = pp.idPedido
		inner join operacao op with (NOLOCK) on op.id = pe.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = pe.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = pp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idPedidoProduto = pp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (pe.idEmitente = @idEmitente)
		and (pl.dataFabricacao between @dataFabricacaoInicial and @dataFabricacaoFinal)
		and (pl.dataValidade between @dataValidadeInicial and @dataValidadeFinal)
		--and (cast(pe.dataPedido as date) <= @data)
		and ((pe.idnFaturado is null) or (pe.idnFaturado = 0))
		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 ((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 ((ecp.idConta = @idConta) or (@idConta = 0))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 0))
		
	--Condicional
	union all
		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(STR(pc.sequencia, 3), SPACE(1), '0') else cast(pr.id as varchar(20)) 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
		    (plm.quantidade - coalesce((select plm2.quantidade from ProdutoLoteMovimento plm2 inner join CondicionalDevolucao cd on plm2.idCondicionalDevolucao = cd.id where cd.idCondicional = cp.idCondicional and plm2.idProdutoLote = pl.id), 0)) * -1 
		    else plm.quantidade - coalesce((select plm2.quantidade from ProdutoLoteMovimento plm2 inner join CondicionalDevolucao cd on plm2.idCondicionalDevolucao = cd.id where cd.idCondicional = cp.idCondicional and plm2.idProdutoLote = pl.id), 0) end),
			co.idOperacao,
			(case when ecp.idnOperacao = '=' then (case when op.idnES = 0 then '+' else '-' end) else ecp.idnOperacao end), ecp.idConta, ec.descricao,
			plm.idProdutoLote
		from CondicionalProduto cp with (NOLOCK)
		inner join produto pr with (NOLOCK) on pr.id = cp.idProduto
		inner join Condicional co with (NOLOCK) on co.id = cp.idCondicional		
		inner join operacao op with (NOLOCK) on op.id = co.idOperacao
		inner join EstoqueContaOperacao ecp with (NOLOCK) on ecp.idOperacao = co.idOperacao
		inner join EstoqueConta ec with (NOLOCK) on ec.id = ecp.idConta
		left join ProdutoClassificacao pc with (NOLOCK) on pc.id = cp.idProdutoClassificacao
		inner join ProdutoLoteMovimento plm with (NOLOCK) on plm.idCondicionalProduto = cp.id
		inner join ProdutoLote pl with (NOLOCK) on pl.id = plm.idProdutoLote
		where (co.idEmitente = @idEmitente)
		and (pl.dataFabricacao between @dataFabricacaoInicial and @dataFabricacaoFinal)
		and (pl.dataValidade between @dataValidadeInicial and @dataValidadeFinal)
		--and (cast(co.dataEmissao as date) <= @data)
		and ((co.idnFechado is null) or (co.idnFechado = 0))
		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))
		and ((pl.id = @idProdutoLote) or (@idProdutoLote = 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 pl.id,
			   pl.numero,
			   pl.quantidade,
			   pl.dataFabricacao,
			   pl.dataValidade,
			   pl.idFornecedorAvulso,
			   pa.razaosocial,
			   ies.idProduto,
			   ies.idProdutoClassificacao,
			   ies.dscProduto,
			   sum(ies.qtd),
			   ies.unidadeMedida,
			   ies.codigoProduto,
			   ies.idConta,
			   ies.dscConta,
			   pl.idFilial,
			   em.razaosocial
		from @ItensEntradaSaida ies
		inner join ProdutoLote pl on pl.id = ies.idProdutoLote
		left join emitente em on em.id = pl.idFilial
		left join parceiro pa on pa.id = pl.idFornecedorAvulso
	    group by pl.id, pl.numero, pl.quantidade, pl.dataFabricacao, pl.dataValidade, pl.idFornecedorAvulso, pa.razaosocial, ies.idProduto, ies.idProdutoClassificacao, ies.dscProduto, ies.unidadeMedida, ies.codigoProduto, ies.idConta, ies.dscConta, pl.idFilial, em.razaosocial
	
	
	RETURN 
END
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [PK_OrdemProducaoPedidos] 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]
GO
ALTER TABLE [dbo].[OrdemProducaoEtiqueta] ADD CONSTRAINT [FK_OrdemProducaoEtiqueta_EtiquetasCard] FOREIGN KEY
	(
		[idEtiquetaCard]
	)
	REFERENCES [dbo].[EtiquetasCard]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoEtiqueta] ADD CONSTRAINT [FK_OrdemProducaoEtiqueta_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoStatus] ADD CONSTRAINT [FK_OrdemProducaoStatus_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoStatus] ADD CONSTRAINT [FK_OrdemProducaoStatus_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoInsumos] ADD CONSTRAINT [FK_OrdemProducaoInsumos_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoInsumos] ADD CONSTRAINT [FK_OrdemProducaoInsumos_produto] FOREIGN KEY
	(
		[idProduto]
	)
	REFERENCES [dbo].[produto]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoInsumos] ADD CONSTRAINT [FK_OrdemProducaoInsumos_ProdutoClassificacao] FOREIGN KEY
	(
		[idProdutoClassificacao]
	)
	REFERENCES [dbo].[ProdutoClassificacao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidade] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidade_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidade] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidade_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidade] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidade_OrdemProducaoApontamento] FOREIGN KEY
	(
		[idOrdemProducaoApontamento]
	)
	REFERENCES [dbo].[OrdemProducaoApontamento]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidade] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidade_parceiro] FOREIGN KEY
	(
		[idParceiroResponsavel]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidade] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidade_TipoConferenciaQualidade] FOREIGN KEY
	(
		[idControleQualidade]
	)
	REFERENCES [dbo].[ControleQualidade]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoApontamento] ADD CONSTRAINT [FK_OrdemProducaoApontamento_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoApontamento] ADD CONSTRAINT [FK_OrdemProducaoApontamento_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoApontamento] ADD CONSTRAINT [FK_OrdemProducaoApontamento_parceiro] FOREIGN KEY
	(
		[idParceiroProducao]
	)
	REFERENCES [dbo].[parceiro]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OperadorStatusOrdemProducao] ADD CONSTRAINT [FK_OperadorStatusOrdemProducao_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[ControleQualidadeParametros] ADD CONSTRAINT [FK_TipoConferenciaQualidadeParametros_TipoConferenciaQualidade] FOREIGN KEY
	(
		[idControleQualidade]
	)
	REFERENCES [dbo].[ControleQualidade]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidadeResultados] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidadeResultados_OrdemProducaoConferenciaQualidade] FOREIGN KEY
	(
		[idOrdemProducaoConferenciaQualidade]
	)
	REFERENCES [dbo].[OrdemProducaoConferenciaQualidade]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducaoConferenciaQualidadeResultados] ADD CONSTRAINT [FK_OrdemProducaoConferenciaQualidadeResultados_TipoConferenciaQualidadeParametros] FOREIGN KEY
	(
		[idControleQualidadeParametro]
	)
	REFERENCES [dbo].[ControleQualidadeParametros]
	(
		[id]
	)
GO

ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_produto] FOREIGN KEY
	(
		[idProduto]
	)
	REFERENCES [dbo].[produto]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_ProdutoClassificacao] FOREIGN KEY
	(
		[idProdutoClassificacao]
	)
	REFERENCES [dbo].[ProdutoClassificacao]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_pedidoProduto] FOREIGN KEY
	(
		[idPedidoProduto]
	)
	REFERENCES [dbo].[pedidoProduto]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_Operador] FOREIGN KEY
	(
		[idOperador]
	)
	REFERENCES [dbo].[Operador]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_ProdutoLote] FOREIGN KEY
	(
		[idProdutoLote]
	)
	REFERENCES [dbo].[ProdutoLote]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[OrdemProducao] ADD CONSTRAINT [FK_OrdemProducao_emitente] FOREIGN KEY
	(
		[idEmitente]
	)
	REFERENCES [dbo].[emitente]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[estoqueAjustes] ADD CONSTRAINT [FK_estoqueAjustes_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO
ALTER TABLE [dbo].[ProdutoMontagem] ADD CONSTRAINT [FK_ProdutoMontagem_OrdemProducao] FOREIGN KEY
	(
		[idOrdemProducao]
	)
	REFERENCES [dbo].[OrdemProducao]
	(
		[id]
	)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'ANALISE_QUALIDADE', N'Análise de Qualidade', 6, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'CANCELADA', N'Cancelada', 9, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'CONFIRMADA', N'Confirmada', 2, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'ENCERRADA_PARCIAL', N'Encerrada Parcialmente', 7, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'ENCERRADA_TOTAL', N'Encerrada Totalmente', 8, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'INICIADA', N'Iniciada', 4, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'LIBERADA', N'Liberada', 3, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'PAUSADA', N'Pausada', 5, 1, 0)
GO
INSERT [dbo].[OrdemProducaoListaStatus] ([identificador], [descricao], [indOrdem], [idnExibirMonitoramento], [idnPermiteMoverManual]) VALUES (N'PLANEJADA', N'Planejada', 1, 1, 0)
GO
SET IDENTITY_INSERT [dbo].[Telas] ON 
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (435, N'Consulta de Ordem de Produção', N'Cadastros.ucConsOrdemProducao, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (436, N'Configuração da Ordem de Produção', N'Cadastros.ucOrdemProducaoStatus, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (437, N'Consulta Parâmetros OP', N'Cadastros.ucConsOrdemProducaoParametros, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (438, N'Cadastrar Parâmetros OP', N'Cadastros.ucCadOrdemProducaoParametros, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (439, N'Consulta Controle de Qualidade', N'Cadastros.ucConsControleQualidade, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (440, N'Cadastrar Controle de Qualidade', N'Cadastros.ucCadControleQualidade, 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 INTO [dbo].[MenuItens] ([id],[idMenu],[descricao],[idTela],[idMenuItemPai],[ordem],[idnVisivel]) VALUES (534, 1, 'Ordem de Produção', null, 76, 1, 1)
GO
INSERT INTO [dbo].[MenuItens] ([id],[idMenu],[descricao],[idTela],[idMenuItemPai],[ordem],[idnVisivel]) VALUES (535, 1, 'Monitoramento de Ordens de Produção', 435, 534, 0, 1)
GO
INSERT INTO [dbo].[MenuItens] ([id],[idMenu],[descricao],[idTela],[idMenuItemPai],[ordem],[idnVisivel]) VALUES (536, 1, '-', null, 534, 1, 1)
GO
INSERT INTO [dbo].[MenuItens] ([id],[idMenu],[descricao],[idTela],[idMenuItemPai],[ordem],[idnVisivel]) VALUES (537, 1, 'Configuração de Status OPs', 436, 534, 2, 1)
GO
SET IDENTITY_INSERT [dbo].[MenuItens] OFF
GO
SET IDENTITY_INSERT [dbo].[MenuLateralGrupos] ON 
GO
INSERT INTO [dbo].[MenuLateralGrupos] ([id],[descricaoGrupo],[ordem],[telaOrigem]) VALUES (81, 'Ordem de Produção', 9, 'Estoque')
GO
SET IDENTITY_INSERT [dbo].[MenuLateralGrupos] OFF
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] ON 
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (494, 1, 'Consultar Parâmetros', 437, 81, 'search-2_32.png', 0)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (495, 1, 'Cadastrar Parâmetro', 438, 81, 'controls.png', 1)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (496, 1, 'Consultar Controle Qualidade', 439, 81, 'search-2_32.png', 2)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (497, 1, 'Cadastrar Controle Qualidade', 440, 81, 'star.png', 3)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (498, 1, 'Consultar Movimento Estoque', 404, 31, 'graph3.png', 3)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (499, 2, 'Consultar Movimento Estoque', 404, 31, 'graph3.png', 3)
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] OFF
GO
UPDATE produtoComponentes SET qtdProdutoFinal = 1
GO
INSERT INTO [dbo].[configuracaoNovo]([nomeParametro],[descricaoSimplificada],[descricaoDetalhada],[tipoValor],[valor],[grupo],[subgrupo],[tamanhoValorMaximo],[idnParametroMultilinhas],[idnParametroRadio],[idnParametroSelecaoPasta],[idnPermiteAlteracaoApenasPorAdmins],[idnCampoSenha],[tabelaSelecao],[filtroSelecao],[validacaoRegularExpression],[idnPermiteSelecaoMultiplaOpcoes]) VALUES ('idnConsiderarCidadeParceiroLocalPrestacaoNFSe', 'Considerar a Cidade do Parceiro como o Local da Prestação do Serviço', 'Selecione esta opção quando desejar que para o Local de Prestação do Serviço da NFSe, seja considerado a Cidade do Parceiro, desta forma após selecionar o mesmo, o campo da Cidade será carregado automaticamente.', 'bool', 'False', 'NFSe', 'Configurações da NFSe',null,0,0,0,0,0,null,null,null,0)
GO
UPDATE MenuItens SET idMenuItemPai = 281, ordem = 3 WHERE id = 371
GO
SET IDENTITY_INSERT [dbo].[Telas] ON
GO
INSERT [dbo].[Telas] ([id], [descricao], [controle], [idnPermiteAbrirVarias]) VALUES (441, N'Consulta de Lotes', N'Cadastros.ucConsProdutoLote, Cadastros, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', 0)
GO
SET IDENTITY_INSERT [dbo].[Telas] OFF
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] ON
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (500, 1, 'Consultar Lotes dos Produtos', 441, 31, 'invoice_32.png', 4)
GO
INSERT INTO [dbo].[MenuLateralItens] ([id],[idMenu],[descricao],[idTela],[idMenuLateralGrupo],[imagem],[ordem]) VALUES (501, 2, 'Consultar Lotes dos Produtos', 441, 31, 'invoice_32.png', 4)
GO
SET IDENTITY_INSERT [dbo].[MenuLateralItens] OFF
GO
SET IDENTITY_INSERT [dbo].[MenuItens] ON
GO
INSERT INTO [dbo].[MenuItens] ([id],[idMenu],[descricao],[idTela],[idMenuItemPai],[ordem],[idnVisivel]) VALUES (538, 1, 'Consultar Lotes dos Produtos', 441, 301, 5, 1)
GO
SET IDENTITY_INSERT [dbo].[MenuItens] OFF
GO
INSERT INTO VERSAO(VERSAO, VERSAOATUALIZACAO, DATAATUALIZACAO, REVISAO) VALUES(549, 807, GETDATE(),1);