ALTER function [dbo].[prCalculoMargemProduto] (  
   @IdEmpresa            int, 
   @IdGrupoPreco         int,
   @ValorCustoLiquido    decimal(19,8),  
   @PerMargemContrib1    decimal(13,8),
   @PerMargemContrib2    decimal(13,8),
   @PerMargemContrib3    decimal(13,8),
   @PerMargemContrib4    decimal(13,8),
   @PerMargemContrib5    decimal(13,8),
   @PrecoVenda			 decimal(19,8),
   @PerDespAdmCalc       decimal(13,8),
   @AliqICMVenda         decimal(13,8),  
   @AliqPISVenda         decimal(13,8),  
   @AliqCOFINSVenda      decimal(13,8)
)  
Returns @Retorno Table  
  (MargemLucro		decimal(19,8),  
   PerMargemContribCalc decimal(19,8))
as  
begin  
  Declare @TipoPrecoVenda smallint  
  Declare @PrecisaoCusto smallint  
  Declare @PrecisaoVenda smallint  
  Declare @FlagDeduzirImpostosPreco smallint
  Declare @AuxVarErro int  --Variavel usada apenas para externar erro na função  
  Declare @RetMargemLucro decimal(19,8)
  Declare @RetPerMargemContribCalc decimal(19,8)
  Declare @PerReducaoVenda decimal(19,8)
  Set @ValorCustoLiquido	= isnull(@ValorCustoLiquido,0)  
  --Set @RetPerMargemContribCalc = isnull(@PerMargemContribCalc,0)  
  Set @RetPerMargemContribCalc = 0
  Set @PrecoVenda			= isnull(@PrecoVenda,0)  
  Set @PerDespAdmCalc		= isnull(@PerDespAdmCalc,0)  
  --Leitura de Configurações  
  Select  @TipoPrecoVenda = Conf.TipoPrecoVenda,  
          @PrecisaoCusto = Conf.PrecisaoCusto,  
          @PrecisaoVenda = Conf.PrecisaoVenda,
		  @FlagDeduzirImpostosPreco = Gru.FlagDeduzirImpostosPreco
    From prConfiguracao Conf
	Left Join prGrupoPreco Gru on Gru.IdGrupoPreco =  @IdGrupoPreco
  If @@RowCount = 0   
     Set @AuxVarErro = cast('Impossível calcular preços: A configuração do módulo de produtos não existe (tabela prConfiguracao) ' as int)   
  If @FlagDeduzirImpostosPreco is null 
     Set @AuxVarErro = cast('Impossível calcular preços: Não foi encontrado o grupo de Preco: ' + Cast(@IdGrupoPreco  as varchar)  as int)   
  Set @RetPerMargemContribCalc =  isnull(@PerMargemContrib1,0) + isnull(@PerMargemContrib2,0) + isnull(@PerMargemContrib3,0) + 
                                  isnull(@PerMargemContrib4,0) + isnull(@PerMargemContrib5,0)
  If @FlagDeduzirImpostosPreco = 1 -- Soma os impos
     Set @RetPerMargemContribCalc = @RetPerMargemContribCalc  + isnull(@AliqICMVenda,0) +  isnull(@AliqPISVenda,0) + isnull(@AliqCOFINSVenda,0) 
  If @PrecoVenda = 0
  begin
	Set @RetMargemLucro = 0
  end
  else
  begin
	  If @TipoPrecoVenda = 0 --Configuração para divisor  
	  begin     
		  Set @RetMargemLucro = 100 - ((@ValorCustoLiquido / @PrecoVenda) * 100)
		  Set @RetMargemLucro = @RetMargemLucro - @RetPerMargemContribCalc
	  end  
	  else  
	  If @TipoPrecoVenda = 1 -- Preço de Venda Multiplicador  
	  begin      
		  Set @RetMargemLucro = ((@PrecoVenda - @ValorCustoLiquido) * 100) / @ValorCustoLiquido
		  Set @RetMargemLucro = @RetMargemLucro - @RetPerMargemContribCalc
	  end  
	  else   
	  begin  
		 --Não há como externar erro dentro de função no SQLServer.  
		 Set @AuxVarErro =   
			 cast('Impossível calcular preços: A configuração do módulo de produtos está incorreta para o Tipo de Preço de Venda' as int)   
	  end  
	  Select @RetMargemLucro = MargemLucro 
		From dbo.CalculaMargemLucro(@IdEmpresa, @ValorCustoLiquido, @PrecoVenda, 
									Round(@PrecoVenda * @RetPerMargemContribCalc / 100,2))
  end 
  Insert Into @Retorno  
         (MargemLucro, PerMargemContribCalc)  
     Values  
         (@RetMargemLucro, @RetPerMargemContribCalc)  
return   
end  
GO
ALTER PROCEDURE [dbo].[PRFT150Validacao]
(@IdProcessamento INT,   
 @Origem smallint,  -- 0- Antes do -Processamento, 1 - Após Processamento  
 @IdNotaFiscal int,  
 @MensagemERRO varchar(max) Output)  
AS  
BEGIN  
 Declare @TipoItemPermitido smallint
 Declare @ValorParcelas decimal
 Declare @ValorTotalPedido decimal
 Declare @TipoVencimento int
 Declare @QtdVencimentosGerados int
 Declare @QtdOperacoes int
 Declare @IdPedido int
 Declare @QtdItensNaoAtendidos int

 Set @MensagemERRO = ''  
 --Francisco Verificar se existem pedidos com itens não atendidos
 Select @QtdItensNaoAtendidos = count(*)
 From tmpPRFT150Pedido tmp left join ftPedidoItem item on item.IdPedido = tmp.IdPedido
 Where tmp.IdProcessamento = @IdProcessamento
   and item.QuantAtendida < item.QuantPedida
   and tmp.IdSeparacao = 0
 if @QtdItensNaoAtendidos > 0
 Begin
 	Set @MensagemERRO = @MensagemErro + 'Só é possível fazer o processamento de pedidos com todos os seus ítens atendidos. Para fazer um faturamento parcial é necessário fazer uma separação. <br />'
	GOTO FIM
 End
 --Francisco Verificar se existe vencimentos gerados para o Pedido referente da Separação
 if exists(
 Select top 1 1 
 From tmpPRFT150Pedido tmp join tmpPRFT150Vencimento venc on venc.IdProcessamento = tmp.IdProcessamento
 Where tmp.IdProcessamento = @IdProcessamento
     and tmp.IdSeparacao > 0
 )
 begin
 	Set @MensagemERRO = @MensagemErro + 'Só é possível fazer o processamento de pedidos parciais que não contenham vencimentos cadastrados. <br />'
	GOTO FIM
 end
 --Francisco Verificar se existe alguma separação que não foi conferida
 if exists(
	select top 1 1 
	from tmpPRFT150Pedido tmp left join ftSeparacaoPedido sep on sep.IdSeparacao = tmp.IdSeparacao
	where tmp.IdProcessamento = @IdProcessamento
	  and sep.FlagConcluido = 0
 )
 begin
 	Set @MensagemERRO = @MensagemErro + 'Só é possível fazer o processamento de pedidos parciais que as separações estejam conferidas. <br />'
	GOTO FIM
 end
 --Francisco Verificar Tipo de Vencimento atrelado a operação fiscal
 Select @QtdOperacoes = count(*)
 From (
 	select distinct op.TipoVencimento 
 	from tmpPRFT150Item item left join ftPedido ped on ped.IdPedido = item.IdPedido
 	left join ftOperacao op on op.IdOperacao = ped.IdOperacao
 	where item.IdProcessamento = @IdProcessamento
 ) Aux
 If @QtdOperacoes > 1
 begin
 	Set @MensagemERRO = @MensagemErro + 'Existem Pedidos com operações com tipos de Obrigatoriedade de Vencimento diferentes. <br />'
	GOTO FIM
 end
 Else
 Begin
	 Select distinct @TipoVencimento = op.TipoVencimento 
	 From tmpPRFT150Item item left join ftPedido ped on ped.IdPedido = item.IdPedido
							  left join ftOperacao op on op.IdOperacao = ped.IdOperacao
	 Where item.IdProcessamento = @IdProcessamento
	 Declare CursorPedido cursor local fast_forward for   
	 Select
		Distinct IdPedido 
	 From tmpPRFT150Item
	 Where IdProcessamento = @IdProcessamento
	 Open CursorPedido
	 Fetch Next From CursorPedido Into @IdPedido
	 While @@Fetch_Status = 0  
	 Begin    
		select @QtdVencimentosGerados = count(*) from tmpPRFT150Vencimento
		Where IdProcessamento = @IdProcessamento
		If @TipoVencimento = 1 And @QtdVencimentosGerados > 0
		begin
 			Set @MensagemERRO = @MensagemErro + 'O pedido: ' + Cast(@IdPedido as varchar) + ' não pode ser processado devido a operação fiscal não aceitar vencimentos. Existem ' + Cast(@QtdVencimentosGerados as varchar) + ' vencimentos atrelados a este pedido. <br />'
		end
		else If @TipoVencimento = 2 And @QtdVencimentosGerados = 0
		Begin
 			Set @MensagemERRO = @MensagemErro + 'O pedido: ' + Cast(@IdPedido as varchar) + ' não pode ser processado devido a operação fiscal obrigar vencimentos. Não Existe vencimentos atrelados a este pedido. <br />'
		End		
		Fetch Next From CursorPedido Into @IdPedido
     End
	 Close CursorPedido  
	 Deallocate CursorPedido  
 End
 If @MensagemERRO <> ''
	GOTO FIM
 --Francisco #481824 - Verificação se a série aceita pedidos com produtos e serviços
 Select @TipoItemPermitido = IsNull(serie.TipoItemPermitido,0) 
 From tmpPRFT150 t left join fiSerieNF serie on t.Serie = serie.Serie
 Where t.IdProcessamento = @IdProcessamento
 select @ValorParcelas = sum(ValorParcela)
 from tmpPRFT150Vencimento
 where IdProcessamento = @IdProcessamento
 --Francisco - Alteração para Contemplar Pedido Parcial #487396
 select @ValorTotalPedido = (IsNull(Sum(ValorTotalCalculado),0) + sum(ISNULL(pim.ValorICMSST, 0)))
 from tmpPRFT150Item p
 LEFT JOIN ftPedidoItem pim ON pim.IdPedidoItem=p.IdPedidoItem --ajuste de adição o valor do st retirado
 where IdProcessamento = @IdProcessamento
 --select @ValorTotalPedido = ValorTotalPedido 
 --from tmpPRFT150Pedido tmp left join ftPedido ped on ped.IdPedido = tmp.IdPedido
 --where tmp.IdProcessamento = @IdProcessamento
 if @ValorParcelas <> @ValorTotalPedido
 begin  
 	Set @MensagemErro = @MensagemErro + ' - Valores de Vencimento diferem do valor total dos pedidos. Valor de Vencimentos: ' + Cast(@ValorParcelas as varchar) + ' <=> Valor Total do Pedido: ' + Cast(@ValorTotalPedido as varchar) + '<br />'
	GOTO FIM
 end  
 If @Origem = 0 and @TipoItemPermitido = 0 and exists 
 (
   Select top 1 1
   From tmpPRFT150Item tmpItem Left Join ftPedidoItem item on tmpItem.IdPedidoItem = item.IdPedidoItem
   Where tmpItem.IdProcessamento = @IdProcessamento
     And item.IdServico is not null
 )
 begin  
 	Set @MensagemErro = @MensagemErro + ' - Não é possível processar a nota na série indicada pois a mesma não aceita Serviços. É necessário fazer o desmembramento do mesmo. <br />'
	GOTO FIM
 end  
 If @Origem = 0 and @TipoItemPermitido = 1 and exists 
 (
   Select top 1 1
   From tmpPRFT150Item tmpItem Left Join ftPedidoItem item on tmpItem.IdPedidoItem = item.IdPedidoItem
   Where tmpItem.IdProcessamento = @IdProcessamento
     And item.IdProduto is not null
 )
 begin  
 	Set @MensagemErro = @MensagemErro + ' - Não é possível processar a nota na série indicada pois a mesma não aceita Produtos. É necessário fazer o desmembramento do mesmo. <br />'
	GOTO FIM
 end  
 --Verificar se o registro ainda está na tabela temporaria
 if not exists (Select top 1 1   
    from tmpPRFT150Pedido t    
    where t.IdProcessamento = @IdProcessamento	)  
 begin  
   Set @MensagemErro = ' - Os pedidos referentes a este processamento já foi finalizado. <br />'  
   GOTO FIM
 end  
 if @Origem = 0 and exists (Select top 1 1   
            from tmpPRFT150Pedido t    
              Left Join ftPedido p on (p.IdPedido = t.IdPedido)  
            where t.IdProcessamento = @IdProcessamento  
              and isNull(p.StatusPedido,0) = 0)  
 begin  
   Set @MensagemErro = @MensagemErro + ' - Existem Pedidos em Aberto. <br />'  
   GOTO FIM
 end  
 if @Origem = 0 and exists (Select top 1 1   
            from tmpPRFT150Pedido t    
              Left Join ftPedido p on (p.IdPedido = t.IdPedido)  
            where t.IdProcessamento = @IdProcessamento  
              and isNull(p.StatusPedido,0) = 3)  
 begin  
   Set @MensagemErro = @MensagemErro + ' - Existem Pedidos já Faturados. <br />'  
   GOTO FIM
 end  
 if @Origem = 0 and exists(Select Top 1 1    
            from tmpPRFT150 t    
            where t.IdProcessamento = @IdProcessamento  
              and isnull(t.idEmpresa,0) = 0)  
 begin  
	Set @MensagemErro = @MensagemErro + ' - Empresa está nula. Hove problemas no processamento . <br />'  
    GOTO FIM 
 end 
 if @Origem = 0 and exists (Select top 1 1   
            from tmpPRFT150Pedido t    
              Left Join ftPedidoMotivoBloqueio bloq on (bloq.IdPedido = t.IdPedido)
            where t.IdProcessamento = @IdProcessamento  
              and isNull(bloq.StatusBloqueio,0) = 1)  
 begin  
   Set @MensagemErro = @MensagemErro + ' - Existem Pedidos Bloqueados. <br />'  
   GOTO FIM
 end                  

 if @Origem = 0
 begin
	Declare @TitulosNaoProcessados varchar(max)
	SELECT @TitulosNaoProcessados = stuff((
	Select 'Nr. Titulo: ' + Cast(NumeroTitulo as varchar) + ' Id.: ' + Cast(IdTitulo as varchar) + '|'
	From fnTitulo
	Where DataEmissao >= getdate() - 10
	  and FlagRecebimentoAVista = 1
	FOR XML PATH('')
    ), 1, 0, '')

	if @TitulosNaoProcessados is not null
		Set @MensagemErro = @MensagemErro + 'O pedido: ' + Cast(@IdPedido as varchar) + ' não pode ser processado. Os títulos a seguir não foram processados: <br/>' + Replace(@TitulosNaoProcessados,'|','<br/>')
	GOTO FIM
 end

 if @Origem = 1
 begin
	Declare @CurNfItem varchar(255)
	Declare @CurIdProduto varchar(255)
	Declare @CurDescricao varchar(255)
	Declare @CurQtdEstoque varchar(255)
	Declare @CurQtdLote varchar(255)
	
	Declare CursorItemNf cursor local fast_forward for   
		select cast(nfItem.IdNotaFiscalItem as varchar(255)), cast(max(nfItem.idProduto) as varchar(255)), cast(max(nfItem.Descricao) as varchar(255)), cast(max(isnull(est.QuantMovimentada,0)) as varchar(255)) , cast(sum(isnull(estLote.QuantMovimentada,0)) as varchar(255))
		From fiNotaFiscalItem nfItem 
		  left join ceMovEstoque est on est.RefTipoOrigem = 0 and est.RefIdOrigem = nfItem.IdNotaFiscalItem					  
		  left join ceMovEstoqueItemLote estLote on est.IdMovEstoque = estLote.IdMovEstoque
		where nfitem.IdNotaFiscal = @IdNotaFiscal
		group by nfItem.IdNotaFiscalItem
		having max(isnull(est.QuantMovimentada,0)) <> sum(isnull(estLote.QuantMovimentada,0))
	 Open CursorItemNf
	 Fetch Next From CursorItemNf Into @CurNfItem, @CurIdProduto, @CurDescricao, @CurQtdEstoque, @CurQtdLote

	 While @@Fetch_Status = 0  
	 Begin    
		Set @MensagemErro = @MensagemErro + 'O pedido: ' + Cast(@IdPedido as varchar) + ' não pode ser processado. Produto: ' + @CurIdProduto + ' - ' + @CurDescricao + ' com quantidades diferentes de movimentação entre os lotes. Quantidade Movimentada: ' + @CurQtdEstoque + ' -> Quantidade Distribuída em Lotes: ' + @CurQtdLote
		Fetch Next From CursorItemNf Into @CurNfItem, @CurIdProduto, @CurDescricao, @CurQtdEstoque, @CurQtdLote
     End
	 Close CursorItemNf  
	 Deallocate CursorItemNf  
 end

 GOTO FIM
 FIM:   
 Return  
END  
GO

update fnTitulo
set FlagRecebimentoAVista = 0
Where IdTitulo in 
(
select IdTitulo from fnMovTitulo
where IdTitulo in 
(   select IdTitulo from fnTitulo
	where FlagRecebimentoAVista = 1
)
and TipoMovimento = 1
)

GO


Alter table LogItem
alter column ChaveRegistro varchar(255)
GO


/*==============================================================*/
/* Table: fiItemNFeEntrada                                      */
/*==============================================================*/
create table fiItemNFeEntrada (
   IdNotaFiscalItem     int                  not null,
   IdNotaFiscal         int                  null,
   SequenciaItemDet     smallint             null,
   CFOP                 varchar(20)          null,
   Quantidade           decimal(18,4)        null,
   Unidade              varchar(20)          null,
   ICMCst               varchar(10)          null,
   ICMCsosn             varchar(10)          null,
   ICMBase              decimal(18,2)        null,
   ICMAliquota          decimal(18,2)        null,
   ICMValor             decimal(18,2)        null,
   ICMPercReducao       decimal(18,2)        null,
   ICMAliqCredSimples   decimal(18,2)        null,
   ICMValorCredSimples  decimal(18,2)        null,
   IPICst               varchar(10)          null,
   IPIBase              decimal(18,2)        null,
   IPIAliquota          decimal(18,2)        null,
   IPIValor             decimal(18,2)        null,
   PISCst               varchar(10)          null,
   PISBase              decimal(18,2)        null,
   PISAliquota          decimal(18,2)        null,
   PISValor             decimal(18,2)        null,
   COFINSCst            varchar(10)          null,
   COFINSBase           decimal(18,2)        null,
   COFINSAliquota       decimal(18,2)        null,
   COFINSValor          decimal(18,2)        null,
   constraint PK_FIITEMNFEENTRADA primary key (IdNotaFiscalItem)
)
go

alter table fiItemNFeEntrada
   add constraint FK_ItemNFeEntreda_fiNotaFiscal foreign key (IdNotaFiscal)
      references fiNotaFiscal (IdNotaFiscal)
go




alter table fiParametroICMSST 
   add TipoCFOP smallint null 
GO

update fiParametroICMSST 
  set TipoCFOP = Case When isnull(PercMvaICMSST,0) = 0 Then 3 Else 4 End
GO 

alter table fiParametroICMSST 
   alter column TipoCFOP smallint not null 
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
					   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,2)
GO
