Update Versao 
Set PatchVersao = 1
Where Versao = 3
  and SubVersao = 1;

SET TERM ^ ;

ALTER PROCEDURE STORED_PRFT110GERANOTA (
    ped_sequencia integer,
    empresa integer,
    tipocontrole integer,
    codcontrole integer,
    contadornota integer)
as
declare variable somaicmprodutos numeric(11,2);
declare variable somaicmservicos numeric(11,2);
declare variable somacontabilnotaprodutos numeric(11,2);
declare variable somacontabilnotaservicos numeric(11,2);
declare variable compsomaicmprodutos numeric(11,2);
declare variable compsomaicmservicos numeric(11,2);
declare variable flagentrada integer;
declare variable codoperacao integer;
declare variable existe integer;
declare variable auxtipoitem integer;
declare variable auxnumsequencia integer;
declare variable auxempresa integer;
declare variable auxnumlancamento integer;
declare variable auxcodproduto integer;
declare variable auxaliqicm numeric(4,2);
declare variable auxbaseicm numeric(11,2);
declare variable auxvaloricm numeric(11,2);
declare variable auxvalorisentoicm numeric(11,2);
declare variable auxvaloroutrasicm numeric(11,2);
declare variable auxperreducaoicm numeric(11,2);
declare variable auxbasesubtrib numeric(11,2);
declare variable auxvalorsubtrib numeric(11,2);
declare variable auxbasesubtribcarga numeric(11,2);
declare variable auxvalorsubtribcarga numeric(11,2);
declare variable auxacrescimobaseicm numeric(13,4);
declare variable auxacrescimobasesubtrib numeric(11,2);
declare variable auxacrescimoredvenda numeric(11,2);
declare variable auxperreddespesa numeric(15,8);
declare variable auxfatorredcusto numeric(15,8);
declare variable auxfatorredvenda numeric(7,4);
declare variable auxcodtributacao char(5);
declare variable auxcodentidade char(7);
declare variable auxcodclassfiscal varchar(15);
declare variable auxvalortotal numeric(11,2);
declare variable auxaliqipi numeric(4,2);
declare variable auxnumcfop char(10);
declare variable auxcodlistapreco integer;
declare variable auxvalorcustofor numeric(13,4);
declare variable auxquantatendida numeric(10,3);
declare variable valorprodutostotal numeric(11,2);
declare variable valorservicostotal numeric(11,2);
declare variable valorprodutosnota numeric(11,2);
declare variable valorservicosnota numeric(11,2);
declare variable valordesconto numeric(11,2);
declare variable valordescontoservicos numeric(11,2);
declare variable valorfrete numeric(11,2);
declare variable valorseguro numeric(11,2);
declare variable valordespesas numeric(11,2);
declare variable valortotalretencoes numeric(11,2);
declare variable valortotalretencoesiss numeric(11,2);
declare variable valortotalretencoesicm numeric(11,2);
declare variable valorcomplementar numeric(11,2);
declare variable sumvalorprodutos numeric(11,2);
declare variable sumvalorbaseicm numeric(11,2);
declare variable sumvaloripi numeric(11,2);
declare variable sumvaloricm numeric(11,2);
declare variable sumvalorsubtrib numeric(11,2);
declare variable sumvalorbasesubtrib numeric(11,2);
declare variable sumvalorsubtribcarga numeric(11,2);
declare variable sumvalorbasesubtribcarga numeric(11,2);
declare variable sumvalorservicos numeric(11,2);
declare variable sumvalordesconto numeric(11,2);
declare variable sumvalordescontoservicos numeric(11,2);
declare variable sumvalorfrete numeric(11,2);
declare variable sumvalorseguro numeric(11,2);
declare variable sumvalordespesas numeric(11,2);
declare variable sumvalordespesasnaoinc numeric(11,2);
declare variable sumvalorfretetransp numeric(11,2);
declare variable sumvalorbaseiss numeric(11,2);
declare variable sumvalorprodutossemimpostos numeric(11,2);
declare variable auxsumvalorprodutos numeric(11,2);
declare variable auxsumvalorbaseicm numeric(11,2);
declare variable auxsumvaloripi numeric(11,2);
declare variable auxsumvaloricm numeric(11,2);
declare variable auxsumvalorsubtrib numeric(11,2);
declare variable auxsumvalorbasesubtrib numeric(11,2);
declare variable auxsumvalorsubtribcarga numeric(11,2);
declare variable auxsumvalorbasesubtribcarga numeric(11,2);
declare variable auxsumvalorservicos numeric(11,2);
declare variable auxsumvalorbaseiss numeric(11,2);
declare variable auxsumvalorprodutossemimpostos numeric(11,2);
declare variable valordespesasnaoinc numeric(11,2);
declare variable valorfretetransp numeric(11,2);
declare variable sumvalortotalretencoes numeric(11,2);
declare variable sumvalorcomplementar numeric(11,2);
declare variable flagsubtribdespesas integer;
declare variable codsubtributaria integer;
declare variable subflagsomadespesas integer;
declare variable flagdespesasipi integer;
declare variable diferenca numeric(11,2);
declare variable flagtipodiferenca smallint;
declare variable diferencaproduto numeric(11,2);
declare variable flagtipodiferencaproduto smallint;
declare variable diferencaservico numeric(11,2);
declare variable flagtipodiferencaservico smallint;
declare variable contador smallint;
declare variable valorbasepiscofins numeric(11,2);
declare variable aliqpis numeric(4,2);
declare variable aliqcofins numeric(4,2);
declare variable auxvalorunitario numeric(13,4);
declare variable numcsticm varchar(3);
declare variable numcstipi varchar(2);
declare variable numcstpiscofins varchar(2);
declare variable numcsosn varchar(3);
declare variable flagdeduzirdespnaoinclnamargem smallint;
declare variable valordescontoaux numeric(11,2);
declare variable partiporeducaoicm integer;
declare variable maioraliqipi numeric(4,2);
declare variable valorprodutostributados numeric(11,2);
declare variable proporcaovalorprodutostributados numeric(18,6);
declare variable natreceitapiscofins integer;
declare variable natbasecalccredito smallint;
declare variable auxacrescimobaseipi numeric(11,2);
declare variable auxvalorbaseipi numeric(11,2);
declare variable auxvalorisentoipi numeric(11,2);
declare variable auxvaloroutrasipi numeric(11,2);
declare variable aliqicmsst numeric(5,2);
declare variable percmvaicmsst numeric(5,2);
begin
/**********************  
VERSÃO 3.00
**********************/  
--MARCELO - CHAMADO 195051
--SomaBaseSubTribCarga=0;
--SomaSubTribCarga=0;

--Renato - 278440   
Select FlagDeduzirDespNaoInclNaMargem
From ConfiguracaoSistema
Into :FlagDeduzirDespNaoInclNaMargem;

--Renato - 278440  
Select TipoReducaoICM
From ParamControle where Empresa = :Empresa
Into :ParTipoReducaoICM;

if (TipoControle=1) then
begin
  FlagEntrada = 1;
end
else
  FlagEntrada = 0;

Select Oper.FlagSubTribDespesas
  From NotasFiscais Nota          
  Left Join Operacoes Oper on Oper.Codigo = Nota.CodOperacao          
Where Nota.Empresa = :Empresa
  and Nota.TipoControle = :TipoControle
  and Nota.CodControle = :CodControle
Into :FlagSubTribDespesas;
If (FlagSubTribDespesas is null) then
  FlagSubTribDespesas = 0;

select coalesce(sum(Ped.ValorProdutos),0), coalesce(sum(Ped.ValorServicos),0), coalesce(sum(Ped.ValorDesconto),0), coalesce(sum(Ped.ValorDescontoServicos),0),
       coalesce(sum(Ped.ValorFrete),0), coalesce(sum(Ped.ValorSeguro),0), coalesce(sum(Ped.ValorDespesas),0),
       coalesce(sum(Ped.ValorDespesasNaoInc),0), coalesce(sum(Ped.ValorFreteTransp),0),
       --327726
       --coalesce(sum(Ped.ValorTotalRetencoes),0), coalesce(sum(Ped.VAlorComplementar),0)
       coalesce(sum(Ped.VAlorComplementar),0)
  from TempPrft110Pedido Temp, Pedidos Ped
 where Temp.NumSequencia = :Ped_Sequencia
   and Ped.Empresa = Temp.Empresa
   and Ped.CodPedido = Temp.CodPedido
 into :ValorProdutosTotal, :ValorServicosTotal,:ValorDesconto, :ValorDescontoServicos,
      :ValorFrete, :ValorSeguro, :ValorDespesas,
      :ValorDespesasNaoInc, :ValorFreteTransp,
      --327726
      --:ValorTotalRetencoes, :ValorComplementar;
      :ValorComplementar;


  
--327726   
  Select                    
   coalesce(Sum( Case when PR.TipoRetencao in(0,1,2,3,4)
                      Then PR.ValorRetencao end ),0),
         
   coalesce(Sum(Case When PR.TipoRetencao = 5
                     Then PR.ValorRetencao end),0),
                                   
   coalesce(Sum(Case when PR.TipoRetencao = 6
                                           Then PR.ValorRetencao end ),0)                                   
                                          
  From TempPrft110Pedido T  
  Left join Pedidos P on  P.Empresa   =T.Empresa  
                      and P.CodPedido = T.CodPedido  
  Left Join PedidosRetencao PR on  PR.Empresa   = T.Empresa  
                               and PR.CodPedido = T.CodPedido                                                    
 Where T.NumSequencia = :Ped_Sequencia
 into :ValorTotalRetencoes,:valortotalretencoesiss,
      :valortotalretencoesicm;






--Gabriella - 333391
AuxAcrescimoBaseIPI = 0;
/*
ValorIPIDespesas = 0;
--Rafael chamado 281202
--Select Rs_RoundDec((coalesce(Max(M.AliqIPI),0) * (:ValorFrete + :ValorSeguro + :ValorDespesas)) /100.00,2)
Select
coalesce(Sum(Case When M.AliqIpi <> 0 then M.ValorTotal  end),0),
coalesce(Max(M.AliqIPI),0)
from MovEstoque M
Left Join Operacoes O on O.Codigo = M.CodOperacao  
where M.Empresa = :Empresa
  and M.TipoControle = :TipoControle
  and M.CodControle = :CodControle
  and M.CodProduto <> 8888888    
  --MARCELO - CHAMADO 187905
  and M.QuantAtendida > 0
  and O.FlagDespesasIPI = 1    
--Rafael chamado 281202
--Into :ValorIPIDespesas;
into valorprodutostributados,maioraliqipi ;


--Rafael chamado 281202
  if (ValorProdutosTotal > 0 ) then
  begin
    proporcaovalorprodutostributados = ValorProdutosTributados / ValorProdutosTotal;
    ValorIPIDespesas =  rs_rounddec( proporcaovalorprodutostributados * (ValorFrete + ValorSeguro + ValorDespesas) * (maioraliqipi / 100.00) ,2);
  end
  else
    ValorIPIDespesas = 0;
  
  
If (ValorIPIDespesas is null) then
  ValorIPIDespesas = 0;    */


/*-- Atualizacao o Icm dos itens da Nota Fiscal*/
for
/*     --Itens da nota fiscal, não carrega os itens que são "pai" dos componentes*/
     Select Cast(0 as integer) as TipoItem, Cast(Mov.NumLancamento as Integer), Cast(0 as integer) as NumSequencia,
            Cast(Mov.CodProduto as integer), Cast(Mov.CodTributacao as varchar(10)), Cast(Mov.CodEntidade as char(7)),
            Cast(Mov.ValorTotal as numeric (11,2)) , Cast(Mov.AliqIPI as numeric(5,2)), Cast(Mov.CodClassFiscal as varchar(20)),
            Cast(Mov.CodOperacao as integer), Cast(Mov.CodListaPreco as Integer),
            Cast(Oper.FlagDespesasIPI as Integer), Cast(Mov.CodSubTributaria as Integer), Cast(Sub.FlagSomaDespesas as Integer),
            Cast(Mov.ValorCustoFor as numeric(13,4)), Cast(Mov.QuantAtendida as numeric(10,3)),
            --Renato - 278440
            Cast(Mov.ValorUnitario as numeric(13,4))

      from MovEstoque Mov
      Left Join Operacoes Oper on Oper.Codigo = Mov.CodOperacao
      Left Join SubstituicaoTributaria Sub on Sub.CodSubTributaria = Mov.CodSubTributaria
                                          and Sub.Empresa = Mov.Empresa
      where Mov.Empresa      = :Empresa
        and Mov.TipoControle = :TipoControle
        and Mov.CodControle  = :CodControle

     UNION ALL

     /*--Componentes da nota fiscal*/
     Select Cast(1 as Integer) as TipoItem, Cast(Comp.NumLancamento as Integer), Cast(Comp.NumSequencia as integer) as NumSequencia,
            Cast(Comp.CodProduto as integer), Cast(Comp.CodTributacao as varchar(10)), Cast(Mov.CodEntidade as char(7)),
            Cast(Comp.ValorTotal as numeric (11,2)) , Cast(Comp.AliqIPI as numeric(5,2)), Cast(Comp.CodClassFiscal as varchar(20)),
            Cast(Mov.CodOperacao as integer), Cast(Comp.CodListaPreco as Integer),
            Cast(0 as integer), Cast(Comp.CodSubTributaria as Integer), Cast(Sub.FlagSomaDespesas as Integer),
            Cast(Comp.ValorCustoFor as numeric(13,4)), Cast(Comp.QuantAtendida as numeric(10,3)),
            --Renato - 278440
            Cast(Comp.ValorUnitario as numeric(13,4))

     From MovComponente Comp
     Left Join MovEstoque Mov On Mov.Empresa = Comp.Empresa
                             and Mov.NumLancamento = Comp.NumLancamento
     Left Join SubstituicaoTributaria Sub on Sub.CodSubTributaria = Comp.CodSubTributaria                
                                         and Sub.Empresa = Comp.Empresa                
     Where Comp.Empresa      = :Empresa
       and Comp.TipoControle = :TipoControle
       and Comp.CodControle  = :CodControle

     into :AuxTipoItem, AuxNumLancamento, :AuxNumSequencia,
          :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
          :AuxValorTotal, :AuxAliqIPI, :AuxCodClassFiscal,
          :CodOperacao, :AuxCodListaPreco,
          :FlagDespesasIPI, :CodSubTributaria, :SubFlagSomaDespesas,
          :AuxValorCustoFor, :AuxQuantAtendida,
          --Renato - 278440
          :AuxValorUnitario
do
begin

   AuxAcrescimoBaseICM = 0;
   AuxAcrescimoBaseSubTrib = 0;
   AuxAcrescimoRedVenda = 0;

   --Renato - 278440
   --AuxAcrescimoRedCusto = 0;
   AuxperRedDespesa = 0;

   --Renato - 278440
   --Eder - Chamado 170325
   --Calcula o percentual de acrescimo no custo
   --If ((AuxValorCustoFor > 0) and (ValorDespesasNaoInc > 0) and ((ValorProdutosTotal + ValorServicosTotal) > 0) and (AuxQuantAtendida > 0)) then
   --begin
   --  AuxAcrescimoRedCusto = ((ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   --end
   if ((FlagDeduzirDespNaoInclNaMargem = 1) and (ParTipoReducaoICM <> 2)) then
     ValorDescontoAux = ValorDesconto;
   else
     ValorDescontoAux = 0;

   /* 298865
   If ((AuxValorUnitario > 0) and ( (ValorDespesasNaoInc > 0) or (ValorDescontoAux > 0) ) and ((ValorProdutosTotal + ValorServicosTotal) > 0)  and (AuxQuantAtendida > 0)) then
   begin
     AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;
   end
   */
   If ( ((ValorDespesasNaoInc > 0) or (ValorDescontoAux > 0)) and ((ValorProdutosTotal + ValorServicosTotal) > 0)  and (AuxQuantAtendida > 0)) then
   begin
     if ((FlagDeduzirDespNaoInclNaMargem = 1) and (AuxValorUnitario > 0)) then
       AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;

     else if ((FlagDeduzirDespNaoInclNaMargem = 0) and (AuxValorCustoFor > 0)) then
       AuxPerRedDespesa = (( ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   end

   if ((AuxCodProduto <> 8888888) and (ValorProdutosTotal > 0)) then
   begin
     --Gabriella - 333391
     if ((FlagDespesasIPI = 1) and (AuxAliqIPI > 0)) then
       AuxAcrescimoBaseIPI = rs_rounddec((cast(:AuxValorTotal as numeric(18,9)) /:ValorProdutosTotal * (:ValorFrete + :ValorSeguro + :ValorDespesas)),2);
     else
       AuxAcrescimoBaseIPI = 0;
                                                                                                                                                                    
     If (AuxAcrescimoBaseIPI is null) then
       AuxAcrescimoBaseIPI = 0;

      AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDesconto)
                                        * (Cast(AuxValorTotal as numeric(18,9)) / ValorProdutosTotal);

      AuxAcrescimoBaseSubTrib = 0;
      If (((FlagSubTribDespesas = 1) and (CodSubTributaria = 0)) or
          ((SubFlagSomaDespesas = 1) and (CodSubTributaria > 0))) then
         AuxAcrescimoBaseSubTrib = ValorFrete + ValorSeguro + ValorDespesas;
      --Gabriella - 298263
      if ((FlagDespesasIPI = 1) and (AuxAliqIPI > 0)) then
      begin
         --Gabriella - 333391
         --AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ValorIPIDespesas;
         AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ((AuxAcrescimoBaseIPI * auxaliqipi) / 100);
--       Eder - Chamado 174565
--       ValorIPIDespesas = 0;
      end
      AuxAcrescimoBaseSubTrib = (AuxAcrescimoBaseSubTrib - ValorDesconto) * (AuxValorTotal / ValorProdutosTotal);

      AuxAcrescimoRedVenda = ValorDespesasNaoInc + ValorDesconto;
      If ((ValorFrete > 0) and (ValorFreteTransp > 0)) then
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + (ValorFreteTransp - ValorFrete);
      Else
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + ValorFreteTransp;
      AuxAcrescimoRedVenda = AuxAcrescimoRedVenda * (AuxValorTotal / ValorProdutosTotal);
   end
   If ((AuxCodProduto = 8888888) and (ValorServicosTotal > 0) and (AuxValorTotal > 0)) then
   begin
     if (ValorProdutosTotal > 0) then
        AuxAcrescimoBaseICM = (ValorDescontoServicos * -1) * (AuxValorTotal / ValorServicosTotal);
     Else
        AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDescontoServicos) * (AuxValorTotal / ValorServicosTotal);

     AuxAcrescimoBaseSubTrib = 0;
     AuxAcrescimoRedVenda = 0;
   end

   select AliqICM, ValorBaseICM, ValorICM,
         ValorIsentoICM, ValorOutrasICM, PerReducaoICM, ValorBaseSubTrib,
         ValorSubTrib, FatorRedCusto, FatorRedVenda, NumCFOP,
         ValorBaseSubTribCarga, ValorSubTribCarga,
         -- Renato - Chamado 272165
         ValorBasePisCofins, AliqPis, AliqCofins,
         --Eder - Chamado 284639
         NumCstICM, NumCstIPI, NumCstPisCofins, NumCsosn,
         -- Renato - 297792
         NatReceitaPisCofins,
         -- Renato - 332318
         NatBaseCalcCredito,
         --Gabriella - 333391
         ValorBaseIPI,
         ValorIsentoIPI,
         ValorOutrasIPI,
         --Renato - 360358
         AliqICMSST,
         PercMvaICMSST
    from Calcular_ICM(:Empresa, :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
                      :CodOperacao, :AuxValorTotal, :AuxAcrescimoBaseICM, :AuxAcrescimoBaseSubTrib, 0,
                      :AuxAliqIPI, :AuxCodClassFiscal, :FlagEntrada, :AuxAcrescimoRedVenda,
                      :AuxCodListaPreco,0,:CodSubTributaria, :AuxPerRedDespesa, :auxacrescimobaseipi)
    into :AuxAliqICM, :AuxBaseICM, :AuxValorICM,
         :AuxValorIsentoICM, :AuxValorOutrasICM, :AuxPerReducaoICM, :AuxBaseSubTrib,
         :AuxValorSubTrib, :AuxFatorRedCusto, :AuxFatorRedVenda, :AuxNumCFOP,
         :AuxBaseSubTribCarga, :AuxValorSubTribCarga,
         -- Renato - Chamado 272165
         :ValorBasePisCofins, :AliqPis, :AliqCofins,
         :NumCstICM, :NumCstIPI, :NumCstPisCofins, :NumCsosn,
         -- Renato - 297792
         :NatReceitaPisCofins,
         -- Renato - 332318
         :NatBaseCalcCredito,
         --Gabriella - 333391
         :AuxValorBaseIPI,
         :AuxValorIsentoIPI,
         :AuxValorOutrasIPI,
         --Renato - 360358
         :AliqICMSST,
         :PercMvaICMSST;

   if (AuxTipoItem = 0) then
   begin
     update MovEstoque
        set AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            StatusTransacao=1
      where Empresa=:Empresa
        and NumLancamento=:AuxNumLancamento;

      --Eder - Chamado 284639
      Update MovEstoqueImposto
         Set PerReducaoICM = :AuxPerReducaoICM,
             NumCstICM = :NumCstICM,
             NumCstIPI = :NumCstIPI,
             NumCstPisCofins = :NumCstPisCofins,
             NumCsosn = :NumCsosn,
             --Renato - 297792
             NatReceitaPisCofins = :NatReceitaPisCofins,
             --Renato - 332318
             NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,
             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
         
             --Rafael chamado 306960
             StatusTransacao = 1

       Where Empresa=:Empresa
         and NumLancamento=:AuxNumLancamento;

      if (Row_Count  = 0) then
      begin
         Insert into MovEstoqueImposto(Empresa, NumLancamento, PerReducaoICM, NumCstICm, NumCstIPI, NumCstPisCofins, NumCsosn, NatReceitaPisCofins,
                                       --Gabriella - 333391
                                       ValorBaseIPI,
                                       ValorIsentoIPI,
                                       ValorOutrasIPI,
                                       --Renato - 360358
                                       AliqICMSST,
                                       PercMvaICMSST,
                                       StatusTransacao)
                     Values (:Empresa, :AuxNumLancamento, :AuxPerReducaoICM, :NumCstICm, :NumCstIPI, :NumCstPisCofins, :NumCsosn, :NatReceitaPisCofins,
                             --Gabriella - 333391
                             :AuxValorBaseIPI,
                             :AuxValorIsentoIPI,
                             :AuxValorOutrasIPI,
                             --Renato - 360358
                             :AliqICMSST,
                             :PercMvaICMSST,
                             1);
      end
   end
   else
   begin
     update MovComponente
        set AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            -- Renato - Chamado 272165
            ValorBasePisCofins = :ValorBasePisCofins,
            AliqPis = :AliqPis,
            AliqCofins = :AliqCofins,
            --Eder - Chamado 284639
            PerReducaoICM = :AuxPerReducaoICM,
            NumCstICM = :NumCstICM,
            NumCstIPI = :NumCstIPI,
            NumCstPisCofins = :NumCstPisCofins,
            NumCsosn = :NumCsosn,
            --Renato - 297792
            NatReceitaPisCofins = :NatReceitaPisCofins,
            --Renato - 332318
            NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,

             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
         
            StatusTransacao=1
      where Empresa=:Empresa
        and NumLancamento=:AuxNumLancamento
        and NumSequencia=:AuxNumSequencia;
   end

--MARCELO - CHAMADO 195051
--   SomaBaseSubTribCarga = SomaBaseSubTribCarga + AuxBaseSubTribCarga;
--   SomaSubTribCarga = SomaSubTribCarga + AuxValorSubTribCarga;

end


/*--Acumula as variaveis de total da nota fiscal e dos componentes*/
SumValorProdutos = 0;
SumValorBaseICM = 0;
SumValorIPI = 0;
SumValorICM = 0;
SumValorSubTrib = 0;
SumValorBaseSubTrib = 0;
--MARCELO - CHAMADO 195051
SumValorSubTribCarga = 0;
SumValorBaseSubTribCarga = 0;
SumValorServicos = 0;
SumValorBaseISS = 0;
SumValorProdutosSemImpostos = 0;

for
    Select 
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorTotal Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseICM Else 0 End) as numeric(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Mov.CodProduto <> 8888888
                         then Rs_roundDec(Mov.ValorTotal * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),*/
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         then Rs_roundDec((MI.ValorBaseIPI + MI.ValorIsentoIPI + MI.ValorOutrasIPI)
                                            * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         then rs_roundDec(Mov.ValorBaseICM * (((100 + Mov.AliqICM) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorSubTrib Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseSubTrib Else 0 End) as numeric(15,2)),
--MARCELO - CHAMADO 195051
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorSubTribCarga Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseSubTribCarga Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto = 8888888 then Mov.ValorTotal Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto = 8888888 and Ser.FlagCalcularISS = 1
                         then Mov.ValorBaseICM + Mov.ValorOutrasICM Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         Then rs_RoundDec(Mov.ValorTotal * Mov.FatorRedVenda,2) Else 0 End)  as numeric(15,2))
      From MovEstoque Mov                  
      Left Join Servicos Ser on Ser.codigo = Mov.CodServico
      --Gabriella - 333391
      Left Join MovEstoqueImposto MI on MI.Empresa = Mov.Empresa
                                    and MI.NumLancamento = Mov.NumLancamento                       
      Where Mov.Empresa = :Empresa
        and Mov.TipoControle = :TipoControle
        and Mov.CodControle = :CodControle
        and not exists(Select * From MovComponente Comp
                        Where Comp.Empresa = Mov.Empresa
                          and Comp.NumLancamento = Mov.NumLancamento)
    UNION ALL
    Select 
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorTotal Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseICM Else 0 End)  as numeric(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Comp.CodProduto <> 8888888
                         then Rs_roundDec(Comp.ValorTotal * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),*/
           Cast(Sum(Case When Comp.CodProduto <> 8888888
                         then Rs_roundDec((Comp.ValorBaseIPI + Comp.ValorIsentoIPI + Comp.ValorOutrasIPI)
                                            * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888                   
                         then Rs_roundDec(Comp.ValorBaseICM * (((100 + Comp.AliqICM) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorSubTrib Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseSubTrib Else 0 End)  as numeric(15,2)),
--MARCELO - CHAMADO 195051
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorSubTribCarga Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseSubTribCarga Else 0 End)  as numeric(15,2)),
           Cast(0  as numeric(15,2)),
           Cast(0  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888
                        Then Rs_roundDec(Comp.ValorTotal * Comp.FatorRedVenda,2) Else 0 End) as numeric(15,2))
      From MovComponente Comp
      Where Comp.Empresa = :Empresa
        and Comp.TipoControle = :TipoControle
        and Comp.CodControle = :CodControle
     Into :AuxSumValorProdutos, :AuxSumValorBaseICM, :AuxSumValorIPI,
          :AuxSumValorICM,  :AuxSumValorSubTrib, :AuxSumValorBaseSubTrib,
--MARCELO - CHAMADO 195051
          :AuxSumValorSubTribCarga, :AuxSumValorBaseSubTribCarga, :AuxSumValorServicos,
          :AuxSumValorBaseISS, :AuxSumValorProdutosSemImpostos
do
begin
     If (not (AuxSumValorProdutos is null)) then
        SumValorProdutos = SumValorProdutos + AuxSumvalorProdutos;

     If (not (AuxSumValorBaseICM is null)) then
        SumValorBaseICM = SumValorBaseICM + AuxSumValorBaseICM;

     If (not (AuxSumValorIPI is null)) then
        SumValorIPI = SumValorIPI + AuxSumValorIPI;

     If (not (AuxSumValorICM is null)) then
        SumValorICM = SumValorICM + AuxSumValorICM;

     If (not (AuxSumValorSubTrib is null)) then
        SumValorSubTrib = SumValorSubTrib + AuxSumValorSubTrib;

     If (not (AuxSumValorBaseSubTrib is null)) then
        SumValorBaseSubTrib = SumValorBaseSubTrib + AuxSumValorBaseSubTrib;

--MARCELO - CHAMADO 195051
     If (not (AuxSumValorSubTribCarga is null)) then
        SumValorSubTribCarga = SumValorSubTribCarga + AuxSumValorSubTribCarga;

     If (not (AuxSumValorBaseSubTribCarga is null)) then
        SumValorBaseSubTribCarga = SumValorBaseSubTribCarga + AuxSumValorBaseSubTribCarga;

     If (not (AuxSumValorServicos is null)) then
        SumValorServicos = SumValorServicos + AuxSumValorServicos;

     If (not (AuxSumValorBaseISS is null)) then
        SumValorBaseISS = SumValorBaseISS + AuxSumValorBaseISS;

     If (not (AuxSumValorProdutosSemImpostos is null)) then
        SumValorProdutosSemImpostos = SumValorProdutosSemImpostos + AuxSumValorProdutosSemImpostos;
end

/*--Atualiza os Totais referentes a Produtos, somados a partir dos itens da nota fiscal*/
update NotasFiscais
   set ValorProdutos    = rs_dnvl(:SumValorProdutos,0),
       ValorIPI         = rs_dnvl(:SumValorIPI,0),
       ValorBaseICM     = rs_dnvl(:SumValorBaseICM,0),
       ValorICM         = rs_dnvl(:SumValorICM,0),
       ValorSubTrib     = rs_dnvl(:SumValorSubTrib,0),
       ValorBaseSubTrib = rs_dnvl(:SumValorBaseSubTrib,0),
       ValorServicos    = rs_dnvl(:SumValorServicos,0),
--MARCELO - CHAMADO 195051
       ValorSubTribCarga     = rs_dnvl(:SumValorSubTribCarga, 0),
       ValorBaseSubTribCarga = rs_dnvl(:SumValorBaseSubTribCarga, 0),
       ValorProdutosSemImpostos = rs_dnvl(:SumValorProdutosSemImpostos, 0),
       StatusTransacao=1
 where Empresa = :Empresa
   and TipoControle = :TipoControle
   and CodControle = :CodControle;

if (ValorProdutosTotal > 0) then
begin
   update NotasFiscais
      set ValorDesconto         = rs_RoundDec(:ValorDesconto * (ValorProdutos / :ValorProdutosTotal),2),
--232570
--MARCELO - CHAMADO 195326                                                  
--          ValorDescontoServicos = Round(@ValorDescontoServicos * (ValorProdutos / @ValorProdutosTotal),2),                                                        
          ValorDescontoServicos = case when ValorServicos > 0  
                                    then rs_Rounddec(:ValorDescontoServicos * (ValorProdutos / :ValorProdutosTotal),2)
                                       else 0 end,                                                        
          ValorFrete            = rs_RoundDec(:ValorFrete * (ValorProdutos / :ValorProdutosTotal),2),
          ValorSeguro           = rs_RoundDec(:ValorSeguro * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesas         = rs_RoundDec(:ValorDespesas * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesasNaoInc   = rs_RoundDec(:ValorDespesasNaoInc * (ValorProdutos / :ValorProdutosTotal),2),
          ValorFreteTransp      = rs_RoundDec(:ValorFreteTransp * (ValorProdutos / :ValorProdutosTotal),2),
          --327726
          --ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * (ValorProdutos / :ValorProdutosTotal),2),
          ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * ((ValorProdutos + valorservicos) / (:ValorProdutosTotal + :valorservicostotal ) ),2)+
                                 case when  :valorservicostotal > 0
                                      then rs_RoundDec(:valortotalretencoesiss * (ValorServicos / :valorservicostotal),2) else 0 end
                                + rs_RoundDec(:valortotalretencoesicm * (ValorProdutos / :ValorProdutosTotal),2),
          StatusTransacao       = 1
    where Empresa = :Empresa
      and TipoControle = :TipoControle
      and CodControle = :CodControle;
end
else
begin
   update NotasFiscais
      set ValorDesconto         = ValorDesconto + :ValorDesconto,
          ValorDescontoServicos = ValorDescontoServicos + :ValorDescontoServicos,
          ValorFrete            = ValorFrete + :ValorFrete,
          ValorSeguro           = ValorSeguro + :ValorSeguro,
          ValorDespesas         = ValorDespesas + :ValorDespesas,
          ValorDespesasNaoInc   = ValorDespesasNaoInc + :ValorDespesasNaoInc,
          ValorFreteTransp      = ValorFreteTransp + :ValorFreteTransp,
          ValorTotalRetencoes   = ValorTotalRetencoes + :ValorTotalRetencoes,
          StatusTransacao       = 1
    where Empresa = :Empresa
      and TipoControle = :TipoControle
      and CodControle = :CodControle;
end





/*--verifica se está na ultima nota processada*/
select (count(*) - :ContadorNota) from TempPrft110Nota
 where NumSequencia = :Ped_Sequencia
 into :Existe;

if (Existe = 0) then  /*------Ultima Nota Processada*/
begin
  select sum(ValorDesconto), sum(ValorDescontoServicos), sum(ValorFrete),
         sum(ValorSeguro), sum(ValorDespesas), sum(ValorDespesasNaoInc),
         sum(ValorFreteTransp), sum(ValorTotalRetencoes), sum(ValorComplementar)
    from TempPrft110Nota, NotasFiscais
   where TempPrft110Nota.NumSequencia = :Ped_Sequencia
     and TempPrft110Nota.Empresa = NotasFiscais.Empresa
     and TempPrft110Nota.TipoControle = NotasFiscais.TipoControle
     and TempPrft110Nota.CodControle = NotasFiscais.CodControle
   into :SumValorDesconto, :SumValorDescontoServicos, :SumValorFrete,
        :SumValorSeguro, :SumValorDespesas, :SumValorDespesasNaoInc,
        :SumValorFreteTransp, :SumValorTotalRetencoes, :SumValorComplementar;

  update NotasFiscais
     set ValorDesconto = ValorDesconto + (:ValorDesconto - rs_dnvl(:SumValorDesconto,0)),
         ValorDescontoServicos  = ValorDescontoServicos + (:ValorDescontoServicos - rs_dnvl(:SumValorDescontoServicos,0)),
         ValorFrete  = ValorFrete + (:ValorFrete - rs_dnvl(:SumValorFrete,0)),
         ValorSeguro = ValorSeguro + (:ValorSeguro - rs_dnvl(:SumValorSeguro,0)),
         ValorDespesas = ValorDespesas + (:ValorDespesas - rs_dnvl(:SumValorDespesas,0)),
         ValorDespesasNaoInc = ValorDespesasNaoInc + (:ValorDespesasNaoInc - rs_dnvl(:SumValorDespesasNaoInc,0)),
         ValorFreteTransp = ValorFreteTransp + (:ValorFreteTransp - rs_dnvl(:SumValorFreteTransp,0)),
         --327726
         --ValorTotalRetencoes = ValorTotalRetencoes + (:ValorTotalRetencoes - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorTotalRetencoes = ValorTotalRetencoes + ((:ValorTotalRetencoes +:valortotalretencoesiss + :valortotalretencoesicm)
                                                   - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorComplementar  = ValorComplementar + (:ValorComplementar - rs_dnvl(:SumValorComplementar,0)),
         StatusTransacao=1
        where Empresa = :Empresa
          and TipoControle = :TipoControle
          and CodControle = :CodControle;
end

/*--Calcula o ISS após terminar os rateios da nota*/
Update NotasFiscais
   Set ValorISS = Rs_Rounddec((:SumValorBaseISS * AliqISS) / 100.00, 2),
       AliqISS  = Case When :SumValorBaseISS > 0 then AliqISS Else 0 End
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and  CodControle = :CodControle;

--Gabriella - 361043
--Gabriella - 342854
--Se na NF houver ValorRetencao de ISS os Valores são Zerados
/*if (ValorTotalRetencoesISS > 0) then
begin
  Update NotasFiscais                                   
     Set ValorISS = 0,                                                                                              
         AliqISS  = 0                                                                                
     Where Empresa = :Empresa
       and TipoControle = :TipoControle
       and  CodControle = :CodControle;
end*/

/*select FlagDespesasIPI from Operacoes where Codigo = :CodOperacao
  into Existe;*/

/*if (Existe = 1) then
begin

  update NotasFiscais
   --Rafael chamado 281202
     --set ValorIPIDespesas =
         --rs_rounddec(((ValorFrete + ValorDespesas + ValorSeguro) *
          --      rs_dnvl(:AuxAliqIPI,0)) / 100.00, 2)

    set ValorIPIDespesas = :ValorIPIDespesas
   where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle;
end */


/*--Corrige eventuais diferenças de soma dos valores fiscais dos itens*/
AuxTipoItem = 0;

SomaICMProdutos     = 0;
SomaICMServicos     = 0;
CompSomaICMProdutos = 0;
CompSomaICMServicos = 0;
SomaContabilNotaProdutos = 0;
SomaContabilNotaServicos = 0;

Select
  Sum(Case When CodProduto <> 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end),

  Sum(Case When CodProduto = 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end)
  From MovEstoque                    
 Where Empresa      = :Empresa
   and TipoControle = :TipoControle
   and CodControle  = :CodControle
   and not exists(Select * From MovComponente Comp
                   Where Comp.Empresa = MovEstoque.Empresa  
                     and Comp.NumLancamento = MovEstoque.NumLancamento)  

  Into :SomaICMProdutos, :SomaICMServicos;

if (SomaICMProdutos is null) then
  SomaICMProdutos = 0;

if (SomaICMServicos is null) then
  SomaICMServicos = 0;


Select
  Sum(Case When CodProduto <> 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end),

  Sum(Case When CodProduto = 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end)
  From MovComponente
 Where Empresa      = :Empresa
   and TipoControle = :TipoControle
   and CodControle  = :CodControle
  Into :CompSomaICMProdutos, :CompSomaICMServicos;


if (not (CompSomaICMProdutos is null)) then
begin
  SomaICMProdutos = SomaICMProdutos + CompSomaICMProdutos;
  AuxTipoItem     = 1;
end

if (not (CompSomaICMServicos is null)) then
begin
  SomaICMServicos = SomaICMServicos + CompSomaICMServicos;
  AuxTipoItem     = 1;
end
                    
--JALDO - CHAMADO 245729
--Select Case When TipoPessoa = 'J' Then 1 Else 0 End From Entidades
-- Where Codigo = :AuxCodEntidade
-- Into :Existe;

--Gabriella - 256424
--JALDO - CHAMADO 248899
--Select Case When (((TipoConsideraIPICalculoICM = 0) and (TipoPessoa <> 'J')) or
--                 (TipoConsideraIPICalculoICM = 1))
--            Then 0 Else 1 End
--Select Case When TipoPessoa in ('J','I') Then 1 Else 0 End
Select Case When Ent.TipoPessoa in ('J','I') and Opr.flagipisobrebaseicm = 0 Then 1 Else 0 End
From Entidades Ent
Left Join Operacoes Opr on Opr.codigo = :codoperacao
 Where Ent.Codigo = :AuxCodEntidade
   Into :Existe;

                    
If (Existe = 1) then
begin                    
  Select (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas),
         Case when (ValorProdutos = 0)
              then (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              else (ValorServicos - ValorDescontoServicos)
         end
   From NotasFiscais                    
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle
    Into :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
end                    
Else                    
begin                    
  Select (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas + ValorIPI),
         Case when (ValorProdutos = 0)
              then (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              else (ValorServicos - ValorDescontoServicos)
         end
   From NotasFiscais                    
   Where Empresa      = :Empresa
     and TipoControle = :TipoControle
     and CodControle  = :CodControle
    Into :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
end

Diferenca         = 0;
FlagTipoDiferenca = 0;
--MARCELO - CHAMADO 182639                 
DiferencaProduto         = 0;
FlagTipoDiferencaProduto = 0;
DiferencaServico         = 0;
FlagTipoDiferencaServico = 0;

--MARCELO - CHAMADO 182639
If ((SomaContabilNotaProdutos <> 0) and (SomaContabilNotaProdutos <> SomaICMProdutos)) then
begin
--  Diferenca         = (:SomaContabilNotaProdutos - :SomaICMProdutos);
--  FlagTipoDiferenca = 1;
  DiferencaProduto = (:SomaContabilNotaProdutos - :SomaICMProdutos);
  FlagTipoDiferencaProduto = 1;
end
--else
--begin
if (SomaICMServicos <> 0) then
begin
  If ((SomaContabilNotaServicos <> 0) and (SomaContabilNotaServicos <> SomaICMServicos)) then
  begin
--    Diferenca         = (:SomaContabilNotaServicos - :SomaICMServicos);
--    FlagTipoDiferenca = 2;
    DiferencaServico = (:SomaContabilNotaServicos - :SomaICMServicos);
    FlagTipoDiferencaServico = 2;
  end
end
--end

--MARCELO - CHAMADO 182639
Contador = 1;

while (Contador <= 2) do
begin
  if (Contador = 1) then
  begin
    Diferenca = DiferencaProduto;
    FlagTipoDiferenca = FlagTipoDiferencaProduto;
  end
  if (Contador = 2) then
  begin
    Diferenca = DiferencaServico;
    FlagTipoDiferenca = FlagTipoDiferencaServico;
  end

  If (Diferenca <> 0) then
  begin
    /*--Se houver diferencas, altera no primeiro item da nota*/
    If (AuxTipoItem = 0) then
    begin
      Select First 1 Empresa, NumLancamento,
--185753
        ValorBaseICM
      From MovEstoque
      Where Empresa      = :Empresa
         and TipoControle = :TipoControle
         and CodControle  = :CodControle
         and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                  When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                  Else 0
             End = 1
         and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
         and not exists(Select * From MovComponente Comp
                        Where Comp.Empresa = MovEstoque.Empresa
                          and Comp.NumLancamento = MovEstoque.NumLancamento)
      Order By NumLancamento
      Into :AuxEmpresa, :AuxNumLancamento,
--185753
           :AuxBaseICM;
                                                  
      Update MovEstoque
        Set ValorBaseICM = Case when ValorBaseICM <> 0
                                then ValorBaseICM + (:Diferenca)
                                Else ValorBaseICM End,
            ValorIsentoICM = Case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                  then ValorIsentoICM + (:Diferenca)
                                  Else ValorISentoICM End,
            ValorOutrasICM = Case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                  then ValorOutrasICM + (:Diferenca)
                                  Else ValorOutrasICM End
      Where Empresa = :AuxEmpresa
        and NumLancamento = :AuxNumLancamento;
    end
    else
    begin
      Select First 1 Empresa,
                   NumLancamento,
                   NumSequencia,
--185753
                   ValorBaseICM
      From MovComponente
      Where Empresa = :Empresa
        and TipoControle = :TipoControle
        and CodControle = :CodControle
        and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                 When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                 Else 0
            End = 1
        and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
      Order By NumLancamento
      Into :AuxEmpresa, :AuxNumLancamento, :AuxNumSequencia,
--185753
           :AuxBaseICM;

      Update MovComponente
        Set ValorBaseICM = Case when ValorBaseICM <> 0
                                then ValorBaseICM + (:Diferenca)
                                Else ValorBaseICM End,
            ValorIsentoICM = Case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                  then ValorIsentoICM + (:Diferenca)
                                  Else ValorISentoICM End,
            ValorOutrasICM = Case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                  then ValorOutrasICM + (:Diferenca)
                                  Else ValorOutrasICM End
      Where Empresa = :AuxEmpresa
        and NumLancamento = :AuxNumLancamento
        and NumSequencia = :AuxNumSequencia;
   end
  
                    
   Update NotasFiscais
     Set ValorBaseICM = Case when ValorBaseICM <> 0                    
                             then ValorBaseICM + (:Diferenca)
                             Else ValorBaseICM End                    
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle
--185753
     and Coalesce(:AuxBaseICM, 0) <> 0;
  end
  Contador = Contador + 1;
end


--327726  
Select   
 coalesce(Sum(NF.ValorProdutos),0),
 coalesce(Sum(NF.ValorServicos),0)
From NotasFiscais NF  
where  
    Empresa =:Empresa
and TipoControle = :TipoControle
and CodControle =  :CodControle
into :valorprodutosnota,:valorservicosnota;



delete from NotasFiscaisRetencao
 where Empresa=:Empresa
   and TipoControle=:TipoControle
   and CodControle=:CodControle;

insert into NotasFiscaisRetencao (
       Empresa, TipoControle, CodControle, TipoRetencao,
       ValorBase, Aliquota, 
       ValorRetencao, StatusTransacao)
  select :Empresa, :TipoControle, :CodControle, PedidosRetencao.TipoRetencao,
      sum(PedidosRetencao.ValorBase), Max(PedidosRetencao.Aliquota),
      --338411
      --sum(PedidosRetencao.ValorRetencao), min(1)
      rs_rounddec( ( (Sum(PedidosRetencao.ValorBase)*Max(PedidosRetencao.Aliquota) )/100.00),2),
      Min(1)
    from TempPrft110Pedido, PedidosRetencao
    where TempPrft110Pedido.NumSequencia = :Ped_Sequencia
      and PedidosRetencao.Empresa = :Empresa
      and PedidosRetencao.CodPedido = TempPrft110Pedido.CodPedido
    --327726
      and ( (PedidosRetencao.TipoRetencao = 5 and  :valortotalretencoesiss > 0 and :valorservicosnota > 0)
           or  (TipoRetencao = 6  and  :valortotalretencoesicm > 0 and :valorprodutosnota > 0)
           or  (:valortotalretencoes > 0 ) )
    group by PedidosRetencao.TipoRetencao;


--Gabriella - 344500
if (:ValorServicosNota > 0) then
begin
    --Atualiza a Temporária 
    update TempPrft110RelacaoRetencao
       set Tipocontrole = :TipoControle,
           CodControle = :CodControle
     where NumSequencia = :Ped_Sequencia
       and TipoControle = 0
       and CodControle = 0;
       
    --Insere na tabela de Retenção      
    Insert Into NotasFiscaisRetencao (
             Empresa, TipoControle, 
             CodControle, TipoRetencao,                                                     
             ValorBase, Aliquota,                                                                                               
             ValorRetencao, StatusTransacao)                                                                                              
      Select :Empresa, TempRel.TipoControle,
             TempRel.CodControle, TempRel.TipoRetencao,                                                      
             Sum(TempRel.ValorBase), max(TempRel.Aliquota),                                                                                                             
             Sum(TempRel.ValorRetencao), 1                                                                     
        From TempPrft110RelacaoRetencao TempRel                                                                                     
       Where TempRel.NumSequenciaPed = :Ped_Sequencia
         and TempRel.TipoControle = :TipoControle
         and TempRel.CodControle = :CodControle
         and TempRel.ValorRetencao > 0 
      --Gabriella - 358073
      Group By TempRel.TipoControle, TempRel.CodControle, TempRel.TipoRetencao;

    --Gabriella - 358073      
    --Insere na tabela de Relação da Retenção
   /* Insert Into NotasFiscaisRelacaoRetencao
          (Empresa, TipoControle, 
           CodControle, TipoRetencao, 
           ValorBase, Aliquota,
           ValorRetencao, FlagRetencaoGerada, 
           TipoControleRetencao, CodControleRetencao,
           StatusTransacao, TransacaoEmpresas)
    Select :Empresa, TempRetencao.TipoControle,
           TempRetencao.CodControle, TempRetencao.TipoRetencao,
           TempRetencao.ValorBase, TempRetencao.Aliquota,
           TempRetencao.ValorRetencao, 1, 
           :TipoControle, :CodControle,
           1, ''
      From TempPrft110RelacaoRetencao TempRetencao
     where TempRetencao.NumSequencia = :Ped_Sequencia;    */
end


     --338411   
   Update NotasFiscais
   set ValorTotalRetencoes =  coalesce( (  Select First 1 SUM(ValorRetencao)
                                           From NotasFiscaisRetencao
                                           where Empresa=:Empresa
                                             and TipoControle=:TipoControle
                                             and CodControle=:CodControle),0)
                               
   where
       Empresa=:Empresa
   and TipoControle=:TipoControle
   and CodControle=:CodControle;
  

END^

ALTER PROCEDURE CALCULAR_ICM (
    empresa integer,
    codproduto integer,
    codtributacao char(5),
    codentidade char(7),
    codoperacao integer,
    valortotal numeric(11,2),
    acrescimobaseicm numeric(11,2),
    acrescimobasesubtrib numeric(11,2),
    redbasesubtrib numeric(4,2),
    aliqipi numeric(4,2),
    codclassfiscal varchar(15),
    flagentrada integer,
    acrescimoredvenda numeric(11,2),
    codlistapreco integer,
    aliqicmfixo numeric(4,2),
    codsubtributaria integer,
    perreddespesa numeric(15,8),
    acrescimobaseipi numeric(11,2))
returns (
    aliqicm numeric(4,2),
    valorbaseicm numeric(11,2),
    valoricm numeric(11,2),
    valorisentoicm numeric(11,2),
    valoroutrasicm numeric(11,2),
    perreducaoicm numeric(5,2),
    valorbasesubtrib numeric(11,2),
    valorsubtrib numeric(11,2),
    valorbasesubtribcarga numeric(11,2),
    valorsubtribcarga numeric(11,2),
    perredbasesubtrib numeric(4,2),
    fatorredcusto numeric(15,8),
    fatorredvenda numeric(7,4),
    numcfop char(10),
    aliqpiscofins numeric(4,2),
    valorbasepiscofins numeric(11,2),
    aliqpis numeric(4,2),
    aliqcofins numeric(4,2),
    numcsticm varchar(3),
    numcstipi varchar(3),
    numcstpiscofins varchar(3),
    numcsosn varchar(3),
    natreceitapiscofins integer,
    natbasecalccredito smallint,
    indnaturezafrete smallint,
    valorbaseipi numeric(11,2),
    valorisentoipi numeric(11,2),
    valoroutrasipi numeric(11,2),
    aliqicmsst numeric(5,2),
    percmvaicmsst numeric(5,2))
as
declare variable codestadoleitura char(2);
declare variable aempmestre char(7);
declare variable vauxbaseipi decimal(11,2);
declare variable vauxvaloripi decimal(11,2);
declare variable auxcodtributacaosubtrib char(5);
declare variable auxflagsubtributaria integer;
declare variable auxentidade char(7);
declare variable valorbasesubtribdestino numeric(11,2);
declare variable calcbasesubtrib numeric(11,2);
declare variable calcvalorsubtrib numeric(11,2);
declare variable calcbasesubtribdestino numeric(11,2);
declare variable partiporeducaoicm smallint;
declare variable paraliqcpmf numeric(4,2);
declare variable paraliqicmsimples numeric(4,2);
declare variable partiporegimetributario smallint;
declare variable enttipopessoa char(1);
declare variable cidcodestado char(2);
declare variable estaliqcontrib decimal(4,2);
declare variable estflagconvsub smallint;
declare variable estaliqinterna decimal(4,2);
declare variable cidempcodestado char(2);
declare variable trialiqicm decimal(4,2);
declare variable triflagisentoprodutor smallint;
declare variable triflagsubtributaria smallint;
declare variable trimargemlucrosubst numeric(5,2);
declare variable triperreducaoicm decimal(6,4);
declare variable triperredmargem decimal(4,2);
declare variable tritipocfop smallint;
declare variable tricodtributacaosubtrib char(5);
declare variable tritipovalornaotributado smallint;
declare variable triperreducaosubtrib numeric(6,2);
declare variable trialiqinternasubtrib numeric(5,2);
declare variable trinumcst_icm smallint;
declare variable trinumcst_ipi smallint;
declare variable trinumcsosn smallint;
declare variable claflagsubtributaria smallint;
declare variable claaliqpiscofins numeric(4,2);
declare variable gruflagsubtributaria smallint;
declare variable oprtipoicm smallint;
declare variable oprtipoipi smallint;
declare variable opraliqicmfixo decimal(4,2);
declare variable oprperredicm decimal(4,2);
declare variable oprperredmargem decimal(4,2);
declare variable oprcfop1_normal char(10);
declare variable oprcfop1_normal_ncfora char(10);
declare variable oprcfop2_industrializado char(10);
declare variable oprcfop2_industrializado_ncfora char(10);
declare variable oprcfop3_subrevenda char(10);
declare variable oprcfop3_subrevenda_nc char(10);
declare variable oprcfop4_subrevendaml char(10);
declare variable oprcfop4_subrevendaml_nc char(10);
declare variable oprcfop5_subfabricacao char(10);
declare variable oprcfop5_subfabricacao_nc char(10);
declare variable oprcfop6_subfabricacaoml char(10);
declare variable oprcfop6_subfabricacaoml_nc char(10);
declare variable oprcfop7_importado char(10);
declare variable oprcfop_servico char(10);
declare variable oprcfop_servico_ncfora char(10);
declare variable oprcfop9_petroleo varchar(10);
declare variable oprcfop9_petroleo_nc varchar(10);
declare variable oprflagcalcpis_cofins smallint;
declare variable oprflagdefaultlancamentooutras integer;
declare variable oprflagsubtribipi integer;
declare variable oprtipomovimento integer;
declare variable oprtiposubtributaria integer;
declare variable oprtiposubtributariacarga integer;
declare variable oprflagipisobrepiscofins smallint;
declare variable lispercacrescimoadm1 numeric(4,2);
declare variable lispercacrescimoadm2 numeric(4,2);
declare variable lispercacrescimoadm3 numeric(4,2);
declare variable proorigem smallint;
declare variable subaliquotainterna numeric(5,2);
declare variable submargemlucro numeric(5,2);
declare variable subpercreducao numeric(5,2);
declare variable subindicereducao numeric(9,6);
declare variable subflagabatericm smallint;
declare variable subflagsomaipi smallint;
declare variable existe integer;
declare variable regiaodestino varchar(10);
declare variable regiaodestinoleitura varchar(10);
declare variable regiaoorigem varchar(10);
declare variable empid varchar(15);
declare variable flagdeduzirdespnaoinclnamargem smallint;
declare variable percsubtribcusto decimal(5,2);
declare variable percicmcusto decimal(5,2);
declare variable acrdespesaspiscofins decimal(11,2);
declare variable regtribpercivasimplicado numeric(5,2);
declare variable triflagprevaleceraliqicm smallint;
declare variable oprflagipisobrebaseicm smallint;
declare variable tritipovalornaotributadoipi numeric(1,0);
declare variable oprflagicmssobreservicos smallint;
BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.01
*********************/
VAuxBaseIPI = 0;
VAuxValorIPI = 0;
AliqICM = 0;
ValorBaseICM = 0;
ValorICM = 0;
ValorIsentoICM = 0;
ValorOutrasICM = 0;
ValorBaseSubTrib = 0;
ValorSubTrib = 0;
ValorBaseSubTribCarga = 0;
ValorSubTribCarga = 0;
FatorRedCusto = 0;
FatorRedVenda = 0;
NumCFOP = '';
AliqPISCOFINS = 0;
--Ronaldo Chamado 313933
RegTribPercIvaSimplicado = 0;
--Gabriella - 333391  
ValorBaseIPI = 0;
ValorIsentoIPI = 0;
ValorOutrasIPI = 0;

--JALDO - CHAMADO 353913
CalcValorSubTrib = 0;
CalcBaseSubTrib = 0;

--Renato - 283520
SELECT Id,
  'M' || Rs_Replicate('0',(6 - Rs_Length(:Empresa))) || CAST(:Empresa AS VARCHAR(10))
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :EmpId, :AEmpMestre;

--leitura do parametro de controle
SELECT
  TipoReducaoICM,
  AliqCPMF,
  TipoRegimeTributario,
  AliqICMSimples
FROM
  ParamControle
WHERE
  Empresa = :Empresa
INTO
  :ParTipoReducaoICM,
  :ParAliqCPMF,
  :ParTipoRegimeTributario,
  :ParAliqICMSimples;

IF (ParTipoReducaoICM IS NULL) THEN
  ParTipoReducaoICM = 0;
IF (ParAliqCPMF IS NULL) THEN
  ParAliqCPMF = 0;
IF (ParTipoRegimeTributario IS NULL) THEN
  ParTipoRegimeTributario = 0;
IF (ParAliqICMSimples IS NULL) THEN
  ParAliqICMSimples = 0;

-- Renato - 278440
SELECT FlagDeduzirDespNaoInclNaMargem
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem;


-- leitura da cidade da empresa mestre
SELECT
  Cidades.CodEstado,
--Eder - Chamado 243637          
  Est.RegiaoDestino
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados Est ON Est.codorigem = Cidades.codestado
                       AND est.coddestino = Cidades.codestado
WHERE
  Entidades.Codigo = :AEmpMestre
INTO
  :CidEmpCodEstado,
  :RegiaoOrigem;

-- Leitura da entidade 
SELECT
  TipoPessoa,
  Cidades.CodEstado,
  Cidades.CodEstado
  --TipoConsideraIPICalculoICM -- - CHAMADO 248899
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EntTipoPessoa,
  :CidCodEstado,
  :CodEstadoLeitura;
  --:TipoConsideraIPICalculoICM; --243556 / 248899

 Existe = NULL;

SELECT
  FlagICMOrigem
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :Existe;

IF (rs_invl(Existe,0) = 1) THEN
  CodEstadoLeitura = CidEmpCodEstado;


--MARCELO - CHAMADO 192283
SELECT 
  RegiaoDestino
FROM Estados
WHERE CodOrigem = :CidEmpCodEstado
  AND CodDestino = :CidCodEstado
 INTO :RegiaoDestino;

IF (:CodEstadoLeitura <> :CidEmpCodEstado) THEN
BEGIN
    SELECT 
      RegiaoDestino
    FROM Estados
    WHERE CodOrigem = :CodEstadoLeitura
      AND CodDestino = :CidCodEstado
     INTO :RegiaoDestinoLeitura;
 -- Eder - Chamado 269443
  IF (RegiaoDestinoLeitura IS NULL) THEN
     RegiaoDestinoLeitura = RegiaoDestino;
END
ELSE
   RegiaoDestinoLeitura = RegiaoDestino;

--Na entrada, pega a aliquota interna do estado de origem da nota e na saida pega a aliquota do estado de destino
SELECT
--MARCELO - CHAMADO 116008
--  EstSai.AliqContrib,
  CASE WHEN :FlagEntrada = 1 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento <> 1
       THEN EstSai.AliqContribCompra --ENTRADA POR COMPRA
       WHEN :FlagEntrada = 0 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento = 1
       THEN EstSai.AliqContribCompra --SAIDA POR DEVOLUCAO
       ELSE EstSai.AliqContrib END,
  EstSai.FlagConvSub,
-- Isaac - Chamado 191748
--  Case When :FlagEntrada = 0 then EstSai.AliqInterna Else EstEnt.AliqInterna End
-- Eder - Chamado 219012
--Case When :FlagEntrada = 0 then EstSai.AliqInterna
--     When :FlagEntrada = 1 and Oper.tipomovimento = 1 then EstSai.AliqInterna
--     Else EstEnt.AliqInterna End
  CASE WHEN :FlagEntrada = 0 AND Oper.TipoMovimento <> 1 THEN EstSai.AliqInterna
       WHEN :FlagEntrada = 1 AND Oper.tipomovimento = 1 THEN EstSai.AliqInterna
       ELSE EstEnt.AliqInterna END
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados EstSai ON EstSai.CodOrigem = :CidEmpCodEstado
                          AND EstSai.CodDestino = :CodEstadoLeitura
  LEFT JOIN Estados EstEnt ON EstEnt.CodOrigem = :CidEmpCodEstado
                          AND EstEnt.CodDestino = :CidEmpCodEstado
--MARCELO - CHAMADO 116008
  LEFT JOIN Operacoes Oper ON Oper.Codigo = :CodOperacao
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EstAliqContrib,
  :EstFlagConvSub,
  :EstAliqInterna;


IF (EstAliqContrib IS NULL) THEN
  EstAliqContrib = 0;
IF (EstFlagConvSub IS NULL) THEN
  EstFlagConvSub = 0;
IF (EstAliqInterna IS NULL) THEN
  EstAliqInterna = 0;


  --Verifica se a classificação fiscal permite que seja calculada substituição tributária
ClaFlagSubTributaria = 1;
ClaAliqPisCofins = 0;
IF (ltrim(CodClassFiscal) <> '') THEN
BEGIN
  SELECT
    FlagSubTributaria,
    AliqPisCofins
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
    :ClaAliqPisCofins;

  IF (ClaFlagSubTributaria IS NULL) THEN
     ClaFlagSubTributaria = 1;
  IF (ClaAliqPisCofins IS NULL) THEN
     ClaAliqPisCofins = 0;
END


-- leitura das operacoes fiscais
SELECT
  TipoICM,
  TipoIPI,
  AliqICMFixo,
  PerRedICM,
  PerRedMargem,
  CFOP1_Normal,
  CFOP1_Normal_NCFora,
  CFOP2_Industrializado,
  CFOP2_Industrializado_NCFora,
  CFOP3_SubRevenda,
  CFOP3_SubRevenda_NC,
  CFOP4_SubRevendaML,
  CFOP4_SubRevendaML_NC,
  CFOP5_SubFabricacao,
  CFOP5_SubFabricacao_NC,
  CFOP6_SubFabricacaoML,
  CFOP6_SubFabricacaoML_NC,
  CFOP7_Importado,
  CFOP_Servico,
  CFOP_Servico_NCFora,
  CFOP9_Petroleo,
  CFOP9_Petroleo_NC,
  FlagCalcPIS_COFINS,
  FlagDefaultLancamentoOutras,
  FlagSubTribIPI,
  TipoMovimento,
  TipoSubTributaria,
  TipoSubTributariaCarga,
  FlagIPISobrePisCofins,
  FlagIPISobreBaseICM,
  --Renato - 341779
  FlagICMSSobreServicos,
  --Ronaldo 343696
  IndNaturezaFrete
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :OprTipoICM,
  :OprTipoIPI,
  :OprAliqICMFixo,
  :OprPerRedICM,
  :OprPerRedMargem,
  :OprCFOP1_Normal,
  :OprCFOP1_Normal_NCFora,
  :OprCFOP2_Industrializado,
  :OprCFOP2_Industrializado_NCFora,
  :OprCFOP3_SubRevenda,
  :OprCFOP3_SubRevenda_NC,
  :OprCFOP4_SubRevendaML,
  :OprCFOP4_SubRevendaML_NC,
  :OprCFOP5_SubFabricacao,
  :OprCFOP5_SubFabricacao_NC,
  :OprCFOP6_SubFabricacaoML,
  :OprCFOP6_SubFabricacaoML_NC,
  :OprCFOP7_Importado,
  :OprCFOP_Servico,
  :OprCFOP_Servico_NCFora,
  :OprCFOP9_Petroleo,
  :OprCFOP9_Petroleo_NC,
  :OprFlagCalcPIS_COFINS,
  :OprFlagDefaultLancamentoOutras,
  :OprFlagSubTribIPI,
  :OprTipoMovimento,
  :OprTipoSubTributaria,
  :OprTipoSubTributariaCarga,
  :OprFlagIPISobrePisCofins,
  :OprFlagIPISobreBaseIcm,
  --Renato - 341779
  :OprFlagICMSSobreServicos,
  :IndNaturezaFrete;


IF (OprTipoICM IS NULL) THEN
  OprTipoICM = 0;
IF (OprTipoIPI IS NULL) THEN
  OprTipoIPI = 0;
IF (OprAliqICMFixo IS NULL) THEN
  OprAliqICMFixo = 0;
IF (OprPerRedICM IS NULL) THEN
  OprPerRedICM = 0;
IF (OprPerRedMargem IS NULL) THEN
  OprPerRedMargem = 0;
IF (OprFlagCalcPIS_COFINS IS NULL) THEN
  OprFlagCalcPIS_COFINS = 0;
IF (OprFlagDefaultLancamentoOutras = 1) THEN
  OprFlagDefaultLancamentoOutras = 0;
IF (OprFlagCalcPIS_COFINS = 1) THEN
   AliqPISCOFINS = ClaAliqPISCOFINS;
IF (OprFlagSubTribIPI IS NULL) THEN
   OprFlagSubTribIPI = 0;
IF (OprTipoSubTributaria IS NULL) THEN
   OprTipoSubTributaria = 0;
IF (OprTipoMovimento IS NULL) THEN
   OprTipoMovimento = 0;
--Eder - Chamado 262460
IF (OprTipoSubTributariaCarga IS NULL) THEN
   OprTipoSubTributaria = 0;
if (OprFlagIPISobrePisCofins is null) then
   OprFlagIPISobrePisCofins = 0;
--Gabriella - 256424
if (OprFlagIPISobreBaseIcm is null) then
   OprFlagIPISobreBaseIcm = 0;

--Verifica se o grupo do produto permite que seja calculada substituição tributária
GruFlagSubTributaria = 1;
Select Gru.FlagSubTributaria,
       Pro.Origem
  From Produtos Pro 
  Left Join Grupos Gru on Gru.Codigo = Pro.CodGrupo
 Where Pro.Codigo = :CodProduto
  into :GruFlagSubTributaria, :ProOrigem;

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 
--Leitura da Lista de Preço
SELECT Ilp.PercAcrescimoAdm1, Ilp.PercAcrescimoAdm2, Ilp.PercAcrescimoAdm3,
       --Renato - 290579
       Ilp.PercSubTrib, Ilp.PercICMCusto
  FROM ItemlistaPreco Ilp
  LEFT JOIN Empresas Emp ON Emp.Codigo = :Empresa
 WHERE Ilp.CodLista=:CodListaPreco
   AND Ilp.CodProduto=:CodProduto
   AND Ilp.Empresa = Emp.EmpresaListaPreco
 INTO :LisPercAcrescimoAdm1, :LisPercAcrescimoAdm2, :LisPercAcrescimoAdm3,
      --Renato - 290579
      :PercSubTribCusto, :PercICMCusto;

IF (LisPercAcrescimoAdm1 IS NULL) THEN
  LisPercAcrescimoAdm1 = 0;
IF (LisPercAcrescimoAdm2 IS NULL) THEN
  LisPercAcrescimoAdm2 = 0;
IF (LisPercAcrescimoAdm3 IS NULL) THEN
  LisPercAcrescimoAdm3 = 0;


-- leitura da tributacao
SELECT FIRST 1
  AliqICM,
  FlagIsentoProdutor,
  FlagSubTributaria,
  MargemLucroSubst,
  PerReducaoICM,
  PerRedMargem,
  TipoCFOP,
  CodTributacaoSubTrib,
  TipoValorNaoTributado,
  PerReducaoSubTrib,
--Rafael chamado 272635
  AliqInternaSubTrib,
  NumCST_ICM,
  NumCST_IPI,
  NumCSOSN,
--Ronaldo Chamado 317536
  flagPrevalecerAliqIcm,
--Gabriella - 333391
  TipoValorNaoTributadoIPI
FROM
  Tributacoes
WHERE Codigo = :CodTributacao
  AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao,:CodEntidade, :CodOperacao, :AEmpMestre))
INTO
  :TriAliqICM,
  :TriFlagIsentoProdutor,
  :TriFlagSubTributaria,
  :TriMargemLucroSubst,
  :TriPerReducaoICM,
  :TriPerRedMargem,
  :TriTipoCFOP,
  :TriCodTributacaoSubTrib,
  :TriTipoValorNaoTributado,
  :TriPerReducaoSubTrib,
--Rafael chamado 272635
  :trialiqinternasubtrib,
  :TriNumCST_ICM,
  :TriNumCST_IPI,
  :TriNumCSOSN,
  :TriFlagPrevalecerAliqIcm,
--Gabriella - 333391
  :TriTipoValorNaoTributadoIPI;


 AuxEntidade = CodEntidade;
--Verifica a entrada de item com substituição tributaria, quando está marcado no parametro para verificar
--como estado de origem, por causa da substituição tributaria interna no estado.

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

IF ((FlagEntrada = 1) AND
   (Existe = 1)) THEN
BEGIN
  SELECT FIRST 1
    FlagSubTributaria,
    CodTributacaoSubTrib
  FROM Tributacoes
  WHERE Codigo = :CodTributacao
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao, :AEmpMestre, :CodOperacao, :AEmpMestre))
  INTO
    :AuxFlagSubTributaria,
    :AuxCodTributacaoSubTrib;

  IF (AuxFlagSubTributaria IS NULL) THEN
    AuxFlagSubTributaria = 0;
  IF (AuxCodTributacaoSubTrib IS NULL) THEN
    AuxCodTributacaoSubTrib = '';
  IF ((AuxFlagSubTributaria = 1) AND (AuxCodTributacaoSubTrib <> '')) THEN
  BEGIN
    TriCodTributacaoSubTrib = AuxCodTributacaoSubTrib;
    TriFlagSubTributaria =  AuxFlagSubTributaria;
    AuxEntidade = AEmpMestre;
  END
END

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

--Leitura dos dados da tributação linkada com a substituição tributaria
IF ((ltrim(TriCodTributacaoSubTrib) <> '') AND
   (TriFlagSubTributaria = 1) AND
   (ClaFlagSubTributaria = 1) AND
   (GruFlagSubTributaria = 1) AND
   ((FlagEntrada = 0) OR
    (FlagEntrada = 0) AND (Existe = 1))) THEN
BEGIN
  SELECT FIRST 1
    AliqICM,
    FlagIsentoProdutor,
    FlagSubTributaria,
    MargemLucroSubst,
    PerReducaoICM,
    PerRedMargem,
    TipoCFOP,
    CodTributacaoSubTrib,
    TipoValorNaoTributado,
    PerReducaoSubTrib,
--Rafael chamado 272635
    AliqInternaSubTrib,
    NumCST_ICM,
    NumCST_IPI,
    NumCSOSN,
--Gabriella - 333391
    TipoValorNaoTributadoIPI
  FROM
    Tributacoes
  WHERE Codigo = :TriCodTributacaoSubTrib
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:TriCodTributacaoSubTrib,:AuxEntidade, :CodOperacao, :AEmpMestre))
  INTO
    :TriAliqICM,
    :TriFlagIsentoProdutor,
    :TriFlagSubTributaria,
    :TriMargemLucroSubst,
    :TriPerReducaoICM,
    :TriPerRedMargem,
    :TriTipoCFOP,
    :TriCodTributacaoSubTrib,
    :TriTipoValorNaoTributado,
    :TriPerReducaoSubTrib,
--Rafael chamado 272635
    :Trialiqinternasubtrib,
    :TriNumCST_ICM,
    :TriNumCST_IPI,
    :TriNumCSOSN,
--Gabriella - 333391
    :TriTipoValorNaoTributadoIPI;

  CodTributacao = TriCodTributacaoSubTrib;
END

IF (TriAliqICM IS NULL) THEN
  TriAliqICM = 0;
IF (TriFlagIsentoProdutor IS NULL) THEN
  TriFlagIsentoProdutor = 0;
IF (TriFlagSubTributaria IS NULL) THEN
  TriFlagSubTributaria = 0;
IF (TriMargemLucroSubst IS NULL) THEN
  TriMargemLucroSubst = 0;
IF (TriPerReducaoICM IS NULL) THEN
  TriPerReducaoICM = 0;
IF (TriPerRedMargem IS NULL) THEN
  TriPerRedMargem = 0;
IF (TriTipoCFOP IS NULL) THEN
  TriTipoCFOP = 0;
IF (TriCodTributacaoSubTrib IS NULL) THEN
  TriCodTributacaoSubTrib = '';
IF (TriPerReducaoSubTrib IS NULL) THEN
   TriPerReducaoSubTrib = 0;
--Rafael chamado 272635
IF (trialiqinternasubtrib IS NULL) THEN
  trialiqinternasubtrib=0;
if (TriNumCST_ICM is null) then
  TriNumCST_ICM = 0;
if (TriNumCST_IPI is null) then
  TriNumCST_IPI = 0;
if (TriNumCSOSN is null) then
  TriNumCSOSN = 0;


IF (TriTipoValorNaoTributado IS NULL) THEN
BEGIN
  IF (Codproduto = 8888888) THEN
    TriTipoValorNaoTributado = 1;
  ELSE
    TriTipoValorNaoTributado = 0;
END

--Gabriella - 333391
if (TriTipoValorNaoTributadoIPI is null) then
begin
  if (Codproduto = 8888888) then
    TriTipoValorNaoTributadoIPI = 1;
  else
    TriTipoValorNaoTributadoIPI = 0;
end

--Eder Chamado 271756
IF (TriPerReducaoSubTrib <> 0) THEN
  RedBaseSubTrib = TriPerReducaoSubTrib;




Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CodEstadoLeitura
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CodEstadoLeitura
  AND RegiaoDestino = :RegiaoDestinoLeitura
  AND AliqICM > 0
INTO
  :Existe;

--JALDO/RONALDO - CHAMADO 309941
 -- If ((FlagEntrada = 0) and
  If ( (FlagEntrada = 0 or (FlagEntrada = 1 and OprTipoMovimento = 1)) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1
     AliqICM,
     --MARCELO - CHAMADO 214200
--     PerReducaoICM
    CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
  FROM
    tributacoes
  WHERE
    EstadoOrigem = :CodEstadoLeitura
    AND Codigo = :CodTributacao
    --MARCELO - CHAMADO 192283
--    and EstadoDestino = :CodEstadoLeitura
    AND RegiaoDestino = :RegiaoDestinoLeitura
    --Eder - 320407
    AND AliqICM > 0

  ORDER BY
    TipoPessoa
  INTO
    :EstAliqInterna,
    :RedBaseSubTrib;
END

IF (RedBaseSubTrib IS NULL) THEN
  RedBaseSubTrib = 0;

--Rafael chamado 272635
IF (trialiqinternasubtrib <> 0) THEN
 EstAliqInterna = triAliqInternaSubTrib;

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CidEmpCodEstado
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CidEmpCodEstado
  --Eder - Chamado 243637
  --and RegiaoDestino = :RegiaoDestino
  AND RegiaoDestino = :RegiaoOrigem
  AND AliqICM > 0
INTO
  :Existe;

IF ((FlagEntrada = 1) AND
--Eder - Chamado 184973
    (OprTipoMovimento <> 1) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1 AliqICM,
         CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
    FROM Tributacoes
   WHERE EstadoOrigem=:CidEmpCodEstado
     AND Codigo=:CodTributacao
     --MARCELO - CHAMADO 192283
--     and EstadoDestino=:CidEmpCodEstado
  --Eder - Chamado 243637
     --and RegiaoDestino=:RegiaoDestino
     AND RegiaoDestino=:RegiaoOrigem
-- Isaac - Chamado 189946   
     AND AliqICM > 0

   ORDER BY TipoPessoa
   INTO :EstAliqInterna , :RedBaseSubTrib;
END    
IF (EstAliqInterna IS NULL) THEN
   EstAliqInterna = 0;


IF (CodSubTributaria > 0) THEN
BEGIN                  
  SELECT                   
      AliquotaInterna, MargemLucro, PercReducao,
      IndiceReducao, FlagAbaterICM, FlagSomaIPI
  FROM SubstituicaoTributaria                  
  WHERE CodSubTributaria = :CodSubTributaria
    AND Empresa = :Empresa
  INTO :SubAliquotaInterna, :SubMargemLucro, :SubPercReducao,
       :SubIndiceReducao, :SubFlagAbaterICM, :SubFlagSomaIPI;
END
IF (SubAliquotaInterna IS NULL) THEN
   SubAliquotaInterna = 0;
IF (SubMargemLucro IS NULL) THEN
   SubMargemLucro = 0;
IF (SubPercReducao IS NULL) THEN
   SubPercReducao = 0;
IF (SubIndiceReducao IS NULL) THEN
   SubIndiceReducao = 0;
IF (SubFlagAbaterICM IS NULL) THEN
   SubFlagAbaterICM = 0;
IF (SubFlagSomaIPI IS NULL) THEN
    SubFlagSomaIPI = 0;

--Calculo do CST de ICMS e IPI 
Select Case when Op.NumCST_ICM = -1 then :TriNumCST_ICM
            else Op.NumCST_ICM End,
       Case when Op.NumCST_IPI <> -1
                 then Op.NumCST_IPI   --Operação fiscal prevalece sobre demais.
            when :AliqIPI > 0 and Op.TipoIPI = 0 --Item tributado de ipi sera sempre 00 ou 50 (entrada ou saida tributada)
                 then Case When :FlagEntrada = 1 Then 00 Else 50 End
            when Cla.NumCST_IPI not in (-1,0) and (:AliqIPI = 0 or Op.TipoIPI <> 0)
                 then Cla.NumCST_IPI -- Class. Fiscal prevalece sobre demais.
            when :TriNumCST_IPI <> -1 and (:AliqIPI = 0 or Op.TipoIPI <> 0)
                 then :TriNumCST_IPI    -- Item sem ipi pega da tributação se informado
       End,
       Case When :ParTipoRegimeTributario in (1,2)   --Calculo de CSOSN para Simples Nacional
            Then Case When Op.NumCSOSN not in(-1,0) then Op.NumCSOSN
                      Else :TriNumCSOSN End
       end
  From Produtos Pro
  Left Join Operacoes Op on Op.Codigo = :CodOperacao
  Left Join ClassFiscais Cla on Cla.Codigo = :CodClassFiscal
Where Pro.Codigo = :CodProduto
into :NumCstICM, :NumCstIPI, :NumCsosn;

if (NumCstICM <> -1) then
  NumCstICM = Cast(ProOrigem as varchar(1)) || Rs_Replicate('0', 2 - Rs_Length(:NumCstICM)) || Cast(:NumCstICM as varchar(2));
else
  NumCstICM = NULL;

--Gabriella - 299680
if (NumCstIPI <> -1 and :FlagEntrada = 1)then
  NumCstIPI = Rs_Replicate('0', 2 - Rs_Length(:NumCstIPI)) || Cast(:NumCstIPI as varchar(2));
if (NumCstIPI <> -1 and :FlagEntrada = 0)then
  NumCstIPI = Rs_Replicate('5', 2 - Rs_Length(:NumCstIPI)) || Cast(:NumCstIPI as varchar(2));
if (NumCstIPI = -1) then
  NumCstIPI = NULL;

if (NumCsosn <> -1 and ParTipoRegimeTributario in (1,2)) then --CSOSN para Simples Nacional
  NumCsosn = Rs_Replicate('0', 3 - Rs_Length(:NumCsosn)) || Cast(:NumCsosn as varchar(3));
else
  NumCsosn = NULL;



IF ((EntTipoPessoa = 'F') OR
   (EntTipoPessoa = 'N')) THEN
  AliqIcm = TriAliqICM;
ELSE
BEGIN
--Ronaldo Chamado 317536
--  IF (TriAliqICM < EstAliqContrib) THEN
--    AliqICM = TriAliqICM;
--  ELSE
--      AliqICM = EstAliqContrib;
  IF (TriFlagPrevalecerAliqIcm = 1) then
    AliqICM = TriAliqICM;
  ELSE
  BEGIN
    IF (TriAliqICM < EstAliqContrib) THEN
      AliqICM = TriAliqICM;
    ELSE
      AliqICM = EstAliqContrib;
  END
END

IF ((CidEmpCodEstado = CodEstadoLeitura) AND (TriFlagIsentoProdutor = 1)) THEN
  IF ((EntTipoPessoa = 'P') OR (EntTipoPessoa = 'J') OR (EntTipoPessoa = 'C') OR
      (EntTipoPessoa = 'I') ) THEN --JALDO - CHAMADO 248899
    AliqICM = 0;

IF ((OprTipoICM = 1) OR
    (OprTipoICM = 2 AND FlagEntrada = 0) OR
    (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
  AliqICM = 0;

IF (OprAliqICMFixo <> 0) THEN
  AliqICM = :OprAliqICMFixo;

--Eder - Chamado 295277
IF (AliqICMFixo <> 0) THEN
BEGIN
  --O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
  IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
     (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
     --Não pode fixar a aliquota de icms no simples senao nao calcula a ST
     AliqICM = AliqICM;
  ELSE
     AliqICM = AliqICMFixo;
END

--Gabriella - 333391                                                                                                                                                                               
ValorBaseIPI = ValorTotal + AcrescimoBaseIPI;
                                                                 
If (ValorBaseIPI > 0 and AliqIPI > 0) then
  VAuxValorIPI = (ValorBaseIPI * AliqIPI) / 100;

--Somente irá prevalecer o Tipo da Tributação quando a Aliquota de IPI for igual a Zero 
-- e o Tipo do Ipi da Operação Fiscal for Tributado   
if (AliqIPI = 0 and OprTipoIPI = 0) then
begin
 if (TriTipoValorNaoTributadoIPI = 0) then
   ValorIsentoIPI = ValorBaseIPI;
 if (TriTipoValorNaoTributadoIPI = 1) then
   ValorOutrasIPI = ValorBaseIPI;
end
   
if (OprTipoIPI = 1) then
  ValorIsentoIPI = ValorBaseIPI;
  
if (OprTipoIPI = 2) then
  ValorOutrasIPI = ValorBaseIPI;
  
If (AliqIPI = 0) then
  ValorBaseIPI = 0;
  
if (ValorIsentoIPI > 0 or ValorOutrasIPI > 0) then
  ValorBaseIPI = 0;

---Chamado 114964                                        
--If @OprTipoIPI = 0 or @OprTipoIPI = 3                                          
--Begin
--Gabriella - 333391
/*  IF ((ValorTotal > 0) AND (AliqIPI > 0)) THEN
    VAuxValorIPI = (ValorTotal * AliqIPI) / 100;*/
--End

IF ((TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (TriMargemLucroSubst <> 0)
   AND (EstFlagConvSub = 1)
   AND (OprTipoICM = 0)
   AND (OprTipoSubTributaria > 0)) THEN
BEGIN
  ValorBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTrib = ValorBaseSubTrib + VAuxValorIPI;
END

--Substituição tributaria não informada na nota, somente para sair na impressão do pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  ValorBaseSubTribCarga = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTribCarga = ValorBaseSubTribCarga + VAuxValorIPI;
END

IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0)
   AND (EstFlagConvSub = 1)) THEN
BEGIN                                        
  CalcBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (SubFlagSomaIPI = 1) THEN
     CalcBaseSubTrib = CalcBaseSubTrib + VAuxValorIPI;
END                                     

ValorBaseICM = ValorTotal + AcrescimoBaseICM;
--223515 ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseSubTrib;
ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;
CalcBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;

-- JALDO - CHAMADO 243556
-- O Tipo "2" não estão sendo verificando porque nunca será usado
--If (EntTipoPessoa <> 'J') then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
--  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--JALDO - CHAMADO 248899
--if (((TipoConsideraIPICalculoICM = 0) and (EntTipoPessoa <> 'J')) or
--   (TipoConsideraIPICalculoICM = 1)) then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
-- CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--Gabriella - 256424
--IF (EntTipoPessoa NOT IN ('J','I')) THEN
IF ((EntTipoPessoa NOT IN ('J','I')) or (oprflagipisobrebaseicm = 1)) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
END

ValorIsentoICM = ValorBaseIcm; --Salva o Valor da Base como isentas antes das reducoes

IF (TriPerReducaoICM <> 0 AND ValorBaseIcm <> 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * TriPerReducaoICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * TriPerReducaoICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * TriPerReducaoICM) / 100);
END

IF (ValorBaseIcm > 0 AND OprPerRedICM > 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * OprPerRedICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * OprPerRedICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * OprPerRedICM) / 100);
END

IF (ValorBaseIcm > 0 AND AliqICM > 0) THEN
  ValorICM = (ValorBaseIcm * AliqICM) / 100;

--Ronaldo Chamado 313933
select R.PercIvaSimplificado from regimetributario R
left join entidades E on R.Codigo = E.codRegimeTributario  
where R.empresa = :Empresa and
      E.codigo  = :CodEntidade
INTO :RegTribPercIvaSimplicado;

IF (TriFlagSubTributaria = 1 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1
   AND TriMargemLucroSubst <> 0 AND EstFlagConvSub = 1 AND OprTipoICM = 0 AND OprTipoSubTributaria > 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0) THEN
    ValorBaseSubTrib = ValorBaseSubTrib - ((ValorBaseSubTrib  * RedBaseSubTrib) / 100);

--Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 and EstAliqInterna > 0) then
  BEGIN
     ValorSubTrib     = rs_RoundDec(ValorbaseSubTrib * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTrib = rs_RoundDec((ValorIcm + ValorSubTrib) / EstAliqInterna * 100,2);
  END
  ELSE
  begin
     IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
        ValorBaseSubTrib = ValorBaseSubTrib +  ((ValorBaseSubTrib * TriMargemLucroSubst) / 100);

     IF (ValorBaseSubTrib > 0 AND EstAliqInterna > 0) THEN
        ValorSubTrib = (ValorBaseSubTrib * EstAliqInterna) / 100;
        ValorSubTrib = ValorSubTrib - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  End
END

--Substituição tributaria não informada na nota, somente para sair no pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0) THEN
    ValorBaseSubTribCarga = ValorBaseSubTribCarga - ((ValorBaseSubTribCarga  * RedBaseSubTrib) / 100);

  --Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 and EstAliqInterna > 0)  then
  BEGIN
     ValorSubTribCarga     = Rs_RoundDec(ValorBaseSubTribCarga * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTribCarga = Rs_RoundDec((ValorIcm + ValorSubTribCarga) / EstAliqInterna * 100,2);
  END
  ELSE
  Begin
    IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
       ValorBaseSubTribCarga = ValorBaseSubTribCarga +  ((ValorBaseSubTribCarga * TriMargemLucroSubst) / 100);
    IF (ValorBaseSubTribCarga > 0 AND EstAliqInterna > 0) THEN
       ValorSubTribCarga = (ValorBaseSubTribCarga * EstAliqInterna) / 100;
       ValorSubTribCarga = ValorSubTribCarga - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  End
END

--Calculo da substituição tributaria pela tabela SubstituicaoTributaria              
IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0) AND (EstFlagConvSub = 1)) THEN
BEGIN              
  IF (SubPercReducao <> 0) THEN
     CalcBaseSubTrib  = CalcBaseSubTrib - ((CalcBaseSubTrib * SubPercReducao) / 100);
  IF (SubMargemLucro <> 999.99) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  ((CalcBaseSubTrib * SubMargemLucro) / 100);
  IF (SubIndiceReducao <> 0) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  (CalcBaseSubTrib * SubIndiceReducao);
          
  --Quando não tem aliquota interna na sub.trib, pega a do estado de origem          
  IF ((CalcBaseSubTrib > 0) AND
     ((SubAliquotaInterna > 0) OR (EstAliqInterna > 0))) THEN
  BEGIN            
    IF (SubAliquotaInterna > 0) THEN
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * SubAliquotaInterna) / 100;
    END
    ELSE            
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * EstAliqInterna) / 100;
    END
  END            
          
  --Opção que permite abater o icms da operação na substituição tributaria          
  IF (SubFlagAbaterICM = 1) THEN
     CalcValorSubTrib = CalcValorSubTrib - Rs_RoundDec((CalcBaseSubTribDestino * AliqICM) / 100,2);
  
  IF ((OprTipoICM = 0) AND (OprTipoSubTributaria > 0)) THEN
  BEGIN              
    ValorBaseSubTrib = CalcBaseSubTrib;
    ValorSubTrib = CalcValorSubTrib;
  END              
              
  --Eder - Chamado 262460
  IF (OprTipoSubTributariaCarga = 0) THEN
  BEGIN
    ValorBaseSubTribCarga = CalcBaseSubTrib;
    ValorSubTribCarga = CalcValorSubTrib;
  END
END              

--MARCELO - CHAMADO 195051
IF ((ValorBaseSubTrib <> 0) OR (ValorSubTrib <> 0))  THEN
BEGIN
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
END

--Eder - Chamado 295277
--O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
    (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
BEGIN
  IF (TriAliqICM <= 0) THEN
    AliqICM = 0;
  ELSE
    AliqICM = ParAliqICMSimples;
  IF ((OprTipoICM = 1) OR
      (OprTipoICM = 2 AND FlagEntrada = 0) OR
      (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
    AliqICM = 0;
  ValorICM = (ValorBaseIcm * AliqICM) / 100;
END


IF (AliqICM = 0) THEN
  ValorBaseIcm = 0;
ELSE
  ValorIsentoICM = ValorIsentoICM - ValorBaseIcm;


IF ((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    ValorIsentoICM = 0;
  END    
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        


--Calcula o Fator de Redução de Custo
FatorRedCusto = 1;
IF (ParTipoReducaoICM = 1 AND Ltrim(CodEntidade) <> ''
  AND (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))
--Eder - Chamado 170325
  AND (CodProduto <> 8888888)) THEN
BEGIN
IF (NOT(((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))))) THEN
--  Isaac - Chamado 191232
--  If (OprTipoSubTributaria not in(2,3)) then   --não calcula quando a sub. tributaria é isenta/outras
  BEGIN
     FatorRedCusto = (100 - TriAliqICM) / (100 - AliqICM);
  END

  IF (OprPerRedMargem <> 0) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (OprPerRedMargem / 100);
  END

  --Eder - Chamado 270320
  --If (TriPerRedMargem <> 0) then
  --begin
  --  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
  --end
END
--Eder - Chamado 270320
IF ((TriPerRedMargem <> 0) AND (CodProduto <> 8888888)) THEN
BEGIN
  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
END

-- 298865
--Eder - Chamado 195755
--Somente vai calcular DespesasNaoInclusas no fator quando for saída ou devolução      
-- Renato - 278440
if ((FlagEntrada = 0) or
    ((FlagEntrada = 1) and (OprTipoMovimento = 1))) then
begin
  --Eder - Chamado 170325
  --Adiciona o acrescimo de custo, que já deve vir passado como percentual
  If ((PerRedDespesa <> 0) and (ParTipoReducaoICM in (0,1)) and (flagdeduzirdespnaoinclnamargem = 0)) then
  begin
    FatorRedCusto = FatorRedCusto + PerRedDespesa;
  end
end

--Calcula o fator de venda para as saídas e entradas por devolução.
--Retira o Valor do ICM, a Aliquota de CPMF, a Aliquota de PIS/COFINS e soma o acrescimo de vend
FatorRedVenda = 1;
IF (((FlagEntrada = 0) OR
    ((FlagEntrada = 1) AND (OprTipoMovimento = 1)))
   -- Renato - 278440
   AND (ParTipoReducaoICM = 2)) THEN -- 2 - Deduzir Impostos da Venda
BEGIN
  --Eder -Chamado 292832 - Evitar arredondamento desnecessario na aliquota do ICM (Vide Chamado)
  IF ((AliqICM > 0) AND (ValorTotal > 0)) THEN
     IF (ValorBaseICM = ValorTotal + AcrescimoBaseICM) THEN
        FatorRedVenda = FatorRedVenda - (CAST(AliqICM AS NUMERIC(7,4))/ 100);
     ELSE
        FatorRedVenda = FatorRedVenda -
                        Rs_RoundDec(((CAST(ValorICM AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);

  IF (ParAliqCPMF > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(ParAliqCPMF AS NUMERIC(7,4))/ 100);

  IF (AliqPISCOFINS > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);

  IF ((LisPercAcrescimoAdm1 + LisPercAcrescimoAdm2 + LisPercAcrescimoAdm3) > 0) THEN
     FatorRedVenda = FatorRedVenda -
              ((CAST(LisPercAcrescimoAdm1 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm2 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm3 AS NUMERIC(9,4))) / 100);

--calcula o percentual do acrescimo de despesas de venda sobre o total do item para achar o fator
  IF ((AcrescimoRedVenda <> 0) AND (ValorTotal > 0)) THEN
     FatorRedVenda = FatorRedVenda -
                     Rs_RoundDec(((CAST(AcrescimoRedVenda AS NUMERIC(9,4)) * 100) / CAST(ValorTotal AS NUMERIC(11,4))) / 100,4);

  --Renato - 290579
  -- Se for uma venda fora do estado e os Percentuais de ICMS e SubTrib da Compra estiverem informados
  -- no Item da Lista de Preco vai abater o ICMS da compra no Custo.
  IF ((CidEmpCodEstado <> CidCodEstado) AND (PercICMCusto > 0) AND (PercSubTribCusto > 0)) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (PercICMCusto / 100);
  END
END

--Renato - 278440
IF ((PerRedDespesa <> 0) AND (FlagDeduzirDespNaoInclNaMargem = 1) AND (ParTipoReducaoICM <> 2)) THEN
BEGIN                                                    
  FatorRedVenda = FatorRedVenda - PerRedDespesa;
END  


--Eder - 303720            
AcrDespesasPisCOFINS = AcrescimoBaseICM;
if (OprFlagIPISobrePisCofins = 1) then --Calcula IPI sobre Pis e COFINS
  AcrDespesasPisCOFINS = AcrDespesasPisCOFINS + VAuxValorIPI;

-- Renato - Chamado 272165
--Renato - 283520
SELECT ValorBasePisCofins, AliqPis, AliqCofins, NumCstPisCofins, NatReceitaPisCofins, NatBaseCalcCredito
  FROM Calcular_PisCofins(:Empresa, :CodProduto, :CodEntidade, :CodTributacao, :CodOperacao,
                          :CodClassFiscal, :ValorTotal, :AcrDespesasPisCOFINS, :FlagEntrada)
  -- Renato - 297792
  INTO :ValorBasePisCofins, :AliqPis, :AliqCofins, :NumCstPisCofins, :NatReceitaPisCofins, :NatBaseCalcCredito;

--usar a variável CidCodEstado pois não pode considerar a opção de "considerar ICM de origem" na hora
--de calcular o CFOP
---Calculo do CFOP do Item
IF (CodProduto = 8888888) THEN  --- Quando for servico
BEGIN
  IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX'
     AND Ltrim(OprCFOP_Servico_NCFora) <> '') THEN
    NumCFOP = OprCFOP_Servico_NCFora;
  ELSE
    NumCFOP = OprCFOP_Servico;
END
ELSE
BEGIN
  IF (TriTipoCFOP = 1 OR TriTipoCFOP = 0) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP1_Normal_NCFora) <> '') THEN
      NumCFOP = OprCFOP1_Normal_NCFora;
    ELSE
      NumCFOP = OprCFOP1_Normal;
  END
  IF (TriTipoCFOP = 2) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP2_Industrializado_NCFora) <> '') THEN
      NumCFOP = OprCFOP2_Industrializado_NCFora;
    ELSE
      NumCFOP = OprCFOP2_Industrializado;
  END
  IF (TriTipoCFOP = 3) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP3_SubRevenda_NC;
    ELSE
      NumCFOP = OprCFOP3_SubRevenda;
  END
  IF (TriTipoCFOP = 4) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP4_SubRevendaML_NC;
    ELSE
      NumCFOP = OprCFOP4_SubRevendaML;
  END
  IF (TriTipoCFOP = 5) THEN ----
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP5_SubFabricacao_NC;
    ELSE
      NumCFOP = OprCFOP5_SubFabricacao;
  END
  IF (TriTipoCFOP = 6) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP6_SubFabricacaoML_NC;
    ELSE
      NumCFOP = OprCFOP6_SubFabricacaoML;
  END
  IF (TriTipoCFOP = 7) THEN
  BEGIN
    NumCFOP = OprCFOP7_Importado;
  END
  IF (TriTipoCFOP = 9) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N','C','P')) THEN
      NumCFOP = OprCFOP9_Petroleo_NC;
    ELSE
      NumCFOP = OprCFOP9_Petroleo;
  END
END

IF (rs_Substring(NumCFOP,1,1) IN ('1','2','3') AND CidCodEstado <> CidEmpCodEstado) THEN --Entradas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '3' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '2' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

IF (rs_Substring(NumCFOP,1,1) IN ('5','6','7') AND CidCodEstado <> CidEmpCodEstado) THEN --Saídas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '7' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '6' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

--MARCELO - CHAMADO 209798
/*
CFOP 5.405 não existe o seu correlado 6.405 para vendas fora do estado, 
devendo ser utilizado em seu lugar o CFOP 6.404, conforme reunião definada
com Eder
*/
-- Rafael chamado 224824
--if (NumCFOP = '6405') then
  --NumCFOP = '6404';
 IF (NumCFOP = '6405') THEN
  NumCFOP = '6404';

 IF (NumCFOP = '6.405') THEN
  NumCFOP = '6.404';


--Teste de Valores Nulos
IF (NumCFOP IS NULL) THEN
  NumCFOP = '';
IF (AliqICM IS NULL) THEN
  AliqICM = 0;

IF (CodProduto = 8888888) THEN   -- para serviço nao pode calcular o icm
BEGIN
  -- Renato - 341779
  if ( (OprFlagICMSSobreServicos = 0) or (OprTipoIcm in (1,2)) ) then
  begin
    AliqICM = 0;
    ValorBaseIcm = 0;
    ValorICM = 0;
    ValorIsentoICM = 0;
    ValorOutrasICM = 0;
                                         
    if (OprFlagICMSSobreServicos = 0) then
    begin                                                                            
      if (TriTipoValorNaoTributado = 0) then
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      else                                                                          
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    end
    else
    begin
      if (OprTipoIcm = 1) then
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      else                                 
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    end
                                                                                                    
  end
  else if ( (OprFlagICMSSobreServicos = 1) and (OprTipoIcm = 0) and ((AliqICM = 0) or (ValorBaseIcm = 0)) ) then
  begin
    if (TriTipoValorNaoTributado = 0) then
      ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
    else                                                                          
      ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
  end

  ValorBaseSubTrib = 0;
  ValorSubTrib = 0;
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
  RedBaseSubTrib = 0;
--Eder - Chamado  170325
--FatorRedCusto = 1;
  FatorRedVenda = 1;
  AliqPISCOFINS = 0;
END
PerRedBaseSubTrib = RedBaseSubTrib;

--Eder - 297029
If (ValorBaseICM > 0 and ValorIsentoICM > 0) then
begin  
  --Renato - 361064 
  if ((TriPerReducaoICM = 0) and (OprPerRedICM <> 0)) then
    PerReducaoICM = OprPerRedICM;
  else if ((TriPerReducaoICM <> 0) and (OprPerRedICM = 0)) then
    PerReducaoICM = TriPerReducaoICM;
  else
    PerReducaoICM = Round(ValorIsentoICM / (ValorBaseICM + ValorIsentoICM) * 100,2);
end 
else
  PerReducaoICM = 0;

--Renato - 360358
if (ValorBaseSubTrib = 0  and ValorSubTrib = 0 and ValorBaseSubTribCarga = 0 and ValorSubTribCarga = 0) then
begin
  EstAliqInterna = 0;
  TriMargemLucroSubst = 0;
end 

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = TriMargemLucroSubst;


--Define o valor de isento ou o valor de outras para o que não foi tributado
IF ((CodProduto <> 8888888) AND (ValorIsentoICM > 0)) THEN
BEGIN
  --Chamado 156315 - calculando errado valor de isentas com tributação com coluna de outras
  IF ((OprTipoICM = 2) OR
      ((TriTipoValorNaoTributado = 1) AND (OprTipoICM = 0))) THEN
  BEGIN
    --MARCELO - CHAMADO 240364
    IF ((NOT((OprTipoSubTributaria IN(2,3)) AND
             (ClaFlagSubTributaria = 1) AND
             (GruFlagSubTributaria = 1) AND
             (EstFlagConvSub = 1) AND
             ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0)))) OR
        (OprTipoICM = 2)) THEN
    BEGIN
      ValorOutrasICM = ValorIsentoICM;
      ValorIsentoICM = 0;
    END
  END
END

SUSPEND;

END
^

ALTER PROCEDURE ATUALIZARCUPOMFISCAL (
    empresa smallint,
    tipocontrole smallint,
    codcontrole integer,
    numerocupom varchar(10),
    numeroserieecf varchar(20))
as
declare variable ehnotaservico varchar(20);
declare variable dataemissao timestamp;
declare variable codduplicata varchar(15);
declare variable novocodigo varchar(15);
declare variable parcela smallint;
declare variable contparcela smallint;
declare variable flaggravacao smallint;
declare variable existe smallint;
declare variable lcperiodo varchar(10);
declare variable lcnumlote smallint;
declare variable lcnumlancamento integer;
declare variable razaosocial varchar(50);
begin
  select current_date
  from RDB$DATABASE
  into :DataEmissao;

  NumeroCupom = rs_ltrim(NumeroCupom);
  NumeroSerieECF = rs_ltrim(NumeroSerieECF);
--EDER RAMOS Chamado 302201
  EhNotaServico = 'managernfse';

  Update NotasFiscais set
--EDER RAMOS Chamado 302201
    NumCupomCF = (case when :NumeroSerieECF = :EhNotaServico
                        then 0
                        else :NumeroCupom end),
    NumDocumento = (case when :NumeroSerieECF = :EhNotaServico
                        then :NumeroCupom
                        else (Case StatusImpNota when 1 then :NumeroCupom
                                      when -2 then :NumeroCupom
                                      else NumDocumento end) end),
    DataEmissaoCF = :DataEmissao,
    StatusTransacao = 1,  
    NumEquipamentoCF = :NumeroSerieECF,
    StatusImpCupom = 1  
  Where Empresa = :Empresa
    and TipoControle = :TipoControle
    and CodControle = :CodControle;
  
--Gabriella - 295935
  Select NF.Periodo, NF.NumLote, NF.NumLancamento,
         coalesce((select E.RazaoSocial
                   from Entidades E
                   where E.Codigo = NF.CodEntidade), '')
  from NotasFiscais NF
  where Empresa = :Empresa
   and TipoControle = :TipoControle
   and CodControle = :CodControle
  into :lcperiodo, :lcnumlote, :lcnumlancamento, :razaosocial;

  Update LancamentosContabeis
  set NumDocumento = :NumeroCupom,
      Complemento = 'NF. NR. ' || :NumeroCupom || ' ' || :razaosocial
  where Empresa = :Empresa
   and Periodo = :lcperiodo
   and NumLote = :lcnumlote
   and NumLancamento = :lcnumlancamento;

  Parcela = 0;
  for
    Select CodDuplicata
    from Duplicatas  
    where Empresa = :Empresa
      and TipoControle = :TipoControle
      and CodControle = :CodControle
    into :CodDuplicata
  Do
  begin
    Parcela = Parcela + 1;
    ContParcela = 0;
   /*  360235
----EDER RAMOS Chamado 302201
    NovoCodigo = (case when :NumeroSerieECF = :EhNotaServico then
                          --360235
                          --  ''
                          rs_ltrim('')
                        else 'CF' end) || rs_replicate('0', 6 - rs_length(NumeroCupom)) || NumeroCupom || '/' || cast(Parcela as varchar(2));

   */

   
    if (:NumeroSerieECF <> :EhNotaServico) then
      NovoCodigo = 'CF'  || rs_replicate('0', 6 - rs_length(NumeroCupom)) || NumeroCupom || '/' || cast(Parcela as varchar(2));
    else
      NovoCodigo = rs_replicate('0', 6 - rs_length(NumeroCupom)) || NumeroCupom || '/' || cast(Parcela as varchar(2));


    FlagGravacao = 0;

    While ((FlagGravacao = 0) and (ContParcela < 99)) do
    begin
      --MARCELO - CHAMADO 191733
      Existe = 0;

      select Count(*) from Duplicatas
      Where Empresa = :Empresa
        and TipoDuplicata = :TipoControle
        and CodDuplicata = :NovoCodigo
       into :Existe;

      if (Existe = 0) then
      begin
        Select count(*) as qt from MovDuplicata
        where Empresa= :Empresa
          and TipoMovimento = 0
          and TipoDuplicata = :TipoControle
          and CodDuplicata = :NovoCodigo
         into :Existe;
      end

      if (Existe = 1) then
      begin  
        ContParcela = ContParcela + 1;
        --360419
        if (:NumeroSerieECF = :EhNotaServico) then
          NovoCodigo = rs_left(NovoCodigo, 8) || rs_replicate('0', 2 - rs_length(ContParcela)) || Cast(ContParcela as varchar(2));
        else
          NovoCodigo = rs_left(NovoCodigo, 10) || rs_replicate('0', 2 - rs_length(ContParcela)) || Cast(ContParcela as varchar(2));
      end  
      else  
      begin  
        FlagGravacao = 1;
      end
    end
  
    Update Duplicatas Set
      CodDuplicata = :NovoCodigo,
      ValorRecebido = 0,  
      ValorJuros = 0,  
      ValorDesconto = 0,  
      ValorDespesa = 0,  
      ValorAdicional = 0,
----EDER RAMOS Chamado 302201
      NumDocumento = (case when :NumeroSerieECF = :EhNotaServico
                then 'NF' || rs_replicate('0', 6 - rs_length(:NumeroCupom)) || :NumeroCupom
                else NumDocumento end),   
      StatusTransacao = 1
    Where Empresa = :Empresa
     and TipoDuplicata = :TipoControle
     and CodDuplicata = :CodDuplicata
----EDER RAMOS Chamado 302201
      and (Select
            (case when :NumeroSerieECF = :EhNotaServico
                    then -2
                    else StatusImpNota end)
           from NotasFiscais        
           Where Empresa = :Empresa
             and TipoControle = :TipoControle
             and CodControle = :CodControle) = -2;
  
    Update MovDuplicata Set
      CodDuplicata = :NovoCodigo,
      StatusTransacao = 1  
    Where EmpresaDuplicata = :Empresa
      and TipoDuplicata = :TipoControle
      and CodDuplicata = :CodDuplicata
----EDER RAMOS Chamado 302201
      and (Select
            (case when :NumeroSerieECF = :EhNotaServico
                    then -2
                    else StatusImpNota end)
           from NotasFiscais        
           Where Empresa = :Empresa
             and TipoControle = :TipoControle
             and CodControle = :CodControle) = -2;
  
    Update MovDespesa Set
      CodDuplicata = :NovoCodigo,
      StatusTransacao = 1  
    Where Empresa = :Empresa
      and TipoDuplicata = :TipoControle
      and CodDuplicata = :CodDuplicata
----EDER RAMOS Chamado 302201
      and (Select
            (case when :NumeroSerieECF = :EhNotaServico
                    then -2
                    else StatusImpNota end)
           from NotasFiscais        
           Where Empresa = :Empresa
             and TipoControle = :TipoControle
             and CodControle = :CodControle) = -2;
  
    Update MovCaixa Set
      Observacao = rs_replace(Observacao, :CodDuplicata, :NovoCodigo),
      StatusTransacao = 1  
    Where Empresa = :Empresa
      And TipoMovimento = 3  
      And NumSequencia in (Select MD.NumSequencia From MovDuplicata MD  
                           Where MD.EmpresaDuplicata = :Empresa
                             And MD.TipoDuplicata = :TipoControle
                             And MD.CodDuplicata = :NovoCodigo)
----EDER RAMOS Chamado 302201
      and (Select
            (case when :NumeroSerieECF = :EhNotaServico
                    then -2
                    else StatusImpNota end)
           from NotasFiscais        
           Where Empresa = :Empresa
             and TipoControle = :TipoControle
             and CodControle = :CodControle) = -2;
  end
  
  Update NotasFiscais Set
    StatusImpCupom = 1,  
    StatusTransacao = 1,  
    StatusImpNota = case when StatusImpNota = -2 then 1 else 0 end
  Where Empresa = :Empresa
    and TipoControle = :TipoControle
    and CodControle = :CodControle;
END^

ALTER PROCEDURE STORED_PRCE050CALCULARICM (
    empresa smallint,
    tipocontrole smallint,
    codcontrole integer,
    codoperacao integer,
    notavalorprodutos numeric(11,2),
    notavalorservicos numeric(11,2),
    notavalordesconto numeric(11,2),
    notavalordespesas numeric(11,2),
    notavalordespesasvenda numeric(11,2),
    notavalordescontoservicos numeric(11,2),
    notavalorsubtribtotal numeric(11,2),
    notavalordespesasnaoinc numeric(11,2),
    codentidade char(7),
    valorcontabilnota numeric(11,2),
    valoripinota numeric(11,2),
    flagalteraaliquota smallint,
    flagalterarcfop smallint,
    flagselectbaseicm smallint,
    modelodocumento varchar(3))
returns (
    valorbaseicm numeric(11,2))
as
declare variable acrescimobaseicm numeric(11,2);
declare variable acrescimobasesubtrib numeric(13,4);
declare variable acrescimoredvenda numeric(13,4);
declare variable perreddespesa numeric(15,8);
declare variable valoricm numeric(13,4);
declare variable numlancamento integer;
declare variable seqtemporaria smallint;
declare variable numsequenciacomp smallint;
declare variable tipoitem smallint;
declare variable codproduto integer;
declare variable codtributacao char(5);
declare variable valortotal numeric(11,2);
declare variable aliqipi numeric(4,2);
declare variable aliqicm numeric(4,2);
declare variable tempaliqicm numeric(4,2);
declare variable valorisentoicm numeric(11,2);
declare variable valoroutrasicm numeric(11,2);
declare variable compvalorisentoicm numeric(11,2);
declare variable compvaloroutrasicm numeric(11,2);
declare variable compvalorbaseicm numeric(11,2);
declare variable valorbasesubtrib numeric(11,2);
declare variable valorsubtrib numeric(11,2);
declare variable valorbasesubtribcarga numeric(11,2);
declare variable valorsubtribcarga numeric(11,2);
declare variable fatorredcusto numeric(15,8);
declare variable fatorredvenda numeric(7,4);
declare variable numcfop char(10);
declare variable codclassfiscal varchar(15);
declare variable codlistapreco integer;
declare variable flagentrada integer;
declare variable tipopessoa varchar(1);
declare variable aliqpiscofins numeric(4,2);
declare variable flagsubtribdespesas integer;
declare variable codempmestre char(7);
declare variable perredbasesubtrib numeric(4,2);
declare variable auxperredbasesubtrib numeric(4,2);
declare variable codsubtributaria integer;
declare variable subflagsomadespesas integer;
declare variable flagdespesasipi integer;
declare variable valorcustofor numeric(13,4);
declare variable quantatendida numeric(10,3);
declare variable valorcontabilnotaservico numeric(11,2);
declare variable servicovalorbaseicm numeric(11,2);
declare variable servicovalorisentoicm numeric(11,2);
declare variable servicovaloroutrasicm numeric(11,2);
declare variable servicocompvalorbaseicm numeric(11,2);
declare variable servicocompvalorisentoicm numeric(11,2);
declare variable servicocompvaloroutrasicm numeric(11,2);
declare variable diferenca numeric(11,2);
declare variable flagtipodiferenca smallint;
declare variable diferencaproduto numeric(11,2);
declare variable flagtipodiferencaproduto smallint;
declare variable diferencaservico numeric(11,2);
declare variable flagtipodiferencaservico smallint;
declare variable contador smallint;
declare variable valorbasepiscofins numeric(11,2);
declare variable aliqpis numeric(4,2);
declare variable aliqcofins numeric(4,2);
declare variable valorunitario numeric(13,4);
declare variable flagdeduzirdespnaoinclnamargem smallint;
declare variable valordescontoaux numeric(11,2);
declare variable partiporeducaoicm integer;
declare variable valorprodutostributados numeric(11,2);
declare variable maioraliqipi numeric(4,2);
declare variable perreducaoicm numeric(5,2);
declare variable numcsticm varchar(3);
declare variable numcstipi varchar(2);
declare variable numcstpiscofins varchar(2);
declare variable numcsosn varchar(3);
declare variable natreceitapiscofins integer;
declare variable oprflagipisobrebaseicm smallint;
declare variable natbasecalccredito smallint;
declare variable indnaturezafrete smallint;
declare variable acrescimobaseipi numeric(11,2);
declare variable valorbaseipi numeric(11,2);
declare variable valorisentoipi numeric(11,2);
declare variable valoroutrasipi numeric(11,2);
declare variable aliqicmsst numeric(5,2);
declare variable percmvaicmsst numeric(5,2);
declare variable oprtipoipi integer;
begin
  /************
   VERSAO 3.00
  *************/

  --Renato - 278440   
  Select FlagDeduzirDespNaoInclNaMargem
  From ConfiguracaoSistema
  Into :FlagDeduzirDespNaoInclNaMargem;

  --Renato - 278440
  Select TipoReducaoICM
  From ParamControle where Empresa = :Empresa
  Into :ParTipoReducaoICM;

  if (TipoControle = 1) then
  begin
    FlagEntrada = 1;
  end
  else
  begin
    FlagEntrada = 0;
  end

 CodEmpMestre = 'M' || Rs_Replicate('0',6 - Rs_length(Empresa)) || cast(Empresa as varchar(2));

 select Ent.TipoPessoa
        --Ent.TipoConsideraIPICalculoICM --243556 / 248899
   from Entidades Ent
   where Ent.Codigo = :CodEntidade
  into :TipoPessoa;
       --:TipoConsideraIPICalculoICM; --243556 / 248899

 --Gabriella - 256424
 Select FlagIPISobreBaseICM
 From Operacoes
 Where Codigo = :CodOperacao
 into :oprflagipisobrebaseicm;

--243556
--if (TipoPessoa <> 'J') then

--Gabriella - 256424
--248899
-- if ( ((TipoConsideraIPICalculoICM = 0) and (TipoPessoa <> 'J')) or
--      (TipoConsideraIPICalculoICM = 1) ) then
--    ValorContabilNota = ValorContabilNota + ValorIPINota;
--  if ((TipoPessoa <> 'J') and (TipoPessoa <> 'I'))  then
  if (((TipoPessoa <> 'J') and (TipoPessoa <> 'I')) or (:oprflagipisobrebaseicm = 1)) then
    ValorContabilNota = ValorContabilNota + ValorIPINota;
  
--Considera as despesas sobre IPI quando está marcado na operação fiscal  
--Gabriella - 333391
--ValorIPIDespesas = 0;
acrescimobaseipi = 0;

/*Karina - 147820*/
--306221 if (VALORIPINOTA <> 0) then
--306221 begin
  -- Rafael chamado 281202
  --select Rs_RoundDec((coalesce(max(T.AliqIPI),0) * :NotaValorDespesas) /100,2)
/*  Select
   coalesce(Sum(Case When T.AliqIpi <> 0 then T.ValorTotal end),0),
   coalesce(Max(T.AliqIPI),0)
 
    from TempPrce050Itens T
    left join Operacoes O on O.Codigo = :CodOperacao
  where T.Empresa = :Empresa
    and T.TipoControle = :TipoControle
    and T.CodControle = :CodControle
    and T.Status <> 'E'
    and T.Status <> 'L'
    and T.CodProduto <> 8888888
    --MARCELO - CHAMADO 187905
    and T.QuantAtendida > 0
    and O.FlagDespesasIPI = 1
  -- Rafael chamado 281202
  --into :ValorIPIDespesas;
  into :valorprodutostributados,:maioraliqipi;

--306221 end


--Rafael chamado 281202
if (notavalorprodutos > 0 ) then
  ValorIPIDespesas = Rs_RoundDec((ValorProdutosTributados/notavalorprodutos * (ValorIPIDespesas)) * (maioraliqipi / 100),2);
else
  ValorIPIDespesas =0;

  
if (ValorIPIDespesas is null) then
  ValorIPIDespesas = 0; */

 -- Cria um cursor para atualizar o ICM dos itens da nota
 for
   select Cast(0 as smallint) , T.NumLancamento, T.SeqTemporaria, Cast(0 as smallint),
          T.CodProduto, T.CodTributacao,
          -- Renato - 321936 - Notas de Frete é considerado o valor unitario do item
          Case When (:ModeloDocumento in ('07', '08', '8B', '09', '10', '11', '26', '27', '57')) and
                    (T.ValorTotal = 0) then T.ValorUnitario else T.ValorTotal end as ValorTotal,
          T.AliqIPI, T.CodClassFiscal, T.CodListaPreco, T.AliqICM, O.FlagSubTribDespesas,
          T.PerRedBaseSubTrib, O.FlagDespesasIPI, T.CodSubTributaria, Sub.FlagSomaDespesas,
          T.ValorCustoFor, T.QuantAtendida,
          -- Renato - 278440
          T.ValorUnitario,
          --Gabriella - 360317
          O.TipoIPI

     from TempPrce050Itens T
     left join Operacoes O on O.Codigo = :CodOperacao
     left join SubstituicaoTributaria Sub on Sub.CodSubTributaria = T.CodSubTributaria      
                                         and Sub.Empresa = T.Empresa      
     where T.Empresa = :Empresa
       and T.TipoControle = :TipoControle
       and T.CodControle = :CodControle
       and T.Status <> 'E'
       and T.Status <> 'L'
   union
   select Cast(1 as smallint), TComp.NumLancamento, TComp.SeqTemporaria, TComp.NumSequencia,
          TComp.CodProduto, TComp.CodTributacao, TComp.ValorTotal, TComp.AliqIPI,
          TComp.CodClassFiscal, TComp.CodListaPreco, TComp.AliqICM, O.FlagSubTribDespesas,
          TComp.PerRedBaseSubTrib, O.FlagDespesasIPI, TComp.CodSubTributaria, Sub.FlagSomaDespesas,
          TComp.ValorCustoFor, TComp.QuantAtendida,
          -- Renato - 278440
          TComp.ValorUnitario,
          --Gabriella - 360317
          O.TipoIPI
     from TempPrce050Componentes TComp
     left join Operacoes O on O.Codigo = :CodOperacao
     left join SubstituicaoTributaria Sub on Sub.CodSubTributaria = TComp.CodSubTributaria
                                         and Sub.Empresa = TComp.Empresa
     where TComp.Empresa = :Empresa
       and TComp.TipoControle = :TipoControle
       and TComp.CodControle = :CodControle
       and TComp.Status <> 'E'

    into :TipoItem, :NumLancamento, :SeqTemporaria, :NumSequenciaComp,
         :CodProduto, :CodTributacao, :ValorTotal, :AliqIPI,
         :CodClassFiscal, :CodListaPreco, :TempAliqICM, :FlagSubTribDespesas,
         :AuxPerRedBaseSubTrib, :FlagDespesasIPI, :CodSubTributaria, :SubFlagSomaDespesas,
         :ValorCustoFor, :QuantAtendida,
         -- Renato - 278440
         :ValorUnitario,
         --Gabriella - 360317
         :OprTipoIpi
    do
      begin
        AcrescimoBaseICM = 0;
        AcrescimoBaseSubTrib = 0;
        AcrescimoRedVenda = 0;
        -- Renato - 278440 
        -- AcrescimoRedCusto = 0;
        PerRedDespesa = 0;

        /*Karina - 147820*/
--306221         if (VALORIPINOTA = 0) then
--306221           AliqIPI = 0;

        --Eder - Chamado 170325
        --Calcula o percentual de acrescimo no custo
        --If ((ValorCustoFor > 0) and (NotaValorDespesasNaoInc > 0) and ((NotaValorProdutos + NotaValorServicos) > 0) and (QuantAtendida > 0)) then
        --begin
        --  AcrescimoRedCusto = ((NotaValorDespesasNaoInc * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorCustoFor;
        --end
        if ((FlagDeduzirDespNaoInclNaMargem = 1) and (ParTipoReducaoICM <> 2)) then
          ValorDescontoAux = NotaValorDesconto;
        else
          ValorDescontoAux = 0;
        /* 298865
        If ((ValorUnitario > 0) and ((NotaValorDespesasNaoInc > 0) or (ValorDescontoAux > 0)) and ((NotaValorProdutos + NotaValorServicos) > 0)  and (QuantAtendida > 0)) then
        begin         
          PerRedDespesa = (( (NotaValorDespesasNaoInc + ValorDescontoAux) * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorUnitario;
        end
        */
        If (((NotaValorDespesasNaoInc > 0) or (ValorDescontoAux > 0)) and ((NotaValorProdutos + NotaValorServicos) > 0)  and (QuantAtendida > 0)) then
        begin

          if ((FlagDeduzirDespNaoInclNaMargem = 1) and (ValorUnitario > 0)) then
            PerRedDespesa = (( (NotaValorDespesasNaoInc + ValorDescontoAux) * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorUnitario;

          else if ((FlagDeduzirDespNaoInclNaMargem = 0) and (ValorCustoFor > 0)) then
            PerRedDespesa = (( NotaValorDespesasNaoInc * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorCustoFor;
        end

        if ((CodProduto <> 8888888) and (NotaValorProdutos > 0)) then
        begin
          --Gabriella - 333391
          if ((FlagDespesasIPI = 1) and (aliqipi > 0)) then
            AcrescimoBaseIPI = cast(ValorTotal as numeric(18,9)) / NotaValorProdutos * (NotaValorDespesas);
          --Gabriella - 360317
          else if ((AliqIPI = 0) and (OprTipoIPI = 0)) then
            AcrescimoBaseIPI = cast(ValorTotal as numeric(18,9)) / NotaValorProdutos * (0 - NotaValorDesconto);
          else
            AcrescimoBaseIPI = 0;
                                                                                                                                                                    
          If (AcrescimoBaseIPI is null) then
            AcrescimoBaseIPI = 0;

          AcrescimoBaseICM = (NotaValorDespesas - NotaValorDesconto) * (cast(ValorTotal as numeric(18,9)) / NotaValorProdutos);
          AcrescimoBaseSubTrib = 0;
          if (((FlagSubTribDespesas = 1) and (CodSubTributaria = 0)) or
              ((SubFlagSomaDespesas = 1) and (CodSubTributaria > 0))) then
             AcrescimoBaseSubTrib = NotaValorDespesas;

          /*Ronaldo Chamado 358571
          --Gabriella - 298263      
          if ((FlagDespesasIPI = 1) and (AliqIPI > 0)) then
          begin
            --Gabriella - 333391
            --AcrescimoBaseSubTrib = AcrescimoBaseSubTrib + ValorIPIDespesas;
            AcrescimoBaseSubTrib = AcrescimoBaseSubTrib + ((AcrescimoBaseIPI * aliqipi) / 100);
            --Eder - Chamado 174565
            --ValorIPIDespesas = 0;
          end*/

          AcrescimoBaseSubTrib = (AcrescimoBaseSubTrib - NotaValorDesconto) * (ValorTotal / NotaValorProdutos);

          AcrescimoRedVenda = NotaValorDespesasVenda * (ValorTotal / NotaValorProdutos);
        end
        if ((CodProduto = 8888888) and (NotaValorServicos > 0)) then
        begin
          if (NotaValorProdutos > 0) then
             AcrescimoBaseICM = (NotaValorDescontoServicos * -1) * (ValorTotal / NotaValorServicos);
          else
             AcrescimoBaseICM = (NotaValorDespesas - NotaValorDescontoServicos) * (ValorTotal / NotaValorServicos);
          AcrescimoBaseSubTrib = 0;
          AcrescimoRedVenda = 0;
        end

        if (FlagAlteraAliquota = 1) then
          TempAliqICM = 0;

         select AliqICM, ValorBaseICM,
           ValorICM, ValorIsentoICM, ValorOutrasICM,
           ValorBaseSubTrib, ValorSubTrib, PerRedBaseSubTrib,
           FatorRedCusto, FatorRedVenda, NumCFOP,
           ValorBaseSubTribCarga, ValorSubTribCarga,
           AliqPISCOFINS,
           -- Renato - Chamado 272165
           ValorBasePisCofins, AliqPis, AliqCofins,
           --Gabriella - 284639
           PerReducaoICM, NumCstICM, NumCstIPI, NumCstPisCofins, NumCsosn,
           -- Renato - 297792
           NatReceitaPisCofins,
           -- Renato - 332318
           NatBaseCalcCredito,
           IndNaturezaFrete,
           --Gabriella - 333391
           ValorBaseIPI,
           ValorIsentoIPI,
           ValorOutrasIPI,
           --Renato - 360358
           AliqICMSST,
           PercMvaICMSST
         from Calcular_ICM(:Empresa, :CodProduto, :CodTributacao, :CodEntidade,
                           :CodOperacao, :ValorTotal, :AcrescimoBaseICM, :AcrescimoBaseSubTrib, :AuxPerRedBaseSubTrib,
                           :AliqIPI, :CodClassFiscal, :FlagEntrada,:AcrescimoRedVenda,
                           :CodListaPreco, :TempAliqICM, :CodSubTributaria, :PerRedDespesa, :acrescimobaseipi)
         into :AliqICM, :ValorBaseICM,
              :ValorICM, :ValorIsentoICM, :ValorOutrasICM,
              :ValorBaseSubTrib, :ValorSubTrib, :PerRedBaseSubTrib,
              :FatorRedCusto, :FatorRedVenda, :NumCFOP,
              :ValorBaseSubTribCarga, :ValorSubTribCarga,
              :AliqPISCOFINS,
              -- Renato - Chamado 272165
              :ValorBasePisCofins, :AliqPis, :AliqCofins,
              --Gabriella - 284639
              :PerReducaoICM, :NumCstICM, :NumCstIPI, :NumCstPisCofins, :NumCsosn,
              -- Renato - 297792
              :NatReceitaPisCofins,
              -- Renato - 332318
              :NatBaseCalcCredito,
              :IndNaturezaFrete,
              --Gabriella - 333391
              :ValorBaseIPI,
              :ValorIsentoIPI,
              :ValorOutrasIPI,
              --Renato - 360358
              :AliqICMSST,
              :PercMvaICMSST;

        if (TipoItem = 0) then
        begin
          update TempPrce050Itens
             set ValorBaseICM=:ValorBaseICM,
                 ValorIsentoICM=:ValorIsentoICM,
                 ValorOutrasICM=:ValorOutrasICM,
--MARCELO - CHAMADO 195051
--                 ValorBaseSubTrib=case when :ValorBaseSubTrib > 0 then Coalesce(:ValorBaseSubTrib,0)
--                                       else Coalesce(:ValorBaseSubTribCarga,0) end,
--                 ValorSubTrib=case when :ValorSubTrib > 0 then Coalesce(:ValorSubTrib,0)
--                                   else Coalesce(:ValorSubTribCarga,0) end,
                 ValorBaseSubTrib = Coalesce(:ValorBaseSubTrib,0),
                 ValorSubTrib = Coalesce(:ValorSubTrib,0),
                 ValorBaseSubTribCarga = Coalesce(:ValorBaseSubTribCarga,0),
                 ValorSubTribCarga = Coalesce(:ValorSubTribCarga,0),
                 PerRedBaseSubTrib=:PerRedBaseSubTrib,
                 FatorRedCusto=:FatorRedCusto,
                 FatorRedVenda=:FatorRedVenda,
                 NumCFOP=case :FlagAlterarCFOP when 1 then :NumCFOP else NumCFOP end,
                 AliqICM=case :FlagAlteraALiquota when 1 then :AliqICM else AliqICM end,
                 -- Renato - 283226
                 -- AliqPISCOFINS = :ALIQPISCOFINS,
                 AliqPISCOFINS= Case :FlagAlterarCFOP when 1 then :ALIQPISCOFINS else AliqPISCOFINS end,

                 -- Renato - Chamado 272165
                 ValorBasePisCofins = :ValorBasePisCofins,
                 AliqPis = :AliqPis,
                 AliqCofins = :AliqCofins,
                 --Gabriella - 284639
                 PerReducaoICM = :PerReducaoICM,
                 NumCstICM = :NumCstICM,
                 NumCstIPI = :NumCstIPI,
                 NumCstPisCofins = :NumCstPisCofins,
                 NumCsosn = :NumCsosn,
                 --Renato - 297792
                 NatReceitaPisCofins = :NatReceitaPisCofins,
                 --Renato - 332318  
                 NatBaseCalcCredito = :NatBaseCalcCredito,
                 IndNaturezaFrete = :IndNaturezaFrete,
                 --Gabriella - 333391
                 ValorBaseIPI = :ValorBaseIPI,
                 ValorIsentoIPI = :ValorIsentoIPI,
                 ValorOutrasIPI = :ValorOutrasIPI,
                 --Renato - 360358
                 AliqICMSST = :AliqICMSST,
                 PercMvaICMSST = :PercMvaICMSST
           where Empresa=:Empresa
             and TipoControle=:TipoControle
             and CodControle=:CodControle
             and NumLancamento=:NumLancamento
             and SeqTemporaria=:SeqTemporaria;
        end
        else
        begin
          update TempPrce050Componentes
             set ValorBaseICM=:ValorBaseICM,
                 ValorIsentoICM=:ValorIsentoICM,
                 ValorOutrasICM=:ValorOutrasICM,
--MARCELO - CHAMADO 195051
--                 ValorBaseSubTrib=case when :ValorBaseSubTrib > 0 then Coalesce(:ValorBaseSubTrib,0)
--                                       else Coalesce(:ValorBaseSubTribCarga,0) end,
--                 ValorSubTrib=case when :ValorSubTrib > 0 then Coalesce(:ValorSubTrib,0)
--                                   else Coalesce(:ValorSubTribCarga,0) end,
                 ValorBaseSubTrib = Coalesce(:ValorBaseSubTrib,0),
                 ValorSubTrib = Coalesce(:ValorSubTrib,0),
                 ValorBaseSubTribCarga = Coalesce(:ValorBaseSubTribCarga,0),
                 ValorSubTribCarga = Coalesce(:ValorSubTribCarga,0),
                 PerRedBaseSubTrib=:PerRedBaseSubTrib,
                 FatorRedCusto=:FatorRedCusto,
                 FatorRedVenda=:FatorRedVenda,
                 NumCFOP=case :FlagAlterarCFOP when 1 then :NumCFOP else NumCFOP end,
                 AliqICM=case :FlagAlteraALiquota when 1 then :AliqICM else AliqICM end,
                 --Gabriella - 284639
                 PerReducaoICM = :PerReducaoICM,
                 NumCstICM = :NumCstICM,
                 NumCstIPI = :NumCstIPI,
                 NumCstPisCofins = :NumCstPisCofins,
                 NumCsosn = :NumCsosn,
                 --Renato - 297792
                 NatReceitaPisCofins = :NatReceitaPisCofins,
                 --Renato - 332318  
                 NatBaseCalcCredito = :NatBaseCalcCredito,
                 --Gabriella - 333391
                 ValorBaseIPI = :ValorBaseIPI,
                 ValorIsentoIPI = :ValorIsentoIPI,
                 ValorOutrasIPI = :ValorOutrasIPI,
                 --Renato - 360358
                 AliqICMSST = :AliqICMSST,
                 PercMvaICMSST = :PercMvaICMSST
           where Empresa=:Empresa
             and TipoControle=:TipoControle
             and CodControle=:CodControle
             and NumLancamento=:NumLancamento
             and SeqTemporaria=:SeqTemporaria
             and NumSequencia=:NumSequenciaComp;
        end

     end

TipoItem = 0;
ValorBaseICM = 0;
ValorIsentoICM = 0;
ValorOutrasICM = 0;
CompValorBaseICM = 0;
CompValorIsentoICM = 0;
CompValorOutrasICM = 0;
--MARCELO - CHAMADO 195091
ServicoValorBaseICM = 0;
ServicoValorIsentoICM = 0;
ServicoValorOutrasICM = 0;
ServicoCompValorBaseICM = 0;
ServicoCompValorIsentoICM = 0;
ServicoCompValorOutrasICM = 0;

--MARCELO - CHAMADO 195091
select
  sum(case when CodProduto <> 8888888
           then Cast(ValorBaseICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end),
  sum(case when CodProduto <> 8888888
           then Cast(ValorIsentoICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end),
  sum(case when CodProduto <> 8888888
           then Cast(ValorOutrasICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end),
  sum(case when CodProduto = 8888888
           then Cast(ValorBaseICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end),
  sum(case when CodProduto = 8888888
           then Cast(ValorIsentoICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end),
  sum(case when CodProduto = 8888888
           then Cast(ValorOutrasICM as numeric(11,2))
           else Cast(0.00 as numeric(11,2)) end)
from TempPrce050Itens T
where Empresa = :Empresa
  and TipoControle = :TipoControle
  and CodControle = :CodControle
--MARCELO - CHAMADO 195091
--  and CodProduto <> 8888888
  and Status <> 'E'
  and Status <> 'L'
  and not exists (Select * From TempPRCE050Componentes TComp
                  Where TComp.Empresa = T.Empresa
                    and TComp.NumLancamento = T.NumLancamento
                    and TComp.SeqTemporaria = T.SeqTemporaria
                    and TComp.TipoControle = T.TipoControle
                    and TComp.CodControle = T.CodControle)
into
  :ValorBaseICM,
  :ValorIsentoICM,
  :ValorOutrasICM,
--MARCELO - CHAMADO 195091
  :ServicoValorBaseICM,
  :ServicoValorIsentoICM,
  :ServicoValorOutrasICM;

if (ValorBaseICM is null) then
begin
  ValorBaseICM = 0;
  ValorIsentoICM = 0;
  ValorOutrasICM = 0;
  TipoItem = 0;
end

--MARCELO - CHAMADO 195091
if (ServicoValorBaseICM is null) then
begin
  ServicoValorBaseICM = 0;
  ServicoValorIsentoICM = 0;
  ServicoValorOutrasICM = 0;
end

--MARCELO - CHAMADO 195091
select
  sum(case when CodProduto <> 8888888 then ValorBaseICM else 0 end),
  sum(case when CodProduto <> 8888888 then ValorIsentoICM else 0 end),
  sum(case when CodProduto <> 8888888 then ValorOutrasICM else 0 end),
  1,
  sum(case when CodProduto = 8888888 then ValorBaseICM else 0 end),
  sum(case when CodProduto = 8888888 then ValorIsentoICM else 0 end),
  sum(case when CodProduto = 8888888 then ValorOutrasICM else 0 end)
from TempPrce050Componentes TComp
where Empresa = :Empresa
  and TipoControle = :TipoControle
  and CodControle = :CodControle
  and Status <> 'E'
into
  :CompValorBaseICM,
  :CompValorIsentoICM,
  :CompValorOutrasICM,
  :TipoItem,
--MARCELO - CHAMADO 195091
  :ServicoCompValorBaseICM,
  :ServicoCompValorIsentoICM,
  :ServicoCompValorOutrasICM;

if (CompValorBaseICM is not null) then
begin
  ValorBaseICM = ValorBaseICM + CompValorBaseICM;
  ValorIsentoICM = ValorIsentoICM + CompValorIsentoICM;
  ValorOutrasICM = ValorOutrasICM + CompValorOutrasICM;
end
else
  TipoItem = 0;

--MARCELO - CHAMADO 195091
if (ServicoCompValorBaseICM is not null) then
begin
  ServicoValorBaseICM = ServicoValorBaseICM + ServicoCompValorBaseICM;
  ServicoValorIsentoICM = ServicoValorIsentoICM + ServicoCompValorIsentoICM;
  ServicoValorOutrasICM = ServicoValorOutrasICM + ServicoCompValorOutrasICM;
end
else
  TipoItem = 0;

--MARCELO - CHAMADO 195091
ValorContabilNotaServico = (ValorContabilNota + NotaValorDesconto) - NotaValorProdutos;
ValorContabilNotaServico = ValorContabilNotaServico + (NotaValorServicos - NotaValorDescontoServicos);
-- 321475
if (notavalorprodutos > 0 ) then
  ValorContabilNotaServico = ValorContabilNotaServico - notavalordespesas;
--MARCELO - CHAMADO 195091
Diferenca         = 0;
FlagTipoDiferenca = 0;
DiferencaProduto         = 0;
FlagTipoDiferencaProduto = 0;
DiferencaServico         = 0;
FlagTipoDiferencaServico = 0;

--MARCELO - CHAMADO 195091
if ((ValorContabilNota <> (ValorBaseICM + ValorIsentoICM + ValorOutrasICM))
    and (NotaValorProdutos > 0)) then
begin
  FlagTipoDiferencaProduto = 1;
  DiferencaProduto = ValorContabilNota - (ValorBaseICM + ValorIsentoICM + ValorOutrasICM);
end

if ((ValorContabilNotaServico <> (ServicoValorBaseICM + ServicoValorIsentoICM + ServicoValorOutrasICM))
    and (NotaValorServicos > 0)) then
begin
  FlagTipoDiferencaServico = 2;
  DiferencaServico = ValorContabilNotaServico - (ServicoValorBaseICM + ServicoValorIsentoICM + ServicoValorOutrasICM);
end

--MARCELO - CHAMADO 195091
Contador = 1;
while (Contador <= 2) do
begin
  if (Contador = 1) then
  begin
    Diferenca = DiferencaProduto;
    FlagTipoDiferenca = FlagTipoDiferencaProduto;
  end
  if (Contador = 2) then
  begin
    Diferenca = DiferencaServico;
    FlagTipoDiferenca = FlagTipoDiferencaServico;
  end

  if (Diferenca <> 0) then
  begin
    if (TipoItem = 0) then
    begin
      select first 1 NumLancamento, SeqTemporaria
      from TempPrce050Itens
      where Empresa = :Empresa
        and TipoControle = :TipoControle
        and CodControle = :CodControle
--MARCELO - CHAMADO 195091
        and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                 When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                 Else 0
            End = 1
        and Status <> 'E'
        and Status <> 'L'
        and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
      order by SeqTemporaria, NumLancamento
      into :NumLancamento, :SeqTemporaria;

      if (NumLancamento is not null) then
      begin
--MARCELO - CHAMADO 195091
        update TempPrce050Itens set
          ValorBaseICM = case when ValorBaseICM <> 0
                              then ValorBaseICM + :Diferenca
                              else ValorBaseICM end,
          ValorIsentoICM = case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                then ValorIsentoICM + :Diferenca
                                else ValorISentoICM end,
          ValorOutrasICM = case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                then ValorOutrasICM + :Diferenca
                                else ValorOutrasICM end
        where Empresa = :Empresa
          and TipoControle = :TipoControle
          and CodControle = :CodControle
          and NumLancamento = :NumLancamento
          and SeqTemporaria = :SeqTemporaria;
      end
    end
    else
    begin
      select first 1 NumLancamento, SeqTemporaria, NumSequencia
      from TempPrce050Componentes
      where Empresa = :Empresa
        and TipoControle = :TipoControle
        and CodControle = :CodControle
--MARCELO - CHAMADO 195091
        and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                 When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                 Else 0
            End = 1
        and Status <> 'E'
        and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
      order by SeqTemporaria, NumLancamento, NumSequencia
      into :NumLancamento, :SeqTemporaria, :NumSequenciaComp;

      if (NumLancamento is not null) then
      begin
--MARCELO - CHAMADO 195091
        update TempPrce050Componentes set
          ValorBaseICM = case when ValorBaseICM <> 0
                              then ValorBaseICM + :Diferenca
                              else ValorBaseICM end,
          ValorIsentoICM = case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                then ValorIsentoICM + :Diferenca
                                else ValorISentoICM end,
          ValorOutrasICM = case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                then ValorOutrasICM + :Diferenca
                                else ValorOutrasICM end
        where Empresa = :Empresa
          and TipoControle = :TipoControle
          and CodControle = :CodControle
          and NumLancamento = :NumLancamento
          and SeqTemporaria = :SeqTemporaria
          and NumSequencia = :numSequenciaComp;
      end
    end
  end

  Contador = Contador + 1;
end
    if (FlagSelectBaseICM = 1) then
      ValorBaseICM = ValorBaseICM + (ValorContabilNota - (ValorBaseICM + ValorIsentoICM + ValorOutrasICM));
/*175203 e 192734*/
  Suspend;
END
^

CREATE OR ALTER PROCEDURE STORED_PRFT110GERANOTA (
    ped_sequencia integer,
    empresa integer,
    tipocontrole integer,
    codcontrole integer,
    contadornota integer)
as
declare variable somaicmprodutos numeric(11,2);
declare variable somaicmservicos numeric(11,2);
declare variable somacontabilnotaprodutos numeric(11,2);
declare variable somacontabilnotaservicos numeric(11,2);
declare variable compsomaicmprodutos numeric(11,2);
declare variable compsomaicmservicos numeric(11,2);
declare variable flagentrada integer;
declare variable codoperacao integer;
declare variable existe integer;
declare variable auxtipoitem integer;
declare variable auxnumsequencia integer;
declare variable auxempresa integer;
declare variable auxnumlancamento integer;
declare variable auxcodproduto integer;
declare variable auxaliqicm numeric(4,2);
declare variable auxbaseicm numeric(11,2);
declare variable auxvaloricm numeric(11,2);
declare variable auxvalorisentoicm numeric(11,2);
declare variable auxvaloroutrasicm numeric(11,2);
declare variable auxperreducaoicm numeric(11,2);
declare variable auxbasesubtrib numeric(11,2);
declare variable auxvalorsubtrib numeric(11,2);
declare variable auxbasesubtribcarga numeric(11,2);
declare variable auxvalorsubtribcarga numeric(11,2);
declare variable auxacrescimobaseicm numeric(13,4);
declare variable auxacrescimobasesubtrib numeric(11,2);
declare variable auxacrescimoredvenda numeric(11,2);
declare variable auxperreddespesa numeric(15,8);
declare variable auxfatorredcusto numeric(15,8);
declare variable auxfatorredvenda numeric(7,4);
declare variable auxcodtributacao char(5);
declare variable auxcodentidade char(7);
declare variable auxcodclassfiscal varchar(15);
declare variable auxvalortotal numeric(11,2);
declare variable auxaliqipi numeric(4,2);
declare variable auxnumcfop char(10);
declare variable auxcodlistapreco integer;
declare variable auxvalorcustofor numeric(13,4);
declare variable auxquantatendida numeric(10,3);
declare variable valorprodutostotal numeric(11,2);
declare variable valorservicostotal numeric(11,2);
declare variable valorprodutosnota numeric(11,2);
declare variable valorservicosnota numeric(11,2);
declare variable valordesconto numeric(11,2);
declare variable valordescontoservicos numeric(11,2);
declare variable valorfrete numeric(11,2);
declare variable valorseguro numeric(11,2);
declare variable valordespesas numeric(11,2);
declare variable valortotalretencoes numeric(11,2);
declare variable valortotalretencoesiss numeric(11,2);
declare variable valortotalretencoesicm numeric(11,2);
declare variable valorcomplementar numeric(11,2);
declare variable sumvalorprodutos numeric(11,2);
declare variable sumvalorbaseicm numeric(11,2);
declare variable sumvaloripi numeric(11,2);
declare variable sumvaloricm numeric(11,2);
declare variable sumvalorsubtrib numeric(11,2);
declare variable sumvalorbasesubtrib numeric(11,2);
declare variable sumvalorsubtribcarga numeric(11,2);
declare variable sumvalorbasesubtribcarga numeric(11,2);
declare variable sumvalorservicos numeric(11,2);
declare variable sumvalordesconto numeric(11,2);
declare variable sumvalordescontoservicos numeric(11,2);
declare variable sumvalorfrete numeric(11,2);
declare variable sumvalorseguro numeric(11,2);
declare variable sumvalordespesas numeric(11,2);
declare variable sumvalordespesasnaoinc numeric(11,2);
declare variable sumvalorfretetransp numeric(11,2);
declare variable sumvalorbaseiss numeric(11,2);
declare variable sumvalorprodutossemimpostos numeric(11,2);
declare variable auxsumvalorprodutos numeric(11,2);
declare variable auxsumvalorbaseicm numeric(11,2);
declare variable auxsumvaloripi numeric(11,2);
declare variable auxsumvaloricm numeric(11,2);
declare variable auxsumvalorsubtrib numeric(11,2);
declare variable auxsumvalorbasesubtrib numeric(11,2);
declare variable auxsumvalorsubtribcarga numeric(11,2);
declare variable auxsumvalorbasesubtribcarga numeric(11,2);
declare variable auxsumvalorservicos numeric(11,2);
declare variable auxsumvalorbaseiss numeric(11,2);
declare variable auxsumvalorprodutossemimpostos numeric(11,2);
declare variable valordespesasnaoinc numeric(11,2);
declare variable valorfretetransp numeric(11,2);
declare variable sumvalortotalretencoes numeric(11,2);
declare variable sumvalorcomplementar numeric(11,2);
declare variable flagsubtribdespesas integer;
declare variable codsubtributaria integer;
declare variable subflagsomadespesas integer;
declare variable flagdespesasipi integer;
declare variable diferenca numeric(11,2);
declare variable flagtipodiferenca smallint;
declare variable diferencaproduto numeric(11,2);
declare variable flagtipodiferencaproduto smallint;
declare variable diferencaservico numeric(11,2);
declare variable flagtipodiferencaservico smallint;
declare variable contador smallint;
declare variable valorbasepiscofins numeric(11,2);
declare variable aliqpis numeric(4,2);
declare variable aliqcofins numeric(4,2);
declare variable auxvalorunitario numeric(13,4);
declare variable numcsticm varchar(3);
declare variable numcstipi varchar(2);
declare variable numcstpiscofins varchar(2);
declare variable numcsosn varchar(3);
declare variable flagdeduzirdespnaoinclnamargem smallint;
declare variable valordescontoaux numeric(11,2);
declare variable partiporeducaoicm integer;
declare variable maioraliqipi numeric(4,2);
declare variable valorprodutostributados numeric(11,2);
declare variable proporcaovalorprodutostributados numeric(18,6);
declare variable natreceitapiscofins integer;
declare variable natbasecalccredito smallint;
declare variable auxacrescimobaseipi numeric(11,2);
declare variable auxvalorbaseipi numeric(11,2);
declare variable auxvalorisentoipi numeric(11,2);
declare variable auxvaloroutrasipi numeric(11,2);
declare variable aliqicmsst numeric(5,2);
declare variable percmvaicmsst numeric(5,2);
declare variable oprtipoipi integer;
begin
/**********************  
VERSÃO 3.00
**********************/  
--MARCELO - CHAMADO 195051
--SomaBaseSubTribCarga=0;
--SomaSubTribCarga=0;

--Renato - 278440   
Select FlagDeduzirDespNaoInclNaMargem
From ConfiguracaoSistema
Into :FlagDeduzirDespNaoInclNaMargem;

--Renato - 278440  
Select TipoReducaoICM
From ParamControle where Empresa = :Empresa
Into :ParTipoReducaoICM;

if (TipoControle=1) then
begin
  FlagEntrada = 1;
end
else
  FlagEntrada = 0;

Select Oper.FlagSubTribDespesas
  From NotasFiscais Nota          
  Left Join Operacoes Oper on Oper.Codigo = Nota.CodOperacao          
Where Nota.Empresa = :Empresa
  and Nota.TipoControle = :TipoControle
  and Nota.CodControle = :CodControle
Into :FlagSubTribDespesas;
If (FlagSubTribDespesas is null) then
  FlagSubTribDespesas = 0;

select coalesce(sum(Ped.ValorProdutos),0), coalesce(sum(Ped.ValorServicos),0), coalesce(sum(Ped.ValorDesconto),0), coalesce(sum(Ped.ValorDescontoServicos),0),
       coalesce(sum(Ped.ValorFrete),0), coalesce(sum(Ped.ValorSeguro),0), coalesce(sum(Ped.ValorDespesas),0),
       coalesce(sum(Ped.ValorDespesasNaoInc),0), coalesce(sum(Ped.ValorFreteTransp),0),
       --327726
       --coalesce(sum(Ped.ValorTotalRetencoes),0), coalesce(sum(Ped.VAlorComplementar),0)
       coalesce(sum(Ped.VAlorComplementar),0)
  from TempPrft110Pedido Temp, Pedidos Ped
 where Temp.NumSequencia = :Ped_Sequencia
   and Ped.Empresa = Temp.Empresa
   and Ped.CodPedido = Temp.CodPedido
 into :ValorProdutosTotal, :ValorServicosTotal,:ValorDesconto, :ValorDescontoServicos,
      :ValorFrete, :ValorSeguro, :ValorDespesas,
      :ValorDespesasNaoInc, :ValorFreteTransp,
      --327726
      --:ValorTotalRetencoes, :ValorComplementar;
      :ValorComplementar;


  
--327726   
  Select                    
   coalesce(Sum( Case when PR.TipoRetencao in(0,1,2,3,4)
                      Then PR.ValorRetencao end ),0),
         
   coalesce(Sum(Case When PR.TipoRetencao = 5
                     Then PR.ValorRetencao end),0),
                                   
   coalesce(Sum(Case when PR.TipoRetencao = 6
                                           Then PR.ValorRetencao end ),0)                                   
                                          
  From TempPrft110Pedido T  
  Left join Pedidos P on  P.Empresa   =T.Empresa  
                      and P.CodPedido = T.CodPedido  
  Left Join PedidosRetencao PR on  PR.Empresa   = T.Empresa  
                               and PR.CodPedido = T.CodPedido                                                    
 Where T.NumSequencia = :Ped_Sequencia
 into :ValorTotalRetencoes,:valortotalretencoesiss,
      :valortotalretencoesicm;






--Gabriella - 333391
AuxAcrescimoBaseIPI = 0;
/*
ValorIPIDespesas = 0;
--Rafael chamado 281202
--Select Rs_RoundDec((coalesce(Max(M.AliqIPI),0) * (:ValorFrete + :ValorSeguro + :ValorDespesas)) /100.00,2)
Select
coalesce(Sum(Case When M.AliqIpi <> 0 then M.ValorTotal  end),0),
coalesce(Max(M.AliqIPI),0)
from MovEstoque M
Left Join Operacoes O on O.Codigo = M.CodOperacao  
where M.Empresa = :Empresa
  and M.TipoControle = :TipoControle
  and M.CodControle = :CodControle
  and M.CodProduto <> 8888888    
  --MARCELO - CHAMADO 187905
  and M.QuantAtendida > 0
  and O.FlagDespesasIPI = 1    
--Rafael chamado 281202
--Into :ValorIPIDespesas;
into valorprodutostributados,maioraliqipi ;


--Rafael chamado 281202
  if (ValorProdutosTotal > 0 ) then
  begin
    proporcaovalorprodutostributados = ValorProdutosTributados / ValorProdutosTotal;
    ValorIPIDespesas =  rs_rounddec( proporcaovalorprodutostributados * (ValorFrete + ValorSeguro + ValorDespesas) * (maioraliqipi / 100.00) ,2);
  end
  else
    ValorIPIDespesas = 0;
  
  
If (ValorIPIDespesas is null) then
  ValorIPIDespesas = 0;    */


/*-- Atualizacao o Icm dos itens da Nota Fiscal*/
for
/*     --Itens da nota fiscal, não carrega os itens que são "pai" dos componentes*/
     Select Cast(0 as integer) as TipoItem, Cast(Mov.NumLancamento as Integer), Cast(0 as integer) as NumSequencia,
            Cast(Mov.CodProduto as integer), Cast(Mov.CodTributacao as varchar(10)), Cast(Mov.CodEntidade as char(7)),
            Cast(Mov.ValorTotal as numeric (11,2)) , Cast(Mov.AliqIPI as numeric(5,2)), Cast(Mov.CodClassFiscal as varchar(20)),
            Cast(Mov.CodOperacao as integer), Cast(Mov.CodListaPreco as Integer),
            Cast(Oper.FlagDespesasIPI as Integer), Cast(Mov.CodSubTributaria as Integer), Cast(Sub.FlagSomaDespesas as Integer),
            Cast(Mov.ValorCustoFor as numeric(13,4)), Cast(Mov.QuantAtendida as numeric(10,3)),
            --Renato - 278440
            Cast(Mov.ValorUnitario as numeric(13,4)),
            --Gabriella - 360317
            Cast(Oper.TipoIPI as Integer)

      from MovEstoque Mov
      Left Join Operacoes Oper on Oper.Codigo = Mov.CodOperacao
      Left Join SubstituicaoTributaria Sub on Sub.CodSubTributaria = Mov.CodSubTributaria
                                          and Sub.Empresa = Mov.Empresa
      where Mov.Empresa      = :Empresa
        and Mov.TipoControle = :TipoControle
        and Mov.CodControle  = :CodControle

     UNION ALL

     /*--Componentes da nota fiscal*/
     Select Cast(1 as Integer) as TipoItem, Cast(Comp.NumLancamento as Integer), Cast(Comp.NumSequencia as integer) as NumSequencia,
            Cast(Comp.CodProduto as integer), Cast(Comp.CodTributacao as varchar(10)), Cast(Mov.CodEntidade as char(7)),
            Cast(Comp.ValorTotal as numeric (11,2)) , Cast(Comp.AliqIPI as numeric(5,2)), Cast(Comp.CodClassFiscal as varchar(20)),
            Cast(Mov.CodOperacao as integer), Cast(Comp.CodListaPreco as Integer),
            Cast(0 as integer), Cast(Comp.CodSubTributaria as Integer), Cast(Sub.FlagSomaDespesas as Integer),
            Cast(Comp.ValorCustoFor as numeric(13,4)), Cast(Comp.QuantAtendida as numeric(10,3)),
            --Renato - 278440
            Cast(Comp.ValorUnitario as numeric(13,4)),
            --Gabriella - 360317
            Cast(0 as Integer)

     From MovComponente Comp
     Left Join MovEstoque Mov On Mov.Empresa = Comp.Empresa
                             and Mov.NumLancamento = Comp.NumLancamento
     Left Join SubstituicaoTributaria Sub on Sub.CodSubTributaria = Comp.CodSubTributaria                
                                         and Sub.Empresa = Comp.Empresa                
     Where Comp.Empresa      = :Empresa
       and Comp.TipoControle = :TipoControle
       and Comp.CodControle  = :CodControle

     into :AuxTipoItem, AuxNumLancamento, :AuxNumSequencia,
          :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
          :AuxValorTotal, :AuxAliqIPI, :AuxCodClassFiscal,
          :CodOperacao, :AuxCodListaPreco,
          :FlagDespesasIPI, :CodSubTributaria, :SubFlagSomaDespesas,
          :AuxValorCustoFor, :AuxQuantAtendida,
          --Renato - 278440
          :AuxValorUnitario,
          --Gabriella - 360317
          :OprTipoIPI
do
begin

   AuxAcrescimoBaseICM = 0;
   AuxAcrescimoBaseSubTrib = 0;
   AuxAcrescimoRedVenda = 0;

   --Renato - 278440
   --AuxAcrescimoRedCusto = 0;
   AuxperRedDespesa = 0;

   --Renato - 278440
   --Eder - Chamado 170325
   --Calcula o percentual de acrescimo no custo
   --If ((AuxValorCustoFor > 0) and (ValorDespesasNaoInc > 0) and ((ValorProdutosTotal + ValorServicosTotal) > 0) and (AuxQuantAtendida > 0)) then
   --begin
   --  AuxAcrescimoRedCusto = ((ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   --end
   if ((FlagDeduzirDespNaoInclNaMargem = 1) and (ParTipoReducaoICM <> 2)) then
     ValorDescontoAux = ValorDesconto;
   else
     ValorDescontoAux = 0;

   /* 298865
   If ((AuxValorUnitario > 0) and ( (ValorDespesasNaoInc > 0) or (ValorDescontoAux > 0) ) and ((ValorProdutosTotal + ValorServicosTotal) > 0)  and (AuxQuantAtendida > 0)) then
   begin
     AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;
   end
   */
   If ( ((ValorDespesasNaoInc > 0) or (ValorDescontoAux > 0)) and ((ValorProdutosTotal + ValorServicosTotal) > 0)  and (AuxQuantAtendida > 0)) then
   begin
     if ((FlagDeduzirDespNaoInclNaMargem = 1) and (AuxValorUnitario > 0)) then
       AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;

     else if ((FlagDeduzirDespNaoInclNaMargem = 0) and (AuxValorCustoFor > 0)) then
       AuxPerRedDespesa = (( ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   end

   if ((AuxCodProduto <> 8888888) and (ValorProdutosTotal > 0)) then
   begin
     --Gabriella - 333391
     if ((FlagDespesasIPI = 1) and (AuxAliqIPI > 0)) then
       AuxAcrescimoBaseIPI = cast(AuxValorTotal as numeric(18,9)) / ValorProdutosTotal * (ValorFrete + ValorSeguro + ValorDespesas);
     --Gabriella - 360317
     else if ((AuxAliqIPI = 0) and (OprTipoIPI = 0)) then
       AuxAcrescimoBaseIPI = cast(AuxValorTotal as numeric(18,9)) / ValorProdutosTotal * (0 - ValorDesconto);
     else
       AuxAcrescimoBaseIPI = 0;
                                                                                                                                                                    
     If (AuxAcrescimoBaseIPI is null) then
       AuxAcrescimoBaseIPI = 0;

      AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDesconto)
                                        * (Cast(AuxValorTotal as numeric(18,9)) / ValorProdutosTotal);

      AuxAcrescimoBaseSubTrib = 0;
      If (((FlagSubTribDespesas = 1) and (CodSubTributaria = 0)) or
          ((SubFlagSomaDespesas = 1) and (CodSubTributaria > 0))) then
         AuxAcrescimoBaseSubTrib = ValorFrete + ValorSeguro + ValorDespesas;
      --Gabriella - 298263
      if ((FlagDespesasIPI = 1) and (AuxAliqIPI > 0)) then
      begin
         --Gabriella - 333391
         --AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ValorIPIDespesas;
         AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ((AuxAcrescimoBaseIPI * auxaliqipi) / 100);
--       Eder - Chamado 174565
--       ValorIPIDespesas = 0;
      end
      AuxAcrescimoBaseSubTrib = (AuxAcrescimoBaseSubTrib - ValorDesconto) * (AuxValorTotal / ValorProdutosTotal);

      AuxAcrescimoRedVenda = ValorDespesasNaoInc + ValorDesconto;
      If ((ValorFrete > 0) and (ValorFreteTransp > 0)) then
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + (ValorFreteTransp - ValorFrete);
      Else
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + ValorFreteTransp;
      AuxAcrescimoRedVenda = AuxAcrescimoRedVenda * (AuxValorTotal / ValorProdutosTotal);
   end
   If ((AuxCodProduto = 8888888) and (ValorServicosTotal > 0) and (AuxValorTotal > 0)) then
   begin
     if (ValorProdutosTotal > 0) then
        AuxAcrescimoBaseICM = (ValorDescontoServicos * -1) * (AuxValorTotal / ValorServicosTotal);
     Else
        AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDescontoServicos) * (AuxValorTotal / ValorServicosTotal);

     AuxAcrescimoBaseSubTrib = 0;
     AuxAcrescimoRedVenda = 0;
   end

   select AliqICM, ValorBaseICM, ValorICM,
         ValorIsentoICM, ValorOutrasICM, PerReducaoICM, ValorBaseSubTrib,
         ValorSubTrib, FatorRedCusto, FatorRedVenda, NumCFOP,
         ValorBaseSubTribCarga, ValorSubTribCarga,
         -- Renato - Chamado 272165
         ValorBasePisCofins, AliqPis, AliqCofins,
         --Eder - Chamado 284639
         NumCstICM, NumCstIPI, NumCstPisCofins, NumCsosn,
         -- Renato - 297792
         NatReceitaPisCofins,
         -- Renato - 332318
         NatBaseCalcCredito,
         --Gabriella - 333391
         ValorBaseIPI,
         ValorIsentoIPI,
         ValorOutrasIPI,
         --Renato - 360358
         AliqICMSST,
         PercMvaICMSST
    from Calcular_ICM(:Empresa, :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
                      :CodOperacao, :AuxValorTotal, :AuxAcrescimoBaseICM, :AuxAcrescimoBaseSubTrib, 0,
                      :AuxAliqIPI, :AuxCodClassFiscal, :FlagEntrada, :AuxAcrescimoRedVenda,
                      :AuxCodListaPreco,0,:CodSubTributaria, :AuxPerRedDespesa, :auxacrescimobaseipi)
    into :AuxAliqICM, :AuxBaseICM, :AuxValorICM,
         :AuxValorIsentoICM, :AuxValorOutrasICM, :AuxPerReducaoICM, :AuxBaseSubTrib,
         :AuxValorSubTrib, :AuxFatorRedCusto, :AuxFatorRedVenda, :AuxNumCFOP,
         :AuxBaseSubTribCarga, :AuxValorSubTribCarga,
         -- Renato - Chamado 272165
         :ValorBasePisCofins, :AliqPis, :AliqCofins,
         :NumCstICM, :NumCstIPI, :NumCstPisCofins, :NumCsosn,
         -- Renato - 297792
         :NatReceitaPisCofins,
         -- Renato - 332318
         :NatBaseCalcCredito,
         --Gabriella - 333391
         :AuxValorBaseIPI,
         :AuxValorIsentoIPI,
         :AuxValorOutrasIPI,
         --Renato - 360358
         :AliqICMSST,
         :PercMvaICMSST;

   if (AuxTipoItem = 0) then
   begin
     update MovEstoque
        set AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            StatusTransacao=1
      where Empresa=:Empresa
        and NumLancamento=:AuxNumLancamento;

      --Eder - Chamado 284639
      Update MovEstoqueImposto
         Set PerReducaoICM = :AuxPerReducaoICM,
             NumCstICM = :NumCstICM,
             NumCstIPI = :NumCstIPI,
             NumCstPisCofins = :NumCstPisCofins,
             NumCsosn = :NumCsosn,
             --Renato - 297792
             NatReceitaPisCofins = :NatReceitaPisCofins,
             --Renato - 332318
             NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,
             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
         
             --Rafael chamado 306960
             StatusTransacao = 1

       Where Empresa=:Empresa
         and NumLancamento=:AuxNumLancamento;

      if (Row_Count  = 0) then
      begin
         Insert into MovEstoqueImposto(Empresa, NumLancamento, PerReducaoICM, NumCstICm, NumCstIPI, NumCstPisCofins, NumCsosn, NatReceitaPisCofins,
                                       --Gabriella - 333391
                                       ValorBaseIPI,
                                       ValorIsentoIPI,
                                       ValorOutrasIPI,
                                       --Renato - 360358
                                       AliqICMSST,
                                       PercMvaICMSST,
                                       StatusTransacao)
                     Values (:Empresa, :AuxNumLancamento, :AuxPerReducaoICM, :NumCstICm, :NumCstIPI, :NumCstPisCofins, :NumCsosn, :NatReceitaPisCofins,
                             --Gabriella - 333391
                             :AuxValorBaseIPI,
                             :AuxValorIsentoIPI,
                             :AuxValorOutrasIPI,
                             --Renato - 360358
                             :AliqICMSST,
                             :PercMvaICMSST,
                             1);
      end
   end
   else
   begin
     update MovComponente
        set AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            -- Renato - Chamado 272165
            ValorBasePisCofins = :ValorBasePisCofins,
            AliqPis = :AliqPis,
            AliqCofins = :AliqCofins,
            --Eder - Chamado 284639
            PerReducaoICM = :AuxPerReducaoICM,
            NumCstICM = :NumCstICM,
            NumCstIPI = :NumCstIPI,
            NumCstPisCofins = :NumCstPisCofins,
            NumCsosn = :NumCsosn,
            --Renato - 297792
            NatReceitaPisCofins = :NatReceitaPisCofins,
            --Renato - 332318
            NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,

             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
         
            StatusTransacao=1
      where Empresa=:Empresa
        and NumLancamento=:AuxNumLancamento
        and NumSequencia=:AuxNumSequencia;
   end

--MARCELO - CHAMADO 195051
--   SomaBaseSubTribCarga = SomaBaseSubTribCarga + AuxBaseSubTribCarga;
--   SomaSubTribCarga = SomaSubTribCarga + AuxValorSubTribCarga;

end


/*--Acumula as variaveis de total da nota fiscal e dos componentes*/
SumValorProdutos = 0;
SumValorBaseICM = 0;
SumValorIPI = 0;
SumValorICM = 0;
SumValorSubTrib = 0;
SumValorBaseSubTrib = 0;
--MARCELO - CHAMADO 195051
SumValorSubTribCarga = 0;
SumValorBaseSubTribCarga = 0;
SumValorServicos = 0;
SumValorBaseISS = 0;
SumValorProdutosSemImpostos = 0;

for
    Select 
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorTotal Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseICM Else 0 End) as numeric(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Mov.CodProduto <> 8888888
                         then Rs_roundDec(Mov.ValorTotal * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),*/
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         then Rs_roundDec((MI.ValorBaseIPI + MI.ValorIsentoIPI + MI.ValorOutrasIPI)
                                            * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         then rs_roundDec(Mov.ValorBaseICM * (((100 + Mov.AliqICM) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorSubTrib Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseSubTrib Else 0 End) as numeric(15,2)),
--MARCELO - CHAMADO 195051
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorSubTribCarga Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then Mov.ValorBaseSubTribCarga Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto = 8888888 then Mov.ValorTotal Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto = 8888888 and Ser.FlagCalcularISS = 1
                         then Mov.ValorBaseICM + Mov.ValorOutrasICM Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888                   
                         Then rs_RoundDec(Mov.ValorTotal * Mov.FatorRedVenda,2) Else 0 End)  as numeric(15,2))
      From MovEstoque Mov                  
      Left Join Servicos Ser on Ser.codigo = Mov.CodServico
      --Gabriella - 333391
      Left Join MovEstoqueImposto MI on MI.Empresa = Mov.Empresa
                                    and MI.NumLancamento = Mov.NumLancamento                       
      Where Mov.Empresa = :Empresa
        and Mov.TipoControle = :TipoControle
        and Mov.CodControle = :CodControle
        and not exists(Select * From MovComponente Comp
                        Where Comp.Empresa = Mov.Empresa
                          and Comp.NumLancamento = Mov.NumLancamento)
    UNION ALL
    Select 
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorTotal Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseICM Else 0 End)  as numeric(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Comp.CodProduto <> 8888888
                         then Rs_roundDec(Comp.ValorTotal * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),*/
           Cast(Sum(Case When Comp.CodProduto <> 8888888
                         then Rs_roundDec((Comp.ValorBaseIPI + Comp.ValorIsentoIPI + Comp.ValorOutrasIPI)
                                            * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888                   
                         then Rs_roundDec(Comp.ValorBaseICM * (((100 + Comp.AliqICM) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorSubTrib Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseSubTrib Else 0 End)  as numeric(15,2)),
--MARCELO - CHAMADO 195051
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorSubTribCarga Else 0 End)  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorBaseSubTribCarga Else 0 End)  as numeric(15,2)),
           Cast(0  as numeric(15,2)),
           Cast(0  as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888
                        Then Rs_roundDec(Comp.ValorTotal * Comp.FatorRedVenda,2) Else 0 End) as numeric(15,2))
      From MovComponente Comp
      Where Comp.Empresa = :Empresa
        and Comp.TipoControle = :TipoControle
        and Comp.CodControle = :CodControle
     Into :AuxSumValorProdutos, :AuxSumValorBaseICM, :AuxSumValorIPI,
          :AuxSumValorICM,  :AuxSumValorSubTrib, :AuxSumValorBaseSubTrib,
--MARCELO - CHAMADO 195051
          :AuxSumValorSubTribCarga, :AuxSumValorBaseSubTribCarga, :AuxSumValorServicos,
          :AuxSumValorBaseISS, :AuxSumValorProdutosSemImpostos
do
begin
     If (not (AuxSumValorProdutos is null)) then
        SumValorProdutos = SumValorProdutos + AuxSumvalorProdutos;

     If (not (AuxSumValorBaseICM is null)) then
        SumValorBaseICM = SumValorBaseICM + AuxSumValorBaseICM;

     If (not (AuxSumValorIPI is null)) then
        SumValorIPI = SumValorIPI + AuxSumValorIPI;

     If (not (AuxSumValorICM is null)) then
        SumValorICM = SumValorICM + AuxSumValorICM;

     If (not (AuxSumValorSubTrib is null)) then
        SumValorSubTrib = SumValorSubTrib + AuxSumValorSubTrib;

     If (not (AuxSumValorBaseSubTrib is null)) then
        SumValorBaseSubTrib = SumValorBaseSubTrib + AuxSumValorBaseSubTrib;

--MARCELO - CHAMADO 195051
     If (not (AuxSumValorSubTribCarga is null)) then
        SumValorSubTribCarga = SumValorSubTribCarga + AuxSumValorSubTribCarga;

     If (not (AuxSumValorBaseSubTribCarga is null)) then
        SumValorBaseSubTribCarga = SumValorBaseSubTribCarga + AuxSumValorBaseSubTribCarga;

     If (not (AuxSumValorServicos is null)) then
        SumValorServicos = SumValorServicos + AuxSumValorServicos;

     If (not (AuxSumValorBaseISS is null)) then
        SumValorBaseISS = SumValorBaseISS + AuxSumValorBaseISS;

     If (not (AuxSumValorProdutosSemImpostos is null)) then
        SumValorProdutosSemImpostos = SumValorProdutosSemImpostos + AuxSumValorProdutosSemImpostos;
end

/*--Atualiza os Totais referentes a Produtos, somados a partir dos itens da nota fiscal*/
update NotasFiscais
   set ValorProdutos    = rs_dnvl(:SumValorProdutos,0),
       ValorIPI         = rs_dnvl(:SumValorIPI,0),
       ValorBaseICM     = rs_dnvl(:SumValorBaseICM,0),
       ValorICM         = rs_dnvl(:SumValorICM,0),
       ValorSubTrib     = rs_dnvl(:SumValorSubTrib,0),
       ValorBaseSubTrib = rs_dnvl(:SumValorBaseSubTrib,0),
       ValorServicos    = rs_dnvl(:SumValorServicos,0),
--MARCELO - CHAMADO 195051
       ValorSubTribCarga     = rs_dnvl(:SumValorSubTribCarga, 0),
       ValorBaseSubTribCarga = rs_dnvl(:SumValorBaseSubTribCarga, 0),
       ValorProdutosSemImpostos = rs_dnvl(:SumValorProdutosSemImpostos, 0),
       StatusTransacao=1
 where Empresa = :Empresa
   and TipoControle = :TipoControle
   and CodControle = :CodControle;

if (ValorProdutosTotal > 0) then
begin
   update NotasFiscais
      set ValorDesconto         = rs_RoundDec(:ValorDesconto * (ValorProdutos / :ValorProdutosTotal),2),
--232570
--MARCELO - CHAMADO 195326                                                  
--          ValorDescontoServicos = Round(@ValorDescontoServicos * (ValorProdutos / @ValorProdutosTotal),2),                                                        
          ValorDescontoServicos = case when ValorServicos > 0  
                                    then rs_Rounddec(:ValorDescontoServicos * (ValorProdutos / :ValorProdutosTotal),2)
                                       else 0 end,                                                        
          ValorFrete            = rs_RoundDec(:ValorFrete * (ValorProdutos / :ValorProdutosTotal),2),
          ValorSeguro           = rs_RoundDec(:ValorSeguro * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesas         = rs_RoundDec(:ValorDespesas * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesasNaoInc   = rs_RoundDec(:ValorDespesasNaoInc * (ValorProdutos / :ValorProdutosTotal),2),
          ValorFreteTransp      = rs_RoundDec(:ValorFreteTransp * (ValorProdutos / :ValorProdutosTotal),2),
          --327726
          --ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * (ValorProdutos / :ValorProdutosTotal),2),
          ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * ((ValorProdutos + valorservicos) / (:ValorProdutosTotal + :valorservicostotal ) ),2)+
                                 case when  :valorservicostotal > 0
                                      then rs_RoundDec(:valortotalretencoesiss * (ValorServicos / :valorservicostotal),2) else 0 end
                                + rs_RoundDec(:valortotalretencoesicm * (ValorProdutos / :ValorProdutosTotal),2),
          StatusTransacao       = 1
    where Empresa = :Empresa
      and TipoControle = :TipoControle
      and CodControle = :CodControle;
end
else
begin
   update NotasFiscais
      set ValorDesconto         = ValorDesconto + :ValorDesconto,
          ValorDescontoServicos = ValorDescontoServicos + :ValorDescontoServicos,
          ValorFrete            = ValorFrete + :ValorFrete,
          ValorSeguro           = ValorSeguro + :ValorSeguro,
          ValorDespesas         = ValorDespesas + :ValorDespesas,
          ValorDespesasNaoInc   = ValorDespesasNaoInc + :ValorDespesasNaoInc,
          ValorFreteTransp      = ValorFreteTransp + :ValorFreteTransp,
          ValorTotalRetencoes   = ValorTotalRetencoes + :ValorTotalRetencoes,
          StatusTransacao       = 1
    where Empresa = :Empresa
      and TipoControle = :TipoControle
      and CodControle = :CodControle;
end





/*--verifica se está na ultima nota processada*/
select (count(*) - :ContadorNota) from TempPrft110Nota
 where NumSequencia = :Ped_Sequencia
 into :Existe;

if (Existe = 0) then  /*------Ultima Nota Processada*/
begin
  select sum(ValorDesconto), sum(ValorDescontoServicos), sum(ValorFrete),
         sum(ValorSeguro), sum(ValorDespesas), sum(ValorDespesasNaoInc),
         sum(ValorFreteTransp), sum(ValorTotalRetencoes), sum(ValorComplementar)
    from TempPrft110Nota, NotasFiscais
   where TempPrft110Nota.NumSequencia = :Ped_Sequencia
     and TempPrft110Nota.Empresa = NotasFiscais.Empresa
     and TempPrft110Nota.TipoControle = NotasFiscais.TipoControle
     and TempPrft110Nota.CodControle = NotasFiscais.CodControle
   into :SumValorDesconto, :SumValorDescontoServicos, :SumValorFrete,
        :SumValorSeguro, :SumValorDespesas, :SumValorDespesasNaoInc,
        :SumValorFreteTransp, :SumValorTotalRetencoes, :SumValorComplementar;

  update NotasFiscais
     set ValorDesconto = ValorDesconto + (:ValorDesconto - rs_dnvl(:SumValorDesconto,0)),
         ValorDescontoServicos  = ValorDescontoServicos + (:ValorDescontoServicos - rs_dnvl(:SumValorDescontoServicos,0)),
         ValorFrete  = ValorFrete + (:ValorFrete - rs_dnvl(:SumValorFrete,0)),
         ValorSeguro = ValorSeguro + (:ValorSeguro - rs_dnvl(:SumValorSeguro,0)),
         ValorDespesas = ValorDespesas + (:ValorDespesas - rs_dnvl(:SumValorDespesas,0)),
         ValorDespesasNaoInc = ValorDespesasNaoInc + (:ValorDespesasNaoInc - rs_dnvl(:SumValorDespesasNaoInc,0)),
         ValorFreteTransp = ValorFreteTransp + (:ValorFreteTransp - rs_dnvl(:SumValorFreteTransp,0)),
         --327726
         --ValorTotalRetencoes = ValorTotalRetencoes + (:ValorTotalRetencoes - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorTotalRetencoes = ValorTotalRetencoes + ((:ValorTotalRetencoes +:valortotalretencoesiss + :valortotalretencoesicm)
                                                   - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorComplementar  = ValorComplementar + (:ValorComplementar - rs_dnvl(:SumValorComplementar,0)),
         StatusTransacao=1
        where Empresa = :Empresa
          and TipoControle = :TipoControle
          and CodControle = :CodControle;
end

/*--Calcula o ISS após terminar os rateios da nota*/
Update NotasFiscais
   Set ValorISS = Rs_Rounddec((:SumValorBaseISS * AliqISS) / 100.00, 2),
       AliqISS  = Case When :SumValorBaseISS > 0 then AliqISS Else 0 End
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and  CodControle = :CodControle;

--Gabriella - 361043
--Gabriella - 342854
--Se na NF houver ValorRetencao de ISS os Valores são Zerados
/*if (ValorTotalRetencoesISS > 0) then
begin
  Update NotasFiscais                                   
     Set ValorISS = 0,                                                                                              
         AliqISS  = 0                                                                                
     Where Empresa = :Empresa
       and TipoControle = :TipoControle
       and  CodControle = :CodControle;
end*/

/*select FlagDespesasIPI from Operacoes where Codigo = :CodOperacao
  into Existe;*/

/*if (Existe = 1) then
begin

  update NotasFiscais
   --Rafael chamado 281202
     --set ValorIPIDespesas =
         --rs_rounddec(((ValorFrete + ValorDespesas + ValorSeguro) *
          --      rs_dnvl(:AuxAliqIPI,0)) / 100.00, 2)

    set ValorIPIDespesas = :ValorIPIDespesas
   where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle;
end */


/*--Corrige eventuais diferenças de soma dos valores fiscais dos itens*/
AuxTipoItem = 0;

SomaICMProdutos     = 0;
SomaICMServicos     = 0;
CompSomaICMProdutos = 0;
CompSomaICMServicos = 0;
SomaContabilNotaProdutos = 0;
SomaContabilNotaServicos = 0;

Select
  Sum(Case When CodProduto <> 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end),

  Sum(Case When CodProduto = 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end)
  From MovEstoque                    
 Where Empresa      = :Empresa
   and TipoControle = :TipoControle
   and CodControle  = :CodControle
   and not exists(Select * From MovComponente Comp
                   Where Comp.Empresa = MovEstoque.Empresa  
                     and Comp.NumLancamento = MovEstoque.NumLancamento)  

  Into :SomaICMProdutos, :SomaICMServicos;

if (SomaICMProdutos is null) then
  SomaICMProdutos = 0;

if (SomaICMServicos is null) then
  SomaICMServicos = 0;


Select
  Sum(Case When CodProduto <> 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end),

  Sum(Case When CodProduto = 8888888
           then ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           else 0 end)
  From MovComponente
 Where Empresa      = :Empresa
   and TipoControle = :TipoControle
   and CodControle  = :CodControle
  Into :CompSomaICMProdutos, :CompSomaICMServicos;


if (not (CompSomaICMProdutos is null)) then
begin
  SomaICMProdutos = SomaICMProdutos + CompSomaICMProdutos;
  AuxTipoItem     = 1;
end

if (not (CompSomaICMServicos is null)) then
begin
  SomaICMServicos = SomaICMServicos + CompSomaICMServicos;
  AuxTipoItem     = 1;
end
                    
--JALDO - CHAMADO 245729
--Select Case When TipoPessoa = 'J' Then 1 Else 0 End From Entidades
-- Where Codigo = :AuxCodEntidade
-- Into :Existe;

--Gabriella - 256424
--JALDO - CHAMADO 248899
--Select Case When (((TipoConsideraIPICalculoICM = 0) and (TipoPessoa <> 'J')) or
--                 (TipoConsideraIPICalculoICM = 1))
--            Then 0 Else 1 End
--Select Case When TipoPessoa in ('J','I') Then 1 Else 0 End
Select Case When Ent.TipoPessoa in ('J','I') and Opr.flagipisobrebaseicm = 0 Then 1 Else 0 End
From Entidades Ent
Left Join Operacoes Opr on Opr.codigo = :codoperacao
 Where Ent.Codigo = :AuxCodEntidade
   Into :Existe;

                    
If (Existe = 1) then
begin                    
  Select (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas),
         Case when (ValorProdutos = 0)
              then (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              else (ValorServicos - ValorDescontoServicos)
         end
   From NotasFiscais                    
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle
    Into :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
end                    
Else                    
begin                    
  Select (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas + ValorIPI),
         Case when (ValorProdutos = 0)
              then (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              else (ValorServicos - ValorDescontoServicos)
         end
   From NotasFiscais                    
   Where Empresa      = :Empresa
     and TipoControle = :TipoControle
     and CodControle  = :CodControle
    Into :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
end

Diferenca         = 0;
FlagTipoDiferenca = 0;
--MARCELO - CHAMADO 182639                 
DiferencaProduto         = 0;
FlagTipoDiferencaProduto = 0;
DiferencaServico         = 0;
FlagTipoDiferencaServico = 0;

--MARCELO - CHAMADO 182639
If ((SomaContabilNotaProdutos <> 0) and (SomaContabilNotaProdutos <> SomaICMProdutos)) then
begin
--  Diferenca         = (:SomaContabilNotaProdutos - :SomaICMProdutos);
--  FlagTipoDiferenca = 1;
  DiferencaProduto = (:SomaContabilNotaProdutos - :SomaICMProdutos);
  FlagTipoDiferencaProduto = 1;
end
--else
--begin
if (SomaICMServicos <> 0) then
begin
  If ((SomaContabilNotaServicos <> 0) and (SomaContabilNotaServicos <> SomaICMServicos)) then
  begin
--    Diferenca         = (:SomaContabilNotaServicos - :SomaICMServicos);
--    FlagTipoDiferenca = 2;
    DiferencaServico = (:SomaContabilNotaServicos - :SomaICMServicos);
    FlagTipoDiferencaServico = 2;
  end
end
--end

--MARCELO - CHAMADO 182639
Contador = 1;

while (Contador <= 2) do
begin
  if (Contador = 1) then
  begin
    Diferenca = DiferencaProduto;
    FlagTipoDiferenca = FlagTipoDiferencaProduto;
  end
  if (Contador = 2) then
  begin
    Diferenca = DiferencaServico;
    FlagTipoDiferenca = FlagTipoDiferencaServico;
  end

  If (Diferenca <> 0) then
  begin
    /*--Se houver diferencas, altera no primeiro item da nota*/
    If (AuxTipoItem = 0) then
    begin
      Select First 1 Empresa, NumLancamento,
--185753
        ValorBaseICM
      From MovEstoque
      Where Empresa      = :Empresa
         and TipoControle = :TipoControle
         and CodControle  = :CodControle
         and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                  When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                  Else 0
             End = 1
         and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
         and not exists(Select * From MovComponente Comp
                        Where Comp.Empresa = MovEstoque.Empresa
                          and Comp.NumLancamento = MovEstoque.NumLancamento)
      Order By NumLancamento
      Into :AuxEmpresa, :AuxNumLancamento,
--185753
           :AuxBaseICM;
                                                  
      Update MovEstoque
        Set ValorBaseICM = Case when ValorBaseICM <> 0
                                then ValorBaseICM + (:Diferenca)
                                Else ValorBaseICM End,
            ValorIsentoICM = Case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                  then ValorIsentoICM + (:Diferenca)
                                  Else ValorISentoICM End,
            ValorOutrasICM = Case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                  then ValorOutrasICM + (:Diferenca)
                                  Else ValorOutrasICM End
      Where Empresa = :AuxEmpresa
        and NumLancamento = :AuxNumLancamento;
    end
    else
    begin
      Select First 1 Empresa,
                   NumLancamento,
                   NumSequencia,
--185753
                   ValorBaseICM
      From MovComponente
      Where Empresa = :Empresa
        and TipoControle = :TipoControle
        and CodControle = :CodControle
        and Case When :FlagTipoDiferenca = 1 and CodProduto <> 8888888 Then 1
                 When :FlagTipoDiferenca = 2 and CodProduto = 8888888  Then 1
                 Else 0
            End = 1
        and (ValorBaseICM > 0 or ValorIsentoICM > 0 or ValorOutrasICM > 0)
      Order By NumLancamento
      Into :AuxEmpresa, :AuxNumLancamento, :AuxNumSequencia,
--185753
           :AuxBaseICM;

      Update MovComponente
        Set ValorBaseICM = Case when ValorBaseICM <> 0
                                then ValorBaseICM + (:Diferenca)
                                Else ValorBaseICM End,
            ValorIsentoICM = Case when ValorIsentoICM <> 0 and ValorBaseICM = 0
                                  then ValorIsentoICM + (:Diferenca)
                                  Else ValorISentoICM End,
            ValorOutrasICM = Case when ValorOutrasICM <> 0 and ValorBaseICM = 0
                                  then ValorOutrasICM + (:Diferenca)
                                  Else ValorOutrasICM End
      Where Empresa = :AuxEmpresa
        and NumLancamento = :AuxNumLancamento
        and NumSequencia = :AuxNumSequencia;
   end
  
                    
   Update NotasFiscais
     Set ValorBaseICM = Case when ValorBaseICM <> 0                    
                             then ValorBaseICM + (:Diferenca)
                             Else ValorBaseICM End                    
   Where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle
--185753
     and Coalesce(:AuxBaseICM, 0) <> 0;
  end
  Contador = Contador + 1;
end


--327726  
Select   
 coalesce(Sum(NF.ValorProdutos),0),
 coalesce(Sum(NF.ValorServicos),0)
From NotasFiscais NF  
where  
    Empresa =:Empresa
and TipoControle = :TipoControle
and CodControle =  :CodControle
into :valorprodutosnota,:valorservicosnota;



delete from NotasFiscaisRetencao
 where Empresa=:Empresa
   and TipoControle=:TipoControle
   and CodControle=:CodControle;

insert into NotasFiscaisRetencao (
       Empresa, TipoControle, CodControle, TipoRetencao,
       ValorBase, Aliquota, 
       ValorRetencao, StatusTransacao)
  select :Empresa, :TipoControle, :CodControle, PedidosRetencao.TipoRetencao,
      sum(PedidosRetencao.ValorBase), Max(PedidosRetencao.Aliquota),
      --338411
      --sum(PedidosRetencao.ValorRetencao), min(1)
      rs_rounddec( ( (Sum(PedidosRetencao.ValorBase)*Max(PedidosRetencao.Aliquota) )/100.00),2),
      Min(1)
    from TempPrft110Pedido, PedidosRetencao
    where TempPrft110Pedido.NumSequencia = :Ped_Sequencia
      and PedidosRetencao.Empresa = :Empresa
      and PedidosRetencao.CodPedido = TempPrft110Pedido.CodPedido
    --327726
      and ( (PedidosRetencao.TipoRetencao = 5 and  :valortotalretencoesiss > 0 and :valorservicosnota > 0)
           or  (TipoRetencao = 6  and  :valortotalretencoesicm > 0 and :valorprodutosnota > 0)
           or  (:valortotalretencoes > 0 ) )
    group by PedidosRetencao.TipoRetencao;


--Gabriella - 344500
if (:ValorServicosNota > 0) then
begin
    --Atualiza a Temporária 
    update TempPrft110RelacaoRetencao
       set Tipocontrole = :TipoControle,
           CodControle = :CodControle
     where NumSequencia = :Ped_Sequencia
       and TipoControle = 0
       and CodControle = 0;
       
    --Insere na tabela de Retenção      
    Insert Into NotasFiscaisRetencao (
             Empresa, TipoControle, 
             CodControle, TipoRetencao,                                                     
             ValorBase, Aliquota,                                                                                               
             ValorRetencao, StatusTransacao)                                                                                              
      Select :Empresa, TempRel.TipoControle,
             TempRel.CodControle, TempRel.TipoRetencao,                                                      
             Sum(TempRel.ValorBase), max(TempRel.Aliquota),                                                                                                             
             Sum(TempRel.ValorRetencao), 1                                                                     
        From TempPrft110RelacaoRetencao TempRel                                                                                     
       Where TempRel.NumSequenciaPed = :Ped_Sequencia
         and TempRel.TipoControle = :TipoControle
         and TempRel.CodControle = :CodControle
         and TempRel.ValorRetencao > 0 
      --Gabriella - 358073
      Group By TempRel.TipoControle, TempRel.CodControle, TempRel.TipoRetencao;

    --Gabriella - 358073      
    --Insere na tabela de Relação da Retenção
   /* Insert Into NotasFiscaisRelacaoRetencao
          (Empresa, TipoControle, 
           CodControle, TipoRetencao, 
           ValorBase, Aliquota,
           ValorRetencao, FlagRetencaoGerada, 
           TipoControleRetencao, CodControleRetencao,
           StatusTransacao, TransacaoEmpresas)
    Select :Empresa, TempRetencao.TipoControle,
           TempRetencao.CodControle, TempRetencao.TipoRetencao,
           TempRetencao.ValorBase, TempRetencao.Aliquota,
           TempRetencao.ValorRetencao, 1, 
           :TipoControle, :CodControle,
           1, ''
      From TempPrft110RelacaoRetencao TempRetencao
     where TempRetencao.NumSequencia = :Ped_Sequencia;    */
end


     --338411   
   Update NotasFiscais
   set ValorTotalRetencoes =  coalesce( (  Select First 1 SUM(ValorRetencao)
                                           From NotasFiscaisRetencao
                                           where Empresa=:Empresa
                                             and TipoControle=:TipoControle
                                             and CodControle=:CodControle),0)
                               
   where
       Empresa=:Empresa
   and TipoControle=:TipoControle
   and CodControle=:CodControle;
  

END
^

ALTER PROCEDURE CALCULAR_ICM (
    empresa integer,
    codproduto integer,
    codtributacao char(5),
    codentidade char(7),
    codoperacao integer,
    valortotal numeric(11,2),
    acrescimobaseicm numeric(11,2),
    acrescimobasesubtrib numeric(11,2),
    redbasesubtrib numeric(4,2),
    aliqipi numeric(4,2),
    codclassfiscal varchar(15),
    flagentrada integer,
    acrescimoredvenda numeric(11,2),
    codlistapreco integer,
    aliqicmfixo numeric(4,2),
    codsubtributaria integer,
    perreddespesa numeric(15,8),
    acrescimobaseipi numeric(11,2))
returns (
    aliqicm numeric(4,2),
    valorbaseicm numeric(11,2),
    valoricm numeric(11,2),
    valorisentoicm numeric(11,2),
    valoroutrasicm numeric(11,2),
    perreducaoicm numeric(5,2),
    valorbasesubtrib numeric(11,2),
    valorsubtrib numeric(11,2),
    valorbasesubtribcarga numeric(11,2),
    valorsubtribcarga numeric(11,2),
    perredbasesubtrib numeric(4,2),
    fatorredcusto numeric(15,8),
    fatorredvenda numeric(7,4),
    numcfop char(10),
    aliqpiscofins numeric(4,2),
    valorbasepiscofins numeric(11,2),
    aliqpis numeric(4,2),
    aliqcofins numeric(4,2),
    numcsticm varchar(3),
    numcstipi varchar(3),
    numcstpiscofins varchar(3),
    numcsosn varchar(3),
    natreceitapiscofins integer,
    natbasecalccredito smallint,
    indnaturezafrete smallint,
    valorbaseipi numeric(11,2),
    valorisentoipi numeric(11,2),
    valoroutrasipi numeric(11,2),
    aliqicmsst numeric(5,2),
    percmvaicmsst numeric(5,2))
as
declare variable codestadoleitura char(2);
declare variable aempmestre char(7);
declare variable vauxbaseipi decimal(11,2);
declare variable vauxvaloripi decimal(11,2);
declare variable auxcodtributacaosubtrib char(5);
declare variable auxflagsubtributaria integer;
declare variable auxentidade char(7);
declare variable valorbasesubtribdestino numeric(11,2);
declare variable calcbasesubtrib numeric(11,2);
declare variable calcvalorsubtrib numeric(11,2);
declare variable calcbasesubtribdestino numeric(11,2);
declare variable partiporeducaoicm smallint;
declare variable paraliqcpmf numeric(4,2);
declare variable paraliqicmsimples numeric(4,2);
declare variable partiporegimetributario smallint;
declare variable enttipopessoa char(1);
declare variable cidcodestado char(2);
declare variable estaliqcontrib decimal(4,2);
declare variable estflagconvsub smallint;
declare variable estaliqinterna decimal(4,2);
declare variable cidempcodestado char(2);
declare variable trialiqicm decimal(4,2);
declare variable triflagisentoprodutor smallint;
declare variable triflagsubtributaria smallint;
declare variable trimargemlucrosubst numeric(5,2);
declare variable triperreducaoicm decimal(6,4);
declare variable triperredmargem decimal(4,2);
declare variable tritipocfop smallint;
declare variable tricodtributacaosubtrib char(5);
declare variable tritipovalornaotributado smallint;
declare variable triperreducaosubtrib numeric(6,2);
declare variable trialiqinternasubtrib numeric(5,2);
declare variable trinumcst_icm smallint;
declare variable trinumcst_ipi smallint;
declare variable trinumcsosn smallint;
declare variable claflagsubtributaria smallint;
declare variable claaliqpiscofins numeric(4,2);
declare variable gruflagsubtributaria smallint;
declare variable oprtipoicm smallint;
declare variable oprtipoipi smallint;
declare variable opraliqicmfixo decimal(4,2);
declare variable oprperredicm decimal(4,2);
declare variable oprperredmargem decimal(4,2);
declare variable oprcfop1_normal char(10);
declare variable oprcfop1_normal_ncfora char(10);
declare variable oprcfop2_industrializado char(10);
declare variable oprcfop2_industrializado_ncfora char(10);
declare variable oprcfop3_subrevenda char(10);
declare variable oprcfop3_subrevenda_nc char(10);
declare variable oprcfop4_subrevendaml char(10);
declare variable oprcfop4_subrevendaml_nc char(10);
declare variable oprcfop5_subfabricacao char(10);
declare variable oprcfop5_subfabricacao_nc char(10);
declare variable oprcfop6_subfabricacaoml char(10);
declare variable oprcfop6_subfabricacaoml_nc char(10);
declare variable oprcfop7_importado char(10);
declare variable oprcfop_servico char(10);
declare variable oprcfop_servico_ncfora char(10);
declare variable oprcfop9_petroleo varchar(10);
declare variable oprcfop9_petroleo_nc varchar(10);
declare variable oprflagcalcpis_cofins smallint;
declare variable oprflagdefaultlancamentooutras integer;
declare variable oprflagsubtribipi integer;
declare variable oprtipomovimento integer;
declare variable oprtiposubtributaria integer;
declare variable oprtiposubtributariacarga integer;
declare variable oprflagipisobrepiscofins smallint;
declare variable lispercacrescimoadm1 numeric(4,2);
declare variable lispercacrescimoadm2 numeric(4,2);
declare variable lispercacrescimoadm3 numeric(4,2);
declare variable proorigem smallint;
declare variable subaliquotainterna numeric(5,2);
declare variable submargemlucro numeric(5,2);
declare variable subpercreducao numeric(5,2);
declare variable subindicereducao numeric(9,6);
declare variable subflagabatericm smallint;
declare variable subflagsomaipi smallint;
declare variable existe integer;
declare variable regiaodestino varchar(10);
declare variable regiaodestinoleitura varchar(10);
declare variable regiaoorigem varchar(10);
declare variable empid varchar(15);
declare variable flagdeduzirdespnaoinclnamargem smallint;
declare variable percsubtribcusto decimal(5,2);
declare variable percicmcusto decimal(5,2);
declare variable acrdespesaspiscofins decimal(11,2);
declare variable regtribpercivasimplicado numeric(5,2);
declare variable triflagprevaleceraliqicm smallint;
declare variable oprflagipisobrebaseicm smallint;
declare variable tritipovalornaotributadoipi numeric(1,0);
declare variable oprflagicmssobreservicos smallint;
BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.01
*********************/
VAuxBaseIPI = 0;
VAuxValorIPI = 0;
AliqICM = 0;
ValorBaseICM = 0;
ValorICM = 0;
ValorIsentoICM = 0;
ValorOutrasICM = 0;
ValorBaseSubTrib = 0;
ValorSubTrib = 0;
ValorBaseSubTribCarga = 0;
ValorSubTribCarga = 0;
FatorRedCusto = 0;
FatorRedVenda = 0;
NumCFOP = '';
AliqPISCOFINS = 0;
--Ronaldo Chamado 313933
RegTribPercIvaSimplicado = 0;
--Gabriella - 333391  
ValorBaseIPI = 0;
ValorIsentoIPI = 0;
ValorOutrasIPI = 0;

--JALDO - CHAMADO 353913
CalcValorSubTrib = 0;
CalcBaseSubTrib = 0;

--Renato - 283520
SELECT Id,
  'M' || Rs_Replicate('0',(6 - Rs_Length(:Empresa))) || CAST(:Empresa AS VARCHAR(10))
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :EmpId, :AEmpMestre;

--leitura do parametro de controle
SELECT
  TipoReducaoICM,
  AliqCPMF,
  TipoRegimeTributario,
  AliqICMSimples
FROM
  ParamControle
WHERE
  Empresa = :Empresa
INTO
  :ParTipoReducaoICM,
  :ParAliqCPMF,
  :ParTipoRegimeTributario,
  :ParAliqICMSimples;

IF (ParTipoReducaoICM IS NULL) THEN
  ParTipoReducaoICM = 0;
IF (ParAliqCPMF IS NULL) THEN
  ParAliqCPMF = 0;
IF (ParTipoRegimeTributario IS NULL) THEN
  ParTipoRegimeTributario = 0;
IF (ParAliqICMSimples IS NULL) THEN
  ParAliqICMSimples = 0;

-- Renato - 278440
SELECT FlagDeduzirDespNaoInclNaMargem
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem;


-- leitura da cidade da empresa mestre
SELECT
  Cidades.CodEstado,
--Eder - Chamado 243637          
  Est.RegiaoDestino
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados Est ON Est.codorigem = Cidades.codestado
                       AND est.coddestino = Cidades.codestado
WHERE
  Entidades.Codigo = :AEmpMestre
INTO
  :CidEmpCodEstado,
  :RegiaoOrigem;

-- Leitura da entidade 
SELECT
  TipoPessoa,
  Cidades.CodEstado,
  Cidades.CodEstado
  --TipoConsideraIPICalculoICM -- - CHAMADO 248899
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EntTipoPessoa,
  :CidCodEstado,
  :CodEstadoLeitura;
  --:TipoConsideraIPICalculoICM; --243556 / 248899

 Existe = NULL;

SELECT
  FlagICMOrigem
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :Existe;

IF (rs_invl(Existe,0) = 1) THEN
  CodEstadoLeitura = CidEmpCodEstado;


--MARCELO - CHAMADO 192283
SELECT 
  RegiaoDestino
FROM Estados
WHERE CodOrigem = :CidEmpCodEstado
  AND CodDestino = :CidCodEstado
 INTO :RegiaoDestino;

IF (:CodEstadoLeitura <> :CidEmpCodEstado) THEN
BEGIN
    SELECT 
      RegiaoDestino
    FROM Estados
    WHERE CodOrigem = :CodEstadoLeitura
      AND CodDestino = :CidCodEstado
     INTO :RegiaoDestinoLeitura;
 -- Eder - Chamado 269443
  IF (RegiaoDestinoLeitura IS NULL) THEN
     RegiaoDestinoLeitura = RegiaoDestino;
END
ELSE
   RegiaoDestinoLeitura = RegiaoDestino;

--Na entrada, pega a aliquota interna do estado de origem da nota e na saida pega a aliquota do estado de destino
SELECT
--MARCELO - CHAMADO 116008
--  EstSai.AliqContrib,
  CASE WHEN :FlagEntrada = 1 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento <> 1
       THEN EstSai.AliqContribCompra --ENTRADA POR COMPRA
       WHEN :FlagEntrada = 0 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento = 1
       THEN EstSai.AliqContribCompra --SAIDA POR DEVOLUCAO
       ELSE EstSai.AliqContrib END,
  EstSai.FlagConvSub,
-- Isaac - Chamado 191748
--  Case When :FlagEntrada = 0 then EstSai.AliqInterna Else EstEnt.AliqInterna End
-- Eder - Chamado 219012
--Case When :FlagEntrada = 0 then EstSai.AliqInterna
--     When :FlagEntrada = 1 and Oper.tipomovimento = 1 then EstSai.AliqInterna
--     Else EstEnt.AliqInterna End
  CASE WHEN :FlagEntrada = 0 AND Oper.TipoMovimento <> 1 THEN EstSai.AliqInterna
       WHEN :FlagEntrada = 1 AND Oper.tipomovimento = 1 THEN EstSai.AliqInterna
       ELSE EstEnt.AliqInterna END
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados EstSai ON EstSai.CodOrigem = :CidEmpCodEstado
                          AND EstSai.CodDestino = :CodEstadoLeitura
  LEFT JOIN Estados EstEnt ON EstEnt.CodOrigem = :CidEmpCodEstado
                          AND EstEnt.CodDestino = :CidEmpCodEstado
--MARCELO - CHAMADO 116008
  LEFT JOIN Operacoes Oper ON Oper.Codigo = :CodOperacao
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EstAliqContrib,
  :EstFlagConvSub,
  :EstAliqInterna;


IF (EstAliqContrib IS NULL) THEN
  EstAliqContrib = 0;
IF (EstFlagConvSub IS NULL) THEN
  EstFlagConvSub = 0;
IF (EstAliqInterna IS NULL) THEN
  EstAliqInterna = 0;


  --Verifica se a classificação fiscal permite que seja calculada substituição tributária
ClaFlagSubTributaria = 1;
ClaAliqPisCofins = 0;
IF (ltrim(CodClassFiscal) <> '') THEN
BEGIN
  SELECT
    FlagSubTributaria,
    AliqPisCofins
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
    :ClaAliqPisCofins;

  IF (ClaFlagSubTributaria IS NULL) THEN
     ClaFlagSubTributaria = 1;
  IF (ClaAliqPisCofins IS NULL) THEN
     ClaAliqPisCofins = 0;
END


-- leitura das operacoes fiscais
SELECT
  TipoICM,
  TipoIPI,
  AliqICMFixo,
  PerRedICM,
  PerRedMargem,
  CFOP1_Normal,
  CFOP1_Normal_NCFora,
  CFOP2_Industrializado,
  CFOP2_Industrializado_NCFora,
  CFOP3_SubRevenda,
  CFOP3_SubRevenda_NC,
  CFOP4_SubRevendaML,
  CFOP4_SubRevendaML_NC,
  CFOP5_SubFabricacao,
  CFOP5_SubFabricacao_NC,
  CFOP6_SubFabricacaoML,
  CFOP6_SubFabricacaoML_NC,
  CFOP7_Importado,
  CFOP_Servico,
  CFOP_Servico_NCFora,
  CFOP9_Petroleo,
  CFOP9_Petroleo_NC,
  FlagCalcPIS_COFINS,
  FlagDefaultLancamentoOutras,
  FlagSubTribIPI,
  TipoMovimento,
  TipoSubTributaria,
  TipoSubTributariaCarga,
  FlagIPISobrePisCofins,
  FlagIPISobreBaseICM,
  --Renato - 341779
  FlagICMSSobreServicos,
  --Ronaldo 343696
  IndNaturezaFrete
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :OprTipoICM,
  :OprTipoIPI,
  :OprAliqICMFixo,
  :OprPerRedICM,
  :OprPerRedMargem,
  :OprCFOP1_Normal,
  :OprCFOP1_Normal_NCFora,
  :OprCFOP2_Industrializado,
  :OprCFOP2_Industrializado_NCFora,
  :OprCFOP3_SubRevenda,
  :OprCFOP3_SubRevenda_NC,
  :OprCFOP4_SubRevendaML,
  :OprCFOP4_SubRevendaML_NC,
  :OprCFOP5_SubFabricacao,
  :OprCFOP5_SubFabricacao_NC,
  :OprCFOP6_SubFabricacaoML,
  :OprCFOP6_SubFabricacaoML_NC,
  :OprCFOP7_Importado,
  :OprCFOP_Servico,
  :OprCFOP_Servico_NCFora,
  :OprCFOP9_Petroleo,
  :OprCFOP9_Petroleo_NC,
  :OprFlagCalcPIS_COFINS,
  :OprFlagDefaultLancamentoOutras,
  :OprFlagSubTribIPI,
  :OprTipoMovimento,
  :OprTipoSubTributaria,
  :OprTipoSubTributariaCarga,
  :OprFlagIPISobrePisCofins,
  :OprFlagIPISobreBaseIcm,
  --Renato - 341779
  :OprFlagICMSSobreServicos,
  :IndNaturezaFrete;


IF (OprTipoICM IS NULL) THEN
  OprTipoICM = 0;
IF (OprTipoIPI IS NULL) THEN
  OprTipoIPI = 0;
IF (OprAliqICMFixo IS NULL) THEN
  OprAliqICMFixo = 0;
IF (OprPerRedICM IS NULL) THEN
  OprPerRedICM = 0;
IF (OprPerRedMargem IS NULL) THEN
  OprPerRedMargem = 0;
IF (OprFlagCalcPIS_COFINS IS NULL) THEN
  OprFlagCalcPIS_COFINS = 0;
IF (OprFlagDefaultLancamentoOutras = 1) THEN
  OprFlagDefaultLancamentoOutras = 0;
IF (OprFlagCalcPIS_COFINS = 1) THEN
   AliqPISCOFINS = ClaAliqPISCOFINS;
IF (OprFlagSubTribIPI IS NULL) THEN
   OprFlagSubTribIPI = 0;
IF (OprTipoSubTributaria IS NULL) THEN
   OprTipoSubTributaria = 0;
IF (OprTipoMovimento IS NULL) THEN
   OprTipoMovimento = 0;
--Eder - Chamado 262460
IF (OprTipoSubTributariaCarga IS NULL) THEN
   OprTipoSubTributaria = 0;
if (OprFlagIPISobrePisCofins is null) then
   OprFlagIPISobrePisCofins = 0;
--Gabriella - 256424
if (OprFlagIPISobreBaseIcm is null) then
   OprFlagIPISobreBaseIcm = 0;

--Verifica se o grupo do produto permite que seja calculada substituição tributária
GruFlagSubTributaria = 1;
Select Gru.FlagSubTributaria,
       Pro.Origem
  From Produtos Pro 
  Left Join Grupos Gru on Gru.Codigo = Pro.CodGrupo
 Where Pro.Codigo = :CodProduto
  into :GruFlagSubTributaria, :ProOrigem;

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 
--Leitura da Lista de Preço
SELECT Ilp.PercAcrescimoAdm1, Ilp.PercAcrescimoAdm2, Ilp.PercAcrescimoAdm3,
       --Renato - 290579
       Ilp.PercSubTrib, Ilp.PercICMCusto
  FROM ItemlistaPreco Ilp
  LEFT JOIN Empresas Emp ON Emp.Codigo = :Empresa
 WHERE Ilp.CodLista=:CodListaPreco
   AND Ilp.CodProduto=:CodProduto
   AND Ilp.Empresa = Emp.EmpresaListaPreco
 INTO :LisPercAcrescimoAdm1, :LisPercAcrescimoAdm2, :LisPercAcrescimoAdm3,
      --Renato - 290579
      :PercSubTribCusto, :PercICMCusto;

IF (LisPercAcrescimoAdm1 IS NULL) THEN
  LisPercAcrescimoAdm1 = 0;
IF (LisPercAcrescimoAdm2 IS NULL) THEN
  LisPercAcrescimoAdm2 = 0;
IF (LisPercAcrescimoAdm3 IS NULL) THEN
  LisPercAcrescimoAdm3 = 0;


-- leitura da tributacao
SELECT FIRST 1
  AliqICM,
  FlagIsentoProdutor,
  FlagSubTributaria,
  MargemLucroSubst,
  PerReducaoICM,
  PerRedMargem,
  TipoCFOP,
  CodTributacaoSubTrib,
  TipoValorNaoTributado,
  PerReducaoSubTrib,
--Rafael chamado 272635
  AliqInternaSubTrib,
  NumCST_ICM,
  NumCST_IPI,
  NumCSOSN,
--Ronaldo Chamado 317536
  flagPrevalecerAliqIcm,
--Gabriella - 333391
  TipoValorNaoTributadoIPI
FROM
  Tributacoes
WHERE Codigo = :CodTributacao
  AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao,:CodEntidade, :CodOperacao, :AEmpMestre))
INTO
  :TriAliqICM,
  :TriFlagIsentoProdutor,
  :TriFlagSubTributaria,
  :TriMargemLucroSubst,
  :TriPerReducaoICM,
  :TriPerRedMargem,
  :TriTipoCFOP,
  :TriCodTributacaoSubTrib,
  :TriTipoValorNaoTributado,
  :TriPerReducaoSubTrib,
--Rafael chamado 272635
  :trialiqinternasubtrib,
  :TriNumCST_ICM,
  :TriNumCST_IPI,
  :TriNumCSOSN,
  :TriFlagPrevalecerAliqIcm,
--Gabriella - 333391
  :TriTipoValorNaoTributadoIPI;


 AuxEntidade = CodEntidade;
--Verifica a entrada de item com substituição tributaria, quando está marcado no parametro para verificar
--como estado de origem, por causa da substituição tributaria interna no estado.

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

IF ((FlagEntrada = 1) AND
   (Existe = 1)) THEN
BEGIN
  SELECT FIRST 1
    FlagSubTributaria,
    CodTributacaoSubTrib
  FROM Tributacoes
  WHERE Codigo = :CodTributacao
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao, :AEmpMestre, :CodOperacao, :AEmpMestre))
  INTO
    :AuxFlagSubTributaria,
    :AuxCodTributacaoSubTrib;

  IF (AuxFlagSubTributaria IS NULL) THEN
    AuxFlagSubTributaria = 0;
  IF (AuxCodTributacaoSubTrib IS NULL) THEN
    AuxCodTributacaoSubTrib = '';
  IF ((AuxFlagSubTributaria = 1) AND (AuxCodTributacaoSubTrib <> '')) THEN
  BEGIN
    TriCodTributacaoSubTrib = AuxCodTributacaoSubTrib;
    TriFlagSubTributaria =  AuxFlagSubTributaria;
    AuxEntidade = AEmpMestre;
  END
END

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

--Leitura dos dados da tributação linkada com a substituição tributaria
IF ((ltrim(TriCodTributacaoSubTrib) <> '') AND
   (TriFlagSubTributaria = 1) AND
   (ClaFlagSubTributaria = 1) AND
   (GruFlagSubTributaria = 1) AND
   ((FlagEntrada = 0) OR
    (FlagEntrada = 0) AND (Existe = 1))) THEN
BEGIN
  SELECT FIRST 1
    AliqICM,
    FlagIsentoProdutor,
    FlagSubTributaria,
    MargemLucroSubst,
    PerReducaoICM,
    PerRedMargem,
    TipoCFOP,
    CodTributacaoSubTrib,
    TipoValorNaoTributado,
    PerReducaoSubTrib,
--Rafael chamado 272635
    AliqInternaSubTrib,
    NumCST_ICM,
    NumCST_IPI,
    NumCSOSN,
--Gabriella - 333391
    TipoValorNaoTributadoIPI
  FROM
    Tributacoes
  WHERE Codigo = :TriCodTributacaoSubTrib
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:TriCodTributacaoSubTrib,:AuxEntidade, :CodOperacao, :AEmpMestre))
  INTO
    :TriAliqICM,
    :TriFlagIsentoProdutor,
    :TriFlagSubTributaria,
    :TriMargemLucroSubst,
    :TriPerReducaoICM,
    :TriPerRedMargem,
    :TriTipoCFOP,
    :TriCodTributacaoSubTrib,
    :TriTipoValorNaoTributado,
    :TriPerReducaoSubTrib,
--Rafael chamado 272635
    :Trialiqinternasubtrib,
    :TriNumCST_ICM,
    :TriNumCST_IPI,
    :TriNumCSOSN,
--Gabriella - 333391
    :TriTipoValorNaoTributadoIPI;

  CodTributacao = TriCodTributacaoSubTrib;
END

IF (TriAliqICM IS NULL) THEN
  TriAliqICM = 0;
IF (TriFlagIsentoProdutor IS NULL) THEN
  TriFlagIsentoProdutor = 0;
IF (TriFlagSubTributaria IS NULL) THEN
  TriFlagSubTributaria = 0;
IF (TriMargemLucroSubst IS NULL) THEN
  TriMargemLucroSubst = 0;
IF (TriPerReducaoICM IS NULL) THEN
  TriPerReducaoICM = 0;
IF (TriPerRedMargem IS NULL) THEN
  TriPerRedMargem = 0;
IF (TriTipoCFOP IS NULL) THEN
  TriTipoCFOP = 0;
IF (TriCodTributacaoSubTrib IS NULL) THEN
  TriCodTributacaoSubTrib = '';
IF (TriPerReducaoSubTrib IS NULL) THEN
   TriPerReducaoSubTrib = 0;
--Rafael chamado 272635
IF (trialiqinternasubtrib IS NULL) THEN
  trialiqinternasubtrib=0;
if (TriNumCST_ICM is null) then
  TriNumCST_ICM = 0;
if (TriNumCST_IPI is null) then
  TriNumCST_IPI = 0;
if (TriNumCSOSN is null) then
  TriNumCSOSN = 0;


IF (TriTipoValorNaoTributado IS NULL) THEN
BEGIN
  IF (Codproduto = 8888888) THEN
    TriTipoValorNaoTributado = 1;
  ELSE
    TriTipoValorNaoTributado = 0;
END

--Gabriella - 333391
if (TriTipoValorNaoTributadoIPI is null) then
begin
  if (Codproduto = 8888888) then
    TriTipoValorNaoTributadoIPI = 1;
  else
    TriTipoValorNaoTributadoIPI = 0;
end

--Gabriella - 360511
--Se não zerar e na tributação estiver zero o item continuará com o perc. de redução de st
RedBaseSubTrib = 0;

--Eder Chamado 271756
IF (TriPerReducaoSubTrib <> 0) THEN
  RedBaseSubTrib = TriPerReducaoSubTrib;

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CodEstadoLeitura
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CodEstadoLeitura
  AND RegiaoDestino = :RegiaoDestinoLeitura
  AND AliqICM > 0
INTO
  :Existe;

--JALDO/RONALDO - CHAMADO 309941
 -- If ((FlagEntrada = 0) and
  If ( (FlagEntrada = 0 or (FlagEntrada = 1 and OprTipoMovimento = 1)) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1
     AliqICM,
     --MARCELO - CHAMADO 214200
--     PerReducaoICM
    CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
  FROM
    tributacoes
  WHERE
    EstadoOrigem = :CodEstadoLeitura
    AND Codigo = :CodTributacao
    --MARCELO - CHAMADO 192283
--    and EstadoDestino = :CodEstadoLeitura
    AND RegiaoDestino = :RegiaoDestinoLeitura
    --Eder - 320407
    AND AliqICM > 0

  ORDER BY
    TipoPessoa
  INTO
    :EstAliqInterna,
    :RedBaseSubTrib;
END

IF (RedBaseSubTrib IS NULL) THEN
  RedBaseSubTrib = 0;

--Rafael chamado 272635
IF (trialiqinternasubtrib <> 0) THEN
 EstAliqInterna = triAliqInternaSubTrib;

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CidEmpCodEstado
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CidEmpCodEstado
  --Eder - Chamado 243637
  --and RegiaoDestino = :RegiaoDestino
  AND RegiaoDestino = :RegiaoOrigem
  AND AliqICM > 0
INTO
  :Existe;

IF ((FlagEntrada = 1) AND
--Eder - Chamado 184973
    (OprTipoMovimento <> 1) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1 AliqICM,
         CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
    FROM Tributacoes
   WHERE EstadoOrigem=:CidEmpCodEstado
     AND Codigo=:CodTributacao
     --MARCELO - CHAMADO 192283
--     and EstadoDestino=:CidEmpCodEstado
  --Eder - Chamado 243637
     --and RegiaoDestino=:RegiaoDestino
     AND RegiaoDestino=:RegiaoOrigem
-- Isaac - Chamado 189946   
     AND AliqICM > 0

   ORDER BY TipoPessoa
   INTO :EstAliqInterna , :RedBaseSubTrib;
END    
IF (EstAliqInterna IS NULL) THEN
   EstAliqInterna = 0;


IF (CodSubTributaria > 0) THEN
BEGIN                  
  SELECT                   
      AliquotaInterna, MargemLucro, PercReducao,
      IndiceReducao, FlagAbaterICM, FlagSomaIPI
  FROM SubstituicaoTributaria                  
  WHERE CodSubTributaria = :CodSubTributaria
    AND Empresa = :Empresa
  INTO :SubAliquotaInterna, :SubMargemLucro, :SubPercReducao,
       :SubIndiceReducao, :SubFlagAbaterICM, :SubFlagSomaIPI;
END
IF (SubAliquotaInterna IS NULL) THEN
   SubAliquotaInterna = 0;
IF (SubMargemLucro IS NULL) THEN
   SubMargemLucro = 0;
IF (SubPercReducao IS NULL) THEN
   SubPercReducao = 0;
IF (SubIndiceReducao IS NULL) THEN
   SubIndiceReducao = 0;
IF (SubFlagAbaterICM IS NULL) THEN
   SubFlagAbaterICM = 0;
IF (SubFlagSomaIPI IS NULL) THEN
    SubFlagSomaIPI = 0;

--Calculo do CST de ICMS e IPI 
Select Case when Op.NumCST_ICM = -1 then :TriNumCST_ICM
            else Op.NumCST_ICM End,
       Case when Op.NumCST_IPI <> -1
                 then Op.NumCST_IPI   --Operação fiscal prevalece sobre demais.
            when :AliqIPI > 0 and Op.TipoIPI = 0 --Item tributado de ipi sera sempre 00 ou 50 (entrada ou saida tributada)
                 then Case When :FlagEntrada = 1 Then 00 Else 50 End
            when Cla.NumCST_IPI not in (-1,0) and (:AliqIPI = 0 or Op.TipoIPI <> 0)
                 then Cla.NumCST_IPI -- Class. Fiscal prevalece sobre demais.
            when :TriNumCST_IPI <> -1 and (:AliqIPI = 0 or Op.TipoIPI <> 0)
                 then :TriNumCST_IPI    -- Item sem ipi pega da tributação se informado
       End,
       Case When :ParTipoRegimeTributario in (1,2)   --Calculo de CSOSN para Simples Nacional
            Then Case When Op.NumCSOSN not in(-1,0) then Op.NumCSOSN
                      Else :TriNumCSOSN End
       end
  From Produtos Pro
  Left Join Operacoes Op on Op.Codigo = :CodOperacao
  Left Join ClassFiscais Cla on Cla.Codigo = :CodClassFiscal
Where Pro.Codigo = :CodProduto
into :NumCstICM, :NumCstIPI, :NumCsosn;

if (NumCstICM <> -1) then
  NumCstICM = Cast(ProOrigem as varchar(1)) || Rs_Replicate('0', 2 - Rs_Length(:NumCstICM)) || Cast(:NumCstICM as varchar(2));
else
  NumCstICM = NULL;

--Gabriella - 299680
if (NumCstIPI <> -1 and :FlagEntrada = 1)then
  NumCstIPI = Rs_Replicate('0', 2 - Rs_Length(:NumCstIPI)) || Cast(:NumCstIPI as varchar(2));
if (NumCstIPI <> -1 and :FlagEntrada = 0)then
  NumCstIPI = Rs_Replicate('5', 2 - Rs_Length(:NumCstIPI)) || Cast(:NumCstIPI as varchar(2));
if (NumCstIPI = -1) then
  NumCstIPI = NULL;

if (NumCsosn <> -1 and ParTipoRegimeTributario in (1,2)) then --CSOSN para Simples Nacional
  NumCsosn = Rs_Replicate('0', 3 - Rs_Length(:NumCsosn)) || Cast(:NumCsosn as varchar(3));
else
  NumCsosn = NULL;



IF ((EntTipoPessoa = 'F') OR
   (EntTipoPessoa = 'N')) THEN
  AliqIcm = TriAliqICM;
ELSE
BEGIN
--Ronaldo Chamado 317536
--  IF (TriAliqICM < EstAliqContrib) THEN
--    AliqICM = TriAliqICM;
--  ELSE
--      AliqICM = EstAliqContrib;
  IF (TriFlagPrevalecerAliqIcm = 1) then
    AliqICM = TriAliqICM;
  ELSE
  BEGIN
    IF (TriAliqICM < EstAliqContrib) THEN
      AliqICM = TriAliqICM;
    ELSE
      AliqICM = EstAliqContrib;
  END
END

IF ((CidEmpCodEstado = CodEstadoLeitura) AND (TriFlagIsentoProdutor = 1)) THEN
  IF ((EntTipoPessoa = 'P') OR (EntTipoPessoa = 'J') OR (EntTipoPessoa = 'C') OR
      (EntTipoPessoa = 'I') ) THEN --JALDO - CHAMADO 248899
    AliqICM = 0;

IF ((OprTipoICM = 1) OR
    (OprTipoICM = 2 AND FlagEntrada = 0) OR
    (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
  AliqICM = 0;

IF (OprAliqICMFixo <> 0) THEN
  AliqICM = :OprAliqICMFixo;

--Eder - Chamado 295277
IF (AliqICMFixo <> 0) THEN
BEGIN
  --O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
  IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
     (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
     --Não pode fixar a aliquota de icms no simples senao nao calcula a ST
     AliqICM = AliqICM;
  ELSE
     AliqICM = AliqICMFixo;
END

--Gabriella - 333391                                                                                                                                                                               
ValorBaseIPI = ValorTotal + AcrescimoBaseIPI;
                                                                 
If (ValorBaseIPI > 0 and AliqIPI > 0) then
  VAuxValorIPI = (ValorBaseIPI * AliqIPI) / 100;

--Somente irá prevalecer o Tipo da Tributação quando a Aliquota de IPI for igual a Zero 
-- e o Tipo do Ipi da Operação Fiscal for Tributado   
if (AliqIPI = 0 and OprTipoIPI = 0) then
begin
 if (TriTipoValorNaoTributadoIPI = 0) then
   ValorIsentoIPI = ValorBaseIPI;
 if (TriTipoValorNaoTributadoIPI = 1) then
   ValorOutrasIPI = ValorBaseIPI;
end
   
if (OprTipoIPI = 1) then
  ValorIsentoIPI = ValorBaseIPI;
  
if (OprTipoIPI = 2) then
  ValorOutrasIPI = ValorBaseIPI;
  
If (AliqIPI = 0) then
  ValorBaseIPI = 0;
  
if (ValorIsentoIPI > 0 or ValorOutrasIPI > 0) then
  ValorBaseIPI = 0;

---Chamado 114964                                        
--If @OprTipoIPI = 0 or @OprTipoIPI = 3                                          
--Begin
--Gabriella - 333391
/*  IF ((ValorTotal > 0) AND (AliqIPI > 0)) THEN
    VAuxValorIPI = (ValorTotal * AliqIPI) / 100;*/
--End

IF ((TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (TriMargemLucroSubst <> 0)
   AND (EstFlagConvSub = 1)
   AND (OprTipoICM = 0)
   AND (OprTipoSubTributaria > 0)) THEN
BEGIN
  ValorBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTrib = ValorBaseSubTrib + VAuxValorIPI;
END

--Substituição tributaria não informada na nota, somente para sair na impressão do pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  ValorBaseSubTribCarga = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTribCarga = ValorBaseSubTribCarga + VAuxValorIPI;
END

IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0)
   AND (EstFlagConvSub = 1)) THEN
BEGIN                                        
  CalcBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (SubFlagSomaIPI = 1) THEN
     CalcBaseSubTrib = CalcBaseSubTrib + VAuxValorIPI;
END                                     

ValorBaseICM = ValorTotal + AcrescimoBaseICM;
--223515 ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseSubTrib;
ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;
CalcBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;

-- JALDO - CHAMADO 243556
-- O Tipo "2" não estão sendo verificando porque nunca será usado
--If (EntTipoPessoa <> 'J') then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
--  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--JALDO - CHAMADO 248899
--if (((TipoConsideraIPICalculoICM = 0) and (EntTipoPessoa <> 'J')) or
--   (TipoConsideraIPICalculoICM = 1)) then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
-- CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--Gabriella - 256424
--IF (EntTipoPessoa NOT IN ('J','I')) THEN
IF ((EntTipoPessoa NOT IN ('J','I')) or (oprflagipisobrebaseicm = 1)) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
END

ValorIsentoICM = ValorBaseIcm; --Salva o Valor da Base como isentas antes das reducoes

IF (TriPerReducaoICM <> 0 AND ValorBaseIcm <> 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * TriPerReducaoICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * TriPerReducaoICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * TriPerReducaoICM) / 100);
END

IF (ValorBaseIcm > 0 AND OprPerRedICM > 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * OprPerRedICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * OprPerRedICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * OprPerRedICM) / 100);
END

IF (ValorBaseIcm > 0 AND AliqICM > 0) THEN
  ValorICM = (ValorBaseIcm * AliqICM) / 100;

--Ronaldo Chamado 313933
select R.PercIvaSimplificado from regimetributario R
left join entidades E on R.Codigo = E.codRegimeTributario  
where R.empresa = :Empresa and
      E.codigo  = :CodEntidade
INTO :RegTribPercIvaSimplicado;

IF (TriFlagSubTributaria = 1 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1
   AND TriMargemLucroSubst <> 0 AND EstFlagConvSub = 1 AND OprTipoICM = 0 AND OprTipoSubTributaria > 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0) THEN
    ValorBaseSubTrib = ValorBaseSubTrib - ((ValorBaseSubTrib  * RedBaseSubTrib) / 100);

--Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 and EstAliqInterna > 0) then
  BEGIN
     ValorSubTrib     = rs_RoundDec(ValorbaseSubTrib * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTrib = rs_RoundDec((ValorIcm + ValorSubTrib) / EstAliqInterna * 100,2);
  END
  ELSE
  begin
     IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
        ValorBaseSubTrib = ValorBaseSubTrib +  ((ValorBaseSubTrib * TriMargemLucroSubst) / 100);

     IF (ValorBaseSubTrib > 0 AND EstAliqInterna > 0) THEN
        ValorSubTrib = (ValorBaseSubTrib * EstAliqInterna) / 100;
        ValorSubTrib = ValorSubTrib - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  End
END

--Substituição tributaria não informada na nota, somente para sair no pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0) THEN
    ValorBaseSubTribCarga = ValorBaseSubTribCarga - ((ValorBaseSubTribCarga  * RedBaseSubTrib) / 100);

  --Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 and EstAliqInterna > 0)  then
  BEGIN
     ValorSubTribCarga     = Rs_RoundDec(ValorBaseSubTribCarga * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTribCarga = Rs_RoundDec((ValorIcm + ValorSubTribCarga) / EstAliqInterna * 100,2);
  END
  ELSE
  Begin
    IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
       ValorBaseSubTribCarga = ValorBaseSubTribCarga +  ((ValorBaseSubTribCarga * TriMargemLucroSubst) / 100);
    IF (ValorBaseSubTribCarga > 0 AND EstAliqInterna > 0) THEN
       ValorSubTribCarga = (ValorBaseSubTribCarga * EstAliqInterna) / 100;
       ValorSubTribCarga = ValorSubTribCarga - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  End
END

--Calculo da substituição tributaria pela tabela SubstituicaoTributaria              
IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0) AND (EstFlagConvSub = 1)) THEN
BEGIN              
  IF (SubPercReducao <> 0) THEN
     CalcBaseSubTrib  = CalcBaseSubTrib - ((CalcBaseSubTrib * SubPercReducao) / 100);
  IF (SubMargemLucro <> 999.99) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  ((CalcBaseSubTrib * SubMargemLucro) / 100);
  IF (SubIndiceReducao <> 0) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  (CalcBaseSubTrib * SubIndiceReducao);
          
  --Quando não tem aliquota interna na sub.trib, pega a do estado de origem          
  IF ((CalcBaseSubTrib > 0) AND
     ((SubAliquotaInterna > 0) OR (EstAliqInterna > 0))) THEN
  BEGIN            
    IF (SubAliquotaInterna > 0) THEN
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * SubAliquotaInterna) / 100;
    END
    ELSE            
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * EstAliqInterna) / 100;
    END
  END            
          
  --Opção que permite abater o icms da operação na substituição tributaria          
  IF (SubFlagAbaterICM = 1) THEN
     CalcValorSubTrib = CalcValorSubTrib - Rs_RoundDec((CalcBaseSubTribDestino * AliqICM) / 100,2);
  
  IF ((OprTipoICM = 0) AND (OprTipoSubTributaria > 0)) THEN
  BEGIN              
    ValorBaseSubTrib = CalcBaseSubTrib;
    ValorSubTrib = CalcValorSubTrib;
  END              
              
  --Eder - Chamado 262460
  IF (OprTipoSubTributariaCarga = 0) THEN
  BEGIN
    ValorBaseSubTribCarga = CalcBaseSubTrib;
    ValorSubTribCarga = CalcValorSubTrib;
  END
END              

--MARCELO - CHAMADO 195051
IF ((ValorBaseSubTrib <> 0) OR (ValorSubTrib <> 0))  THEN
BEGIN
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
END

--Eder - Chamado 295277
--O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
    (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
BEGIN
  IF (TriAliqICM <= 0) THEN
    AliqICM = 0;
  ELSE
    AliqICM = ParAliqICMSimples;
  IF ((OprTipoICM = 1) OR
      (OprTipoICM = 2 AND FlagEntrada = 0) OR
      (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
    AliqICM = 0;
  ValorICM = (ValorBaseIcm * AliqICM) / 100;
END


IF (AliqICM = 0) THEN
  ValorBaseIcm = 0;
ELSE
  ValorIsentoICM = ValorIsentoICM - ValorBaseIcm;


IF ((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    ValorIsentoICM = 0;
  END    
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        


--Calcula o Fator de Redução de Custo
FatorRedCusto = 1;
IF (ParTipoReducaoICM = 1 AND Ltrim(CodEntidade) <> ''
  AND (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))
--Eder - Chamado 170325
  AND (CodProduto <> 8888888)) THEN
BEGIN
IF (NOT(((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))))) THEN
--  Isaac - Chamado 191232
--  If (OprTipoSubTributaria not in(2,3)) then   --não calcula quando a sub. tributaria é isenta/outras
  BEGIN
     FatorRedCusto = (100 - TriAliqICM) / (100 - AliqICM);
  END

  IF (OprPerRedMargem <> 0) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (OprPerRedMargem / 100);
  END

  --Eder - Chamado 270320
  --If (TriPerRedMargem <> 0) then
  --begin
  --  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
  --end
END
--Eder - Chamado 270320
IF ((TriPerRedMargem <> 0) AND (CodProduto <> 8888888)) THEN
BEGIN
  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
END

-- 298865
--Eder - Chamado 195755
--Somente vai calcular DespesasNaoInclusas no fator quando for saída ou devolução      
-- Renato - 278440
if ((FlagEntrada = 0) or
    ((FlagEntrada = 1) and (OprTipoMovimento = 1))) then
begin
  --Eder - Chamado 170325
  --Adiciona o acrescimo de custo, que já deve vir passado como percentual
  If ((PerRedDespesa <> 0) and (ParTipoReducaoICM in (0,1)) and (flagdeduzirdespnaoinclnamargem = 0)) then
  begin
    FatorRedCusto = FatorRedCusto + PerRedDespesa;
  end
end

--Calcula o fator de venda para as saídas e entradas por devolução.
--Retira o Valor do ICM, a Aliquota de CPMF, a Aliquota de PIS/COFINS e soma o acrescimo de vend
FatorRedVenda = 1;
IF (((FlagEntrada = 0) OR
    ((FlagEntrada = 1) AND (OprTipoMovimento = 1)))
   -- Renato - 278440
   AND (ParTipoReducaoICM = 2)) THEN -- 2 - Deduzir Impostos da Venda
BEGIN
  --Eder -Chamado 292832 - Evitar arredondamento desnecessario na aliquota do ICM (Vide Chamado)
  IF ((AliqICM > 0) AND (ValorTotal > 0)) THEN
     IF (ValorBaseICM = ValorTotal + AcrescimoBaseICM) THEN
        FatorRedVenda = FatorRedVenda - (CAST(AliqICM AS NUMERIC(7,4))/ 100);
     ELSE
        FatorRedVenda = FatorRedVenda -
                        Rs_RoundDec(((CAST(ValorICM AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);

  IF (ParAliqCPMF > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(ParAliqCPMF AS NUMERIC(7,4))/ 100);

  IF (AliqPISCOFINS > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);

  IF ((LisPercAcrescimoAdm1 + LisPercAcrescimoAdm2 + LisPercAcrescimoAdm3) > 0) THEN
     FatorRedVenda = FatorRedVenda -
              ((CAST(LisPercAcrescimoAdm1 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm2 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm3 AS NUMERIC(9,4))) / 100);

--calcula o percentual do acrescimo de despesas de venda sobre o total do item para achar o fator
  IF ((AcrescimoRedVenda <> 0) AND (ValorTotal > 0)) THEN
     FatorRedVenda = FatorRedVenda -
                     Rs_RoundDec(((CAST(AcrescimoRedVenda AS NUMERIC(9,4)) * 100) / CAST(ValorTotal AS NUMERIC(11,4))) / 100,4);

  --Renato - 290579
  -- Se for uma venda fora do estado e os Percentuais de ICMS e SubTrib da Compra estiverem informados
  -- no Item da Lista de Preco vai abater o ICMS da compra no Custo.
  IF ((CidEmpCodEstado <> CidCodEstado) AND (PercICMCusto > 0) AND (PercSubTribCusto > 0)) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (PercICMCusto / 100);
  END
END

--Renato - 278440
IF ((PerRedDespesa <> 0) AND (FlagDeduzirDespNaoInclNaMargem = 1) AND (ParTipoReducaoICM <> 2)) THEN
BEGIN                                                    
  FatorRedVenda = FatorRedVenda - PerRedDespesa;
END  


--Eder - 303720            
AcrDespesasPisCOFINS = AcrescimoBaseICM;
if (OprFlagIPISobrePisCofins = 1) then --Calcula IPI sobre Pis e COFINS
  AcrDespesasPisCOFINS = AcrDespesasPisCOFINS + VAuxValorIPI;

-- Renato - Chamado 272165
--Renato - 283520
SELECT ValorBasePisCofins, AliqPis, AliqCofins, NumCstPisCofins, NatReceitaPisCofins, NatBaseCalcCredito
  FROM Calcular_PisCofins(:Empresa, :CodProduto, :CodEntidade, :CodTributacao, :CodOperacao,
                          :CodClassFiscal, :ValorTotal, :AcrDespesasPisCOFINS, :FlagEntrada)
  -- Renato - 297792
  INTO :ValorBasePisCofins, :AliqPis, :AliqCofins, :NumCstPisCofins, :NatReceitaPisCofins, :NatBaseCalcCredito;

--usar a variável CidCodEstado pois não pode considerar a opção de "considerar ICM de origem" na hora
--de calcular o CFOP
---Calculo do CFOP do Item
IF (CodProduto = 8888888) THEN  --- Quando for servico
BEGIN
  IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX'
     AND Ltrim(OprCFOP_Servico_NCFora) <> '') THEN
    NumCFOP = OprCFOP_Servico_NCFora;
  ELSE
    NumCFOP = OprCFOP_Servico;
END
ELSE
BEGIN
  IF (TriTipoCFOP = 1 OR TriTipoCFOP = 0) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP1_Normal_NCFora) <> '') THEN
      NumCFOP = OprCFOP1_Normal_NCFora;
    ELSE
      NumCFOP = OprCFOP1_Normal;
  END
  IF (TriTipoCFOP = 2) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP2_Industrializado_NCFora) <> '') THEN
      NumCFOP = OprCFOP2_Industrializado_NCFora;
    ELSE
      NumCFOP = OprCFOP2_Industrializado;
  END
  IF (TriTipoCFOP = 3) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP3_SubRevenda_NC;
    ELSE
      NumCFOP = OprCFOP3_SubRevenda;
  END
  IF (TriTipoCFOP = 4) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP4_SubRevendaML_NC;
    ELSE
      NumCFOP = OprCFOP4_SubRevendaML;
  END
  IF (TriTipoCFOP = 5) THEN ----
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP5_SubFabricacao_NC;
    ELSE
      NumCFOP = OprCFOP5_SubFabricacao;
  END
  IF (TriTipoCFOP = 6) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP6_SubFabricacaoML_NC;
    ELSE
      NumCFOP = OprCFOP6_SubFabricacaoML;
  END
  IF (TriTipoCFOP = 7) THEN
  BEGIN
    NumCFOP = OprCFOP7_Importado;
  END
  IF (TriTipoCFOP = 9) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N','C','P')) THEN
      NumCFOP = OprCFOP9_Petroleo_NC;
    ELSE
      NumCFOP = OprCFOP9_Petroleo;
  END
END

IF (rs_Substring(NumCFOP,1,1) IN ('1','2','3') AND CidCodEstado <> CidEmpCodEstado) THEN --Entradas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '3' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '2' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

IF (rs_Substring(NumCFOP,1,1) IN ('5','6','7') AND CidCodEstado <> CidEmpCodEstado) THEN --Saídas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '7' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '6' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

--MARCELO - CHAMADO 209798
/*
CFOP 5.405 não existe o seu correlado 6.405 para vendas fora do estado, 
devendo ser utilizado em seu lugar o CFOP 6.404, conforme reunião definada
com Eder
*/
-- Rafael chamado 224824
--if (NumCFOP = '6405') then
  --NumCFOP = '6404';
 IF (NumCFOP = '6405') THEN
  NumCFOP = '6404';

 IF (NumCFOP = '6.405') THEN
  NumCFOP = '6.404';


--Teste de Valores Nulos
IF (NumCFOP IS NULL) THEN
  NumCFOP = '';
IF (AliqICM IS NULL) THEN
  AliqICM = 0;

IF (CodProduto = 8888888) THEN   -- para serviço nao pode calcular o icm
BEGIN
  -- Renato - 341779
  if ( (OprFlagICMSSobreServicos = 0) or (OprTipoIcm in (1,2)) ) then
  begin
    AliqICM = 0;
    ValorBaseIcm = 0;
    ValorICM = 0;
    ValorIsentoICM = 0;
    ValorOutrasICM = 0;
                                         
    if (OprFlagICMSSobreServicos = 0) then
    begin                                                                            
      if (TriTipoValorNaoTributado = 0) then
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      else                                                                          
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    end
    else
    begin
      if (OprTipoIcm = 1) then
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      else                                 
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    end
                                                                                                    
  end
  else if ( (OprFlagICMSSobreServicos = 1) and (OprTipoIcm = 0) and ((AliqICM = 0) or (ValorBaseIcm = 0)) ) then
  begin
    if (TriTipoValorNaoTributado = 0) then
      ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
    else                                                                          
      ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
  end

  ValorBaseSubTrib = 0;
  ValorSubTrib = 0;
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
  RedBaseSubTrib = 0;
--Eder - Chamado  170325
--FatorRedCusto = 1;
  FatorRedVenda = 1;
  AliqPISCOFINS = 0;
END
PerRedBaseSubTrib = RedBaseSubTrib;

--Eder - 297029
If (ValorBaseICM > 0 and ValorIsentoICM > 0) then
  --Renato - 361064
  --PerReducaoICM = Rs_RoundDec(ValorIsentoICM / (ValorBaseICM + ValorIsentoICM) * 100,2);
  PerReducaoICM = TriPerReducaoICM;
else
  PerReducaoICM = 0;

--Renato - 360358
if (ValorBaseSubTrib = 0  and ValorSubTrib = 0 and ValorBaseSubTribCarga = 0 and ValorSubTribCarga = 0) then
begin
  EstAliqInterna = 0;
  TriMargemLucroSubst = 0;
end 

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = TriMargemLucroSubst;


--Define o valor de isento ou o valor de outras para o que não foi tributado
IF ((CodProduto <> 8888888) AND (ValorIsentoICM > 0)) THEN
BEGIN
  --Chamado 156315 - calculando errado valor de isentas com tributação com coluna de outras
  IF ((OprTipoICM = 2) OR
      ((TriTipoValorNaoTributado = 1) AND (OprTipoICM = 0))) THEN
  BEGIN
    --MARCELO - CHAMADO 240364
    IF ((NOT((OprTipoSubTributaria IN(2,3)) AND
             (ClaFlagSubTributaria = 1) AND
             (GruFlagSubTributaria = 1) AND
             (EstFlagConvSub = 1) AND
             ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0)))) OR
        (OprTipoICM = 2)) THEN
    BEGIN
      ValorOutrasICM = ValorIsentoICM;
      ValorIsentoICM = 0;
    END
  END
END

SUSPEND;

END
^

ALTER TABLE PREPEDIDO ADD CODOPERACAO INTEGER DEFAULT 0 NOT NULL^

SET TERM ; ^

ALTER TABLE VEICULOS ADD CODENTIDADEOFICINA CHAR(7) DEFAULT '' NOT NULL COLLATE WIN_PTBR;


ALTER TABLE VEICULOS ADD EMPRESAOSGARANTIA INTEGER DEFAULT 0 NOT NULL;

CREATE TABLE RESSARCSTPRODUTO(
    CODPRODUTO INT NOT NULL,
    DATAINCLUSAO TIMESTAMP,
    DATAEXCLUSAO TIMESTAMP,
    FLAGINATIVO SMALLINT);


ALTER TABLE RESSARCSTPRODUTO ADD
    CONSTRAINT PK_RESSARCSTPRODUTO PRIMARY KEY (CODPRODUTO);

CREATE TABLE RESSARCSTSALDO (
        CODPRODUTO INT NOT NULL,
        DATASALDO TIMESTAMP NOT NULL,
        EMPRESAESTOQUE INT NOT NULL,
        TIPOSALDO SMALLINT, 
        QUANTESTOQUE NUMERIC(18,2),
        VALORBASESTUNITARIO NUMERIC(18,2),
        ALIQICM NUMERIC(5,2),
        VALORBASECONFRONTO NUMERIC(18,2));

    ALTER TABLE RESSARCSTSALDO ADD CONSTRAINT PK_RESSARCSTSALDO PRIMARY KEY
    (CODPRODUTO, DATASALDO, EMPRESAESTOQUE);

CREATE TABLE RESSARCSTSAIDA(
        NUMLANCAMENTO INT NOT NULL,
        NUMSEQUENCIA INT NOT NULL,
        EMPRESA SMALLINT NOT NULL,
        DATAGERACAO TIMESTAMP,
        VALORBASEST NUMERIC(18,2),
        VALORST  NUMERIC(18,2),
        ALIQINTST NUMERIC(18,2),
        VALORBASEICM NUMERIC(18,2),
        VALORICM  NUMERIC(18,2),
        ALIQICM  NUMERIC(5,2),
        VALORBASECONFRONTO NUMERIC(18,2),
        FLAGRESSARCIMENTO SMALLINT,
        DADOSPESQUISA VARCHAR(1000) COLLATE WIN_PTBR);


ALTER TABLE RESSARCSTSAIDA
    ADD CONSTRAINT PK_RESSARCSTSAIDA PRIMARY KEY
    (
        NUMLANCAMENTO,
        NUMSEQUENCIA,
        EMPRESA
    );

CREATE TABLE RESSARCSTENTRADA(
        EMPRESA SMALLINT NOT NULL,
        NUMLANCAMENTOSAIDA INT NOT NULL,
        NUMSEQUENCIASAIDA INT NOT NULL,
        TIPOORIGEM SMALLINT NOT NULL,
        DATAINVENTARIO TIMESTAMP,
        PERCIVA NUMERIC(4, 2) NOT NULL,
        TIPOCALCULO SMALLINT NOT NULL,
        NUMLANCAMENTOENTRADA INT NOT NULL,
        QUANTENTRADA NUMERIC(10, 3) NOT NULL,
        VALORUNITARIO NUMERIC(13, 4) NOT NULL,
        ALIQICM NUMERIC(4, 2) NOT NULL,
        VALORBASEST NUMERIC(11, 2) NOT NULL,
        VALORICM NUMERIC(11, 2) NOT NULL);

ALTER TABLE RESSARCSTENTRADA ADD 
     CONSTRAINT PK_RESSARCSTENTRADA PRIMARY KEY
    (
        EMPRESA,
        NUMLANCAMENTOSAIDA,
        NUMSEQUENCIASAIDA,
        NUMLANCAMENTOENTRADA);

CREATE TABLE RESSARCSTTEMP(
        NUMLANCAMENTO INT NOT NULL,
        NUMSEQUENCIA INT NOT NULL,
        EMPRESA SMALLINT NOT NULL,
        CODPRODUTO INT NOT NULL,
        TIPOMOVIMENTO SMALLINT NOT NULL,
        CODOPERACAO INT NOT NULL, 
        QUANTRESTANTE NUMERIC(10, 3) NOT NULL,
        DATAMOVIMENTO TIMESTAMP,
        FLAGST SMALLINT NOT NULL,
        VALORUNITARIO NUMERIC(13, 4) NOT NULL,
        ALIQICM NUMERIC(4, 2) NOT NULL,
        VALORBASEST NUMERIC(11, 2) NOT NULL,
        VALORICM NUMERIC(11, 2) NOT NULL);

ALTER TABLE RESSARCSTTEMP
ADD CONSTRAINT PK_RESSARCSTTEMP PRIMARY KEY
(
    NUMLANCAMENTO,
    NUMSEQUENCIA,
    CODPRODUTO,
    EMPRESA
);

CREATE INDEX RESSARCSTTEMP1 ON RESSARCSTTEMP
(
    CODPRODUTO,
    TIPOMOVIMENTO,
    DATAMOVIMENTO
);


--Gabriella - 352337
ALTER TABLE VEICULOCHEQUEGARANTIA ADD DATAREVISAO TIMESTAMP;

update RDB$FIELDS set
RDB$FIELD_LENGTH = 500,
RDB$CHARACTER_LENGTH = 500
where RDB$FIELD_NAME = (select rdb$field_source from rdb$relation_fields
                        where Upper(rdb$relation_name) = 'VEICULOS'
                        and Upper(rdb$field_name) = 'OBSERVACAO');

SET TERM ^ ;

ALTER PROCEDURE STORED_PRFT110VALIDAR (
    empresa integer,
    codoperacao integer,
    flagcupom integer,
    ped_sequencia integer,
    venc_sequencia integer,
    codcondpagto char(5),
    tipoduplicata integer,
    tipoduplicatapedido integer,
    flagsepararservico smallint,
    seriecontrole char(3),
    salvanumdocumento integer,
    seriecontroleservico char(3),
    salvanumdocumentoservico integer,
    quantnotaitem integer,
    quantnotaservico integer)
returns (
    mensagemerro varchar(400))
as
declare variable empresaestoque integer;
declare variable valortotalpedidos numeric(11,2);
declare variable valortotalsubtrib numeric(11,2);
declare variable valoripidespesas numeric(11,2);
declare variable valortotalretencoes numeric(11,2);
declare variable duplicatast smallint;
declare variable flaggerarduplicata smallint;
declare variable datamovimento timestamp;
declare variable flagobrigalancfiscais smallint;
declare variable existe integer;
declare variable resto numeric(11,2);
declare variable contador1 integer;
declare variable contador2 integer;
declare variable qtdparcelas integer;
declare variable sumvalorprodutos numeric(11,2);
declare variable sumvalorrece numeric(11,2);
declare variable flagnaogerenciarnumdocumento smallint;
declare variable sumvalorrecs numeric(11,2);
declare variable empid varchar(15);
begin
/******************
VERSÃO 3.01
******************/

-- Eder Ramos - CHAMADO 302201
 select FlagNaoGerenciarNumDocumento
 from ParamControleSerie
 where Empresa = :Empresa
 and Serie = :SerieControle
 Into :FlagNaoGerenciarNumDocumento;

--Gabriella - 301399
SELECT ID
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :EmpId;

--Eder Ramos - Chamado 304095
if(FlagSepararServico = 1) then
begin
        select FlagNaoGerenciarNumDocumento
        from ParamControleSerie
        where Empresa = :Empresa
        and Serie = :SerieControleServico
        Into :FlagNaoGerenciarNumDocumento;
end

  --MARCELO - CHAMADO 158510/199271
  select EmpresaEstoque
  from Empresas
  where Codigo = :Empresa
  into :EmpresaEstoque;

  -- JALDO - CHAMADO 173858
  --  Verifica se existem pedidos de empresa de estoque diferente e bloqueia
  Existe = null;
  Select
    1
  From TempPRFT110Pedido T
    left join Pedidos P on P.Empresa = T.Empresa
                       and P.CodPedido = T.CodPedido
    left join Empresas E on E.Codigo = P.Empresa
  Where T.NumSequencia = :Ped_Sequencia
    and E.EmpresaEstoque <> :EmpresaEstoque
  into :Existe;

  if (Existe is not null) then
  begin
    MensagemErro = 'Existem Pedidos de empresa de estoque diferente do processamento e esta operação não é permitida. Processamento Cancelado!';
    suspend;
    exit;
  end

  --163317
  Existe = null;
  Select
    1
  From TempPRFT110Pedido T
    Left Join Pedidos P on T.Empresa = P.Empresa
                       And T.CodPedido = P.CodPedido
    --Gabriella - 359419
    Left Join OrdemServico OS On OS.Codigo = P.CodOS
                             and OS.Empresa = P.EmpresaOS
  Where NumSequencia = :Ped_Sequencia
  --Gabriella - 359419
  --Having Min(P.CodEntidade) <> Max(P.CodEntidade)
  Having Min(Case When coalesce(OS.CodEntidadeNF, '') = '' Then P.CodEntidade
                  Else OS.CodEntidadeNF End) <>
         Max(Case When coalesce(OS.CodEntidadeNF, '') = '' Then P.CodEntidade
                  Else OS.CodEntidadeNF End)
  Into :Existe;

  if (Existe is not null) then
  begin
    MensagemErro = 'Pedidos de diferentes entidades foram processados e esta operação não é permitida. Processamento Cancelado!';
    suspend;
    exit;
  end

  --Acumula os totais dos pedidos
  --MARCELO - CHAMADO 158510/199271
--  select
--    sum(Ped.ValorTotalPedido), sum(Ped.ValorSubTrib),
--    sum(Ped.ValorIPIDespesas), sum(Ped.ValorIRRF), sum(Ped.ValorOutrosCOFINS),
--    sum(Ped.ValorPrevidencia), sum(Ped.ValorRetencaoISS), sum(Ped.ValorRetencaoICM)
--  from Pedidos Ped, TempPrft110Pedido Temp
--  where Ped.Empresa = Temp.Empresa
--   and Ped.CodPedido = Temp.codpedido
--   and Temp.NumSequencia = :Ped_Sequencia
--  into :ValorTotalPedidos, :ValorTotalSubTrib,
--       :ValorIPIDespesas, :ValorIRRF, :ValorOutrosCOFINS,
--       :ValorPrevidencia, :ValorRetencaoISS, :ValorRetencaoICM;
  select
    sum(Ped.ValorTotalPedido), sum(Ped.ValorSubTrib),
    sum(Ped.ValorIPIDespesas), sum(Ped.ValorTotalRetencoes)
  from TempPrft110Pedido Temp, Pedidos Ped
  where Temp.NumSequencia = :Ped_Sequencia
   and Ped.Empresa = Temp.Empresa
   and Ped.CodPedido = Temp.codpedido

  into :ValorTotalPedidos, :ValorTotalSubTrib,
       :ValorIPIDespesas, :ValorTotalRetencoes;

  --Confere os totais processados
  select
    --MARCELO - CHAMADO 158510/199271
--    sum(ValorTotalNota - ValorSubTrib - ValorIPIDespesas + ValorIRRF + ValorOutrosCOFINS +
--        ValorPrevidencia + ValorRetencaoISS + ValorRetencaoICM)
    sum(ValorTotalNota - ValorSubTrib - ValorIPIDespesas + ValorTotalRetencoes)
  from TempPrft110Nota T, NotasFiscais N
  where T.NumSequencia = :Ped_Sequencia
    and N.Empresa = T.Empresa
    and N.TipoControle = T.TipoControle
    and N.CodControle = T.CodControle
  into :Resto;

  --MARCELO - CHAMADO 158510/199271
--  if ((ValorTotalPedidos - ValorTotalSubTrib - ValorIPIDespesas + ValorIRRF + ValorOutrosCOFINS +
--       ValorPrevidencia + ValorRetencaoISS + ValorRetencaoICM) <> Resto) then
/*  if ((ValorTotalPedidos - ValorTotalSubTrib - ValorIPIDespesas + ValorTotalRetencoes) <> Resto) then
  begin
    MensagemErro = 'Valor Processado ('||CAST(ValorTotalPedidos - ValorTotalSubTrib - ValorIPIDespesas + ValorTotalRetencoes AS VARCHAR(20))||') não confere com o Total das Notas Geradas ('||CAST(RESTO AS VARCHAR(20))||'). Operação Cancelada!';
    suspend;
    exit;
  end*/

   --314003
  --if ((ValorTotalPedidos - ValorTotalSubTrib - ValorIPIDespesas + ValorTotalRetencoes) <> Resto) then
  if (CAST((ValorTotalPedidos - ValorTotalSubTrib - ValorIPIDespesas + ValorTotalRetencoes) AS NUMERIC(11,2)) <> Resto) then
  begin
    MensagemErro = 'Valor Processado não confere com o Total das Notas Geradas. Operação Cancelada!';
    suspend;
    exit;
  end


  --MARCELO - CHAMADO 184942
  DuplicataST = 0;
  
 --Gabriella - 301399
  if (empid = 'DINAMAR') then
  begin
    select Coalesce(1, 0)
    from ParamControle PC
    where PC.Empresa = :Empresa
      and PC.ValorMinimoST <> 0
      --Gabriella - 347726
      /*and PC.ValorMinimoST <= (Select Coalesce(Sum(Ped.ValorSubTrib), 0)
                               From TempPrft110Pedido T
                               left join Pedidos Ped on Ped.Empresa = T.Empresa
                                                    and Ped.CodPedido = T.CodPedido
                                                    and Ped.TipoPedido <> 4
                                Where T.Empresa = :Empresa
                                  and T.NumSequencia = :Ped_Sequencia)*/
      and PC.ValorMinimoST <= (Select Coalesce(Sum(N.ValorSubTrib), 0)
                               From TempPrft110Nota T
                               left join NotasFiscais N on N.Empresa = T.Empresa
                                                    and N.TipoControle = T.TipoControle
                                                    and N.CodControle = T.CodControle
                                Where T.NumSequencia = :Ped_Sequencia)
      and Exists(select first 1 min(CPV.CodCondPagto)
                 from CondPagtoVenc CPV
                 where CPV.CodCondPagto = :CodCondPagto)

      --Gabriella - 349341
      --and not PC.DiasVencimentoDupST in (select CPV.DiaVencimento
      and PC.DiasVencimentoDupST < (select min(CPV.DiaVencimento)
                                     from CondPagtoVenc CPV
                                     where CPV.CodCondPagto = :CodCondPagto
                                     and CPV.MesVencimento = 0)
      --Gabriella - 347726
      /*and Exists(Select First 1 TmpV.Vencimento
                     From Tempprft110venc TmpV
                     where TmpV.NumSequencia = :Venc_Sequencia
                     and TmpV.Vencimento = (Current_Date + PC.DiasVencimentoDupST)
                     and abs(TmpV.Valor - Coalesce((Select cast((Sum(Ped.ValorSubTrib) + Sum(Ped.ValorFrete) + Sum(Ped.valordespesas)) as numeric (11,2))
                                                 From TempPrft110Pedido T
                                                 left join Pedidos Ped on Ped.Empresa = T.Empresa
                                                                      and Ped.CodPedido = T.CodPedido
                                                                      and Ped.TipoPedido <> 4
                                                 Where T.Empresa = :Empresa
                                                 and T.NumSequencia = :Ped_Sequencia),0)) <= 0.01 )*/

    into :DuplicataST;
  end
  else
  begin
    select Coalesce(1, 0)
    from ParamControle PC
    where PC.Empresa = :Empresa
      and PC.ValorMinimoST <> 0
      and PC.ValorMinimoST <= (Select Coalesce(Sum(Ped.ValorSubTrib), 0)
                               From TempPrft110Pedido T
                               left join Pedidos Ped on Ped.Empresa = T.Empresa
                                                    and Ped.CodPedido = T.CodPedido
                                                    --Gabriella - Chamado 281636
                                                    and Ped.TipoPedido <> 4
                                Where T.Empresa = :Empresa
                                  and T.NumSequencia = :Ped_Sequencia)
      --MARCELO - CHAMADO 193583
      and Exists(select first 1 CPV.CodCondPagto
                 from CondPagtoVenc CPV
                 where CPV.CodCondPagto = :CodCondPagto)
      --MARCELO - CHAMADO 193772
      and not PC.DiasVencimentoDupST in (select CPV.DiaVencimento
                                         from CondPagtoVenc CPV
                                         where CPV.CodCondPagto = :CodCondPagto
                                           and CPV.MesVencimento = 0)
    into :DuplicataST;
  end

  if (:DuplicataST is null) then
    DuplicataST = 0;

  --MARCELO - CHAMADO 233642  
  DuplicataST = :DuplicataST * :QuantNotaItem;

  Select
    Par.FlagGerarDuplicata,
    ParSerie.DataMovimento
  From ParamControle Par
    Left Join ParamControleSerie ParSerie on ParSerie.Empresa = :Empresa
                                         and ParSerie.Serie=:SerieControle
  where Par.Empresa=:Empresa
  Into :FlagGerarDuplicata, :DataMovimento;

  if (rs_lTrim(CodCondPagto) <> '') then
  begin
    --Confere a quantidade de duplicatas
    Select Count(*)
    from TempPrft110Nota T
      Left Join Duplicatas D On T.Empresa = D.Empresa
                            and T.TipoControle = D.TipoControle
                            and T.CodControle = D.CodControle
      --marcelo
      Left Join CondPagto Cond on Cond.Codigo = :CodCondPagto
    Where D.TipoDuplicata = :TipoDuplicata
      and T.NumSequencia = :Ped_Sequencia
      and Cond.FlagAVista = 0
    Into :Contador1;

    select Count(*)
    from CondPagtoVenc CPV
    where CPV.CodCondPagto = :CodCondPagto
    Into :QTDPARCELAS;

    Select Count(*) * Case When (:FlagGerarDuplicata = 1) or (:TIPODUPLICATAPEDIDO = 1)
                           Then MIN(:QTDPARCELAS)
                           Else 0 End
    From TempPrft110Nota TAux
      Left Join CondPagto Cond On Cond.Codigo = :CodCondPagto
    Where TAux.NumSequencia = :Ped_Sequencia
      and Cond.FlagAVista = 0
    Into :Contador2;

    --MARCELO - CHAMADO 184942
    Contador2 = Contador2 + DuplicataST;

    If (Contador1 <> Contador2) then
    begin
      MensagemErro = 'Quantidade de duplicatas geradas: ' || Cast(Contador1 as varchar(10)) ||
      ' não confere com a condição de Pagamento: ' ||Cast(Contador2 as varchar(10))||
      ' Operação Cancelada!';
      suspend;
      exit;
    end
  end

  if (FlagGerarDuplicata = 1)then
  begin
    --confere os totais das duplicatas
    select sum(ValorTotalNota)
    from TempPrft110Nota T, NotasFiscais N
    where N.Empresa = T.Empresa
      and N.TipoControle = T.TipoControle
      and N.CodControle = T.CodControle
      and T.NumSequencia = :Ped_Sequencia
    into :SumValorProdutos;

    select Abs(sum(ValorTitulo))
    from TempPrft110Nota T, Duplicatas D
    where T.Empresa = D.Empresa
      and T.TipoControle = D.TipoControle
      and D.CodControle = T.CodControle
      and D.TipoDuplicata = :TipoDuplicata
      and T.NumSequencia = :Ped_Sequencia
    into :Resto;

    if ((SumValorProdutos <> Resto) --total de nota diferente do total da duplicata
        and (exists(select NumSequencia
                    from TempPrft110Venc
                    where NumSequencia = :Venc_Sequencia))) then
    begin
      MensagemErro = 'Valor das Notas não confere com o Total das Duplicatas Geradas. Operação Cancelada!';
      suspend;
      exit;
    end
  end

  If (FlagGerarDuplicata = 1) Then
  begin
    Select ABS(Sum(ValorRecebido))
    from  TempPrft110Caixa T
    Where T.NumSequencia   = :Venc_Sequencia
      and T.TipoLancamento = 'E'
    into :SumValorRecE;

    Select ABS(Sum(ValorRecebido))
    from  TempPrft110Caixa T
    Where T.NumSequencia   = :Venc_Sequencia
      and T.TipoLancamento = 'S'
    into :SumValorRecS;

    Select Abs(Sum(ValorDuplicata))
    from TempPrft110Nota T, Duplicatas D
    where T.NumSequencia   = :Ped_Sequencia
      and D.Empresa        = T.Empresa
      and D.TipoControle   = T.TipoControle
      and D.CodControle    = T.CodControle
      and D.TipoDuplicata  = :TipoDuplicata
      and D.DataPagamento is not NULL
    into :Resto;

    if (ABS(COALESCE(SumValorRecE,0) - COALESCE(SumValorRecS,0)) <> ABS(Resto)) Then
    Begin
      MensagemErro = 'Valor do Movimento de Caixa não confere com o Total das Baixas. Operação Cancelada!';
      suspend;
      exit;
    End
  End

  --Eder Ramos Chamado  - 302201
  if(FlagNaoGerenciarNumDocumento = 0) then
  begin
    Existe = null;
    Select Empresa
    --254456
    --From ParamControleSerie
    From ParamControleSequencia
    Where Empresa=:Empresa
        and Serie=:SerieControle
    --MARCELO - CHAMADO 158510/199271
    --    and UltimaNota <> (:SalvaNumDocumento + :QuantNota)
        and UltimaNota <> (:SalvaNumDocumento + :QuantNotaItem)
    Into :Existe;

    If ((FlagCupom = 0) and (Existe is not null)) then
    begin
        MensagemErro = 'Nota Fiscal gerada está com numeração fora da sequência. Operação Cancelada!';
        suspend;
        exit;
    end
  end

  -- Eder Ramos Chamado - 302201
  if(FlagNaoGerenciarNumDocumento = 0) then
  begin
    --Confere se a sequencia de numeração de nota esta correta
    Existe = null;
    select Empresa
     --254456
    --from ParamControleSerie
    from paramcontrolesequencia
    where Empresa = :Empresa
        and Serie = :SerieControleServico
        and UltimaNota <> (:SalvaNumDocumentoServico + :QuantNotaServico)
    Into :Existe;

    if ((FlagCupom = 0) and (FlagSepararServico = 1) and (Existe is not null)) then
    begin
        MensagemErro = 'Nota Fiscal de Serviço gerada está com numeração fora da sequência. Operação Cancelada!';
        suspend;
        exit;
    end
  end

  --MARCELO - CHAMADO 158510/199271
  --Confere se há duplicatas com vencimento inferior a data da nota
  Existe = null;
  Select D.Empresa
  From TempPrft110Nota T, Duplicatas D
  Where T.NumSequencia = :Ped_Sequencia
    and D.Empresa = T.Empresa
    and D.TipoControle = T.TipoControle
    and D.CodControle = T.CodControle
    and D.TipoDuplicata = :TipoDuplicata
    and (D.DataEmissao < :DataMovimento or
         D.DataVencimento < :DataMovimento or
         (D.DataPagamento is not null And D.DataPagamento < :DataMovimento))
  into :Existe;

  If ((FlagGerarDuplicata = 1) and (Existe is not null)) then
  begin
    MensagemErro = 'Há duplicatas com vencimento ou pagamento inferior a data da nota. Operação Cancelada!';
    suspend;
    exit;
  end

  --Controle de baixa de estoque do pedido
  --Não baixa estoque se for "baixa na separação" ou "não baixa estoque"
  select
    FlagObrigaLancFiscais
  from Operacoes
  where Codigo = :CodOperacao
  into :FlagObrigaLancFiscais;

  if ((FlagObrigaLancFiscais = 1) and
      (not Exists (Select T.Empresa
                   From TempPrft110Nota T
                     Left Join LancamentosFiscais LF on LF.Empresa = T.Empresa
                                                    and LF.TipoControle = T.TipoControle
                                                    and LF.CodControle = T.CodControle
                   Where T.NumSequencia = :Ped_Sequencia
                     and LF.Empresa is not null))) then
  begin
    MensagemErro = 'Lançamentos Fiscais não foram gerados, mas são obrigatórios de acordo com a operação fiscal. Operação Cancelada!';
    suspend;
    exit;
  end
END

^

SET TERM ; ^

						

						-- RENATO - 361650
ALTER TABLE NOTASFISCAIS ADD VALORCOMPLICM NUMERIC(13,2) DEFAULT 0 NOT NULL;
ALTER TABLE NOTASFISCAIS ADD VALORCOMPLPIS NUMERIC(13,2) DEFAULT 0 NOT NULL;
ALTER TABLE NOTASFISCAIS ADD VALORCOMPLCOFINS NUMERIC(13,2) DEFAULT 0 NOT NULL;

ALTER TABLE MOVESTOQUEIMPOSTO ADD ALIQCOMPLICM NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE MOVESTOQUEIMPOSTO ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE MOVESTOQUEIMPOSTO ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;

ALTER TABLE MOVCOMPONENTE ADD ALIQCOMPLICM NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE MOVCOMPONENTE ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE MOVCOMPONENTE ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;

ALTER TABLE TEMPPRCE050ITENS ADD ALIQCOMPLICM NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TEMPPRCE050ITENS ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TEMPPRCE050ITENS ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;

ALTER TABLE TEMPPRCE050COMPONENTES ADD ALIQCOMPLICM NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TEMPPRCE050COMPONENTES ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TEMPPRCE050COMPONENTES ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;

ALTER TABLE CLASSFISCAIS ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE CLASSFISCAIS ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE CLASSFISCAIS ADD FLAGPISCOFINSCOMPLEXTERIOR SMALLINT DEFAULT 0 NOT NULL;

ALTER TABLE TRIBUTACOES ADD ALIQCOMPLICM NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TRIBUTACOES ADD ALIQCOMPLPIS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TRIBUTACOES ADD ALIQCOMPLCOFINS NUMERIC(5,2) DEFAULT 0 NOT NULL;
ALTER TABLE TRIBUTACOES ADD FLAGPISCOFINSCOMPLEXTERIOR SMALLINT DEFAULT 0 NOT NULL;


SET TERM ^ ;

ALTER PROCEDURE CALCULAR_PISCOFINS (
    empresa INTEGER,
    codproduto INTEGER,
    codentidade CHAR(7),
    codtributacao CHAR(5),
    codoperacao INTEGER,
    codclassfiscal VARCHAR(15),
    valortotal NUMERIC(11,2),
    valoracrdespesas NUMERIC(11,2),
    flagentrada SMALLINT)
RETURNS (
    valorbasepiscofins NUMERIC(11,2),
    aliqpis NUMERIC(4,2),
    valorpis NUMERIC(11,2),
    aliqcofins NUMERIC(4,2),
    valorcofins NUMERIC(11,2),
    aliqcomplpis NUMERIC(5,2),
    aliqcomplcofins NUMERIC(5,2),

    numcstpiscofins VARCHAR(3),
    natreceitapiscofins INTEGER,
    natbasecalccredito SMALLINT)
AS
DECLARE VARIABLE aempmestre CHAR(7);
DECLARE VARIABLE cstpiscofins SMALLINT;
DECLARE VARIABLE flagopcalcpiscofins SMALLINT;
BEGIN
  /*********************                                                    
   VERSÃO 2.10
  *********************/

  SELECT
  FIRST 1 'M' || Rs_Replicate('0',(6 - Rs_Length(:Empresa))) || CAST(:Empresa AS VARCHAR(10))
  FROM RDB$DATABASE
  INTO :AEmpMestre;

  -- Calculando Valor Base do PIS e COFINS
  ValorBasePisCofins = :ValorTotal + :ValorAcrDespesas;
  
  -- Obtendo Aliquota de PIS e COFINS
  SELECT 
       -- Renato - 297792
       CASE WHEN (OP.FLAGTRIBGRUPOECONOMICO = 1) AND (CF.FLAGISENTOCOFINS = 1) AND (:FLAGENTRADA = 0) THEN 1
       ELSE      
         CASE       
           WHEN (COALESCE(OP.NUMCST_PISCOFINS,-1) NOT IN(-1,0)) THEN OP.NUMCST_PISCOFINS
           WHEN (COALESCE(CF.NUMCST_PISCOFINSDEVOL,-1) NOT IN(-1,0)) AND (:FLAGENTRADA = 1) AND
                (OP.TIPOMOVIMENTO = 1) THEN CF.NUMCST_PISCOFINSDEVOL
           WHEN (COALESCE(CF.NUMCST_PISCOFINSENTR,-1) NOT IN(-1,0)) AND (:FLAGENTRADA = 1) THEN CF.NUMCST_PISCOFINSENTR
           WHEN (COALESCE(CF.NUMCST_PISCOFINS,-1) NOT IN(-1,0)) THEN CF.NUMCST_PISCOFINS
           ELSE TRIB.NUMCST_PISCOFINS       
         END      
       END, 

       CASE 
         WHEN PC.AliqPisSimples > 0 THEN PC.AliqPisSimples
         WHEN COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN(-1,0) THEN CF.AliqPIS
         ELSE Trib.AliqPIS 
       END, 

       CASE 
         WHEN PC.AliqCofinsSimples > 0 THEN PC.AliqCofinsSimples
         WHEN COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN(-1,0) THEN CF.AliqCOFINS
         ELSE Trib.AliqCOFINS 
       END,

       -- Renato - 361650
       CASE
         WHEN (CF.FlagPisCofinsComplExterior = 1) AND 
              (COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN (-1,0)) AND
              (Cid.CodEstado <> 'EX') THEN 0  

         WHEN COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN (-1,0) THEN CF.AliqComplPis

         WHEN (Trib.FlagPisCofinsComplExterior = 1) AND 
              (Cid.CodEstado <> 'EX') THEN 0 

         ELSE Trib.AliqComplPis               
       END,               
              
       CASE
         WHEN (CF.FlagPisCofinsComplExterior = 1) AND 
              (COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN (-1,0)) AND
              (Cid.CodEstado <> 'EX') THEN 0  

         WHEN COALESCE(CF.NumCST_PISCOFINS,-1) NOT IN (-1,0) THEN CF.AliqComplCofins

         WHEN (Trib.FlagPisCofinsComplExterior = 1) AND 
              (Cid.CodEstado <> 'EX') THEN 0 

         ELSE Trib.AliqComplCofins               
       END,

       --JALDO - CHAMADO 290329
       Op.FlagCalcPis_Cofins AS FlagOpCalcPisCofins,

       -- Renato - 332318 
       CASE
       -- Só retorna a natureza da base de calculo do crédito quando for movimento de entrada
         WHEN (:FlagEntrada = 0) THEN -1
         WHEN (COALESCE(Op.NatBaseCalcCredito,-1) NOT IN(-1,0)) THEN Op.NatBaseCalcCredito
         WHEN (COALESCE(CF.NatBaseCalcCredito,-1) NOT IN(-1,0)) THEN CF.NatBaseCalcCredito
         ELSE Trib.NatBaseCalcCredito
       END
  FROM  Operacoes Op 
        LEFT JOIN ParamControle PC ON PC.Empresa = :Empresa
        LEFT JOIN ClassFiscais CF ON CF.Codigo = :CodClassFiscal
        LEFT JOIN Tributacoes Trib ON Trib.Codigo = :CodTributacao
          AND Trib.IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao,:CodEntidade, :CodOperacao, :AEmpMestre))
        Left Join Entidades E on E.Codigo = :CodEntidade
        Left Join Cidades Cid on Cid.Codigo = E.CodCidade
  WHERE Op.Codigo = :CodOperacao
  -- Renato - 283519 
   -- and :CodProduto <> 8888888

  --JALDO - CHAMADO 290329
  --into :CST_PISCOFINS, :AliqPis, :AliqCofins;
  INTO :Cstpiscofins, :AliqPis, :AliqCofins, :AliqComplPis, :AliqComplCofins, :FlagOpCalcPisCofins, :NatBaseCalcCredito;

  IF (AliqPis IS NULL) THEN AliqPis = 0;
  IF (AliqCofins IS NULL) THEN AliqPis = 0;

    --327889
  IF (NatBaseCalcCredito IS NULL) THEN
    NatBaseCalcCredito = -1;

  --Renato - 297792
  SELECT NatReceitaPisCofins
  FROM ClassFiscaisNatReceita 
  WHERE CodClassFiscal = :CodClassFiscal
    AND NumCST_PISCOFINS = :CSTPisCofins
  INTO :NatReceitaPisCofins;

  IF (NatReceitaPisCofins IS NULL) THEN NatReceitaPisCofins = 0;

  -- Verificando CST e definindo os Valores de Pis e Cofins
  --Renato - 297792
  -- IF  ( (cstpiscofins IN (1,2,99)) AND (FlagOpCalcPisCofins = 1) ) THEN
  IF  ( (cstpiscofins IN (1,2,49,50,51,52,53,54,55,56,60,61,62,63,64,65,66,67,98,99)) AND (FlagOpCalcPisCofins = 1) ) THEN
  BEGIN
    ValorPis    = rs_rounddec((:ValorBasePisCofins * (:AliqPIS / 100)),2);
    ValorCofins = rs_rounddec((:ValorBasePisCofins * (:AliqCOFINS / 100)),2);
  END
  ELSE
  BEGIN
    IF (CSTPisCofins NOT IN (4,6,73)) THEN
      ValorBasePisCofins = 0;
    AliqPis = 0;
    ValorPis = 0;
    AliqCofins = 0;
    ValorCofins = 0;
  END

  IF (cstpiscofins <> -1) THEN
    numcstpiscofins = Rs_Replicate('0', 2 - rs_length(:cstpiscofins)) || CAST(:cstpiscofins AS VARCHAR(2));
  ELSE
    numcstpiscofins = NULL;

  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCULAR_ICM (
    empresa INTEGER,
    codproduto INTEGER,
    codtributacao CHAR(5),
    codentidade CHAR(7),
    codoperacao INTEGER,
    valortotal NUMERIC(11,2),
    acrescimobaseicm NUMERIC(11,2),
    acrescimobasesubtrib NUMERIC(11,2),
    redbasesubtrib NUMERIC(4,2),
    aliqipi NUMERIC(4,2),
    codclassfiscal VARCHAR(15),
    flagentrada INTEGER,
    acrescimoredvenda NUMERIC(11,2),
    codlistapreco INTEGER,
    aliqicmfixo NUMERIC(4,2),
    codsubtributaria INTEGER,
    perreddespesa NUMERIC(15,8),
    acrescimobaseipi NUMERIC(11,2))
RETURNS (
    aliqicm NUMERIC(4,2),
    valorbaseicm NUMERIC(11,2),
    valoricm NUMERIC(11,2),
    valorisentoicm NUMERIC(11,2),
    valoroutrasicm NUMERIC(11,2),
    perreducaoicm NUMERIC(5,2),
    valorbasesubtrib NUMERIC(11,2),
    valorsubtrib NUMERIC(11,2),
    valorbasesubtribcarga NUMERIC(11,2),
    valorsubtribcarga NUMERIC(11,2),
    perredbasesubtrib NUMERIC(4,2),
    fatorredcusto NUMERIC(15,8),
    fatorredvenda NUMERIC(7,4),
    numcfop CHAR(10),
    aliqpiscofins NUMERIC(4,2),
    valorbasepiscofins NUMERIC(11,2),
    aliqpis NUMERIC(4,2),
    aliqcofins NUMERIC(4,2),
    numcsticm VARCHAR(3),
    numcstipi VARCHAR(3),
    numcstpiscofins VARCHAR(3),
    numcsosn VARCHAR(3),
    natreceitapiscofins INTEGER,
    natbasecalccredito SMALLINT,
    indnaturezafrete SMALLINT,
    valorbaseipi NUMERIC(11,2),
    valorisentoipi NUMERIC(11,2),
    valoroutrasipi NUMERIC(11,2),
    aliqicmsst NUMERIC(5,2),
    percmvaicmsst NUMERIC(5,2),
    --Renato - 361650
    AliqComplICM NUMERIC(5,2),
    AliqComplPIS NUMERIC(5,2),
    AliqComplCOFINS NUMERIC(5,2))
AS
DECLARE VARIABLE codestadoleitura CHAR(2);
DECLARE VARIABLE aempmestre CHAR(7);
DECLARE VARIABLE vauxbaseipi DECIMAL(11,2);
DECLARE VARIABLE vauxvaloripi DECIMAL(11,2);
DECLARE VARIABLE auxcodtributacaosubtrib CHAR(5);
DECLARE VARIABLE auxflagsubtributaria INTEGER;
DECLARE VARIABLE auxentidade CHAR(7);
DECLARE VARIABLE valorbasesubtribdestino NUMERIC(11,2);
DECLARE VARIABLE calcbasesubtrib NUMERIC(11,2);
DECLARE VARIABLE calcvalorsubtrib NUMERIC(11,2);
DECLARE VARIABLE calcbasesubtribdestino NUMERIC(11,2);
DECLARE VARIABLE partiporeducaoicm SMALLINT;
DECLARE VARIABLE paraliqcpmf NUMERIC(4,2);
DECLARE VARIABLE paraliqicmsimples NUMERIC(4,2);
DECLARE VARIABLE partiporegimetributario SMALLINT;
DECLARE VARIABLE enttipopessoa CHAR(1);
DECLARE VARIABLE cidcodestado CHAR(2);
DECLARE VARIABLE estaliqcontrib DECIMAL(4,2);
DECLARE VARIABLE estflagconvsub SMALLINT;
DECLARE VARIABLE estaliqinterna DECIMAL(4,2);
DECLARE VARIABLE cidempcodestado CHAR(2);
DECLARE VARIABLE trialiqicm DECIMAL(4,2);
DECLARE VARIABLE triflagisentoprodutor SMALLINT;
DECLARE VARIABLE triflagsubtributaria SMALLINT;
DECLARE VARIABLE trimargemlucrosubst NUMERIC(5,2);
DECLARE VARIABLE triperreducaoicm DECIMAL(6,4);
DECLARE VARIABLE triperredmargem DECIMAL(4,2);
DECLARE VARIABLE tritipocfop SMALLINT;
DECLARE VARIABLE tricodtributacaosubtrib CHAR(5);
DECLARE VARIABLE tritipovalornaotributado SMALLINT;
DECLARE VARIABLE triperreducaosubtrib NUMERIC(6,2);
DECLARE VARIABLE trialiqinternasubtrib NUMERIC(5,2);
DECLARE VARIABLE trinumcst_icm SMALLINT;
DECLARE VARIABLE trinumcst_ipi SMALLINT;
DECLARE VARIABLE trinumcsosn SMALLINT;
DECLARE VARIABLE claflagsubtributaria SMALLINT;
DECLARE VARIABLE claaliqpiscofins NUMERIC(4,2);
DECLARE VARIABLE gruflagsubtributaria SMALLINT;
DECLARE VARIABLE oprtipoicm SMALLINT;
DECLARE VARIABLE oprtipoipi SMALLINT;
DECLARE VARIABLE opraliqicmfixo DECIMAL(4,2);
DECLARE VARIABLE oprperredicm DECIMAL(4,2);
DECLARE VARIABLE oprperredmargem DECIMAL(4,2);
DECLARE VARIABLE oprcfop1_normal CHAR(10);
DECLARE VARIABLE oprcfop1_normal_ncfora CHAR(10);
DECLARE VARIABLE oprcfop2_industrializado CHAR(10);
DECLARE VARIABLE oprcfop2_industrializado_ncfora CHAR(10);
DECLARE VARIABLE oprcfop3_subrevenda CHAR(10);
DECLARE VARIABLE oprcfop3_subrevenda_nc CHAR(10);
DECLARE VARIABLE oprcfop4_subrevendaml CHAR(10);
DECLARE VARIABLE oprcfop4_subrevendaml_nc CHAR(10);
DECLARE VARIABLE oprcfop5_subfabricacao CHAR(10);
DECLARE VARIABLE oprcfop5_subfabricacao_nc CHAR(10);
DECLARE VARIABLE oprcfop6_subfabricacaoml CHAR(10);
DECLARE VARIABLE oprcfop6_subfabricacaoml_nc CHAR(10);
DECLARE VARIABLE oprcfop7_importado CHAR(10);
DECLARE VARIABLE oprcfop_servico CHAR(10);
DECLARE VARIABLE oprcfop_servico_ncfora CHAR(10);
DECLARE VARIABLE oprcfop9_petroleo VARCHAR(10);
DECLARE VARIABLE oprcfop9_petroleo_nc VARCHAR(10);
DECLARE VARIABLE oprflagcalcpis_cofins SMALLINT;
DECLARE VARIABLE oprflagdefaultlancamentooutras INTEGER;
DECLARE VARIABLE oprflagsubtribipi INTEGER;
DECLARE VARIABLE oprtipomovimento INTEGER;
DECLARE VARIABLE oprtiposubtributaria INTEGER;
DECLARE VARIABLE oprtiposubtributariacarga INTEGER;
DECLARE VARIABLE oprflagipisobrepiscofins SMALLINT;
DECLARE VARIABLE lispercacrescimoadm1 NUMERIC(4,2);
DECLARE VARIABLE lispercacrescimoadm2 NUMERIC(4,2);
DECLARE VARIABLE lispercacrescimoadm3 NUMERIC(4,2);
DECLARE VARIABLE proorigem SMALLINT;
DECLARE VARIABLE subaliquotainterna NUMERIC(5,2);
DECLARE VARIABLE submargemlucro NUMERIC(5,2);
DECLARE VARIABLE subpercreducao NUMERIC(5,2);
DECLARE VARIABLE subindicereducao NUMERIC(9,6);
DECLARE VARIABLE subflagabatericm SMALLINT;
DECLARE VARIABLE subflagsomaipi SMALLINT;
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE regiaodestino VARCHAR(10);
DECLARE VARIABLE regiaodestinoleitura VARCHAR(10);
DECLARE VARIABLE regiaoorigem VARCHAR(10);
DECLARE VARIABLE empid VARCHAR(15);
DECLARE VARIABLE flagdeduzirdespnaoinclnamargem SMALLINT;
DECLARE VARIABLE percsubtribcusto DECIMAL(5,2);
DECLARE VARIABLE percicmcusto DECIMAL(5,2);
DECLARE VARIABLE acrdespesaspiscofins DECIMAL(11,2);
DECLARE VARIABLE regtribpercivasimplicado NUMERIC(5,2);
DECLARE VARIABLE triflagprevaleceraliqicm SMALLINT;
DECLARE VARIABLE oprflagipisobrebaseicm SMALLINT;
DECLARE VARIABLE tritipovalornaotributadoipi NUMERIC(1,0);
DECLARE VARIABLE oprflagicmssobreservicos SMALLINT;

BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.01
*********************/
VAuxBaseIPI = 0;
VAuxValorIPI = 0;
AliqICM = 0;
ValorBaseICM = 0;
ValorICM = 0;
ValorIsentoICM = 0;
ValorOutrasICM = 0;
ValorBaseSubTrib = 0;
ValorSubTrib = 0;
ValorBaseSubTribCarga = 0;
ValorSubTribCarga = 0;
FatorRedCusto = 0;
FatorRedVenda = 0;
NumCFOP = '';
AliqPISCOFINS = 0;
--Ronaldo Chamado 313933
RegTribPercIvaSimplicado = 0;
--Gabriella - 333391  
ValorBaseIPI = 0;
ValorIsentoIPI = 0;
ValorOutrasIPI = 0;

--JALDO - CHAMADO 353913
CalcValorSubTrib = 0;
CalcBaseSubTrib = 0;

--Renato - 283520
SELECT Id,
  'M' || Rs_Replicate('0',(6 - Rs_Length(:Empresa))) || CAST(:Empresa AS VARCHAR(10))
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :EmpId, :AEmpMestre;

--leitura do parametro de controle
SELECT
  TipoReducaoICM,
  AliqCPMF,
  TipoRegimeTributario,
  AliqICMSimples
FROM
  ParamControle
WHERE
  Empresa = :Empresa
INTO
  :ParTipoReducaoICM,
  :ParAliqCPMF,
  :ParTipoRegimeTributario,
  :ParAliqICMSimples;

IF (ParTipoReducaoICM IS NULL) THEN
  ParTipoReducaoICM = 0;
IF (ParAliqCPMF IS NULL) THEN
  ParAliqCPMF = 0;
IF (ParTipoRegimeTributario IS NULL) THEN
  ParTipoRegimeTributario = 0;
IF (ParAliqICMSimples IS NULL) THEN
  ParAliqICMSimples = 0;

-- Renato - 278440
SELECT FlagDeduzirDespNaoInclNaMargem
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem;


-- leitura da cidade da empresa mestre
SELECT
  Cidades.CodEstado,
--Eder - Chamado 243637          
  Est.RegiaoDestino
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados Est ON Est.codorigem = Cidades.codestado
                       AND est.coddestino = Cidades.codestado
WHERE
  Entidades.Codigo = :AEmpMestre
INTO
  :CidEmpCodEstado,
  :RegiaoOrigem;

-- Leitura da entidade 
SELECT
  TipoPessoa,
  Cidades.CodEstado,
  Cidades.CodEstado
  --TipoConsideraIPICalculoICM -- - CHAMADO 248899
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EntTipoPessoa,
  :CidCodEstado,
  :CodEstadoLeitura;
  --:TipoConsideraIPICalculoICM; --243556 / 248899

 Existe = NULL;

SELECT
  FlagICMOrigem
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :Existe;

IF (rs_invl(Existe,0) = 1) THEN
  CodEstadoLeitura = CidEmpCodEstado;


--MARCELO - CHAMADO 192283
SELECT 
  RegiaoDestino
FROM Estados
WHERE CodOrigem = :CidEmpCodEstado
  AND CodDestino = :CidCodEstado
 INTO :RegiaoDestino;

IF (:CodEstadoLeitura <> :CidEmpCodEstado) THEN
BEGIN
    SELECT 
      RegiaoDestino
    FROM Estados
    WHERE CodOrigem = :CodEstadoLeitura
      AND CodDestino = :CidCodEstado
     INTO :RegiaoDestinoLeitura;
 -- Eder - Chamado 269443
  IF (RegiaoDestinoLeitura IS NULL) THEN
     RegiaoDestinoLeitura = RegiaoDestino;
END
ELSE
   RegiaoDestinoLeitura = RegiaoDestino;

--Na entrada, pega a aliquota interna do estado de origem da nota e na saida pega a aliquota do estado de destino
SELECT
--MARCELO - CHAMADO 116008
--  EstSai.AliqContrib,
  CASE WHEN :FlagEntrada = 1 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento <> 1
       THEN EstSai.AliqContribCompra --ENTRADA POR COMPRA
       WHEN :FlagEntrada = 0 AND EstSai.AliqContribCompra > 0 AND Oper.TipoMovimento = 1
       THEN EstSai.AliqContribCompra --SAIDA POR DEVOLUCAO
       ELSE EstSai.AliqContrib END,
  EstSai.FlagConvSub,
-- Isaac - Chamado 191748
--  Case When :FlagEntrada = 0 then EstSai.AliqInterna Else EstEnt.AliqInterna End
-- Eder - Chamado 219012
--Case When :FlagEntrada = 0 then EstSai.AliqInterna
--     When :FlagEntrada = 1 and Oper.tipomovimento = 1 then EstSai.AliqInterna
--     Else EstEnt.AliqInterna End
  CASE WHEN :FlagEntrada = 0 AND Oper.TipoMovimento <> 1 THEN EstSai.AliqInterna
       WHEN :FlagEntrada = 1 AND Oper.tipomovimento = 1 THEN EstSai.AliqInterna
       ELSE EstEnt.AliqInterna END
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
  LEFT JOIN Estados EstSai ON EstSai.CodOrigem = :CidEmpCodEstado
                          AND EstSai.CodDestino = :CodEstadoLeitura
  LEFT JOIN Estados EstEnt ON EstEnt.CodOrigem = :CidEmpCodEstado
                          AND EstEnt.CodDestino = :CidEmpCodEstado
--MARCELO - CHAMADO 116008
  LEFT JOIN Operacoes Oper ON Oper.Codigo = :CodOperacao
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EstAliqContrib,
  :EstFlagConvSub,
  :EstAliqInterna;


IF (EstAliqContrib IS NULL) THEN
  EstAliqContrib = 0;
IF (EstFlagConvSub IS NULL) THEN
  EstFlagConvSub = 0;
IF (EstAliqInterna IS NULL) THEN
  EstAliqInterna = 0;


  --Verifica se a classificação fiscal permite que seja calculada substituição tributária
ClaFlagSubTributaria = 1;
ClaAliqPisCofins = 0;
IF (ltrim(CodClassFiscal) <> '') THEN
BEGIN
  SELECT
    FlagSubTributaria,
    AliqPisCofins
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
    :ClaAliqPisCofins;

  IF (ClaFlagSubTributaria IS NULL) THEN
     ClaFlagSubTributaria = 1;
  IF (ClaAliqPisCofins IS NULL) THEN
     ClaAliqPisCofins = 0;
END


-- leitura das operacoes fiscais
SELECT
  TipoICM,
  TipoIPI,
  AliqICMFixo,
  PerRedICM,
  PerRedMargem,
  CFOP1_Normal,
  CFOP1_Normal_NCFora,
  CFOP2_Industrializado,
  CFOP2_Industrializado_NCFora,
  CFOP3_SubRevenda,
  CFOP3_SubRevenda_NC,
  CFOP4_SubRevendaML,
  CFOP4_SubRevendaML_NC,
  CFOP5_SubFabricacao,
  CFOP5_SubFabricacao_NC,
  CFOP6_SubFabricacaoML,
  CFOP6_SubFabricacaoML_NC,
  CFOP7_Importado,
  CFOP_Servico,
  CFOP_Servico_NCFora,
  CFOP9_Petroleo,
  CFOP9_Petroleo_NC,
  FlagCalcPIS_COFINS,
  FlagDefaultLancamentoOutras,
  FlagSubTribIPI,
  TipoMovimento,
  TipoSubTributaria,
  TipoSubTributariaCarga,
  FlagIPISobrePisCofins,
  FlagIPISobreBaseICM,
  --Renato - 341779
  FlagICMSSobreServicos,
  --Ronaldo 343696
  IndNaturezaFrete
FROM
  Operacoes
WHERE
  Codigo = :CodOperacao
INTO
  :OprTipoICM,
  :OprTipoIPI,
  :OprAliqICMFixo,
  :OprPerRedICM,
  :OprPerRedMargem,
  :OprCFOP1_Normal,
  :OprCFOP1_Normal_NCFora,
  :OprCFOP2_Industrializado,
  :OprCFOP2_Industrializado_NCFora,
  :OprCFOP3_SubRevenda,
  :OprCFOP3_SubRevenda_NC,
  :OprCFOP4_SubRevendaML,
  :OprCFOP4_SubRevendaML_NC,
  :OprCFOP5_SubFabricacao,
  :OprCFOP5_SubFabricacao_NC,
  :OprCFOP6_SubFabricacaoML,
  :OprCFOP6_SubFabricacaoML_NC,
  :OprCFOP7_Importado,
  :OprCFOP_Servico,
  :OprCFOP_Servico_NCFora,
  :OprCFOP9_Petroleo,
  :OprCFOP9_Petroleo_NC,
  :OprFlagCalcPIS_COFINS,
  :OprFlagDefaultLancamentoOutras,
  :OprFlagSubTribIPI,
  :OprTipoMovimento,
  :OprTipoSubTributaria,
  :OprTipoSubTributariaCarga,
  :OprFlagIPISobrePisCofins,
  :OprFlagIPISobreBaseIcm,
  --Renato - 341779
  :OprFlagICMSSobreServicos,
  :IndNaturezaFrete;


IF (OprTipoICM IS NULL) THEN
  OprTipoICM = 0;
IF (OprTipoIPI IS NULL) THEN
  OprTipoIPI = 0;
IF (OprAliqICMFixo IS NULL) THEN
  OprAliqICMFixo = 0;
IF (OprPerRedICM IS NULL) THEN
  OprPerRedICM = 0;
IF (OprPerRedMargem IS NULL) THEN
  OprPerRedMargem = 0;
IF (OprFlagCalcPIS_COFINS IS NULL) THEN
  OprFlagCalcPIS_COFINS = 0;
IF (OprFlagDefaultLancamentoOutras = 1) THEN
  OprFlagDefaultLancamentoOutras = 0;
IF (OprFlagCalcPIS_COFINS = 1) THEN
   AliqPISCOFINS = ClaAliqPISCOFINS;
IF (OprFlagSubTribIPI IS NULL) THEN
   OprFlagSubTribIPI = 0;
IF (OprTipoSubTributaria IS NULL) THEN
   OprTipoSubTributaria = 0;
IF (OprTipoMovimento IS NULL) THEN
   OprTipoMovimento = 0;
--Eder - Chamado 262460
IF (OprTipoSubTributariaCarga IS NULL) THEN
   OprTipoSubTributaria = 0;
IF (OprFlagIPISobrePisCofins IS NULL) THEN
   OprFlagIPISobrePisCofins = 0;
--Gabriella - 256424
IF (OprFlagIPISobreBaseIcm IS NULL) THEN
   OprFlagIPISobreBaseIcm = 0;

--Verifica se o grupo do produto permite que seja calculada substituição tributária
GruFlagSubTributaria = 1;
SELECT Gru.FlagSubTributaria,
       Pro.Origem
  FROM Produtos Pro 
  LEFT JOIN Grupos Gru ON Gru.Codigo = Pro.CodGrupo
 WHERE Pro.Codigo = :CodProduto
  INTO :GruFlagSubTributaria, :ProOrigem;

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 
--Leitura da Lista de Preço
SELECT Ilp.PercAcrescimoAdm1, Ilp.PercAcrescimoAdm2, Ilp.PercAcrescimoAdm3,
       --Renato - 290579
       Ilp.PercSubTrib, Ilp.PercICMCusto
  FROM ItemlistaPreco Ilp
  LEFT JOIN Empresas Emp ON Emp.Codigo = :Empresa
 WHERE Ilp.CodLista=:CodListaPreco
   AND Ilp.CodProduto=:CodProduto
   AND Ilp.Empresa = Emp.EmpresaListaPreco
 INTO :LisPercAcrescimoAdm1, :LisPercAcrescimoAdm2, :LisPercAcrescimoAdm3,
      --Renato - 290579
      :PercSubTribCusto, :PercICMCusto;

IF (LisPercAcrescimoAdm1 IS NULL) THEN
  LisPercAcrescimoAdm1 = 0;
IF (LisPercAcrescimoAdm2 IS NULL) THEN
  LisPercAcrescimoAdm2 = 0;
IF (LisPercAcrescimoAdm3 IS NULL) THEN
  LisPercAcrescimoAdm3 = 0;


-- leitura da tributacao
SELECT FIRST 1
  AliqICM,
  FlagIsentoProdutor,
  FlagSubTributaria,
  MargemLucroSubst,
  PerReducaoICM,
  PerRedMargem,
  TipoCFOP,
  CodTributacaoSubTrib,
  TipoValorNaoTributado,
  PerReducaoSubTrib,
--Rafael chamado 272635
  AliqInternaSubTrib,
  NumCST_ICM,
  NumCST_IPI,
  NumCSOSN,
--Ronaldo Chamado 317536
  flagPrevalecerAliqIcm,
--Gabriella - 333391
  TipoValorNaoTributadoIPI,
  --Renato - 361650
  AliqComplICM

FROM
  Tributacoes
WHERE Codigo = :CodTributacao
  AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao,:CodEntidade, :CodOperacao, :AEmpMestre))
INTO
  :TriAliqICM,
  :TriFlagIsentoProdutor,
  :TriFlagSubTributaria,
  :TriMargemLucroSubst,
  :TriPerReducaoICM,
  :TriPerRedMargem,
  :TriTipoCFOP,
  :TriCodTributacaoSubTrib,
  :TriTipoValorNaoTributado,
  :TriPerReducaoSubTrib,
  --Rafael chamado 272635
  :trialiqinternasubtrib,
  :TriNumCST_ICM,
  :TriNumCST_IPI,
  :TriNumCSOSN,
  :TriFlagPrevalecerAliqIcm,
  --Gabriella - 333391
  :TriTipoValorNaoTributadoIPI,
  --Renato - 361650
  :AliqComplICM;


 AuxEntidade = CodEntidade;
--Verifica a entrada de item com substituição tributaria, quando está marcado no parametro para verificar
--como estado de origem, por causa da substituição tributaria interna no estado.

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

IF ((FlagEntrada = 1) AND
   (Existe = 1)) THEN
BEGIN
  SELECT FIRST 1
    FlagSubTributaria,
    CodTributacaoSubTrib
  FROM Tributacoes
  WHERE Codigo = :CodTributacao
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:CodTributacao, :AEmpMestre, :CodOperacao, :AEmpMestre))
  INTO
    :AuxFlagSubTributaria,
    :AuxCodTributacaoSubTrib;

  IF (AuxFlagSubTributaria IS NULL) THEN
    AuxFlagSubTributaria = 0;
  IF (AuxCodTributacaoSubTrib IS NULL) THEN
    AuxCodTributacaoSubTrib = '';
  IF ((AuxFlagSubTributaria = 1) AND (AuxCodTributacaoSubTrib <> '')) THEN
  BEGIN
    TriCodTributacaoSubTrib = AuxCodTributacaoSubTrib;
    TriFlagSubTributaria =  AuxFlagSubTributaria;
    AuxEntidade = AEmpMestre;
  END
END

Existe = NULL;

SELECT FlagSubTribEntradaEstado FROM ParamControle WHERE Empresa = :Empresa
INTO :Existe;

--Leitura dos dados da tributação linkada com a substituição tributaria
IF ((ltrim(TriCodTributacaoSubTrib) <> '') AND
   (TriFlagSubTributaria = 1) AND
   (ClaFlagSubTributaria = 1) AND
   (GruFlagSubTributaria = 1) AND
   ((FlagEntrada = 0) OR
    (FlagEntrada = 0) AND (Existe = 1))) THEN
BEGIN
  SELECT FIRST 1
    AliqICM,
    FlagIsentoProdutor,
    FlagSubTributaria,
    MargemLucroSubst,
    PerReducaoICM,
    PerRedMargem,
    TipoCFOP,
    CodTributacaoSubTrib,
    TipoValorNaoTributado,
    PerReducaoSubTrib,
--Rafael chamado 272635
    AliqInternaSubTrib,
    NumCST_ICM,
    NumCST_IPI,
    NumCSOSN,
--Gabriella - 333391
    TipoValorNaoTributadoIPI,
    AliqComplICM
  FROM
    Tributacoes
  WHERE Codigo = :TriCodTributacaoSubTrib
    AND IdLeitura = (SELECT FIRST 1 IdLeitura FROM LeituraTributacao(:TriCodTributacaoSubTrib,:AuxEntidade, :CodOperacao, :AEmpMestre))
  INTO
    :TriAliqICM,
    :TriFlagIsentoProdutor,
    :TriFlagSubTributaria,
    :TriMargemLucroSubst,
    :TriPerReducaoICM,
    :TriPerRedMargem,
    :TriTipoCFOP,
    :TriCodTributacaoSubTrib,
    :TriTipoValorNaoTributado,
    :TriPerReducaoSubTrib,
--Rafael chamado 272635
    :Trialiqinternasubtrib,
    :TriNumCST_ICM,
    :TriNumCST_IPI,
    :TriNumCSOSN,
--Gabriella - 333391
    :TriTipoValorNaoTributadoIPI,
    :AliqComplICM;

  CodTributacao = TriCodTributacaoSubTrib;
END

IF (TriAliqICM IS NULL) THEN
  TriAliqICM = 0;
IF (TriFlagIsentoProdutor IS NULL) THEN
  TriFlagIsentoProdutor = 0;
IF (TriFlagSubTributaria IS NULL) THEN
  TriFlagSubTributaria = 0;
IF (TriMargemLucroSubst IS NULL) THEN
  TriMargemLucroSubst = 0;
IF (TriPerReducaoICM IS NULL) THEN
  TriPerReducaoICM = 0;
IF (TriPerRedMargem IS NULL) THEN
  TriPerRedMargem = 0;
IF (TriTipoCFOP IS NULL) THEN
  TriTipoCFOP = 0;
IF (TriCodTributacaoSubTrib IS NULL) THEN
  TriCodTributacaoSubTrib = '';
IF (TriPerReducaoSubTrib IS NULL) THEN
   TriPerReducaoSubTrib = 0;
--Rafael chamado 272635
IF (trialiqinternasubtrib IS NULL) THEN
  trialiqinternasubtrib=0;
IF (TriNumCST_ICM IS NULL) THEN
  TriNumCST_ICM = 0;
IF (TriNumCST_IPI IS NULL) THEN
  TriNumCST_IPI = 0;
IF (TriNumCSOSN IS NULL) THEN
  TriNumCSOSN = 0;
if (AliqComplICM is null) then
  AliqComplICM = 0;


IF (TriTipoValorNaoTributado IS NULL) THEN
BEGIN
  IF (Codproduto = 8888888) THEN
    TriTipoValorNaoTributado = 1;
  ELSE
    TriTipoValorNaoTributado = 0;
END

--Gabriella - 333391
IF (TriTipoValorNaoTributadoIPI IS NULL) THEN
BEGIN
  IF (Codproduto = 8888888) THEN
    TriTipoValorNaoTributadoIPI = 1;
  ELSE
    TriTipoValorNaoTributadoIPI = 0;
END

--Gabriella - 360511
--Se não zerar e na tributação estiver zero o item continuará com o perc. de redução de st
RedBaseSubTrib = 0;

--Eder Chamado 271756
IF (TriPerReducaoSubTrib <> 0) THEN
  RedBaseSubTrib = TriPerReducaoSubTrib;

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CodEstadoLeitura
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CodEstadoLeitura
  AND RegiaoDestino = :RegiaoDestinoLeitura
  AND AliqICM > 0
INTO
  :Existe;

--JALDO/RONALDO - CHAMADO 309941
 -- If ((FlagEntrada = 0) and
  IF ( (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1)) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1
     AliqICM,
     --MARCELO - CHAMADO 214200
--     PerReducaoICM
    CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
  FROM
    tributacoes
  WHERE
    EstadoOrigem = :CodEstadoLeitura
    AND Codigo = :CodTributacao
    --MARCELO - CHAMADO 192283
--    and EstadoDestino = :CodEstadoLeitura
    AND RegiaoDestino = :RegiaoDestinoLeitura
    --Eder - 320407
    AND AliqICM > 0

  ORDER BY
    TipoPessoa
  INTO
    :EstAliqInterna,
    :RedBaseSubTrib;
END

IF (RedBaseSubTrib IS NULL) THEN
  RedBaseSubTrib = 0;

--Rafael chamado 272635
IF (trialiqinternasubtrib <> 0) THEN
 EstAliqInterna = triAliqInternaSubTrib;

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CidEmpCodEstado
  AND Codigo        = :CodTributacao
  --MARCELO - CHAMADO 192283
--  and EstadoDestino = :CidEmpCodEstado
  --Eder - Chamado 243637
  --and RegiaoDestino = :RegiaoDestino
  AND RegiaoDestino = :RegiaoOrigem
  AND AliqICM > 0
INTO
  :Existe;

IF ((FlagEntrada = 1) AND
--Eder - Chamado 184973
    (OprTipoMovimento <> 1) AND
    (TriMargemLucroSubst <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1 AliqICM,
         CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
    FROM Tributacoes
   WHERE EstadoOrigem=:CidEmpCodEstado
     AND Codigo=:CodTributacao
     --MARCELO - CHAMADO 192283
--     and EstadoDestino=:CidEmpCodEstado
  --Eder - Chamado 243637
     --and RegiaoDestino=:RegiaoDestino
     AND RegiaoDestino=:RegiaoOrigem
-- Isaac - Chamado 189946   
     AND AliqICM > 0

   ORDER BY TipoPessoa
   INTO :EstAliqInterna , :RedBaseSubTrib;
END    
IF (EstAliqInterna IS NULL) THEN
   EstAliqInterna = 0;


IF (CodSubTributaria > 0) THEN
BEGIN                  
  SELECT                   
      AliquotaInterna, MargemLucro, PercReducao,
      IndiceReducao, FlagAbaterICM, FlagSomaIPI
  FROM SubstituicaoTributaria                  
  WHERE CodSubTributaria = :CodSubTributaria
    AND Empresa = :Empresa
  INTO :SubAliquotaInterna, :SubMargemLucro, :SubPercReducao,
       :SubIndiceReducao, :SubFlagAbaterICM, :SubFlagSomaIPI;
END
IF (SubAliquotaInterna IS NULL) THEN
   SubAliquotaInterna = 0;
IF (SubMargemLucro IS NULL) THEN
   SubMargemLucro = 0;
IF (SubPercReducao IS NULL) THEN
   SubPercReducao = 0;
IF (SubIndiceReducao IS NULL) THEN
   SubIndiceReducao = 0;
IF (SubFlagAbaterICM IS NULL) THEN
   SubFlagAbaterICM = 0;
IF (SubFlagSomaIPI IS NULL) THEN
    SubFlagSomaIPI = 0;

--Calculo do CST de ICMS e IPI 
SELECT CASE WHEN Op.NumCST_ICM = -1 THEN :TriNumCST_ICM
            ELSE Op.NumCST_ICM END,
       CASE WHEN Op.NumCST_IPI <> -1
                 THEN Op.NumCST_IPI   --Operação fiscal prevalece sobre demais.
            WHEN :AliqIPI > 0 AND Op.TipoIPI = 0 --Item tributado de ipi sera sempre 00 ou 50 (entrada ou saida tributada)
                 THEN CASE WHEN :FlagEntrada = 1 THEN 00 ELSE 50 END
            WHEN Cla.NumCST_IPI NOT IN (-1,0) AND (:AliqIPI = 0 OR Op.TipoIPI <> 0)
                 THEN Cla.NumCST_IPI -- Class. Fiscal prevalece sobre demais.
            WHEN :TriNumCST_IPI <> -1 AND (:AliqIPI = 0 OR Op.TipoIPI <> 0)
                 THEN :TriNumCST_IPI    -- Item sem ipi pega da tributação se informado
       END,
       CASE WHEN :ParTipoRegimeTributario IN (1,2)   --Calculo de CSOSN para Simples Nacional
            THEN CASE WHEN Op.NumCSOSN NOT IN(-1,0) THEN Op.NumCSOSN
                      ELSE :TriNumCSOSN END
       END
  FROM Produtos Pro
  LEFT JOIN Operacoes Op ON Op.Codigo = :CodOperacao
  LEFT JOIN ClassFiscais Cla ON Cla.Codigo = :CodClassFiscal
WHERE Pro.Codigo = :CodProduto
INTO :NumCstICM, :NumCstIPI, :NumCsosn;

IF (NumCstICM <> -1) THEN
  NumCstICM = CAST(ProOrigem AS VARCHAR(1)) || Rs_Replicate('0', 2 - Rs_Length(:NumCstICM)) || CAST(:NumCstICM AS VARCHAR(2));
ELSE
  NumCstICM = NULL;

--Gabriella - 299680
IF (NumCstIPI <> -1 AND :FlagEntrada = 1)THEN
  NumCstIPI = Rs_Replicate('0', 2 - Rs_Length(:NumCstIPI)) || CAST(:NumCstIPI AS VARCHAR(2));
IF (NumCstIPI <> -1 AND :FlagEntrada = 0)THEN
  NumCstIPI = Rs_Replicate('5', 2 - Rs_Length(:NumCstIPI)) || CAST(:NumCstIPI AS VARCHAR(2));
IF (NumCstIPI = -1) THEN
  NumCstIPI = NULL;

IF (NumCsosn <> -1 AND ParTipoRegimeTributario IN (1,2)) THEN --CSOSN para Simples Nacional
  NumCsosn = Rs_Replicate('0', 3 - Rs_Length(:NumCsosn)) || CAST(:NumCsosn AS VARCHAR(3));
ELSE
  NumCsosn = NULL;



IF ((EntTipoPessoa = 'F') OR
   (EntTipoPessoa = 'N')) THEN
  AliqIcm = TriAliqICM;
ELSE
BEGIN
--Ronaldo Chamado 317536
--  IF (TriAliqICM < EstAliqContrib) THEN
--    AliqICM = TriAliqICM;
--  ELSE
--      AliqICM = EstAliqContrib;
  IF (TriFlagPrevalecerAliqIcm = 1) THEN
    AliqICM = TriAliqICM;
  ELSE
  BEGIN
    IF (TriAliqICM < EstAliqContrib) THEN
      AliqICM = TriAliqICM;
    ELSE
      AliqICM = EstAliqContrib;
  END
END

IF ((CidEmpCodEstado = CodEstadoLeitura) AND (TriFlagIsentoProdutor = 1)) THEN
  IF ((EntTipoPessoa = 'P') OR (EntTipoPessoa = 'J') OR (EntTipoPessoa = 'C') OR
      (EntTipoPessoa = 'I') ) THEN --JALDO - CHAMADO 248899
    AliqICM = 0;

IF ((OprTipoICM = 1) OR
    (OprTipoICM = 2 AND FlagEntrada = 0) OR
    (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
  AliqICM = 0;

IF (OprAliqICMFixo <> 0) THEN
  AliqICM = :OprAliqICMFixo;

--Eder - Chamado 295277
IF (AliqICMFixo <> 0) THEN
BEGIN
  --O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
  IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
     (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
     --Não pode fixar a aliquota de icms no simples senao nao calcula a ST
     AliqICM = AliqICM;
  ELSE
     AliqICM = AliqICMFixo;
END

--Gabriella - 333391                                                                                                                                                                               
ValorBaseIPI = ValorTotal + AcrescimoBaseIPI;
                                                                 
IF (ValorBaseIPI > 0 AND AliqIPI > 0) THEN
  VAuxValorIPI = (ValorBaseIPI * AliqIPI) / 100;

--Somente irá prevalecer o Tipo da Tributação quando a Aliquota de IPI for igual a Zero 
-- e o Tipo do Ipi da Operação Fiscal for Tributado   
IF (AliqIPI = 0 AND OprTipoIPI = 0) THEN
BEGIN
 IF (TriTipoValorNaoTributadoIPI = 0) THEN
   ValorIsentoIPI = ValorBaseIPI;
 IF (TriTipoValorNaoTributadoIPI = 1) THEN
   ValorOutrasIPI = ValorBaseIPI;
END
   
IF (OprTipoIPI = 1) THEN
  ValorIsentoIPI = ValorBaseIPI;
  
IF (OprTipoIPI = 2) THEN
  ValorOutrasIPI = ValorBaseIPI;
  
IF (AliqIPI = 0) THEN
  ValorBaseIPI = 0;
  
IF (ValorIsentoIPI > 0 OR ValorOutrasIPI > 0) THEN
  ValorBaseIPI = 0;

---Chamado 114964                                        
--If @OprTipoIPI = 0 or @OprTipoIPI = 3                                          
--Begin
--Gabriella - 333391
/*  IF ((ValorTotal > 0) AND (AliqIPI > 0)) THEN
    VAuxValorIPI = (ValorTotal * AliqIPI) / 100;*/
--End

IF ((TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (TriMargemLucroSubst <> 0)
   AND (EstFlagConvSub = 1)
   AND (OprTipoICM = 0)
   AND (OprTipoSubTributaria > 0)) THEN
BEGIN
  ValorBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTrib = ValorBaseSubTrib + VAuxValorIPI;
END

--Substituição tributaria não informada na nota, somente para sair na impressão do pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  ValorBaseSubTribCarga = ValorTotal + AcrescimoBaseSubTrib;
  IF (OprFlagSubTribIPI = 1) THEN
     ValorBaseSubTribCarga = ValorBaseSubTribCarga + VAuxValorIPI;
END

IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1)
   AND (ClaFlagSubTributaria = 1)
   AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0)
   AND (EstFlagConvSub = 1)) THEN
BEGIN                                        
  CalcBaseSubTrib = ValorTotal + AcrescimoBaseSubTrib;
  IF (SubFlagSomaIPI = 1) THEN
     CalcBaseSubTrib = CalcBaseSubTrib + VAuxValorIPI;
END                                     

ValorBaseICM = ValorTotal + AcrescimoBaseICM;
--223515 ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseSubTrib;
ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;
CalcBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;

-- JALDO - CHAMADO 243556
-- O Tipo "2" não estão sendo verificando porque nunca será usado
--If (EntTipoPessoa <> 'J') then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
--  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--JALDO - CHAMADO 248899
--if (((TipoConsideraIPICalculoICM = 0) and (EntTipoPessoa <> 'J')) or
--   (TipoConsideraIPICalculoICM = 1)) then
--begin
--  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
--  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
-- CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
--end

--Gabriella - 256424
--IF (EntTipoPessoa NOT IN ('J','I')) THEN
IF ((EntTipoPessoa NOT IN ('J','I')) OR (oprflagipisobrebaseicm = 1)) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm + VAuxValorIPI;
  ValorBaseSubTribDestino = ValorBaseSubTribDestino + VAuxValorIPI;
  CalcBaseSubTribDestino = CalcBaseSubTribDestino + VAuxValorIPI;
END

ValorIsentoICM = ValorBaseIcm; --Salva o Valor da Base como isentas antes das reducoes

IF (TriPerReducaoICM <> 0 AND ValorBaseIcm <> 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * TriPerReducaoICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * TriPerReducaoICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * TriPerReducaoICM) / 100);
END

IF (ValorBaseIcm > 0 AND OprPerRedICM > 0) THEN
BEGIN
  ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * OprPerRedICM) / 100);
  ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * OprPerRedICM) / 100);
  CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * OprPerRedICM) / 100);
END

IF (ValorBaseIcm > 0 AND AliqICM > 0) THEN
  ValorICM = (ValorBaseIcm * AliqICM) / 100;

--Ronaldo Chamado 313933
SELECT R.PercIvaSimplificado FROM regimetributario R
LEFT JOIN entidades E ON R.Codigo = E.codRegimeTributario  
WHERE R.empresa = :Empresa AND
      E.codigo  = :CodEntidade
INTO :RegTribPercIvaSimplicado;

IF (TriFlagSubTributaria = 1 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1
   AND TriMargemLucroSubst <> 0 AND EstFlagConvSub = 1 AND OprTipoICM = 0 AND OprTipoSubTributaria > 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0) THEN
    ValorBaseSubTrib = ValorBaseSubTrib - ((ValorBaseSubTrib  * RedBaseSubTrib) / 100);

--Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 AND EstAliqInterna > 0) THEN
  BEGIN
     ValorSubTrib     = rs_RoundDec(ValorbaseSubTrib * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTrib = rs_RoundDec((ValorIcm + ValorSubTrib) / EstAliqInterna * 100,2);
  END
  ELSE
  BEGIN
     IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
        ValorBaseSubTrib = ValorBaseSubTrib +  ((ValorBaseSubTrib * TriMargemLucroSubst) / 100);

     IF (ValorBaseSubTrib > 0 AND EstAliqInterna > 0) THEN
        ValorSubTrib = (ValorBaseSubTrib * EstAliqInterna) / 100;
        ValorSubTrib = ValorSubTrib - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  END
END

--Substituição tributaria não informada na nota, somente para sair no pedido
--Eder - Chamado 262460
IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND TriMargemLucroSubst <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0) THEN
    ValorBaseSubTribCarga = ValorBaseSubTribCarga - ((ValorBaseSubTribCarga  * RedBaseSubTrib) / 100);

  --Ronaldo Chamado 313933
  IF (RegTribPercIvaSimplicado > 0 AND EstAliqInterna > 0)  THEN
  BEGIN
     ValorSubTribCarga     = Rs_RoundDec(ValorBaseSubTribCarga * RegTribPercIvaSimplicado / 100,2);
     ValorBaseSubTribCarga = Rs_RoundDec((ValorIcm + ValorSubTribCarga) / EstAliqInterna * 100,2);
  END
  ELSE
  BEGIN
    IF (TriMargemLucroSubst <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
       ValorBaseSubTribCarga = ValorBaseSubTribCarga +  ((ValorBaseSubTribCarga * TriMargemLucroSubst) / 100);
    IF (ValorBaseSubTribCarga > 0 AND EstAliqInterna > 0) THEN
       ValorSubTribCarga = (ValorBaseSubTribCarga * EstAliqInterna) / 100;
       ValorSubTribCarga = ValorSubTribCarga - Rs_RoundDec((ValorBaseSubTribDestino * AliqICM) / 100,2);
  END
END

--Calculo da substituição tributaria pela tabela SubstituicaoTributaria              
IF ((CodSubTributaria > 0)
   AND (TriFlagSubTributaria = 1) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (SubMargemLucro <> 0) AND (EstFlagConvSub = 1)) THEN
BEGIN              
  IF (SubPercReducao <> 0) THEN
     CalcBaseSubTrib  = CalcBaseSubTrib - ((CalcBaseSubTrib * SubPercReducao) / 100);
  IF (SubMargemLucro <> 999.99) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  ((CalcBaseSubTrib * SubMargemLucro) / 100);
  IF (SubIndiceReducao <> 0) THEN
     CalcBaseSubTrib = CalcBaseSubTrib +  (CalcBaseSubTrib * SubIndiceReducao);
          
  --Quando não tem aliquota interna na sub.trib, pega a do estado de origem          
  IF ((CalcBaseSubTrib > 0) AND
     ((SubAliquotaInterna > 0) OR (EstAliqInterna > 0))) THEN
  BEGIN            
    IF (SubAliquotaInterna > 0) THEN
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * SubAliquotaInterna) / 100;
    END
    ELSE            
    BEGIN
       CalcValorSubTrib = (CalcBaseSubTrib * EstAliqInterna) / 100;
    END
  END            
          
  --Opção que permite abater o icms da operação na substituição tributaria          
  IF (SubFlagAbaterICM = 1) THEN
     CalcValorSubTrib = CalcValorSubTrib - Rs_RoundDec((CalcBaseSubTribDestino * AliqICM) / 100,2);
  
  IF ((OprTipoICM = 0) AND (OprTipoSubTributaria > 0)) THEN
  BEGIN              
    ValorBaseSubTrib = CalcBaseSubTrib;
    ValorSubTrib = CalcValorSubTrib;
  END              
              
  --Eder - Chamado 262460
  IF (OprTipoSubTributariaCarga = 0) THEN
  BEGIN
    ValorBaseSubTribCarga = CalcBaseSubTrib;
    ValorSubTribCarga = CalcValorSubTrib;
  END
END              

--MARCELO - CHAMADO 195051
IF ((ValorBaseSubTrib <> 0) OR (ValorSubTrib <> 0))  THEN
BEGIN
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
END

--Eder - Chamado 295277
--O cálculo do ICMS para Simples deve ser feito após o calculo da ST pois a ST considera aliquotas internas normais de ICMS
IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
    (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))) THEN  --Saida ou entrada por devolução
BEGIN
  IF (TriAliqICM <= 0) THEN
    AliqICM = 0;
  ELSE
    AliqICM = ParAliqICMSimples;
  IF ((OprTipoICM = 1) OR
      (OprTipoICM = 2 AND FlagEntrada = 0) OR
      (OprTipoICM = 2 AND FlagEntrada = 1 AND OprFlagDefaultLancamentoOutras = 0)) THEN
    AliqICM = 0;
  ValorICM = (ValorBaseIcm * AliqICM) / 100;
END


IF (AliqICM = 0) THEN
  ValorBaseIcm = 0;
ELSE
  ValorIsentoICM = ValorIsentoICM - ValorBaseIcm;


IF ((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    ValorIsentoICM = 0;
  END    
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        


--Calcula o Fator de Redução de Custo
FatorRedCusto = 1;
IF (ParTipoReducaoICM = 1 AND Ltrim(CodEntidade) <> ''
  AND (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))
--Eder - Chamado 170325
  AND (CodProduto <> 8888888)) THEN
BEGIN
IF (NOT(((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0) OR (SubMargemLucro <> 0))))) THEN
--  Isaac - Chamado 191232
--  If (OprTipoSubTributaria not in(2,3)) then   --não calcula quando a sub. tributaria é isenta/outras
  BEGIN
     FatorRedCusto = (100 - TriAliqICM) / (100 - AliqICM);
  END

  IF (OprPerRedMargem <> 0) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (OprPerRedMargem / 100);
  END

  --Eder - Chamado 270320
  --If (TriPerRedMargem <> 0) then
  --begin
  --  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
  --end
END
--Eder - Chamado 270320
IF ((TriPerRedMargem <> 0) AND (CodProduto <> 8888888)) THEN
BEGIN
  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
END

-- 298865
--Eder - Chamado 195755
--Somente vai calcular DespesasNaoInclusas no fator quando for saída ou devolução      
-- Renato - 278440
IF ((FlagEntrada = 0) OR
    ((FlagEntrada = 1) AND (OprTipoMovimento = 1))) THEN
BEGIN
  --Eder - Chamado 170325
  --Adiciona o acrescimo de custo, que já deve vir passado como percentual
  IF ((PerRedDespesa <> 0) AND (ParTipoReducaoICM IN (0,1)) AND (flagdeduzirdespnaoinclnamargem = 0)) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto + PerRedDespesa;
  END
END

--Calcula o fator de venda para as saídas e entradas por devolução.
--Retira o Valor do ICM, a Aliquota de CPMF, a Aliquota de PIS/COFINS e soma o acrescimo de vend
FatorRedVenda = 1;
IF (((FlagEntrada = 0) OR
    ((FlagEntrada = 1) AND (OprTipoMovimento = 1)))
   -- Renato - 278440
   AND (ParTipoReducaoICM = 2)) THEN -- 2 - Deduzir Impostos da Venda
BEGIN
  --Eder -Chamado 292832 - Evitar arredondamento desnecessario na aliquota do ICM (Vide Chamado)
  IF ((AliqICM > 0) AND (ValorTotal > 0)) THEN
     IF (ValorBaseICM = ValorTotal + AcrescimoBaseICM) THEN
        FatorRedVenda = FatorRedVenda - (CAST(AliqICM AS NUMERIC(7,4))/ 100);
     ELSE
        FatorRedVenda = FatorRedVenda -
                        Rs_RoundDec(((CAST(ValorICM AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);

  IF (ParAliqCPMF > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(ParAliqCPMF AS NUMERIC(7,4))/ 100);

  IF (AliqPISCOFINS > 0) THEN
     FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);

  IF ((LisPercAcrescimoAdm1 + LisPercAcrescimoAdm2 + LisPercAcrescimoAdm3) > 0) THEN
     FatorRedVenda = FatorRedVenda -
              ((CAST(LisPercAcrescimoAdm1 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm2 AS NUMERIC(9,4)) +
                CAST(LisPercAcrescimoAdm3 AS NUMERIC(9,4))) / 100);

--calcula o percentual do acrescimo de despesas de venda sobre o total do item para achar o fator
  IF ((AcrescimoRedVenda <> 0) AND (ValorTotal > 0)) THEN
     FatorRedVenda = FatorRedVenda -
                     Rs_RoundDec(((CAST(AcrescimoRedVenda AS NUMERIC(9,4)) * 100) / CAST(ValorTotal AS NUMERIC(11,4))) / 100,4);

  --Renato - 290579
  -- Se for uma venda fora do estado e os Percentuais de ICMS e SubTrib da Compra estiverem informados
  -- no Item da Lista de Preco vai abater o ICMS da compra no Custo.
  IF ((CidEmpCodEstado <> CidCodEstado) AND (PercICMCusto > 0) AND (PercSubTribCusto > 0)) THEN
  BEGIN
    FatorRedCusto = FatorRedCusto - (PercICMCusto / 100);
  END
END

--Renato - 278440
IF ((PerRedDespesa <> 0) AND (FlagDeduzirDespNaoInclNaMargem = 1) AND (ParTipoReducaoICM <> 2)) THEN
BEGIN                                                    
  FatorRedVenda = FatorRedVenda - PerRedDespesa;
END  


--Eder - 303720            
AcrDespesasPisCOFINS = AcrescimoBaseICM;
IF (OprFlagIPISobrePisCofins = 1) THEN --Calcula IPI sobre Pis e COFINS
  AcrDespesasPisCOFINS = AcrDespesasPisCOFINS + VAuxValorIPI;

-- Renato - Chamado 272165
--Renato - 283520
SELECT ValorBasePisCofins, AliqPis, AliqCofins, NumCstPisCofins, NatReceitaPisCofins, NatBaseCalcCredito,
       -- Renato - 361650
       AliqComplPis, AliqComplCofins
  FROM Calcular_PisCofins(:Empresa, :CodProduto, :CodEntidade, :CodTributacao, :CodOperacao,
                          :CodClassFiscal, :ValorTotal, :AcrDespesasPisCOFINS, :FlagEntrada)
  -- Renato - 297792
  INTO :ValorBasePisCofins, :AliqPis, :AliqCofins, :NumCstPisCofins, :NatReceitaPisCofins, :NatBaseCalcCredito,
       -- Renato - 361650
       :AliqComplPis, :AliqComplCofins;

--usar a variável CidCodEstado pois não pode considerar a opção de "considerar ICM de origem" na hora
--de calcular o CFOP
---Calculo do CFOP do Item
IF (CodProduto = 8888888) THEN  --- Quando for servico
BEGIN
  IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX'
     AND Ltrim(OprCFOP_Servico_NCFora) <> '') THEN
    NumCFOP = OprCFOP_Servico_NCFora;
  ELSE
    NumCFOP = OprCFOP_Servico;
END
ELSE
BEGIN
  IF (TriTipoCFOP = 1 OR TriTipoCFOP = 0) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP1_Normal_NCFora) <> '') THEN
      NumCFOP = OprCFOP1_Normal_NCFora;
    ELSE
      NumCFOP = OprCFOP1_Normal;
  END
  IF (TriTipoCFOP = 2) THEN
  BEGIN
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX' AND
       rs_Ltrim(OprCFOP2_Industrializado_NCFora) <> '') THEN
      NumCFOP = OprCFOP2_Industrializado_NCFora;
    ELSE
      NumCFOP = OprCFOP2_Industrializado;
  END
  IF (TriTipoCFOP = 3) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP3_SubRevenda_NC;
    ELSE
      NumCFOP = OprCFOP3_SubRevenda;
  END
  IF (TriTipoCFOP = 4) THEN
  BEGIN
    --JALDO - CHAMADO 184880
    --If (EntTipoPessoa in('F','N')) then
    IF (EntTipoPessoa IN('F','N') AND CidCodEstado <> CidEmpCodEstado AND CidCodEstado <> 'EX') THEN
      NumCFOP = OprCFOP4_SubRevendaML_NC;
    ELSE
      NumCFOP = OprCFOP4_SubRevendaML;
  END
  IF (TriTipoCFOP = 5) THEN ----
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP5_SubFabricacao_NC;
    ELSE
      NumCFOP = OprCFOP5_SubFabricacao;
  END
  IF (TriTipoCFOP = 6) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N')) THEN
      NumCFOP = OprCFOP6_SubFabricacaoML_NC;
    ELSE
      NumCFOP = OprCFOP6_SubFabricacaoML;
  END
  IF (TriTipoCFOP = 7) THEN
  BEGIN
    NumCFOP = OprCFOP7_Importado;
  END
  IF (TriTipoCFOP = 9) THEN ---
  BEGIN
    IF (EntTipoPessoa IN('F','N','C','P')) THEN
      NumCFOP = OprCFOP9_Petroleo_NC;
    ELSE
      NumCFOP = OprCFOP9_Petroleo;
  END
END

IF (rs_Substring(NumCFOP,1,1) IN ('1','2','3') AND CidCodEstado <> CidEmpCodEstado) THEN --Entradas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '3' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '2' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

IF (rs_Substring(NumCFOP,1,1) IN ('5','6','7') AND CidCodEstado <> CidEmpCodEstado) THEN --Saídas
  IF (CidCodEstado <> CidEmpCodEstado AND CidCodEstado = 'EX') THEN
    NumCFOP = '7' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);
  ELSE
    NumCFOP = '6' || Rs_Substring(:NumCFOP,2,rs_Length(:NumCFOP) -1);

--MARCELO - CHAMADO 209798
/*
CFOP 5.405 não existe o seu correlado 6.405 para vendas fora do estado, 
devendo ser utilizado em seu lugar o CFOP 6.404, conforme reunião definada
com Eder
*/
-- Rafael chamado 224824
--if (NumCFOP = '6405') then
  --NumCFOP = '6404';
 IF (NumCFOP = '6405') THEN
  NumCFOP = '6404';

 IF (NumCFOP = '6.405') THEN
  NumCFOP = '6.404';


--Teste de Valores Nulos
IF (NumCFOP IS NULL) THEN
  NumCFOP = '';
IF (AliqICM IS NULL) THEN
  AliqICM = 0;

IF (CodProduto = 8888888) THEN   -- para serviço nao pode calcular o icm
BEGIN
  -- Renato - 341779
  IF ( (OprFlagICMSSobreServicos = 0) OR (OprTipoIcm IN (1,2)) ) THEN
  BEGIN
    AliqICM = 0;
    ValorBaseIcm = 0;
    ValorICM = 0;
    ValorIsentoICM = 0;
    ValorOutrasICM = 0;
                                         
    IF (OprFlagICMSSobreServicos = 0) THEN
    BEGIN                                                                            
      IF (TriTipoValorNaoTributado = 0) THEN
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      ELSE                                                                          
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    END
    ELSE
    BEGIN
      IF (OprTipoIcm = 1) THEN
        ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
      ELSE                                 
        ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
    END
                                                                                                    
  END
  ELSE IF ( (OprFlagICMSSobreServicos = 1) AND (OprTipoIcm = 0) AND ((AliqICM = 0) OR (ValorBaseIcm = 0)) ) THEN
  BEGIN
    IF (TriTipoValorNaoTributado = 0) THEN
      ValorIsentoICM = ValorTotal + AcrescimoBaseICM;
    ELSE                                                                          
      ValorOutrasICM = ValorTotal + AcrescimoBaseICM;
  END

  ValorBaseSubTrib = 0;
  ValorSubTrib = 0;
  ValorBaseSubTribCarga = 0;
  ValorSubTribCarga = 0;
  RedBaseSubTrib = 0;
--Eder - Chamado  170325
--FatorRedCusto = 1;
  FatorRedVenda = 1;
  AliqPISCOFINS = 0;
END
PerRedBaseSubTrib = RedBaseSubTrib;

--Eder - 297029
IF (ValorBaseICM > 0 AND ValorIsentoICM > 0) THEN
  --Renato - 361064
  --PerReducaoICM = Rs_RoundDec(ValorIsentoICM / (ValorBaseICM + ValorIsentoICM) * 100,2);
  PerReducaoICM = TriPerReducaoICM;
ELSE
  PerReducaoICM = 0;

--Renato - 360358
IF (ValorBaseSubTrib = 0  AND ValorSubTrib = 0 AND ValorBaseSubTribCarga = 0 AND ValorSubTribCarga = 0) THEN
BEGIN
  EstAliqInterna = 0;
  TriMargemLucroSubst = 0;
END 

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = TriMargemLucroSubst;


--Define o valor de isento ou o valor de outras para o que não foi tributado
IF ((CodProduto <> 8888888) AND (ValorIsentoICM > 0)) THEN
BEGIN
  --Chamado 156315 - calculando errado valor de isentas com tributação com coluna de outras
  IF ((OprTipoICM = 2) OR
      ((TriTipoValorNaoTributado = 1) AND (OprTipoICM = 0))) THEN
  BEGIN
    --MARCELO - CHAMADO 240364
    IF ((NOT((OprTipoSubTributaria IN(2,3)) AND
             (ClaFlagSubTributaria = 1) AND
             (GruFlagSubTributaria = 1) AND
             (EstFlagConvSub = 1) AND
             ((TriFlagSubTributaria = 1) OR (TriMargemLucroSubst <> 0)))) OR
        (OprTipoICM = 2)) THEN
    BEGIN
      ValorOutrasICM = ValorIsentoICM;
      ValorIsentoICM = 0;
    END
  END
END

SUSPEND;

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE STORED_PRCE050CALCULARICM (
    empresa SMALLINT,
    tipocontrole SMALLINT,
    codcontrole INTEGER,
    codoperacao INTEGER,
    notavalorprodutos NUMERIC(11,2),
    notavalorservicos NUMERIC(11,2),
    notavalordesconto NUMERIC(11,2),
    notavalordespesas NUMERIC(11,2),
    notavalordespesasvenda NUMERIC(11,2),
    notavalordescontoservicos NUMERIC(11,2),
    notavalorsubtribtotal NUMERIC(11,2),
    notavalordespesasnaoinc NUMERIC(11,2),
    codentidade CHAR(7),
    valorcontabilnota NUMERIC(11,2),
    valoripinota NUMERIC(11,2),
    flagalteraaliquota SMALLINT,
    flagalterarcfop SMALLINT,
    flagselectbaseicm SMALLINT,
    modelodocumento VARCHAR(3))
RETURNS (
    valorbaseicm NUMERIC(11,2))
AS
DECLARE VARIABLE acrescimobaseicm NUMERIC(11,2);
DECLARE VARIABLE acrescimobasesubtrib NUMERIC(13,4);
DECLARE VARIABLE acrescimoredvenda NUMERIC(13,4);
DECLARE VARIABLE perreddespesa NUMERIC(15,8);
DECLARE VARIABLE valoricm NUMERIC(13,4);
DECLARE VARIABLE numlancamento INTEGER;
DECLARE VARIABLE seqtemporaria SMALLINT;
DECLARE VARIABLE numsequenciacomp SMALLINT;
DECLARE VARIABLE tipoitem SMALLINT;
DECLARE VARIABLE codproduto INTEGER;
DECLARE VARIABLE codtributacao CHAR(5);
DECLARE VARIABLE valortotal NUMERIC(11,2);
DECLARE VARIABLE aliqipi NUMERIC(4,2);
DECLARE VARIABLE aliqicm NUMERIC(4,2);
DECLARE VARIABLE tempaliqicm NUMERIC(4,2);
DECLARE VARIABLE valorisentoicm NUMERIC(11,2);
DECLARE VARIABLE valoroutrasicm NUMERIC(11,2);
DECLARE VARIABLE compvalorisentoicm NUMERIC(11,2);
DECLARE VARIABLE compvaloroutrasicm NUMERIC(11,2);
DECLARE VARIABLE compvalorbaseicm NUMERIC(11,2);
DECLARE VARIABLE valorbasesubtrib NUMERIC(11,2);
DECLARE VARIABLE valorsubtrib NUMERIC(11,2);
DECLARE VARIABLE valorbasesubtribcarga NUMERIC(11,2);
DECLARE VARIABLE valorsubtribcarga NUMERIC(11,2);
DECLARE VARIABLE fatorredcusto NUMERIC(15,8);
DECLARE VARIABLE fatorredvenda NUMERIC(7,4);
DECLARE VARIABLE numcfop CHAR(10);
DECLARE VARIABLE codclassfiscal VARCHAR(15);
DECLARE VARIABLE codlistapreco INTEGER;
DECLARE VARIABLE flagentrada INTEGER;
DECLARE VARIABLE tipopessoa VARCHAR(1);
DECLARE VARIABLE aliqpiscofins NUMERIC(4,2);
DECLARE VARIABLE flagsubtribdespesas INTEGER;
DECLARE VARIABLE codempmestre CHAR(7);
DECLARE VARIABLE perredbasesubtrib NUMERIC(4,2);
DECLARE VARIABLE auxperredbasesubtrib NUMERIC(4,2);
DECLARE VARIABLE codsubtributaria INTEGER;
DECLARE VARIABLE subflagsomadespesas INTEGER;
DECLARE VARIABLE flagdespesasipi INTEGER;
DECLARE VARIABLE valorcustofor NUMERIC(13,4);
DECLARE VARIABLE quantatendida NUMERIC(10,3);
DECLARE VARIABLE valorcontabilnotaservico NUMERIC(11,2);
DECLARE VARIABLE servicovalorbaseicm NUMERIC(11,2);
DECLARE VARIABLE servicovalorisentoicm NUMERIC(11,2);
DECLARE VARIABLE servicovaloroutrasicm NUMERIC(11,2);
DECLARE VARIABLE servicocompvalorbaseicm NUMERIC(11,2);
DECLARE VARIABLE servicocompvalorisentoicm NUMERIC(11,2);
DECLARE VARIABLE servicocompvaloroutrasicm NUMERIC(11,2);
DECLARE VARIABLE diferenca NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferenca SMALLINT;
DECLARE VARIABLE diferencaproduto NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferencaproduto SMALLINT;
DECLARE VARIABLE diferencaservico NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferencaservico SMALLINT;
DECLARE VARIABLE contador SMALLINT;
DECLARE VARIABLE valorbasepiscofins NUMERIC(11,2);
DECLARE VARIABLE aliqpis NUMERIC(4,2);
DECLARE VARIABLE aliqcofins NUMERIC(4,2);
DECLARE VARIABLE valorunitario NUMERIC(13,4);
DECLARE VARIABLE flagdeduzirdespnaoinclnamargem SMALLINT;
DECLARE VARIABLE valordescontoaux NUMERIC(11,2);
DECLARE VARIABLE partiporeducaoicm INTEGER;
DECLARE VARIABLE valorprodutostributados NUMERIC(11,2);
DECLARE VARIABLE maioraliqipi NUMERIC(4,2);
DECLARE VARIABLE perreducaoicm NUMERIC(5,2);
DECLARE VARIABLE numcsticm VARCHAR(3);
DECLARE VARIABLE numcstipi VARCHAR(2);
DECLARE VARIABLE numcstpiscofins VARCHAR(2);
DECLARE VARIABLE numcsosn VARCHAR(3);
DECLARE VARIABLE natreceitapiscofins INTEGER;
DECLARE VARIABLE oprflagipisobrebaseicm SMALLINT;
DECLARE VARIABLE natbasecalccredito SMALLINT;
DECLARE VARIABLE indnaturezafrete SMALLINT;
DECLARE VARIABLE acrescimobaseipi NUMERIC(11,2);
DECLARE VARIABLE valorbaseipi NUMERIC(11,2);
DECLARE VARIABLE valorisentoipi NUMERIC(11,2);
DECLARE VARIABLE valoroutrasipi NUMERIC(11,2);
DECLARE VARIABLE aliqicmsst NUMERIC(5,2);
DECLARE VARIABLE percmvaicmsst NUMERIC(5,2);
DECLARE VARIABLE oprtipoipi INTEGER;

--Renato - 361650 
DECLARE VARIABLE AliqComplICM    NUMERIC(5,2);
DECLARE VARIABLE AliqComplPIS    NUMERIC(5,2);
DECLARE VARIABLE AliqComplCOFINS NUMERIC(5,2);
BEGIN
  /************
   VERSAO 3.00
  *************/

  --Renato - 278440   
  SELECT FlagDeduzirDespNaoInclNaMargem
  FROM ConfiguracaoSistema
  INTO :FlagDeduzirDespNaoInclNaMargem;

  --Renato - 278440
  SELECT TipoReducaoICM
  FROM ParamControle WHERE Empresa = :Empresa
  INTO :ParTipoReducaoICM;

  IF (TipoControle = 1) THEN
  BEGIN
    FlagEntrada = 1;
  END
  ELSE
  BEGIN
    FlagEntrada = 0;
  END

 CodEmpMestre = 'M' || Rs_Replicate('0',6 - Rs_length(Empresa)) || CAST(Empresa AS VARCHAR(2));

 SELECT Ent.TipoPessoa
        --Ent.TipoConsideraIPICalculoICM --243556 / 248899
   FROM Entidades Ent
   WHERE Ent.Codigo = :CodEntidade
  INTO :TipoPessoa;
       --:TipoConsideraIPICalculoICM; --243556 / 248899

 --Gabriella - 256424
 SELECT FlagIPISobreBaseICM
 FROM Operacoes
 WHERE Codigo = :CodOperacao
 INTO :oprflagipisobrebaseicm;

--243556
--if (TipoPessoa <> 'J') then

--Gabriella - 256424
--248899
-- if ( ((TipoConsideraIPICalculoICM = 0) and (TipoPessoa <> 'J')) or
--      (TipoConsideraIPICalculoICM = 1) ) then
--    ValorContabilNota = ValorContabilNota + ValorIPINota;
--  if ((TipoPessoa <> 'J') and (TipoPessoa <> 'I'))  then
  IF (((TipoPessoa <> 'J') AND (TipoPessoa <> 'I')) OR (:oprflagipisobrebaseicm = 1)) THEN
    ValorContabilNota = ValorContabilNota + ValorIPINota;
  
--Considera as despesas sobre IPI quando está marcado na operação fiscal  
--Gabriella - 333391
--ValorIPIDespesas = 0;
acrescimobaseipi = 0;

/*Karina - 147820*/
--306221 if (VALORIPINOTA <> 0) then
--306221 begin
  -- Rafael chamado 281202
  --select Rs_RoundDec((coalesce(max(T.AliqIPI),0) * :NotaValorDespesas) /100,2)
/*  Select
   coalesce(Sum(Case When T.AliqIpi <> 0 then T.ValorTotal end),0),
   coalesce(Max(T.AliqIPI),0)
 
    from TempPrce050Itens T
    left join Operacoes O on O.Codigo = :CodOperacao
  where T.Empresa = :Empresa
    and T.TipoControle = :TipoControle
    and T.CodControle = :CodControle
    and T.Status <> 'E'
    and T.Status <> 'L'
    and T.CodProduto <> 8888888
    --MARCELO - CHAMADO 187905
    and T.QuantAtendida > 0
    and O.FlagDespesasIPI = 1
  -- Rafael chamado 281202
  --into :ValorIPIDespesas;
  into :valorprodutostributados,:maioraliqipi;

--306221 end


--Rafael chamado 281202
if (notavalorprodutos > 0 ) then
  ValorIPIDespesas = Rs_RoundDec((ValorProdutosTributados/notavalorprodutos * (ValorIPIDespesas)) * (maioraliqipi / 100),2);
else
  ValorIPIDespesas =0;

  
if (ValorIPIDespesas is null) then
  ValorIPIDespesas = 0; */

 -- Cria um cursor para atualizar o ICM dos itens da nota
 FOR
   SELECT CAST(0 AS SMALLINT) , T.NumLancamento, T.SeqTemporaria, CAST(0 AS SMALLINT),
          T.CodProduto, T.CodTributacao,
          -- Renato - 321936 - Notas de Frete é considerado o valor unitario do item
          CASE WHEN (:ModeloDocumento IN ('07', '08', '8B', '09', '10', '11', '26', '27', '57')) AND
                    (T.ValorTotal = 0) THEN T.ValorUnitario ELSE T.ValorTotal END AS ValorTotal,
          T.AliqIPI, T.CodClassFiscal, T.CodListaPreco, T.AliqICM, O.FlagSubTribDespesas,
          T.PerRedBaseSubTrib, O.FlagDespesasIPI, T.CodSubTributaria, Sub.FlagSomaDespesas,
          T.ValorCustoFor, T.QuantAtendida,
          -- Renato - 278440
          T.ValorUnitario,
          --Gabriella - 360317
          O.TipoIPI

     FROM TempPrce050Itens T
     LEFT JOIN Operacoes O ON O.Codigo = :CodOperacao
     LEFT JOIN SubstituicaoTributaria Sub ON Sub.CodSubTributaria = T.CodSubTributaria      
                                         AND Sub.Empresa = T.Empresa      
     WHERE T.Empresa = :Empresa
       AND T.TipoControle = :TipoControle
       AND T.CodControle = :CodControle
       AND T.Status <> 'E'
       AND T.Status <> 'L'
   UNION
   SELECT CAST(1 AS SMALLINT), TComp.NumLancamento, TComp.SeqTemporaria, TComp.NumSequencia,
          TComp.CodProduto, TComp.CodTributacao, TComp.ValorTotal, TComp.AliqIPI,
          TComp.CodClassFiscal, TComp.CodListaPreco, TComp.AliqICM, O.FlagSubTribDespesas,
          TComp.PerRedBaseSubTrib, O.FlagDespesasIPI, TComp.CodSubTributaria, Sub.FlagSomaDespesas,
          TComp.ValorCustoFor, TComp.QuantAtendida,
          -- Renato - 278440
          TComp.ValorUnitario,
          --Gabriella - 360317
          O.TipoIPI
     FROM TempPrce050Componentes TComp
     LEFT JOIN Operacoes O ON O.Codigo = :CodOperacao
     LEFT JOIN SubstituicaoTributaria Sub ON Sub.CodSubTributaria = TComp.CodSubTributaria
                                         AND Sub.Empresa = TComp.Empresa
     WHERE TComp.Empresa = :Empresa
       AND TComp.TipoControle = :TipoControle
       AND TComp.CodControle = :CodControle
       AND TComp.Status <> 'E'

    INTO :TipoItem, :NumLancamento, :SeqTemporaria, :NumSequenciaComp,
         :CodProduto, :CodTributacao, :ValorTotal, :AliqIPI,
         :CodClassFiscal, :CodListaPreco, :TempAliqICM, :FlagSubTribDespesas,
         :AuxPerRedBaseSubTrib, :FlagDespesasIPI, :CodSubTributaria, :SubFlagSomaDespesas,
         :ValorCustoFor, :QuantAtendida,
         -- Renato - 278440
         :ValorUnitario,
         --Gabriella - 360317
         :OprTipoIpi
    DO
      BEGIN
        AcrescimoBaseICM = 0;
        AcrescimoBaseSubTrib = 0;
        AcrescimoRedVenda = 0;
        -- Renato - 278440 
        -- AcrescimoRedCusto = 0;
        PerRedDespesa = 0;

        /*Karina - 147820*/
--306221         if (VALORIPINOTA = 0) then
--306221           AliqIPI = 0;

        --Eder - Chamado 170325
        --Calcula o percentual de acrescimo no custo
        --If ((ValorCustoFor > 0) and (NotaValorDespesasNaoInc > 0) and ((NotaValorProdutos + NotaValorServicos) > 0) and (QuantAtendida > 0)) then
        --begin
        --  AcrescimoRedCusto = ((NotaValorDespesasNaoInc * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorCustoFor;
        --end
        IF ((FlagDeduzirDespNaoInclNaMargem = 1) AND (ParTipoReducaoICM <> 2)) THEN
          ValorDescontoAux = NotaValorDesconto;
        ELSE
          ValorDescontoAux = 0;
        /* 298865
        If ((ValorUnitario > 0) and ((NotaValorDespesasNaoInc > 0) or (ValorDescontoAux > 0)) and ((NotaValorProdutos + NotaValorServicos) > 0)  and (QuantAtendida > 0)) then
        begin         
          PerRedDespesa = (( (NotaValorDespesasNaoInc + ValorDescontoAux) * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorUnitario;
        end
        */
        IF (((NotaValorDespesasNaoInc > 0) OR (ValorDescontoAux > 0)) AND ((NotaValorProdutos + NotaValorServicos) > 0)  AND (QuantAtendida > 0)) THEN
        BEGIN

          IF ((FlagDeduzirDespNaoInclNaMargem = 1) AND (ValorUnitario > 0)) THEN
            PerRedDespesa = (( (NotaValorDespesasNaoInc + ValorDescontoAux) * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorUnitario;

          ELSE IF ((FlagDeduzirDespNaoInclNaMargem = 0) AND (ValorCustoFor > 0)) THEN
            PerRedDespesa = (( NotaValorDespesasNaoInc * (ValorTotal / (NotaValorProdutos + NotaValorServicos))) / QuantAtendida) / ValorCustoFor;
        END

        IF ((CodProduto <> 8888888) AND (NotaValorProdutos > 0)) THEN
        BEGIN
          --Gabriella - 333391
          IF ((FlagDespesasIPI = 1) AND (aliqipi > 0)) THEN
            AcrescimoBaseIPI = CAST(ValorTotal AS NUMERIC(18,9)) / NotaValorProdutos * (NotaValorDespesas);
          --Gabriella - 360317
          ELSE IF ((AliqIPI = 0) AND (OprTipoIPI = 0)) THEN
            AcrescimoBaseIPI = CAST(ValorTotal AS NUMERIC(18,9)) / NotaValorProdutos * (0 - NotaValorDesconto);
          ELSE
            AcrescimoBaseIPI = 0;
                                                                                                                                                                    
          IF (AcrescimoBaseIPI IS NULL) THEN
            AcrescimoBaseIPI = 0;

          AcrescimoBaseICM = (NotaValorDespesas - NotaValorDesconto) * (CAST(ValorTotal AS NUMERIC(18,9)) / NotaValorProdutos);
          AcrescimoBaseSubTrib = 0;
          IF (((FlagSubTribDespesas = 1) AND (CodSubTributaria = 0)) OR
              ((SubFlagSomaDespesas = 1) AND (CodSubTributaria > 0))) THEN
             AcrescimoBaseSubTrib = NotaValorDespesas;

          /*Ronaldo Chamado 358571
          --Gabriella - 298263      
          if ((FlagDespesasIPI = 1) and (AliqIPI > 0)) then
          begin
            --Gabriella - 333391
            --AcrescimoBaseSubTrib = AcrescimoBaseSubTrib + ValorIPIDespesas;
            AcrescimoBaseSubTrib = AcrescimoBaseSubTrib + ((AcrescimoBaseIPI * aliqipi) / 100);
            --Eder - Chamado 174565
            --ValorIPIDespesas = 0;
          end*/

          AcrescimoBaseSubTrib = (AcrescimoBaseSubTrib - NotaValorDesconto) * (ValorTotal / NotaValorProdutos);

          AcrescimoRedVenda = NotaValorDespesasVenda * (ValorTotal / NotaValorProdutos);
        END
        IF ((CodProduto = 8888888) AND (NotaValorServicos > 0)) THEN
        BEGIN
          IF (NotaValorProdutos > 0) THEN
             AcrescimoBaseICM = (NotaValorDescontoServicos * -1) * (ValorTotal / NotaValorServicos);
          ELSE
             AcrescimoBaseICM = (NotaValorDespesas - NotaValorDescontoServicos) * (ValorTotal / NotaValorServicos);
          AcrescimoBaseSubTrib = 0;
          AcrescimoRedVenda = 0;
        END

        IF (FlagAlteraAliquota = 1) THEN
          TempAliqICM = 0;

         SELECT AliqICM, ValorBaseICM,
           ValorICM, ValorIsentoICM, ValorOutrasICM,
           ValorBaseSubTrib, ValorSubTrib, PerRedBaseSubTrib,
           FatorRedCusto, FatorRedVenda, NumCFOP,
           ValorBaseSubTribCarga, ValorSubTribCarga,
           AliqPISCOFINS,
           -- Renato - Chamado 272165
           ValorBasePisCofins, AliqPis, AliqCofins,
           --Gabriella - 284639
           PerReducaoICM, NumCstICM, NumCstIPI, NumCstPisCofins, NumCsosn,
           -- Renato - 297792
           NatReceitaPisCofins,
           -- Renato - 332318
           NatBaseCalcCredito,
           IndNaturezaFrete,
           --Gabriella - 333391
           ValorBaseIPI,
           ValorIsentoIPI,
           ValorOutrasIPI,
           --Renato - 360358
           AliqICMSST,
           PercMvaICMSST,

           --Renato - 361650
           AliqComplICM,  
           AliqComplPIS,
           AliqComplCOFINS

         FROM Calcular_ICM(:Empresa, :CodProduto, :CodTributacao, :CodEntidade,
                           :CodOperacao, :ValorTotal, :AcrescimoBaseICM, :AcrescimoBaseSubTrib, :AuxPerRedBaseSubTrib,
                           :AliqIPI, :CodClassFiscal, :FlagEntrada,:AcrescimoRedVenda,
                           :CodListaPreco, :TempAliqICM, :CodSubTributaria, :PerRedDespesa, :acrescimobaseipi)
         INTO :AliqICM, :ValorBaseICM,
              :ValorICM, :ValorIsentoICM, :ValorOutrasICM,
              :ValorBaseSubTrib, :ValorSubTrib, :PerRedBaseSubTrib,
              :FatorRedCusto, :FatorRedVenda, :NumCFOP,
              :ValorBaseSubTribCarga, :ValorSubTribCarga,
              :AliqPISCOFINS,
              -- Renato - Chamado 272165
              :ValorBasePisCofins, :AliqPis, :AliqCofins,
              --Gabriella - 284639
              :PerReducaoICM, :NumCstICM, :NumCstIPI, :NumCstPisCofins, :NumCsosn,
              -- Renato - 297792
              :NatReceitaPisCofins,
              -- Renato - 332318
              :NatBaseCalcCredito,
              :IndNaturezaFrete,
              --Gabriella - 333391
              :ValorBaseIPI,
              :ValorIsentoIPI,
              :ValorOutrasIPI,
              --Renato - 360358
              :AliqICMSST,
              :PercMvaICMSST,

              --Renato - 361650
              :AliqComplICM,
              :AliqComplPIS,
              :AliqComplCOFINS;

        IF (TipoItem = 0) THEN
        BEGIN
          UPDATE TempPrce050Itens
             SET ValorBaseICM=:ValorBaseICM,
                 ValorIsentoICM=:ValorIsentoICM,
                 ValorOutrasICM=:ValorOutrasICM,
--MARCELO - CHAMADO 195051
--                 ValorBaseSubTrib=case when :ValorBaseSubTrib > 0 then Coalesce(:ValorBaseSubTrib,0)
--                                       else Coalesce(:ValorBaseSubTribCarga,0) end,
--                 ValorSubTrib=case when :ValorSubTrib > 0 then Coalesce(:ValorSubTrib,0)
--                                   else Coalesce(:ValorSubTribCarga,0) end,
                 ValorBaseSubTrib = COALESCE(:ValorBaseSubTrib,0),
                 ValorSubTrib = COALESCE(:ValorSubTrib,0),
                 ValorBaseSubTribCarga = COALESCE(:ValorBaseSubTribCarga,0),
                 ValorSubTribCarga = COALESCE(:ValorSubTribCarga,0),
                 PerRedBaseSubTrib=:PerRedBaseSubTrib,
                 FatorRedCusto=:FatorRedCusto,
                 FatorRedVenda=:FatorRedVenda,
                 NumCFOP=CASE :FlagAlterarCFOP WHEN 1 THEN :NumCFOP ELSE NumCFOP END,
                 AliqICM=CASE :FlagAlteraALiquota WHEN 1 THEN :AliqICM ELSE AliqICM END,
                 -- Renato - 283226
                 -- AliqPISCOFINS = :ALIQPISCOFINS,
                 AliqPISCOFINS= CASE :FlagAlterarCFOP WHEN 1 THEN :ALIQPISCOFINS ELSE AliqPISCOFINS END,

                 -- Renato - Chamado 272165
                 ValorBasePisCofins = :ValorBasePisCofins,
                 AliqPis = :AliqPis,
                 AliqCofins = :AliqCofins,
                 --Gabriella - 284639
                 PerReducaoICM = :PerReducaoICM,
                 NumCstICM = :NumCstICM,
                 NumCstIPI = :NumCstIPI,
                 NumCstPisCofins = :NumCstPisCofins,
                 NumCsosn = :NumCsosn,
                 --Renato - 297792
                 NatReceitaPisCofins = :NatReceitaPisCofins,
                 --Renato - 332318  
                 NatBaseCalcCredito = :NatBaseCalcCredito,
                 IndNaturezaFrete = :IndNaturezaFrete,
                 --Gabriella - 333391
                 ValorBaseIPI = :ValorBaseIPI,
                 ValorIsentoIPI = :ValorIsentoIPI,
                 ValorOutrasIPI = :ValorOutrasIPI,
                 --Renato - 360358
                 AliqICMSST = :AliqICMSST,
                 PercMvaICMSST = :PercMvaICMSST,

                 --Renato - 361650
                 AliqComplICM    = :AliqComplICM,
                 AliqComplPIS    = :AliqComplPIS,
                 AliqComplCOFINS = :AliqComplCOFINS

           WHERE Empresa=:Empresa
             AND TipoControle=:TipoControle
             AND CodControle=:CodControle
             AND NumLancamento=:NumLancamento
             AND SeqTemporaria=:SeqTemporaria;
        END
        ELSE
        BEGIN
          UPDATE TempPrce050Componentes
             SET ValorBaseICM=:ValorBaseICM,
                 ValorIsentoICM=:ValorIsentoICM,
                 ValorOutrasICM=:ValorOutrasICM,
--MARCELO - CHAMADO 195051
--                 ValorBaseSubTrib=case when :ValorBaseSubTrib > 0 then Coalesce(:ValorBaseSubTrib,0)
--                                       else Coalesce(:ValorBaseSubTribCarga,0) end,
--                 ValorSubTrib=case when :ValorSubTrib > 0 then Coalesce(:ValorSubTrib,0)
--                                   else Coalesce(:ValorSubTribCarga,0) end,
                 ValorBaseSubTrib = COALESCE(:ValorBaseSubTrib,0),
                 ValorSubTrib = COALESCE(:ValorSubTrib,0),
                 ValorBaseSubTribCarga = COALESCE(:ValorBaseSubTribCarga,0),
                 ValorSubTribCarga = COALESCE(:ValorSubTribCarga,0),
                 PerRedBaseSubTrib=:PerRedBaseSubTrib,
                 FatorRedCusto=:FatorRedCusto,
                 FatorRedVenda=:FatorRedVenda,
                 NumCFOP=CASE :FlagAlterarCFOP WHEN 1 THEN :NumCFOP ELSE NumCFOP END,
                 AliqICM=CASE :FlagAlteraALiquota WHEN 1 THEN :AliqICM ELSE AliqICM END,
                 --Gabriella - 284639
                 PerReducaoICM = :PerReducaoICM,
                 NumCstICM = :NumCstICM,
                 NumCstIPI = :NumCstIPI,
                 NumCstPisCofins = :NumCstPisCofins,
                 NumCsosn = :NumCsosn,
                 --Renato - 297792
                 NatReceitaPisCofins = :NatReceitaPisCofins,
                 --Renato - 332318  
                 NatBaseCalcCredito = :NatBaseCalcCredito,
                 --Gabriella - 333391
                 ValorBaseIPI = :ValorBaseIPI,
                 ValorIsentoIPI = :ValorIsentoIPI,
                 ValorOutrasIPI = :ValorOutrasIPI,
                 --Renato - 360358
                 AliqICMSST = :AliqICMSST,
                 PercMvaICMSST = :PercMvaICMSST,

                 --Renato - 361650
                 AliqComplICM    = :AliqComplICM,
                 AliqComplPIS    = :AliqComplPIS,
                 AliqComplCOFINS = :AliqComplCOFINS

           WHERE Empresa=:Empresa
             AND TipoControle=:TipoControle
             AND CodControle=:CodControle
             AND NumLancamento=:NumLancamento
             AND SeqTemporaria=:SeqTemporaria
             AND NumSequencia=:NumSequenciaComp;
        END

     END

TipoItem = 0;
ValorBaseICM = 0;
ValorIsentoICM = 0;
ValorOutrasICM = 0;
CompValorBaseICM = 0;
CompValorIsentoICM = 0;
CompValorOutrasICM = 0;
--MARCELO - CHAMADO 195091
ServicoValorBaseICM = 0;
ServicoValorIsentoICM = 0;
ServicoValorOutrasICM = 0;
ServicoCompValorBaseICM = 0;
ServicoCompValorIsentoICM = 0;
ServicoCompValorOutrasICM = 0;

--MARCELO - CHAMADO 195091
SELECT
  SUM(CASE WHEN CodProduto <> 8888888
           THEN CAST(ValorBaseICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END),
  SUM(CASE WHEN CodProduto <> 8888888
           THEN CAST(ValorIsentoICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END),
  SUM(CASE WHEN CodProduto <> 8888888
           THEN CAST(ValorOutrasICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END),
  SUM(CASE WHEN CodProduto = 8888888
           THEN CAST(ValorBaseICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END),
  SUM(CASE WHEN CodProduto = 8888888
           THEN CAST(ValorIsentoICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END),
  SUM(CASE WHEN CodProduto = 8888888
           THEN CAST(ValorOutrasICM AS NUMERIC(11,2))
           ELSE CAST(0.00 AS NUMERIC(11,2)) END)
FROM TempPrce050Itens T
WHERE Empresa = :Empresa
  AND TipoControle = :TipoControle
  AND CodControle = :CodControle
--MARCELO - CHAMADO 195091
--  and CodProduto <> 8888888
  AND Status <> 'E'
  AND Status <> 'L'
  AND NOT EXISTS (SELECT * FROM TempPRCE050Componentes TComp
                  WHERE TComp.Empresa = T.Empresa
                    AND TComp.NumLancamento = T.NumLancamento
                    AND TComp.SeqTemporaria = T.SeqTemporaria
                    AND TComp.TipoControle = T.TipoControle
                    AND TComp.CodControle = T.CodControle)
INTO
  :ValorBaseICM,
  :ValorIsentoICM,
  :ValorOutrasICM,
--MARCELO - CHAMADO 195091
  :ServicoValorBaseICM,
  :ServicoValorIsentoICM,
  :ServicoValorOutrasICM;

IF (ValorBaseICM IS NULL) THEN
BEGIN
  ValorBaseICM = 0;
  ValorIsentoICM = 0;
  ValorOutrasICM = 0;
  TipoItem = 0;
END

--MARCELO - CHAMADO 195091
IF (ServicoValorBaseICM IS NULL) THEN
BEGIN
  ServicoValorBaseICM = 0;
  ServicoValorIsentoICM = 0;
  ServicoValorOutrasICM = 0;
END

--MARCELO - CHAMADO 195091
SELECT
  SUM(CASE WHEN CodProduto <> 8888888 THEN ValorBaseICM ELSE 0 END),
  SUM(CASE WHEN CodProduto <> 8888888 THEN ValorIsentoICM ELSE 0 END),
  SUM(CASE WHEN CodProduto <> 8888888 THEN ValorOutrasICM ELSE 0 END),
  1,
  SUM(CASE WHEN CodProduto = 8888888 THEN ValorBaseICM ELSE 0 END),
  SUM(CASE WHEN CodProduto = 8888888 THEN ValorIsentoICM ELSE 0 END),
  SUM(CASE WHEN CodProduto = 8888888 THEN ValorOutrasICM ELSE 0 END)
FROM TempPrce050Componentes TComp
WHERE Empresa = :Empresa
  AND TipoControle = :TipoControle
  AND CodControle = :CodControle
  AND Status <> 'E'
INTO
  :CompValorBaseICM,
  :CompValorIsentoICM,
  :CompValorOutrasICM,
  :TipoItem,
--MARCELO - CHAMADO 195091
  :ServicoCompValorBaseICM,
  :ServicoCompValorIsentoICM,
  :ServicoCompValorOutrasICM;

IF (CompValorBaseICM IS NOT NULL) THEN
BEGIN
  ValorBaseICM = ValorBaseICM + CompValorBaseICM;
  ValorIsentoICM = ValorIsentoICM + CompValorIsentoICM;
  ValorOutrasICM = ValorOutrasICM + CompValorOutrasICM;
END
ELSE
  TipoItem = 0;

--MARCELO - CHAMADO 195091
IF (ServicoCompValorBaseICM IS NOT NULL) THEN
BEGIN
  ServicoValorBaseICM = ServicoValorBaseICM + ServicoCompValorBaseICM;
  ServicoValorIsentoICM = ServicoValorIsentoICM + ServicoCompValorIsentoICM;
  ServicoValorOutrasICM = ServicoValorOutrasICM + ServicoCompValorOutrasICM;
END
ELSE
  TipoItem = 0;

--MARCELO - CHAMADO 195091
ValorContabilNotaServico = (ValorContabilNota + NotaValorDesconto) - NotaValorProdutos;
ValorContabilNotaServico = ValorContabilNotaServico + (NotaValorServicos - NotaValorDescontoServicos);
-- 321475
IF (notavalorprodutos > 0 ) THEN
  ValorContabilNotaServico = ValorContabilNotaServico - notavalordespesas;
--MARCELO - CHAMADO 195091
Diferenca         = 0;
FlagTipoDiferenca = 0;
DiferencaProduto         = 0;
FlagTipoDiferencaProduto = 0;
DiferencaServico         = 0;
FlagTipoDiferencaServico = 0;

--MARCELO - CHAMADO 195091
IF ((ValorContabilNota <> (ValorBaseICM + ValorIsentoICM + ValorOutrasICM))
    AND (NotaValorProdutos > 0)) THEN
BEGIN
  FlagTipoDiferencaProduto = 1;
  DiferencaProduto = ValorContabilNota - (ValorBaseICM + ValorIsentoICM + ValorOutrasICM);
END

IF ((ValorContabilNotaServico <> (ServicoValorBaseICM + ServicoValorIsentoICM + ServicoValorOutrasICM))
    AND (NotaValorServicos > 0)) THEN
BEGIN
  FlagTipoDiferencaServico = 2;
  DiferencaServico = ValorContabilNotaServico - (ServicoValorBaseICM + ServicoValorIsentoICM + ServicoValorOutrasICM);
END

--MARCELO - CHAMADO 195091
Contador = 1;
WHILE (Contador <= 2) DO
BEGIN
  IF (Contador = 1) THEN
  BEGIN
    Diferenca = DiferencaProduto;
    FlagTipoDiferenca = FlagTipoDiferencaProduto;
  END
  IF (Contador = 2) THEN
  BEGIN
    Diferenca = DiferencaServico;
    FlagTipoDiferenca = FlagTipoDiferencaServico;
  END

  IF (Diferenca <> 0) THEN
  BEGIN
    IF (TipoItem = 0) THEN
    BEGIN
      SELECT FIRST 1 NumLancamento, SeqTemporaria
      FROM TempPrce050Itens
      WHERE Empresa = :Empresa
        AND TipoControle = :TipoControle
        AND CodControle = :CodControle
--MARCELO - CHAMADO 195091
        AND CASE WHEN :FlagTipoDiferenca = 1 AND CodProduto <> 8888888 THEN 1
                 WHEN :FlagTipoDiferenca = 2 AND CodProduto = 8888888  THEN 1
                 ELSE 0
            END = 1
        AND Status <> 'E'
        AND Status <> 'L'
        AND (ValorBaseICM > 0 OR ValorIsentoICM > 0 OR ValorOutrasICM > 0)
      ORDER BY SeqTemporaria, NumLancamento
      INTO :NumLancamento, :SeqTemporaria;

      IF (NumLancamento IS NOT NULL) THEN
      BEGIN
--MARCELO - CHAMADO 195091
        UPDATE TempPrce050Itens SET
          ValorBaseICM = CASE WHEN ValorBaseICM <> 0
                              THEN ValorBaseICM + :Diferenca
                              ELSE ValorBaseICM END,
          ValorIsentoICM = CASE WHEN ValorIsentoICM <> 0 AND ValorBaseICM = 0
                                THEN ValorIsentoICM + :Diferenca
                                ELSE ValorISentoICM END,
          ValorOutrasICM = CASE WHEN ValorOutrasICM <> 0 AND ValorBaseICM = 0
                                THEN ValorOutrasICM + :Diferenca
                                ELSE ValorOutrasICM END
        WHERE Empresa = :Empresa
          AND TipoControle = :TipoControle
          AND CodControle = :CodControle
          AND NumLancamento = :NumLancamento
          AND SeqTemporaria = :SeqTemporaria;
      END
    END
    ELSE
    BEGIN
      SELECT FIRST 1 NumLancamento, SeqTemporaria, NumSequencia
      FROM TempPrce050Componentes
      WHERE Empresa = :Empresa
        AND TipoControle = :TipoControle
        AND CodControle = :CodControle
--MARCELO - CHAMADO 195091
        AND CASE WHEN :FlagTipoDiferenca = 1 AND CodProduto <> 8888888 THEN 1
                 WHEN :FlagTipoDiferenca = 2 AND CodProduto = 8888888  THEN 1
                 ELSE 0
            END = 1
        AND Status <> 'E'
        AND (ValorBaseICM > 0 OR ValorIsentoICM > 0 OR ValorOutrasICM > 0)
      ORDER BY SeqTemporaria, NumLancamento, NumSequencia
      INTO :NumLancamento, :SeqTemporaria, :NumSequenciaComp;

      IF (NumLancamento IS NOT NULL) THEN
      BEGIN
--MARCELO - CHAMADO 195091
        UPDATE TempPrce050Componentes SET
          ValorBaseICM = CASE WHEN ValorBaseICM <> 0
                              THEN ValorBaseICM + :Diferenca
                              ELSE ValorBaseICM END,
          ValorIsentoICM = CASE WHEN ValorIsentoICM <> 0 AND ValorBaseICM = 0
                                THEN ValorIsentoICM + :Diferenca
                                ELSE ValorISentoICM END,
          ValorOutrasICM = CASE WHEN ValorOutrasICM <> 0 AND ValorBaseICM = 0
                                THEN ValorOutrasICM + :Diferenca
                                ELSE ValorOutrasICM END
        WHERE Empresa = :Empresa
          AND TipoControle = :TipoControle
          AND CodControle = :CodControle
          AND NumLancamento = :NumLancamento
          AND SeqTemporaria = :SeqTemporaria
          AND NumSequencia = :numSequenciaComp;
      END
    END
  END

  Contador = Contador + 1;
END
    IF (FlagSelectBaseICM = 1) THEN
      ValorBaseICM = ValorBaseICM + (ValorContabilNota - (ValorBaseICM + ValorIsentoICM + ValorOutrasICM));
/*175203 e 192734*/
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE STORED_PRFT110GERANOTA (
    ped_sequencia INTEGER,
    empresa INTEGER,
    tipocontrole INTEGER,
    codcontrole INTEGER,
    contadornota INTEGER)
AS
DECLARE VARIABLE somaicmprodutos NUMERIC(11,2);
DECLARE VARIABLE somaicmservicos NUMERIC(11,2);
DECLARE VARIABLE somacontabilnotaprodutos NUMERIC(11,2);
DECLARE VARIABLE somacontabilnotaservicos NUMERIC(11,2);
DECLARE VARIABLE compsomaicmprodutos NUMERIC(11,2);
DECLARE VARIABLE compsomaicmservicos NUMERIC(11,2);
DECLARE VARIABLE flagentrada INTEGER;
DECLARE VARIABLE codoperacao INTEGER;
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE auxtipoitem INTEGER;
DECLARE VARIABLE auxnumsequencia INTEGER;
DECLARE VARIABLE auxempresa INTEGER;
DECLARE VARIABLE auxnumlancamento INTEGER;
DECLARE VARIABLE auxcodproduto INTEGER;
DECLARE VARIABLE auxaliqicm NUMERIC(4,2);
DECLARE VARIABLE auxbaseicm NUMERIC(11,2);
DECLARE VARIABLE auxvaloricm NUMERIC(11,2);
DECLARE VARIABLE auxvalorisentoicm NUMERIC(11,2);
DECLARE VARIABLE auxvaloroutrasicm NUMERIC(11,2);
DECLARE VARIABLE auxperreducaoicm NUMERIC(11,2);
DECLARE VARIABLE auxbasesubtrib NUMERIC(11,2);
DECLARE VARIABLE auxvalorsubtrib NUMERIC(11,2);
DECLARE VARIABLE auxbasesubtribcarga NUMERIC(11,2);
DECLARE VARIABLE auxvalorsubtribcarga NUMERIC(11,2);
DECLARE VARIABLE auxacrescimobaseicm NUMERIC(13,4);
DECLARE VARIABLE auxacrescimobasesubtrib NUMERIC(11,2);
DECLARE VARIABLE auxacrescimoredvenda NUMERIC(11,2);
DECLARE VARIABLE auxperreddespesa NUMERIC(15,8);
DECLARE VARIABLE auxfatorredcusto NUMERIC(15,8);
DECLARE VARIABLE auxfatorredvenda NUMERIC(7,4);
DECLARE VARIABLE auxcodtributacao CHAR(5);
DECLARE VARIABLE auxcodentidade CHAR(7);
DECLARE VARIABLE auxcodclassfiscal VARCHAR(15);
DECLARE VARIABLE auxvalortotal NUMERIC(11,2);
DECLARE VARIABLE auxaliqipi NUMERIC(4,2);
DECLARE VARIABLE auxnumcfop CHAR(10);
DECLARE VARIABLE auxcodlistapreco INTEGER;
DECLARE VARIABLE auxvalorcustofor NUMERIC(13,4);
DECLARE VARIABLE auxquantatendida NUMERIC(10,3);
DECLARE VARIABLE valorprodutostotal NUMERIC(11,2);
DECLARE VARIABLE valorservicostotal NUMERIC(11,2);
DECLARE VARIABLE valorprodutosnota NUMERIC(11,2);
DECLARE VARIABLE valorservicosnota NUMERIC(11,2);
DECLARE VARIABLE valordesconto NUMERIC(11,2);
DECLARE VARIABLE valordescontoservicos NUMERIC(11,2);
DECLARE VARIABLE valorfrete NUMERIC(11,2);
DECLARE VARIABLE valorseguro NUMERIC(11,2);
DECLARE VARIABLE valordespesas NUMERIC(11,2);
DECLARE VARIABLE valortotalretencoes NUMERIC(11,2);
DECLARE VARIABLE valortotalretencoesiss NUMERIC(11,2);
DECLARE VARIABLE valortotalretencoesicm NUMERIC(11,2);
DECLARE VARIABLE valorcomplementar NUMERIC(11,2);
DECLARE VARIABLE sumvalorprodutos NUMERIC(11,2);
DECLARE VARIABLE sumvalorbaseicm NUMERIC(11,2);
DECLARE VARIABLE sumvaloripi NUMERIC(11,2);
DECLARE VARIABLE sumvaloricm NUMERIC(11,2);
DECLARE VARIABLE sumvalorsubtrib NUMERIC(11,2);
DECLARE VARIABLE sumvalorbasesubtrib NUMERIC(11,2);
DECLARE VARIABLE sumvalorsubtribcarga NUMERIC(11,2);
DECLARE VARIABLE sumvalorbasesubtribcarga NUMERIC(11,2);
DECLARE VARIABLE sumvalorservicos NUMERIC(11,2);
DECLARE VARIABLE sumvalordesconto NUMERIC(11,2);
DECLARE VARIABLE sumvalordescontoservicos NUMERIC(11,2);
DECLARE VARIABLE sumvalorfrete NUMERIC(11,2);
DECLARE VARIABLE sumvalorseguro NUMERIC(11,2);
DECLARE VARIABLE sumvalordespesas NUMERIC(11,2);
DECLARE VARIABLE sumvalordespesasnaoinc NUMERIC(11,2);
DECLARE VARIABLE sumvalorfretetransp NUMERIC(11,2);
DECLARE VARIABLE sumvalorbaseiss NUMERIC(11,2);
DECLARE VARIABLE sumvalorprodutossemimpostos NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorprodutos NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorbaseicm NUMERIC(11,2);
DECLARE VARIABLE auxsumvaloripi NUMERIC(11,2);
DECLARE VARIABLE auxsumvaloricm NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorsubtrib NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorbasesubtrib NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorsubtribcarga NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorbasesubtribcarga NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorservicos NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorbaseiss NUMERIC(11,2);
DECLARE VARIABLE auxsumvalorprodutossemimpostos NUMERIC(11,2);
DECLARE VARIABLE valordespesasnaoinc NUMERIC(11,2);
DECLARE VARIABLE valorfretetransp NUMERIC(11,2);
DECLARE VARIABLE sumvalortotalretencoes NUMERIC(11,2);
DECLARE VARIABLE sumvalorcomplementar NUMERIC(11,2);
DECLARE VARIABLE flagsubtribdespesas INTEGER;
DECLARE VARIABLE codsubtributaria INTEGER;
DECLARE VARIABLE subflagsomadespesas INTEGER;
DECLARE VARIABLE flagdespesasipi INTEGER;
DECLARE VARIABLE diferenca NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferenca SMALLINT;
DECLARE VARIABLE diferencaproduto NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferencaproduto SMALLINT;
DECLARE VARIABLE diferencaservico NUMERIC(11,2);
DECLARE VARIABLE flagtipodiferencaservico SMALLINT;
DECLARE VARIABLE contador SMALLINT;
DECLARE VARIABLE valorbasepiscofins NUMERIC(11,2);
DECLARE VARIABLE aliqpis NUMERIC(4,2);
DECLARE VARIABLE aliqcofins NUMERIC(4,2);
DECLARE VARIABLE auxvalorunitario NUMERIC(13,4);
DECLARE VARIABLE numcsticm VARCHAR(3);
DECLARE VARIABLE numcstipi VARCHAR(2);
DECLARE VARIABLE numcstpiscofins VARCHAR(2);
DECLARE VARIABLE numcsosn VARCHAR(3);
DECLARE VARIABLE flagdeduzirdespnaoinclnamargem SMALLINT;
DECLARE VARIABLE valordescontoaux NUMERIC(11,2);
DECLARE VARIABLE partiporeducaoicm INTEGER;
DECLARE VARIABLE maioraliqipi NUMERIC(4,2);
DECLARE VARIABLE valorprodutostributados NUMERIC(11,2);
DECLARE VARIABLE proporcaovalorprodutostributados NUMERIC(18,6);
DECLARE VARIABLE natreceitapiscofins INTEGER;
DECLARE VARIABLE natbasecalccredito SMALLINT;
DECLARE VARIABLE auxacrescimobaseipi NUMERIC(11,2);
DECLARE VARIABLE auxvalorbaseipi NUMERIC(11,2);
DECLARE VARIABLE auxvalorisentoipi NUMERIC(11,2);
DECLARE VARIABLE auxvaloroutrasipi NUMERIC(11,2);
DECLARE VARIABLE aliqicmsst NUMERIC(5,2);
DECLARE VARIABLE percmvaicmsst NUMERIC(5,2);
DECLARE VARIABLE oprtipoipi INTEGER;

--Renato - 361650 
DECLARE VARIABLE AliqComplICM    NUMERIC(5,2);
DECLARE VARIABLE AliqComplPIS    NUMERIC(5,2);
DECLARE VARIABLE AliqComplCOFINS NUMERIC(5,2);

BEGIN
/**********************  
VERSÃO 3.00
**********************/  
--MARCELO - CHAMADO 195051
--SomaBaseSubTribCarga=0;
--SomaSubTribCarga=0;

--Renato - 278440   
SELECT FlagDeduzirDespNaoInclNaMargem
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem;

--Renato - 278440  
SELECT TipoReducaoICM
FROM ParamControle WHERE Empresa = :Empresa
INTO :ParTipoReducaoICM;

IF (TipoControle=1) THEN
BEGIN
  FlagEntrada = 1;
END
ELSE
  FlagEntrada = 0;

SELECT Oper.FlagSubTribDespesas
  FROM NotasFiscais Nota          
  LEFT JOIN Operacoes Oper ON Oper.Codigo = Nota.CodOperacao          
WHERE Nota.Empresa = :Empresa
  AND Nota.TipoControle = :TipoControle
  AND Nota.CodControle = :CodControle
INTO :FlagSubTribDespesas;
IF (FlagSubTribDespesas IS NULL) THEN
  FlagSubTribDespesas = 0;

SELECT COALESCE(SUM(Ped.ValorProdutos),0), COALESCE(SUM(Ped.ValorServicos),0), COALESCE(SUM(Ped.ValorDesconto),0), COALESCE(SUM(Ped.ValorDescontoServicos),0),
       COALESCE(SUM(Ped.ValorFrete),0), COALESCE(SUM(Ped.ValorSeguro),0), COALESCE(SUM(Ped.ValorDespesas),0),
       COALESCE(SUM(Ped.ValorDespesasNaoInc),0), COALESCE(SUM(Ped.ValorFreteTransp),0),
       --327726
       --coalesce(sum(Ped.ValorTotalRetencoes),0), coalesce(sum(Ped.VAlorComplementar),0)
       COALESCE(SUM(Ped.VAlorComplementar),0)
  FROM TempPrft110Pedido Temp, Pedidos Ped
 WHERE Temp.NumSequencia = :Ped_Sequencia
   AND Ped.Empresa = Temp.Empresa
   AND Ped.CodPedido = Temp.CodPedido
 INTO :ValorProdutosTotal, :ValorServicosTotal,:ValorDesconto, :ValorDescontoServicos,
      :ValorFrete, :ValorSeguro, :ValorDespesas,
      :ValorDespesasNaoInc, :ValorFreteTransp,
      --327726
      --:ValorTotalRetencoes, :ValorComplementar;
      :ValorComplementar;


  
--327726   
  SELECT                    
   COALESCE(SUM( CASE WHEN PR.TipoRetencao IN(0,1,2,3,4)
                      THEN PR.ValorRetencao END ),0),
         
   COALESCE(SUM(CASE WHEN PR.TipoRetencao = 5
                     THEN PR.ValorRetencao END),0),
                                   
   COALESCE(SUM(CASE WHEN PR.TipoRetencao = 6
                                           THEN PR.ValorRetencao END ),0)                                   
                                          
  FROM TempPrft110Pedido T  
  LEFT JOIN Pedidos P ON  P.Empresa   =T.Empresa  
                      AND P.CodPedido = T.CodPedido  
  LEFT JOIN PedidosRetencao PR ON  PR.Empresa   = T.Empresa  
                               AND PR.CodPedido = T.CodPedido                                                    
 WHERE T.NumSequencia = :Ped_Sequencia
 INTO :ValorTotalRetencoes,:valortotalretencoesiss,
      :valortotalretencoesicm;






--Gabriella - 333391
AuxAcrescimoBaseIPI = 0;
/*
ValorIPIDespesas = 0;
--Rafael chamado 281202
--Select Rs_RoundDec((coalesce(Max(M.AliqIPI),0) * (:ValorFrete + :ValorSeguro + :ValorDespesas)) /100.00,2)
Select
coalesce(Sum(Case When M.AliqIpi <> 0 then M.ValorTotal  end),0),
coalesce(Max(M.AliqIPI),0)
from MovEstoque M
Left Join Operacoes O on O.Codigo = M.CodOperacao  
where M.Empresa = :Empresa
  and M.TipoControle = :TipoControle
  and M.CodControle = :CodControle
  and M.CodProduto <> 8888888    
  --MARCELO - CHAMADO 187905
  and M.QuantAtendida > 0
  and O.FlagDespesasIPI = 1    
--Rafael chamado 281202
--Into :ValorIPIDespesas;
into valorprodutostributados,maioraliqipi ;


--Rafael chamado 281202
  if (ValorProdutosTotal > 0 ) then
  begin
    proporcaovalorprodutostributados = ValorProdutosTributados / ValorProdutosTotal;
    ValorIPIDespesas =  rs_rounddec( proporcaovalorprodutostributados * (ValorFrete + ValorSeguro + ValorDespesas) * (maioraliqipi / 100.00) ,2);
  end
  else
    ValorIPIDespesas = 0;
  
  
If (ValorIPIDespesas is null) then
  ValorIPIDespesas = 0;    */


/*-- Atualizacao o Icm dos itens da Nota Fiscal*/
FOR
/*     --Itens da nota fiscal, não carrega os itens que são "pai" dos componentes*/
     SELECT CAST(0 AS INTEGER) AS TipoItem, CAST(Mov.NumLancamento AS INTEGER), CAST(0 AS INTEGER) AS NumSequencia,
            CAST(Mov.CodProduto AS INTEGER), CAST(Mov.CodTributacao AS VARCHAR(10)), CAST(Mov.CodEntidade AS CHAR(7)),
            CAST(Mov.ValorTotal AS NUMERIC (11,2)) , CAST(Mov.AliqIPI AS NUMERIC(5,2)), CAST(Mov.CodClassFiscal AS VARCHAR(20)),
            CAST(Mov.CodOperacao AS INTEGER), CAST(Mov.CodListaPreco AS INTEGER),
            CAST(Oper.FlagDespesasIPI AS INTEGER), CAST(Mov.CodSubTributaria AS INTEGER), CAST(Sub.FlagSomaDespesas AS INTEGER),
            CAST(Mov.ValorCustoFor AS NUMERIC(13,4)), CAST(Mov.QuantAtendida AS NUMERIC(10,3)),
            --Renato - 278440
            CAST(Mov.ValorUnitario AS NUMERIC(13,4)),
            --Gabriella - 360317
            CAST(Oper.TipoIPI AS INTEGER)

      FROM MovEstoque Mov
      LEFT JOIN Operacoes Oper ON Oper.Codigo = Mov.CodOperacao
      LEFT JOIN SubstituicaoTributaria Sub ON Sub.CodSubTributaria = Mov.CodSubTributaria
                                          AND Sub.Empresa = Mov.Empresa
      WHERE Mov.Empresa      = :Empresa
        AND Mov.TipoControle = :TipoControle
        AND Mov.CodControle  = :CodControle

     UNION ALL

     /*--Componentes da nota fiscal*/
     SELECT CAST(1 AS INTEGER) AS TipoItem, CAST(Comp.NumLancamento AS INTEGER), CAST(Comp.NumSequencia AS INTEGER) AS NumSequencia,
            CAST(Comp.CodProduto AS INTEGER), CAST(Comp.CodTributacao AS VARCHAR(10)), CAST(Mov.CodEntidade AS CHAR(7)),
            CAST(Comp.ValorTotal AS NUMERIC (11,2)) , CAST(Comp.AliqIPI AS NUMERIC(5,2)), CAST(Comp.CodClassFiscal AS VARCHAR(20)),
            CAST(Mov.CodOperacao AS INTEGER), CAST(Comp.CodListaPreco AS INTEGER),
            CAST(0 AS INTEGER), CAST(Comp.CodSubTributaria AS INTEGER), CAST(Sub.FlagSomaDespesas AS INTEGER),
            CAST(Comp.ValorCustoFor AS NUMERIC(13,4)), CAST(Comp.QuantAtendida AS NUMERIC(10,3)),
            --Renato - 278440
            CAST(Comp.ValorUnitario AS NUMERIC(13,4)),
            --Gabriella - 360317
            CAST(0 AS INTEGER)

     FROM MovComponente Comp
     LEFT JOIN MovEstoque Mov ON Mov.Empresa = Comp.Empresa
                             AND Mov.NumLancamento = Comp.NumLancamento
     LEFT JOIN SubstituicaoTributaria Sub ON Sub.CodSubTributaria = Comp.CodSubTributaria                
                                         AND Sub.Empresa = Comp.Empresa                
     WHERE Comp.Empresa      = :Empresa
       AND Comp.TipoControle = :TipoControle
       AND Comp.CodControle  = :CodControle

     INTO :AuxTipoItem, AuxNumLancamento, :AuxNumSequencia,
          :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
          :AuxValorTotal, :AuxAliqIPI, :AuxCodClassFiscal,
          :CodOperacao, :AuxCodListaPreco,
          :FlagDespesasIPI, :CodSubTributaria, :SubFlagSomaDespesas,
          :AuxValorCustoFor, :AuxQuantAtendida,
          --Renato - 278440
          :AuxValorUnitario,
          --Gabriella - 360317
          :OprTipoIPI
DO
BEGIN

   AuxAcrescimoBaseICM = 0;
   AuxAcrescimoBaseSubTrib = 0;
   AuxAcrescimoRedVenda = 0;

   --Renato - 278440
   --AuxAcrescimoRedCusto = 0;
   AuxperRedDespesa = 0;

   --Renato - 278440
   --Eder - Chamado 170325
   --Calcula o percentual de acrescimo no custo
   --If ((AuxValorCustoFor > 0) and (ValorDespesasNaoInc > 0) and ((ValorProdutosTotal + ValorServicosTotal) > 0) and (AuxQuantAtendida > 0)) then
   --begin
   --  AuxAcrescimoRedCusto = ((ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   --end
   IF ((FlagDeduzirDespNaoInclNaMargem = 1) AND (ParTipoReducaoICM <> 2)) THEN
     ValorDescontoAux = ValorDesconto;
   ELSE
     ValorDescontoAux = 0;

   /* 298865
   If ((AuxValorUnitario > 0) and ( (ValorDespesasNaoInc > 0) or (ValorDescontoAux > 0) ) and ((ValorProdutosTotal + ValorServicosTotal) > 0)  and (AuxQuantAtendida > 0)) then
   begin
     AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;
   end
   */
   IF ( ((ValorDespesasNaoInc > 0) OR (ValorDescontoAux > 0)) AND ((ValorProdutosTotal + ValorServicosTotal) > 0)  AND (AuxQuantAtendida > 0)) THEN
   BEGIN
     IF ((FlagDeduzirDespNaoInclNaMargem = 1) AND (AuxValorUnitario > 0)) THEN
       AuxPerRedDespesa = (( (ValorDespesasNaoInc + ValorDescontoAux) * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorUnitario;

     ELSE IF ((FlagDeduzirDespNaoInclNaMargem = 0) AND (AuxValorCustoFor > 0)) THEN
       AuxPerRedDespesa = (( ValorDespesasNaoInc * (AuxValorTotal / (ValorProdutosTotal + ValorServicosTotal))) / AuxQuantAtendida) / AuxValorCustoFor;
   END

   IF ((AuxCodProduto <> 8888888) AND (ValorProdutosTotal > 0)) THEN
   BEGIN
     --Gabriella - 333391
     IF ((FlagDespesasIPI = 1) AND (AuxAliqIPI > 0)) THEN
       AuxAcrescimoBaseIPI = CAST(AuxValorTotal AS NUMERIC(18,9)) / ValorProdutosTotal * (ValorFrete + ValorSeguro + ValorDespesas);
     --Gabriella - 360317
     ELSE IF ((AuxAliqIPI = 0) AND (OprTipoIPI = 0)) THEN
       AuxAcrescimoBaseIPI = CAST(AuxValorTotal AS NUMERIC(18,9)) / ValorProdutosTotal * (0 - ValorDesconto);
     ELSE
       AuxAcrescimoBaseIPI = 0;
                                                                                                                                                                    
     IF (AuxAcrescimoBaseIPI IS NULL) THEN
       AuxAcrescimoBaseIPI = 0;

      AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDesconto)
                                        * (CAST(AuxValorTotal AS NUMERIC(18,9)) / ValorProdutosTotal);

      AuxAcrescimoBaseSubTrib = 0;
      IF (((FlagSubTribDespesas = 1) AND (CodSubTributaria = 0)) OR
          ((SubFlagSomaDespesas = 1) AND (CodSubTributaria > 0))) THEN
         AuxAcrescimoBaseSubTrib = ValorFrete + ValorSeguro + ValorDespesas;
      --Gabriella - 298263
      IF ((FlagDespesasIPI = 1) AND (AuxAliqIPI > 0)) THEN
      BEGIN
         --Gabriella - 333391
         --AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ValorIPIDespesas;
         AuxAcrescimoBaseSubTrib = AuxAcrescimoBaseSubTrib + ((AuxAcrescimoBaseIPI * auxaliqipi) / 100);
--       Eder - Chamado 174565
--       ValorIPIDespesas = 0;
      END
      AuxAcrescimoBaseSubTrib = (AuxAcrescimoBaseSubTrib - ValorDesconto) * (AuxValorTotal / ValorProdutosTotal);

      AuxAcrescimoRedVenda = ValorDespesasNaoInc + ValorDesconto;
      IF ((ValorFrete > 0) AND (ValorFreteTransp > 0)) THEN
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + (ValorFreteTransp - ValorFrete);
      ELSE
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + ValorFreteTransp;
      AuxAcrescimoRedVenda = AuxAcrescimoRedVenda * (AuxValorTotal / ValorProdutosTotal);
   END
   IF ((AuxCodProduto = 8888888) AND (ValorServicosTotal > 0) AND (AuxValorTotal > 0)) THEN
   BEGIN
     IF (ValorProdutosTotal > 0) THEN
        AuxAcrescimoBaseICM = (ValorDescontoServicos * -1) * (AuxValorTotal / ValorServicosTotal);
     ELSE
        AuxAcrescimoBaseICM = (ValorFrete + ValorSeguro + ValorDespesas - ValorDescontoServicos) * (AuxValorTotal / ValorServicosTotal);

     AuxAcrescimoBaseSubTrib = 0;
     AuxAcrescimoRedVenda = 0;
   END

   SELECT AliqICM, ValorBaseICM, ValorICM,
         ValorIsentoICM, ValorOutrasICM, PerReducaoICM, ValorBaseSubTrib,
         ValorSubTrib, FatorRedCusto, FatorRedVenda, NumCFOP,
         ValorBaseSubTribCarga, ValorSubTribCarga,
         -- Renato - Chamado 272165
         ValorBasePisCofins, AliqPis, AliqCofins,
         --Eder - Chamado 284639
         NumCstICM, NumCstIPI, NumCstPisCofins, NumCsosn,
         -- Renato - 297792
         NatReceitaPisCofins,
         -- Renato - 332318
         NatBaseCalcCredito,
         --Gabriella - 333391
         ValorBaseIPI,
         ValorIsentoIPI,
         ValorOutrasIPI,
         --Renato - 360358
         AliqICMSST,
         PercMvaICMSST,
         --Renato - 361650
         AliqComplICM,
         AliqComplPIS,
         AliqComplCOFINS
    FROM Calcular_ICM(:Empresa, :AuxCodProduto, :AuxCodTributacao, :AuxCodEntidade,
                      :CodOperacao, :AuxValorTotal, :AuxAcrescimoBaseICM, :AuxAcrescimoBaseSubTrib, 0,
                      :AuxAliqIPI, :AuxCodClassFiscal, :FlagEntrada, :AuxAcrescimoRedVenda,
                      :AuxCodListaPreco,0,:CodSubTributaria, :AuxPerRedDespesa, :auxacrescimobaseipi)
    INTO :AuxAliqICM, :AuxBaseICM, :AuxValorICM,
         :AuxValorIsentoICM, :AuxValorOutrasICM, :AuxPerReducaoICM, :AuxBaseSubTrib,
         :AuxValorSubTrib, :AuxFatorRedCusto, :AuxFatorRedVenda, :AuxNumCFOP,
         :AuxBaseSubTribCarga, :AuxValorSubTribCarga,
         -- Renato - Chamado 272165
         :ValorBasePisCofins, :AliqPis, :AliqCofins,
         :NumCstICM, :NumCstIPI, :NumCstPisCofins, :NumCsosn,
         -- Renato - 297792
         :NatReceitaPisCofins,
         -- Renato - 332318
         :NatBaseCalcCredito,
         --Gabriella - 333391
         :AuxValorBaseIPI,
         :AuxValorIsentoIPI,
         :AuxValorOutrasIPI,
         --Renato - 360358
         :AliqICMSST,
         :PercMvaICMSST,
         --Renato - 361650
         :AliqComplICM,
         :AliqComplPIS,
         :AliqComplCOFINS;

   IF (AuxTipoItem = 0) THEN
   BEGIN
     UPDATE MovEstoque
        SET AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            StatusTransacao=1
      WHERE Empresa=:Empresa
        AND NumLancamento=:AuxNumLancamento;

      --Eder - Chamado 284639
      UPDATE MovEstoqueImposto
         SET PerReducaoICM = :AuxPerReducaoICM,
             NumCstICM = :NumCstICM,
             NumCstIPI = :NumCstIPI,
             NumCstPisCofins = :NumCstPisCofins,
             NumCsosn = :NumCsosn,
             --Renato - 297792
             NatReceitaPisCofins = :NatReceitaPisCofins,
             --Renato - 332318
             NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,
             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
             --Renato - 361650
             AliqComplICM    = :AliqComplICM,
             AliqComplPIS    = :AliqComplPIS,
             AliqComplCOFINS = :AliqComplCOFINS,
         
             --Rafael chamado 306960
             StatusTransacao = 1

       WHERE Empresa=:Empresa
         AND NumLancamento=:AuxNumLancamento;

      IF (ROW_COUNT  = 0) THEN
      BEGIN
         INSERT INTO MovEstoqueImposto(Empresa, NumLancamento, PerReducaoICM, NumCstICm, NumCstIPI, NumCstPisCofins, NumCsosn, NatReceitaPisCofins,
                                       --Gabriella - 333391
                                       ValorBaseIPI,
                                       ValorIsentoIPI,
                                       ValorOutrasIPI,
                                       --Renato - 360358
                                       AliqICMSST,
                                       PercMvaICMSST,
                                       --Renato - 361650
                                       AliqComplICM,
                                       AliqComplPIS,
                                       AliqComplCOFINS,
                                       StatusTransacao)
                     VALUES (:Empresa, :AuxNumLancamento, :AuxPerReducaoICM, :NumCstICm, :NumCstIPI, :NumCstPisCofins, :NumCsosn, :NatReceitaPisCofins,
                             --Gabriella - 333391
                             :AuxValorBaseIPI,
                             :AuxValorIsentoIPI,
                             :AuxValorOutrasIPI,
                             --Renato - 360358
                             :AliqICMSST,
                             :PercMvaICMSST,
                             --Renato - 361650 
                             :AliqComplICM,
                             :AliqComplPIS,
                             :AliqComplCOFINS,
                             1);
      END
   END
   ELSE
   BEGIN
     UPDATE MovComponente
        SET AliqICM=:AuxAliqICM,
            ValorBaseICM=:AuxBaseICM,
            ValorIsentoICM=:AuxValorIsentoICM,
            ValorOutrasICM=:AuxValorOutrasICM,
            ValorBaseSubTrib=:AuxBaseSubTrib,
            ValorSubTrib=:AuxValorSubTrib,
--MARCELO - CHAMADO 195051
            ValorBaseSubTribCarga = :AuxBaseSubTribCarga,
            ValorSubTribCarga = :AuxValorSubTribCarga,
            NumCFOP=:AuxNumCFOP,
            FatorRedCusto=:AuxFatorRedCusto,
            FatorRedVenda=:AuxFatorRedVenda,
            -- Renato - Chamado 272165
            ValorBasePisCofins = :ValorBasePisCofins,
            AliqPis = :AliqPis,
            AliqCofins = :AliqCofins,
            --Eder - Chamado 284639
            PerReducaoICM = :AuxPerReducaoICM,
            NumCstICM = :NumCstICM,
            NumCstIPI = :NumCstIPI,
            NumCstPisCofins = :NumCstPisCofins,
            NumCsosn = :NumCsosn,
            --Renato - 297792
            NatReceitaPisCofins = :NatReceitaPisCofins,
            --Renato - 332318
            NatBaseCalcCredito = :NatBaseCalcCredito,
             --Gabriella - 333391       
             ValorBaseIPI = :AuxValorBaseIPI,
             ValorIsentoIPI = :AuxValorIsentoIPI,
             ValorOutrasIPI = :AuxValorOutrasIPI,

             --Renato - 360358
             AliqICMSST = :AliqICMSST,
             PercMvaICMSST = :PercMvaICMSST,
             --Renato - 361650
             AliqComplICM    = :AliqComplICM,
             AliqComplPIS    = :AliqComplPIS,
             AliqComplCOFINS = :AliqComplCOFINS,
         
            StatusTransacao=1
      WHERE Empresa=:Empresa
        AND NumLancamento=:AuxNumLancamento
        AND NumSequencia=:AuxNumSequencia;
   END

--MARCELO - CHAMADO 195051
--   SomaBaseSubTribCarga = SomaBaseSubTribCarga + AuxBaseSubTribCarga;
--   SomaSubTribCarga = SomaSubTribCarga + AuxValorSubTribCarga;

END


/*--Acumula as variaveis de total da nota fiscal e dos componentes*/
SumValorProdutos = 0;
SumValorBaseICM = 0;
SumValorIPI = 0;
SumValorICM = 0;
SumValorSubTrib = 0;
SumValorBaseSubTrib = 0;
--MARCELO - CHAMADO 195051
SumValorSubTribCarga = 0;
SumValorBaseSubTribCarga = 0;
SumValorServicos = 0;
SumValorBaseISS = 0;
SumValorProdutosSemImpostos = 0;

FOR
    SELECT 
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorTotal ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorBaseICM ELSE 0 END) AS NUMERIC(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Mov.CodProduto <> 8888888
                         then Rs_roundDec(Mov.ValorTotal * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         Else 0 End) as numeric(15,2)),*/
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888                   
                         THEN Rs_roundDec((MI.ValorBaseIPI + MI.ValorIsentoIPI + MI.ValorOutrasIPI)
                                            * (((100 + Mov.AliqIPI) / 100.00) - 1),2)
                         ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888                   
                         THEN rs_roundDec(Mov.ValorBaseICM * (((100 + Mov.AliqICM) / 100.00) - 1),2)
                         ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorSubTrib ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorBaseSubTrib ELSE 0 END) AS NUMERIC(15,2)),
--MARCELO - CHAMADO 195051
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorSubTribCarga ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888 THEN Mov.ValorBaseSubTribCarga ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto = 8888888 THEN Mov.ValorTotal ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto = 8888888 AND Ser.FlagCalcularISS = 1
                         THEN Mov.ValorBaseICM + Mov.ValorOutrasICM ELSE 0 END) AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Mov.CodProduto <> 8888888                   
                         THEN rs_RoundDec(Mov.ValorTotal * Mov.FatorRedVenda,2) ELSE 0 END)  AS NUMERIC(15,2))
      FROM MovEstoque Mov                  
      LEFT JOIN Servicos Ser ON Ser.codigo = Mov.CodServico
      --Gabriella - 333391
      LEFT JOIN MovEstoqueImposto MI ON MI.Empresa = Mov.Empresa
                                    AND MI.NumLancamento = Mov.NumLancamento                       
      WHERE Mov.Empresa = :Empresa
        AND Mov.TipoControle = :TipoControle
        AND Mov.CodControle = :CodControle
        AND NOT EXISTS(SELECT * FROM MovComponente Comp
                        WHERE Comp.Empresa = Mov.Empresa
                          AND Comp.NumLancamento = Mov.NumLancamento)
    UNION ALL
    SELECT 
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorTotal ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorBaseICM ELSE 0 END)  AS NUMERIC(15,2)),
           --Gabriella - 333391
           /*Cast(Sum(Case When Comp.CodProduto <> 8888888
                         then Rs_roundDec(Comp.ValorTotal * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         Else 0 End)  as numeric(15,2)),*/
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888
                         THEN Rs_roundDec((Comp.ValorBaseIPI + Comp.ValorIsentoIPI + Comp.ValorOutrasIPI)
                                            * (((100 + Comp.AliqIPI) / 100.00) - 1),2)
                         ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888                   
                         THEN Rs_roundDec(Comp.ValorBaseICM * (((100 + Comp.AliqICM) / 100.00) - 1),2)
                         ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorSubTrib ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorBaseSubTrib ELSE 0 END)  AS NUMERIC(15,2)),
--MARCELO - CHAMADO 195051
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorSubTribCarga ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888 THEN Comp.ValorBaseSubTribCarga ELSE 0 END)  AS NUMERIC(15,2)),
           CAST(0  AS NUMERIC(15,2)),
           CAST(0  AS NUMERIC(15,2)),
           CAST(SUM(CASE WHEN Comp.CodProduto <> 8888888
                        THEN Rs_roundDec(Comp.ValorTotal * Comp.FatorRedVenda,2) ELSE 0 END) AS NUMERIC(15,2))
      FROM MovComponente Comp
      WHERE Comp.Empresa = :Empresa
        AND Comp.TipoControle = :TipoControle
        AND Comp.CodControle = :CodControle
     INTO :AuxSumValorProdutos, :AuxSumValorBaseICM, :AuxSumValorIPI,
          :AuxSumValorICM,  :AuxSumValorSubTrib, :AuxSumValorBaseSubTrib,
--MARCELO - CHAMADO 195051
          :AuxSumValorSubTribCarga, :AuxSumValorBaseSubTribCarga, :AuxSumValorServicos,
          :AuxSumValorBaseISS, :AuxSumValorProdutosSemImpostos
DO
BEGIN
     IF (NOT (AuxSumValorProdutos IS NULL)) THEN
        SumValorProdutos = SumValorProdutos + AuxSumvalorProdutos;

     IF (NOT (AuxSumValorBaseICM IS NULL)) THEN
        SumValorBaseICM = SumValorBaseICM + AuxSumValorBaseICM;

     IF (NOT (AuxSumValorIPI IS NULL)) THEN
        SumValorIPI = SumValorIPI + AuxSumValorIPI;

     IF (NOT (AuxSumValorICM IS NULL)) THEN
        SumValorICM = SumValorICM + AuxSumValorICM;

     IF (NOT (AuxSumValorSubTrib IS NULL)) THEN
        SumValorSubTrib = SumValorSubTrib + AuxSumValorSubTrib;

     IF (NOT (AuxSumValorBaseSubTrib IS NULL)) THEN
        SumValorBaseSubTrib = SumValorBaseSubTrib + AuxSumValorBaseSubTrib;

--MARCELO - CHAMADO 195051
     IF (NOT (AuxSumValorSubTribCarga IS NULL)) THEN
        SumValorSubTribCarga = SumValorSubTribCarga + AuxSumValorSubTribCarga;

     IF (NOT (AuxSumValorBaseSubTribCarga IS NULL)) THEN
        SumValorBaseSubTribCarga = SumValorBaseSubTribCarga + AuxSumValorBaseSubTribCarga;

     IF (NOT (AuxSumValorServicos IS NULL)) THEN
        SumValorServicos = SumValorServicos + AuxSumValorServicos;

     IF (NOT (AuxSumValorBaseISS IS NULL)) THEN
        SumValorBaseISS = SumValorBaseISS + AuxSumValorBaseISS;

     IF (NOT (AuxSumValorProdutosSemImpostos IS NULL)) THEN
        SumValorProdutosSemImpostos = SumValorProdutosSemImpostos + AuxSumValorProdutosSemImpostos;
END

/*--Atualiza os Totais referentes a Produtos, somados a partir dos itens da nota fiscal*/
UPDATE NotasFiscais
   SET ValorProdutos    = rs_dnvl(:SumValorProdutos,0),
       ValorIPI         = rs_dnvl(:SumValorIPI,0),
       ValorBaseICM     = rs_dnvl(:SumValorBaseICM,0),
       ValorICM         = rs_dnvl(:SumValorICM,0),
       ValorSubTrib     = rs_dnvl(:SumValorSubTrib,0),
       ValorBaseSubTrib = rs_dnvl(:SumValorBaseSubTrib,0),
       ValorServicos    = rs_dnvl(:SumValorServicos,0),
--MARCELO - CHAMADO 195051
       ValorSubTribCarga     = rs_dnvl(:SumValorSubTribCarga, 0),
       ValorBaseSubTribCarga = rs_dnvl(:SumValorBaseSubTribCarga, 0),
       ValorProdutosSemImpostos = rs_dnvl(:SumValorProdutosSemImpostos, 0),
       StatusTransacao=1
 WHERE Empresa = :Empresa
   AND TipoControle = :TipoControle
   AND CodControle = :CodControle;

IF (ValorProdutosTotal > 0) THEN
BEGIN
   UPDATE NotasFiscais
      SET ValorDesconto         = rs_RoundDec(:ValorDesconto * (ValorProdutos / :ValorProdutosTotal),2),
--232570
--MARCELO - CHAMADO 195326                                                  
--          ValorDescontoServicos = Round(@ValorDescontoServicos * (ValorProdutos / @ValorProdutosTotal),2),                                                        
          ValorDescontoServicos = CASE WHEN ValorServicos > 0  
                                    THEN rs_Rounddec(:ValorDescontoServicos * (ValorProdutos / :ValorProdutosTotal),2)
                                       ELSE 0 END,                                                        
          ValorFrete            = rs_RoundDec(:ValorFrete * (ValorProdutos / :ValorProdutosTotal),2),
          ValorSeguro           = rs_RoundDec(:ValorSeguro * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesas         = rs_RoundDec(:ValorDespesas * (ValorProdutos / :ValorProdutosTotal),2),
          ValorDespesasNaoInc   = rs_RoundDec(:ValorDespesasNaoInc * (ValorProdutos / :ValorProdutosTotal),2),
          ValorFreteTransp      = rs_RoundDec(:ValorFreteTransp * (ValorProdutos / :ValorProdutosTotal),2),
          --327726
          --ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * (ValorProdutos / :ValorProdutosTotal),2),
          ValorTotalRetencoes   = rs_RoundDec(:ValorTotalRetencoes * ((ValorProdutos + valorservicos) / (:ValorProdutosTotal + :valorservicostotal ) ),2)+
                                 CASE WHEN  :valorservicostotal > 0
                                      THEN rs_RoundDec(:valortotalretencoesiss * (ValorServicos / :valorservicostotal),2) ELSE 0 END
                                + rs_RoundDec(:valortotalretencoesicm * (ValorProdutos / :ValorProdutosTotal),2),
          StatusTransacao       = 1
    WHERE Empresa = :Empresa
      AND TipoControle = :TipoControle
      AND CodControle = :CodControle;
END
ELSE
BEGIN
   UPDATE NotasFiscais
      SET ValorDesconto         = ValorDesconto + :ValorDesconto,
          ValorDescontoServicos = ValorDescontoServicos + :ValorDescontoServicos,
          ValorFrete            = ValorFrete + :ValorFrete,
          ValorSeguro           = ValorSeguro + :ValorSeguro,
          ValorDespesas         = ValorDespesas + :ValorDespesas,
          ValorDespesasNaoInc   = ValorDespesasNaoInc + :ValorDespesasNaoInc,
          ValorFreteTransp      = ValorFreteTransp + :ValorFreteTransp,
          ValorTotalRetencoes   = ValorTotalRetencoes + :ValorTotalRetencoes,
          StatusTransacao       = 1
    WHERE Empresa = :Empresa
      AND TipoControle = :TipoControle
      AND CodControle = :CodControle;
END





/*--verifica se está na ultima nota processada*/
SELECT (COUNT(*) - :ContadorNota) FROM TempPrft110Nota
 WHERE NumSequencia = :Ped_Sequencia
 INTO :Existe;

IF (Existe = 0) THEN  /*------Ultima Nota Processada*/
BEGIN
  SELECT SUM(ValorDesconto), SUM(ValorDescontoServicos), SUM(ValorFrete),
         SUM(ValorSeguro), SUM(ValorDespesas), SUM(ValorDespesasNaoInc),
         SUM(ValorFreteTransp), SUM(ValorTotalRetencoes), SUM(ValorComplementar)
    FROM TempPrft110Nota, NotasFiscais
   WHERE TempPrft110Nota.NumSequencia = :Ped_Sequencia
     AND TempPrft110Nota.Empresa = NotasFiscais.Empresa
     AND TempPrft110Nota.TipoControle = NotasFiscais.TipoControle
     AND TempPrft110Nota.CodControle = NotasFiscais.CodControle
   INTO :SumValorDesconto, :SumValorDescontoServicos, :SumValorFrete,
        :SumValorSeguro, :SumValorDespesas, :SumValorDespesasNaoInc,
        :SumValorFreteTransp, :SumValorTotalRetencoes, :SumValorComplementar;

  UPDATE NotasFiscais
     SET ValorDesconto = ValorDesconto + (:ValorDesconto - rs_dnvl(:SumValorDesconto,0)),
         ValorDescontoServicos  = ValorDescontoServicos + (:ValorDescontoServicos - rs_dnvl(:SumValorDescontoServicos,0)),
         ValorFrete  = ValorFrete + (:ValorFrete - rs_dnvl(:SumValorFrete,0)),
         ValorSeguro = ValorSeguro + (:ValorSeguro - rs_dnvl(:SumValorSeguro,0)),
         ValorDespesas = ValorDespesas + (:ValorDespesas - rs_dnvl(:SumValorDespesas,0)),
         ValorDespesasNaoInc = ValorDespesasNaoInc + (:ValorDespesasNaoInc - rs_dnvl(:SumValorDespesasNaoInc,0)),
         ValorFreteTransp = ValorFreteTransp + (:ValorFreteTransp - rs_dnvl(:SumValorFreteTransp,0)),
         --327726
         --ValorTotalRetencoes = ValorTotalRetencoes + (:ValorTotalRetencoes - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorTotalRetencoes = ValorTotalRetencoes + ((:ValorTotalRetencoes +:valortotalretencoesiss + :valortotalretencoesicm)
                                                   - rs_dnvl(:SumValorTotalRetencoes,0)),
         ValorComplementar  = ValorComplementar + (:ValorComplementar - rs_dnvl(:SumValorComplementar,0)),
         StatusTransacao=1
        WHERE Empresa = :Empresa
          AND TipoControle = :TipoControle
          AND CodControle = :CodControle;
END

/*--Calcula o ISS após terminar os rateios da nota*/
UPDATE NotasFiscais
   SET ValorISS = Rs_Rounddec((:SumValorBaseISS * AliqISS) / 100.00, 2),
       AliqISS  = CASE WHEN :SumValorBaseISS > 0 THEN AliqISS ELSE 0 END
   WHERE Empresa = :Empresa
     AND TipoControle = :TipoControle
     AND  CodControle = :CodControle;

--Gabriella - 361043
--Gabriella - 342854
--Se na NF houver ValorRetencao de ISS os Valores são Zerados
/*if (ValorTotalRetencoesISS > 0) then
begin
  Update NotasFiscais                                   
     Set ValorISS = 0,                                                                                              
         AliqISS  = 0                                                                                
     Where Empresa = :Empresa
       and TipoControle = :TipoControle
       and  CodControle = :CodControle;
end*/

/*select FlagDespesasIPI from Operacoes where Codigo = :CodOperacao
  into Existe;*/

/*if (Existe = 1) then
begin

  update NotasFiscais
   --Rafael chamado 281202
     --set ValorIPIDespesas =
         --rs_rounddec(((ValorFrete + ValorDespesas + ValorSeguro) *
          --      rs_dnvl(:AuxAliqIPI,0)) / 100.00, 2)

    set ValorIPIDespesas = :ValorIPIDespesas
   where Empresa = :Empresa
     and TipoControle = :TipoControle
     and CodControle = :CodControle;
end */


/*--Corrige eventuais diferenças de soma dos valores fiscais dos itens*/
AuxTipoItem = 0;

SomaICMProdutos     = 0;
SomaICMServicos     = 0;
CompSomaICMProdutos = 0;
CompSomaICMServicos = 0;
SomaContabilNotaProdutos = 0;
SomaContabilNotaServicos = 0;

SELECT
  SUM(CASE WHEN CodProduto <> 8888888
           THEN ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           ELSE 0 END),

  SUM(CASE WHEN CodProduto = 8888888
           THEN ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           ELSE 0 END)
  FROM MovEstoque                    
 WHERE Empresa      = :Empresa
   AND TipoControle = :TipoControle
   AND CodControle  = :CodControle
   AND NOT EXISTS(SELECT * FROM MovComponente Comp
                   WHERE Comp.Empresa = MovEstoque.Empresa  
                     AND Comp.NumLancamento = MovEstoque.NumLancamento)  

  INTO :SomaICMProdutos, :SomaICMServicos;

IF (SomaICMProdutos IS NULL) THEN
  SomaICMProdutos = 0;

IF (SomaICMServicos IS NULL) THEN
  SomaICMServicos = 0;


SELECT
  SUM(CASE WHEN CodProduto <> 8888888
           THEN ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           ELSE 0 END),

  SUM(CASE WHEN CodProduto = 8888888
           THEN ValorBaseICM + ValorIsentoICM + ValorOutrasICM
           ELSE 0 END)
  FROM MovComponente
 WHERE Empresa      = :Empresa
   AND TipoControle = :TipoControle
   AND CodControle  = :CodControle
  INTO :CompSomaICMProdutos, :CompSomaICMServicos;


IF (NOT (CompSomaICMProdutos IS NULL)) THEN
BEGIN
  SomaICMProdutos = SomaICMProdutos + CompSomaICMProdutos;
  AuxTipoItem     = 1;
END

IF (NOT (CompSomaICMServicos IS NULL)) THEN
BEGIN
  SomaICMServicos = SomaICMServicos + CompSomaICMServicos;
  AuxTipoItem     = 1;
END
                    
--JALDO - CHAMADO 245729
--Select Case When TipoPessoa = 'J' Then 1 Else 0 End From Entidades
-- Where Codigo = :AuxCodEntidade
-- Into :Existe;

--Gabriella - 256424
--JALDO - CHAMADO 248899
--Select Case When (((TipoConsideraIPICalculoICM = 0) and (TipoPessoa <> 'J')) or
--                 (TipoConsideraIPICalculoICM = 1))
--            Then 0 Else 1 End
--Select Case When TipoPessoa in ('J','I') Then 1 Else 0 End
SELECT CASE WHEN Ent.TipoPessoa IN ('J','I') AND Opr.flagipisobrebaseicm = 0 THEN 1 ELSE 0 END
FROM Entidades Ent
LEFT JOIN Operacoes Opr ON Opr.codigo = :codoperacao
 WHERE Ent.Codigo = :AuxCodEntidade
   INTO :Existe;

                    
IF (Existe = 1) THEN
BEGIN                    
  SELECT (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas),
         CASE WHEN (ValorProdutos = 0)
              THEN (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              ELSE (ValorServicos - ValorDescontoServicos)
         END
   FROM NotasFiscais                    
   WHERE Empresa = :Empresa
     AND TipoControle = :TipoControle
     AND CodControle = :CodControle
    INTO :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
END                    
ELSE                    
BEGIN                    
  SELECT (ValorProdutos - ValorDesconto + ValorFrete + ValorSeguro + ValorDespesas + ValorIPI),
         CASE WHEN (ValorProdutos = 0)
              THEN (ValorServicos - ValorDescontoServicos + ValorFrete + ValorSeguro + ValorDespesas)
              ELSE (ValorServicos - ValorDescontoServicos)
         END
   FROM NotasFiscais                    
   WHERE Empresa      = :Empresa
     AND TipoControle = :TipoControle
     AND CodControle  = :CodControle
    INTO :SomaContabilNotaProdutos, :SomaContabilNotaServicos;
END

Diferenca         = 0;
FlagTipoDiferenca = 0;
--MARCELO - CHAMADO 182639                 
DiferencaProduto         = 0;
FlagTipoDiferencaProduto = 0;
DiferencaServico         = 0;
FlagTipoDiferencaServico = 0;

--MARCELO - CHAMADO 182639
IF ((SomaContabilNotaProdutos <> 0) AND (SomaContabilNotaProdutos <> SomaICMProdutos)) THEN
BEGIN
--  Diferenca         = (:SomaContabilNotaProdutos - :SomaICMProdutos);
--  FlagTipoDiferenca = 1;
  DiferencaProduto = (:SomaContabilNotaProdutos - :SomaICMProdutos);
  FlagTipoDiferencaProduto = 1;
END
--else
--begin
IF (SomaICMServicos <> 0) THEN
BEGIN
  IF ((SomaContabilNotaServicos <> 0) AND (SomaContabilNotaServicos <> SomaICMServicos)) THEN
  BEGIN
--    Diferenca         = (:SomaContabilNotaServicos - :SomaICMServicos);
--    FlagTipoDiferenca = 2;
    DiferencaServico = (:SomaContabilNotaServicos - :SomaICMServicos);
    FlagTipoDiferencaServico = 2;
  END
END
--end

--MARCELO - CHAMADO 182639
Contador = 1;

WHILE (Contador <= 2) DO
BEGIN
  IF (Contador = 1) THEN
  BEGIN
    Diferenca = DiferencaProduto;
    FlagTipoDiferenca = FlagTipoDiferencaProduto;
  END
  IF (Contador = 2) THEN
  BEGIN
    Diferenca = DiferencaServico;
    FlagTipoDiferenca = FlagTipoDiferencaServico;
  END

  IF (Diferenca <> 0) THEN
  BEGIN
    /*--Se houver diferencas, altera no primeiro item da nota*/
    IF (AuxTipoItem = 0) THEN
    BEGIN
      SELECT FIRST 1 Empresa, NumLancamento,
--185753
        ValorBaseICM
      FROM MovEstoque
      WHERE Empresa      = :Empresa
         AND TipoControle = :TipoControle
         AND CodControle  = :CodControle
         AND CASE WHEN :FlagTipoDiferenca = 1 AND CodProduto <> 8888888 THEN 1
                  WHEN :FlagTipoDiferenca = 2 AND CodProduto = 8888888  THEN 1
                  ELSE 0
             END = 1
         AND (ValorBaseICM > 0 OR ValorIsentoICM > 0 OR ValorOutrasICM > 0)
         AND NOT EXISTS(SELECT * FROM MovComponente Comp
                        WHERE Comp.Empresa = MovEstoque.Empresa
                          AND Comp.NumLancamento = MovEstoque.NumLancamento)
      ORDER BY NumLancamento
      INTO :AuxEmpresa, :AuxNumLancamento,
--185753
           :AuxBaseICM;
                                                  
      UPDATE MovEstoque
        SET ValorBaseICM = CASE WHEN ValorBaseICM <> 0
                                THEN ValorBaseICM + (:Diferenca)
                                ELSE ValorBaseICM END,
            ValorIsentoICM = CASE WHEN ValorIsentoICM <> 0 AND ValorBaseICM = 0
                                  THEN ValorIsentoICM + (:Diferenca)
                                  ELSE ValorISentoICM END,
            ValorOutrasICM = CASE WHEN ValorOutrasICM <> 0 AND ValorBaseICM = 0
                                  THEN ValorOutrasICM + (:Diferenca)
                                  ELSE ValorOutrasICM END
      WHERE Empresa = :AuxEmpresa
        AND NumLancamento = :AuxNumLancamento;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 Empresa,
                   NumLancamento,
                   NumSequencia,
--185753
                   ValorBaseICM
      FROM MovComponente
      WHERE Empresa = :Empresa
        AND TipoControle = :TipoControle
        AND CodControle = :CodControle
        AND CASE WHEN :FlagTipoDiferenca = 1 AND CodProduto <> 8888888 THEN 1
                 WHEN :FlagTipoDiferenca = 2 AND CodProduto = 8888888  THEN 1
                 ELSE 0
            END = 1
        AND (ValorBaseICM > 0 OR ValorIsentoICM > 0 OR ValorOutrasICM > 0)
      ORDER BY NumLancamento
      INTO :AuxEmpresa, :AuxNumLancamento, :AuxNumSequencia,
--185753
           :AuxBaseICM;

      UPDATE MovComponente
        SET ValorBaseICM = CASE WHEN ValorBaseICM <> 0
                                THEN ValorBaseICM + (:Diferenca)
                                ELSE ValorBaseICM END,
            ValorIsentoICM = CASE WHEN ValorIsentoICM <> 0 AND ValorBaseICM = 0
                                  THEN ValorIsentoICM + (:Diferenca)
                                  ELSE ValorISentoICM END,
            ValorOutrasICM = CASE WHEN ValorOutrasICM <> 0 AND ValorBaseICM = 0
                                  THEN ValorOutrasICM + (:Diferenca)
                                  ELSE ValorOutrasICM END
      WHERE Empresa = :AuxEmpresa
        AND NumLancamento = :AuxNumLancamento
        AND NumSequencia = :AuxNumSequencia;
   END
  
                    
   UPDATE NotasFiscais
     SET ValorBaseICM = CASE WHEN ValorBaseICM <> 0                    
                             THEN ValorBaseICM + (:Diferenca)
                             ELSE ValorBaseICM END                    
   WHERE Empresa = :Empresa
     AND TipoControle = :TipoControle
     AND CodControle = :CodControle
--185753
     AND COALESCE(:AuxBaseICM, 0) <> 0;
  END
  Contador = Contador + 1;
END


--327726  
SELECT   
 COALESCE(SUM(NF.ValorProdutos),0),
 COALESCE(SUM(NF.ValorServicos),0)
FROM NotasFiscais NF  
WHERE  
    Empresa =:Empresa
AND TipoControle = :TipoControle
AND CodControle =  :CodControle
INTO :valorprodutosnota,:valorservicosnota;



DELETE FROM NotasFiscaisRetencao
 WHERE Empresa=:Empresa
   AND TipoControle=:TipoControle
   AND CodControle=:CodControle;

INSERT INTO NotasFiscaisRetencao (
       Empresa, TipoControle, CodControle, TipoRetencao,
       ValorBase, Aliquota, 
       ValorRetencao, StatusTransacao)
  SELECT :Empresa, :TipoControle, :CodControle, PedidosRetencao.TipoRetencao,
      SUM(PedidosRetencao.ValorBase), MAX(PedidosRetencao.Aliquota),
      --338411
      --sum(PedidosRetencao.ValorRetencao), min(1)
      rs_rounddec( ( (SUM(PedidosRetencao.ValorBase)*MAX(PedidosRetencao.Aliquota) )/100.00),2),
      MIN(1)
    FROM TempPrft110Pedido, PedidosRetencao
    WHERE TempPrft110Pedido.NumSequencia = :Ped_Sequencia
      AND PedidosRetencao.Empresa = :Empresa
      AND PedidosRetencao.CodPedido = TempPrft110Pedido.CodPedido
    --327726
      AND ( (PedidosRetencao.TipoRetencao = 5 AND  :valortotalretencoesiss > 0 AND :valorservicosnota > 0)
           OR  (TipoRetencao = 6  AND  :valortotalretencoesicm > 0 AND :valorprodutosnota > 0)
           OR  (:valortotalretencoes > 0 ) )
    GROUP BY PedidosRetencao.TipoRetencao;


--Gabriella - 344500
IF (:ValorServicosNota > 0) THEN
BEGIN
    --Atualiza a Temporária 
    UPDATE TempPrft110RelacaoRetencao
       SET Tipocontrole = :TipoControle,
           CodControle = :CodControle
     WHERE NumSequencia = :Ped_Sequencia
       AND TipoControle = 0
       AND CodControle = 0;
       
    --Insere na tabela de Retenção      
    INSERT INTO NotasFiscaisRetencao (
             Empresa, TipoControle, 
             CodControle, TipoRetencao,                                                     
             ValorBase, Aliquota,                                                                                               
             ValorRetencao, StatusTransacao)                                                                                              
      SELECT :Empresa, TempRel.TipoControle,
             TempRel.CodControle, TempRel.TipoRetencao,                                                      
             SUM(TempRel.ValorBase), MAX(TempRel.Aliquota),                                                                                                             
             SUM(TempRel.ValorRetencao), 1                                                                     
        FROM TempPrft110RelacaoRetencao TempRel                                                                                     
       WHERE TempRel.NumSequenciaPed = :Ped_Sequencia
         AND TempRel.TipoControle = :TipoControle
         AND TempRel.CodControle = :CodControle
         AND TempRel.ValorRetencao > 0 
      --Gabriella - 358073
      GROUP BY TempRel.TipoControle, TempRel.CodControle, TempRel.TipoRetencao;

    --Gabriella - 358073      
    --Insere na tabela de Relação da Retenção
   /* Insert Into NotasFiscaisRelacaoRetencao
          (Empresa, TipoControle, 
           CodControle, TipoRetencao, 
           ValorBase, Aliquota,
           ValorRetencao, FlagRetencaoGerada, 
           TipoControleRetencao, CodControleRetencao,
           StatusTransacao, TransacaoEmpresas)
    Select :Empresa, TempRetencao.TipoControle,
           TempRetencao.CodControle, TempRetencao.TipoRetencao,
           TempRetencao.ValorBase, TempRetencao.Aliquota,
           TempRetencao.ValorRetencao, 1, 
           :TipoControle, :CodControle,
           1, ''
      From TempPrft110RelacaoRetencao TempRetencao
     where TempRetencao.NumSequencia = :Ped_Sequencia;    */
END


     --338411   
   UPDATE NotasFiscais
   SET ValorTotalRetencoes =  COALESCE( (  SELECT FIRST 1 SUM(ValorRetencao)
                                           FROM NotasFiscaisRetencao
                                           WHERE Empresa=:Empresa
                                             AND TipoControle=:TipoControle
                                             AND CodControle=:CodControle),0)
                               
   WHERE
       Empresa=:Empresa
   AND TipoControle=:TipoControle
   AND CodControle=:CodControle;
  

END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE STORED_PRFT110DUPLICATA (
    empresa integer,
    tipocontrole integer,
    codcontrole integer,
    codbanco integer,
    codoperacaodup char(5),
    venc_sequencia integer,
    valortotalprocessado numeric(11,2),
    flagcupom integer,
    seriecontrole char(3))
as
declare variable tipoduplicata integer;
declare variable codduplicata varchar(15);
declare variable numdocumento integer;
declare variable flaggravacao integer;
declare variable contparcela integer;
declare variable parcela integer;
declare variable vencimento timestamp;
declare variable valorparcela numeric(11,2);
declare variable salvadup varchar(15);
declare variable numsequenciabaixa integer;
declare variable numsequenciaocorrencia integer;
declare variable numocorrenciamovbaixa integer;
declare variable numocorrenciamovocorr integer;
declare variable codconta integer;
declare variable flagdevolucao smallint;
declare variable codbancocheque integer;
declare variable numcontacheque integer;
declare variable numagenciacheque integer;
declare variable numcnpj bigint;
declare variable tipopessoa smallint;
declare variable digitocontacheque char(1);
declare variable emitente varchar(40);
declare variable numcheque varchar(15);
declare variable valorprecision1 double precision;
declare variable valorprecision2 double precision;
declare variable fator double precision;
declare variable codcondpagto char(5);
declare variable flagbaixar smallint;
declare variable codbancobaixa integer;
declare variable codcontaadicional integer;
declare variable valoradicional numeric(11,2);
declare variable contador integer;
declare variable strdupbaixadas varchar(100);
declare variable codcontatotalnota integer;
declare variable codbancodupl integer;
declare variable valorcomplementar numeric(11,2);
declare variable primeiraduplicata varchar(15);
declare variable valorcomissaointernonota numeric(11,2);
declare variable valorcomissaoexternonota numeric(11,2);
declare variable valorcomissaoparceironota numeric(11,2);
declare variable valorcomissaointernodupl numeric(11,2);
declare variable valorcomissaoexternodupl numeric(11,2);
declare variable valorcomissaoparceirodupl numeric(11,2);
declare variable valortotalnotainicial numeric(11,2);
declare variable valortotalnotatratada numeric(11,2); /* Será utilizada somente no calculo da comissao */
declare variable valortituloduplinicial numeric(11,2);
declare variable valortitulodupltratado numeric(11,2); /* Será utilizada somente no calculo da comissao */
declare variable relacaovendedores smallint;
declare variable valoripi numeric(11,2);
declare variable valorfrete numeric(11,2);
declare variable valoricm numeric(11,2);
declare variable valorsubtrib numeric(11,2);
declare variable valordespesas numeric(11,2);
declare variable flagsomaipi smallint;
declare variable flagsomafrete smallint;
declare variable flagsomaicm smallint;
declare variable flagsomasubtrib smallint;
declare variable flagsomadespesas smallint;
declare variable valoresadicionais numeric(11,2);
declare variable valorbasecomissao numeric(11,2);
declare variable auxcodcontrole integer;
declare variable numsequenciamovcaixa integer;
declare variable desconsiderarvencimentos smallint;
declare variable flagduplicatast smallint;
declare variable existeduplicatast smallint;
declare variable tempvalortotalprocessado numeric(11,2);
declare variable tempvalortotalnotainicial numeric(11,2);
declare variable valorduplicatast numeric(11,2);
declare variable complementodupl varchar(200);
declare variable flagnaogerenciarnumdocumento smallint;
declare variable valordiferenca numeric(11,2);
declare variable empid varchar(15);
BEGIN

/********************          
-- VERSÃO 1.99         
********************/          

--JALDO/RAFAEL - CHAMADO 201195
NumSequenciaMovCaixa = 0;
NumOcorrenciaMovBaixa = 0;
NumOcorrenciaMovOcorr = 0;
--MARCELO - CHAMADO 127544
NumSequenciaBaixa = 0;
StrDupBaixadas = '';
/*
-Verifica se a Condição de Pagto. da nota é do tipo que tem que gerar baixa automatica
-Pega a CodContaTotalNota e CodDespesa da Operação Informada na Nota 
-Seta o Tipo da Duplicata... se for Operacao de Devolucao, o Tipo da Duplicata
 é o inverso do Tipo de Controle, se não, é igual ao Tipo de Controle
*/

--Eder Ramos Chamado 302201
Select 
     FlagNaoGerenciarNumDocumento
    From ParamControleSerie        
    where Empresa = :Empresa and Serie= :SerieControle
into :flagnaogerenciarnumdocumento;

--Gabriella - 301399
SELECT ID
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :EmpId;

Select First 1 CodContaTotalNota
  From NotasFiscais NF 
  Left Join DetalhesOperacoes Dop On Dop.CodOperacao = NF.CodOperacao
                       and Dop.Empresa in(0,NF.Empresa)
Where NF.Empresa       = :Empresa
  And NF.TipoControle  = :TipoControle
  And NF.CodControle   = :CodControle
Order By Dop.Empresa Desc
  Into :CODCONTATOTALNOTA;

Select FlagTipoRelacaoVendedores
  From ParamControle        
   Where Empresa=:Empresa
Into :RelacaoVendedores;


SELECT
  NF.CodCondPagto,

  Case when (rs_invl(Op.FlagIgnorarContaEntidade,0) = 1) or (rs_invl(E.CodConta,0) = 0)
                       then rs_invl(:CodContaTotalNota,0)
                     else rs_invl(E.CodConta,0) end,
  CASE rs_invl(Op.TipoMovimento,0) WHEN 1 THEN 1 ELSE 0 END,
  CASE rs_invl(U.CodBanco,0) WHEN 0 THEN :CodBanco ELSE U.CodBanco END,
  CASE COALESCE(Op.TipoMovimento,0) WHEN 1 THEN 0 ELSE      -- nao pode ser devolucao
    -- tem que ser despesa na Nota/Pedido, e ter valor de despesa informado
    --Ronaldo Chamado 362382
    --(CASE WHEN (COALESCE(B.TipoDespesa,0) <> 2) AND (B.ValorDespesa <>0) THEN
    (CASE WHEN (COALESCE(B.TipoDespesa,0) = 2) AND (B.ValorDespesa <>0) THEN
           --nota de entrada, tem que ter a conta adicional pagar informada no cad. de op. de dup.
      CASE WHEN (:TipoControle = 1) AND (COALESCE(OpDup.CodContaAdicionalPagar,0) <> 0)
             THEN OpDup.CodContaAdicionalPagar
           --nota de saida, tem que ter a conta adicional receber informada no cad. de op. de dup.
           WHEN (:TipoControle = 2) AND (COALESCE(OpDup.CodContaAdicionalReceber,0) <> 0)
             THEN OpDup.CodContaAdicionalReceber
           ELSE 0 END
     Else 0 END)
  END,
  COALESCE(B.ValorDespesa,0),
  COALESCE(NF.ValorTotalNota,0),
  COALESCE(NF.ValorIPI,0),
  COALESCE(NF.ValorFrete,0),
  COALESCE(NF.ValorICM,0),
  COALESCE(NF.ValorSubTrib,0),
  COALESCE(NF.ValorDespesas,0)

FROM
  NotasFiscais NF
  LEFT JOIN Operacoes Op ON Op.Codigo = NF.CodOperacao
  LEFT JOIN Usuarios U ON U.Codigo = NF.CodUsuarioInc
  LEFT JOIN Bancos B ON B.Codigo = :CodBanco
  LEFT JOIN OperacoesDup OpDup ON OpDup.Codigo = :CodOperacaoDup
  LEFT JOIN Entidades E on E.Codigo = NF.CodEntidade
WHERE NF.Empresa = :Empresa
  AND NF.TipoControle = :TipoControle
  AND NF.CodControle = :CodControle
INTO
  :CodCondPagto,
  :CodConta,
  :FlagDevolucao,
  :CodBancoBaixa,
  :CodContaAdicional,
  :ValorAdicional,
  :ValorTotalNotaInicial,
  :ValorIPI,
  :ValorFrete,
  :ValorICM,
  :ValorSubTrib,
  :ValorDespesas;


IF (FlagDevolucao = 1) THEN
BEGIN
  IF (TipoControle = 1) THEN 
    TipoDuplicata = 2;
  ELSE
    TipoDuplicata = 1;
END
ELSE
  TipoDuplicata = TipoControle;  

ValorTotalNotaTratada = ValorTotalNotaInicial;

--Karina - 125968
if (RelacaoVendedores = 0) Then
begin
  ValoresAdicionais = 0;

  Select FlagSomaIPI, FlagSomaFrete, FlagSomaICM,   FlagSomaSubTrib,
         FlagSomaDespesas
  From CondPagto
  where Codigo = :CodCondPagto
  Into :FlagSomaIPI, :FlagSomaFrete, :FlagSomaICM, :FlagSomaSubTrib, :FlagSomaDespesas;
    
  if (FlagSomaIPI = 1) Then
    ValoresAdicionais = ValoresAdicionais + ValorIPI;
  if (FlagSomaFrete = 1) then
    ValoresAdicionais = ValoresAdicionais + ValorFrete;
  if (FlagSomaICM = 1) then
    ValoresAdicionais = ValoresAdicionais + ValorICM;
  if (FlagSomaSubTrib = 1) then
    ValoresAdicionais = ValoresAdicionais + ValorSubTrib;
  if (FlagSomaDespesas = 1) then
    ValoresAdicionais = ValoresAdicionais + ValorDespesas;

  ValorTotalNotaTratada = ValorTotalNotaTratada - ValoresAdicionais;
end 

--Karina - 125968
PrimeiraDuplicata = '';

--MARCELO - CHAMADO 233642      
DesconsiderarVencimentos = 2;
if (not Exists(select First 1 Empresa from MovEstoque
               where Empresa = :Empresa
                 and TipoControle = :TipoControle
                 and CodControle = :CodControle
                 and CodProduto <> 8888888)) then
  DesconsiderarVencimentos = 1;
    
    
--MARCELO - CHAMADO 233642      
ExisteDuplicataST = 0;
if (Exists(select First 1 NumSequencia from TempPRFT110Venc
           where NumSequencia = :Venc_Sequencia
             and FlagDuplicataST = 1)) then
  ExisteDuplicataST = 1;
    
--MARCELO - CHAMADO 233642      
ValorDuplicataST = 0;
if (ExisteDuplicataST = 1) then
begin
  --Gabriella - 301399
  if (empid <> 'DINAMAR') then
  begin
    select Sum(ME.ValorSubTrib) from MovEstoque ME
    where ME.Empresa = :Empresa
      and ME.TipoControle = :TipoControle
      and ME.CodControle = :CodControle
    into :ValorDuplicataST;
  end
  else
  begin
    select (NF.ValorSubTrib + NF.valorfrete + NF.ValorDespesas) from NotasFiscais NF
    where NF.Empresa = :Empresa
      and NF.TipoControle = :TipoControle
      and NF.CodControle = :CodControle
    into :ValorDuplicataST;
  end

  if (:ValorDuplicataST is null) then
    ValorDuplicataST = 0;
end

--MARCELO - CHAMADO 233642    
TempValorTotalProcessado = :ValorTotalProcessado;
TempValorTotalNotaInicial = :ValorTotalNotaInicial;

-- Renato - Chamado 260385
-- Copiando a primeira observação do tipo duplicata da nota fiscal para o campo Complemento das Duplicatas.
Select First 1 rs_substring(Observacao,1,200)
From ObsNotasFiscais
Where Empresa = :Empresa
  and TipoControle = :TipoControle
  and CodControle = :CodControle
  and TipoObs = 6
Order By Sequencia into :ComplementoDupl;

if (:ComplementoDupl is null) then
    ComplementoDupl = '';


--:FlagCupom: 0 Nota, 1-Cupom 2-Nota e Cupom

FOR
  SELECT
    T.NumParcela, Vencimento, Valor,
    NumCheque, EmitenteCheque, CodBancoCheque, NumContaCheque,
    NumAgenciaCheque, NumCNPJ, TipoPessoa, DigitoContaCheque,
    FlagBaixa , CodBanco, ValorComplementar,
--MARCELO - CHAMADO 233642
    FlagDuplicataST 
  FROM
    TempPrft110Venc T
  WHERE
    NumSequencia = :Venc_Sequencia
--MARCELO - CHAMADO 233642
    and FlagDuplicataST <> :DesconsiderarVencimentos
  INTO :Parcela, :Vencimento, :ValorParcela,
       :NumCheque, :Emitente, :CodBancoCheque, :NumContaCheque, 
       :NumAgenciaCheque, :NumCNPJ, :TipoPessoa, :DigitoContaCheque,
       :FlagBaixar , :CodBancoDupl, :valorcomplementar,
--MARCELO - CHAMADO 233642
       :FlagDuplicataST
DO
BEGIN
  IF ((FlagNaoGerenciarNumDocumento = 0) and ((FlagCupom = 0) OR (FlagCupom = 2)))  THEN  --Somente Nota
  BEGIN
    SELECT
      UltimaDuplicata
    FROM
      --254456
      --ParamControleSerie
      paramcontrolesequencia
    WHERE
      Empresa = :Empresa
      AND Serie = :SerieControle
    INTO
      :NumDocumento; -- É o Numero da Proxima Duplicata porque foi atualizada antes de entrar no While

    CodDuplicata = rs_Replicate('0',(6 - rs_Length(:NumDocumento))) || CAST(:NumDocumento AS VARCHAR(6)) ||
                                 '/' || CAST(:Parcela AS VARCHAR(3));
  END
  ELSE  --Nota e cupom ou somente cupom
  BEGIN
    NumDocumento = CodControle;
    CodDuplicata = 'CTR' || rs_Replicate('0',(6 - rs_Length(NumDocumento))) || CAST(NumDocumento AS VARCHAR(6)) ||
                                 '/' || CAST(Parcela AS VARCHAR(3));
  END

  FlagGravacao = 0;
  ContParcela = 0;
  SalvaDup = CodDuplicata;
  WHILE (FlagGravacao = 0 AND ContParcela < 99) DO
  BEGIN
     IF ((EXISTS(SELECT Empresa FROM Duplicatas
                WHERE Empresa=:Empresa
                  AND TipoDuplicata=:TipoDuplicata
                  AND CodDuplicata=:CodDuplicata)) OR
        (EXISTS(SELECT Empresa FROM MovDuplicata
                WHERE Empresa=:Empresa
                  AND TipoMovimento=0
                  AND TipoDuplicata=:TipoDuplicata
                  AND CodDuplicata=:CodDuplicata))) THEN
    BEGIN
      ContParcela = ContParcela + 1;
      CodDuplicata = SalvaDup ||
                     rs_Replicate('0',2-rs_length(ContParcela)) ||
                     CAST(ContParcela AS VARCHAR(2)); --Sequencia Auxiliar Ex: 000001/101
    END
    ELSE
    BEGIN
      FlagGravacao = 1;
    END
  END

--MARCELO - CHAMADO 233642    
--  TempValorTotalProcessado = :ValorTotalProcessado;
--  TempValorTotalNotaInicial = :ValorTotalNotaInicial;
  
  if (:ExisteDuplicataST = 1) then
  begin    
    ExisteDuplicataST = 0;
    TempValorTotalProcessado = :TempValorTotalProcessado - :ValorDuplicataST;
    TempValorTotalNotaInicial = :TempValorTotalNotaInicial - :ValorDuplicataST;
  end    
    
  if (:FlagDuplicataST = 1) then
  begin    
    ValorParcela = :ValorDuplicataST;
    ValorTituloDuplInicial = :ValorParcela;
    ValorTituloDuplTratado = :ValorParcela;

    Fator = 0;
    ValorPrecision1 = :ValorParcela;
    ValorPrecision2 = :ValorTotalProcessado;
    If (:ValorPrecision2 > 0) then
      Fator = :ValorPrecision1 / :ValorPrecision2;
    If (:Fator = 0) then
      Fator = 1;
  end                                             
  else     
  begin                                                     
    --Move para uma variável float só para ficar igual ao firebird                                                      
    Fator = 0;
    ValorPrecision1 = :ValorParcela;
   --MARCELO - CHAMADO 233642      
    ValorPrecision2 = :TempValorTotalProcessado;
    If (:ValorPrecision2 > 0) then
      Fator = :ValorPrecision1 / :ValorPrecision2;
    If (:Fator = 0) then
      Fator = 1;
    
    --MARCELO - CHAMADO 233642                              
    ValorTituloDuplInicial = case when :TempValorTotalProcessado = 0 then 0
                                  Else (rs_rounddec(:TempValorTotalNotaInicial * :Fator,2) * Case :FlagDevolucao When 1 then -1 Else 1 End) End;
    ValorTituloDuplTratado = :ValorTituloDuplInicial;

    if (:TempValorTotalProcessado <> :ValorTotalProcessado) then
    begin  
      Fator = 0;
      ValorPrecision1 = :ValorParcela;
      ValorPrecision2 = :ValorTotalProcessado;
      If (:ValorPrecision2 > 0) then
        Fator = :ValorPrecision1 / :ValorPrecision2;
      If (:Fator = 0) then
        Fator = 1;
    end                                  
  end    

  --MARCELO - CHAMADO 233642
  --Fator deve ser movido para uma variavel double precision senão dá erro de arredondamento
/*  ValorPrecision1 = ValorParcela;
  ValorPrecision2 = ValorTotalProcessado;
  IF (ValorPrecision2 > 0) THEN
  BEGIN
     Fator = ValorPrecision1 / ValorPrecision2;
  END
  ELSE
     Fator = 1;



  ValorTituloDuplInicial = case when ValorTotalProcessado = 0 then 0
                             Else (rs_rounddec(ValorTotalNotaInicial * Fator,2) * Case FlagDevolucao When 1 then -1 Else 1 End)
                           End;
  ValorTituloDuplTratado = ValorTituloDuplInicial;*/

  --Karina - 125968    
  if (PrimeiraDuplicata = '') then
  begin
    if (RelacaoVendedores = 0) then
      ValorTituloDuplTratado = ValorTituloDuplTratado - (ValoresAdicionais * Case FlagDevolucao When 1 then -1 Else 1 End);

    PrimeiraDuplicata = CodDuplicata;
  end

  INSERT INTO Duplicatas (Empresa, TipoDuplicata, CodDuplicata, CodEntidade,
         NumDocumento,
         DataEmissao, DataDocumento, DataVencimento,
         DataPagamento,
         ValorFatura,
         ValorTitulo, CodBanco, CodOperacaoDup, CodOperacao,
         CodVendInterno, CodVendExterno, CodVendParceiro, CodCondPagto,
         CodConta, TipoControle, CodControle, StatusTransacao, FlagDevolucao,
         CodBancoCheque, NumContaCheque, NumAgenciaCheque, NumCheque,
         EmitenteCheque, NumCNPJ, TipoPessoa, DigitoContaCheque, CodDepartamento,
         ValorComissaoInterno,
         ValorComissaoExterno,
         ValorComissaoParceiro,
         ValorComplementar,
         --133864
         ValorBaseComissao,
         -- Renato - Chamado 260385
         Complemento)
  SELECT :Empresa, :TipoDuplicata, :CodDuplicata, N.CodEntidade,
       'NF' || Rs_Replicate('0',6- rs_length(N.NumDocumento)) || CAST(N.NumDocumento AS VARCHAR(6)),
       N.DataDocumento, N.DataDocumento, :Vencimento,
       CASE WHEN :FlagBaixar = 1 THEN N.DataMovimento ELSE NULL END,
       N.ValorTotalNota,
       :ValorTituloDuplInicial,
       CASE :FlagBaixar WHEN 1 THEN
         CASE WHEN COALESCE(:CodBancoDupl,0) = 0 THEN :CodBancoBaixa ELSE :CodBancoDupl END
       ELSE
         CASE WHEN COALESCE(:CodBancoDupl,0) = 0 THEN :CodBanco ELSE :CodBancoDupl END
       END,
       :CodOperacaoDUp, N.CodOperacao,
       N.CodVendInterno, N.CodVendExterno, N.CodVendParceiro, N.CodCondPagto,
       :CodConta, N.TipoControle, N.CodControle, 1, :FlagDevolucao,
       :CodBancoCheque, :NumContaCheque, :NumAgenciaCheque, :NumCheque,
       :Emitente, :NumCNPJ, :TipoPessoa, :DigitoContaCheque, N.CodDepartamento,
       --MARCELO - CHAMADO 200837
       case :ValorTotalNotaTratada when 0 then 0 else
       rs_dnvl(((abs(:ValorTituloDuplTratado) / :ValorTotalNotaTratada)
                * ((N.ValorComissaoInterno * (VenInt.AliqComissaoDup)) / 100)),0)       
                        * Case :FlagDevolucao When 1 Then -1 Else 1 End end,
       --MARCELO - CHAMADO 200837
       case :ValorTotalNotaTratada when 0 then 0 else
       rs_dnvl(((abs(:ValorTituloDuplTratado) / :ValorTotalNotaTratada)
            * ((N.ValorComissaoExterno * (VenExt.AliqComissaoDup)) / 100)),0)       
                        * Case :FlagDevolucao When 1 Then -1 Else 1 End end,
       --MARCELO - CHAMADO 200837
       case :ValorTotalNotaTratada when 0 then 0 else
      rs_dnvl(((abs(:ValorTituloDuplTratado) / :ValorTotalNotaTratada)
            * ((N.ValorComissaoParceiro * (VenPar.AliqComissaoDup)) / 100)),0)       
                        * Case :FlagDevolucao When 1 Then -1 Else 1 End end,
       :ValorComplementar,
       --133864
       case :ValorTotalNotaTratada when 0 then 0 else
       Abs((:ValorTituloDuplTratado / :ValorTotalNotaTratada) * N.ValorBaseComissao) end,
       -- Renato - Chamado 260385
       :ComplementoDupl

   FROM NotasFiscais N
   LEFT JOIN Vendedores VenInt ON VenInt.Codigo = N.CodVendInterno
   LEFT JOIN Vendedores VenExt ON VenExt.Codigo = N.CodVendExterno
   LEFT JOIN Vendedores VenPar ON VenPar.Codigo = N.CodVendParceiro
   WHERE N.Empresa=:Empresa
     AND N.TipoControle=:TipoControle
     AND N.CodControle=:CodControle;

  --Inclui Mov. de Ocorrência para lançar o valor adicional, dependendo do banco que deve
  --estar com despesa do Tipo de despesa = 2, com valor de despesa informado, e ter a
  --conta informada na operação da dup
  IF (CodContaAdicional <> 0) THEN
  BEGIN
    --Adianta a Ultima Sequencia
    IF (NumOcorrenciaMovOcorr = 0) THEN
    begin
--MARCELO - CHAMADO 225117
--      Select SequenciaGerada From ProximaSequencia('MOVDUPLICATAOCORR', :Empresa, 1)
      Select SequenciaGerada From ProximaSequencia('MOVFINANCEIRO', :Empresa, 1)
         Into :NumSequenciaOcorrencia;
    end

    NumOcorrenciaMovOcorr = NumOcorrenciaMovOcorr + 1;
    INSERT INTO MovDuplicata
    (
      Empresa,               TipoMovimento,   NumSequencia,
      NumOcorrencia,         TipoDuplicata,   CodDuplicata, 
      DataMovimento,         DataVencimento,     
      ValorRecebido,      
      CodBanco,              CodOperacaoDup,       
      CodUsuario,           
      CodEntidade,           NumDocumento,
      DataEmissao,           
      DataDocumento,         StatusTransacao,      
      CodConta,              EmpresaDuplicata, ValorAdicional,
      CodDepartamento
    )  
    SELECT
      :Empresa,               2,               :NumSequenciaOcorrencia,
      :NumOcorrenciaMovOcorr, :TipoDuplicata,  :CodDuplicata,
      N.DataMovimento,        :Vencimento,             
--MARCELO - CHAMADO 233642
--      CASE :ValorTotalProcessado WHEN 0 THEN 0 ELSE rs_Rounddec((N.ValorTotalNota+N.ValorComplementar) * :Fator,2) END,
      CASE :TempValorTotalProcessado WHEN 0 THEN 0 ELSE rs_Rounddec((N.ValorTotalNota+N.ValorComplementar) * :Fator,2) END,
      CASE :FlagBaixar WHEN 1 THEN
         CASE WHEN COALESCE(:CodBancoDupl,0) = 0 THEN :CodBancoBaixa ELSE :CodBancoDupl END
       ELSE
         CASE WHEN COALESCE(:CodBancoDupl,0) = 0 THEN :CodBanco ELSE :CodBancoDupl END
       END,
      :CodoperacaoDup,        
      (CASE N.CodUsuarioAlt WHEN 0 THEN N.CodUsuarioInc ELSE N.CodUsuarioAlt END), 
      N.CodEntidade,          N.NumDocumento,  N.DataDocumento,         
      N.DataDocumento,        1,               :CodConta,       
      :Empresa,               :ValorAdicional,
      N.CodDepartamento
    FROM 
      NotasFiscais N
    WHERE 
      N.Empresa          = :Empresa   
      AND N.TipoControle = :TipoControle 
      AND N.CodControle  = :CodControle;

  END

  --Inclui Movimento de Baixa, caso a Cond. de Pagamento da nota esteja marcada para Gerar Baixa automatica
  IF (FlagBaixar = 1) THEN
  BEGIN
    StrDupBaixadas = StrDupBaixadas || ' ' || CodDuplicata;

--MARCELO - CHAMADO 127544
--VERIFICA SE EXISTE ALGUMA BAIXA JA GERADA PARA OS CONTROLES PROCESSADOS
/*196249
    select first 1 Coalesce(MD.NumSequencia, 0)
    From MovDuplicata MD
    Where MD.Empresa = :Empresa
      And MD.EmpresaDuplicata = :Empresa
      And MD.TipoMovimento = 3
      And Exists(Select * From TempPRFT110Nota TNota
                 Where TNota.Empresa = MD.Empresa  
                   And TNota.TipoControle = MD.TipoControle
                   And TNota.CodControle = MD.CodControle
                   And TNota.CodControle <> 0 
                   And TNota.TipoControle <> 0
                   And TNota.NumSequencia = (Select first 1 NumSequencia From TempPRFT110Nota
                                             Where Empresa = :Empresa
                                               And TipoControle = :TipoControle
                                               And CodControle = :CodControle))
      into :NumSequenciaBaixa ;
*/

--196249
    for
      Select CodControle From TempPRFT110Nota TNota
      Where
        TNota.NumSequencia = (Select first 1 NumSequencia From TempPRFT110Nota
                                  Where Empresa = :Empresa
                                    And TipoControle = :TipoControle
                                    And CodControle = :CodControle)
        And TNota.CodControle <> 0
        And TNota.TipoControle <> 0
      Into :AuxCodControle do
    begin
      if (NumSequenciaBaixa = 0) then
      begin
        Select First 1 Mov.NumSequencia
        From MovDuplicata Mov
        Where Mov.Empresa = :Empresa
        and Mov.TipoMovimento = 3
        and Mov.TipoControle = :TipoControle
        and Mov.CodControle = :AuxCodControle
        Into :NumSequenciaBaixa;

        if (NumSequenciaBaixa is null) then
          NumSequenciaBaixa = 0;
      end
    end

    --Adianta a Ultima Sequencia
    --MARCELO - CHAMADO 127544
    IF  (NumOcorrenciaMovBaixa = 0) THEN
    BEGIN
      if (NumSequenciaBaixa = 0) then
      begin
        Select SequenciaGerada From ProximaSequencia('MOVFINANCEIRO', :Empresa, 1)
           Into :NumSequenciaBaixa;
      end
      else
      begin
        Select Max(NumOcorrencia)
        from MovDuplicata
        where NumSequencia = :NumSequenciaBaixa
          and Empresa = :Empresa
          and TipoMovimento = 3
        into :NumOcorrenciaMovBaixa ;
      end
    END
           
      NumOcorrenciaMovBaixa = NumOcorrenciaMovBaixa + 1;
      INSERT INTO MovDuplicata
         (
           Empresa,               TipoMovimento,   NumSequencia,
           NumOcorrencia,         TipoDuplicata,   CodDuplicata, 
           DataMovimento,         DataVencimento,     
           DataPagamento,
           ValorRecebido,      
           CodBanco,              CodOperacaoDup,       
           CodUsuario,           
           CodEntidade,           NumDocumento,    CodVendInterno,       
           CodVendExterno,        CodVendParceiro, ValorFatura,           
           ValorComissaoInterno, 
           ValorComissaoExterno, 
           ValorComissaoParceiro, 
           TipoControle,          CodControle,     DataEmissao,           
           DataDocumento,         StatusTransacao,      
           ValorBaseComissao,     
           CodConta,              EmpresaDuplicata, CodDepartamento
         )  
      SELECT
           :Empresa,               3,                 :NumSequenciaBaixa,
           :NumOcorrenciaMovBaixa, :TipoDuplicata,    :CodDuplicata,
           N.DataMovimento,        :Vencimento,
           CASE WHEN :FlagBaixar = 1 THEN N.DataMovimento ELSE NULL END,
--Eder - Chamado 274473
--           CASE :TempValorTotalProcessado WHEN 0 THEN 0 ELSE RS_RoundDEC((N.ValorTotalNota+N.Valorcomplementar) * :Fator,2) * CASE :FlagDevolucao WHEN 1 THEN -1 ELSE 1 END END,
           Dupl.ValorTitulo, --Já está tratado de acordo com o flagdevolucao
           CASE WHEN COALESCE(:CodBancoDupl,0) = 0 THEN :CodBancoBaixa ELSE :CodBancoDupl END,
           :CodoperacaoDup,
          (CASE N.CodUsuarioAlt WHEN 0 THEN N.CodUsuarioInc ELSE N.CodUsuarioAlt END), 
           N.CodEntidade,          N.NumDocumento,    N.CodVendInterno,       
           N.CodVendExterno,       N.CodVendParceiro, N.ValorTotalNota,        
           Dupl.ValorComissaoInterno,                    
           Dupl.ValorComissaoExterno,                    
           Dupl.ValorComissaoParceiro,
           :TipoControle,          :CodControle,      N.DataDocumento,
           N.DataDocumento,        1,
---Eder - Chamado 274473
--           CASE :TempValorTotalProcessado WHEN 0 THEN 0 ELSE rs_rounddec((N.ValorTotalNota+N.ValorComplementar) * :Fator,2) * CASE :FlagDevolucao WHEN 1 THEN -1 ELSE 1 END END,
           Dupl.ValorTitulo,
           :CodConta,              :Empresa,          N.CodDepartamento
         FROM 
           NotasFiscais N
             Left Join Duplicatas Dupl on Dupl.Empresa = :Empresa             and
                                          Dupl.TipoDuplicata = :TipoDuplicata and
                                          Dupl.CodDuplicata  = :CodDuplicata
         WHERE 
           N.Empresa           = :Empresa
           AND N.TipoControle  = :TipoControle
           AND N.CodControle   = :CodControle;

    END

    --Gabriella - 358073
    UPDATE TempPrft110RelacaoRetencao
       SET TipoDuplicata = :TipoDuplicata,
           CodDuplicata = :CodDuplicata
    WHERE NumSequencia = :Venc_Sequencia
      AND NumParcela = :Parcela;

  END

--MARCELO - CHAMADO 127544
if ((NumSequenciaBaixa <> 0) and
   ((not Exists(select first 1 MC.NumMovimento from MovCaixa MC
                where MC.Empresa = :Empresa
                  and MC.TipoMovimento = 3
                  and MC.NumSequencia = :NumSequenciaBaixa)))) then
begin
  FOR
    SELECT Contador
    FROM Tempprft110Caixa
    WHERE NumSequencia = :Venc_Sequencia
      AND EXISTS(SELECT TAux.FlagBaixa
                 FROM TempPrft110Venc TAux
                 WHERE TAux.NumSequencia = :Venc_Sequencia
                   AND TAux.FlagBaixa > 0)
    ORDER BY Contador
    INTO :Contador DO
  BEGIN
    Select SequenciaGerada From ProximaSequencia('MOVCAIXA', :Empresa, 1)
           Into :NumSequenciaMovCaixa;
    INSERT INTO MovCaixa
           (
             Empresa,           NumMovimento,
             TipoLancamento,
             CodFormaPagamento, NomeBanco,         NomeAgencia,
             NumCheque,         Emitente,
             Observacao,
             ValorRecebido,
             TipoMovimento,     NumSequencia,
             DataVencimento,    CodBanco,          CodEntidade,
             DataMovimento,     Periodo,           NumLote,
             NumLancamento,     NumSequencia_Cont, StatusTransacao,
             CodDepartamento,   CodBancoCheque,    NumContaCheque,
             NumAgenciaCheque,  NumCNPJ,           TipoPessoa,
             DigitoContaCheque
           )
        SELECT
             --JALDO/RAFAEL - CHAMADO 201195
             --:Empresa,              (SELECT COALESCE(MAX(NumMovimento),0) FROM MovCaixa WHERE Empresa = :Empresa) + 1,
             :Empresa,  :NumSequenciaMovCaixa,
             T.TipoLancamento,
             T.CodFormaPagamento,   '',                 '',
             T.NumCheque,           T.EmitenteCheque,
             CASE WHEN T.Observacao <> '' THEN 'Ref. Duplicatas: ' || :StrDupBaixadas || ' - Obs: ' || T.Observacao
                  ELSE 'Ref. Duplicatas: ' || :StrDupBaixadas End,
             T.ValorRecebido,
             3,                     :NumSequenciaBaixa,
--235854             T.DataMovimento,       :CodBanco,          N.CodEntidade,
             T.DataMovimento,       :CodBancoBaixa,          N.CodEntidade,
             N.DataMovimento,       '',                 0,
             0,                     0,                  1,
             N.CodDepartamento,     T.CodBancoCheque,   T.NumContaCheque,
             T.NumAgenciaCheque,    T.NumCNPJ,          T.TipoPessoa,
             T.DigitoContaCheque
        FROM TempPrft110Caixa T
          LEFT JOIN NotasFiscais N ON N.Empresa       = :Empresa
                                  AND N.TipoControle  = :TipoControle
                                  AND N.CodControle   = :CodControle
        WHERE T.NumSequencia = :Venc_Sequencia
          AND T.Contador = :Contador;
  END
end


Select Sum(ValorTitulo)
  From Duplicatas                                                                             
 where Empresa = :Empresa
   and TipoDuplicata = :TipoDuplicata
   and TipoControle = :TipoControle
   and CodControle = :CodControle
 into :ValorParcela;

--Vai corrigir as diferenças na duplicata de maior valor, dando preferencia para a duplicata que esta "Em Aberto"
Select First 1 CodDuplicata,
             (ValorFatura * Case :FlagDevolucao When 1 Then -1 Else 1 End) - :ValorParcela
  From Duplicatas
 Where Empresa=:Empresa
   and TipoControle=:TipoControle
   and CodControle = :CodControle
Order By ValorRecebido, ValorTitulo Desc
Into :CodDuplicata, :ValorDiferenca;
                                                                            
--Corrige a diferença na duplicata escolhida
Update Duplicatas                                                                                     
   Set ValorTitulo = ValorTitulo + :ValorDiferenca
 Where Empresa=:Empresa
   and TipoDuplicata=:TipoDuplicata
   and CodDuplicata=:CodDuplicata;
                                      
if (:NumSequenciaBaixa <> 0) then
begin                  
  --Corrige a diferença no movimento de baixa da duplicata escolhida, caso ela seja baixada
  update MovDuplicata set              
         ValorRecebido = ValorRecebido + :ValorDiferenca,
         ValorBaseComissao = ValorBaseComissao + :ValorDiferenca
   where Empresa = :Empresa
     and TipoMovimento = 3                         
     and NumSequencia = :NumSequenciaBaixa
     and CodDuplicata = :CodDuplicata
--296292
    and EmpresaDuplicata = :Empresa;
end                               

Select ValorComissaoInterno, ValorComissaoExterno, ValorComissaoParceiro,
    --133864
    ValorBaseComissao
  From NotasFiscais
  Where Empresa = :Empresa and TipoControle = :TipoControle and CodControle = :CodControle
  Into :ValorComissaoInternoNota, :ValorComissaoExternoNota, :ValorComissaoParceiroNota, :ValorBaseComissao;
       
/* Karina - 125968 - Calculando a Diferença entre a comissão da Nota Fiscal e o 
              Total de Comissão das Duplicatas (PRIMEIRA DUPLICATA)*/
Update Duplicatas        
   Set ValorComissaoInterno = ValorComissaoInterno + Coalesce(((:ValorComissaoInternoNota * Case :FlagDevolucao When 1 Then -1 Else 1 End) -
                      (Select Sum(Dupl.ValorComissaoInterno) 
                  From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and 
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),          

        ValorComissaoExterno = ValorComissaoExterno + Coalesce(((:ValorComissaoExternoNota * Case :FlagDevolucao When 1 Then -1 Else 1 End)-
                         (Select Sum(Dupl.ValorComissaoExterno) 
                 From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and 
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),           
                       
        ValorComissaoParceiro = ValorComissaoParceiro + Coalesce(((:ValorComissaoParceiroNota * Case :FlagDevolucao When 1 Then -1 Else 1 End) -
                         (Select Sum(Dupl.ValorComissaoParceiro) 
                 From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and 
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),
        --133864
        ValorBaseComissao = ValorBaseComissao + Abs(coalesce(((:ValorBaseComissao) -
                   (Select Sum(Dupl.ValorBaseComissao)           
                    From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and
                      Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0))
   Where Empresa = :Empresa and TipoDuplicata = :TipoDuplicata and CodDuplicata = :PrimeiraDuplicata and
         (ValorComissaoInterno <> 0 and ValorComissaoExterno <> 0 and ValorComissaoParceiro <> 0);

Select ValorComissaoInterno, ValorComissaoExterno, ValorComissaoParceiro
  From Duplicatas
  Where Empresa = :Empresa and TipoDuplicata = :TipoDuplicata and CodDuplicata = :PrimeiraDuplicata
  Into :ValorComissaoInternoDupl, :ValorComissaoExternoDupl, :ValorComissaoParceiroDupl;

Update MovDuplicata
  Set ValorComissaoInterno  = :ValorComissaoInternoDupl,
      ValorComissaoExterno  = :ValorComissaoExternoDupl,
      ValorComissaoParceiro = :ValorComissaoParceiroDupl
   Where Empresa = :Empresa and TipoDuplicata = :TipoDuplicata and CodDuplicata = :PrimeiraDuplicata and
        TipoMovimento = 3
--296292
    and EmpresaDuplicata = :Empresa;


--Subtrai a comissao da duplicata da comissao da nota
UPDATE NotasFiscais SET
  ValorComissaoInterno = ValorComissaoInterno -
                             ((ValorComissaoInterno * rs_dnvl((SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendInterno),0)) / 100),
  ValorComissaoExterno = ValorComissaoExterno -
                             ((ValorComissaoExterno * rs_dnvl((SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendExterno),0)) / 100),
  ValorComissaoParceiro = ValorComissaoParceiro -
                             ((ValorComissaoParceiro * rs_dnvl((SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendParceiro),0)) / 100),
  StatusTransacao = 1
WHERE
  Empresa = :Empresa
  AND TipoControle = :TipoControle
  AND CodControle = :CodControle
  AND ((SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendInterno) NOT IN(0,100) OR
       (SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendExterno) NOT IN(0,100) OR
       (SELECT AliqComissaoDup FROM Vendedores WHERE Codigo = NotasFiscais.CodVendParceiro) NOT IN(0,100));

END^

SET TERM ; ^

-- Renato - 360462
SET TERM ^ ;

ALTER PROCEDURE CALCULARCUSTOMEDIO (
    tipoitens integer,
    empresaestoque integer,
    empresa integer,
    nftipocontrole integer,
    nfcodcontrole integer,
    pedcodpedido integer,
    pedcompracodpedido integer,
    lannumlancamento integer,
    procodprodutoini integer,
    procodprodutofim integer,
    invdatainventario timestamp,
    dataanterior timestamp,
    dataatual timestamp,
    flagexclusao integer)
as
declare variable auxprocodproduto integer;
declare variable auxprodatamovimento timestamp;
declare variable movempresa integer;
declare variable movempresaestoque integer;
declare variable movnumlancamento integer;
declare variable movsaldoqtd numeric(13,2);
declare variable movvaloratual numeric(13,4);
declare variable movquantatual numeric(13,2);
declare variable movvaloricm numeric(9,2);
declare variable movvalorpiscofins numeric(9,2);
declare variable movtipoatualizacaocusto integer;
declare variable movtipocontrole integer;
declare variable movtipomovimento integer;
declare variable movflagmovestoque integer;
declare variable movcodcontrole integer;
declare variable movcodpedido integer;
declare variable movcodpedcompra integer;
declare variable movvalorcustomed numeric(13,4);
declare variable movvalorcustoult numeric(13,4);
declare variable movvalorcustoultreal numeric(13,4);
declare variable movvalorunitario numeric(13,4);
declare variable movvalorajustecusto numeric(13,4);
declare variable movvalorapropriacaocusto numeric(13,4);
declare variable movexistemovimento integer;
declare variable movquantatendida numeric(13,2);
declare variable movdatamovimento timestamp;
declare variable qtdcasascusto integer;
declare variable tipoicmcustomedio integer;
declare variable tipoicmultimacompra integer;
declare variable tipocustomedio integer;
declare variable flagatualizarcustomediopreco smallint;
declare variable auxvaloranterior numeric(13,4);
declare variable auxvalorultanterior numeric(13,4);
declare variable auxvalorultrealanterior numeric(13,4);
declare variable auxdatamovimento timestamp;
declare variable atuvalorcustomed numeric(13,4);
declare variable atuvalorcustoult numeric(13,4);
declare variable atuvalorcustoultreal numeric(13,4);
declare variable customedio numeric(13,4);
declare variable flaglanexcluido integer;
declare variable valoraux numeric(13,4);
declare variable salvaprimeirocusto numeric(13,4);
declare variable contador integer;
declare variable dataaux timestamp;
declare variable sqltimestamp timestamp;
declare variable empresalistapreco smallint;
declare variable cmeempcusto smallint;
declare variable cmeempprincipal smallint;
declare variable cmenummovestoque integer;
declare variable cmecustomed numeric(13,4);
declare variable cmecustoult numeric(13,4);
declare variable cmecustoultreal numeric(13,4);
begin
/*FB*/

Select QtdCasasCusto, TipoICMCustoMedio, TipoICMUltimaCompra,
       TipoCustoMedio, current_timestamp, FlagAtualizarCustoMedioPreco
 From ParamControle
 Where Empresa = :EmpresaEstoque
  Into :QtdCasasCusto, :TipoICMCustoMedio, :TipoICMUltimaCompra,
       :TipoCustoMedio, :SqlTimeStamp, :FlagAtualizarCustoMedioPreco;

--Eder - 321038
Select EmpresaListaPreco
   from Empresas
where Codigo = :Empresa
 into :EmpresaListaPreco;

--Eder 345018
Select ECusto.EmpresaCustoMedio, ECusto.EmpresaPrincipal
  From EmpresasCustoMedio ECusto
 Where (ECusto.EmpresaPrincipal = :EmpresaEstoque     --Esta Calculando CME na empresa principal
     or ECusto.EmpresaCustoMedio = :EmpresaEstoque)    --Esta calculando cme na empresa onde mantem o custo igual (Galpao)
  Into :CmeEmpCusto, :CMeEmpPrincipal;
if (CmeEmpCusto is null) then
  CmeEmpCusto = 0;
if (CMeEmpPrincipal is null) then
  CMeEmpPrincipal = 0;
  
                      

-- Renato - 280210
---- Quando processar nota fiscal de saída, com a data de processamento sendo mesma data do dia, 
---- pegar o custo médio da estoqueproduto e atualizar nos lançamentos da nota que está sendo 
---- processada.
If ( (TipoItens = 1) and
     (NFTipoControle = 2) and
     (Cast(DataAtual as Date) = Current_Date) ) then
begin
  For
    Select Mov.Empresa, Mov.NumLancamento, Mov.CodProduto,
           Mov.QuantAtendida, Mov.ValorCustoMed, Mov.ValorCustoUlt,
           Mov.ValorCustoUltReal, Mov.TipoControle, Mov.CodControle,
           Mov.CodPedido
    From MovEstoque Mov
      Left Join Produtos Pro on Pro.Codigo = Mov.CodProduto
    Where Mov.Empresa = :Empresa
      and Mov.TipoControle = :NFTipoControle
      and Mov.CodControle = :NFCodControle
      and Mov.CodProduto <> 9999999
      and Mov.CodProduto <> 8888888
      and ((Pro.TipoLote <> 1) or  --Não carrega os produtos controlados por lote unitário
           (Pro.TipoLote = 1 and Pro.FlagLoteUnitario = 0))
    Into :MovEmpresa, :MovNumLancamento, :AuxProCodProduto,
         :MovQuantAtendida, :MovValorCustoMed, :MovValorCustoUlt,
         :MovValorCustoUltReal, :MovTipoControle, :MovCodControle,
         :MovCodPedido
  Do
  begin
    AtuValorCustoMed = 0;
    AtuValorCustoUlt = 0;
    AtuValorCustoUltReal = 0;

    Select ValorCustoMed,
           ValorCustoUlt,
           ValorCustoUltReal
    From EstoqueProduto
   -- Where Empresa = :Empresa
      Where Empresa = :EmpresaEstoque
      and CodProduto = :AuxProCodProduto
    Into :AtuValorCustoMed,
         :AtuValorCustoUlt,
         :AtuValorCustoUltReal;

    If ((AtuValorCustoMed     <> MovValorCustoMed) or
        (AtuValorCustoUlt     <> MovValorCustoUlt) or
        (AtuValorCustoUltReal <> MovValorCustoUltReal)) then
    begin
      Update MovEstoque
         Set ValorCustoMed = :AtuValorCustoMed,
             ValorCustoUlt = :AtuValorCustoUlt,
             ValorCustoUltReal = :AtuValorCustoUltReal
       Where Empresa=:MovEmpresa
         and NumLancamento = :MovNumLancamento;

      if (MovCodPedido <> 0) then
      begin
        update Pedidos set
           ValorCustoMedTotal     = ValorCustoMedTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoMed, :QtdCasasCusto)
                                                       + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoMed, :QtdCasasCusto),
           ValorCustoUltTotal     = ValorCustoUltTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUlt, :QtdCasasCusto)
                                                       + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUlt, :QtdCasasCusto),
           ValorCustoUltRealTotal = ValorCustoUltRealTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUltReal, :QtdCasasCusto)
                                                           + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUltReal, :QtdCasasCusto)
         where Empresa = :MovEmpresa
           and CodPedido = :MovCodPedido;
      end

      if (MovCodControle <> 0) then
      begin
        update NotasFiscais set
           ValorCustoMedTotal     = ValorCustoMedTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoMed, :QtdCasasCusto)
                                                       + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoMed, :QtdCasasCusto),
           ValorCustoUltTotal     = ValorCustoUltTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUlt, :QtdCasasCusto)
                                                       + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUlt, :QtdCasasCusto),
           ValorCustoUltRealTotal = ValorCustoUltRealTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUltReal, :QtdCasasCusto)
                                                           + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUltReal, :QtdCasasCusto)
         where Empresa = :MovEmpresa
           and TipoControle = :MovTipoControle
           and CodControle = :MovCodControle;
      end
    end
  end
end
else
begin
  --Apaga os itens da temporaria caso exista algum 
  Delete From TempCalculoCustoMedio 
    Where SqlTimeStamp = :SQLTimeStamp;
  
                                                                               
  If ((TipoItens = 4) and (TipoCustoMedio = 1)) then
     TipoCustoMedio = 0;
  
                                                    
  If ((TipoCustoMedio = 1) and (FlagExclusao = 1)) then
     TipoCustoMedio = 0;
  
  --Gabriella - 347262
  --If ((DataAtual is null) or (TipoItens = 4)) then
  If (DataAtual is null) then
  begin
    AuxProDataMovimento = '1900-01-01';
  end
  Else
  begin
    If (DataAnterior <= DataAtual) then
    begin
      AuxProDataMovimento = DataAnterior;
    end
    Else
    begin
      AuxProDataMovimento = DataAtual;
    end
  end

  DataAux = AuxProDataMovimento - 1;

  If (TipoItens = 1) then
  begin
    Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
       Select Distinct :SqlTimeStamp, CodProduto, Null
         From MovEstoque
         Where Empresa=:Empresa
           and TipoControle = :NFTipoControle
           and CodControle = :NFCodControle;
--Eder - 347573
--           and CodProduto <> 9999999
--           and CodProduto <> 8888888
--         Group By CodProduto;
  end
  If (TipoItens = 2) then
  begin
    Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
       Select Distinct :SqlTimeStamp, CodProduto, Null
         From MovEstoque
         Where Empresa=:Empresa
           and CodPedido = :PedCodPedido;
--Eder - 347573
--           and CodProduto <> 9999999
--           and CodProduto <> 8888888
--         Group By CodProduto;
  end
  If (TipoItens = 3) then
  begin
    Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
       Select Distinct :SqlTimeStamp, CodProduto, Null
         From MovEstoque
         Where Empresa=:Empresa
           and NumLancamento = :LanNumLancamento;
--Eder - 347573
--           and CodProduto <> 9999999
--           and CodProduto <> 8888888
--         Group By CodProduto;
  end
  If (TipoItens = 4) then
  begin
      Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
         Select :SqlTimeStamp, Codigo, Null
           From Produtos
           Where Codigo >= :ProCodProdutoIni
             and Codigo <= :ProCodProdutoFim;
--Eder - 347573
--             and Codigo <> 9999999
--             and Codigo <> 8888888;
  end
  If (TipoItens = 5) then
  begin
    --Eder - 330852
    Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
       Select :SqlTimeStamp, Ip.CodProduto, Null
         From ItemPedidoCompra Ip
         Where IP.EmpresaEstoque = :EmpresaEstoque
           and IP.CodPedido = :PedCompraCodPedido
           and Ip.TipoGerarEntrada <> 0;
--Eder - 347573
--           and not Ip.CodProduto in (8888888,9999999)
--         Group By Ip.CodProduto;

  end
  If (TipoItens = 6) then
  begin
    Insert Into TempCalculoCustoMedio (SqlTimeStamp, CodProduto, NumLancamentoUltCompra,
              DataMovimentoUltCompra, SaldoMovimento)
      select :SqlTimeStamp, RegInv.CodProduto, 0, Max(RegInv.DataInventario), --Max(RegInv.QuantEstoque)
          (select QuantEstoque from RegistroInventario 
              where DataInventario = Max(RegInv.DataInventario) and
                    CodProduto = RegInv.CodProduto and
                    EmpresaEstoque = RegInv.EmpresaEstoque)
      From RegistroInventario RegInv
      where RegInv.EmpresaEstoque = :EmpresaEstoque
  
        --and RegInv.DataInventario < :InvDataInventario
        and exists(Select RegNov.CodProduto
                   From RegistroInventario RegNov
                   Where RegNov.EmpresaEstoque = :EmpresaEstoque
                     and RegNov.CodProduto = RegInv.CodProduto
                     and RegNov.DataInventario = :InvDataInventario)
      Group By RegInv.CodProduto, RegInv.EmpresaEstoque;
  end
  If (TipoItens = 7) then --Gabriella - 344416 Apropriação de Custo
  begin
    Insert Into TempCalculoCustoMedio(SqlTimeStamp, CodProduto, NumLancamentoUltCompra)
    Select :SqlTimeStamp, Aprop.CodProduto, M.NumLancamento
     From ApropCustoItem Aprop
     Left Join MovEstoque M on M.Empresa = Aprop.Empresa
                           and M.NumLancamento = Aprop.NumMovEstoqueGerado                                                                         
     Where Aprop.Empresa=:Empresa
      and Aprop.CodApropCusto = :LanNumLancamento
      and Aprop.CodProduto <> 9999999                                      
      and Aprop.CodProduto <> 8888888;
  end


  --Eder - 347573 - Melhoria de performance
  Delete From TempCalculoCustoMedio
   Where SqlTimeStamp = :SqlTimeStamp
     and CodProduto in(9999999,8888888);

  --Eder 330852
  --Calcula o Lançamento de Ultima Compra.
  if ((TipoItens in (1,2,3,5)) or
      ((TipoItens = 4) and (DataAux is not null))) then
  begin
    Update TempCalculoCustoMedio
       Set NumlancamentoUltCompra = (Select First 1 Mov.NumLancamento From  MovEstoque Mov
                                       Left Join Operacoes Opr on Opr.Codigo = Mov.CodOperacao
                                      Where Mov.EmpresaEstoque = :EmpresaEstoque
                                        And Mov.CodProduto     = TempCalculoCustoMedio.CodProduto
                                        And Mov.TipoMovimento  = 1
                                        And Mov.FlagMovEstoque = 1
                                        And Opr.FlagCustoMedio = 1
                                        And Mov.DataMovimento  <= :DataAux
                                        And Mov.ValorUnitario > 0
                                      Order By DataMovimento Desc, NumLancamento Asc)
      Where SqlTimeStamp = :SqlTimeStamp;
  end


  --Pega a data da Ultima compra dos itens e o saldo do estoque atual
  if (TipoItens <> 6) then
  begin
    Update TempCalculoCustoMedio
     Set DataMovimentoUltCompra = (Select First 1 Mov.DataMovimento From MovEstoque Mov
                                    Where Mov.EmpresaEstoque=:EmpresaEstoque
                                      and Mov.Numlancamento = TempCalculoCustoMedio.NumLancamentoUltCompra)
         ,SaldoMovimento = coalesce((Select Sum(Es.QuantEstoque) From EstoqueProduto Es
                                      where Es.CodProduto = TempCalculoCustoMedio.CodProduto
                                        and Es.Empresa in (Select Emp.EmpresaEstoque From Empresas Emp
                                                            Where Emp.Codigo = :EmpresaEstoque
                                                           Union
                                                           Select ECusto.EmpresaCustoMedio From EmpresasCustoMedio ECusto
                                                            Where ECusto.EmpresaPrincipal = :EmpresaEstoque)),0)
    Where SqlTimeStamp = :SqlTimeStamp;
  
  --Grava o Saldo (retroativo) desconsiderando o saldo atual, até o lançamento atual
    Update TempCalculoCustoMedio
    Set SaldoMovimento = SaldoMovimento + rs_dnvl((Select 
                 Sum(Case When M.TipoMovimento = 1
                           and ((M.DataMovimento > TAux.DataMovimentoUltCompra)
                                or (TAux.DataMovimentoUltCompra is null))
                          Then (M.QuantMovimentada * -1)
                          When M.TipoMovimento = 1
                           and M.DataMovimento = TAux.DataMovimentoUltCompra
                           and M.NumLancamento >= TAux.NumLancamentoUltCompra
                          Then (M.QuantMovimentada * -1)
                          When M.TipoMovimento = 2
                           and ((M.DataMovimento > TAux.DataMovimentoUltCompra)
                            or (TAux.DataMovimentoUltCompra is null))
                          Then M.QuantMovimentada
                          When M.TipoMovimento = 2
                           and M.DataMovimento = TAux.DataMovimentoUltCompra
                          Then M.QuantMovimentada
                          Else 0 End)
                 From TempCalculoCustoMedio TAux,  MovEstoque M
                 Where TAux.CodProduto = TempCalculoCustoMedio.CodProduto
                   and TAux.SqlTimeStamp = TempCalculoCustoMedio.SqlTimeStamp
                   and M.CodProdutoMov = TAux.CodProduto
                   and M.Empresa in 
                       (Select Emp.Codigo From Empresas Emp
                         Where Emp.Codigo = :EmpresaEstoque
                         Union
                        Select ECusto.EmpresaCustoMedio From EmpresasCustoMedio ECusto 
                         Where ECusto.EmpresaPrincipal = :EmpresaEstoque)
                   and M.TipoMovimento in(1,2)
                   and M.FlagMovEstoque=1
                   and ((M.DataMovimento >= TAux.DataMovimentoUltCompra) or
                        (TAux.DataMovimentoUltCompra is null))),0)
    Where SqlTimeStamp = :SqlTimeStamp;
  end
  
  --Abre o cursor dos produtos a partir dos dados da temporaria      
  --Atenção: Não carrega os produtos que são controlados por Lote Unitário              
  For
     Select TempCalculoCustoMedio.CodProduto,
         case when :TipoItens <> 6 then rs_dnvl(Mov.ValorCustoMed,0)
  --Rafael chamado 255209
  --when :TipoItens = 6 then rs_dnvl(case when Inv.QuantEstoque > 0
  --                                                  then Inv.ValorTotalCustoMed / Inv.QuantEstoque
  --                                                  else 0 end, 0)
        end,
         case when :TipoItens <> 6 then rs_dnvl(Mov.ValorCustoUlt,0)
              when :TipoItens = 6 then 0 end,
         case when :TipoItens <> 6 then rs_dnvl(Mov.ValorCustoUltReal,0)
              when :TipoItens = 6 then 0 end,
         case when :TipoItens <> 6 then Mov.DataMovimento
              when :TipoItens = 6 then TempCalculoCustoMedio.datamovimentoultcompra end,
         rs_dnvl(TempCalculoCustoMedio.SaldoMovimento,0)
       From TempCalculoCustoMedio
       Left Join Produtos Pro on Pro.Codigo = TempcalculoCustoMedio.CodProduto
       Left Join MovEstoque Mov on Mov.EmpresaEstoque=:EmpresaEstoque
                         and Mov.Numlancamento = TempCalculoCustoMedio.NumLancamentoUltCompra
                         and :TipoItens <> 6
       left join RegistroInventario Inv on Inv.CodProduto = TempCalculoCustoMedio.CodProduto
                         and Inv.EmpresaEstoque = :EmpresaEstoque
                         and Inv.DataInventario = tempcalculocustomedio.DataMovimentoUltCompra
                         and :TipoItens = 6
      Where TempCalculoCustoMedio.SqlTimeStamp = :SqlTimeStamp
        and ((Pro.TipoLote <> 1) or  --Não carrega os produtos controlados por lote unitário
             (Pro.TipoLote = 1 and Pro.FlagLoteUnitario = 0))
      Into :AuxProCodProduto, :AuxValorAnterior,
           :AuxValorUltAnterior, :AuxValorUltRealAnterior,
           :AuxDataMovimento, :MovSaldoQtd
  Do
    begin
      CustoMedio = AuxValorAnterior;
      SalvaPrimeiroCusto = AuxValorAnterior;
      AtuValorCustoMed = 0;
      AtuValorCustoUlt = 0;
      AtuValorCustoUltReal = 0;
  
      Contador = 0;
  
      if (AuxDataMovimento is null) then
      begin
         DataAux = '1899-01-01';
      end
      Else
      begin
         DataAux = AuxDatamovimento;
      end
  
      MovExisteMovimento = 0;
  
      For
      Select M.Empresa, M.EmpresaEstoque, M.NumLancamento,
          Case When M.QuantMovimentada > 0 then (M.ValorUnitario * M.QuantMovimentada)
               Else M.ValorUnitario End as ValorAtual,
                                  
          Case When coalesce(Oper.TipoCalculoICMCustoMedio,0) = 0 and M.AliqICM > 0 and M.ValorBaseICM > 0
               -- Renato - 360462
               --Then Rs_RoundDec((M.ValorBaseICM * M.AliqICM) / 100,2)
               Then Rs_RoundDec((M.ValorBaseICM * (M.AliqICM + Coalesce(MI.AliqComplICM,0))) / 100,2)
               Else 0 End as ValorICM,
                                  
        --Eder - 329685     
        --Case When isnull(Oper.TipoCalculoICMCustoMedio,0) <> 0 Then 0 Else
             Rs_RoundDec(((Case When M.QuantAtendida > 0
                               Then Rs_RoundDec((M.ValorBruto - Rs_RoundDec((M.ValorBruto * M.PercDesconto / 100),2)) * M.QuantAtendida,2)
                               Else 0 End +       
                          Case When coalesce(Oper.FlagIPISobrePisCofins,0) = 1
                               Then Rs_RoundDec((M.ValorBruto - Rs_RoundDec((M.ValorBruto * M.PercDesconto / 100),2)) * M.QuantAtendida * M.AliqIPI / 100,2)
                               Else 0 End)                              
                          * M.AliqPISCOFINS) / 100,2) as ValorPISCOFINS,
                                  
        M.QuantMovimentada,                                                              
          
        --Eder - 307257                                  
        --Case When isnull(Oper.FlagCustoMedio,0) = 1 and M.TipoMovimento = 1          
        --     Then 1 Else 0 End as EntradaOK,          
        Case When M.TipoMovimento = 1 and coalesce(Oper.FlagCustoMedio,0) = 1
             Then Case     
                       When M.QuantAtendida = 0 And M.ValorUnitario = 0 and M.ValorTotal > 0           
                           Then 2  --2 - Apropriação de custo no custo médio          
                       When coalesce(Oper.FlagEstoqueReservadoContabil,0) = 0    --Calcula independente de ser entrada reservada (CALCULO PADRAO)
                           Then 1  --1 - Calculo do Custo Médio          
                       When coalesce(Oper.FlagEstoqueReservadoContabil,0) = 1 and M.FlagMovEstoque <> 0   --Só calcula se NÃO for entrada reservada
                           Then 1  --1 - Calculo do Custo Médio          
                       Else 0 End    
             Else 0 End as TipoAtualizacaoCusto,                                  
        M.TipoMovimento, M.FlagMovEstoque, M.TipoControle,                                  
        M.CodControle, M.CodPedido, M.CodPedCompra,           
        M.ValorCustoMed, M.ValorCustoUlt, M.ValorCustoUltReal,           
        M.ValorAjusteCusto, M.ValorUnitario, M.QuantAtendida,
        Case When M.QuantAtendida = 0 And M.ValorUnitario = 0 and M.ValorTotal > 0  
             Then M.ValorTotal Else 0 End as ValorApropriacaoCusto,  --Valor da apropriação é armazenado totalizado
        M.DataMovimento
     From MovEstoque M          
     Left Join Operacoes Oper on Oper.Codigo = M.CodOperacao

     --Renato - 360462
     Left Join MovEstoqueImposto MI on M.Empresa = MI.Empresa
                                   and M.NumLancamento = MI.NumLancamento

     Where M.CodProduto =  :AuxProCodProduto
       --Eder - 329718
       --and M.EmpresaEstoque = @EmpresaEstoque 
       and M.EmpresaEstoque in (Select Emp.EmpresaEstoque From Empresas Emp
                                 Where Emp.Codigo = :EmpresaEstoque
                                Union
                                Select ECusto.EmpresaCustoMedio From EmpresasCustoMedio ECusto 
                                 Where ECusto.EmpresaPrincipal = :EmpresaEstoque)

      and ((:AuxDataMovimento is Null) or
          (M.DataMovimento = :AuxDataMovimento and M.TipoMovimento > 0 and :TipoItens <> 6) or
          (M.DataMovimento > :AuxDataMovimento))
     Order By M.DataMovimento, M.TipoMovimento, M.NumLancamento          
     Into :MovEmpresa, :MovEmpresaEstoque, :MovNumLancamento,
          :MovValorAtual, :MovValorICM, :MOVVALORPISCOFINS,
          :MovQuantAtual, :MovTipoAtualizacaoCusto,
          :MovTipoMovimento, :MovFlagMovEstoque,
          :MovTipoControle, :MovCodControle, :MovCodPedido, :MovCodPedCompra,
          :MovValorCustoMed, :MovValorCustoUlt, :MovValorCustoUltReal,
          :MovValorAjusteCusto, :MovValorUnitario, :MovQuantAtendida,
          :MovValorApropriacaoCusto, :MovDataMovimento
      do
      begin
        Contador = Contador + 1;
                                                                 
        FlagLanExcluido  = 0;
                                                                             
        If (FlagExclusao = 1) then
        begin
           If (((TipoItens = 1) and (MovEmpresa = Empresa)
                 and (MovTipoControle = 1) and (MovCodControle = NFCodControle)) or
               ((TipoItens = 2) and (MovEmpresa = Empresa)
                 and (MovCodPedido = PedCodPedido)) or
               ((TipoItens = 3) and (MovEmpresa = Empresa)
                 and (MovNumLancamento = LanNumLancamento)) or
               ((TipoItens = 5) and (MovEmpresa = Empresa)
                 and (MovCodPedido=0) and (MovTipoMovimento = 1) and (MovCodPedCompra=:PedCompraCodPedido))
                 ) then
              begin
                MovTipoAtualizacaoCusto = 0;
                FlagLanExcluido = 1;
              end
        end         
  

       --Eder - 307377
       --Calculo de Custo Medio - Entradas que Calculam Custo Medio
       if ((MovTipoAtualizacaoCusto = 1) and
           (MovEmpresaEstoque = EmpresaEstoque)) then --Eder - 329718
           begin
             If (TipoICMCustoMedio = 1) then
             begin
                ValorAux = MovValorAtual - MovValorICM;
             end
             Else
             If (TipoICMCustoMedio = 2) then
             begin
                ValorAux = MovValorAtual - MovValorICM - MovValorPISCOFINS;
             end
             Else
                ValorAux = MovValorAtual;
  
               If ((MovSaldoQtd > 0) and (MovQuantAtual > 0)) then
             begin
                CustoMedio = ((AuxValorAnterior * MovSaldoQtd) + ValorAux)
                                   / (MovSaldoQtd + MovQuantAtual);
             end
             Else
                If (MovQuantAtual > 0) then
                   CustoMedio =  ValorAux / MovQuantAtual;
             if ((Contador = 1) and (not (AuxDatamovimento is null)) and (:TipoItens <> 6)) then
             begin
                CustoMedio = rs_Rounddec(:SalvaPrimeiroCusto,:QtdCasasCusto);
             end
             Else
                CustoMedio = rs_Rounddec(:CustoMedio,:QtdCasasCusto);
  
             AuxValorAnterior = CustoMedio;
  
             --Custo da Ultima Compra
             If (TipoICMUltimaCompra = 1) then
             begin
                ValorAux = MovValorAtual - MovValorICM;
             end
             Else
             If (TipoICMUltimaCompra = 2) then
             begin
                ValorAux = MovValorAtual - MovValorICM - MovValorPISCOFINS;
             end
             Else
                ValorAux = MovValorAtual;
             If (MovQuantAtual > 0) then
             begin
                AuxValorUltAnterior = Rs_RoundDec(ValorAux / MovQuantAtual,QtdCasasCusto);
             end
             Else
                AuxValorUltAnterior = Rs_RoundDec(ValorAux,QtdCasasCusto);
  
             --Custo da Ultima Compra REAL é sempre sem impostos
             ValorAux = MovValorAtual - MovValorICM - MovValorPISCOFINS;
             If (MovQuantAtual > 0) then
             begin
                AuxValorUltRealAnterior = Rs_RoundDec(ValorAux / MovQuantAtual,QtdCasasCusto);
             end
             Else
                AuxValorUltRealAnterior = Rs_RoundDec(ValorAux,QtdCasasCusto);
             AtuValorCustoMed = AuxValorAnterior;
             AtuValorCustoUlt = AuxValorUltAnterior;
             AtuValorCustoUltReal = AuxValorUltRealAnterior;
           end

        --Eder - 307377
        --Apropriação do Custo médio / Lançamentos sem valor unitario e com Valor Ajuste de Custo
        if ((MovTipoAtualizacaoCusto = 2) and (MovSaldoQtd > 0) and
            (MovEmpresaEstoque = EmpresaEstoque)) then --Eder - 329718
        begin
          AtuValorCustoMed = Rs_RoundDec(((MovSaldoQtd * AtuValorCustoMed) + MovValorApropriacaoCusto) / MovSaldoQtd, QtdCasasCusto);
          AuxValorAnterior = AtuValorCustoMed;
        end

        If ((MovFlagMovEstoque = 1) and (FlagLanExcluido  = 0)) then
        begin
           If (MovTipoMovimento = 1) then
           begin
              MovSaldoQtd = MovSaldoQtd + MovQuantAtual;
           end
           Else
              If (MovTipoMovimento = 2) then
                 MovSaldoQtd = MovSaldoQtd - MovQuantAtual;
        end
  
  -- lanc. de saida com ajuste de custo, foi gerado pelo programa de juncao na opcao
  -- desmembrar, usa este campo pra poder chegar ao valor original, antes da reducao
  -- Cálculo: soma ao valor unitario o custo, obtendo o valor original antes do desmembramento,
  --          acha o percentual que foi reduzido e reajusta os valores de custo.
        If ((MovTipoMovimento = 2) and (MovValorAjusteCusto <> 0) and
            (MovEmpresaEstoque = EmpresaEstoque)) then --Eder - 329718
        begin
          AtuValorCustoMed     = ((MovValorUnitario)/(MovValorUnitario+MovValorAjusteCusto)) * AtuValorCustoMed;
          AtuValorCustoUlt     = ((MovValorUnitario)/(MovValorUnitario+MovValorAjusteCusto)) * AtuValorCustoUlt;
          AtuValorCustoUltReal = ((MovValorUnitario)/(MovValorUnitario+MovValorAjusteCusto)) * AtuValorCustoUltReal;
        end
  
  
        If ((TipoCustoMedio = 0 and :TipoItens <> 6) or
            ((TipoCustoMedio = 1) and
               (((TipoItens = 1) and (MovEmpresa=Empresa) and (MovTipoControle=NFTipoControle)
                     and (MovCodControle = NFCodControle)) or
                ((TipoItens = 2) and (MovEmpresa=Empresa) and (MovCodPedido=PedCodPedido)) or
                ((TipoItens = 3) and (MovEmpresa=Empresa) and (MovNumLancamento=LanNumLancamento)) or
                ((TipoItens = 5) and (MovEmpresa=:Empresa) and (MovTipoMovimento=1) and (MovCodPedido=0)
                                 and (MovCodPedCompra = :PedCompraCodPedido))
               ))
           ) then
        begin

          --Eder - 345018
          --Manter custo de empresa igual a empresa principal somente quando está na empresa que recebe o custo (Ex: Galpao GOOP)
          if ((CmeEmpCusto > 0)  and (CmeEmpCusto = EmpresaEstoque)) then
          begin
            --Pega o custo medio da empresa principal, na data do movimento
            select numlancamento from UltimaCompraMovEstoque(:CmeEmpPrincipal,:AuxProCodProduto,
                                      :MovDataMovimento,1,0)  --Considera se houver, a ultima entrada do dia
               into :CmeNumMovEstoque;
      
            Select First 1 Mov.ValorCustoMed, Mov.ValorCustoUlt, Mov.ValorCustoUltReal
              From MovEstoque Mov
             Where Mov.EmpresaEstoque = :CmeEmpPrincipal
               and Mov.NumLancamento = :CmeNumMovEstoque
               Into :AtuValorCustoMed, :AtuValorCustoUlt, :AtuValorCustoUltReal;
          end

          If ((MovEmpresaEstoque = EmpresaEstoque) and --Eder - 329718
              (AtuValorCustoMed     <> MovValorCustoMed or
               AtuValorCustoUlt     <> MovValorCustoUlt or
               AtuValorCustoUltReal <> MovValorCustoUltReal)) then
          begin
            Update MovEstoque
               Set ValorCustoMed = :AtuValorCustoMed,
                   ValorCustoUlt = :AtuValorCustoUlt,
                   ValorCustoUltReal = :AtuValorCustoUltReal
             Where Empresa=:MovEmpresa
               and NumLancamento = :MovNumLancamento;
  
            --Eder - Chamado 261402
            if (MovCodPedido <> 0) then
            begin
              update Pedidos set
                 ValorCustoMedTotal     = ValorCustoMedTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoMed, :QtdCasasCusto)
                                                             + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoMed, :QtdCasasCusto),
                 ValorCustoUltTotal     = ValorCustoUltTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUlt, :QtdCasasCusto)
                                                             + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUlt, :QtdCasasCusto),
                 ValorCustoUltRealTotal = ValorCustoUltRealTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUltReal, :QtdCasasCusto)
                                                                 + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUltReal, :QtdCasasCusto)
               where Empresa = :MovEmpresa
                 and CodPedido = :MovCodPedido;
            end
  
            --Eder - Chamado 261402
            if (MovCodControle <> 0) then
            begin
              update NotasFiscais set
                 ValorCustoMedTotal     = ValorCustoMedTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoMed, :QtdCasasCusto)
                                                             + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoMed, :QtdCasasCusto),
                 ValorCustoUltTotal     = ValorCustoUltTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUlt, :QtdCasasCusto)
                                                             + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUlt, :QtdCasasCusto),
                 ValorCustoUltRealTotal = ValorCustoUltRealTotal - Rs_RoundDec(:MovQuantAtendida * :MovValorCustoUltReal, :QtdCasasCusto)
                                                                 + Rs_RoundDec(:MovQuantAtendida * :AtuValorCustoUltReal, :QtdCasasCusto)
               where Empresa = :MovEmpresa
                 and TipoControle = :MovTipoControle
                 and CodControle = :MovCodControle;
            end
          end
        end
        AtuValorCustoMed = :AuxValorAnterior;
        AtuValorCustoUlt = :AuxValorUltAnterior;
        AtuValorCustoUltReal = :AuxValorUltRealAnterior;
      end
  
      --CASO NÃO EXISTA MOVIMENTAÇÃO DO PRODUTO E SEJA ATUALIZAÇÃO DE CUSTO MÉDIO PELO REGISTRO DE INVENTARIO
      --PEGA O CUSTO MEDIO DO REGISTRO DE INVENTARIO ANTERIOR
      if ((:MovExisteMovimento = 0) and (:TipoItens = 6)) then
        AtuValorCustoMed = CustoMedio;
  
     --Atualiza o Custo Medio do EstoqueProduto
      if (:TipoItens <> 6) then
      begin
        Update EstoqueProduto
          Set ValorCustoMed     = coalesce(:AtuValorCustoMed,0),
              ValorCustoUlt     = coalesce(:AtuValorCustoUlt,0),
              ValorCustoUltReal = coalesce(:AtuValorCustoUltReal,0),
              StatusTransacao   = 1
        Where Empresa = :EmpresaEstoque
          and CodProduto = :AuxProCodProduto;

     --Eder - 345018
     --Verifica se existe configuração para utilizar uma outra empresa para calcular custo medio e
     --para Manter o custo medio em outras empresas (Ex: Galpao GOOP). 
     if (CmeEmpCusto > 0) then
     begin
       Select Es.ValorCustoMed,  Es.ValorCustoUlt, Es.ValorCustoUltReal
         From EstoqueProduto Es 
        Where Es.CodProduto = :AuxProCodProduto
         and Es.Empresa = :CmeEmpPrincipal
        Into :CmeCustoMed, :CmeCustoUlt, :CmeCustoUltReal;

       Update EstoqueProduto    
          Set ValorCustoMed     = coalesce(:CmeCustoMed,0),
              ValorCustoUlt     = coalesce(:CmeCustoUlt,0),
              ValorCustoUltReal = coalesce(:CmeCustoUltReal,0),
              StatusTransacao   = 1    
       Where CodProduto = :AuxProCodProduto
         and Empresa = :CmeEmpCusto;
     end

      --Eder = 321038
      --Atualiza o preço de custo com o custo médio
      If ((:FlagAtualizarCustoMedioPreco = 1) and (coalesce(:AtuValorCustoMed,0) > 0)) then
      begin
        Update ItemListaPreco
           Set ValorCustoBruto = coalesce(:AtuValorCustoMed,0),
               ValorCustoLiquido = (Select ValorCusto From CalculaCustoLiquido(:EmpresaEstoque, coalesce(:AtuValorCustoMed,0),
                                       ItemListaPreco.PercDesconto1, ItemListaPreco.PercDesconto2, ItemListaPreco.PercDesconto3, ItemListaPreco.PercDesconto4, ItemListaPreco.PercDesconto5,
                                       ItemListaPreco.PercAcrescimo1, ItemListaPreco.PercAcrescimo2, ItemListaPreco.PercAcrescimo3, ItemListaPreco.PercFrete,
                                       ItemListaPreco.FlagIPIVenda, ItemListaPreco.AliqIPI, ItemListaPreco.PercICMCusto, ItemListaPreco.PercPISCOFINSCusto, ItemListaPreco.PercDescontoAdicional,
                                       ItemListaPreco.PercSubTrib, ItemListaPreco.PercAcrescimoInc1, ItemListaPreco.PercAcrescimoInc2, ItemListaPreco.PercAcrescimoInc3,
                                       ItemListaPreco.PercFreteInc, ItemListaPreco.PercDescontoNaoInc))
          Where CodProduto = :AuxProCodProduto
            and FlagPrincipal = 1
            and Empresa = :EmpresaListaPreco;
      end

       --Fim do Loop do MovEstoque do Produto
      end
      else if (:TipoItens = 6) then
      begin
        if (DataAux is not null) then
        begin
          Select
           case when RI.QuantEstoque > 0 then (RI.ValorTotalCustoMed / RI.QuantEstoque) else 0 end
          from RegistroInventario RI
          where RI.DataInventario =  :DATAANTERIOR
            and RI.CodProduto     =  :AuxProCodProduto
            and RI.EmpresaEstoque =  :EmpresaEstoque
          into
         :AtuValorCustoMed;
  
         if (:AtuValorCustoMed < 0) then
           AtuValorCustoMed = 0;
       end
     
      if ((AtuValorCustoMed is null) or(AtuValorCustoMed=0)) then
      begin    
        Select FIRST 1
         Mov.ValorCustoMed
        From MovEstoque Mov                              
        Left Join Operacoes Opr on Opr.Codigo = Mov.CodOperacao 
        where                             
            Mov.EmpresaEstoque = :EmpresaEstoque
        And Mov.CodProduto     = :AuxProCodProduto
        And Mov.TipoMovimento = 1    
    
        And Mov.DataMovimento  < :InvDataInventario
        And Opr.FlagCustoMedio = 1
        And Opr.TipoMovimento in(0,3) 
        Order By Mov.DataMovimento Desc, Mov.NumLancamento Desc   
        into
        :AtuValorCustoMed;
      end
      
      if (AtuValorCustoMed is null) then
       AtuValorCustoMed = 0;
  
        update registroinventario
          set ValorTotalCustoMed = rs_rounddec(coalesce(:AtuValorCustoMed, 0) * QuantEstoque, :qtdcasascusto)
        where CodProduto     = :AuxProCodProduto
          and EmpresaEstoque = :EmpresaEstoque
          and DataInventario = :InvDataInventario;
      end
    end
End

--Quando Houver algum produto com lote unitario, cria os lotes na tabela temporaria para     
If  ((TipoItens <> 6) and
     ( (Exists(Select *
           From TempCalculoCustoMedio T    
           Left Join Produtos Pro on Pro.Codigo = T.CodProduto    
           Where T.SqlTimeStamp = :SqlTimeStamp
             and Pro.TipoLote = 1    
             and Pro.FlagLoteUnitario = 1))
     or ((TipoItens = 1) and (NFTipoControle = 2) and (Cast(DataAtual as Date) = Current_Date)) )) Then
begin    
  Execute Procedure CalcularCustoMedioLote
       :SqlTimeStamp, :TipoItens, :EmpresaEstoque,
       :Empresa, :NFTipoControle, :NFCodControle, :PedCodPedido,
       :PedCompraCodPedido, :LanNumLancamento, :ProCodProdutoIni, :ProCodProdutoFim;
end    

--Apaga os itens quer foram usados na temporaria
--Delete From TempCalculoCustoMedio
--  Where SqlTimeStamp = :SQLTimeStamp;


END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULARCUSTOMEDIOLOTE (
    sqltimestamp timestamp,
    tipoitens smallint,
    empresaestoque smallint,
    empresa smallint,
    nftipocontrole smallint,
    nfcodcontrole integer,
    pedcodpedido integer,
    pedcompracodpedido integer,
    lannumlancamento integer,
    procodprodutoini integer,
    procodprodutofim integer)
as
declare variable svcodproduto integer;
declare variable svcodlote varchar(20);
declare variable svlocalizacao varchar(20);
declare variable codproduto integer;
declare variable codlote varchar(20);
declare variable localizacao varchar(20);
declare variable movempresa smallint;
declare variable movnumlancamento integer;
declare variable valorunitario numeric(11,2);
declare variable valoricm numeric(11,2);
declare variable valorpiscofins numeric(11,2);
declare variable valorcustofor numeric(11,2);
declare variable valorcustomed numeric(11,2);
declare variable valorcustoult numeric(11,2);
declare variable valorcustoultreal numeric(11,2);
declare variable quantatendida numeric(11,4);
declare variable qtdcasascusto smallint;
declare variable tipoicmcustomedio smallint;
declare variable tipoicmultimacompra smallint;
declare variable valorcustofortotal numeric(18,4);
declare variable valorcustoulttotal numeric(18,4);
declare variable valorcustoultrealtotal numeric(18,4);
declare variable valorcustomedtotal numeric(18,4);
declare variable valorcustosertotal numeric(18,4);
declare variable movcodpedido integer;
declare variable movtipocontrole integer;
declare variable movcodcontrole integer;
declare variable flagatualizarcustofor integer;
declare variable tipoatualizacaocusto smallint;
declare variable valorapropriacaocusto numeric(13,4);
begin


--Leitura do Parametro de Controle da empresa principal
Select Par.QtdCasasCusto, Par.TipoICMCustoMedio, Par.TipoICMUltimaCompra,
       --Eder - Chamado 276648
       ---Não atualizar custo do fornecedor para a DINAMAR
       Case When not Emp.ID in ('MEGAREMI','MEGA REMI','DINAMAR')
            Then 1 Else 0 End
 From ParamControle Par
 Left Join Empresas Emp on Emp.Codigo = :EmpresaEstoque
 Where Par.Empresa = :EmpresaEstoque
  into :QtdCasasCusto, :TipoICMCustoMedio, :TipoICMUltimaCompra, :FlagAtualizarCustoFor;
  
  
If (TipoItens = 1) then
begin              
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,   
                                        CodLote, Localizacao)              
     Select Distinct :SqlTimeStamp, Mov.CodProduto,
            MovAux.CodLote, MovAux.Localizacao  
       From MovEstoque Mov  
       Left Join MovEstoqueAux MovAux on MovAux.Empresa = Mov.Empresa  
                                     and MovAux.NumLancamento = Mov.NumLancamento  
       Left Join Produtos Pro on pro.Codigo = Mov.CodProduto  
       Where Mov.Empresa=:Empresa
         and Mov.TipoControle = :NFTipoControle
         and Mov.CodControle = :NFCodControle
         and Mov.CodProduto <> 9999999              
         and Mov.CodProduto <> 8888888  
         and Pro.TipoLote = 1  
         and Pro.FlagLoteUnitario = 1      
         and MovAux.CodLote <> '';
end              
Else  
If (TipoItens = 2) then
begin              
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,   
                                        CodLote, Localizacao)              
     Select Distinct :SqlTimeStamp, Mov.CodProduto,
            MovAux.CodLote, MovAux.Localizacao  
       From MovEstoque Mov  
       Left Join MovEstoqueAux MovAux on MovAux.Empresa = Mov.Empresa  
                                     and MovAux.NumLancamento = Mov.NumLancamento  
       Left Join Produtos Pro on pro.Codigo = Mov.CodProduto  
       Where Mov.Empresa=:Empresa
         and Mov.CodPedido = :PedCodPedido
         and Mov.CodProduto <> 9999999              
         and Mov.CodProduto <> 8888888  
         and Pro.TipoLote = 1  
         and Pro.FlagLoteUnitario = 1      
         and MovAux.CodLote <> '';
end              
Else  
If (TipoItens = 3) then
begin              
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,   
                                        CodLote, Localizacao)              
     Select Distinct :SqlTimeStamp, Mov.CodProduto,
            MovAux.CodLote, MovAux.Localizacao  
       From MovEstoque Mov  
       Left Join MovEstoqueAux MovAux on MovAux.Empresa = Mov.Empresa  
                                     and MovAux.NumLancamento = Mov.NumLancamento  
       Left Join Produtos Pro on pro.Codigo = Mov.CodProduto  
       Where Mov.Empresa=:Empresa
         and Mov.NumLancamento = :LanNumLancamento
         and Mov.CodProduto <> 9999999              
         and Mov.CodProduto <> 8888888  
         and Pro.TipoLote = 1  
         and Pro.FlagLoteUnitario = 1      
         and MovAux.CodLote <> '';
end              
Else  
If (TipoItens = 4) then
begin                
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,   
                                        CodLote, Localizacao)              
     Select Distinct :SqlTimeStamp, Pro.Codigo,
            Lotes.CodLote, Lotes.Localizacao  
       From Produtos Pro  
       Left Join Lotes on Lotes.EmpresaEstoque = :EmpresaEstoque
                      and Lotes.CodProduto = Pro.Codigo  
       Where Pro.Codigo between :ProCodProdutoIni and :ProCodProdutoFim
         and Pro.Codigo not in(9999999,8888888)  
         and Pro.TipoLote = 1  
         and Pro.FlagLoteUnitario = 1      
         and Lotes.CodLote <> '';
end                
Else  
If (TipoItens = 5) then
begin              
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,   
                                        CodLote, Localizacao)              
     Select Distinct :SqlTimeStamp, Mov.CodProduto,
            MovAux.CodLote, MovAux.Localizacao  
       From MovEstoque Mov  
       Left Join MovEstoqueAux MovAux on MovAux.Empresa = Mov.Empresa  
                                     and MovAux.NumLancamento = Mov.NumLancamento  
       Left Join Produtos Pro on pro.Codigo = Mov.CodProduto  
       Where Mov.Empresa=:Empresa
         and Mov.TipoMovimento = 1                 
         and Mov.CodPedCompra = :PedCompraCodPedido
         and Mov.CodProduto <> 9999999              
         and Mov.CodProduto <> 8888888  
         and Pro.TipoLote = 1  
         and Pro.FlagLoteUnitario = 1      
         and MovAux.CodLote <> '';
end
if (TipoItens = 7) then --Gabriella - 344416 Apropriação de Custo
begin                               
  Insert Into TempCalculoCustoMedioLote(SqlTimeStamp, CodProduto,
                                        CodLote, Localizacao)                                                                        
    Select Distinct :SqlTimeStamp, Aprop.CodProduto, MovAux.CodLote, MovAux.Localizacao
     From ApropCustoItem Aprop                                                                         
     Left Join MovEstoqueAux MovAux on MovAux.Empresa = Aprop.Empresa                    
                                   and MovAux.NumLancamento = Aprop.NumMovEstoqueGerado
     Left Join Produtos Pro on pro.Codigo = Aprop.CodProduto                                                                           
     Where Aprop.Empresa = :Empresa
      and Aprop.CodApropCusto = :LanNumLancamento
      and Aprop.CodProduto <> 9999999                                      
      and Aprop.CodProduto <> 8888888
      and Pro.TipoLote = 1                    
      and Pro.FlagLoteUnitario = 1                        
      and MovAux.CodLote <> '';
end

SvCodProduto = null;
SvCodLote = null;
SvLocalizacao = null;
  
For
  Select T.CodProduto, T.CodLote, T.Localizacao,                 
         Mov.Empresa, Mov.NumLancamento,
         Case When Mov.QuantAtendida = 0 Then 1 Else Mov.QuantAtendida End as QuantAtendida,                
         Mov.ValorUnitario,       
         --Gabriella - 295380      
         --Round((Mov.ValorBaseICM * Mov.AliqICM) / 100,2) as ValorICM,       
         Case When coalesce(Oper.TipoCalculoICMCustoMedio,0) = 0
              -- Then Rs_RoundDec((Mov.ValorBaseICM * Mov.AliqICM) / 100,2) Else 0 End as ValorICM,
              Then Rs_RoundDec((Mov.ValorBaseICM * (Mov.AliqICM + Coalesce(MI.AliqComplICM,0)) ) / 100,2) Else 0 End as ValorICM,
         --Ronaldo Chamado 326721
         --Rs_RoundDec((Mov.QuantAtendida * Mov.ValorUnitario * Mov.AliqPISCOFINS) / 100,2) as ValorPISCOFINS,
         Case When coalesce(Oper.TipoCalculoICMCustoMedio,0) = 0
              Then Rs_RoundDec(((Case When Mov.QuantAtendida > 0
                               Then Rs_RoundDec((Mov.ValorBruto - Rs_RoundDec((Mov.ValorBruto * Mov.PercDesconto / 100),2)) * Mov.QuantAtendida,2)
                               Else 0 End +       
                          Case When coalesce(Oper.FlagIPISobrePisCofins,0) = 1
                               Then Rs_RoundDec((Mov.ValorBruto - Rs_RoundDec((Mov.ValorBruto * Mov.PercDesconto / 100),2)) * Mov.QuantAtendida * Mov.AliqIPI / 100,2)
                               Else 0 End)                              
                          * Mov.AliqPISCOFINS) / 100,2)                   
              Else 0 End as ValorPISCOFINS,
         Mov.CodPedido, Mov.TipoControle, Mov.CodControle, --MARCELO - CHAMADO 188892        
         -- 307377  
         Case When Mov.TipoMovimento = 1 and coalesce(Oper.FlagCustoMedio,0) = 1
              Then Case       
                       When Mov.QuantAtendida = 0 And Mov.ValorUnitario = 0 and Mov.ValorTotal > 0
                           Then 2  --2 - Apropriação de custo no custo médio            
                       When coalesce(Oper.FlagEstoqueReservadoContabil,0) = 0    --Calcula independente de ser entrada reservada (CALCULO PADRAO)
                           Then 1  --1 - Calculo do Custo Médio            
                       When coalesce(Oper.FlagEstoqueReservadoContabil,0) = 1 and Mov.FlagMovEstoque <> 0   --Só calcula se NÃO for entrada reservada
                           Then 1  --1 - Calculo do Custo Médio            
                       Else 0 End      
              Else 0 End as TipoAtualizacaoCusto,
         Case When Mov.QuantAtendida = 0 And Mov.ValorUnitario = 0 and Mov.ValorTotal > 0
              Then Mov.ValorTotal else 0 End as ValorApropriacaoCusto
    From TempCalculoCustoMedioLote T                
    Left Join MovEstoqueAux MovAux on MovAux.CodProduto = T.CodProduto                
                                  and MovAux.EmpresaEstoque = :EmpresaEstoque
                                  and MovAux.CodLote = T.CodLote                
                                  and MovAux.Localizacao = T.Localizacao                
    Left Join MovEstoque Mov on Mov.Empresa = MovAux.Empresa                
                            and Mov.NumLancamento = MovAux.NumLancamento
    --Renato - 360462
    Left Join MovEstoqueImposto MI on Mov.Empresa       = MI.Empresa
                                  and Mov.NumLancamento = MI.NumLancamento

    Left Join Operacoes Oper on Oper.Codigo = Mov.CodOperacao                
   Where T.SqlTimeStamp = :SqlTimeStamp
  Order By T.CodProduto, T.CodLote, T.Localizacao,                
           Mov.DataMovimento, Mov.TipoMovimento, Mov.NumLancamento                
  Into :CodProduto, :CodLote, :Localizacao,
       :MovEmpresa, :MovNumLancamento,
       :QuantAtendida, :ValorUnitario, :ValorICM, :ValorPisCofins,
       :MovCodPedido, :MovTipoControle, :MovCodControle,
       :TipoAtualizacaoCusto, :ValorApropriacaoCusto
Do

begin
  If ((CodProduto <> SvCodProduto) or (SvCodProduto is null) or
      (CodLote <> SvCodLote) or (SvCodLote is null) or
      (Localizacao <> SvLocalizacao) or (SvLocalizacao is null)) then
  begin  
    SvCodProduto = CodProduto;
    SvCodLote = CodLote;
    SvLocalizacao = Localizacao;
    ValorCustoFor = 0;
    ValorCustoMed = 0;
    ValorCustoUlt = 0;
    ValorCustoUltReal = 0;
  end  
  
  
  -- Eder - 307377  
  --Calculo de Custo Medio - Entradas que Calculam Custo Medio            
  If (TipoAtualizacaoCusto = 1) then
  begin
    --Custo do Fornecedor  
    ValorCustoFor = Rs_RoundDec(ValorUnitario,QtdCasasCusto);
  
    --Custo Médio  
    If (TipoICMCustoMedio = 1) then
       ValorCustoMed = (ValorUnitario * QuantAtendida) - ValorICM;
    Else                
    If (TipoICMCustoMedio = 2) then
       ValorCustoMed = (ValorUnitario * QuantAtendida) - ValorICM - ValorPISCOFINS;
    Else           
       ValorCustoMed = (ValorUnitario * QuantAtendida);
    ValorCustoMed = Rs_RoundDec(ValorCustoMed / QuantAtendida,QtdCasasCusto);
  
    --Custo da Ultima Compra                
    If (TipoICMUltimaCompra = 1) then
       ValorCustoUlt = (ValorUnitario * QuantAtendida) - ValorICM;
    Else                
    If (TipoICMUltimaCompra = 2) then
       ValorCustoUlt = (ValorUnitario * QuantAtendida) - ValorICM - ValorPISCOFINS;
    Else           
       ValorCustoUlt = (ValorUnitario * QuantAtendida);
    ValorCustoUlt = Rs_RoundDec(ValorCustoUlt / QuantAtendida,QtdCasasCusto);
  
    --Custo da Ultima Compra Real, sempre sem impostos  
    ValorCustoUltReal = (ValorUnitario * QuantAtendida) - ValorICM - ValorPISCOFINS;
    ValorCustoUltReal = Rs_RoundDec(ValorCustoUltReal / QuantAtendida,QtdCasasCusto);
  end  

  --Eder - 307377                            
  --Apropriação do Custo médio / Lançamentos sem valor unitario e com Valor Ajuste de Custo            
  if (TipoAtualizacaoCusto = 2) then
  begin          
    ValorCustoFor = ValorCustoFor + ValorApropriacaoCusto;
    ValorCustoMed = ValorCustoMed + ValorApropriacaoCusto;
  end  
  
  Update MovEstoque  
--Eder - Chamado 276648
     Set ValorCustoFor     = Case When :FlagAtualizarCustoFor = 1 Then coalesce(:ValorCustoFor,0)
                                  Else ValorCustoFor End
        ,ValorCustoMed     = coalesce(:ValorCustoMed,0)
        ,ValorCustoUlt     = coalesce(:ValorCustoUlt,0)
        ,ValorCustoUltReal = coalesce(:ValorCustoUltReal,0)
   Where Empresa = :MovEmpresa
     and NumLancamento = :MovNumlancamento;
  
  --MARCELO - CHAMADO 188892
  --ATUALIZAR VALORES DE CUSTOS TOTALIZADOS NOS PEDIDOS
  if (MovCodPedido <> 0) then
  begin         
    ValorCustoForTotal = 0;
    ValorCustoUltTotal = 0;
    ValorCustoUltRealTotal = 0;
    ValorCustoMedTotal = 0;
    ValorCustoSerTotal = 0;

    Select
      Rs_RoundDec(coalesce(Sum(Case When Mov.CodProduto <> 8888888
                                    Then Cast((Mov.ValorCustoFor * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                                    Else 0 End),0), coalesce(Max(Par.QtdCasasCusto),4)),
      Rs_RoundDec(coalesce(Sum(Case When Mov.CodProduto <> 8888888
                                    Then Cast((Mov.ValorCustoUlt * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                                    Else 0 End),0),coalesce(Max(Par.QtdCasasCusto),4)),
      Rs_RoundDec(coalesce(Sum(Case When Mov.CodProduto <> 8888888
                                    Then Cast((Mov.ValorCustoUltReal * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                                    Else 0 End),0),coalesce(Max(Par.QtdCasasCusto),4)),
      Rs_RoundDec(coalesce(Sum(Case When Mov.CodProduto <> 8888888
                                    Then Mov.ValorCustoMed * Mov.QuantAtendida
                                    Else 0 End),0),coalesce(Max(Par.QtdCasasCusto),4)),
      Rs_RoundDec(coalesce(Sum(Case When Mov.CodProduto = 8888888
                                    Then Mov.ValorCustoFor * Mov.QuantAtendida
                                    Else 0 End),0),coalesce(Max(Par.QtdCasasCusto),4))
    From MovEstoque Mov
      Left Join ParamControle Par On Par.Empresa = Mov.Empresa
    where Mov.Empresa = :MovEmpresa
      and Mov.CodPedido = :MovCodPedido
      and Mov.CodPedido > 0
    into :ValorCustoForTotal,
         :ValorCustoUltTotal,
         :ValorCustoUltRealTotal,
         :ValorCustoMedTotal,
         :ValorCustoSerTotal;

    update Pedidos set
--Eder - Chamado 276648
      ValorCustoForTotal     = Case When :FlagAtualizarCustoFor = 1 then :ValorCustoForTotal
                                    Else ValorCustoForTotal End,
      ValorCustoUltTotal     = :ValorCustoUltTotal,
      ValorCustoUltRealTotal = :ValorCustoUltRealTotal,
      ValorCustoMedTotal     = :ValorCustoMedTotal,
      ValorCustoSerTotal     = :ValorCustoSerTotal
    where Empresa = :MovEmpresa
      and CodPedido = :MovCodPedido;
  end

  --MARCELO - CHAMADO 188892
  --ATUALIZAR VALORES DE CUSTOS TOTALIZADOS NAS NOTAS FISCAIS
  if (MovCodControle <> 0) then
  begin         
    ValorCustoForTotal = 0;
    ValorCustoUltTotal = 0;
    ValorCustoUltRealTotal = 0;
    ValorCustoMedTotal = 0;
    ValorCustoSerTotal = 0;

    Select
      coalesce(Sum(Case When Mov.CodProduto <> 8888888
                        Then Cast((Mov.ValorCustoFor * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                        Else 0 End),0),
      coalesce(Sum(Case When Mov.CodProduto <> 8888888
                        Then Cast((Mov.ValorCustoUlt * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                        Else 0 End),0),
      coalesce(Sum(Case When Mov.CodProduto <> 8888888
                        Then Cast((Mov.ValorCustoUltReal * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
                        Else 0 End),0),
      coalesce(Sum(Case When Mov.CodProduto <> 8888888
                        Then Mov.ValorCustoMed * Mov.QuantAtendida
                        Else 0 End),0),
      coalesce(Sum(Case When Mov.CodProduto = 8888888
                        Then Mov.ValorCustoFor * Mov.QuantAtendida
                        Else 0 End),0)
    From MovEstoque Mov
    where Mov.Empresa = :MovEmpresa
      and Mov.TipoControle = :MovTipoControle
      and Mov.CodControle = :MovCodControle
      and Mov.CodControle > 0
    into :ValorCustoForTotal,
         :ValorCustoUltTotal,
         :ValorCustoUltRealTotal,
         :ValorCustoMedTotal,
         :ValorCustoSerTotal;

    update NotasFiscais set
--Eder - Chamado 276648
      ValorCustoForTotal     = Case When :FlagAtualizarCustoFor = 1 then :ValorCustoForTotal
                                    Else ValorCustoForTotal End,
      ValorCustoUltTotal     = :ValorCustoUltTotal,
      ValorCustoUltRealTotal = :ValorCustoUltRealTotal,
      ValorCustoMedTotal     = :ValorCustoMedTotal,
      ValorCustoSerTotal     = :ValorCustoSerTotal
    where Empresa = :MovEmpresa
      and TipoControle = :MovTipoControle
      and CodControle = :MovCodControle;
  end
end

Delete From TempCalculoCustoMedioLote
 Where SqlTimeStamp = :SqlTimeStamp;
END
^

SET TERM ; ^


--Gabriella - 363000
CREATE TABLE UNIDADES
 (
  CODIGO               CHAR(6)       DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  DESCRICAO            VARCHAR(200)  DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  FATORCONVERSAO       NUMERIC(14,6) DEFAULT 0   NOT NULL,
  STATUSTRANSACAO      SMALLINT      DEFAULT 0   NOT NULL,
  TRANSACAOEMPRESAS    VARCHAR(50)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR
 );
 

ALTER TABLE UNIDADES ADD CONSTRAINT
    PK_UNIDADES PRIMARY KEY
    (
     CODIGO
    );
    

 SET TERM ^ ;
 
 
 ALTER PROCEDURE CALCULAR_COMISSAO (
     empresa integer,
     tipocalculo integer,
     codvendinterno integer,
     codvendexterno integer,
     codvendparceiro integer,
     codproduto integer,
     valortotal numeric(13,4),
     codletracomissao char(5),
     margemlucro numeric(6,2),
     prazomedio integer,
     tipoprecoproduto integer,
     margemlucroliquido numeric(5,2),
     valorlucroliquido numeric(13,4),
     percdesconto numeric(8,4),
     percdesconto1 numeric(5,2),
     percdesconto2 numeric(5,2),
     percdesconto3 numeric(5,2),
     percdesconto4 numeric(5,2),
     percdesconto5 numeric(5,2),
     codentidade char(7),
     percdescontocondpagto numeric(8,4),
     valorservicostotal numeric(11,2))
 returns (
     internook integer,
     externook integer,
     parceirook integer,
     valorinterno numeric(11,2),
     valorexterno numeric(11,2),
     valorparceiro numeric(11,2))
 as
 declare variable retinternook integer;
 declare variable retexternook integer;
 declare variable retparceirook integer;
 declare variable retvalorinterno numeric(11,2);
 declare variable retvalorexterno numeric(11,2);
 declare variable retvalorparceiro numeric(11,2);
 declare variable tipocalcinterno integer;
 declare variable tipocalcexterno integer;
 declare variable tipocalcparceiro integer;
 declare variable flagaliqvendedorsemcomissaointerno smallint;
 declare variable flagaliqvendedorsemcomissaoexterno smallint;
 declare variable flagaliqvendedorsemcomissaoparceiro smallint;
 declare variable flagcomissaoservico integer;
 declare variable valorcalculo numeric(13,4);
 declare variable aliquota numeric(5,2);
 declare variable tabela integer;
 declare variable codgrupo integer;
 declare variable flagnaovendaext integer;
 declare variable flagcomissaopreco smallint;
 declare variable tabelacomissaodesconto smallint;
 declare variable valordesconto numeric(5,2);
 declare variable flagdesconto numeric(5,2);
 declare variable flagdesconto1 numeric(5,2);
 declare variable flagdesconto2 numeric(5,2);
 declare variable flagdesconto3 numeric(5,2);
 declare variable flagdesconto4 numeric(5,2);
 declare variable flagdesconto5 numeric(5,2);
 declare variable flagtiporelacaovendedores smallint;
 declare variable flagretiradesccondpagtocomissao smallint;
 declare variable tipopreco smallint;
 declare variable valorcusto numeric(13,4);
 declare variable valorvenda numeric(13,4);
 declare variable flagencontroucomissaoint smallint;
 declare variable flagencontroucomissaoext smallint;
 declare variable flagcomissaoletralistapreco smallint;
 --353932
 declare variable flagitemcontemletracomissao smallint;
 begin
 /*FB*/
 RetInternoOK = 0;
 RetExternoOK = 0;
 RetParceiroOK = 0;
 RetValorInterno = 0;
 RetValorExterno = 0;
 RetValorParceiro = 0;
                        
 FlagRetiraDescCondPagtoComissao = 0;
 TipoPreco = 0;
 ValorCusto = 0;
 ValorVenda = 0;
 
 --224682
 FLAGENCONTROUCOMISSAOINT = 0;
 FLAGENCONTROUCOMISSAOEXT = 0;
                
 Select CodComissaoDesc
   From Entidades  
  Where Codigo = :CodEntidade
  Into :TabelaComissaoDesconto;
 
 Select FlagComissaoServico, FlagTipoRelacaoVendedores
        --JALDO/RAFAEL - 197595
        ,FlagRetiraDescCondPgtoComissao
        ,TipoPreco
   From ParamControle
  Where Empresa = :Empresa
  Into :FlagComissaoServico, :FlagTipoRelacaoVendedores
       ,:FlagRetiraDescCondPagtoComissao
       ,:TipoPreco;
 
 
 Select TipoCalcComissao, FlagAliqVendedorSemComissao,
 --319353
   flagcomissaoLetralistaPreco
   From Vendedores
  Where Codigo=:CodVendInterno
   Into :TipoCalcInterno, :FlagAliqVendedorSemComissaoInterno,
   --319353
       :flagcomissaoLetralistaPreco;
 
 If (TipoCalcInterno is null) then
    TipoCalcInterno = 0;
 
 if ((flagcomissaoLetralistaPreco = 1) and
    (not CodLetraComissao = ''))  then
 begin
   TipoCalcInterno = 6;
   --353932
   flagitemcontemletracomissao = 1;
 end
 
 --353932
 if (flagitemcontemletracomissao is null) then
   flagitemcontemletracomissao = 0;
 
 
 
 Select TipoCalcComissao, FlagAliqVendedorSemComissao
   From Vendedores
  Where Codigo=:CodVendExterno
   Into :TipoCalcExterno, :FlagAliqVendedorSemComissaoExterno;
 If (TipoCalcExterno is null) then
    TipoCalcExterno = 0;
 
 Select TipoCalcComissao, FlagAliqVendedorSemComissao
   From Vendedores
  Where Codigo=:CodVendParceiro
   Into :TipoCalcParceiro, :FlagAliqVendedorSemComissaoParceiro;
 If (TipoCalcParceiro is null) then
    TipoCalcParceiro = 0;
 
 
 FlagComissaoPreco = null;
 Select FlagComissaoPreco From LetraComissao
  Where Codigo=:CodLetraComissao
 Into :FlagComissaoPreco;
 if (FlagComissaoPreco is null) then
 FlagComissaoPreco = 0;
 
                      
 
 if ( (FlagRetiraDescCondPagtoComissao = 1) and (PercDescontoCondPagto < 0) and (ValorTotal <> 0) ) then
 begin
   if (TipoPreco = 0) then
      ValorCusto = ((100 - MargemLucro) * ValorTotal) / 100;
   if (TipoPreco = 1) then
      ValorCusto = (100 * MargemLucro) / ValorTotal;
   ValorVenda = ValorTotal /(1-(PercDescontoCondPagto/100));
   if (TipoPreco = 0) then
     MargemLucro = 100 - ((ValorCusto/ValorVenda) * 100);
 --221063  if (TipoPreco = 1) then
   if ((TipoPreco = 1) and (ValorCusto <> 0)) then
     MargemLucro = ((ValorVenda - ValorCusto)/ValorCusto) * 100;
   else
     MargemLucro = 0;
   ValorTotal = ValorVenda;
 end
 
 ValorCalculo = ValorTotal;
 
 
 /****************************************************/
 /******        COMISSOES POR ITEM           *********/
 /****************************************************/
 /****************************************************/
 /****************************************************/
 
                                                      
                                                   
                                                      
          
 If ((TipoCalculo = 1)
    and (TipoCalcInterno = 2)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select TabComissao From Vendedores Where Codigo=:CodVendInterno
        Into :Tabela;
      If (Tabela is null) then
         Tabela = 0;
      Select CodGrupo From Produtos Where Codigo = :CodProduto
        Into :CodGrupo;
      If (CodGrupo is null) then
         CodGrupo = 0;
      Select Aliquota From PegaComissaoGrupo(:CodGrupo, :CodVendInterno, :CodVendExterno, 1, :Tabela)
        Into :Aliquota;
      RetValorInterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
                                        
          
 If ((TipoCalculo = 1)
    and (TipoCalcExterno = 2)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select TabComissao From Vendedores Where Codigo=:CodVendExterno
        Into :Tabela;
      If (Tabela is null) then
         Tabela = 0;
      Select CodGrupo From Produtos Where Codigo = :CodProduto
        Into :CodGrupo;
      If (CodGrupo is null) then
         CodGrupo = 0;
      Select Aliquota From PegaComissaoGrupo(:CodGrupo, :CodVendInterno, :CodVendExterno, 2, :Tabela)
        Into :Aliquota;
      RetValorExterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
 
                                                      
                                                   
                                                      
          
 If ((TipoCalculo = 1) and
     ((TipoCalcInterno = 3) or (TipoCalcInterno = 6 and FlagComissaoPreco = 0))
     ) then
     if (((CodProduto = 8888888 and FlagComissaoServico = 1) or
          (CodProduto <> 8888888))
         and (CodVendInterno <> 0)
        ) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select FlagNaoVendaExt From Vendedores Where Codigo = :CodVendExterno
        Into :FlagNaoVendaExt;
                                              
      If ((CodVendExterno = 0) or
          (CodVendExterno <> 0) and (FlagNaoVendaExt = 1)) then
         begin
           Select PerComissaoDir From LetraComissao Where Codigo=:CodLetraComissao
             Into :Aliquota;
         end
      Else
         Select PerComissaoInd From LetraComissao Where Codigo=:CodLetraComissao
           Into :Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 1) and
     ((TipoCalcExterno = 3) or (TipoCalcExterno = 6 and FlagComissaoPreco = 0))
     ) then
     if (((CodProduto = 8888888 and FlagComissaoServico = 1) or
          (CodProduto <> 8888888))
         and (CodVendExterno <> 0)
        ) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select FlagNaoVendaExt From Vendedores Where Codigo = :CodVendInterno
        Into :FlagNaoVendaExt;
                                              
      If ((CodVendInterno = 0) or
          (CodVendInterno <> 0) and (FlagNaoVendaExt = 1)) then
         begin      
           Select PerComissaoDir From LetraComissao Where Codigo=:CodLetraComissao
             Into :Aliquota;
         end
      Else
         Select PerComissaoInd From LetraComissao Where Codigo=:CodLetraComissao
           Into :Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
                                                                
                                                                
                                                                
          
    If ((TipoCalculo = 1)
    and (TipoCalcInterno = 9)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Select CodGrupo From Produtos Where Codigo = :CodProduto into :CodGrupo;
      if (CodGrupo is null) then
         CodGrupo = 0;
 
      Aliquota = 0;
      Select Aliquota From PegaComissaoGrupoMargemPmv(:CodGrupo,:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
 --224682
      else
        FlagEncontrouComissaoInt = 1;
 
      RetValorInterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
          
    If ((TipoCalculo = 1)
    and (TipoCalcExterno = 9)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Select CodGrupo From Produtos Where Codigo = :CodProduto into :CodGrupo;
      if (CodGrupo is null) then
         CodGrupo = 0;
 
      Aliquota = 0;
      Select Aliquota From PegaComissaoGrupoMargemPmv(:CodGrupo,:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
 --224682
      else
        FlagEncontrouComissaoExt = 1;
 
      RetValorExterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
                                                                        
                                                                       
                                                                        
          
 If ((TipoCalculo = 1)
    and (TipoCalcInterno = 10)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
 
      Select CodGrupo From Produtos Where Codigo = :CodProduto into :CodGrupo;
      if (CodGrupo is null) then
         CodGrupo = 0;
 
      Aliquota = 0;
      Select Aliquota From PegaComissaoGrupoMargemPmv(:CodProduto, :MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
 --224682
      else
        FlagEncontrouComissaoInt = 1;
      RetValorInterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 1)
    and (TipoCalcExterno = 10)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
 
      Select CodGrupo From Produtos Where Codigo = :CodProduto into :CodGrupo;
      if (CodGrupo is null) then
         CodGrupo = 0;
      Aliquota = 0;
      Select Aliquota From PegaComissaoGrupoMargemPmv(:CodGrupo, :MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
 --224682
      else
        FlagEncontrouComissaoExt = 1;
      RetValorExterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
 
                                                                        
                                        
                                                                                             
                                                                        
          
 If ((TipoCalculo = 1)
    and ((TipoCalcInterno = 4) or
 --224682        ((TipoCalcInterno = 9) and (RetValorInterno <= 0)))
         ((TipoCalcInterno = 9) and (FlagEncontrouComissaoInt = 0)))
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 1)
    and ((TipoCalcExterno = 4) or
 --224682        ((TipoCalcInterno = 9) and (RetValorExterno <= 0)))
 --230700        ((TipoCalcInterno = 9) and (FlagEncontrouComissaoExt = 0)))
        ((TipoCalcExterno = 9) and (FlagEncontrouComissaoExt = 0)))
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
                                                                        
                                                    
                                                                        
          
 If ((TipoCalculo = 1)
    and (TipoCalcInterno = 6 and FlagComissaoPreco = 1)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (not CodProduto in (8888888,9999999)))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select PerComissaoInterno From LetraComissaoPreco
       Where CodLetraComissao=:CodLetraComissao
         and TipoPreco=:TipoPrecoProduto
       Into :Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = Rs_roundDec((:ValorCalculo * :Aliquota) / 100, 2);
    end
                                                   
          
 If ((TipoCalculo = 1)
    and (TipoCalcExterno = 6 and FlagComissaoPreco = 1)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (not CodProduto in (8888888,9999999)))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select FlagNaoVendaExt From Vendedores Where Codigo = :CodVendInterno
        Into :FlagNaoVendaExt;
      Select Case When (:CodVendInterno = 0 or :FlagNaoVendaExt = 1) then PerComissaoExternoDir
                  Else PerComissaoExternoInd End
        From LetraComissaoPreco
       Where CodLetraComissao=:CodLetraComissao
         and TipoPreco=:TipoPrecoProduto
        into Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = Rs_roundDec((:ValorCalculo * :Aliquota) / 100, 2);
    end
 
                                                                        
                                                                 
                                                                                                               
                                                                        
          
 If ((TipoCalculo = 1)
    and ((TipoCalcInterno = 7) or
 --224682        ((TipoCalcInterno = 10) and (RetValorInterno <= 0)))
         ((TipoCalcInterno = 10) and (FlagEncontrouComissaoInt = 0)))
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 1)
    and ((TipoCalcExterno = 7) or
 --224682        ((TipoCalcInterno = 10) and (RetValorExterno <= 0)))
 --230700        ((TipoCalcInterno = 10) and (FlagEncontrouComissaoExt = 0)))
         ((TipoCalcExterno = 10) and (FlagEncontrouComissaoExt = 0)))
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
                 
                                                                        
                               
                                                                        
          
 If ((TipoCalculo = 1)
    and (TipoCalcInterno = 11)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
 
      --Calculo do Desconto - Karina - 125025
      Select FlagPercDesconto, FlagPercDesconto1, FlagPercDesconto2, FlagPercDesconto3,      
         FlagPercDesconto4, FlagPercDesconto5      
      from ComissaoDesconto 
      where Codigo = :TabelaComissaoDesconto
      into :Flagdesconto , :Flagdesconto1, :Flagdesconto2, :Flagdesconto3 , :Flagdesconto4, :Flagdesconto5;
 
      if (:FlagDesconto = 1) then --Desconto Principal
        ValorDesconto = :PercDesconto;
      else
      begin
        ValorDesconto = 100;
        if (:FlagDesconto1 = 1) then
        begin
          if (:PercDesconto1 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto1) / 100);
        end
        if (:FlagDesconto2 = 1) then
        begin
          if (:PercDesconto2 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto2) / 100);
        end
        if (:FlagDesconto3 = 1) then
        begin
          if (:PercDesconto3 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto3) / 100);
        end
        if (:FlagDesconto4 = 1) then
        begin
          if (:PercDesconto4 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto4) / 100);
        end
        if (:FlagDesconto5 = 1) then
        begin
          if (:PercDesconto5 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto5) / 100);
        end
        If (:ValorDesconto > 0) then
          ValorDesconto = 100 - :ValorDesconto;
      end
 
      Select Aliquota From PegaComissaoDesconto(:ValorDesconto, :TabelaComissaoDesconto, :CodVendInterno, :CodVendExterno, 1)
      Into Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = rs_rounddec((ValorTotal * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 1)
    and (TipoCalcExterno = 11)
    and ((CodProduto = 8888888 and FlagComissaoServico = 1) or
         (CodProduto <> 8888888))
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
 
      --Calculo do Desconto - Karina - 125025
      Select FlagPercDesconto, FlagPercDesconto1, FlagPercDesconto2, FlagPercDesconto3,      
         FlagPercDesconto4, FlagPercDesconto5      
      from ComissaoDesconto 
      where Codigo = :TabelaComissaoDesconto
      into :Flagdesconto , :Flagdesconto1, :Flagdesconto2, :Flagdesconto3 , :Flagdesconto4, :Flagdesconto5;
 
      if (:FlagDesconto = 1) then --Desconto Principal
        ValorDesconto = :PercDesconto;
      else
      begin
        ValorDesconto = 100;
        if (:FlagDesconto1 = 1) then
        begin
          if (:PercDesconto1 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto1) / 100);
        end
        if (:FlagDesconto2 = 1) then
        begin
          if (:PercDesconto2 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto2) / 100);
        end
        if (:FlagDesconto3 = 1) then
        begin
          if (:PercDesconto3 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto3) / 100);
        end
        if (:FlagDesconto4 = 1) then
        begin
          if (:PercDesconto4 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto4) / 100);
        end
        if (:FlagDesconto5 = 1) then
        begin
          if (:PercDesconto5 > 0) then
            ValorDesconto = :ValorDesconto - ((:ValorDesconto * :PercDesconto5) / 100);
        end
        If (:ValorDesconto > 0) then
          ValorDesconto = 100 - :ValorDesconto;
      end
 
      Select Aliquota From PegaComissaoDesconto(:ValorDesconto, :TabelaComissaoDesconto, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = rs_rounddec((ValorTotal * Aliquota) / 100, 2);
    end
                             
                                                    
 /****************************************************/
 /******     COMISSOES POR PEDIDO/NF         *********/
 /****************************************************/
 /****************************************************/
 /****************************************************/
 
 --279456
 if ((tipocalculo = 2) and (flagcomissaoservico = 0)) then
 begin
   valorcalculo = valorcalculo - valorservicostotal;
 end
 
 
 --353932
 /*
          
 If (((TipoCalculo = 2) and (TipoCalcInterno = 1) and (CodVendInterno <> 0)) or
     ((TipoCalculo = 1) and (TipoCalcInterno in(2,3,4,6,7,9,10,11)) and (CodVendInterno <> 0))) then
 begin
 */
 
 if (( CodVendInterno <> 0 )  and (
 -- chamada por pedido com tipo de calc. interno por pedido e não tem letra de comissão ou não calcula por letra de comissao
 
    ( (TipoCalculo = 2) and (TipoCalcInterno = 1) and  (flagitemcontemletracomissao = 0) or (flagcomissaoLetralistaPreco = 0 ) )
    OR
 -- chamada por item, com tipo de calc. interno por item e não tem letra de comissão ou não calcula por letra de comissao
    (((TipoCalculo = 1) and (TipoCalcInterno in(2,3,4,6,7,9,10,11))) and ((flagitemcontemletracomissao = 0)  or (flagcomissaoLetralistaPreco = 0) ) )
    OR
    ((TipoCalculo = 1) and (TipoCalcInterno = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)  )
    ))  then
  begin
 
    RetInternoOK = 1;
    Aliquota = 0;
    Select FlagNaoVendaExt From Vendedores Where Codigo=:CodVendExterno
    Into :FlagNaoVendaExt;
 
    --Externo não influencia na comissao indireta
    If ((CodVendExterno = 0) or
        ((CodVendExterno <> 0) and (FlagNaoVendaExt = 1))) then
    begin
      Select Ven.AliqComissaoDir + coalesce(VCom.AliqComissaoDir,0)
        From Vendedores Ven
        Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                         and VCom.Empresa = :Empresa
      Where Ven.Codigo=:CodVendInterno
       Into :Aliquota;
    end
    Else
    begin
      Select Ven.AliqComissaoInd + coalesce(VCom.AliqComissaoInd,0)
        From Vendedores Ven
        Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                         and VCom.Empresa = :Empresa
      Where Ven.Codigo=:CodVendInterno
       Into :Aliquota;
    end
    If (Aliquota is null) then
      Aliquota = 0;
 
    If ((TipoCalculo = 2) or
        ((TipoCalculo = 1) and (RetValorInterno > 0)) or
        --353932
        ((TipoCalculo = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)) or
        ((TipoCalculo = 1) and (FlagAliqVendedorSemComissaoInterno = 1))) then
 
      RetValorInterno = RetValorInterno + Rs_roundDec((:ValorCalculo * :Aliquota) / 100,2);
 end
 
 --353932
 /*
 If (((TipoCalculo = 2) and (TipoCalcExterno = 1) and (CodVendExterno <> 0)) or
     ((TipoCalculo = 1) and (TipoCalcExterno in(2,3,4,6,7,9,10,11)) and (CodVendExterno <> 0))) then
 begin
 */
 
 if (( CodVendExterno <> 0 )  and (
 -- chamada por pedido com tipo de calc. interno por pedido e não tem letra de comissão ou não calcula por letra de comissao
 
    ( (TipoCalculo = 2) and (TipoCalcInterno = 1) and  (flagitemcontemletracomissao = 0) or (flagcomissaoLetralistaPreco = 0 ) )
    OR
 -- chamada por item, com tipo de calc. interno por item e não tem letra de comissão ou não calcula por letra de comissao
    (((TipoCalculo = 1) and (TipoCalcInterno in(2,3,4,6,7,9,10,11))) and ((flagitemcontemletracomissao = 0)  or (flagcomissaoLetralistaPreco = 0) ) )
    OR
    ((TipoCalculo = 1) and (TipoCalcInterno = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)  )
    ))  then
 begin
 
   RetExternoOK = 1;
   Aliquota = 0;
   
   --Karina 126279
   if (FlagTipoRelacaoVendedores = 0) then --Interno / Externo
   begin
     Select FlagNaoVendaExt From Vendedores Where Codigo=:CodVendInterno
        Into :FlagNaoVendaExt;
     --Interno não influencia na comissao indireta
     If ((CodVendInterno = 0) or
        ((CodVendInterno <> 0) and (FlagNaoVendaExt = 1))) then --Nao influencia na comissao indireta
     begin
       Select Ven.AliqComissaoDir + coalesce(VCom.AliqComissaoDir,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendExterno
        Into :Aliquota;
     end
     Else
     begin
       Select Ven.AliqComissaoInd + coalesce(VCom.AliqComissaoInd,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendExterno
        Into :Aliquota;
     end
   end
   else if (FlagTipoRelacaoVendedores = 1) then --Externo / Parceiro
   begin
     Select FlagNaoVendaExt From Vendedores Where Codigo=:CodVendParceiro
        Into :FlagNaoVendaExt;
 
     --Interno não influencia na comissao indireta
     If ((CodVendParceiro = 0) or
        ((CodVendParceiro <> 0) and (FlagNaoVendaExt = 1))) then --Nao influencia na comissao indireta
     begin
       Select Ven.AliqComissaoDir + coalesce(VCom.AliqComissaoDir,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendExterno
        Into :Aliquota;
     end
     Else
     begin
       Select Ven.AliqComissaoInd + coalesce(VCom.AliqComissaoInd,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendExterno
        Into :Aliquota;
     end
   end
   If (Aliquota is null) then
     Aliquota = 0;
 
   If ((TipoCalculo = 2) or
      ((TipoCalculo = 1) and (RetValorExterno > 0)) or
      --353932
      ((TipoCalculo = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)) or
      ((TipoCalculo = 1) and (FlagAliqVendedorSemComissaoExterno = 1))) then
      RetValorExterno = RetValorExterno + Rs_roundDec((:ValorCalculo * :Aliquota) / 100,2);
 end
 
 
 --353932
 /*
 If (((TipoCalculo = 2) and (TipoCalcParceiro = 1) and (CodVendParceiro <> 0)) or
     ((TipoCalculo = 1) and (TipoCalcParceiro in(2,3,4,6,7,9,10,11)) and (CodVendParceiro <> 0))) then
 begin
 */
 
 
 if ((CodVendParceiro <> 0 )  and (
 -- chamada por pedido com tipo de calc. interno por pedido e não tem letra de comissão ou não calcula por letra de comissao
 
    ( (TipoCalculo = 2) and (TipoCalcInterno = 1) and  (flagitemcontemletracomissao = 0) or (flagcomissaoLetralistaPreco = 0 ) )
    OR
 -- chamada por item, com tipo de calc. interno por item e não tem letra de comissão ou não calcula por letra de comissao
    (((TipoCalculo = 1) and (TipoCalcInterno in(2,3,4,6,7,9,10,11))) and ((flagitemcontemletracomissao = 0)  or (flagcomissaoLetralistaPreco = 0) ) )
    OR
    ((TipoCalculo = 1) and (TipoCalcInterno = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)  )
    ))  then
 begin
 
 
   RetParceiroOK = 1;
   Aliquota = 0;
 
   --Karina 126279
   if (FlagTipoRelacaoVendedores = 0) then --Interno / Externo
   begin
     Select Ven.AliqComissaoDir + coalesce(VCom.AliqComissaoDir,0)
       From Vendedores Ven
       Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                        and VCom.Empresa = :Empresa
      Where Ven.Codigo=:CodVendParceiro
       Into :Aliquota;
   end
   else if (FlagTipoRelacaoVendedores = 1) then -- Externo / Parceiro
   begin
     Select FlagNaoVendaExt From Vendedores Where Codigo=:CodVendExterno
        Into :FlagNaoVendaExt;
 
     --Interno não influencia na comissao indireta
     If ((CodVendExterno = 0) or
        ((CodVendExterno <> 0) and (FlagNaoVendaExt = 1))) then --Nao influencia na comissao indireta
     begin
       Select Ven.AliqComissaoDir + coalesce(VCom.AliqComissaoDir,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendParceiro
        Into :Aliquota;
     end
     Else
     begin
       Select Ven.AliqComissaoInd + coalesce(VCom.AliqComissaoInd,0)
         From Vendedores Ven
         Left Join VendedoresComissao VCom on VCom.CodVendedor = Ven.Codigo
                                          and VCom.Empresa = :Empresa
       Where Ven.Codigo=:CodVendParceiro
        Into :Aliquota;
     end
   end 
 
   If (Aliquota is null) then
      Aliquota = 0;
 
   If ((TipoCalculo = 2) or
      ((TipoCalculo = 1) and (RetValorParceiro> 0)) or
      --353932
      ((TipoCalculo = 1) and (flagitemcontemletracomissao = 0) and (flagcomissaoLetralistaPreco = 1)) or
      ((TipoCalculo = 1) and (FlagAliqVendedorSemComissaoExterno = 1))) then
     RetValorParceiro = RetValorParceiro + Rs_roundDec((:ValorCalculo * :Aliquota) / 100,2);
 end
 
 
 
                                                                        
                                             
                                                                        
          
 If ((TipoCalculo = 2)
    and (TipoCalcInterno = 5)
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
        Into Aliquota;
      RetValorInterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 2)
    and (TipoCalcExterno = 5)
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucro, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into Aliquota;
      RetValorExterno = rs_rounddec((ValorCalculo * Aliquota) / 100, 2);
    end
 
                                                                        
                                                                      
                                                                        
          
 If ((TipoCalculo = 2)
    and (TipoCalcInterno = 8)
    and (CodVendInterno <> 0)) then
    begin
      RetInternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 1)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorInterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
          
 If ((TipoCalculo = 2)
    and (TipoCalcExterno = 8)
    and (CodVendExterno <> 0)) then
    begin
      RetExternoOK = 1;
      Aliquota = 0;
      Select Aliquota From PegaComissaoMargem(:MargemLucroLiquido, :PrazoMedio, :CodVendInterno, :CodVendExterno, 2)
      Into 
        Aliquota;
      If (Aliquota is null) then
         Aliquota = 0;
      RetValorExterno = rs_rounddec((ValorLucroLiquido * Aliquota) / 100, 2);
    end
 
                                   
                                     
 InternoOk = RetInternoOk;
 ExternoOk = RetExternoOk;
 ParceiroOk = RetParceiroOk;
 
 ValorInterno = RetValorInterno;
 ValorExterno = RetValorExterno;
 ValorParceiro = RetValorParceiro;
 
 Suspend;
END
 ^
 
 
 
 
ALTER PROCEDURE STORED_TOTALIZAPEDIDOCOMISSAO (
    tipoorigem integer,
    empresa integer,
    codpedido integer,
    codvendinterno integer,
    codvendexterno integer,
    codvendparceiro integer,
    valorprodutos numeric(11,2),
    valorservicos numeric(11,2),
    valordesconto numeric(11,2),
    valordescontoservicos numeric(11,2),
    margemlucro numeric(5,2),
    prazomedio numeric(5,2),
    codentidade char(7),
    percdescontocondpagto numeric(8,4))
returns (
    valorcomissinterno numeric(11,2),
    valorcomissexterno numeric(11,2),
    valorcomissparceiro numeric(11,2))
as
declare variable internook integer;
declare variable externook integer;
declare variable parceirook integer;
declare variable valorinterno numeric(11,2);
declare variable valorexterno numeric(11,2);
declare variable valorparceiro numeric(11,2);
declare variable auxcodletracomissao char(5);
declare variable auxcodproduto integer;
declare variable auxvalortotal numeric(13,4);
declare variable auxvalorinterno numeric(11,2);
declare variable auxvalorexterno numeric(11,2);
declare variable auxvalorparceiro numeric(11,2);
declare variable tipomargemlucro integer;
declare variable tipoprecoproduto integer;
declare variable margemlucroliquido numeric(5,2);
declare variable valorlucroliquido numeric(13,4);
declare variable flagcomissaoservico smallint;
declare variable percdesconto decimal(8,4);
declare variable percdesconto1 decimal(5,2);
declare variable percdesconto2 decimal(5,2);
declare variable percdesconto3 decimal(5,2);
declare variable percdesconto4 decimal(5,2);
declare variable percdesconto5 decimal(5,2);
declare variable valorservicostotal numeric(11,2);
declare variable tipomargemliquida integer;
BEGIN
-- Zera as variaveis de retorno


AuxValorInterno = 0;
AuxValorExterno = 0;
AuxValorParceiro = 0;

AuxValorTotal =  (ValorProdutos + ValorServicos - ValorDesconto - ValorDescontoServicos);
--279456
ValorServicosTotal = ValorServicos - ValorDescontoServicos;

SELECT TipoMargemLucro, FlagComissaoServico
  FROM ParamControle
 WHERE Empresa = :empresa
INTO :TipoMargemLucro, :FlagComissaoServico;

--304454
--Renato - 292957
--Select FlagMargemLiquidaGerencial
Select TipoMargemLiquida
From ConfiguracaoSistema
--304454
--into :FlagMargemLiquidaGerencial;
into :TipoMargemLiquida;

IF (TipoOrigem = 1) THEN
BEGIN
  /* Renato - 292957
  SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(T.QuantAtendida * T.ValorCustoUltReal),
                SUM(T.QuantAtendida * T.ValorUnitario), SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda))),
         CASE WHEN (SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda)) > SUM(T.QuantAtendida * T.ValorCustoUltReal)
              THEN (SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda) - SUM(T.QuantAtendida * T.ValorCustoUltReal))
              ELSE 0 END
  */

  --304454
  --SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
  SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                             Then T.ValorCustoUltReal
                                                                             Else (T.ValorCustoFor * T.FatorRedCusto) End) as Numeric(18,4))),
                SUM(T.QuantAtendida * T.ValorUnitario), SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda))),
         CASE WHEN (SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda)) >

                   --304454
                    --SUM(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                    SUM(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then T.ValorCustoUltReal
                                                Else (T.ValorCustoFor * T.FatorRedCusto) End)as Numeric(18,4)))
              THEN (SUM(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda) -
                   --3044554
                    --SUM(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                    SUM(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then T.ValorCustoUltReal
                                                Else (T.ValorCustoFor * T.FatorRedCusto) End)as Numeric(18,4))))
              ELSE 0 END


          --353932
         ,(Select first  1   T2.CodLetraComissao From   TempPrce100Itens T2
            WHERE  T2.Empresa = :Empresa
              AND  T2.CodPedido = :CodPedido
              AND  T2.CodLetraComissao <> ''
              AND  T2.Status <> 'E'
              AND  T2.Status <> 'L'
              AND ( ( T2.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR ( T2.CodProduto <> 8888888) )
          )


      FROM TempPrce100Itens T
      WHERE T.Empresa = :Empresa
        AND T.CodPedido = :CodPedido
        AND T.Status <> 'E'
        AND T.Status <> 'L'
        AND ((T.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR (T.CodProduto <> 8888888))
   INTO :MargemLucroLiquido, :ValorLucroLiquido,
   --353932
   :AuxCodLetraComissao;


END
ELSE
BEGIN
  /* Renato - 292957
  SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(M.QuantAtendida * M.ValorCustoUltReal),
                SUM(M.QuantAtendida * M.ValorUnitario), SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda))),
         CASE WHEN (SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda)) > SUM(M.QuantAtendida * M.ValorCustoUltReal)
              THEN (SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda) - SUM(M.QuantAtendida * M.ValorCustoUltReal))
              ELSE 0 END
  */
  --304454
  --SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(M.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
  SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(M.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                             Then M.ValorCustoUltReal
                                                                             Else (M.ValorCustoFor * M.FatorRedCusto) End)as Numeric(18,4))),
                SUM(M.QuantAtendida * M.ValorUnitario), SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda))),
         CASE WHEN (SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda)) >

                    --304454
                    --SUM(M.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                     SUM(M.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then M.ValorCustoUltReal
                                                Else (M.ValorCustoFor * M.FatorRedCusto) End) as Numeric(18,4)))
              THEN (SUM(M.QuantAtendida * M.ValorUnitario * M.FatorRedVenda) -
                    --304454
                    --SUM(M.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                    SUM(M.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then M.ValorCustoUltReal
                                                Else (M.ValorCustoFor * M.FatorRedCusto) End) as Numeric(18,4))))
              ELSE 0 END

                
         --353932
         ,( Select first  1  M2.CodLetraComissao  From  MovEstoque M2
            WHERE M2.Empresa = :Empresa
            AND M2.CodPedido = :CodPedido
            AND M2.CodLetraComissao <> ''
            AND ((M2.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR (M2.CodProduto <> 8888888))
         )

      FROM MovEstoque M
      WHERE M.Empresa = :Empresa
        AND M.CodPedido = :CodPedido
        AND ((M.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR (M.CodProduto <> 8888888))
   INTO :MargemLucroLiquido, :ValorLucroLiquido,
   --353932
   :AuxCodLetraComissao;

END
IF (MargemLucroLiquido IS NULL) THEN
  MargemLucroLiquido = 0;
IF (ValorLucroLiquido IS NULL) THEN
  ValorLucroLiquido = 0;


--Verifica se existem comissoes calculadas sobre o valor do pedido.
SELECT InternoOK, ExternoOK, ParceiroOK, ValorInterno, ValorExterno, ValorParceiro
  FROM Calcular_Comissao(:Empresa, 2, :CodVendInterno, :CodVendExterno,
                         :CodVendParceiro, NULL, :AuxValorTotal, :AuxCodLetraComissao,
                         :MargemLucro, :PrazoMedio, 0,
                         :MargemLucroLiquido, :ValorLucroLiquido,0,0,0,0,0,0, :CodEntidade
                         --JALDO/RAFAEL - 197595
                        ,:PercDescontoCondPagto,
--279456
                         :ValorServicosTotal)
  INTO :InternoOK, :ExternoOK, :ParceiroOK, :ValorInterno, :ValorExterno, :ValorParceiro;

IF (InternoOK = 1) THEN
   AuxValorInterno = ValorInterno;
IF (ExternoOK = 1) THEN
   AuxValorExterno = ValorExterno;
IF (ParceiroOK = 1) THEN
   AuxValorParceiro = ValorParceiro;

IF (TipoOrigem = 1) THEN
BEGIN
  FOR
    SELECT Temp.CodProduto, Temp.ValorTotal, Temp.CodLetraComissao,
           (SELECT Margem FROM CalculaMargemLucro
                   (:Empresa, 9, --FORÇA SEMPRE MARGEM DE LUCRO NORMAL
                    CASE
                        WHEN :TipoMargemLucro = 0 THEN (Temp.ValorCustoFor * Temp.FatorRedCusto)
                        WHEN :TipoMargemLucro = 1 THEN (Temp.ValorCustoUlt * Temp.FatorRedCusto)
                        WHEN :TipoMargemLucro = 2 THEN (Temp.ValorCustoMed)
                    END,
                    Temp.ValorUnitario, Temp.ValorUnitario * Temp.fatorredvenda,
                    Rs_RoundDec(Temp.ValorBaseICM * Temp.AliqICM / 100,2))) AS MargemLucro,
           /* Renato - 292957
           (SELECT Margem FROM CalculaLucroLiquido(Temp.QuantAtendida * Temp.ValorCustoUltReal,
                Temp.QuantAtendida * Temp.ValorUnitario, (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda)))
                AS MargemLucroLiquido,
           CASE WHEN (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) > (Temp.QuantAtendida * Temp.ValorCustoUltReal)
                THEN ((Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) - (Temp.QuantAtendida * Temp.ValorCustoUltReal))
                ELSE 0 END AS ValorLucroLiquido,
           */

           --304454
           --(SELECT Margem FROM CalculaLucroLiquido(Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
           (SELECT Margem FROM CalculaLucroLiquido(Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                              Then Temp.ValorCustoUltReal
                                                                              Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as Numeric(18,4)),
                Temp.QuantAtendida * Temp.ValorUnitario, (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda)))
                AS MargemLucroLiquido,
           CASE WHEN (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) >

                     --304454
                     --(Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                     (Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                 Then Temp.ValorCustoUltReal
                                                 Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as Numeric(18,4)))
                THEN ((Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) -
                   --304454
                    -- (Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                      (Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                 Then Temp.ValorCustoUltReal
                                                 Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as Numeric(18,4))))
                ELSE 0 END AS ValorLucroLiquido,

           Temp.TipoPrecoProduto, Temp.PercDesconto,Temp.PercDesconto1,Temp.PercDesconto2,Temp.PercDesconto3,Temp.PercDesconto4,Temp.PercDesconto5
           --JALDO/RAFAEL - 197595           
           ,:PercDescontoCondPagto           
      FROM TempPrce100Itens Temp
      WHERE Temp.Empresa = :Empresa
        AND Temp.CodPedido = :CodPedido
        AND Temp.Status <> 'E'
        AND Temp.Status <> 'L'
       INTO :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
            :MargemLucro, :MargemLucroLiquido, :ValorLucroLiquido, :TipoPrecoProduto, :PercDesconto, :PercDesconto1,
        :PercDesconto2,:PercDesconto3,:PercDesconto4,:PercDesconto5
        --JALDO/RAFAEL - 197595
        ,:PercDescontoCondPagto
  DO
  BEGIN
    SELECT InternoOK, ExternoOK, ParceiroOK,
           ValorInterno, ValorExterno, ValorParceiro
      FROM Calcular_Comissao(:Empresa, 1, :CodVendInterno, :CodVendExterno,
                             :CodVendParceiro, :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
                             :MargemLucro, :PrazoMedio, :TipoPrecoProduto,
                             :MargemLucroLiquido, :ValorLucroLiquido, :PercDesconto,:PercDesconto1,
                  :PercDesconto2,:PercDesconto3,:PercDesconto4,:PercDesconto5, :CodEntidade
                  --JALDO/RAFAEL - 197595
                 ,:PercDescontoCondPagto, 0)
       INTO :InternoOK, :ExternoOK, :ParceiroOK,
            :ValorInterno, :ValorExterno, :ValorParceiro;
    IF (InternoOK = 1) THEN
       AuxValorInterno = AuxValorInterno + ValorInterno;
    IF (ExternoOK = 1) THEN
       AuxValorExterno = AuxValorExterno + ValorExterno;
    IF (ParceiroOK = 1) THEN
       AuxValorParceiro = AuxValorParceiro + ValorParceiro;
  END
END
ELSE
BEGIN
  FOR
    SELECT Mov.CodProduto, Mov.ValorTotal, Mov.CodLetraComissao,
           (SELECT Margem FROM CalculaMargemLucro
                   (:Empresa, 9, --FORÇA SEMPRE MARGEM DE LUCRO NORMAL
                    CASE
                        WHEN :TipoMargemLucro = 0 THEN (Mov.ValorCustoFor * Mov.FatorRedCusto)
                        WHEN :TipoMargemLucro = 1 THEN (Mov.ValorCustoUlt * Mov.FatorRedCusto)
                        WHEN :TipoMargemLucro = 2 THEN (Mov.ValorCustoMed)
                    END,
                    Mov.ValorUnitario, Mov.ValorUnitario * Mov.fatorredvenda,
                    Rs_RoundDec(Mov.ValorBaseICM * Mov.AliqICM / 100,2))) AS MargemLucro,
            /* Renato - 292957
           (SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Mov.ValorCustoUltReal,
                Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
                AS MargemLucroLiquido,
           CASE WHEN (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) > (Mov.QuantAtendida * Mov.ValorCustoUltReal)
                THEN ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) - (Mov.QuantAtendida * Mov.ValorCustoUltReal))
                ELSE 0 END AS ValorLucroLiquido,
           */

           --304454
           --(SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0

           (SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                             Then Mov.ValorCustoUltReal
                                                                             Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as Numeric(18,4)),
                Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
                AS MargemLucroLiquido,
           CASE WHEN (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) >
                     --304454
                     --(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                       (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then Mov.ValorCustoUltReal
                                                Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as Numeric(18,4)))
                THEN ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) -
                      --304454
                      --(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                      (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                 Then Mov.ValorCustoUltReal
                                                 Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as Numeric(18,4))))
                ELSE 0 END AS ValorLucroLiquido,

           Mov.TipoPrecoProduto, Mov.PercDesconto, Mov.PercDesconto1, Mov.PercDesconto2, Mov.PercDesconto3, Mov.PercDesconto4, 
       Mov.PercDesconto5
       --JALDO/RAFAEL - 197595
      ,Mov.PercDescontoCondPagto       
      FROM MovEstoque Mov
      WHERE Mov.Empresa = :Empresa
        AND Mov.CodPedido = :CodPedido
       INTO :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
            :MargemLucro, :MargemLucroLiquido, :ValorLucroLiquido, :TipoPrecoProduto, :PercDesconto, :PercDesconto1, 
          :PercDesconto2, :PercDesconto3, :PercDesconto4, :PercDesconto5
          --JALDO/RAFAEL - 197595
          ,:PercDescontoCondPagto
  DO
  BEGIN
    SELECT InternoOK, ExternoOK, ParceiroOK,
           ValorInterno, ValorExterno, ValorParceiro
      FROM Calcular_Comissao(:Empresa, 1, :CodVendInterno, :CodVendExterno,
                             :CodVendParceiro, :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
                             :MargemLucro, :PrazoMedio, :TipoPrecoProduto,
                             :MargemLucroLiquido, :ValorLucroLiquido, :PercDesconto,:PercDesconto1, 
                    :PercDesconto2, :PercDesconto3, :PercDesconto4, :PercDesconto5, :CodEntidade
                    --JALDO/RAFAEL - 197595
                   ,:PercDescontoCondPagto, 0)
       INTO :InternoOK, :ExternoOK, :ParceiroOK,
            :ValorInterno, :ValorExterno, :ValorParceiro;
    IF (InternoOK = 1) THEN
       AuxValorInterno = AuxValorInterno + ValorInterno;
    IF (ExternoOK = 1) THEN
       AuxValorExterno = AuxValorExterno + ValorExterno;
    IF (ParceiroOK = 1) THEN
       AuxValorParceiro = AuxValorParceiro + ValorParceiro;
  END
END


ValorComissInterno = AuxValorInterno;
ValorComissExterno = AuxValorExterno;
ValorComissParceiro = AuxValorParceiro;

SUSPEND;
END

^





ALTER PROCEDURE STORED_PRFT110COMISSAO (
    empresa integer,
    tipocontrole integer,
    codcontrole integer)
as
declare variable auxvalor numeric(13,4);
declare variable internook integer;
declare variable externook integer;
declare variable parceirook integer;
declare variable valorinterno numeric(11,2);
declare variable valorexterno numeric(11,2);
declare variable valorparceiro numeric(11,2);
declare variable codvendinterno integer;
declare variable codvendexterno integer;
declare variable codvendparceiro integer;
declare variable auxcodproduto integer;
declare variable auxcodletracomissao char(5);
declare variable auxvalortotal numeric(13,4);
declare variable auxvalorinterno numeric(11,2);
declare variable auxvalorexterno numeric(11,2);
declare variable auxvalorparceiro numeric(11,2);
declare variable margemlucro numeric(5,2);
declare variable prazomedio integer;
declare variable tipomargemlucro integer;
declare variable tipoprecoproduto integer;
declare variable margemlucroliquido numeric(5,2);
declare variable valorlucroliquido numeric(13,4);
declare variable flagcomissaoservico smallint;
declare variable flagdevolucao smallint;
declare variable percdesconto numeric(8,4);
declare variable codentidade char(7);
declare variable percdesconto1 numeric(5,2);
declare variable percdesconto2 numeric(5,2);
declare variable percdesconto3 numeric(5,2);
declare variable percdesconto4 numeric(5,2);
declare variable percdesconto5 numeric(5,2);
declare variable relacaovendedores smallint;
declare variable auxvalorbasecomissao numeric(11,2);
declare variable percdescontocondpagto numeric(8,4);
declare variable valorservicostotal numeric(11,2);
declare variable tipomargemliquida integer;
BEGIN
/*FB*/
--Zera as de acumulo de comissao
AuxValorInterno = 0;
AuxValorExterno = 0;
AuxValorParceiro = 0;
AuxValorBaseComissao = 0;
-- JALDO/RAFAEL -197595
PercDescontoCondPagto = 0;

SELECT
  TipoMargemLucro, FlagComissaoServico, FlagTipoRelacaoVendedores
FROM
  ParamControle
WHERE Empresa = :Empresa
  INTO :TipoMargemLucro, :FlagComissaoServico, :RelacaoVendedores;

--304454
--Renato - 292957
--Select FlagMargemLiquidaGerencial
Select TipoMargemLiquida
From ConfiguracaoSistema
--304454
--into :FlagMargemLiquidaGerencial;
into :TipoMargemLiquida;

SELECT
  NF.CodVendInterno,
  NF.CodVendExterno,
  NF.CodVendParceiro,
  --Karina - 128025
  CASE WHEN :RelacaoVendedores = 0
       THEN (NF.ValorProdutos + NF.ValorServicos - NF.ValorDesconto - NF.ValorDescontoServicos)
       WHEN :RelacaoVendedores = 1
       THEN (NF.ValorTotalNota)
  END,
  (SELECT Margem FROM CalculaMargem(:Empresa,
                          CASE :TipoMargemLucro
                            WHEN 0 THEN VN.ValorCustoFor
                            WHEN 1 THEN VN.ValorCustoFor
                            WHEN 2 THEN VN.ValorCustoFor
                          END,
                          (NF.ValorProdutos - NF.ValorDesconto))),
  NF.PrazoMedio,
  (CASE COALESCE(Op.TipoMovimento,0) WHEN 1 THEN 1 ELSE 0 END),
  NF.CodEntidade
  -- JALDO/RAFAEL - 197595
  ,COALESCE((SELECT max(Mov.PercDescontoCondPagto)
             FROM MOVESTOQUE MOV
             WHERE MOV.Empresa = NF.Empresa
               and MOV.TipoControle = NF.TipoControle
               and MOV.CodControle = NF.CodControle),0),
  --279456
  NF.valorservicos - NF.valordescontoservicos
FROM
  NotasFiscais NF
  LEFT JOIN ViewNotasFiscais VN ON VN.Empresa = :Empresa
                                   AND VN.TipoControle = :TipoControle
                                   AND VN.CodControle = :CodControle
  LEFT JOIN Operacoes Op ON Op.Codigo = NF.CodOperacao
WHERE
  NF.Empresa = :Empresa
  AND NF.TipoControle = :TipoControle
  AND NF.CodControle = :CodControle
INTO
  :CodVendInterno,
  :CodVendExterno,
  :CodVendParceiro,
  :AuxValorTotal,
  :MargemLucro,
  :PrazoMedio,
  :flagdevolucao,
  :CodEntidade,
  -- JALDO/RAFAEL -197595
  :PercDescontoCondPagto,
--279456
  :valorservicostotal
  ;

AuxValorBaseComissao = AuxValorTotal;

--102759
IF ((TipoControle = 1) AND (FlagDevolucao = 1)) THEN
BEGIN
  SELECT MAX(COALESCE(NF.PrazoMedio,:PrazoMedio))
  FROM MovEstoque Mov
    LEFT JOIN MovEstoqueReferencia MAux ON MAux.Empresa = Mov.Empresa 
      AND MAux.NumLancamento = Mov.NumLancamento
      AND MAux.TipoReferencia = 1
    LEFT JOIN MovEstoque MRef ON MRef.Empresa = MAux.empresaReferencia
      AND MRef.NumLancamento = MAux.NumLancamentoReferencia
    LEFT JOIN NotasFiscais NF ON NF.Empresa = MRef.Empresa
       AND NF.TipoControle = MRef.TipoControle
       AND NF.Codcontrole = MRef.CodControle
  WHERE Mov.Empresa = :Empresa
    AND Mov.TipoControle = :TipoControle
    AND Mov.CodControle = :CodControle
  INTO
    :PrazoMedio;
END
/* Renato - 292957
SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(Mov.QuantAtendida * Mov.ValorCustoUltReal),
              SUM(Mov.QuantAtendida * Mov.ValorUnitario), SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda))),
       CASE WHEN (SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)) > SUM(Mov.QuantAtendida * Mov.ValorCustoUltReal)
            THEN (SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) - SUM(Mov.QuantAtendida * Mov.ValorCustoUltReal))
            ELSE 0 END
*/
--304454
--SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
 SELECT (SELECT Margem FROM CalculaLucroLiquido(SUM(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                             Then Mov.ValorCustoUltReal
                                                                             Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))),
              SUM(Mov.QuantAtendida * Mov.ValorUnitario), SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda))),
       CASE WHEN (SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)) >
       --304454
       --SUM(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
       SUM(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then Mov.ValorCustoUltReal
                                                Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)))
            THEN (SUM(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) -
                --304454
                --  SUM(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0

                SUM(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                Then Mov.ValorCustoUltReal
                                                Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))))
            ELSE 0 END


            --353932
         ,( Select first  1  Mov2.CodLetraComissao  From  MovEstoque Mov2
            WHERE  Mov2.Empresa=:Empresa
               AND Mov2.TipoControle=:TipoControle
               AND Mov2.CodControle=:CodControle
               AND Mov2.CodLetraComissao  <> ''
               AND ((Mov2.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR (Mov2.CodProduto <> 8888888))

         )


    FROM MovEstoque Mov
    WHERE Mov.Empresa=:Empresa
      AND Mov.TipoControle=:TipoControle
      AND Mov.CodControle=:CodControle
      AND ((Mov.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR (Mov.CodProduto <> 8888888))

 INTO :MargemLucroLiquido, :ValorLucroLiquido,
      --353932
      :AuxCodLetraComissao;

IF (MargemLucroLiquido IS NULL) THEN
  MargemLucroLiquido = 0;
IF (ValorLucroLiquido IS NULL) THEN
  ValorLucroLiquido = 0;

--Verifica se existem comissoes calculadas sobre o valor do pedido.
SELECT
  InternoOK, ExternoOK, ParceiroOK,
  ValorInterno, ValorExterno, ValorParceiro
FROM
  Calcular_Comissao(:Empresa, 2, :CodVendInterno, :CodVendExterno, :CodVendParceiro,
                    NULL, :AuxValorTotal, :AuxCodLetraComissao,
                    :MargemLucro, :PrazoMedio, 0,
                    :MargemLucroLiquido, :ValorLucroLiquido, 0,0,0,0,0,0, :CodEntidade
                    --JALDO/RAFAEL 197595
                   ,:PercDescontoCondPagto
--279456
                    ,:valorservicostotal)
INTO
  :InternoOK,
  :ExternoOK,
  :ParceiroOK,
  :ValorInterno,
  :ValorExterno,
  :ValorParceiro;

IF (InternoOK = 1) THEN
  AuxValorInterno = ValorInterno;
IF (ExternoOK = 1) THEN
  AuxValorExterno = ValorExterno;
IF (ParceiroOK = 1) THEN
  AuxValorParceiro = ValorParceiro;

FOR
  SELECT
    CodProduto, ValorTotal, CodLetraComissao,
    --JALDO - CHAMADO 313712
    /*
    (SELECT Margem FROM CalculaMargem(:Empresa, CASE :TipoMargemLucro
                                                WHEN 0 THEN (Mov.ValorCustoFor * Mov.FatorRedCusto)
                                                WHEN 1 THEN (Mov.ValorCustoUlt * Mov.FatorRedCusto)
                                                WHEN 2 THEN (Mov.ValorCustoMed)
                                              END,
                                      Mov.ValorUnitario)) AS MargemLucro,
    */
    (SELECT Margem FROM CalculaMargemLucro
              (:Empresa, 9, --FORÇA SEMPRE MARGEM DE LUCRO NORMAL
                CASE
                  WHEN :TipoMargemLucro = 0 THEN (Mov.ValorCustoFor * Mov.FatorRedCusto)
                  WHEN :TipoMargemLucro = 1 THEN (Mov.ValorCustoUlt * Mov.FatorRedCusto)
                  WHEN :TipoMargemLucro = 2 THEN (Mov.ValorCustoMed)
                END,
                Mov.ValorUnitario, Mov.ValorUnitario * Mov.FatorRedVenda,
                Rs_RoundDec(Mov.ValorBaseICM * Mov.AliqICM / 100,2))) as MargemLucro,
       /* Renato - 292957
       (SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Mov.ValorCustoUltReal,
            Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
            AS MargemLucroLiquido,
       CASE WHEN (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) > (Mov.QuantAtendida * Mov.ValorCustoUltReal)
            THEN ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) - (Mov.QuantAtendida * Mov.ValorCustoUltReal))
            ELSE 0 END AS ValorLucroLiquido,
       */

       --304454
       --(SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
       (SELECT Margem FROM CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                         Then Mov.ValorCustoUltReal
                                                                         Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)),
            Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
            AS MargemLucroLiquido,
       CASE WHEN (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) >
                  --304454
                 --(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                   (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                            Then Mov.ValorCustoUltReal
                                            Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)))
            THEN ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) -

                --304454
                -- (Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                            Then Mov.ValorCustoUltReal
                                            Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))))
            ELSE 0 END AS ValorLucroLiquido,
       Mov.TipoPrecoProduto , Mov.PercDesconto,Mov.PercDesconto1,Mov.PercDesconto2, Mov.PercDesconto3,
       Mov.PercDesconto4, Mov.PercDesconto5, Mov.CodEntidade
       --JALDO/RAFAEL - 197595
      ,Mov.PercDescontoCondPagto
    FROM
      MovEstoque Mov
    WHERE
      Empresa = :Empresa
      AND TipoControle = :TipoControle
      AND CodControle = :CodControle
    INTO
      :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
      :MargemLucro, :MargemLucroLiquido, :ValorLucroLiquido, :TipoPrecoProduto, :PercDesconto, :PercDesconto1, :PercDesconto2, 
      :PercDesconto3, :PercDesconto4, :PercDesconto5, :CodEntidade
      --JALDO/RAFAEL - 197595
     ,:PercDescontoCondPagto
DO
BEGIN
  SELECT
     InternoOK, ExternoOK, ParceiroOK,
     ValorInterno, ValorExterno, ValorParceiro
   FROM
     Calcular_Comissao(:Empresa, 1, :CodVendInterno, :CodVendExterno,
                       :CodVendParceiro, :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
                       :MargemLucro, :PrazoMedio, :TipoPrecoProduto,
                       :MargemLucroLiquido, :ValorLucroLiquido,:PercDesconto,:PercDesconto1, :PercDesconto2, 
               :PercDesconto3, :PercDesconto4, :PercDesconto5, :CodEntidade
               --JALDO/RAFAEL - 197595
              ,:PercDescontoCondPagto, 0)
  INTO
    :InternoOK,
    :ExternoOK,
    :ParceiroOK,
    :ValorInterno,
    :ValorExterno,
    :ValorParceiro;

  IF (InternoOK = 1) THEN
    AuxValorInterno = AuxValorInterno + ValorInterno;
  IF (ExternoOK = 1) THEN
    AuxValorExterno = AuxValorExterno + ValorExterno;
  IF (ParceiroOK = 1) THEN
    AuxValorParceiro = AuxValorParceiro + ValorParceiro;
END

--Altera o Valor das comissoes na nota fiscal
UPDATE NotasFiscais SET
  ValorComissaoInterno = :AuxValorInterno,
  ValorComissaoExterno = :AuxValorExterno,
  ValorComissaoParceiro = :AuxValorParceiro,
  ValorBaseComissao = :AuxValorBaseComissao,
  StatusTransacao = 1
WHERE
  Empresa = :Empresa
  AND TipoControle = :TipoControle
  AND CodControle = :CodControle;

SUSPEND;
END

^









ALTER PROCEDURE STORED_PRUT040 (
    empresa integer,
    datainicial timestamp,
    datafinal timestamp)
as
declare variable internook integer;
declare variable externook integer;
declare variable parceirook integer;
declare variable valorinterno numeric(11,2);
declare variable valorexterno numeric(11,2);
declare variable valorparceiro numeric(11,2);
declare variable codvendinterno integer;
declare variable codvendexterno integer;
declare variable codvendparceiro integer;
declare variable qtdtotal integer;
declare variable auxcodproduto integer;
declare variable auxvalortotal numeric(13,4);
declare variable auxvalorinterno numeric(11,2);
declare variable auxvalorexterno numeric(11,2);
declare variable auxvalorparceiro numeric(11,2);
declare variable auxcodletracomissao char(5);
declare variable margemlucro numeric(5,2);
declare variable prazomedio integer;
declare variable tipomargemlucro integer;
declare variable codpedido integer;
declare variable tipocontrole integer;
declare variable codcontrole integer;
declare variable codduplicata varchar(15);
declare variable tipoprecoproduto integer;
declare variable margemlucroliquido numeric(5,2);
declare variable valorlucroliquido numeric(13,4);
declare variable tipoduplicata smallint;
declare variable flagdevolucao smallint;
declare variable flagcomissaoservico smallint;
declare variable percdesconto numeric(8,4);
declare variable codentidade char(7);
declare variable percdesconto1 numeric(5,2);
declare variable percdesconto2 numeric(5,2);
declare variable percdesconto3 numeric(5,2);
declare variable percdesconto4 numeric(5,2);
declare variable percdesconto5 numeric(5,2);
declare variable relacaovendedores smallint;
declare variable primeiraduplicata varchar(15);
declare variable valorcomissaointernonota numeric(11,2);
declare variable valorcomissaoexternonota numeric(11,2);
declare variable valorcomissaoparceironota numeric(11,2);
declare variable valortotalnota numeric(11,2);
declare variable codvendinternonf integer;
declare variable codvendexternonf integer;
declare variable codvendparceironf integer;
declare variable valortitulodupl numeric(11,2);
declare variable valoripi numeric(11,2);
declare variable valorfrete numeric(11,2);
declare variable valoricm numeric(11,2);
declare variable valorsubtrib numeric(11,2);
declare variable valordespesas numeric(11,2);
declare variable codcondpagto char(5);
declare variable flagsomaipi smallint;
declare variable flagsomafrete smallint;
declare variable flagsomaicm smallint;
declare variable flagsomasubtrib smallint;
declare variable flagsomadespesas smallint;
declare variable valoresadicionais numeric(11,2);
declare variable valorbasecomissao numeric(11,2);
declare variable percdescontocondpagto numeric(8,4);
declare variable valorservicostotal numeric(11,2);
declare variable tipomargemliquida integer;
begin
/*FB*/
Select
  TipoMargemLucro, FlagComissaoServico, FlagTipoRelacaoVendedores
From
  ParamControle
Where
  Empresa = :Empresa
Into :TipoMargemLucro, :FlagComissaoServico, :RelacaoVendedores;
--304454
--Renato - 292957
--Select FlagMargemLiquidaGerencial
Select TipoMargemLiquida
From ConfiguracaoSistema
--304454
--into :FlagMargemLiquidaGerencial;
into :TipoMargemLiquida;

--------------------------------------------------
--- RECALCULAR COMISSAO DOS PEDIDOS      ---------
--------------------------------------------------
For
  Select
    CodPedido
  From
    Pedidos
  Where
    Empresa = :Empresa
    and DataMovimento between :DataInicial and :DataFinal
    and TipoPedido <> 4
--(nao considera pedido de entrada)
  Into
    :CodPedido
do
begin
--Zera as variaveis de acumulo de comissão do pedido
  AuxValorInterno = 0;
  AuxValorExterno = 0;
  AuxValorParceiro = 0;

  Select
    Case when :RelacaoVendedores = 0
         then  min(Ped.ValorProdutos + Ped.ValorServicos - Ped.ValorDesconto - Ped.ValorDescontoServicos)
         when :RelacaoVendedores = 1
         then  min(Ped.ValorTotalPedido)
    End,
    min(Ped.CodVendInterno),
    min(Ped.CodVendExterno),
    min(Ped.CodVendParceiro),
    --JALDO - CHAMADO 313712
    /*
    (Select Margem From CalculaMargem(:Empresa, Case :TipoMargemLucro
                                                 When 0 then min(VP.ValorCustoFor)
                                                 When 1 then min(VP.ValorCustoFor)
                                                 When 2 then min(VP.ValorCustoFor)
                                               End,
                                     (min(Ped.ValorProdutos) - min(Ped.ValorDesconto))
                                    )),
    */
    (SELECT Margem FROM CalculaMargemLucro
            (:Empresa, 9, --FORCA SEMPRE MARGEM DE LUCRO NORMAL
              (CASE
                WHEN :TipoMargemLucro = 0 THEN min(Ped.ValorCustoForTotal)
                WHEN :TipoMargemLucro = 1 THEN min(Ped.ValorCustoUltTotal)
                WHEN :TipoMargemLucro = 2 THEN min(Ped.ValorCustoMedTotal)
              END) + min(Ped.ValorCustoSerTotal),
              min(Ped.ValorProdutos)+min(Ped.ValorServicos)-min(Ped.ValorDesconto)-min(Ped.ValorDescontoServicos),
              min(Ped.ValorProdutosSemImpostos)+min(Ped.ValorServicos)-min(Ped.ValorDescontoServicos),
              min(Ped.ValorICM))),
    min(Ped.PrazoMedio),
    /* Renato - 292957
    (Select Margem From CalculaLucroLiquido(Sum(Mov.QuantAtendida * Mov.ValorCustoUltReal),
            Sum(Mov.QuantAtendida * Mov.ValorUnitario), Sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda))),
    Case When (sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)) > Sum(Mov.QuantAtendida * Mov.ValorCustoUltReal)
         Then (Sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) - Sum(Mov.QuantAtendida * Mov.ValorCustoUltReal))
         Else 0 End,
    */
    --304454
    --(Select Margem From CalculaLucroLiquido(Sum(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
    (Select Margem From CalculaLucroLiquido(Sum(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                          Then Mov.ValorCustoUltReal
                                                                          Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))),
            Sum(Mov.QuantAtendida * Mov.ValorUnitario), Sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda))),
    Case When (sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)) >
               --304454
               --Sum(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
               Sum(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                             Then Mov.ValorCustoUltReal
                                             Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)))
         Then (Sum(Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) -

              --304454
              --Sum(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
              Sum(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                 Then Mov.ValorCustoUltReal
                                                 Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))))
         Else 0 End,

    Min(Ped.CodEntidade)
     --JALDO/RAFAEL - 197595    
   ,Max(Mov.PercDescontoCondPagto),
--279456
   Min(Ped.ValorServicos - Ped.ValorDescontoServicos),
   --319353
   ( Select First 1  mov2.CodLetraComissao
     From MovEstoque mov2
     where
           Mov2.Empresa = :Empresa
       and Mov2.CodPedido = :CodPedido
       and mov2.CodLetraComissao <> ''
   )


  From
    Pedidos Ped
    Left Join ViewPedidos VP on VP.Empresa = :Empresa and VP.CodPedido = :CodPedido
    Left Join MovEstoque Mov on Mov.Empresa = :Empresa and Mov.CodPedido = :CodPedido
  Where Ped.Empresa = :Empresa
    and Ped.CodPedido = :CodPedido
    and ((Mov.CodProduto = 8888888 and :FlagComissaoServico = 1) or (Mov.CodProduto <> 8888888))

  Into
    :AuxValorTotal,
    :CodVendInterno,
    :CodVendExterno,
    :CodVendParceiro,
    :MargemLucro,
    :PrazoMedio,
    :MargemLucroLiquido,
    :ValorLucroLiquido,
    :CodEntidade,
    --JALDO/RAFAEL - 197595
    :PercDescontoCondPagto,
--279456
    :ValorServicosTotal,
    --319353
    :AuxCodLetraComissao;


--Verifica se existem comissoes calculadas sobre o valor do pedido.
  Select
    InternoOK, ExternoOK, ParceiroOK,
    ValorInterno, ValorExterno, ValorParceiro
  From
    Calcular_Comissao(:Empresa, 2, :CodVendInterno, :CodVendExterno,
                      :CodVendParceiro, null, :AuxValorTotal, :AuxCodLetraComissao, :MargemLucro,
                      :PrazoMedio, 0,
                      :MargemLucroLiquido,:ValorLucroLiquido, 0,0,0,0,0,0, :CodEntidade
                      --JALDO/RAFAEL - 197595
                     ,:PercDescontoCondPagto,
--279456
                      :ValorServicosTotal)
  Into
    :InternoOK,
    :ExternoOK,
    :ParceiroOK,
    :ValorInterno,
    :ValorExterno,
    :ValorParceiro;

  If (InternoOK = 1) then
    AuxValorInterno = ValorInterno;
  If (ExternoOK = 1) then
    AuxValorExterno = ValorExterno;
  If (ParceiroOK = 1) then
    AuxValorParceiro = ValorParceiro;

  For
    Select
      CodProduto, ValorTotal, CodLetraComissao,
      --JALDO - CHAMADO 313712
      /*
      (select Margem From CalculaMargem(:Empresa,
                                        Case :TipoMargemLucro
                                          When 0 Then (Mov.ValorCustoFor * Mov.FatorRedCusto)
                                          When 1 Then (Mov.ValorCustoUlt * Mov.FatorRedCusto)
                                          When 2 Then (Mov.ValorCustoMed) End,
                                        Mov.ValorUnitario
                                       )) as MargemLucro,
       */
       (SELECT Margem FROM CalculaMargemLucro
            (:Empresa, 9, --FORCA SEMPRE MARGEM DE LUCRO NORMAL
              CASE
                WHEN :TipoMargemLucro = 0 THEN (Mov.ValorCustoFor * Mov.FatorRedCusto)
                WHEN :TipoMargemLucro = 1 THEN (Mov.ValorCustoUlt * Mov.FatorRedCusto)
                WHEN :TipoMargemLucro = 2 THEN (Mov.ValorCustoMed)
              END,
              Mov.ValorUnitario * Mov.QuantAtendida,
              Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda,
              ((Mov.ValorBaseICM * Mov.AliqICM)/100))) as MargemLucro,
        /* Renato - 292957
        (Select Margem From CalculaLucroLiquido(Mov.QuantAtendida * Mov.ValorCustoUltReal,
             Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
             as MargemLucroLiquido,
        Case When (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) > (Mov.QuantAtendida * Mov.ValorCustoUltReal)
             Then ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) - (Mov.QuantAtendida * Mov.ValorCustoUltReal))
             Else 0 End as ValorLucroLiquido,

        */
        --304454
        --(Select Margem From CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
        (Select Margem From CalculaLucroLiquido(Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                          Then Mov.ValorCustoUltReal
                                                                          Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)),
             Mov.QuantAtendida * Mov.ValorUnitario, (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda)))
             as MargemLucroLiquido,
        Case When (Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) >
                 --304454
                 --(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                  (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                             Then Mov.ValorCustoUltReal
                                             Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4)))
             Then ((Mov.QuantAtendida * Mov.ValorUnitario * Mov.FatorRedVenda) -
                   --304454
                   --(Mov.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                     (Mov.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                              Then Mov.ValorCustoUltReal
                                              Else (Mov.ValorCustoFor * Mov.FatorRedCusto) End) as numeric(18,4))))
             Else 0 End as ValorLucroLiquido,
        TipoPrecoProduto, PercDesconto, PercDesconto1, PercDesconto2, PercDesconto3, PercDesconto4, PercDesconto5, CodEntidade
        --JALDO/RAFAEL - 197595
        ,PercDescontoCondPagto
      From
        MovEstoque Mov
      Where
        Empresa = :Empresa
        and CodPedido = :CodPedido
      Into
        :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
        :MargemLucro, :MargemLucroLiquido, :ValorLucroLiquido, :TipoPrecoProduto, :PercDesconto, :PercDesconto1, :PercDesconto2, 
    :PercDesconto3, :PercDesconto4, :PercDesconto5, :CodEntidade
    --JALDO/RAFAEL - 197595
   ,:PercDescontoCondPagto
  do
  begin
    Select
        InternoOK, ExternoOK, ParceiroOK,
        ValorInterno, ValorExterno, ValorParceiro
      From
        Calcular_Comissao(:Empresa, 1, :CodVendInterno, :CodVendExterno,
                          :CodVendParceiro, :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao, :MargemLucro,
                          :PrazoMedio, :TipoPrecoProduto, :MargemLucroLiquido, :ValorLucroLiquido, :PercDesconto,
                          :PercDesconto1, :PercDesconto2, :PercDesconto3, :PercDesconto4, :PercDesconto5,:CodEntidade
                          --JALDO/RAFAEL - 197595
                         ,:PercDescontoCondPagto, 0)
      Into
        :InternoOK,
        :ExternoOK,
        :ParceiroOK,
        :ValorInterno,
        :ValorExterno,
        :ValorParceiro;

      If (InternoOK = 1) then
        AuxValorInterno = AuxValorInterno + ValorInterno;
      If (ExternoOK = 1) then
        AuxValorExterno = AuxValorExterno + ValorExterno;
      If (ParceiroOK = 1) then
        AuxValorParceiro = AuxValorParceiro + ValorParceiro;
  End
--Altera as Comissões no Pedido
  Update Pedidos Set
    ValorComissInterno = :AuxValorInterno,
    ValorComissExterno = :AuxValorExterno,
    ValorComissParceiro = :AuxValorParceiro
  Where
    Empresa = :Empresa
    and CodPedido = :CodPedido;
End

--------------------------------------------------
--- RECALCULAR COMISSAO DA NOTA FISCAL   ---------
--------------------------------------------------
For
  Select
    NF.TipoControle, NF.CodControle,
    Case rs_invl(Op.TipoMovimento,0) When 1 then 1 else 0 end,
    NF.ValorTotalNota, NF.ValorIPI, NF.ValorFrete, NF.ValorICM, NF.ValorSubTrib, NF.ValorDespesas,
    NF.CodCondPagto, NF.ValorComissaoInterno, NF.ValorComissaoExterno, NF.ValorComissaoParceiro,
    NF.CodVendInterno, NF.CodVendExterno, NF.CodVendParceiro,
    --133864
    NF.ValorBaseComissao
  From
    NotasFiscais NF
    Left Join Operacoes Op on Op.Codigo = NF.CodOperacao
  Where
    NF.Empresa = :Empresa
    and NF.DataMovimento between :DataInicial and :DataFinal
    and (NF.TipoControle = 2
         or
         (NF.TipoControle = 1 and rs_invl(op.tipomovimento, 0) = 1)
        )
--Somente notas de saida
  Into
    :TipoControle, :CodControle, :FlagDevolucao, :ValorTotalNota,
    :ValorIPI, :ValorFrete, :ValorICM, :ValorSubTrib, :ValorDespesas,
    :CodCondPagto, :ValorComissaoInternoNota, :ValorComissaoExternoNota, :ValorComissaoParceiroNota,
    :CodVendInternoNF, :CodVendExternoNF, :CodVendParceiroNF, :ValorBaseComissao
do
begin
    ValoresAdicionais = 0;
    --Karina - 125968
    if (RelacaoVendedores = 0) Then
    begin
      Select  FlagSomaIPI, FlagSomaFrete, FlagSomaICM,  FlagSomaSubTrib,
              FlagSomaDespesas
      From CondPagto
      where Codigo = :CodCondPagto
      Into :FlagSomaIPI, :FlagSomaFrete, :FlagSomaICM, :FlagSomaSubTrib, :FlagSomaDespesas;
    
      if (FlagSomaIPI = 1) then
        ValoresAdicionais = ValoresAdicionais + ValorIPI;
      if (FlagSomaFrete = 1) then
        ValoresAdicionais = ValoresAdicionais + ValorFrete;
      if (FlagSomaICM = 1) then
        ValoresAdicionais = ValoresAdicionais + ValorICM ;
      if (FlagSomaSubTrib = 1) then
        ValoresAdicionais = ValoresAdicionais + ValorSubTrib;
      if (FlagSomaDespesas = 1) then
        ValoresAdicionais = ValoresAdicionais + ValorDespesas;

      ValorTotalNota = ValorTotalNota - ValoresAdicionais; 
    end   

  -- se for devolução, tem que inverter o controle para referencia o tipoduplicata
    TipoDuplicata = Case FlagDevolucao
                      When 1 then
                        Case TipoControle When 1 Then 2 Else 1 End
                      Else TipoControle
                    End;

--Calcula a Comissao da Nota Fiscal
  Execute Procedure Stored_Prft110Comissao(:Empresa, :TipoControle, :CodControle);

  PrimeiraDuplicata = '';


--Calcula a Comissao das Duplicatas da nota
  For
    Select
      CodDuplicata,
      (Select Count(*) From Duplicatas
         Where
           Empresa = :Empresa
           and TipoDuplicata = :TipoDuplicata
           and TipoControle = :TipoControle
           and CodControle = :CodControle) as QtdTotal, ValorTitulo 
    From
      Duplicatas
    Where
      Empresa = :Empresa
      and TipoDuplicata = :TipoDuplicata
      and CodControle = :CodControle
      and TipoControle = :TipoControle
    Into
      :CodDuplicata, :QtdTotal, :ValorTituloDupl    
  do
  begin
    if (PrimeiraDuplicata = '') then
    begin
      if (RelacaoVendedores = 0) then
        ValorTituloDupl = ValorTituloDupl - (ValoresAdicionais * Case FlagDevolucao When 1 then -1 Else 1 End);

      PrimeiraDuplicata = CodDuplicata;
    end

--Calculo da Comissao da Duplicata
    Update Duplicatas Set
      ValorComissaoInterno = case :ValorTotalNota when 0.00 then 0.00 else
      --Rafael chamado 252414
      --      rs_dnvl(((:ValorTituloDupl / :ValorTotalNota) * ((:ValorComissaoInternoNota *
      rs_dnvl(((Abs(:ValorTituloDupl) / :ValorTotalNota) * ((:ValorComissaoInternoNota *
                            (Select AliqComissaoDup From Vendedores Where Codigo= :CodVendInternoNF)) / 100)),0)
                                         * Case :FlagDevolucao When 1 Then -1 Else 1 End End
                                         ,

      ValorComissaoExterno = case :ValorTotalNota when 0.00 then 0.00 else
      --Rafael chamado 252414
      --      rs_dnvl(((:ValorTituloDupl / :ValorTotalNota) * ((:ValorComissaoExternoNota *
      rs_dnvl(((Abs(:ValorTituloDupl) / :ValorTotalNota) * ((:ValorComissaoExternoNota *
                            (Select AliqComissaoDup From Vendedores Where Codigo= :CodVendExternoNF)) / 100)),0)
                                         * Case :FlagDevolucao When 1 Then -1 Else 1 End End,

      ValorComissaoParceiro = case :ValorTotalNota when 0.00 then 0.00 else
      --Rafael chamado 252414
      --rs_dnvl(((:ValorTituloDupl / :ValorTotalNota) * ((:ValorComissaoParceiroNota *
      rs_dnvl(((Abs(:ValorTituloDupl) / :ValorTotalNota) * ((:ValorComissaoParceiroNota *
                            (Select AliqComissaoDup From Vendedores Where Codigo= :CodVendParceiroNF)) / 100)),0)
                                         * Case :FlagDevolucao When 1 Then -1 Else 1 End End,
      --133864
      ValorBaseComissao = case :ValorTotalNota when 0.00 then 0.00 else
            Abs((:ValorTituloDupl / :ValorTotalNota) * :ValorBaseComissao) End
    Where
      Empresa = :Empresa
      and TipoDuplicata = :TipoDuplicata
      and CodDuplicata = :CodDuplicata;

  end

    /* Karina - 125968 - Calculando a Diferença entre a comissão da Nota Fiscal e o Total de Comissão das Duplicatas */
 Update Duplicatas
    Set ValorComissaoInterno = ValorComissaoInterno + Coalesce(((:ValorComissaoInternoNota * Case :FlagDevolucao When 1 Then -1 Else 1 End)-
                     (Select Sum(Dupl.ValorComissaoInterno) 
                  From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),

        ValorComissaoExterno = ValorComissaoExterno + Coalesce(((:ValorComissaoExternoNota * Case :FlagDevolucao When 1 Then -1 Else 1 End)-
                     (Select Sum(Dupl.ValorComissaoExterno) 
                  From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),
                       
        ValorComissaoParceiro = ValorComissaoParceiro + Coalesce(((:ValorComissaoParceiroNota * Case :FlagDevolucao When 1 Then -1 Else 1 End)-
                     (Select Sum(Dupl.ValorComissaoParceiro) 
                  From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and
                                     Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0),
       
        --133864
        ValorBaseComissao = ValorBaseComissao + Abs(coalesce(((:ValorBaseComissao) -
                   (Select Sum(Dupl.ValorBaseComissao)           
                    From Duplicatas Dupl where Dupl.Empresa=:Empresa and Dupl.TipoDuplicata=:TipoDuplicata and
                      Dupl.TipoControle = :TipoControle and Dupl.CodControle=:CodControle )),0))

       Where Empresa = :Empresa and TipoDuplicata = :TipoDuplicata and CodDuplicata = :PrimeiraDuplicata and
             (ValorComissaoInterno <> 0 and ValorComissaoExterno <> 0 and ValorComissaoParceiro <> 0);
        

--Subtrai a comissao da duplicata da comissao da nota
  Update NotasFiscais Set
    ValorComissaoInterno = ValorComissaoInterno -
                                ((ValorComissaoInterno * rs_dnvl((Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendInterno),0)) / 100),
    ValorComissaoExterno = ValorComissaoExterno -
                                ((ValorComissaoExterno * rs_dnvl((Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendExterno),0)) / 100),
    ValorComissaoParceiro = ValorComissaoParceiro -
                                ((ValorComissaoParceiro * rs_dnvl((Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendParceiro),0)) / 100)
  Where
    Empresa = :Empresa
    and TipoControle = :TipoControle
    and CodControle = :CodControle
    and ( (Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendInterno) not in(0,100) or
          (Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendExterno) not in(0,100) or
          (Select AliqComissaoDup From Vendedores Where Codigo = NotasFiscais.CodVendParceiro) not in(0,100)
        );
end
suspend;
END

^




ALTER PROCEDURE STORED_PRCE050COMISSAO (
    empresa integer,
    tipocontrole integer,
    codcontrole integer,
    codvendinterno integer,
    codvendexterno integer,
    codvendparceiro integer,
    valorprodutos numeric(11,2),
    valorservicos numeric(11,2),
    valordesconto numeric(11,2),
    valordescontoservicos numeric(11,2),
    margemlucro numeric(5,2),
    prazomedio numeric(5,2),
    percdescontocondpagto numeric(8,4))
returns (
    valorcomissinterno numeric(11,2),
    valorcomissexterno numeric(11,2),
    valorcomissparceiro numeric(11,2))
as
declare variable internook integer;
declare variable externook integer;
declare variable parceirook integer;
declare variable valorinterno numeric(11,2);
declare variable valorexterno numeric(11,2);
declare variable valorparceiro numeric(11,2);
declare variable auxcodletracomissao char(5);
declare variable auxcodproduto integer;
declare variable auxvalortotal numeric(13,4);
declare variable auxvalorinterno numeric(11,2);
declare variable auxvalorexterno numeric(11,2);
declare variable auxvalorparceiro numeric(11,2);
declare variable tipomargemlucro integer;
declare variable tipoprecoproduto integer;
declare variable margemlucroliquido numeric(5,2);
declare variable valorlucroliquido numeric(13,4);
declare variable flagcomissaoservico smallint;
declare variable percdesconto numeric(8,4);
declare variable codentidade char(7);
declare variable percdesconto1 numeric(5,2);
declare variable percdesconto2 numeric(5,2);
declare variable percdesconto3 numeric(5,2);
declare variable percdesconto4 numeric(5,2);
declare variable percdesconto5 numeric(5,2);
declare variable valorservicostotal numeric(11,2);
declare variable tipomargemliquida integer;
begin
/*FB*/
/*Zera as variaveis de retorno */
AuxValorInterno = 0;
AuxValorExterno = 0;
AuxValorParceiro = 0;

AuxValorTotal =  (ValorProdutos + ValorServicos - ValorDesconto - ValorDescontoServicos);

--279456
valorservicostotal = (valorservicos - ValorDescontoServicos);

Select TipoMargemLucro, FlagComissaoServico
  From ParamControle
 Where Empresa = :empresa
into :TipoMargemLucro, :FlagComissaoServico;

--304454
--Renato - 292957
--Select FlagMargemLiquidaGerencial
Select TipoMargemLiquida
From ConfiguracaoSistema
--304454
--into :FlagMargemLiquidaGerencial;
into :TipoMargemLiquida;


--Karina - 123971
Select CodEntidade
 From NotasFiscais    
 Where Empresa         = :Empresa
      and TipoControle = :TipoControle
      and CodControle  = :CodControle
Into :CodEntidade;
/* Renato - 292957
Select (Select Margem From CalculaLucroLiquido(Sum(T.QuantAtendida * T.ValorCustoUltReal),
              Sum(T.QuantAtendida * T.ValorUnitario), Sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda))),
       Case When (sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda)) > Sum(T.QuantAtendida * T.ValorCustoUltReal)
            Then (Sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda) - Sum(T.QuantAtendida * T.ValorCustoUltReal))
            Else 0 End
*/
--304454
--Select (Select Margem From CalculaLucroLiquido(Sum(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
Select (Select Margem From CalculaLucroLiquido(Sum(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                           Then T.ValorCustoUltReal
                                                                           Else (T.ValorCustoFor * T.FatorRedCusto) End) as numeric(18,4))),
              Sum(T.QuantAtendida * T.ValorUnitario), Sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda))),
       Case When (sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda)) >
                 --304454
                 --Sum(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                  Sum(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                              Then T.ValorCustoUltReal
                                              Else (T.ValorCustoFor * T.FatorRedCusto) End) as numeric(18,4)))
            Then (Sum(T.QuantAtendida * T.ValorUnitario * T.FatorRedVenda) -

                  --304454
                  --Sum(T.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                  Sum(T.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                              Then T.ValorCustoUltReal
                                              Else (T.ValorCustoFor * T.FatorRedCusto) End) as numeric(18,4))))
            Else 0 End


         --353932
         ,(Select first  1   T2.CodLetraComissao From TempPrce050Itens T2
           Where T2.Empresa=:Empresa
           and T2.TipoControle=:TipoControle
           and T2.CodControle=:CodControle
           AND T2.CodLetraComissao <> ''
           AND T2.Status <> 'E'
           AND T2.Status <> 'L'
           AND ( ( T2.CodProduto = 8888888 AND :FlagComissaoServico = 1) OR ( T2.CodProduto <> 8888888) )
          )





    From TempPrce050Itens  T
    Where T.Empresa=:Empresa
      and T.TipoControle=:TipoControle
      and T.CodControle=:CodControle
      and T.Status <> 'E' 
      and T.Status <> 'L'
      and ((T.CodProduto = 8888888 and :FlagComissaoServico = 1) or (T.CodProduto <> 8888888))

 Into :MargemLucroLiquido, :ValorLucroLiquido,
 --353932
 :AuxCodLetraComissao;

If (MargemLucroLiquido is null) then
  MargemLucroLiquido = 0;
If (ValorLucroLiquido is null) then
  ValorLucroLiquido = 0;

/*Verifica se existem comissoes calculadas sobre o valor da Nota */
Select InternoOK, ExternoOK, ParceiroOK, ValorInterno, ValorExterno, ValorParceiro
  From Calcular_Comissao(:Empresa, 2, :CodVendInterno, :CodVendExterno,
                         :CodVendParceiro, null, :AuxValorTotal, :AuxCodLetraComissao,
                         :MargemLucro, :PrazoMedio, 0,
                         :MargemLucroLiquido,:ValorLucroLiquido, 0,0,0,0,0,0, :CodEntidade
                         --JALDO/RAFAEL - 197595
--279456                       ,:PercDescontoCondPagto, 0)
                        ,:PercDescontoCondPagto, :valorservicostotal)
  Into :InternoOK, :ExternoOK, :ParceiroOK, :ValorInterno, :ValorExterno, :ValorParceiro;

If (InternoOK = 1) then
   AuxValorInterno = ValorInterno;
If (ExternoOK = 1) then
   AuxValorExterno = ValorExterno;
If (ParceiroOK = 1) then
   AuxValorParceiro = ValorParceiro;

For
  Select Temp.CodProduto, Temp.ValorTotal, Temp.CodLetraComissao,
         --JALDO - CHAMADO 313712
         /*
         (Select Margem From CalculaMargem
                 (:Empresa,
                  Case
                      When :TipoMargemLucro = 0 Then (Temp.ValorCustoFor * Temp.FatorRedCusto)
                      When :TipoMargemLucro = 1 Then (Temp.ValorCustoUlt * Temp.FatorRedCusto)
                      When :TipoMargemLucro = 2 Then (Temp.ValorCustoMed)
                  End,
                 Temp.ValorUnitario)) as MargemLucro,
          */
          (SELECT Margem FROM CalculaMargemLucro
                   (:Empresa, 9, --FORÇA SEMPRE MARGEM DE LUCRO NORMAL
                    CASE
                        WHEN :TipoMargemLucro = 0 THEN (Temp.ValorCustoFor * Temp.FatorRedCusto)
                        WHEN :TipoMargemLucro = 1 THEN (Temp.ValorCustoUlt * Temp.FatorRedCusto)
                        WHEN :TipoMargemLucro = 2 THEN (Temp.ValorCustoMed)
                    END,
                    Temp.ValorUnitario, Temp.ValorUnitario * Temp.fatorredvenda,
                    Rs_RoundDec(Temp.ValorBaseICM * Temp.AliqICM / 100,2))) AS MargemLucro,
         /* Renato - 292957
         (Select Margem From CalculaLucroLiquido(Temp.QuantAtendida * Temp.ValorCustoUltReal,
              Temp.QuantAtendida * Temp.ValorUnitario, (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda)))
              as MargemLucroLiquido,
         Case When (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) > (Temp.QuantAtendida * Temp.ValorCustoUltReal)
              Then ((Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) - (Temp.QuantAtendida * Temp.ValorCustoUltReal))
              Else 0 End as ValorLucroLiquido,
         */
         --304454
         --(Select Margem From CalculaLucroLiquido(Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
         (Select Margem From CalculaLucroLiquido(Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                                            Then Temp.ValorCustoUltReal
                                                                            Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as numeric(18,4)),
              Temp.QuantAtendida * Temp.ValorUnitario, (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda)))
              as MargemLucroLiquido,
         Case When (Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) >

                  --304454
                   --(Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                   (Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                                    Then Temp.ValorCustoUltReal
                                                    Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as numeric(18,4)))
              Then ((Temp.QuantAtendida * Temp.ValorUnitario * Temp.FatorRedVenda) -
                  --304454
                   --(Temp.QuantAtendida * Cast((Case When :FlagMargemLiquidaGerencial = 0
                   (Temp.QuantAtendida * Cast((Case When :TipoMargemLiquida = 0
                                               Then Temp.ValorCustoUltReal
                                               Else (Temp.ValorCustoFor * Temp.FatorRedCusto) End) as numeric(18,4))))
              Else 0 End as ValorLucroLiquido,

         Temp.TipoPrecoProduto, Temp.PercDesconto, Temp.PercDesconto1, Temp.PercDesconto2, 
         Temp.PercDesconto3, Temp.PercDesconto4, Temp.PercDesconto5,
         --JALDO/RAFAEL 197595
         :PercDescontoCondPagto
         From TempPrce050Itens Temp
         Where Temp.Empresa = :Empresa and Temp.TipoControle = :TipoControle
           and Temp.CodControle = :CodControle
           and Temp.Status <> 'E' and Temp.Status <> 'L'
         Into :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
              :MargemLucro, :MargemLucroLiquido, :ValorLucroLiquido, :TipoPrecoProduto, :PercDesconto, :PercDesconto1, 
          :PercDesconto2, :PercDesconto3, :PercDesconto4, :PercDesconto5
          --JALDO/RAFAEL - 197595
         ,:PercDescontoCondPagto
Do
  Begin
     Select InternoOK, ExternoOK, ParceiroOK,
            ValorInterno, ValorExterno, ValorParceiro

       From Calcular_Comissao(:Empresa, 1, :CodVendInterno, :CodVendExterno,
                                :CodVendParceiro, :AuxCodProduto, :AuxValorTotal, :AuxCodLetraComissao,
                                :MargemLucro, :PrazoMedio, :TipoPrecoProduto,
                                :MargemLucroLiquido, :ValorLucroLiquido, :PercDesconto, :PercDesconto1, 
                      :PercDesconto2, :PercDesconto3, :PercDesconto4, :PercDesconto5, :CodEntidade
                      --JALDO/RAFAEL - 197595
                     ,:PercDescontoCondPagto, 0)
       Into :InternoOK, :ExternoOK, :ParceiroOK,
            :ValorInterno, :ValorExterno, :ValorParceiro;
     If (InternoOK = 1) then
        AuxValorInterno = AuxValorInterno + ValorInterno;
     If (ExternoOK = 1) then
        AuxValorExterno = AuxValorExterno + ValorExterno;
     If (ParceiroOK = 1) then
        AuxValorParceiro = AuxValorParceiro + ValorParceiro;
 End

 ValorComissInterno = AuxValorInterno;
 ValorComissExterno = AuxValorExterno;
 ValorComissParceiro = AuxValorParceiro;

 suspend;
END
^




SET TERM ; ^ 




ALTER TABLE TROCAS ADD  TIPOBLOQUEADO  SMALLINT DEFAULT 0 NOT NULL;

CREATE TABLE LISCRIPT(
      IDSCRIPT INT NOT NULL,
      NOMESCRIPT VARCHAR(200) DEFAULT '' NOT NULL COLLATE WIN_PTBR,
      FLAGINATIVO SMALLINT DEFAULT 0 NOT NULL,
      DIAINICIO SMALLINT DEFAULT 0 NOT NULL,
      DIASREPETICAO SMALLINT DEFAULT 0 NOT NULL,
      VERSAOMINIMA SMALLINT DEFAULT 0 NOT NULL,
      FLAGULTIMAEXECUCAO SMALLINT DEFAULT 0 NOT NULL,
      DATAULTIMAEXECUCAO TIMESTAMP,
      STATUSTRANSACAO SMALLINT DEFAULT 0 NOT NULL,
      TRANSACAOEMPRESAS VARCHAR(50) DEFAULT '' NOT NULL COLLATE WIN_PTBR);

ALTER TABLE LISCRIPT ADD CONSTRAINT PK_LISCRIPT
       PRIMARY KEY (IDSCRIPT);


CREATE TABLE LISCRIPTCOMANDO(
      IDSCRIPT INT NOT NULL,
      IDCOMANDO INT NOT NULL,
      NOMECOMANDO VARCHAR(200) DEFAULT '' NOT NULL COLLATE WIN_PTBR,
      ORDEM SMALLINT DEFAULT 0 NOT NULL,
      COMANDOSQL BLOB SUB_TYPE 1 SEGMENT SIZE 80,
      FILTROSQL BLOB SUB_TYPE 1 SEGMENT SIZE 80,
      TIPORETORNO SMALLINT DEFAULT 0 NOT NULL,
      FLAGINATIVO SMALLINT DEFAULT 0 NOT NULL,
      STATUSTRANSACAO SMALLINT DEFAULT 0 NOT NULL,
      TRANSACAOEMPRESAS VARCHAR(50) DEFAULT '' NOT NULL COLLATE WIN_PTBR);

  ALTER TABLE LISCRIPTCOMANDO ADD CONSTRAINT PK_LISCRIPTCOMANDO
      PRIMARY KEY (IDSCRIPT, IDCOMANDO);


    CREATE TABLE LISCRIPTLOG(
      DATAEXECUCAO TIMESTAMP NOT NULL,
      IDSCRIPT    SMALLINT NOT NULL,
      IDCOMANDO SMALLINT NOT NULL,
      QUANTRESULTADO INTEGER,
      RESULTADOXML BLOB SUB_TYPE 1 SEGMENT SIZE 80,
      CODUSUARIO SMALLINT,
      MENSAGEMERRO VARCHAR(4000) NOT NULL COLLATE WIN_PTBR,
      FLAGATURSYS SMALLINT NOT NULL);

    ALTER TABLE LISCRIPTLOG ADD CONSTRAINT PK_LISCRIPTLOG
         PRIMARY KEY (DATAEXECUCAO, IDSCRIPT, IDCOMANDO);


CREATE INDEX LISCRIPTLOG1 ON LISCRIPTLOG (FLAGATURSYS);







  ALTER TRIGGER INSERTITEMPEDIDOCOMPRA INACTIVE;
  ALTER TRIGGER UPDATEITEMPEDIDOCOMPRA INACTIVE;
  ALTER TRIGGER DELETEITEMPEDIDOCOMPRA INACTIVE;

  SET TERM ^ ;
  ALTER TABLE ITEMPEDIDOCOMPRA ADD  PESOLIQUIDO NUMERIC(10,3) DEFAULT 0 NOT NULL;
  ^
  ALTER TABLE  TEMPPRPC100ITENS ADD  PESOLIQUIDO NUMERIC(10,3) DEFAULT 0 NOT NULL;
  ^
  SET TERM ; ^

  ALTER TRIGGER INSERTITEMPEDIDOCOMPRA ACTIVE;
  ALTER TRIGGER UPDATEITEMPEDIDOCOMPRA ACTIVE;
  ALTER TRIGGER DELETEITEMPEDIDOCOMPRA ACTIVE;
  
  