alter table fiInutilizacaoNotaFiscal 
	alter column IdInutilizacao smallint not null
GO

IF NOT EXISTS (
SELECT TOP 1 1 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'fiInutilizacaoNotaFiscal' 
and CONSTRAINT_NAME = 'PK_FIINUTILIZACAONOTAFISCAL' 
)
Begin
	alter table fiInutilizacaoNotaFiscal 
		add constraint PK_FIINUTILIZACAONOTAFISCAL primary key (IdInutilizacao)	
End
go

ALTER TABLE fwUsuario Add
  IdPerfilGrupo int,
  Constraint FK_fwUsuario_fwPerfilGrupo foreign key (IdPerfilGrupo)
      references fwPerfilGrupo (IdPerfilGrupo)
go

Update fwUsuario set IdPerfilGrupo = (select Top 1 Perfil.IdPerfilGrupo 
										From fwUsuarioPerfilGrupo Perfil 
									   Where Perfil.IdUsuario = fwUsuario.IdUsuario)
go

if not exists (select 1
            from  sysobjects
           where  id = object_id('tbPerfilGrupoRole')
            and   type = 'U')
Begin
	create table tbPerfilGrupoRole (
   IdPerfilGrupo        int                  not null,
   IdEmpresa            int                  not null,
   RoleName             varchar(255)         not null,
   FlagPermitido        bit                  null,
   constraint PK_TBPERFILGRUPOROLE primary key (IdPerfilGrupo, IdEmpresa, RoleName)
)
	alter table tbPerfilGrupoRole
   add constraint FK_tbPerfilGrupoRole_tbEmpresa foreign key (IdEmpresa)
      references tbEmpresa (IdEmpresa)
	alter table tbPerfilGrupoRole
   add constraint FK_tbPerfilGrupoRole_fwPerfilGrupo foreign key (IdPerfilGrupo)
      references fwPerfilGrupo (IdPerfilGrupo)
End
go

 if exists (select 1
   from sys.sysreferences r join sys.sysobjects o on (o.id = r.constid and o.type = 'F')
   where r.fkeyid = object_id('fiNFeSefazEventos') and o.name = 'FK_fiNFeSefazEventos_fiNFeSefaz')
alter table fiNFeSefazEventos
   drop constraint FK_fiNFeSefazEventos_fiNFeSefaz
go

if exists (select 1
            from  sysobjects
           where  id = object_id('fiNFeSefazEventos')
            and   type = 'U')
   drop table fiNFeSefazEventos
go
 
 if exists (select 1
   from sys.sysreferences r join sys.sysobjects o on (o.id = r.constid and o.type = 'F')
   where r.fkeyid = object_id('fiNFeSefaz') and o.name = 'FK_fiNFeSefaz_fiNotaFiscal')
alter table fiNFeSefaz
   drop constraint FK_fiNFeSefaz_fiNotaFiscal
go

if exists (select 1
   from sys.sysreferences r join sys.sysobjects o on (o.id = r.constid and o.type = 'F')
   where r.fkeyid = object_id('fiNFeSefaz') and o.name = 'FK_fiNFeSefaz_tbEntidade')
alter table fiNFeSefaz
   drop constraint FK_fiNFeSefaz_tbEntidade
go

if exists (select 1
            from  sysobjects
           where  id = object_id('fiNFeSefaz')
            and   type = 'U')
   drop table fiNFeSefaz
go

/*==============================================================*/
/* Table: fiNFeSefaz                                            */
/*==============================================================*/
create table fiNFeSefaz (
   IdNFe                IdSequencia          not null,
   IdNotaFiscal         int                  null,
   TipoNFe              smallint             null,
   IdEntidade           varchar(10)          null,
   NumeroDocumento      varchar(255)         null,
   NumCNPJ              varchar(255)         null,
   NumInscricaoEstadual varchar(255)         null,
   RazaoSocial          varchar(255)         null,
   DataEmissao          datetime             null,
   ValorTotalNFe        decimal(18,2)        null,
   NFeChaveAcesso       varchar(255)         null,
   NSU                  int                  null,
   StatusNFe            int                  null,
   FlagCienciaOperacao  bit                  null,
   FlagDesconhecimentoOperacao bit           null,
   FlagConfirmacaoOperacao bit               null,
   FlagOperacaoNaoRealizada bit              null,
   FlagInativa          bit                  null,
   FlagPreNota          bit                  null,
   FlagNotaFiscal       bit                  null,
   constraint PK_FINFESEFAZ primary key (IdNFe)
)
go

alter table fiNFeSefaz
   add constraint FK_fiNFeSefaz_fiNotaFiscal foreign key (IdNotaFiscal)
      references fiNotaFiscal (IdNotaFiscal)
go

alter table fiNFeSefaz
   add constraint FK_fiNFeSefaz_tbEntidade foreign key (IdEntidade)
      references tbEntidade (IdEntidade)
go

/*==============================================================*/
/* Table: fiNFeSefazEventos                                     */
/*==============================================================*/
create table fiNFeSefazEventos (
   IdEvento             IdSequencia          not null,
   IdNFe                IdSequencia          null,
   IdNotaFiscal         IdSequencia          null,
   TipoEvento           int                  null,
   DataEvento           datetime             null,
   SeqEvento            int                  null,
   DescEvento           varchar(255)         null,
   Protocolo            bigint               null,
   NFeChaveAcesso       varchar(255)         null,
   XMLEvento            ntext                null,
   FlagVisto            bit                  null,
   constraint PK_FINFESEFAZEVENTOS primary key (IdEvento)
)
go

alter table fiNFeSefazEventos
   add constraint FK_fiNFeSefazEventos_fiNFeSefaz foreign key (IdNFe)
      references fiNFeSefaz (IdNFe)
go

update tbSequencia
set Sequencia = (select max(IdPermissaoPk) from fwPermissoesPrograma)
where Tabela = 'fwPermissoesPrograma'
go

alter table tbEstado
alter column CodigoIBGE int
go

ALTER FUNCTION [dbo].[DescricaoBloqueio] 
(
	@IdTipoBloqueio int
)
RETURNS varchar(max)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @Descricao varchar(max)

	SET @Descricao = (
	Select Case when @IdTipoBloqueio = 1 Then 'Limite de Crédito' 
	            when @IdTipoBloqueio = 2 Then 'Atraso Total' 
	            when @IdTipoBloqueio = 3 Then 'Atraso Parcial'
	            when @IdTipoBloqueio = 4 Then 'Dias Inativo Total' 
	            when @IdTipoBloqueio = 5 Then 'Dias Inativo Parcial' 
	            when @IdTipoBloqueio = 6 Then 'Revisão Cadastro Total' 
	            when @IdTipoBloqueio = 7 Then 'Revisão Cadastro Parcial' 
	            when @IdTipoBloqueio = 8 Then 'Prazo Médio' 
	            when @IdTipoBloqueio = 9 Then 'Bloqueado Parcial' 
	            when @IdTipoBloqueio = 10 Then 'Bloqueado Total' 
	            when @IdTipoBloqueio = 11 Then 'Inativo' 
	            when @IdTipoBloqueio = 12 Then 'Margem minima do Pedido' 
	            when @IdTipoBloqueio = 13 Then 'Margem máxima do Pedido' 
	            when @IdTipoBloqueio = 14 Then 'Margem minima da marca do item' 
	            when @IdTipoBloqueio = 15 Then 'Margem máxima da marca do item' 
	            when @IdTipoBloqueio = 16 Then 'Margem mínima do grupo do item' 
	            when @IdTipoBloqueio = 17 Then 'Margem máxima do grupo do item' 
	            when @IdTipoBloqueio = 18 Then 'Margem mínima do fornecedor do item' 
	            when @IdTipoBloqueio = 19 Then 'Margem máxima do fornecedor do item' 
	            when @IdTipoBloqueio = 20 Then 'Margem mínima do serviço do item' 
	            when @IdTipoBloqueio = 21 Then 'Margem máxima do serviço do item' 
				when @IdTipoBloqueio = 99 Then 'Bloqueio personalizado' 
	            else 'TIPO DE BLOQUEIO NÃO DEFINIDO' end Descricao)

return  @Descricao      
End  
GO

ALTER FUNCTION [dbo].[ftVerificaBloqueioMargensPedido]
(@IdPedido int, @IdEmpresa int)
RETURNS @VetBloqueios TABLE 
(
	TipoBloqueio int,
	MargemLucro decimal(18,2),
	Observacao varchar(max)
)
as
Begin
DECLARE @IdPedidoItem int
DECLARE @MargemItem decimal(18,2)
DECLARE @MargemPedido decimal(18,2)
DECLARE @MargemMinima decimal(18,2)
DECLARE @TipoBloqueio int
DECLARE @Observacao varchar(max)

--CALCULANDO MARGEM DE LUCRO DO PEDIDO
SET @MargemPedido= (SELECT dbo.CalcularMargemLucroPedidoNF(0, @IdPedido, 1))

--VERIFICANDO BLOQUEIO POR MARGEM GERAL
SET @TipoBloqueio = 0; SET @Observacao='';
if EXISTS(SELECT IdPedido FROm ftPedido WHERE IdPedido=@IdPedido)
begin
SELECT @TipoBloqueio=ISNULL(CASE 
WHEN @MargemPedido<MargemMinima THEN 12 -- A Margem do pedido é menor que a margem geral definida
WHEN @MargemPedido>MargemMaxima THEN 13 -- A Margem do pedido é maior que a margem máxima definida
ELSE 0 END, 0), @Observacao=ISNULL(CASE 
WHEN @MargemPedido<MargemMinima THEN 'Margem do pedido: ' + CAST(@MargemPedido as varchar) + ', Margem mínima: ' + CAST(MargemMinima as varchar)
WHEN @MargemPedido>MargemMaxima THEN 'Margem do pedido: ' + CAST(@MargemPedido as varchar) + ', Margem máxima: ' + CAST(MargemMaxima as varchar)
ELSE '' END,'') FROM ftConfiguracaoBloqueio 
WHERE TipoBloqueio=0 AND Ativo=1 AND IdEmpresa=@IdEmpresa
END
if(@TipoBloqueio <> 0) INSERT INTO @VetBloqueios VALUES(@TipoBloqueio, @MargemPedido, @Observacao)

SET @TipoBloqueio = 0;
SET @Observacao = '';
 
-- INICIANDO TRATAMENTO PARA VERIFICAÇÃO DE BLOQUEIOS ESPECIFICOS NOS ITENS
Declare CursorPro Cursor Local Fast_Forward for  
Select IdPedidoItem FROM ftPedidoItem WHERE IdPedido=@IdPedido  
Open CursorPro  
Fetch Next From CursorPro into @IdPedidoItem
While @@Fetch_Status = 0  
begin  

-- ADQUIRINDO MARGEM DE LUCRO DO ITEM
select @MargemItem = dbo.CalcularMargemLucroPedidoNFItem(0, @IdPedidoItem)

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR MARCA
SET @TipoBloqueio = 0; SET @Observacao='';
SELECT @TipoBloqueio=ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 14 --Margem do item menor que a margem da marca
WHEN @MargemItem>cb.MargemMaxima THEN 15 --Margem do item maior que a margem maxima da marca
ELSE 0 END,0),
@TipoBloqueio=ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem mínima da MARCA: ' + CAST(cb.MargemMinima as varchar)
WHEN @MargemItem>cb.MargemMaxima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem máxima da MARCA: ' + CAST(cb.MargemMaxima as varchar)
ELSE '' END,'')
FROM ftConfiguracaoBloqueio cb 
LEFT JOIN ftConfiguracaoBloqueio cbp ON cbp.IdConfiguracaoBloqueio=cb.IdConfiguracaoBloqueioPai
LEFT JOIN ftPedidoItem pi ON pi.IdPedidoItem=@IdPedidoItem
LEFT JOIN prProduto pr ON pr.IdProduto=pi.IdProduto 
WHERE cb.TipoBloqueio=1 AND cb.TipoEspecifico=0 --AND cb.Ativo=1 
AND cbp.Ativo=1 AND cbp.IdEmpresa=@IdEmpresa AND pr.IdMarca=cb.IdTipoEspecifico

if(@TipoBloqueio <> 0) INSERT INTO @VetBloqueios VALUES(@TipoBloqueio, @MargemItem, @Observacao)

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR GRUPO
SET @TipoBloqueio = 0; SET @Observacao='';
SELECT @TipoBloqueio = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 16 --Margem do item menor que a margem do GRUPO
WHEN @MargemItem>cb.MargemMaxima THEN 17 --Margem do item maior que a margem maxima do GRUPO
ELSE 0 END,0),
@Observacao = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem mínima do GRUPO: ' + CAST(cb.MargemMinima as varchar)
WHEN @MargemItem>cb.MargemMaxima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem máxima do GRUPO: ' + CAST(cb.MargemMaxima as varchar)
ELSE '' END,'')
FROM ftConfiguracaoBloqueio cb 
LEFT JOIN ftConfiguracaoBloqueio cbp ON cbp.IdConfiguracaoBloqueio=cb.IdConfiguracaoBloqueioPai
LEFT JOIN ftPedidoItem pi ON pi.IdPedidoItem=@IdPedidoItem
LEFT JOIN prProduto pr ON pr.IdProduto=pi.IdProduto 
WHERE cb.TipoBloqueio=1 AND cb.TipoEspecifico=1 --AND cb.Ativo=1 
AND cbp.Ativo=1 AND cbp.IdEmpresa=@IdEmpresa AND pr.IdGrupo=cb.IdTipoEspecifico

if(@TipoBloqueio <> 0) INSERT INTO @VetBloqueios VALUES(@TipoBloqueio, @MargemItem, @Observacao)

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR FORNECEDOR
SET @TipoBloqueio = 0; SET @Observacao='';
SELECT @TipoBloqueio = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 18 --Margem do item menor que a margem do FORNECEDOR
WHEN @MargemItem>cb.MargemMaxima THEN 19 --Margem do item maior que a margem maxima do FORNECEDOR
ELSE 0 END,0),
@Observacao = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem mínima do FORNECEDOR: ' + CAST(cb.MargemMinima as varchar)
WHEN @MargemItem>cb.MargemMaxima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem máxima do FORNECEDOR: ' + CAST(cb.MargemMaxima as varchar)
ELSE '' END,'')
FROM ftConfiguracaoBloqueio cb 
LEFT JOIN ftConfiguracaoBloqueio cbp ON cbp.IdConfiguracaoBloqueio=cb.IdConfiguracaoBloqueioPai
LEFT JOIN ftPedidoItem pi ON pi.IdPedidoItem=@IdPedidoItem
LEFT JOIN prProduto pr ON pr.IdProduto=pi.IdProduto 
WHERE cb.TipoBloqueio=1 AND cb.TipoEspecifico=2 --AND cb.Ativo=1 
AND cbp.Ativo=1 AND cbp.IdEmpresa=@IdEmpresa AND pr.IdFornecedor=cb.IdTipoEspecifico

if(@TipoBloqueio <> 0) INSERT INTO @VetBloqueios VALUES(@TipoBloqueio, @MargemItem, @Observacao)


--VERIFICACAO DE MARGENS PARA BLOQUEIO POR SERVIÇO
SET @TipoBloqueio = 0; SET @Observacao='';
SELECT @TipoBloqueio = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 20 --Margem do item menor que a margem do SERVIÇO
WHEN @MargemItem>cb.MargemMaxima THEN 21 --Margem do item maior que a margem maxima do SERVIÇO
ELSE 0 END,0),
@Observacao = ISNULL(CASE 
WHEN @MargemItem<cb.MargemMinima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem mínima do SERVIÇO: ' + CAST(cb.MargemMinima as varchar)
WHEN @MargemItem>cb.MargemMaxima THEN 'Margem do item: ' + CAST(@MargemItem as varchar) + ', Margem máxima do SERVIÇO: ' + CAST(cb.MargemMaxima as varchar)
ELSE '' END,'')
FROM ftConfiguracaoBloqueio cb 
LEFT JOIN ftConfiguracaoBloqueio cbp ON cbp.IdConfiguracaoBloqueio=cb.IdConfiguracaoBloqueioPai
LEFT JOIN ftPedidoItem pi ON pi.IdPedidoItem=@IdPedidoItem
WHERE cb.TipoBloqueio=1 AND cb.TipoEspecifico=3 --AND cb.Ativo=1 
AND cbp.Ativo=1 AND cbp.IdEmpresa=@IdEmpresa AND pi.IdServico=cb.IdTipoEspecifico

if(@TipoBloqueio <> 0) INSERT INTO @VetBloqueios VALUES(@TipoBloqueio, @MargemItem, @Observacao)

Fetch Next From CursorPro into @IdPedidoItem
end  
Close CursorPro  
Deallocate CursorPro  

return        
End   
GO

ALTER FUNCTION [dbo].[ftCalcularLimiteCredito](
	@IdEntidade varchar(10),
	@IdEmpresa  int,
	@IdPedido   int,
	@DataAtual  datetime,
	@ValorPedidoAtual decimal(18,2),
	@PrazoMedio int
)	
Returns @Campos Table                                              
  (                                                 
    TipoBloqueio int,
	BloqueioParcialTotal int,   -- 1-Parcial, 2-Total
    ValorEmAberto decimal(18,2),
    ValorTotalPedidos decimal(18,2),
    DataUltimaCompra datetime,
	Observacao varchar(max)
  ) 
AS 
Begin                                                                                                                       
	Declare @RetBloqAtraso int                                                                                                     
	Declare @RetBloqInativo int                                              
	Declare @RetBloqLimite int                                              
	Declare @RetBloqPrazoMedio int                                              
	Declare @RetValorAberto decimal(11,2)                                              
	Declare @RetValorLimiteCredito decimal(11,2)                                              
	Declare @RetDataUltimaCompra datetime                                               																			                                               
	Declare @IdSituacaoEntidade numeric(5)                                                                                            
	Declare @AuxValorAberto decimal(11,2)                                              
	Declare @AuxAtraso numeric(5)                                              				                                            
	Declare @AuxDataEmissao datetime                                              
	Declare @AuxLimiteCredito decimal(11,2)                                              
	Declare @AuxDiaCompra numeric(5)                                              
	Declare @Valor decimal(11,2)                                          
	Declare @Dias numeric(4)                                              
	Declare @Data DateTime                                             				   
	Declare @PrimeiraData DateTime                                                                                                                                           
	Declare @BloqAtrasoTotal numeric(5)                                               
	Declare @BloqAtrasoParcial numeric(5)                                               
	Declare @BloqPrazoMedio numeric(5)                                               									
	Declare @BloqDiasInativoParcial  numeric(5)                                                   				  
	Declare @DataCadastro datetime                                                                                   				  
	Declare @BloqDiasInativoTotal numeric(5)             
	Declare @DataRevisao datetime                            
	Declare @AuxDiasInativos numeric(5)                    				  
	Declare @RetBloqRevisaoCadastro int                         
	Declare @BloqRevisaoCadParcial numeric(5)                        
	Declare @BloqRevisaoCadTotal numeric(5)                        
	Declare @AuxDiasRevisao numeric(5)                             
	Declare @FlagBloqRevisaoCadDuplAtraso smallint        
	Declare @RetFlagBloqRevisaoCadDuplAtraso smallint
	Declare @RetValorTotalPedidos decimal(11,2)  
	Declare @TipoSituacao int
						  
	Set @RetBloqRevisaoCadastro = 0                                                                             
	Set @RetBloqLimite = 0                                              
	Set @RetValorAberto = 0                                              
	Set @RetBloqAtraso = 0                                                                                  
	Set @RetBloqPrazoMedio = 0                         
	Set @RetBloqInativo = 0                                  
	Set @RetValorLimiteCredito = 0   
	Set @RetValorTotalPedidos = 0                                   
				
	Select @IdSituacaoEntidade = Cred.IdSituacaoEntidade,
		   @DataCadastro = Ent.DataCadastro,                                                     
		   @DataRevisao = Cred.DataRevisaoCadastro,
		   @AuxLimiteCredito = Cred.ValorLimiteCredito,
		   @BloqAtrasoTotal = Sit.BloqAtrasoTotal,
		   @BloqAtrasoParcial = Sit.BloqAtrasoParcial,
		   @BloqPrazoMedio = Sit.BloqPrazoMedio,
		   @BloqDiasInativoParcial = Sit.BloqDiasInativoParcial,
		   @BloqDiasInativoTotal = Sit.BloqDiasInativoTotal,
		   @BloqRevisaoCadParcial = Sit.BloqRevisaoCadParcial,
		   @BloqRevisaoCadTotal = Sit.BloqRevisaoCadTotal,
		   @TipoSituacao = Sit.TipoSituacao
	From tbEntidade Ent                                              
	Left Join tbEntidadeCredito Cred on Cred.IdEntidade = Ent.IdEntidade                                          
									and Cred.IdEmpresa = @IdEmpresa                                          
	Left Join tbSituacaoEntidade Sit on Sit.IdSituacaoEntidade = Cred.IdSituacaoEntidade                                         
	Where Ent.IdEntidade = @IdEntidade   
	
	If ((@IdSituacaoEntidade is null) or (@IdSituacaoEntidade = 0))
	begin
		Select @IdSituacaoEntidade = PC.IdSituacaoEntidade,
			   @BloqAtrasoTotal = Sit.BloqAtrasoTotal,
			   @BloqAtrasoParcial = Sit.BloqAtrasoParcial,
			   @BloqPrazoMedio = Sit.BloqPrazoMedio,
			   @BloqDiasInativoParcial = Sit.BloqDiasInativoParcial,
			   @BloqDiasInativoTotal = Sit.BloqDiasInativoTotal,
			   @BloqRevisaoCadParcial = Sit.BloqRevisaoCadParcial,
			   @BloqRevisaoCadTotal = Sit.BloqRevisaoCadTotal,
			   @TipoSituacao = Sit.TipoSituacao
		From tbParametroControle PC                                                                                     
		Left Join tbSituacaoEntidade Sit on Sit.IdSituacaoEntidade = PC.IdSituacaoEntidade                                         
		Where PC.IdEmpresa = @IdEmpresa
	end                                        
																								  
	If (@IdSituacaoEntidade is null)                                              
		Set @IdSituacaoEntidade = 0                                                                                                                                                                                                          															                                             								
	If (@AuxLimiteCredito is null)                                              
		Set @AuxLimiteCredito = 0 		
	If (@BloqAtrasoTotal is Null)                                              
		Set @BloqAtrasoTotal = 0                                              
	If (@BloqAtrasoParcial is Null)                                              
		Set @BloqAtrasoParcial = 0                                              
	If (@BloqPrazoMedio is Null)                                              
		Set @BloqPrazoMedio = 0                                              
	If (@BloqDiasInativoParcial is Null)                                              
		Set @BloqDiasInativoParcial = 0                                              				  
	If (@BloqDiasInativoTotal is Null)                                              
		Set @BloqDiasInativoTotal = 0                                              				  
	If (@BloqRevisaoCadParcial is Null)                                              
		Set @BloqRevisaoCadParcial = 0                                              
	If (@BloqRevisaoCadTotal is Null)                                             
		Set @BloqRevisaoCadTotal = 0   
	If (@TipoSituacao is Null)                                             
		Set @TipoSituacao = 0  		   
																								
	Set @AuxValorAberto = 0                                              
	Set @AuxAtraso = 0                                                                                         				                                                                                                                   
													 
	/**********************************************************************                                      
	CALCULO DOS DIAS EM ATRASO DA ENTIDADE                                							                                                                                     
	***********************************************************************/                                
	Select                                				
	  @Dias = Max(CASE WHEN (DataPagamento IS NULL AND DataCompensacaoVencimento < @DataAtual OR
                   DataPagamento = 0 AND DataCompensacaoVencimento < @DataAtual) THEN 
                   isnull(datediff(dd, DataCompensacaoVencimento, @DataAtual), 0) 
             WHEN NOT DataPagamento IS NULL THEN isnull(datediff(dd, DataCompensacaoVencimento, DataPagamento), 0) ELSE 0 END)					     					   					                                           
	From fnTitulo                                                
	Where IdEmpresa = @IdEmpresa                                               	  	  
	  and TipoCarteira = 2                                              
	  and IdEntidade = @IdEntidade                                                                                                 
	  and DataPagamento is null                                                                                         									  
			
	/**********************************************************************                                                        
	CALCULO DOS TITULOS A RECEBER EM ABERTO                                
	***********************************************************************/                                
	Select                                
	  @Valor = IsNull(Sum(ValorABaixar), 0)                                
	From fnTitulo 
	Where IdEmpresa = @IdEmpresa                                                                                          
	  and TipoCarteira = 2                                              
	  and IdEntidade = @IdEntidade                                                                                                  
	  and DataPagamento is null                                                               
	  
	If @Valor is null                                              
	  Set @Valor = 0                                              
	If @Dias is null                                              
	  Set @Dias = 0                                               
											  
	Set @AuxValorAberto = @AuxValorAberto + @Valor                                              
	If @Dias > @AuxAtraso                                             
	  Set @AuxAtraso = @Dias                                                                    											 													                                    
										
	/**********************************************************************                                                               
	SOMA TODOS OS PEDIDOS EM ABERTO (INCLUSIVO O ATUAL)                                             
	***********************************************************************/     
	Select                                 
	  @Valor = IsNull(Sum(ValorTotalPedido), 0)                                
	From ftPedido                                                             
	Where IdEmpresa = @IdEmpresa
	  and IdEntidade = @IdEntidade                                              					  
	  and StatusPedido in (0,1) --0-Aberto 1-Fechado                        
	  and TipoPedido = 0
								  
	If @Valor is null                                            
	  Set @Valor = 0                                              
	Set @AuxValorAberto = @AuxValorAberto + @Valor  

	Set @RetValorTotalPedidos = @Valor;                                                																																							   
					
	/**********************************************************************                                
	LEITURA DA ULTIMA COMPRA                                                                                          
	***********************************************************************/                                
	Set @Data = null                                    
	Select Top 1                
	  @Data = DataEmissao
	From fiNotaFiscal                					
	Where IdEmpresa = @IdEmpresa
	  and TipoMovimento = 2                                              
	  and IdEntidade = @IdEntidade                                              
	  and DataEmissao <= @DataAtual                                                               
	order by DataEmissao Desc                                              
										  
	if (@Data is null) and (@IdEntidade = @IdEntidade)                                    
	  Set @Data = @DataCadastro                                    
											 
	If @AuxDataEmissao is null                                              
	  Set @AuxDataEmissao = @Data                                              
											  
	If (not @Data is null) and (@Data > @AuxDataEmissao)                                              
	  Set @AuxDataEmissao = @Data  
												  
	Set @RetDataUltimaCompra = @AuxDataEmissao                 
											  											  				  
	If not (@IdPedido is null) and (@IdPedido > 0)                                              
	begin                                              
		Set @Valor = 0 
		                                             
		Select                                 
			@Valor = ValorTotalPedido                                              
		From ftPedido
		Where IdEmpresa = @IdEmpresa                                 
		  and IdPedido = @IdPedido     
	      and IdEntidade = @IdEntidade                                            
	      and TipoPedido = 0
								 
		If (@Valor Is null)                     
			Set @Valor = 0                                              
		Set @AuxValorAberto = @AuxValorAberto - @Valor  

		Set @RetValorTotalPedidos = @RetValorTotalPedidos - @Valor;                                                
	end                                              											  
				  
	If (Not (@ValorPedidoAtual is null) and (@ValorPedidoAtual > 0))
	begin                                              
		Set @AuxValorAberto = @AuxValorAberto + @ValorPedidoAtual                          

		Set @RetValorTotalPedidos = @RetValorTotalPedidos + @ValorPedidoAtual;    
	end
																
	Set @RetValorAberto = @AuxValorAberto                                                                                                          
				  
	Set @RetValorLimiteCredito = @AuxLimiteCredito                                              
																
	Set @AuxDiaCompra = isnull(abs(Cast(@DataAtual - @AuxDataEmissao as int)),0) 
	
	/**********************************************************************                                
	BLOQUEIO POR TIPO DA SITUAÇÃO
	***********************************************************************/ 	
	--Bloqueado Parcial
	if (@TipoSituacao = 1)
	begin
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(9, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra, 'Tipo de Situação: 1') 
	end
	--Bloqueado Total
	else if (@TipoSituacao = 2)
	begin
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(10, 2, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra, 'Tipo de Situação: 2') 
	end
	--Inativo
	else if (@TipoSituacao = 3)
	begin
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(11, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra, 'Tipo de Situação: 3') 
	end
		
	/**********************************************************************                                
	BLOQUEIO POR LIMITE DE CRÉDITO
	***********************************************************************/ 		
	
	If ((@AuxValorAberto > @AuxLimiteCredito) and (@AuxLimiteCredito > 0))
	begin                                    
		Set @RetBloqLimite = 1                                              														   				                                                                                                                                                                                                 									                                             
		
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(1, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Valor em Aberto: ' + cast(@AuxValorAberto as varchar) 
			+ ', Limite de Crédito: ' + cast(@AuxLimiteCredito as varchar))
	end	                                            
	
	/**********************************************************************                                
	BLOQUEIO POR ATRASO                                                                                         
	***********************************************************************/ 	
	
	If ((@AuxAtraso >= @BloqAtrasoTotal) and (@BloqAtrasoTotal > 0))   
	begin                                          
		Set @RetBloqAtraso = 2                                               
			
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(2, 2, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Atraso Calculado: ' + cast(@AuxAtraso as varchar) 
			+ ', Limite de Atraso: ' + cast(@BloqAtrasoTotal as varchar))  		
	end
											  				  
	If (@RetBloqAtraso = 0)                                              
	begin                                                                                               
		If ((@AuxAtraso >= @BloqAtrasoParcial) and (@BloqAtrasoParcial > 0)) 
		begin                                             
			Set @RetBloqAtraso = 1                                                
				
			Insert Into @Campos                                 
				(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
			Values                                 
				(3, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Atraso Calculado: ' + cast(@AuxAtraso as varchar) 
			+ ', Limite de Atraso: ' + cast(@BloqAtrasoParcial as varchar)) 			
		end
	end    
				
	/**********************************************************************                                
	BLOQUEIO POR INATIVO                                   
	***********************************************************************/ 															                                   
                                          
	if ((@AuxDiaCompra >= @BloqDiasInativoTotal) and (@BloqDiasInativoTotal > 0))                                              
	begin                            
		if not (@DataRevisao is null)                            
		begin                            
			Set @AuxDiasInativos = isnull(abs(Cast(@DataAtual - @DataRevisao as int)),0)   
				  
			if ( @AuxDiasInativos >= @BloqDiasInativoTotal )
			begin                            
				set @RetBloqInativo = 2                                     
			
				Insert Into @Campos                                 
					(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
				Values                                 
					(4, 2, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Inatividade Calculada: ' + cast(@AuxDiaCompra as varchar) 
			+ ', Limite de Inatividade: ' + cast(@BloqDiasInativoTotal as varchar)) 				
			end
		end                            
		else                         
		begin   
			set @RetBloqInativo = 2 
			
			Insert Into @Campos                                 
				(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
			Values                                 
				(4, 2, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Inatividade Calculada: ' + cast(@AuxDiaCompra as varchar) 
			+ ', Limite de Inatividade: ' + cast(@BloqDiasInativoTotal as varchar)) 				 	  	                                        
		end
	end                            
							
	if (@RetBloqInativo = 0)                            
	begin                            	
		if ((@AuxDiaCompra >= @BloqDiasInativoParcial) and (@BloqDiasInativoParcial > 0))                                              
		begin                            
			if not (@DataRevisao is null)                            
			begin                            
				Set @AuxDiasInativos = isnull(abs(Cast(@DataAtual - @DataRevisao as int)),0)                            
					
				if  (@AuxDiasInativos >= @BloqDiasInativoParcial)   
				begin       
					set @RetBloqInativo = 1                                     
					
					Insert Into @Campos                                 
						(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
					Values                                 
						(5, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Inatividade Calculada: ' + cast(@AuxDiaCompra as varchar) 
			+ ', Limite de Inatividade: ' + cast(@BloqDiasInativoParcial as varchar)) 	
				end
			end                            
			else                            
			begin
				set @RetBloqInativo = 1                                             
				
				Insert Into @Campos                                 
					(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
				Values                                 
					(5, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Inatividade Calculada: ' + cast(@AuxDiaCompra as varchar) 
			+ ', Limite de Inatividade: ' + cast(@BloqDiasInativoParcial as varchar)) 					
			end
		end                            
	end      
	
	/**********************************************************************                                
	BLOQUEIO POR REVISAO CADASTRO                                   
	***********************************************************************/ 	                      
										  				  
	Set @AuxDiasRevisao  = 0                        
				  				  
	if not (@DataRevisao is null) and (@DataAtual >= @DataRevisao)                        
	begin                        
		Set @AuxDiasRevisao = isnull(abs(Cast(@DataAtual - @DataRevisao as int)),0)                      
	end                        
	else                        
	begin                        
		if not (@DataRevisao is null) and (@DataAtual = @DataRevisao)                    
		begin                          
			Set @AuxDiasRevisao = 0                    
		end                    
		else                    
		begin                    
			if not (@DataCadastro is null) and (@DataAtual > @DataCadastro)                        
				Set @AuxDiasRevisao = isnull(abs(Cast(@DataAtual - @DataCadastro as int)),0)                               
		end                        
	end                    
						                           
	if (@BloqRevisaoCadTotal > 0) and ( @AuxDiasRevisao >= @BloqRevisaoCadTotal )                            
	begin                        
		set @RetBloqRevisaoCadastro = 2    
		
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(6, 2, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Revisão Calculada: ' + cast(@AuxDiasRevisao as varchar) 
			+ ', Limite de Revisão: ' + cast(@BloqRevisaoCadTotal as varchar)) 		                                 
	end  
	else if (@BloqRevisaoCadParcial > 0) and ( @AuxDiasRevisao >= @BloqRevisaoCadParcial )                           
	begin                        	
		set @RetBloqRevisaoCadastro = 1 
		
		Insert Into @Campos                                 
			(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
		Values                                 
			(7, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra, 'Revisão Calculada: ' + cast(@AuxDiasRevisao as varchar) 
			+ ', Limite de Revisão: ' + cast(@BloqRevisaoCadParcial as varchar)) 			                                    
	end   
	
	/**********************************************************************                                
	BLOQUEIO POR PRAZO MÉDIO
	***********************************************************************/ 		                       
											  				  
	If not (@PrazoMedio is null)                                              
	begin                                              	
		If ((@PrazoMedio >= @BloqPrazoMedio) and (@BloqPrazoMedio > 0)) 
		begin                                             
			Set @RetBloqPrazoMedio = 1                                              
			
			Insert Into @Campos                                 
				(TipoBloqueio, BloqueioParcialTotal, ValorEmAberto, ValorTotalPedidos, DataUltimaCompra, Observacao)
			Values                                 
				(8, 1, @RetValorAberto, @RetValorTotalPedidos, @RetDataUltimaCompra,
			'Prazo Médio Calculado: ' + cast(@PrazoMedio as varchar) 
			+ ', Limite de Prazo Médio: ' + cast(@BloqPrazoMedio as varchar)) 				
		end
	end    
	
	Return
end 
go

ALTER function [dbo].[fiCalcularImpostos]      
(       
 -- Add the parameters for the function here      
 @ParamEmpOrigem int,      
 @ParamIdEntidade varchar(10),      
 @ParamIdOperacao int,      
 @ParamTipoProdutoServico int,  --0-Produto, 1-Servico      
 @ParamIdProdutoServico int,      
 @ParamIdClassificacao varchar(20),      
 @ParamIdTributacao varchar(20),      
 @ParamValorBaseIPI decimal(18,2),      
 @ParamValorBaseICMS decimal(18,2),      
 @ParamValorBasePisCofins decimal(18,2),      
 @ParamTipoSaidaEntrada int, --0-Saida, 1-Entrada      
 @ParamIdListaPreco int      
)      
Returns @Retorno Table      
(      
  UFOrigem                   varchar(10),      
  UFDestino                  varchar(10),      
  IdTipoContribuinte         int,      
  FlagConsumo                bit,      
  FlagContribuinte           bit,      
  TipoOrigemProd             smallint,      
  IdTipoFiscal               smallint,      
  TipoCFOP                   smallint,      
  IdCFOP                     varchar(10),      
  IdTributacao               varchar(20),      
  SequenciaTributacao        int,      
  IdClassificacao            varchar(20),      
  -- Informaçoes IPI      
  IdParametroIPI             smallint,      
  CstIPI                     varchar(10),      
  AliqIPI                    decimal(5,2),      
  FlagIPIVenda               bit,      
  ValorBaseIPI               decimal (18,2),      
  ValorIPI                   decimal (18,2),      
  TipoIPINaoTrib             smallint,      
  CodEnquadramentoIPI        smallint,
  ValorIsentasIPI    decimal (18,2),      
  ValorOutrasIPI    decimal (18,2),           
   -- Informaçoes do ICMS      
  IdParametroICMS            int,      
  CstICMS                    varchar(10),      
  CstCSOSN                   varchar(10),      
  ModalidadeBaseICMS         smallint,      
  AliqICMS                   decimal(5,2),      
  AliqComplementarICMS       decimal(5,2),       
  PercReducaoBaseICMS        decimal(5,2),      
  CalculaICMS                bit,      
  SomaIPINaBaseICMS          bit,      
  EstAliqInternaICMS         decimal(5,2),      
  EstAliqInterestadualICMS   decimal(5,2),      
  ValorBaseICMS              decimal (18,2),      
  ValorICMS                  decimal (18,2),      
  TipoICMSNaoTrib            smallint,      
  ValorIsentasICMS           decimal (18,2),      
  ValorOutrasICMS            decimal (18,2),  
  -- Informaçoes do ICMSST      
  IdParametroICMSST          int,      
  AliqICMSST                 decimal(5,2),      
  PercReducaoBaseICMSST      decimal(5,2),      
  PercMvaICMSST              decimal(5,2),      
  ModalidadeBaseICMSST       smallInt,      
  CalculaICMSST              bit,      
  ValorBaseICMSST            decimal(18,2),      
  ValorICMSST                decimal(18,2),      
  FlagDifAliqICMSSTProtocolo bit,      
  FlagDifAliqICMSSTEntidade  bit,      
  CEST                       varchar(10),    
  -- Informaçoes do Pis/Cofins      
  IdParametroPisCofins       int,      
  CstPisCofins               varchar(10),      
  AliqPIS                    decimal(5,2),      
  AliqComplementarPIS        decimal(5,2),      
  AliqCOFINS                 decimal(5,2),      
  AliqComplementarCOFINS     decimal(5,2),      
  CalculaPisCofins           bit,      
  SomaIPINaBasePisCofins     bit,      
  ValorBasePisCofins         decimal(18,2),      
  ValorPis                   decimal(18,2),      
  ValorCofins                decimal(18,2),      
  -- Informaçoes do ISS      
  IdParametroISS             int,      
  ValorBaseISS               decimal(18,2),      
  AliqISS                    decimal(5,2),      
  ValorISS                   decimal(18,2),
  --Informaçoes da Partilha de ICMS
  AliqFCP                    decimal(5,2),         
  ValorFCP                   decimal(18,2),         
  AliqICMSDestino            decimal(5,2),         
  PercPartilhaICMSOrigem     decimal(5,2),        
  PercPartilhaICMSDestino    decimal(5,2),        
  ValorPartilhaICMSOrigem    decimal(18,2),        
  ValorPartilhaICMSDestino   decimal(18,2)      
)        
as      
begin            
  Declare @EmpMestre varchar(10)      
  Declare @UFOrigem varchar(10)      
  Declare @UFDestino varchar(10)      
  Declare @IdTipoContribuinte int      
  Declare @FlagConsumo bit      
  Declare @FlagContribuinte bit      
  Declare @TipoOrigemProd smallint      
  Declare @IdTributacao varchar(20)
  Declare @SequenciaTributacao int       
  Declare @IdTipoFiscal smallint      
  Declare @TipoCFOP smallint      
  Declare @IdClassificacao varchar(20)      
  Declare @TipoRegimeTributario int 
  Declare @AliqICMSimples decimal(6,2) 
  Declare @IdCFOP varchar(10)      
  -- Informaçoes IPI      
  Declare @IdParametroIPI   smallint      
  Declare @CstIPI           varchar(10)      
  Declare @AliqIPI          decimal(5,2)      
  Declare @FlagIPIVenda     bit      
  Declare @ValorBaseIPI     decimal (18,2)      
  Declare @ValorIPI         decimal (18,2)      
  Declare @TipoIPINaoTrib   smallint      
  Declare @CodEnquadramentoIPI  smallint
  Declare @ValorIsentasIPI decimal (18,2)      
  Declare @ValorOutrasIPI decimal (18,2)       
  -- Informaçoes do ICMS      
  Declare @IdParametroICMS          int      
  Declare @ModalidadeBaseICMS       smallint      
  Declare @AliqICMS                 decimal(5,2)      
  Declare @AliqICMS_Salva           decimal(5,2)
  Declare @AliqComplementarICMS     decimal(5,2)       
  Declare @PercReducaoBaseICMS      decimal(5,2)      
  Declare @CalculaICMS              bit      
  Declare @SomaIPINaBaseICMS        bit      
  Declare @EstAliqInternaICMS       decimal(5,2)      
  Declare @OrigemEstAliqInternaICMS decimal (5, 2)
  Declare @EstAliqInterestadualICMS decimal(5,2)      
  Declare @ValorBaseICMS            decimal (18,2)       
  Declare @ValorICMS                decimal (18,2)      
  Declare @TipoICMSNaoTrib          smallint      
  Declare @FlagTributaICMS          int   
  Declare @ValorIsentasICMS      decimal (18,2)      
  Declare @ValorOutrasICMS   decimal (18,2)      
  Declare @TempCST varchar(10)
  -- Informaçoes do ICMSST      
  Declare @FlagIgnorarCalculoICMSST int
  Declare @TipoMovimentoOpr int
  Declare @IdParametroICMSST     int      
  Declare @CstICMS               varchar(10)      
  Declare @CstCSOSN              varchar(10)      
  Declare @AliqICMSST            decimal(5,2)      
  Declare @PercReducaoBaseICMSST decimal(5,2)      
  Declare @PercMvaICMSST         decimal(5,2)      
  declare @TipoCFOPST            smallint
  Declare @PercMvaICMSST_Ajustado  Decimal(18,8)
  Declare @ModalidadeBaseICMSST  smallInt      
  Declare @CalculaICMSST         bit      
  Declare @ValorBaseICMSST       decimal(18,2)      
  Declare @ValorICMSST           decimal(18,2)      
  Declare @FlagDifAliqICMSSTProtocolo bit      
  Declare @CEST                  varchar(10)       

  Declare @AuxValorBaseICMSST    decimal(18,2)
  Declare @AuxValorICMSST        decimal(18,2)
  -- Informaçoes do Pis/Cofins      
  Declare @IdParametroPisCofins   int      
  Declare @CstPisCofins           varchar(10)      
  Declare @AliqPIS                decimal(5,2)      
  Declare @AliqComplementarPIS    decimal(5,2)      
  Declare @AliqCOFINS             decimal(5,2)      
  Declare @AliqComplementarCOFINS decimal(5,2)      
  Declare @CalculaPisCofins       bit      
  Declare @SomaIPINaBasePisCofins bit      
  Declare @ValorBasePisCofins     decimal(18,2)      
  Declare @ValorPis               decimal(18,2)      
  Declare @ValorCofins            decimal(18,2)      
  --Informaçoes do ISS      
  declare @IdParametroISS         int      
  Declare @ValorBaseISS           decimal(18,2)      
  Declare @AliqISS                decimal(5,2)      
  Declare @ValorISS               decimal(18,2)        
  --Informaçoes da Partilha de ICMS
  Declare @AliqFCP                   decimal(5,2)        
  Declare @ValorFCP                  decimal(18,2)        
  Declare @AliqICMSDestino           decimal(5,2)        
  Declare @PercPartilhaICMSOrigem    decimal(5,2)        
  Declare @PercPartilhaICMSDestino   decimal(5,2)        
  Declare @ValorPartilhaICMSOrigem   decimal(18,2)        
  Declare @ValorPartilhaICMSDestino  decimal(18,2)        
  Declare @TipoIndicadorIE           smallint          
  Declare @AnoPartilha               int                
  Declare @ValorICMSDestino          decimal (18,2)                
  Declare @ValorICMSDiferencial      decimal (18,2)         
  Declare @TipoItemNFe               int          
  --Gabriella - 500776              
  --Declare @FlagCalcPartilhaICMSParam bit          
  Declare @FlagCalcPartilhaICMSParam smallint          
  Declare @FlagCalcPartilhaICMS      bit    
  -- Informaçoes da Entidade      
  Select       
    @UFDestino = c.IdEstado,       
    @IdTipoContribuinte = e.IdTipoContribuinte,      
    @FlagConsumo = isnull(tc.Flagconsumo,0), 
	--EDER 513554 -- 
	--@FlagContribuinte = isnull(tc.FlagTipoContribuinte,0), 
	@FlagContribuinte = Case When e.TipoIndicadorIE in (2,9) Then 0 --Não Contribuinte
	                         Else 1 End, -- Contribuinte 
	--Gabriella - 490761
    @TipoIndicadorIE= isnull(TipoIndicadorIE,0)   	     
  From tbEntidade e      
    Left Join tbCidade c on (c.IdCidade = e.IdCidade)      
    Left Join tbTipoContribuinte tc on (tc.IdTipoContribuinte = e.IdTipoContribuinte)       
  Where e.IdEntidade = @ParamIdEntidade      
  -- IPI Sobre venda configurado na lista de preço - Somente para produto      
  If @ParamTipoProdutoServico = 0      
  begin      
    Select @FlagIPIVenda = Case When Pre.TipoImpostoIPI > 0 and pp.AliqIPIVenda > 0     
                                Then 1    
                                Else 0 End    
    From tbEmpresa e      
      Left Join prListaPreco pre on Pre.IdListaPreco = @ParamIdListaPreco    
      Left Join prPrecoProduto pp on (pp.IdListaPreco = @ParamIdListaPreco and      
                                      pp.IdGrupoPreco = e.IdGrupoPreco and      
                                      pp.IdProduto = @ParamIdProdutoServico)      
  end      
  -- Informaçoes Empresa Mestre      
  set @EmpMestre = 'M' + Replicate('0',(6 - Len(@ParamEmpOrigem))) + Cast(@ParamEmpOrigem as varchar)        
  Select @UFOrigem = c.IdEstado      
  From tbEntidade e      
    Left Join tbCidade c on (c.IdCidade = e.IdCidade)      
  Where e.IdEntidade = @EmpMestre      
  --Informaçoes do Parametro de Controle
  --Eder 490265
  --Eder 486481
  Select @TipoRegimeTributario = TipoRegimeTributario ,
         @AliqICMSimples = AliqICMSimples,
		 --Gabriella - 490761
		 @FlagCalcPartilhaICMSParam = FlagCalcPartilhaICMS
    from tbParametroControle
   Where IdEmpresa = @ParamEmpOrigem
  -- Informaçoes do Produto - SOmente quando tipo = Produto      
  if @ParamTipoProdutoServico  = 0      
  begin      
    Select           
      @TipoOrigemProd = p.TipoOrigemFiscal,       
      @IdTributacao = p.IdTributacao,      
      @IdClassificacao = Case       
                          When isnull(@ParamIdClassificacao,'') <> ''       
                            Then @ParamIdClassificacao       
                          Else isNull(p.IdClassificacao,'')      
                        End,
      --Gabriella - 490761					
      @TipoItemNFe = isnull(p.TipoItemNfe,0)
    From prProduto p      
    Where p.IdProduto = @ParamIdProdutoServico      
  end      
  -- Informaçoes da Classificaçao      
  Select @AliqIPI = N.AliqIPIPadrao,
		 @CEST = C.CEST       
  from prClassificacaoNCM N
  left join tbCEST C on C.IdCEST = N.IdCEST
  Where N.IdClassificacao = @IdClassificacao      
  -- Informaçoes da Tributacao      
  Select Top 1       
     @TipoCFOP = TipoCFOP,       
     @IdTributacao = IdTributacao,       
     @SequenciaTributacao = Sequencia,      
     @IdParametroICMS = IdParametroICMS,      
     @IdParametroPisCofins = IdParametroPisCofins      
  From fiTributacaoDetalhe td      
  Where IdEmpresaOrigem = @ParamEmpOrigem      
    and td.IdTributacao = Case       
          When (isnull(@ParamIdTributacao,'') <> '')      
          Then @ParamIdTributacao	      
          When (isnull(@IdTributacao,'') <> '')      
          Then @IdTributacao      
          Else null  
        End      
  Order by       
    Case       
      When td.IdEstadoDestino = @UFDestino and td.TipoOrigemProd = @TipoOrigemProd and td.IdTipoContribuinte = @IdTipoContribuinte         
      Then 1      
      When td.IdEstadoDestino = @UFDestino and isnull(td.TipoOrigemProd,'') = '' and td.IdTipoContribuinte = @IdTipoContribuinte      
      Then 2      
      When td.IdEstadoDestino = @UFDestino and td.TipoOrigemProd = @TipoOrigemProd and isnull(td.IdTipoContribuinte,'') = ''      
      Then 3      
      When td.IdEstadoDestino = @UFDestino and isnull(td.TipoOrigemProd,'') = '' and isnull(td.IdTipoContribuinte,'') = ''      
      Then 4      
      When isnull(td.IdEstadoDestino,'') = '' and td.TipoOrigemProd = @TipoOrigemProd and td.IdTipoContribuinte = @IdTipoContribuinte         
      Then 5      
      When isnull(td.IdEstadoDestino,'') = '' and isnull(td.TipoOrigemProd,'') = '' and td.IdTipoContribuinte = @IdTipoContribuinte         
      Then 6      
      When isnull(td.IdEstadoDestino,'') = '' and td.TipoOrigemProd = @TipoOrigemProd and isnull(td.IdTipoContribuinte,'') = ''       
      Then 7      
      When isnull(td.IdEstadoDestino,'') = '' and isnull(td.TipoOrigemProd,'') = ''  and isnull(td.IdTipoContribuinte,'') = ''       
      Then 8
      Else 999      
    End    
	  
    -- Informaçoes TipoFiscal      
    Select       
      @IdParametroIPI = Case       
                          When (@FlagIPIVenda = 1)       
                            Then tf.IdParametroIPITributado      
                          Else tf.IdParametroIPINaoTrib      
                        End,      
      @IdTipoFiscal = o.IdTipoFiscal,      
      -- Parametros de ICMS definidos no Tipo Fiscal sobrepoe os da Tributacao      
      @IdParametroICMS = Case       
                           When (isNull(tf.IdParametroICMS,0) <> 0)       
                             Then tf.IdParametroICMS      
                           Else @IdParametroICMS         
                         End,           
      -- Parametros de Pis/Cofins definidos no Tipo Fiscal sobrepoe os da Tributacao                        
      @IdParametroPisCofins = Case       
           When (isNull(tf.IdParametroPisCofins,0) <> 0)       
             Then tf.IdParametroPisCofins      
         Else @IdParametroPisCofins         
         End,      
      -- Parametros de ISS do9 Tipo Fiscal      
      @IdParametroISS = @IdParametroPisCofins,
	  @FlagIgnorarCalculoICMSST = tf.FlagIgnorarCalculoICMSST,
	  @TipoMovimentoOpr = O.TipoMovimento
    From ftOperacao o      
      Left Join fiTipoFiscal tf on (tf.IdTipoFiscal = o.IdTipoFiscal)      
    Where o.IdOperacao = @ParamIdOperacao      
    -- Informaçoes Fiscais do Estado de Origem
    Select Top 1      
      @OrigemEstAliqInternaICMS = ef.AliqInterna
    From        
      fiEstadoFiscal ef        
    Where ef.IdEmpresaOrigem = @ParamEmpOrigem      
      and ef.IdEstadoDestino = @UFOrigem
    -- Informaçoes Fiscais do Estado de Destino
    Select Top 1      
      @EstAliqInternaICMS = ef.AliqInterna,      
      @EstAliqInterestadualICMS = ef.AliqInterestadual, 
	  --Gabriella - 490761
	  @AliqFCP = isnull(ef.AliqFCP,0)
    From        
      fiEstadoFiscal ef        
    Where ef.IdEmpresaOrigem = @ParamEmpOrigem      
      and ef.IdEstadoDestino = @UFDestino  

    --Gabriella - 490761
    if (@UFDestino <> 'EX') and         
       (@UFOrigem <> @UFDestino) and    --Fora do Estado          
       (@FlagConsumo = 1) and           --Consumo
       (@TipoIndicadorIE = 9) and       --Não Contribuinte       
       (@ParamTipoSaidaEntrada = 0) and --Saida     
       (@TipoItemNFe <> 4) and          --Diferente de Combustivel
	   --Gabriella - 500776
       --(@FlagCalcPartilhaICMSParam = 1) and      
	   (@FlagCalcPartilhaICMSParam in (1,2)) and      
       (@ParamTipoProdutoServico = 0)   --Produto         
      Set @FlagCalcPartilhaICMS = 1        
    else        
      Set @FlagCalcPartilhaICMS = 0 	      
    -- Informaçoes do ICMSST      
    -- Regra de Leitura:      
    -- 1-Tipo de Contribuinte e tipo Saida/Entrada iguais      
    -- 2-Tipo de Contribuinte sem tipo de movimento (Saida/Entrada)      
    -- 3-Tipo de Movimento (Saida/Entrada) sem tipo de contribuinte informado      
   Select Top 1      
      @IdParametroICMSST = IdParametroICMSST,      
      @FlagDifAliqICMSSTProtocolo = FlagDifAliqICMSST      
    From fiGrupoICMSSTDetalhe gDet      
      Left Join fiGrupoICMSST gst on (gst.IdGrupo = gDet.IdGrupo)      
      Left Join fiGrupoICMSSTClassificacao gClass on (gClass.IdGrupo = gst.IdGrupo)          
      Left Join prProduto Prod on Prod.IdProduto = @ParamIdProdutoServico
    Where gDet.IdEmpresaOrigem = @ParamEmpOrigem      
      and isnull(gClass.FlagInativo,0) = 0           
      and gClass.IdClassificacao = @IdClassificacao       
      and gDet.IdEstadoDestino = @UFDestino            
--      and isnull(gDet.TipoSaidaEntrada, @ParamTipoSaidaEntrada) = @ParamTipoSaidaEntrada       
--      and isnull(gDet.IdTipoContribuinte, @IdTipoContribuinte) = @IdTipoContribuinte      
      --Realiza a verificaçao dos cenarios de exclusao da Substituiçao Tributaria
      and not exists(Select * from fiGrupoICMSSTExclusao Exc
                      Where Exc.IdGrupo = gDet.IdGrupo
                        and (
                        --Tipo 1 - Exclusao de Grupo
                        (Exc.Tipo = 1 and Exc.CampoChave1 = 'IdGrupo' and Exc.ValorChave1 = Cast(Prod.IdGrupo as Varchar)) or 
                        --Tipo 2 - Exclusao de Marca
                        (Exc.Tipo = 2 and Exc.CampoChave1 = 'IdMarca' and Exc.ValorChave1 = Cast(Prod.IdMarca as Varchar))
                     ))
    Order by       
       Case       
        When gDet.TipoSaidaEntrada = @ParamTipoSaidaEntrada      
         and gDet.IdTipoContribuinte = @IdTipoContribuinte    
		 and gDet.TipoIndicadorIE = @TipoIndicadorIE                 
             Then 1      
        When gDet.TipoSaidaEntrada = @ParamTipoSaidaEntrada      
		 and gDet.IdTipoContribuinte is null
		 and gDet.TipoIndicadorIE = @TipoIndicadorIE          
             Then 2
        When gDet.IdTipoContribuinte = @IdTipoContribuinte      
         and gDet.TipoSaidaEntrada is null      
		 and gDet.TipoIndicadorIE is null
             Then 3
        When gDet.IdTipoContribuinte = @IdTipoContribuinte    
		 and gDet.TipoIndicadorIE = @TipoIndicadorIE                 
             Then 4
        When gDet.IdTipoContribuinte = @IdTipoContribuinte
             Then 5
        When gDet.TipoIndicadorIE = @TipoIndicadorIE                 
             Then 6
        When gDet.TipoSaidaEntrada = @ParamTipoSaidaEntrada      
             Then 8      
        When gDet.IdTipoContribuinte is null
         and gDet.TipoSaidaEntrada is null      
		 and gDet.TipoIndicadorIE is null
		     Then  9 
        Else 999
      End                                        
               
  --Parametros de ISS do serviço quando informados sobrepoe o tipo fiscal - Somente quando tipo = serviço      
  if @ParamTipoProdutoServico = 1      
  begin      
    Select @IdParametroISS = Ser.IdParametroISS      
      From osServico Ser      
     Where Ser.IdServico = @ParamIdProdutoServico      
       and IdParametroISS is not null      
  end      
   -- Informaçoes dos Parametros dos Impostos      
   -- Parametros IPI       
   Select       
     @CstIPI = ipi.CstIPI,      
     @TipoIPINaoTrib = isNull(ipi.TipoIPINaoTrib,2),
	 @CodEnquadramentoIPI  = ipi.CodEnquadramentoIPI  
   From  fiParametroIPI ipi      
   Where ipi.IdParametroIPI = @IdParametroIPI      
   -- Parametros ICMS      
   Select       
       @ModalidadeBaseICMS = pIcm.ModalidadeBaseICMS,       
       @AliqICMS = pIcm.AliqICMS,                 
       @AliqComplementarICMS = pIcm.AliqComplementarICMS,    
       @PercReducaoBaseICMS = pIcm.PercReducaoBaseICMS,      
       @SomaIPINaBaseICMS = pIcm.FlagSomaIPINaBase,         
       @CstICMS = pIcm.CstICMS,      
       @CstCSOSN = pIcm.CstCSOSN,      
       @TipoICMSNaoTrib = isNull(pIcm.TipoICMSNaoTrib,2),  
       @FlagTributaICMS = fiCstICMS.FlagTributaICMS       
   From fiParametroICMS pIcm      
   left join fiCstICMS on fiCstICMS.CstICMS = pIcm.CstICMS  
   Where pIcm.IdParametroICMS = @IdParametroICMS      
   -- Quando o @AliqICMS nao estiver informada no parametro vai       
   -- pegar a menor aliquota do cadastro de Estados Fiscais      
   -- Caso contrario permanece a aliquota definida no parametro.      
   if (isnull(@AliqICMS,0) = 0) and (isnull(@FlagTributaICMS,0) = 1)     
     Set @AliqICMS = Case -- Sempre vai considerar menor aliquota      
                       When @FlagContribuinte = 0 and @TipoIndicadorIE = 9 
					        Then @OrigemEstAliqInternaICMS
                       --518.265 - Calculo automatico do importado a 4% para venda interestadual
					   When @UFDestino <> @UFOrigem and @TipoOrigemProd in (1, 2, 3, 8)  
					        Then 4.00
					   When @EstAliqInterestadualICMS < @EstAliqInternaICMS and @EstAliqInterestadualICMS > 0 
                         Then @EstAliqInterestadualICMS      
                       Else @EstAliqInternaICMS      
                     End      
   --Gabriella - 490761
   /*        
	Aliquota interestadual das UF envolvidas:        
	- 4% aliquota interestadual para produtos importados;        
	- 7% para os Estados de origem do Sul e Sudeste (exceto ES), destinado para os Estados do Norte, Nordeste, Centro-Oeste e Espirito Santo;        
	- 12% para os demais casos.        
   */        

   if @FlagCalcPartilhaICMS = 1     
   begin        
     if (@TipoOrigemProd in (1, 2, 3, 8))        
       Set @AliqICMS = 4.00            
	 else if ((@UFOrigem = 'PR') or        
	          (@UFOrigem = 'SC') or        
		      (@UFOrigem = 'RS') or        
		      (@UFOrigem = 'MG') or        
		      (@UFOrigem = 'RJ') or        
		      (@UFOrigem = 'SP')) and        
	         ((@UFDestino <> 'PR') and        
		      (@UFDestino <> 'SC') and        
		      (@UFDestino <> 'RS') and        
		      (@UFDestino <> 'MG') and        
		      (@UFDestino <> 'RJ') and        
		      (@UFDestino <> 'SP'))        
	   Set @AliqICMS = 7.00        
	 else        
	   Set @AliqICMS = 12.00         
	 Set @AliqICMS_Salva = @AliqICMS 
	end  
  if @IdParametroICMSST is not null and isnull(@FlagIgnorarCalculoICMSST,0) = 0
  begin
    -- Parametros ICMSST      
    Select       
    @CstICMS = Case When st.TipoOrigemCST = 0 Then st.CstICMS_Definido  --CST Fixo Definido      
                  When st.TipoOrigemCST = 1 Then  --CST Derivado do ICMS      
                       Case When isnull(@PercReducaoBaseICMS,0) > 0 and @AliqICMS > 0 and isNull(st.CstICMS_ICMRedBase,'') <> ''        
                                 Then st.CstICMS_ICMRedBase      
                            When isnull(@AliqICMS,0) > 0 and isNull(st.CstICMS_ICMTributado,'') <> ''        
                                 Then st.CstICMS_ICMTributado      
                               When isnull(@AliqICMS,0) = 0  and isNull(st.CstICMS_ICMIsento,'') <> ''      
                                Then st.CstICMS_ICMIsento      
                               Else Null      
                          End      
                 End,                  
   @CstCSOSN = st.CstCSOSN,                   
   @AliqICMSST = st.AliqICMSST,                
   @PercReducaoBaseICMSST = st.PercReducaoBaseICMSST,      
   @PercMvaICMSST = st.PercMvaICMSST,              
   --Eder 513554
   @TipoCFOPST = st.TipoCFOP,
   @ModalidadeBaseICMSST = st.ModalidadeBaseICMSST      
   From fiParametroICMSST st      
  Where      
       st.IdParametroICMSST = @IdParametroICMSST      
  end 
   -- Quando o @AliqICMSST nao estiver informada no parametro vai pegar a       
   -- aliquota interna do estado destino no cadastro de Estados Fiscais      
   -- Caso contrario permanece a aliquota definida no parametro.      
   if (@AliqICMSST = 0)      
     Set @AliqICMSST = @EstAliqInternaICMS                           
  --EDER - 458780 - TEMPORARIO
  if (@IdParametroICMSST is not null) and (isnull(@FlagIgnorarCalculoICMSST,0) = 0) 
  begin
    --Eder 513554
    Set @TipoCFOP = @TipoCFOPST
    --if isnull(@PercMvaICMSST,0) = 0
    --   set @TipoCFOP = '3'      
    --else                      
    --   set @TipoCFOP = '4'            
  end 
  --Calculo do MVA Ajustado, calcula apenas para regime normal, nunca para Simples Nacional
  if @AliqICMS > 0 and @EstAliqInternaICMS > 0 and @TipoRegimeTributario in (0)
  begin
    Set @PercMvaICMSST_Ajustado = (1 - (@AliqICMS/100)) / (1 - (@EstAliqInternaICMS/100))                                                                                          
    Set @PercMvaICMSST_Ajustado = @PercMvaICMSST_Ajustado * (1 + (@PercMvaICMSST/100))                                                                                          
    Set @PercMvaICMSST_Ajustado = (@PercMvaICMSST_Ajustado - 1) * 100                                                                                          
    Set @PercMvaICMSST_Ajustado = Round (@PercMvaICMSST_Ajustado,2)                  
  end
  else
    Set @PercMvaICMSST_Ajustado = @PercMvaICMSST

    --Informaçoes do CFOP      
    Select Top 1       
       @IdCFOP = Case          
     When (@UFOrigem = 'EX') or (@UFDestino = 'EX') and (IsNull(IdCFOPExterior,'') <> '')      
       Then IdCFOPExterior      
     When (@UFOrigem <> @UFDestino) and (@FlagContribuinte = 0)  and (IsNull(IdCFOPNaoContrForaEstado,'') <> '')      
          Then IdCFOPNaoContrForaEstado      
     When (@FlagContribuinte = 0) and (IsNull(IdCFOPNaoContr,'') <> '')      
       Then IdCFOPNaoContr      
     When (@UFOrigem <> @UFDestino) and (IsNull(IdCFOPForaEstado,'') <> '')      
       Then IdCFOPForaEstado            
     Else IdCFOPEstado      
      End        
    From fiTipoFiscalCFOP      
    Where IdTipoFiscal = @IdTipoFiscal      
      and TipoCFOP = Case       
                       When (isNull(@TipoCFOP,'') <> '')      
                         Then @TipoCFOP      
                       Else 1      
                     End          
   --Eder - 486481 - De acordo com o parametro de controle acerta os CST's 
   If @TipoRegimeTributario = 0  --Normal
      Set @CstCSOSN = null
   Else
   begin
      Set @CstICMS = null
	  set @TempCST = null
   end
   If @CstICMS is not null 
   begin
     Select @CalculaICMS = cst.FlagTributaICMS,      
            @CalculaICMSST = cst.FlagTributaICMSST      
     From fiCstICMS cst       
     Where cst.CstICMS = @CstICMS      
   end
   else
   if @CstCSOSN  is not null 
   begin
     Select @CalculaICMS = csosn.FlagTributaICMS,      
            @CalculaICMSST = csosn.FlagTributaICMSST      
     From fiCstCSOSN csosn
     Where csosn.CstCSOSN = @CstCSOSN 
   end
   -- Parametros Pis/Cofins      
   Select      
  @CstPisCofins = pc.CstPisCofins,               
  @AliqPIS = pc.AliqPIS,                    
  @AliqComplementarPIS = pc.AliqComplementarPIS,        
  @AliqCOFINS = pc.AliqCOFINS,                 
  @AliqComplementarCOFINS = pc.AliqComplementarCOFINS,      
  @CalculaPisCofins = cst.FlagTributado,      
  @SomaIPINaBasePisCofins = pc.FlagSomaIPINaBase      
   From fiParametroPisCofins pc      
     Left Join fiCstPisCofins cst on (pc.CstPisCofins = cst.CstPisCofins)      
   Where       
     pc.idParametroPisCofins = @IdParametroPisCofins      
   -- Parametros de ISS      
   Select      
  @AliqISS = iss.AliqISS      
   From fiParametroISS iss      
   Where       
     iss.idParametroISS = @IdParametroISS      
   ----------------------------------------------------------------------------------------------------------------------      
   --* CALCULO DOS IMPOSTOS       
   ----------------------------------------------------------------------------------------------------------------------         
  Set @TempCST = LTRIM(Rtrim(Right(@CstICMS,3)))
   -- Calculo do IPI      
   Set @ValorIPI = 0      
   Set @ValorBaseIPI = 0      
   Set @ValorIsentasIPI = 0      
   Set @ValorOutrasIPI = 0      
   if (@FlagIPIVenda = 1)      
   begin      
     Set @ValorBaseIPI = @ParamValorBaseIPI;      
     Set @ValorIPI = isNull(Round(@ValorBaseIPI * (@AliqIPI / 100),2),0)       
   end          
   if (@ParamValorBaseIPI - @ValorBaseIPI > 0)      
   begin      
     if (@TipoIPINaoTrib = 1) -- 1      
       Set @ValorIsentasIPI = @ParamValorBaseIPI - @ValorBaseIPI      
     else if (@TipoIPINaoTrib = 2)      
       Set @ValorOutrasIPI = @ParamValorBaseIPI - @ValorBaseIPI        
   end      
   --Eder - 476774
   if (@ValorBaseIPI > 0) Set @CodEnquadramentoIPI = '999'
   -- Calculo PIS/COFINS      
   Set @ValorPis = 0      
   Set @ValorCofins = 0      
   Set @ValorBasePisCofins = 0      
   if (@CalculaPisCofins = 1)      
   begin      
     Set @ValorBasePisCofins = @ParamValorBasePisCofins             
     if (@SomaIPINaBasePisCofins = 1)      
       Set @ValorBasePisCofins =  + @ValorBasePisCofins + isnull(@ValorIPI,0)
     Set @ValorPis = Round(@ValorBasePisCofins * ((@AliqPIS + isnull(@AliqComplementarPIS,0)) / 100),2)      
     Set @ValorCofins = Round(@ValorBasePisCofins * ((@AliqCOFINS + isnull(@AliqComplementarCOFINS,0)) / 100),2)      
   end      
   -- Calculo ICMS      
   Set @ValorICMS = 0    
   Set @ValorBaseICMS = 0      
   Set @ValorIsentasICMS = 0      
   Set @ValorOutrasICMS = 0      
   if (@CalculaICMS = 1)      
   begin      
     Set @ValorBaseICMS = @ParamValorBaseICMS      
     -- Aplicando Percentual de Reduçao de Base, se houver.      
     if (@PercReducaoBaseICMS > 0)      
       Set @ValorBaseICMS = Round(@ParamValorBaseICMS - (@ParamValorBaseICMS * (@PercReducaoBaseICMS/100)),2)      
     if (@SomaIPINaBaseICMS = 1)      
       Set @ValorBaseICMS = @ParamValorBaseICMS + @ValorIPI;      
     Set @ValorICMS = Round(@ValorBaseICMS * ((@AliqICMS + @AliqComplementarICMS) / 100),2)              
   end      
   if ((@ParamValorBaseICMS - @ValorBaseICMS) > 0)      
   begin      
  if (@TipoICMSNaoTrib = 1)      
    Set @ValorIsentasICMS =  @ParamValorBaseICMS - @ValorBaseICMS      
  else if (@TipoICMSNaoTrib = 2)      
    Set @ValorOutrasICMS =  @ParamValorBaseICMS - @ValorBaseICMS        
   end      
   -- Calulo ICMS-ST      
   Set @ValorICMSST = 0      
   Set @ValorBaseICMSST = 0      
   Set @AuxValorBaseICMSST = 0    
   Set @AuxValorICMSST = 0  
   if (@CalculaICMSST = 1) 
   begin      
     --Calcula a ST em variaveis auxiliares e só as utiliza conforme necessidade
     if (@FlagDifAliqICMSSTProtocolo = 1 and @FlagConsumo = 1)      
     begin
       Set @AuxValorBaseICMSST = @ParamValorBaseICMS      
	   Set @PercMvaICMSST_Ajustado = 0
     end 
     else      
       Set @AuxValorBaseICMSST = Round(@ParamValorBaseICMS + (@ParamValorBaseICMS * (@PercMvaICMSST_Ajustado/100)),2)      
     -- Aplicando Percentual de Reduçao de Base, se houver.      
     if (@PercReducaoBaseICMSST > 0)      
       Set @AuxValorBaseICMSST = Round(@AuxValorBaseICMSST - (@AuxValorBaseICMSST * (@PercReducaoBaseICMSST/100)),2)       
     Set @AuxValorICMSST = Round(@AuxValorBaseICMSST * ((@AliqICMSST) / 100),2) - isnull(@ValorICMS,0)
	   
     --EDER 504981
     --Calculo do DIFAL  (POR DENTRO)
	 If @AuxValorBaseICMSST > 0 and @AliqICMSST > 0 
	 begin
	   if @FlagContribuinte = 1
	   begin
	     Set @ValorBaseICMSST = @AuxValorBaseICMSST
	     Set @ValorICMSST = @AuxValorICMSST
  	   end

	   if @FlagConsumo = 1 and @TipoIndicadorIE <>  9
	   begin
         If @UFDestino in ('MG','PR') -- contribuinte consumo, estado MG e Paraná
         begin
           Set @ValorBaseICMSST = @AuxValorBaseICMSST - isnull(@ValorICMS,0)      
           Set @ValorBaseICMSST = @ValorBaseICMSST / (1 - (@AliqICMSST /100))      
           Set @ValorICMSST = (@ValorBaseICMSST * @AliqICMSST) / 100                                                                                   
           Set @ValorICMSST = @ValorICMSST - isnull(@ValorICMS,0)                                                     
         end
         else
         If @UFDestino in ('GO') -- contribuinte consumo, GOIAS      
         begin      
           Set @ValorBaseICMSST = @AuxValorBaseICMSST / (1 - (@AliqICMSST /100))      
           Set @ValorICMSST = Round((@ValorBaseICMSST * ((@AliqICMSST-isnull(@AliqICMS,0)  ) / 100)),2)                                                            
         end       
	   end
	end


     --Se simples nacional
     if @TipoRegimeTributario in (1,2)
	 begin
	   Set @ValorbaseICMS = 0
	   Set @AliqICMS = 0 
	   Set @ValorICMS = 0 
	 end
     --Temporariamente esta zerando os valores de ICMS para o CST 60. O Correto é criar um flag para zerar os valores de ICMS      
     if @TempCST = 60 or @CstCSOSN = 500
     begin      
       Set @IdParametroICMS = null      
       Set @ValorBaseICMS = 0      
       Set @PercReducaoBaseICMS = 0      
       Set @ValorICMS = 0      
       Set @AliqICMS = 0      
	   Set @ValorBaseICMSST = 0
	   Set @ValorICMSST = 0
	   Set @AliqICMSST = 0
       Set @AliqComplementarICMS = null      
     end      
   end      
   -- Eder - Calculo do simples nacional
   if @TipoRegimeTributario in (1,2) and @AliqICMSimples > 0 and @ValorBaseICMS > 0 and (@ValorBaseICMSST =0) and (@FlagCalcPartilhaICMS = 0)
   begin	   
     Set @AliqICMS = @AliqICMSimples
	 Set @ValorICMS = Round(@ValorBaseICMS * ((@AliqICMSimples + @AliqComplementarICMS) / 100),2)            
   end
   -- Calulo do ISS somente quando for Tipo = Serviços      
   If (@ParamTipoProdutoServico = 1) and isnull(@AliqISS,0) > 0      
   begin      
      Set @ValorBaseISS = @ParamValorBaseICMS      
      Set @ValorISS = Round(@ValorBaseISS * @AliqISS / 100,2)      
   end      
   else      
   begin      
     Set @ValorBaseISS = null      
     Set @AliqISS = null      
     Set @ValorISS = null      
   end      
   if not @CstICMS is null
   begin
     Select @CstICMS = Case When Len(@TempCST) <= 2 Then Cast(@TipoOrigemProd  as varchar) + @TempCST
	                        When Len(@TempCST) > 2 Then Cast(@TipoOrigemProd as varchar) + Right(@TempCST,2) 
					    End
   end 
   --Gabriella - 490761
   if (@FlagCalcPartilhaICMS = 1)        
   begin        
     --Valor do ICMS relativo ao Fundo de Combate a Pobreza (FCP)        
	 Set @ValorFCP = Round((@ValorBaseICMS * @AliqFCP) / 100, 2)   
	 Set @AliqICMS = @AliqICMS_Salva
	 --Aliquota Interna do Estado de Destino              
	 Set @AliqICMSDestino = @EstAliqInternaICMS - @AliqFCP       
	 Set @AnoPartilha = Year(GetDate())        
	 if (@AnoPartilha <= 2016)        
	 begin        
	  Set @PercPartilhaICMSOrigem = 60.00        
	  Set @PercPartilhaICMSDestino = 40.00        
	 end        
	 else if (@AnoPartilha = 2017)        
	 begin        
	  Set @PercPartilhaICMSOrigem = 40.00        
	  Set @PercPartilhaICMSDestino = 60.00        
	 end        
	 else if (@AnoPartilha = 2018)        
	 begin        
	  Set @PercPartilhaICMSOrigem = 20.00        
	  Set @PercPartilhaICMSDestino = 80.00        
	 end         
	 else if (@AnoPartilha >= 2019)        
	 begin        
	  Set @PercPartilhaICMSOrigem = 0.00        
	  Set @PercPartilhaICMSDestino = 100.00        
	 end          
	 if (@AliqICMSDestino > 0)        
	 begin        
	   Set @ValorICMSDestino = Round((@ValorBaseICMS * @AliqICMSDestino) / 100, 2)          
	   Set @ValorICMSDiferencial = @ValorICMSDestino - @ValorICMS        
	   Set @ValorPartilhaICMSOrigem = Round((@ValorICMSDiferencial * @PercPartilhaICMSOrigem) / 100, 2)        
	   Set @ValorPartilhaICMSDestino = Round((@ValorICMSDiferencial * @PercPartilhaICMSDestino) / 100, 2)        
	 end 
	 
	 --Gabriella - 500776
	 if (@FlagCalcPartilhaICMSParam = 2)
	 begin
	   Set @ValorFCP = 0
	   Set @ValorICMSDestino = 0          
	   Set @ValorICMSDiferencial = 0
	   Set @ValorPartilhaICMSOrigem = 0
	   Set @ValorPartilhaICMSDestino = 0
	   --Eder - Não pode zerar a aliquota para enviar a tag de icms destino zerada
	   
	 end	             
	end        
   else        
   begin        
     Set @AliqFCP = 0        
	 Set @ValorFCP = 0        
	 Set @AliqICMSDestino = 0        
	 Set @PercPartilhaICMSOrigem = 0        
	 Set @PercPartilhaICMSDestino = 0        
	 Set @ValorPartilhaICMSOrigem = 0         
	 Set @ValorPartilhaICMSDestino = 0             
   end  

     
  Insert Into @Retorno (      
    UFOrigem, UFDestino, IdTipoContribuinte, FlagConsumo, FlagContribuinte, TipoOrigemProd, 
    IdTipoFiscal, TipoCFOP, IdCFOP, IdTributacao, SequenciaTributacao, IdClassificacao,          
    -- Informaçoes ICMS                     
    IdParametroICMS, ModalidadeBaseICMS, AliqICMS, AliqComplementarICMS, PercReducaoBaseICMS,                    
    CalculaICMS, SomaIPINaBaseICMS, EstAliqInternaICMS, EstAliqInterestadualICMS,
    ValorBaseICMS, ValorICMS, TipoICMSNaoTrib, ValorIsentasICMS, ValorOutrasICMS,       
    -- Informaçoes IPI            
    IdParametroIPI, CstIPI, AliqIPI, FlagIPIVenda, ValorBaseIPI, ValorIPI, TipoIPINaoTrib, CodEnquadramentoIPI,
    ValorIsentasIPI, ValorOutrasIPI,      
    -- Informaçoes ICMSST                    
    IdParametroICMSST, CstICMS, CstCSOSN, AliqICMSST, PercReducaoBaseICMSST, PercMvaICMSST,
    ModalidadeBaseICMSST, CalculaICMSST, ValorBaseICMSST, ValorICMSST, 
    FlagDifAliqICMSSTProtocolo, FlagDifAliqICMSSTEntidade, CEST,             
    -- Informaçoes PIS/COFINS      
    IdParametroPisCofins, CstPisCofins, AliqPIS, AliqComplementarPIS, AliqCOFINS, AliqComplementarCOFINS,
    CalculaPisCofins, SomaIPINaBasePisCofins, ValorBasePisCofins,  ValorPis, ValorCofins,      
    -- Informaçoes ISS      
    IdParametroISS, ValorBaseISS, AliqISS, ValorISS,
	-- Informaçoes da Partilha de ICMS
	AliqFCP, ValorFCP, AliqICMSDestino, PercPartilhaICMSOrigem, PercPartilhaICMSDestino, 
	ValorPartilhaICMSOrigem, ValorPartilhaICMSDestino
  ) Values (      
    @UFOrigem, @UFDestino, @IdTipoContribuinte, @FlagConsumo, @FlagContribuinte, @TipoOrigemProd,
    @IdTipoFiscal, @TipoCFOP, @IdCFOP, @IdTributacao, @SequenciaTributacao, @IdClassificacao,        
    --Informaçoes de ICMS      
    @IdParametroICMS, @ModalidadeBaseICMS, @AliqICMS, @AliqComplementarICMS, @PercReducaoBaseICMS,
    @CalculaICMS, @SomaIPINaBaseICMS, @EstAliqInternaICMS, @EstAliqInterestadualICMS,            
    @ValorBaseICMS, @ValorICMS, @TipoICMSNaoTrib, @ValorIsentasICMS, @ValorOutrasICMS,              
    --Informaçoes de IPI            
    @IdParametroIPI, @CstIPI, @AliqIPI, @FlagIPIVenda, @ValorBaseIPI, @ValorIPI, @TipoIPINaoTrib, @CodEnquadramentoIPI,  
    @ValorIsentasIPI, @ValorOutrasIPI,         
    --Informaçoes de ST                     
    @IdParametroICMSST, @CstICMS, @CstCSOSN, @AliqICMSST, @PercReducaoBaseICMSST, @PercMvaICMSST_Ajustado,
    @ModalidadeBaseICMSST, @CalculaICMSST, @ValorBaseICMSST, @ValorICMSST,
    @FlagDifAliqICMSSTProtocolo, @FlagConsumo, @CEST,
     -- Informaçoes PIS/COFINS      
    @IdParametroPisCofins, @CstPisCofins, @AliqPIS, @AliqComplementarPIS, @AliqCOFINS, @AliqComplementarCOFINS,
    @CalculaPisCofins, @SomaIPINaBasePisCofins, @ValorBasePisCofins, @ValorPis, @ValorCofins,      
    -- Informaçoes ISS      
    @IdParametroISS, @ValorBaseISS, @AliqISS, @ValorISS,
	-- Informaçoes da Partilha de ICMS
	@AliqFCP, @ValorFCP, @AliqICMSDestino, @PercPartilhaICMSOrigem, @PercPartilhaICMSDestino, 
	@ValorPartilhaICMSOrigem, @ValorPartilhaICMSDestino	
	)       
  return      
end      
GO

insert into fwVersao values(1,6,3)
GO
