/*Script 1*/
alter table fnMovCaixa
Alter Column IdEmpresa int not null
GO

alter table fnMovCaixa
Alter Column IdEmpresaFinanceiro int not null
GO

alter table fnMovCaixa
Alter Column DataCriacao DateTime not null
GO

alter table fnMovCaixa
Alter Column DataMovimento DateTime not null
GO

Alter table fnContaContabil
Alter Column IdGrupo int not null
GO

/*Script 2*/
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 @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), 
	@FlagContribuinte = isnull(tc.FlagTipoContribuinte,0),      
	--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,              
   @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
    if isnull(@PercMvaICMSST,0) = 0
       set @TipoCFOP = '3'      
    else                      
       set @TipoCFOP = '4'            
  end 
  --Calculo do MVA Ajustado
  if @AliqICMS > 0 and @EstAliqInternaICMS > 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, GO      
         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

/*Script 3*/
alter table fiConfigObservacaoEmp 
	Add TextoObsFiscal varchar(2000) null
GO

--Gera a mensagem que antes era fixa, quando a empresa é simples nacional
Update fiConfigObservacaoEmp 
   Set TextoObsFiscal  = 'IMP. REC. SUBS TRIB ART 274. I-Documento emitido por ME ou EPP Optante pelo simples nacional / ' + 
                         'II-Nao gera direito a credito de ISS e IPI / Imposto retido por ST artigo 313 - 0 do RICMS'
   Where IdEmpresa in (Select IdEmpresa from tbParametroControle where TipoRegimeTributario in (1,2))
GO

/*Script 4*/
alter table ftConfiguracao add
   IdContaContabilVenda int                  null,
   IdSituacaoTituloVenda int                  null
go

alter table ftConfiguracao
   add constraint FK_ftConfiuracao_fnContaContabil foreign key (IdContaContabilVenda)
      references fnContaContabil (IdConta)
go

alter table ftConfiguracao
   add constraint FK_ftConfiguracao_fnSituacaoTitulo foreign key (IdSituacaoTituloVenda)
      references dbo.fnSituacaoTitulo (IdSituacao)
go

/*Script 5*/
Alter table ftPedidoItem 
Add NumItemPedCliente int null
GO

Alter table fiNotaFiscalItem
Add NumItemPedCliente int null
GO

ALTER PROCEDURE [dbo].[PRFT150Processar] (@IdProcessamento INT, @MensagemERRO varchar(max) Output, @IdNotaFiscal int Output)  
AS  
BEGIN  
 -- SET NOCOUNT ON added to prevent extra result sets from  
 -- interfering with SELECT statements.  
 SET NOCOUNT ON;  
 DECLARE @IdCondPagto SMALLINT  
 DECLARE @Serie VARCHAR(3)  
 DECLARE @DataMovimento DATETIME  
 DECLARE @IdOperacao INT  
 DECLARE @IdEmpresa INT  
 DECLARE @IdEmpresaEstoque INT
 DECLARE @IdPedido INT  
 DECLARE @IdSeparacao INT  
 DECLARE @UltimaNota INT  
 DECLARE @NumDocumento INT   
 DECLARE @IdEntidade varchar(10)  
 DECLARE @TipoNotaCupom INT
 DECLARE @IdBanco INT
 DECLARE @TipoBaixaEstoque INT
 --Cupom Fiscal
 DECLARE @NumEquipamento varchar(20)  
 DECLARE @NumCpfCnpjCupom varchar(255)
 DECLARE @ErrosValidacaoCupom varchar (max)  
 -- Valores Nota  
 DECLARE @ValorFrete DECIMAL(18, 2)  
 DECLARE @ValorSeguro DECIMAL(18, 2)  
 DECLARE @ValorDespesas DECIMAL(18, 2)  
 DECLARE @ValorOutrasDespesas DECIMAL(18, 2)  
 DECLARE @ValorTotalDescProdutos DECIMAL(18, 2)  
 DECLARE @ValorTotalDescServicos DECIMAL(18, 2)  
 DECLARE @ValorTotalFrete DECIMAL(18, 2)  
 DECLARE @ValorTotalSeguro DECIMAL(18, 2)  
 DECLARE @ValorTotalDespesas DECIMAL(18, 2)  
 DECLARE @ValorTotalOutrasDespesas DECIMAL(18, 2)  
 -- Dados dos Itens  
 DECLARE @ItemIdSeparacaoItem INT
 DECLARE @ItemIdPedidoItem INT
 DECLARE @ItemQuantAtendidaItem DECIMAL(18, 2)  
 DECLARE @IdNotaFiscalItem INT  
 Declare @IdMovEstoque INT
 -- Valores Totais da NF  
 DECLARE @ValorTotalProdutos DECIMAL(18, 2)  
 DECLARE @ValorTotalServicos DECIMAL(18, 2)  
 DECLARE @ValorTotalBaseICMS DECIMAL(18, 2)  
 DECLARE @ValorTotalICMS DECIMAL(18, 2)  
 DECLARE @ValorTotalBaseICMSST DECIMAL(18, 2)  
 DECLARE @ValorTotalICMSST DECIMAL(18, 2)  
 DECLARE @ValorTotalBaseIPI DECIMAL(18, 2)  
 DECLARE @ValorTotalIPI DECIMAL(18, 2)  
 DECLARE @ValorTotalBasePIS DECIMAL(18, 2)  
 DECLARE @ValorTotalPIS DECIMAL(18, 2)  
 DECLARE @ValorTotalBaseCOFINS DECIMAL(18, 2)  
 DECLARE @ValorTotalCOFINS DECIMAL(18, 2)  
 DECLARE @ValorTotalBaseII DECIMAL(18, 2)  
 DECLARE @ValorTotalII DECIMAL(18, 2)  
 DECLARE @ValorTotalNota DECIMAL(18, 2)
 DECLARE @ValorFCP DECIMAL(18,2)
 DECLARE @ValorPartilhaICMSOrigem DECIMAL(18,2)
 DECLARE @ValorPartilhaICMSDestino DECIMAL(18,2)  
 -- Dados de Transporte  
 DECLARE @IdProcessamentoNotaVolume int  
 DECLARE @IdTransportadora varchar(10)  
 DECLARE @TipoModalidadeFrete smallint  
 DECLARE @IdNotaFiscalVolume int  
 -- Dados Volume  
 DECLARE @VolQuantidade   int  
 DECLARE @VolEspecie   varchar(60)  
 DECLARE @VolMarca   varchar(60)  
 DECLARE @VolNumeracao  varchar(60)  
 DECLARE @VolPesoLiquido  decimal(15,3)  
 DECLARE @VolPesoBruto  decimal(15,3)  
 DECLARE @VolComprimento  decimal(15,5)  
 DECLARE @VolAltura   decimal(15,5)  
 DECLARE @VolLargura   decimal(15,5)  
 DECLARE @VolVolume   decimal(15,5)  
 --Titulo  
 DECLARE @TitIdTitulo int  
 DECLARE @TitNumeroTitulo varchar(30)  
 DECLARE @TitNumParcela smallint  
 DECLARE @TitDatavencimento datetime  
 DECLARE @TitValorTParcela decimal(18,2)  
 
 DECLARE @TitFlagBaixada bit  
 --Dados da Operação Fiscal	
 DECLARE @NFeFinalidadeEmissao int   
 
 --Francisco 508345
 --DECLARE @TitFlagCredito smallint  
 DECLARE @FlagTituloCredito bit
 
 DECLARE @ErrosValidacao varchar (max)  
 --Minuta de Despacho
 DECLARE @IdMinuta int 
 --Dados da Série
 Declare @Modelo varchar(3)
 Declare @Especie varchar(10)
 Declare @DataEmissao datetime
--Francisco - Alteração para Contemplar Pedido Parcial #487396
 Declare @QtdItensFaltantes int
 Declare @PRFT150ItemPK int
 --Francisco - Alteração para acertar problema de notas de devolução #496587
 Declare @TipoCarteira int
 --Douglas Chiodi - Alteração para utilizar o complemento do produto ao inves da descrição na nota fiscal
 Declare @FlagUsarComplementoNF bit
--Francisco - Adicionando a conta contabil e Situacao do titulo padrão nos titulos quando a operação for do tipo compra/venda
 Declare @IdContaContabilVenda int
 Declare @IdSituacaoTituloVenda int
 --
 exec dbo.Prft150Validacao @IdProcessamento,   
      0, null,  --Pré Processamento  
       @MensagemERRO = @ErrosValidacao output  
 Set @MensagemERRO = ''  
    if (@ErrosValidacao <> '')  
    begin  
      Set @MensagemERRO = 'Foram detectados erros que impediram o processamento: ' + '<br> '  
      Set @MensagemERRO = @MensagemERRO + @ErrosValidacao + '<br><br> '  
      Set @MensagemERRO = @MensagemERRO + 'Verifique os problemas e tente processar novamente!'  
      return  
    end;  
 -- Travar os pedidos com status de processado
 Update tmpPRFT150Pedido set IdPedido = IdPedido
 where IdProcessamento = @IdProcessamento
-- INFORMAÇÕES DA NOTA FISCAL A SER PROCESSADA  
SELECT @IdCondPagto = pn.IdCondPagto, 
    @IdEmpresa = pn.IdEmpresa, 
    @Serie = pn.Serie,  
    @IdOperacao = pn.IdOperacao,  
    @DataMovimento = pn.DataMovimento,   
    @IdEntidade = pn.IdEntidade,
	@IdTransportadora = pn.IdTransportadora,   
    @TipoModalidadeFrete = pn.TipoModalidadeFrete,
    @IdEmpresaEstoque = Emp.IdEmpresaEstoque,  
	@TipoNotaCupom = pn.TipoNotaCupom,
	@NumEquipamento = pn.NumEquipamento,
	@NumCpfCnpjCupom = pn.NumCpfCnpjCupom
FROM tmpPrft150 pn Left join tbEmpresa Emp on Emp.IdEmpresa = pn.IdEmpresa
WHERE pn.IdProcessamento = @IdProcessamento  
if LTrim(@IdTransportadora) = '' Set @IdTransportadora = null  
--Validação de série   
if ltrim(@Serie) = '' or @Serie is null  
begin  
    Set @MensagemERRO = 'Não há série informada: ' + '<br> '  
    return      
end  


Select @UltimaNota = Case When @TipoNotaCupom < 2 Then UltimaNota Else 0 End,
       @Modelo = Case When @TipoNotaCupom < 2 Then TipoModeloNotaFiscal Else TipoModeloCupom End,
       @Especie = Case When @TipoNotaCupom < 2 Then Especie Else null End,
	   @DataEmissao = DataProcessamento
From fiSerieNF   
Where IdEmpresa = @IdEmpresa  
    AND Serie = @Serie   
If @UltimaNota is null  Set @UltimaNota = 0   

--Valores para @TipoNotaCupom
-- 0 - Nota Fiscal
-- 1 - Nota Fiscal + Cupom Fiscal
-- 2 - Cupom Fiscal
If @TipoNotaCupom < 2
begin
  -- Obtendo Numero do Documento  
  SET @NumDocumento = @UltimaNota + 1  
  --Validação de Número de Nota Já existente  
  if Exists(Select * From fiNotaFiscal n  
              WHere n.TipoMovimento = 2
	  	      and n.IdEmpresa = @IdEmpresa  
              and n.Serie = @Serie  
              and n.NumeroDocumento = @NumDocumento
              and n.TipoNotaCupom <> 2)  
  begin  
      Set @MensagemERRO = 'Já existe uma nota fiscal com o número de documento : ' +  Cast(@NumDocumento as varchar) + '<br> '  
      return      
  end  
  SET @FlagUsarComplementoNF = ISNULL((SELECT FlagUsarComplementoNF FROM ftConfiguracao WHERE IdEmpresa=@IdEmpresa), 0)

	UPDATE fiSerieNF  
	SET UltimaNota = @NumDocumento,
		UltimaDuplicata = @NumDocumento  
	WHERE IdEmpresa = @IdEmpresa  
	and Serie = Case When isNull(@Serie,'') <> '' Then @Serie Else Serie End  
	and FlagPrincipal = Case When isNull(@Serie,'') = '' Then 1 Else FlagPrincipal End  
end

SELECT @NFeFinalidadeEmissao = op.FinalidadeNfe, 
	    @FlagTituloCredito = coalesce(op.FlagTituloCredito,0), --Francisco 508345
		@TipoBaixaEstoque = op.TipoBaixaEstoque,
		@TipoCarteira = Case When coalesce(op.TipoMovimento,0) <> 1 Then 2
		                     When coalesce(op.TipoMovimento,0) = 1 Then 1
					    End,
	    @IdContaContabilVenda = case when op.TipoMovimento = 0 Then conf.IdContaContabilVenda else null end, 
		@IdSituacaoTituloVenda = case when op.TipoMovimento = 0 Then conf.IdSituacaoTituloVenda else null end
from ftOperacao op left join ftConfiguracao conf on conf.IdEmpresa = @IdEmpresa
Where op.IdOperacao = @IdOperacao 

EXEC @IdNotaFiscal = dbo.ProximaSequencia 'fiNotaFiscal' ,@IdEmpresa ,1  
SELECT @IdMinuta = dbo.ObtemChaveValor(Parametros,'IdMinuta','#'),
        @IdBanco = dbo.ObtemChaveValor(Parametros,'IdBanco','#')
from tmpPRFT150 
where IdProcessamento = @IdProcessamento 
INSERT INTO fiNotaFiscal (  
	IdNotaFiscal  
	,TipoMovimento,IdEntidade,NumeroDocumento,Serie,Modelo,Especie  
	,IdCondPagto,IdEmpresa,IdOperacao,DataCriacao,DataMovimento,DataEmissao  
	,IdTransportadora,TipoModalidadeFrete, TipoNotaCupom, NFeFinalidadeEmissao
	,IdMinuta, TipoEmissao, IdBanco, StatusNota)  --Emissão Própria #465067
VALUES (  
	@IdNotaFiscal,  
	2,@IdEntidade,@NumDocumento,@Serie,@Modelo,@Especie
	,@IdCondPagto,@IdEmpresa,@IdOperacao,GETDATE(),@DataMovimento, @DataEmissao  
	,@IdTransportadora,@TipoModalidadeFrete, @TipoNotaCupom, @NFeFinalidadeEmissao
	,@IdMinuta, 0, @IdBanco, 1)  --Emissão Própria #465067
-- Processando dados do volume da nota   
DECLARE volume_cursor CURSOR  
FOR  
	Select Sequencia, Quantidade, Especie, Marca, Numeracao,   
		PesoLiquido, PesoBruto, Comprimento, Altura, Largura, Volume  
	From  tmpPrft150Volume  
	Where IdProcessamento = @IdProcessamento   
OPEN volume_cursor  
FETCH NEXT  
FROM volume_cursor  
INTO @IdProcessamentoNotaVolume,@VolQuantidade,@VolEspecie,@VolMarca,@VolNumeracao,   
     @VolPesoLiquido,@VolPesoBruto,@VolComprimento,@VolAltura,@VolLargura,@VolVolume    
WHILE @@FETCH_STATUS = 0  
BEGIN  
    EXEC @IdNotaFiscalVolume = dbo.ProximaSequencia 'fiNotaFiscalVolume' ,@IdEmpresa ,1  
    Insert Into fiNotaFiscalVolume(IdNotaFiscal, IdNotaFiscalVolume, Quantidade, Especie,    
        Marca, Numeracao, PesoLiquido, PesoBruto, Comprimento, Altura, Largura, Volume)  
    Values(@IdNotaFiscal, @IdNotaFiscalVolume, @VolQuantidade, @VolEspecie,    
		@VolMarca, @VolNumeracao, @VolPesoLiquido, @VolPesoBruto, @VolComprimento,   
		@VolAltura, @VolLargura, @VolVolume)   
   FETCH NEXT  
   FROM volume_cursor  
   INTO  
     @IdProcessamentoNotaVolume, @VolQuantidade, @VolEspecie, @VolMarca,    
     @VolNumeracao, @VolPesoLiquido, @VolPesoBruto, @VolComprimento,   
     @VolAltura, @VolLargura, @VolVolume    
END   
Close volume_cursor                                              
Deallocate volume_cursor   
SET @ValorTotalDescProdutos = 0  
SET @ValorTotalDescServicos = 0  
SET @ValorTotalFrete = 0  
SET @ValorTotalSeguro = 0  
SET @ValorTotalDespesas = 0  
SET @ValorTotalOutrasDespesas = 0  
-- INFORMAÇÕES DOS PEDIDOS DO PROCESSAMENTO  
--Francisco - Alteração para Contemplar Pedido Parcial #487396
Select @ValorTotalDescProdutos = isNull(sum(ValorDescontoProduto),0)  
	  ,@ValorTotalDescServicos = isNull(sum(ValorDescontoServico),0)
	  ,@ValorTotalFrete = isNull(sum(ValorFrete),0)  
	  ,@ValorTotalSeguro = isNull(sum(ValorSeguro),0)
   	  ,@ValorTotalDespesas = isNull(sum(ValorDespesas),0)
	  ,@ValorTotalOutrasDespesas = isNull(sum(ValorOutrasDespesas),0)
From tmpPrft150Item
Where IdProcessamento = @IdProcessamento
Declare CursorPedido Cursor  
For  
  Select distinct pnp.IdPedido, pnp.IdSeparacao From tmpPrft150Pedido pnp Where pnp.IdProcessamento = @IdProcessamento  
Open CursorPedido  
Fetch Next From CursorPedido Into @IdPedido, @IdSeparacao    
While @@FETCH_STATUS = 0  
Begin  
	Update fiNotaFiscal
	set NumPedCliente = Aux.NumPedCliente
	From
		( Select Distinct ped.IdPedido, ped.NumPedCliente
		  From ftPedido ped 
		  Where ped.IdPedido = @IdPedido 
		) Aux
	Where IdNotaFiscal = @IdNotaFiscal
	--Francisco - Alteração para Contemplar Pedido Parcial #487396
	-- Marcando Pedido como Processado  
	update ftPedido
	set ftPedido.StatusPedido = case when (select count(*) 
										   from ftPedidoItem 
										   where IdPedido = ftPedido.IdPedido 
										   and QuantPedida <> QuantAtendida) > 0 then 2 else 3 end
	where ftPedido.IdPedido = @IdPedido
	
	update ftPedido
	  set DataFaturamento = GetDate(),
	      IdEmpresa = @IdEmpresa
	where ftPedido.IdPedido = @IdPedido
	  and StatusPedido = 3 --Faturado Total


	update Item
	  set IdEmpresa = @IdEmpresa
	from ftPedido Ped left join ftPedidoItem Item on (Ped.IdPedido = Item.IdPedido)
	Where Ped.IdPedido = @IdPedido
	  and Ped.StatusPedido = 3

	update ftPedidoItemLote
	set ftPedidoItemLote.StatusPedido = case when (select count(*) 
										   from ftPedidoItem 
										   where IdPedido = ftPedidoItemLote.IdPedido 
										   and QuantPedida <> QuantAtendida) > 0 then 2 else 3 end
	where ftPedidoItemLote.IdPedido = @IdPedido
    if not exists (select top 1 1 from fiNotaFiscalPedido where IdNotaFiscal = @IdNotaFiscal and IdPedido = @IdPedido and IdSeparacao = @IdSeparacao)
	Begin
		Insert Into fiNotaFiscalPedido (IdNotaFiscal,IdPedido,IdSeparacao)  
		Values (@IdNotaFiscal, @IdPedido,@IdSeparacao)  
	End
	if IsNull(@IdSeparacao,0) <> 0
	Begin
		Update ftSeparacaoPedido
		Set FlagFaturado = 1
		Where IdSeparacao = @IdSeparacao
	End
	--505470
	Update ftPedidoItem
	set IdClassificacao = (Select Distinct pr.IdClassificacao
						    From prProduto pr 
							Where pr.IdProduto = ftPedidoItem.IdProduto)
	Where IdPedido = 37001
		and (IdProduto <> 999999 or IdProduto <> 9999999)

   Fetch Next From CursorPedido Into @IdPedido, @IdSeparacao    
  END  
Close CursorPedido                                              
Deallocate CursorPedido   
-- INFORMAÇÕES DOS ITENS DO PEDIDO      
Declare pedidoItem_cursor CURSOR  
For
   Select PRFT150ItemPK, IdSeparacaoItem, IdPedidoItem, QuantAtendida
   From tmpPrft150Item  
   Where IdProcessamento = @IdProcessamento
Open pedidoItem_cursor  
Fetch Next From pedidoItem_cursor Into @PRFT150ItemPK, @ItemIdSeparacaoItem, @ItemIdPedidoItem, @ItemQuantAtendidaItem
While @@FETCH_STATUS = 0  
Begin  
    Exec @IdNotaFiscalItem = dbo.ProximaSequencia 'fiNotaFiscalItem' ,@IdEmpresa ,1  
	--Inclusão do item da nota fiscal
	Insert Into fiNotaFiscalItem (  
			IdNotaFiscalItem,IdNotaFiscal,IdProduto,IdServico,IdMarca,IdEmpresa,
			Descricao,NumOriginal,NumFabricante,  
			DataCriacao,DataMovimento,QuantAtendida,ValorBruto,PercDesconto,PercAcrescimo, ValorLiquido, 
			ValorTotal,TipoItem,IdClassificacao,
			--512566
			--ValorCustoFor, ValorCustoUlt, ValorCustoMed, NumPedCliente, IdTributacao, IdPedidoItem)  
			ValorCustoFor, ValorCustoUlt, ValorCustoMed, NumPedCliente, NumItemPedCliente, IdTributacao, IdPedidoItem)  
	Select 
		@IdNotaFiscalItem, @IdNotaFiscal, PedItem.IdProduto, PedItem.IdServico, PedItem.IdMarca, @IdEmpresa,
		CASE WHEN @FlagUsarComplementoNF=1 AND LEN(ISNULL(Prod.Complemento, ''))>0 THEN Prod.Complemento ELSE PedItem.Descricao END		
		, PedItem.NumOriginal, PedItem.NumFabricante,
		getdate(), @DataMovimento, Item.QuantAtendida, 
		PedItem.ValorBruto,  PedItem.PercDesconto, PedItem.PercAcrescimo, 
		Item.ValorItem, Item.ValorTotal, PedItem.TipoItem, PedItem.IdClassificacao,
		--512566
		--PedItem.ValorCustoFor, PedItem.ValorCustoUlt, PedItem.ValorCustoMed, PedItem.NumPedCliente, 
		PedItem.ValorCustoFor, PedItem.ValorCustoUlt, PedItem.ValorCustoMed, PedItem.NumPedCliente, PedItem.NumItemPedCliente, 
		Prod.IdTributacao, Item.IdPedidoItem
	From tmpPrft150Item Item left join ftPedidoItem PedItem on Item.IdPedidoItem = PedItem.IdPedidoItem 
							 left join prProduto Prod on (Prod.IdProduto = PedItem.IdProduto)							  
	Where Item.PRFT150ItemPK = @PRFT150ItemPK
	--Inclusão da baixa de estoque correspondente ao item da nota
	Exec @IdMovEstoque = dbo.ProximaSequencia 'ceMovEstoque', @IdEmpresa, 1  
	Insert Into ceMovEstoque(
		IdMovEstoque, IdEmpresaEstoque,  IdProduto, IdServico, DataMovimento, Descricao, 
		TipoMovimento, QuantMovimentada, QuantAtendida, ValorBruto, ValorLiquido, ValorTotal,
		TipoItem, ValorCustoFor, ValorCustoUlt, ValorCustoMed, 
		RefTipoOrigem, RefIdOrigem, IdOperacao)
	Select
		@IdMovEstoque, @IdEmpresaEstoque,  NFItem.IdProduto, NFItem.IdServico, @DataMovimento, NFItem.Descricao,
		Nota.TipoMovimento, NFItem.QuantAtendida, NFItem.QuantAtendida, NFItem.ValorBruto, NFItem.ValorLiquido, NFItem.ValorTotal,
		NFItem.TipoItem, NFItem.ValorCustoFor, NFItem.ValorCustoUlt, NFItem.ValorCustoMed, 
		0 as RefTipoOrigem, @IdNotaFiscalItem, Nota.IdOperacao  -- 0 - Origem nota Fiscal
	From fiNotaFiscalItem NFItem Left Join fiNotaFiscal Nota on Nota.IdNotaFiscal = NFItem.IdNotaFiscal
	Where NFItem.IdNotaFiscalItem = @IdNotaFiscalItem
	if @ItemIdSeparacaoItem is null
	Begin
		--Insere os lotes que estavam digitados no pedido para que baixem estoque
		Insert into ceMovEstoqueItemLote
			(IdMovEstoque, IdLocalizacaoLote, IdEmpresaEstoque, IdProduto, TipoMovimento, TipoBaixaEstoque, QuantMovimentada, RefTipoOrigem, RefIdOrigem, IdLoteProduto)
		Select 
				@IdMovEstoque, Lote.IdLocalizacaoLote, @IdEmpresaEstoque, mov.IdProduto, Mov.TipoMovimento, 
				case when IsNull(pr.FlagProdutoNaoFiscal, 0) = 0 then @TipoBaixaEstoque else 2 end, --Francisco 481870 para não movimentação de estoques
				Lote.QuantAtendida, mov.RefTipoOrigem, mov.RefIdOrigem,
				(select IdLoteProduto from ceLocalizacaoLote where IdLocalizacaoLote = Lote.IdLocalizacaoLote)
		From ftPedidoItemLote Lote
			Left Join ceMovEstoque mov on mov.IdMovEstoque = @IdMovEstoque
			Left Join prProduto pr on pr.IdProduto = mov.IdProduto --Francisco 481870 para não movimentação de estoques
		Where Lote.IdPedidoItem = @ItemIdPedidoItem
	End
	Else
	Begin
		--Insere os lotes que estavam digitados no pedido para que baixem estoque
		Insert into ceMovEstoqueItemLote
			(IdMovEstoque, IdLocalizacaoLote, IdEmpresaEstoque, IdProduto, TipoMovimento, TipoBaixaEstoque, QuantMovimentada, RefTipoOrigem, RefIdOrigem, IdLoteProduto)
		Select 
				@IdMovEstoque, Lote.IdLocalizacaoLote, @IdEmpresaEstoque, mov.IdProduto, Mov.TipoMovimento, 
				case when IsNull(pr.FlagProdutoNaoFiscal, 0) = 0 then @TipoBaixaEstoque else 2 end, --Francisco 481870 para não movimentação de estoques
				Lote.QuantAtendida, mov.RefTipoOrigem, mov.RefIdOrigem,
				(select IdLoteProduto from ceLocalizacaoLote where IdLocalizacaoLote = Lote.IdLocalizacaoLote)
			From ftSeparacaoPedidoLote sepLote left join ftPedidoItemLote Lote on (Lote.IdPedidoItemLotePK = sepLote.IdPedidoItemLotePK)
											Left Join ceMovEstoque mov on mov.IdMovEstoque = @IdMovEstoque
											Left Join prProduto pr on pr.IdProduto = mov.IdProduto --Francisco 481870 para não movimentação de estoques
			Where sepLote.IdSeparacaoItem = @ItemIdSeparacaoItem
	End
	--Dar update nos itens do pedido com a quantidade faturada = quantidade atendida
	Update ftPedidoItem set
	   QuantFaturada = IsNull(QuantFaturada,0) + @ItemQuantAtendidaItem
	where IdPedidoItem = @ItemIdPedidoItem
	Fetch Next From pedidoItem_cursor Into @PRFT150ItemPK, @ItemIdSeparacaoItem, @ItemIdPedidoItem, @ItemQuantAtendidaItem
End  
Close pedidoItem_cursor                                              
Deallocate pedidoItem_cursor   
-- Calculo dos Impostos dos Items da Nota  
EXEC dbo.fiCalcularImpostosNotaFiscalItem @IdNotaFiscal  
 ,@ValorTotalDescProdutos  
 ,@ValorTotalDescServicos  
 ,@ValorTotalFrete  
 ,@ValorTotalSeguro  
 ,@ValorTotalDespesas  
 ,@ValorTotalOutrasDespesas  
 ,0  
-- Calculo Totais da Nota  
SELECT @ValorTotalProdutos = ValorProdutos  
	  ,@ValorTotalServicos = ValorServicos  
	  ,@ValorTotalBaseICMS = ValorBaseICMS  
	  ,@ValorTotalICMS = ValorICMS  
	  ,@ValorTotalBaseICMSST = ValorBaseICMSST  
	  ,@ValorTotalICMSST = ValorICMSST  
	  ,@ValorTotalBaseIPI = ValorBaseIPI  
	  ,@ValorTotalIPI = ValorIPI  
	  ,@ValorTotalBasePIS = ValorBasePIS  
	  ,@ValorTotalPIS = ValorPIS  
	  ,@ValorTotalBaseCOFINS = ValorBaseCOFINS  
	  ,@ValorTotalCOFINS = ValorCOFINS  
	  ,@ValorTotalBaseII = ValorBaseII  
	  ,@ValorTotalII = ValorII  
	  ,@ValorTotalNota = ValorTotalNota 
	  ,@ValorFCP = ValorFCP
	  ,@ValorPartilhaICMSOrigem = ValorPartilhaICMSOrigem
	  ,@ValorPartilhaICMSDestino = ValorPartilhaICMSDestino
FROM dbo.fiCalcularTotaisNotaFiscal(@IdNotaFiscal, @ValorTotalDescProdutos, @ValorTotalDescServicos,   
@ValorTotalFrete, @ValorTotalSeguro, @ValorTotalDespesas, @ValorTotalOutrasDespesas)  
UPDATE fiNotaFiscal  
SET  ValorProdutos = @ValorTotalProdutos  
	,ValorServicos = @ValorTotalServicos  
	,ValorDescProdutos = @ValorTotalDescProdutos  
	,ValorDescServicos = @ValorTotalDescServicos  
	,ValorFrete = @ValorTotalFrete  
	,ValorSeguro = @ValorTotalSeguro  
	,ValorDespesas = @ValorTotalDespesas + @ValorTotalOutrasDespesas  
	,ValorBaseICMS = @ValorTotalBaseICMS  
	,ValorICMS = @ValorTotalICMS  
	,ValorBaseICMSST = @ValorTotalBaseICMSST  
	,ValorICMSST = @ValorTotalICMSST  
	,ValorBaseIPI = @ValorTotalBaseIPI  
	,ValorIPI = @ValorTotalIPI  
	,ValorBasePIS = @ValorTotalBasePIS  
	,ValorPIS = @ValorTotalPIS  
	,ValorBaseCOFINS = @ValorTotalBaseCOFINS  
	,ValorCOFINS = @ValorTotalCOFINS  
	,ValorBaseII = @ValorTotalBaseII  
	,ValorII = @ValorTotalII     
	,ValorFCP = @ValorFCP
	,ValorPartilhaICMSOrigem = @ValorPartilhaICMSOrigem
	,ValorPartilhaICMSDestino = @ValorPartilhaICMSDestino
WHERE IdNotaFiscal = @IdNotaFiscal  

/* Verificar se o valor total dos pedidos - st = valor total de nota fiscal - st*/
/* Francisco - 510467 */
/* Verificar se Valores da Nota e Pedido são os Mesmos */
Declare @ValorPedidoSemST decimal(18,2)
Declare @ValorNfSemST decimal(18,2)
Declare @ValorTotalTitulosGerar decimal(18,2)
Declare @QtdTitulosGerar int
Declare @ExisteDiferencaST bit
Set @ExisteDiferencaST = 0
Declare @ValorAcumuladoDiferenca decimal(18,2) 
Declare @ValorAcertoDiferenca decimal(18,2) 
Declare @ValorAplicadoParcela decimal(18,2) 
Set @ValorAcumuladoDiferenca = 0
Declare @ContadorParcelas int

Declare @Diferenca decimal(18,2) 

if IsNull(@IdSeparacao,0) = 0
Begin
	select @ValorNfSemST = ValorTotalNota - ValorICMSST
	from finotafiscal
	where IdNotaFiscal = @IdNotaFiscal

	select @ValorPedidoSemST = Ped.ValorTotalPedido - Ped.ValorSubTrib
	from finotafiscalpedido NfPed left join ftPedido Ped on Ped.IdPedido = NfPed.IdPedido
	where NfPed.IdNotaFiscal = @IdNotaFiscal

	If @ValorPedidoSemST <> @ValorNfSemST
	Begin
		Set @MensagemERRO = 'Foram detectados erros que impediram o processamento: <br> '  
		Set @MensagemERRO = @MensagemERRO + 'O valor Total do(s) pedido(s) difere do valor total da Nota Fiscal <br><br> '  
		Set @MensagemERRO = @MensagemERRO + 'Faça o fechamento novamente dos pedidos e tente processar novamente!'  
		return  
	End
End

/*Verificar valor total da nota fiscal com o valor total de títulos a serem gerados*/

select @ValorTotalTitulosGerar = Sum(ValorParcela), @QtdTitulosGerar = count(*)
from tmpPrft150Vencimento 
Where IdProcessamento = @IdProcessamento  

if @ValorTotalNota <> @ValorTotalTitulosGerar --ST foi modificada, deverá acertar o valor das parcelas
begin
	Set @Diferenca = @ValorTotalNota - @ValorTotalTitulosGerar
	Set @ExisteDiferencaST = 1
end

Set @ContadorParcelas = 1

/* Fim - Francisco - 510467 */

--Geração dos títulos (A receber)  
Declare CursorVenc Cursor Local Fast_Forward For  
    Select NumParcela, DataVencimento, ValorParcela, FlagBaixada  
    from tmpPrft150Vencimento 
    Where IdProcessamento = @IdProcessamento  
Open CursorVenc  
Fetch Next From CursorVenc into @TitNumParcela, @TitDataVencimento, @TitValorTParcela, @TitFlagBaixada  
while @@Fetch_status = 0  
begin  
    Exec @TitIdTitulo = dbo.ProximaSequencia 'fnTitulo' ,@IdEmpresa ,1  
    Set @TitNumeroTitulo = Replicate('0', 6 - len(@NumDocumento))   
                        + Cast(@NumDocumento as varchar) + '/' + Cast(@TitNumParcela as varchar)  
    --Se o TipoMovimento da Operação for Devolução setar o Titulo com o FlagCredito = 1      
    --if @TipoMovimento = 1
	--	Set @TitFlagCredito = 1
	--else
	--	Set @TitFlagCredito = 0	
	if @ExisteDiferencaST = 0
	begin
		Set @ValorAplicadoParcela = 0
	end
	else
	begin
		Select @ValorAplicadoParcela = @Diferenca * @TitValorTParcela / @ValorTotalNota
		Set @ValorAcumuladoDiferenca = @ValorAcumuladoDiferenca + @ValorAplicadoParcela
		if @ContadorParcelas = @QtdTitulosGerar
		begin
			if @ValorAcumuladoDiferenca <> @Diferenca
			begin
				set @ValorAcertoDiferenca = @Diferenca - @ValorAcumuladoDiferenca
				set @ValorAplicadoParcela = @ValorAplicadoParcela + @ValorAcertoDiferenca
			end
		end		
	end
    Insert Into fnTitulo (IdTitulo, RefTipoOrigem, RefIdOrigem, TipoTitulo, TipoCarteira, NumeroTitulo, IdEntidade,  
            DataCriacao, DataEmissao, DataVencimento, DataPagamento, DataCompensacaoVencimento, DataCompensacaoPagamento,  
            ValorBase, ValorAdicional, ValorTitulo,  
            ValorABaixar, 
			ValorSaldoTitulo, 
			ValorSaldoABaixar,  
            IdEmpresa, FlagCredito, IdBanco, FlagRecebimentoAVista, IdContaContabil, IdSituacao)        
        Values (@TitIdTitulo, 0, @IdNotaFiscal, 0, @TipoCarteira, @TitNumeroTitulo, @IdEntidade,  
            GetDate(), @DataEmissao, @TitDatavencimento, null, @TitDataVencimento, null,  
            @TitValorTParcela + @ValorAplicadoParcela, 0, @TitValorTParcela,  
            @TitValorTParcela + @ValorAplicadoParcela, 
			(@TitValorTParcela  + @ValorAplicadoParcela) * case @FlagTituloCredito when 0 Then 1 Else -1 End, 
			(@TitValorTParcela  + @ValorAplicadoParcela) * case @FlagTituloCredito when 0 Then 1 Else -1 End,  
            @IdEmpresa, @FlagTituloCredito, @IdBanco, @TitFlagBaixada, @IdContaContabilVenda, @IdSituacaoTituloVenda)  
	Set @ContadorParcelas = @ContadorParcelas + 1
    Fetch Next From CursorVenc into @TitNumParcela, @TitDataVencimento, @TitValorTParcela, @TitFlagBaixada  
end  
Close CursorVenc  
Deallocate CursorVenc  
--Validações de pós processamento  
exec dbo.Prft150Validacao @IdProcessamento,   
      1, @IdNotaFiscal,-- pós processamento  
         @MensagemERRO = @ErrosValidacao output  
--inserindo na tabela de Cupom Fiscal quando for @TipoNotaCupom > 0
If @TipoNotaCupom > 0
Begin		
	Exec PRFT150ValidacaoCupom @IdNotaFiscal,@NumEquipamento,@MensagemERRO = @ErrosValidacaoCupom output  
	if (@ErrosValidacaoCupom <> '')  
	begin  
		Set @MensagemERRO = 'Foram detectados erros que impediram o processamento: ' + '<br> '  
		Set @MensagemERRO = @MensagemERRO + @ErrosValidacaoCupom + '<br><br> '  
		Set @MensagemERRO = @MensagemERRO + 'Verifique os problemas e tente processar novamente!'  
		return
	end
	Insert into fiCupomFiscal
	(IdNotaFiscal, DataHoraCriacao, StatusImpCupom, NumEquipamento, NumCpfCnpj, Mensagem)
	Values
	(@IdNotaFiscal, getdate(), 0, @NumEquipamento, @NumCpfCnpjCupom, 'Cupom Aguardando Impressão')
End
Delete From tmpPrft150Volume where IdProcessamento = @IdProcessamento  
Delete From tmpPrft150Item where IdProcessamento = @IdProcessamento   
Delete From tmpPrft150Pedido where IdProcessamento = @IdProcessamento   
Delete From tmpPrft150Vencimento where IdProcessamento = @IdProcessamento  
Delete from tmpPrft150 where IdProcessamento = @IdProcessamento   
Set @MensagemERRO = ''  
    if (@ErrosValidacao <> '')  
    begin  
      Set @MensagemERRO = 'Problemas ao processar : ' + '<br> '  
      Set @MensagemERRO = @MensagemERRO + @ErrosValidacao + '<br><br> '  
      Set @MensagemERRO = @MensagemERRO + 'O processamento Não foi concluído !'         
      return  
    end;  
 SET NOCOUNT OFF;    
END 
GO

ALTER Procedure [dbo].[PRFT150Pedido](@IdProcessamento INT, @IdPedido int, @IdSeparacao int)  
as  
Begin  
	Declare @PRFT150ItemPK int
	Declare @IdPedidoItem int
	Declare @IdSeparacaoItem int
	Declare @ValorLiquidoItem decimal(18,2) 
	Declare @QuantAtendidaItem decimal(18,2) 
	Declare @ValorTotalItem decimal(18,2)
	Declare @ValorDescontoProduto decimal(18,2)
	Declare @ValorDescontoServico decimal(18,2)
	Declare @ValorFrete decimal(18,2)
	Declare @ValorSeguro decimal(18,2)
	Declare @ValorDespesas decimal(18,2)
	Declare @ValorOutrasDespesas decimal(18,2)
	Declare @ValorDescProdutos decimal(18,2)
	Declare @ValorDescServicos decimal(18,2)
	Declare @ValorDescProdutosAcumulados decimal(18,2)
	Declare @ValorDescServicosAcumulados decimal(18,2)
	/*Francisco - 510323*/
	DECLARE	@ValorFretePedido DECIMAL(18, 2)
	DECLARE	@ValorSeguroPedido DECIMAL(18, 2)	
	DECLARE	@ValorDespesasPedido DECIMAL(18, 2)
	DECLARE	@ValorOutrasDespesasPedido DECIMAL(18, 2)

	DECLARE	@ValorFreteAcumulado DECIMAL(18, 2)
	DECLARE	@DiferencaFreteAcumulado DECIMAL(18, 2)	
	DECLARE	@ValorSeguroAcumulado DECIMAL(18, 2)
	DECLARE	@DiferencaSeguroAcumulado DECIMAL(18, 2)	
	DECLARE	@ValorDespesasAcumulado DECIMAL(18, 2)
	DECLARE	@DiferencaDespesasAcumulado DECIMAL(18, 2)
	DECLARE	@ValorOutrasDespesasAcumulado DECIMAL(18, 2)
	DECLARE	@DiferencaOutrasDespesasAcumulado DECIMAL(18, 2)

	/*Fim - Francisco - 510323*/
	Declare @QtdItensNaoAtendidos int
	Declare @MsgErro varchar(2000)	
	Set @MsgErro = ''
	
	set @ValorDescProdutosAcumulados = 0
	set @ValorDescServicosAcumulados = 0
	
	/*Francisco - 510323*/
	set @ValorFreteAcumulado = 0
	set @ValorSeguroAcumulado = 0
	set @ValorDespesasAcumulado = 0
	set @ValorOutrasDespesasAcumulado = 0

	set @DiferencaFreteAcumulado = 0
	set @DiferencaSeguroAcumulado = 0	
	set @DiferencaDespesasAcumulado = 0	
	set @DiferencaOutrasDespesasAcumulado = 0	
	/*Fim - Francisco - 510323*/

	INSERT INTO tmpPRFT150Pedido (IdProcessamento, IdPedido, IdSeparacao)
	Values(@IdProcessamento, @IdPedido, @IdSeparacao)
		

	If @IdSeparacao = 0 --Pedidos
	Begin
		/* Movido para PRFT150Validacao
		--Verificar se Todos os itens foram atendidos
		select @QtdItensNaoAtendidos = count(*)
		from ftPedidoItem
		where IdPedido = @IdPedido
		  and QuantAtendida < QuantPedida

		if @QtdItensNaoAtendidos > 0
		Begin
			Set @MsgErro = '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.'
			GOTO ERRO
		End
		*/

		Declare CursorItem cursor local fast_forward for   
		Select
			IdPedidoItem, null IdSeparacaoItem, ValorLiquidoItem, QuantAtendidaItem, ValorTotalItem, 
			ValorTotalItem * ValorDescProdutos / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDescontoProduto,
			ValorTotalItem * ValorDescServicos / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDescontoServico,
			ValorTotalItem * ValorFretePedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorFrete,
			ValorTotalItem * ValorSeguroPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorSeguro,
			ValorTotalItem * ValorDespesasPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDespesas,
			ValorTotalItem * ValorOutrasDespesasPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorOutrasDespesas,
			ValorDescProdutos, ValorDescServicos, ValorFretePedido, ValorSeguroPedido, ValorDespesasPedido, ValorOutrasDespesasPedido
		From
		(
			select item.IdPedidoItem, 
			IsNull(item.ValorLiquido,0) ValorLiquidoItem, 
			IsNull(item.QuantAtendida,0) QuantAtendidaItem, 
			IsNull(item.ValorTotal,0) ValorTotalItem, 
		    IsNull(Case When item.IdProduto is not null then ped.ValorDescProdutos else 0 end,0) ValorDescProdutos,
			IsNull(Case When item.IdServico is not null then ped.ValorDescServicos else 0 end,0) ValorDescServicos,
			IsNull(ped.ValorFrete, 0) ValorFretePedido, 
			IsNull(ped.ValorSeguro, 0) ValorSeguroPedido, 
			IsNull(ped.ValorDespesas, 0) ValorDespesasPedido, 
			IsNull(ped.ValorOutrasDespesas, 0) ValorOutrasDespesasPedido,
			IsNull(Case When item.IdProduto is null then ped.ValorServicos else ped.ValorProdutos end,0) ValorProdutosServicosPedido
			from ftPedidoItem item left join ftPedido ped on ped.IdPedido = item.IdPedido
			where item.IdPedido = @IdPedido
		) Aux		
	End
	Else
	Begin --Separação
		--Verificar se existe vencimentos gerados para o Pedido referente da Separação
		/* Movido para PRFT150Validacao
		if exists(
		select top 1 1 from ftSeparacaoPedido sep join ftPedidoVencimento venc on venc.IdPedido = sep.IdPedido
		Where IdSeparacao = @IdSeparacao)
		begin
			Set @MsgErro = 'Só é possível fazer o processamento de pedidos parciais que não contenham vencimentos cadastrados. Verifique o pedido: ' + Cast(@IdPedido as varchar)
			GOTO ERRO	
		end
		*/
		Declare CursorItem cursor local fast_forward for   
		Select
			IdPedidoItem, IdSeparacaoItem, ValorLiquidoItem, QuantAtendidaItem, ValorTotalItem, 
			ValorTotalItem * ValorDescProdutos / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDescontoProduto,
			ValorTotalItem * ValorDescServicos / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDescontoServico,
			ValorTotalItem * ValorFretePedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorFrete,
			ValorTotalItem * ValorSeguroPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorSeguro,
			ValorTotalItem * ValorDespesasPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorDespesas,
			ValorTotalItem * ValorOutrasDespesasPedido / Case When ValorProdutosServicosPedido = 0 then 1 else ValorProdutosServicosPedido end ValorOutrasDespesas,
			ValorDescProdutos, ValorDescServicos, ValorFretePedido, ValorSeguroPedido, ValorDespesasPedido, ValorOutrasDespesasPedido
		From
		(
			select item.IdPedidoItem, item.IdSeparacaoItem, 
			IsNull(pedItem.ValorLiquido,0) ValorLiquidoItem, 
			IsNull(item.QuantConferida,0) QuantAtendidaItem, 
			IsNull(pedItem.ValorLiquido * item.QuantConferida,0) ValorTotalItem, 
	        IsNull(Case When item.IdProduto is not null then IsNull(ped.ValorDescProdutos,0) / IsNull(ped.ValorProdutos,1) * IsNull(pedItem.ValorLiquido,0) * IsNull(Item.QuantConferida,0) else 0 end,0) ValorDescProdutos,			
			IsNull(Case When item.IdServico is not null then IsNull(ped.ValorDescServicos,0) / IsNull(ped.ValorServicos,1) * IsNull(pedItem.ValorLiquido,0) * IsNull(Item.QuantConferida,0) else 0 end,0) ValorDescServicos,
			IsNull(ped.ValorFrete, 0) ValorFretePedido, 
			IsNull(ped.ValorSeguro, 0) ValorSeguroPedido, 
			IsNull(ped.ValorDespesas, 0) ValorDespesasPedido, 
			IsNull(ped.ValorOutrasDespesas, 0) ValorOutrasDespesasPedido,
			IsNull(Case When item.IdProduto is null then ped.ValorServicos else ped.ValorProdutos end,0) ValorProdutosServicosPedido
			from ftSeparacaoPedidoItem item join ftPedidoItem pedItem on pedItem.IdPedidoItem = item.IdPedidoItem and pedItem.IdPedido = @IdPedido
											join ftPedido ped on ped.IdPedido = pedItem.IdPedido
			where item.IdSeparacao = @IdSeparacao
		) Aux
	End

	Open CursorItem  
	Fetch Next From CursorItem Into @IdPedidoItem, @IdSeparacaoItem, @ValorLiquidoItem, 
									@QuantAtendidaItem, @ValorTotalItem, @ValorDescontoProduto, 
									@ValorDescontoServico, @ValorFrete, 
									@ValorSeguro, @ValorDespesas, @ValorOutrasDespesas,
									@ValorDescProdutos, @ValorDescServicos,
									@ValorFretePedido, @ValorSeguroPedido, @ValorDespesasPedido, @ValorOutrasDespesasPedido
	While @@Fetch_Status = 0  
	Begin    
		select @PRFT150ItemPK = IsNull(Max(PRFT150ItemPK),0) + 1 from tmpPRFT150Item
						
		Insert into tmpPRFT150Item (
			PRFT150ItemPK, IdProcessamento, IdPedido,
			IdSeparacao, IdPedidoItem, IdSeparacaoItem, ValorItem, QuantAtendida,
			ValorTotal, ValorDescontoProduto, ValorDescontoServico, ValorFrete, ValorSeguro, ValorDespesas, ValorOutrasDespesas, 
			ValorTotalCalculado
		)
		Values (
			@PRFT150ItemPK, @IdProcessamento, @IdPedido,
			@IdSeparacao, @IdPedidoItem, @IdSeparacaoItem, @ValorLiquidoItem, @QuantAtendidaItem,
			@ValorTotalItem, @ValorDescontoProduto, @ValorDescontoServico, @ValorFrete, @ValorSeguro, @ValorDespesas, @ValorOutrasDespesas,
			@ValorTotalItem - @ValorDescontoProduto - @ValorDescontoServico + @ValorFrete + @ValorSeguro + @ValorDespesas + @ValorOutrasDespesas				
		)
		
		set @ValorDescProdutosAcumulados = @ValorDescProdutosAcumulados + @ValorDescontoProduto
		set @ValorDescServicosAcumulados = @ValorDescServicosAcumulados + @ValorDescontoServico
		/*Francisco - 510323*/
		set @ValorFreteAcumulado = @ValorFreteAcumulado + @ValorFrete
		set @ValorSeguroAcumulado = @ValorSeguroAcumulado + @ValorSeguro
		set @ValorDespesasAcumulado = @ValorDespesasAcumulado + @ValorDespesas
		set @ValorOutrasDespesasAcumulado = @ValorOutrasDespesasAcumulado + @ValorOutrasDespesas
		/*Fim - Francisco - 510323*/

		Fetch Next From CursorItem Into @IdPedidoItem, @IdSeparacaoItem, @ValorLiquidoItem, 
									@QuantAtendidaItem, @ValorTotalItem, @ValorDescontoProduto, 
									@ValorDescontoServico, @ValorFrete, 
									@ValorSeguro, @ValorDespesas, @ValorOutrasDespesas,
									@ValorDescProdutos, @ValorDescServicos,
									@ValorFretePedido, @ValorSeguroPedido, @ValorDespesasPedido, @ValorOutrasDespesasPedido
	End
	Close CursorItem  
	Deallocate CursorItem  
	
	/*Francisco - 510323*/
	if (@ValorFreteAcumulado != @ValorFretePedido)
	begin
		set	@DiferencaFreteAcumulado = @ValorFretePedido - @ValorFreteAcumulado
		update tmpPRFT150Item 
		set ValorFrete = ValorFrete + @DiferencaFreteAcumulado
		where PRFT150ItemPK = @PRFT150ItemPK		
	end

	if (@ValorSeguroAcumulado != @ValorSeguroPedido)
	begin
		set	@DiferencaSeguroAcumulado = @ValorSeguroPedido - @ValorSeguroAcumulado
		update tmpPRFT150Item 
		set ValorSeguro = ValorSeguro + @DiferencaSeguroAcumulado
		where PRFT150ItemPK = @PRFT150ItemPK		
	end

	if (@ValorDespesasAcumulado != @ValorDespesasPedido)
	begin
		set	@DiferencaDespesasAcumulado = @ValorDespesasPedido - @ValorDespesasAcumulado
		update tmpPRFT150Item 
		set ValorDespesas = ValorDespesas + @DiferencaDespesasAcumulado
		where PRFT150ItemPK = @PRFT150ItemPK		
	end
	
	if (@ValorOutrasDespesasAcumulado != @ValorOutrasDespesasPedido)
	begin
		set	@DiferencaOutrasDespesasAcumulado = @ValorOutrasDespesasPedido - @ValorOutrasDespesasAcumulado
		update tmpPRFT150Item 
		set ValorOutrasDespesas = ValorOutrasDespesas + @DiferencaOutrasDespesasAcumulado
		where PRFT150ItemPK = @PRFT150ItemPK		
	end
	/*Fim - Francisco - 510323*/

	if (@ValorDescProdutosAcumulados < @ValorDescProdutos)
	begin
		update tmpPRFT150Item 
		set ValorDescontoProduto = ValorDescontoProduto + (@ValorDescProdutos - @ValorDescProdutosAcumulados)
		where PRFT150ItemPK = @PRFT150ItemPK
	end
	else if (@ValorDescProdutosAcumulados > @ValorDescProdutos)
	begin
		update tmpPRFT150Item 
		set ValorDescontoProduto = ValorDescontoProduto - (@ValorDescProdutosAcumulados - @ValorDescProdutos)
		where PRFT150ItemPK = @PRFT150ItemPK
	end

	if (@ValorDescServicosAcumulados < @ValorDescServicos)
	begin
		update tmpPRFT150Item 
		set ValorDescontoServico = ValorDescontoServico + (@ValorDescServicos - @ValorDescServicosAcumulados)
		where PRFT150ItemPK = @PRFT150ItemPK
	end
	else if (@ValorDescServicosAcumulados > @ValorDescServicos)
	begin
		update tmpPRFT150Item 
		set ValorDescontoServico = ValorDescontoServico - (@ValorDescServicosAcumulados - @ValorDescServicos)
		where PRFT150ItemPK = @PRFT150ItemPK
	end

	update tmpPRFT150Item
	set ValorTotalCalculado = ValorTotal - ValorDescontoProduto - ValorDescontoServico + ValorFrete + ValorSeguro + ValorDespesas + ValorOutrasDespesas
	
	GOTO FIM

	ERRO:
		RAISERROR (@MsgErro, 16, 1 )
	FIM:
End  
go

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[ProximaEntidade]
(@idTipoEntidade char(1))  
AS
BEGIN

declare @SequenciaGerada integer

	Select @SequenciaGerada = IsNull(SequenciaAtual,0) + 1 From tbTipoEntidade 
	where IdTipoEntidade = @idTipoEntidade

   Update tbTipoEntidade  
       Set SequenciaAtual=IsNull(SequenciaAtual,0) + 1  
   Where IdTipoEntidade = @idTipoEntidade  

	Return @SequenciaGerada

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('ceBalancoEstoqueItem') and o.name = 'FK_ceBalancoEstoqueItem_ceBalancoEstoque')
alter table ceBalancoEstoqueItem
   drop constraint FK_ceBalancoEstoqueItem_ceBalancoEstoque
go

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

/*==============================================================*/
/* Table: ceBalancoEstoque                                      */
/*==============================================================*/
create table ceBalancoEstoque (
   IdBalancoEstoque     int                  not null,
   IdEmpresaEstoque     int                  null,
   Descricao            varchar(255)         null,
   DataBalanco          datetime             null,
   IdUsuario            int                  null,
   StatusBalanco        int                  null,
   constraint PK_CEBALANCOESTOQUE primary key (IdBalancoEstoque)
)
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('ceBalancoEstoqueItem') and o.name = 'FK_ceBalancoEstoqueItem_ceBalancoEstoque')
alter table ceBalancoEstoqueItem
   drop constraint FK_ceBalancoEstoqueItem_ceBalancoEstoque
go

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

/*==============================================================*/
/* Table: ceBalancoEstoqueItem                                  */
/*==============================================================*/
create table ceBalancoEstoqueItem (
   IdBalancoEstoqueItem int                  not null,
   IdBalancoEstoque     int                  not null,
   IdProduto            int                  null,
   FlagCont1            bit                  null,
   QuantCont1           decimal(18,5)        null,
   FlagCont2            bit                  null,
   QuantCont2           decimal(18,5)        null,
   FlagCont3            bit                  null,
   QuantCont3           decimal(18,5)        null,
   StatusBalancoItem    int                  null,
   QuantEstoque         decimal(18,5)        null,
   QuantReservadaEnt    decimal(18,5)        null,
   QuantReservadaSai    decimal(18,5)        null,
   QuantPedidoAberto    decimal(18,5)        null
   constraint PK_CEBALANCOESTOQUEITEM primary key (IdBalancoEstoqueItem)
)
go

alter table ceBalancoEstoqueItem
   add constraint FK_ceBalancoEstoqueItem_ceBalancoEstoque foreign key (IdBalancoEstoque)
      references ceBalancoEstoque (IdBalancoEstoque)
go

CREATE Procedure [dbo].[ceGerarBalancoEstoque]
(@IdEmpresaEstoque numeric(2),
 @IdBalancoEstoque int
)
as
Begin
Declare @IdProduto int
Declare @IdBalancoEstoqueItem int
Declare @QuantEstoque decimal(18,3)
Declare @QuantContagem decimal(18,3)
Declare @FlagGerarMovEstoqueSeparado smallint
Declare @IdLocalizacaoLote int
Declare @IdEndereco int
Declare @IdLoteProduto int
Declare @QuantEstoqueLocalizacao decimal(18,3)
Declare @IdMovEstoque int
Declare @DataMovimento datetime
Declare @NumeroLoteNovo varchar(20)
Declare @IdEnderecoNovo int
Declare @IdLoteProdutoNovo int
Declare @IdLocalizacaoLoteNovo int
Declare @TipoMovimento int

  Set @DataMovimento = GETDATE();

  Declare CursorProdutos Cursor Local Fast_Forward For  	

	  Select Item.IdProduto, Max(Item.IdBalancoEstoqueItem) as IdBalancoEstoqueItem,
			 Abs(Sum(Est.QuantEstoque)) as QuantEstoque, 
			 Case when not (Max(Item.QuantCont3) is null) then Max(Item.QuantCont3)
			      when not (Max(Item.QuantCont2) is null) then Max(Item.QuantCont2)
				  when not (Max(Item.QuantCont1) is null) then Max(Item.QuantCont1)
				  else null end as QuantContagem
	  From ceBalancoEstoque B
	  Left Join ceBalancoEstoqueItem Item on Item.IdBalancoEstoque = B.IdBalancoEstoque
	  Left Join ceLocalizacaoLote Est on Est.IdProduto = Item.IdProduto
									 and Est.IdEmpresaEstoque = B.IdEmpresaEstoque
	  Where B.IdBalancoEstoque = @IdBalancoEstoque
		and B.IdEmpresaEstoque = @IdEmpresaEstoque
		and not(Case when not (Item.QuantCont3 is null) then Item.QuantCont3
			         when not (Item.QuantCont2 is null) then Item.QuantCont2
				     when not (Item.QuantCont1 is null) then Item.QuantCont1
				     else null end is null)
		and Est.QuantEstoque <> (Case when not (Item.QuantCont3 is null) then Item.QuantCont3
									  when not (Item.QuantCont2 is null) then Item.QuantCont2
				                      when not (Item.QuantCont1 is null) then Item.QuantCont1
				                      else null end)
	  Group By Item.IdProduto 

  Open CursorProdutos  
  Fetch Next From CursorProdutos Into @IdProduto, @IdBalancoEstoqueItem, @QuantEstoque, @QuantContagem  
  while @@Fetch_Status = 0   
  begin 
	Set @IdMovEstoque = 0

	-------------------------------ZERANDO ESTOQUE DO PRODUTO-----------------------------------------

	--Verifica existe quantidade negativa e positiva no Estoque		
	Select @FlagGerarMovEstoqueSeparado = Case when isnull(IdProduto,0) > 0 then 1 else 0 end
	From ceLocalizacaoLote
	Where IdProduto = @IdProduto
	and IdEmpresaEstoque = @IdEmpresaEstoque
	Group By IdProduto
	Having min(QuantEstoque) < 0 and max(QuantEstoque) > 0

	Set @FlagGerarMovEstoqueSeparado = Isnull(@FlagGerarMovEstoqueSeparado,0) 

	Declare CursorEstoque Cursor Local Fast_Forward For  	

		Select IdLocalizacaoLote, IdEndereco, IdLoteProduto, Abs(QuantEstoque),
			   Case when QuantEstoque > 0 then 2 else 1 end	
		From ceLocalizacaoLote
		Where IdProduto = @IdProduto
		and IdEmpresaEstoque = @IdEmpresaEstoque		
		order by QuantEstoque desc

	Open CursorEstoque  
	Fetch Next From CursorEstoque Into @IdLocalizacaoLote, @IdEndereco, @IdLoteProduto, @QuantEstoqueLocalizacao, @TipoMovimento  
	while @@Fetch_Status = 0   
	begin 
			if (@IdMovEstoque = 0 or @FlagGerarMovEstoqueSeparado = 1)
			begin
				Exec @IdMovEstoque = dbo.ProximaSequencia 'ceMovEstoque', @IdEmpresaEstoque, 1  			  
				Insert Into ceMovEstoque(
					IdMovEstoque, IdEmpresaEstoque,  IdProduto, DataMovimento, Descricao, TipoItem,
					TipoMovimento, QuantMovimentada, QuantAtendida,
					ValorBruto, ValorLiquido, ValorTotal, ValorCustoFor, ValorCustoUlt, ValorCustoMed, 
					RefTipoOrigem, RefIdOrigem)
				Select
					@IdMovEstoque, @IdEmpresaEstoque, @IdProduto, @DataMovimento, P.Descricao, 0,
					@TipoMovimento,
					Case when @FlagGerarMovEstoqueSeparado = 1 then @QuantEstoqueLocalizacao else @QuantEstoque end, 
					Case when @FlagGerarMovEstoqueSeparado = 1 then @QuantEstoqueLocalizacao else @QuantEstoque end,
					0, 0, 0, 0, 0, 0,
					3, @IdBalancoEstoqueItem
				From prProduto P
				Where P.IdProduto = @IdProduto	
			end    

			Insert into ceMovEstoqueItemLote
				(IdMovEstoque, IdLocalizacaoLote, IdEmpresaEstoque, IdProduto, TipoMovimento,
				 TipoBaixaEstoque, QuantMovimentada, RefTipoOrigem, RefIdOrigem, IdLoteProduto)
			Values(
					@IdMovEstoque, @IdLocalizacaoLote, @IdEmpresaEstoque, @IdProduto, 
					@TipoMovimento, 1, 
					@QuantEstoqueLocalizacao, 3, @IdBalancoEstoqueItem,
					@IdLoteProduto)			

		Fetch Next From CursorEstoque Into @IdLocalizacaoLote, @IdEndereco, @IdLoteProduto, @QuantEstoqueLocalizacao, @TipoMovimento      
	end  
	Close CursorEstoque  
	Deallocate CursorEstoque

	exec ceAjustaSaldoEstoque @IdEmpresaEstoque, @IdProduto, @IdProduto

	--------------------------GERANDO ESTOQUE DO BALANÇO-----------------------------------------

	Set @IdLocalizacaoLote = Isnull(@IdLocalizacaoLote,0) 
	
	--Caso o Produto não possuir Lote incluir um Lote Padrão
	if @IdLocalizacaoLote = 0
	begin
		Select @NumeroLoteNovo = NumeroLotePadrao, 
		       @IdEnderecoNovo = IdEndereco 
		from tbParametroControle 
		where IdEmpresa = @IdEmpresaEstoque
        
        Exec @IdLoteProdutoNovo = ProximaSequencia 'ceLoteProduto', @IdEmpresaEstoque, 1
        Insert into ceLoteProduto 
			(IdLoteProduto, IdProduto, IdEmpresaEstoque, NumeroLote)
        Values 
			(@IdLoteProdutoNovo, @IdProduto, @IdEmpresaEstoque, @NumeroLoteNovo)

        Exec @IdLocalizacaoLoteNovo = ProximaSequencia 'ceLocalizacaoLote', @IdEmpresaEstoque, 0
        Insert into ceLocalizacaoLote 
			(IdLocalizacaoLote, IdEndereco, IdLoteProduto, QuantEstoque, QuantReservadaEnt, QuantReservadaSai, QuantPedidoAberto,
             IdEmpresaEstoque, IdProduto, FlagBloqueioVenda) 
        Values 
			(@IdLocalizacaoLoteNovo, @IdEnderecoNovo, @IdLoteProdutoNovo, 0, 0, 0, 0,
             @IdEmpresaEstoque, @IdProduto, 0) 

		Set @IdLocalizacaoLote = Isnull(@IdLocalizacaoLoteNovo,0) 
	end 

	Exec @IdMovEstoque = dbo.ProximaSequencia 'ceMovEstoque', @IdEmpresaEstoque, 1  			  
	Insert Into ceMovEstoque(
		IdMovEstoque, IdEmpresaEstoque,  IdProduto, DataMovimento, Descricao, TipoItem,
		TipoMovimento, QuantMovimentada, QuantAtendida,
		ValorBruto, ValorLiquido, ValorTotal, ValorCustoFor, ValorCustoUlt, ValorCustoMed, 
		RefTipoOrigem, RefIdOrigem)
	Select
		@IdMovEstoque, @IdEmpresaEstoque, @IdProduto, @DataMovimento, P.Descricao, 0,
		1, @QuantContagem, @QuantContagem,		
		0, 0, 0, 0, 0, 0,
		4, @IdBalancoEstoqueItem
	From prProduto P
	Where P.IdProduto = @IdProduto	

	Insert into ceMovEstoqueItemLote
		(IdMovEstoque, IdLocalizacaoLote, IdEmpresaEstoque, IdProduto, TipoMovimento,
			TipoBaixaEstoque, QuantMovimentada, RefTipoOrigem, RefIdOrigem, IdLoteProduto)
	Values(
			@IdMovEstoque, @IdLocalizacaoLote, @IdEmpresaEstoque, @IdProduto, 
			1, 1, @QuantContagem, 4, @IdBalancoEstoqueItem,
			@IdLoteProduto)	

	exec ceAjustaSaldoEstoque @IdEmpresaEstoque, @IdProduto, @IdProduto

	update ceBalancoEstoqueItem
	set StatusBalancoItem = 2 --Teve alteração de Estoque
	where IdBalancoEstoqueItem = @IdBalancoEstoqueItem
      
	Fetch Next From CursorProdutos Into @IdProduto, @IdBalancoEstoqueItem, @QuantEstoque, @QuantContagem        
  end  
  Close CursorProdutos  
  Deallocate CursorProdutos 
  
  Update ceBalancoEstoque
  set StatusBalanco = 1 --Balanço Gerado
  Where IdBalancoEstoque = @IdBalancoEstoque
	and IdEmpresaEstoque = @IdEmpresaEstoque
End      
GO

CREATE TABLE LogTransacao (
 Id BIGINT PRIMARY KEY IDENTITY,
 Inicio DATETIME NOT NULL,
 Fim DATETIME NOT NULL,
 Aplicacao VARCHAR(100) NOT NULL,
 IdUsuario INT NOT NULL
)

-- colocar FK para usuario

CREATE TABLE LogItem (
 Id BIGINT PRIMARY KEY IDENTITY,
 TabelaRegistro VARCHAR(100) NOT NULL,
 ChaveRegistro VARCHAR(40) NOT NULL,
 Acao INT NOT NULL,
 Descricao VARCHAR(MAX) NOT NULL,
 LogTransacaoId BIGINT NOT NULL,
 CONSTRAINT LogItem_LogTransacao FOREIGN KEY (LogTransacaoId) REFERENCES LogTransacao(Id)
)

GO

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

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

--VERIFICANDO BLOQUEIO POR MARGEM GERAL
SET @TipoBloqueio = ISNULL((SELECT 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 FROM ftConfiguracaoBloqueio 
WHERE TipoBloqueio=0 AND Ativo=1 AND IdEmpresa=@IdEmpresa), 0)

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

SET @TipoBloqueio = 0;
 
-- 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 = ISNULL((SELECT 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
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), 0)

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

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR GRUPO
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR FORNECEDOR
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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


--VERIFICACAO DE MARGENS PARA BLOQUEIO POR SERVIÇO
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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

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

return        
End   
GO


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


Alter table fnMovCriacao
Add TipoCarteira smallint 
go

update movCriacao
	Set movCriacao.TipoCarteira = movFin.TipoCarteira
from fnMovCriacao movCriacao left join fnMovFinanceiro movFin on movFin.IdMovimento = movCriacao.IdMovimento
go

alter table fnMovCriacao
	Alter Column TipoCarteira smallint not null
go

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 FUNCTION [dbo].[ftVerificaBloqueioMargensPedido]
(@IdPedido int, @IdEmpresa int)
RETURNS @VetBloqueios TABLE 
(
	TipoBloqueio int,
	MargemLucro decimal(18,2)
)
as
Begin
DECLARE @IdPedidoItem int
DECLARE @MargemItem decimal(18,2)
DECLARE @MargemPedido decimal(18,2)
DECLARE @TipoBloqueio int

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

--VERIFICANDO BLOQUEIO POR MARGEM GERAL
SET @TipoBloqueio = ISNULL((SELECT 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 FROM ftConfiguracaoBloqueio 
WHERE TipoBloqueio=0 AND Ativo=1 AND IdEmpresa=@IdEmpresa), 0)

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

SET @TipoBloqueio = 0;
 
-- 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 = ISNULL((SELECT 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
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), 0)

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

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR GRUPO
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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

--VERIFICACAO DE MARGENS PARA BLOQUEIO POR FORNECEDOR
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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


--VERIFICACAO DE MARGENS PARA BLOQUEIO POR SERVIÇO
SET @TipoBloqueio = ISNULL((SELECT 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
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), 0)

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

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

return        
End   
GO