Update Versao 
Set PatchVersao = 1
Where Versao = 3
  and SubVersao = 2;
  
--Ronaldo Chamado 398662
SET TERM ^ ;

ALTER PROCEDURE STORED_PRFT110PROCESSAR (
    empresa integer,
    flagcupom integer,
    ped_sequencia integer,
    venc_sequencia integer,
    codcondpagto char(5),
    codoperacao integer,
    codusuario integer,
    codbanco integer,
    codoperacaodup char(5),
    codvendinterno integer,
    codvendexterno integer,
    flagcustomedio integer,
    seriecontrole char(3),
    flagprce100 integer,
    tipoduplicatapedido integer,
    coddepartamento varchar(9),
    obscupom varchar(400),
    numequipamentocf integer,
    codstatusped integer,
    flagsepararservico smallint,
    seriecontroleservico char(3),
    codoperacaoservico integer,
    flagunirobservacao smallint)
returns (
    mensagemerro varchar(400))
as
declare variable codpedido integer;
declare variable tipopedido integer;
declare variable codos integer;
declare variable tipocontrole integer;
declare variable codcontrole integer;
declare variable tipoduplicata integer;
declare variable empresaestoque integer;
declare variable codtipoestoque integer;
declare variable codtipoestoquecontra integer;
declare variable auxempresa integer;
declare variable auxnumlancamento integer;
declare variable auxcodproduto integer;
declare variable auxvalortotal numeric(11,2);
declare variable auxpmvacumulo numeric(11,2);
declare variable auxpmvvalores numeric(11,2);
declare variable auxquantatendida numeric(11,2);
declare variable existe integer;
declare variable numdocumento integer;
declare variable especie char(3);
declare variable flagatualizaduplicata integer;
declare variable prazomedio integer;
declare variable datamovimento timestamp;
declare variable classeabc char(1);
declare variable numserieecf varchar(20);
declare variable quantquebranota integer;
declare variable quantnotaitem integer;
declare variable quantnotaservico integer;
declare variable quantnotatotal integer;
declare variable seriecontrolecursor char(3);
declare variable flagservico integer;
declare variable codoperacaocursor integer;
declare variable resto double precision;
declare variable contadoritem integer;
declare variable contadornota integer;
declare variable empresaantos integer;
declare variable flagmovestoque integer;
declare variable flagdevolucao integer;
declare variable flaggerarduplicata 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 auxcodpedido integer;
declare variable existeduplicata integer;
declare variable ultimaduplicata integer;
declare variable codduplicata varchar(15);
declare variable salvanumdocumento integer;
declare variable salvanumdocumentoservico integer;
declare variable valorstpedido numeric(18,4);
declare variable valorstnota numeric(18,4);
declare variable diavencimentost smallint;
declare variable datavencimentodupst timestamp;
declare variable valorduplicatast numeric(11,2);
declare variable flagnaogerenciarnumdocumento smallint;
declare variable tipoatualizadatamovestoque smallint;
declare variable empid varchar(15);
declare variable entidadenotafiscal char(7);
declare variable codtransp char(7);
begin
/******************
VERSÃO 2.03
******************/
--MARCELO - CHAMADO 158510/199271


  MensagemErro = '';

--  Renato  - Chamado 271880
  Select TipoAtualizaDataMovEstoque
  From ConfiguracaoSistema
  Into :TipoAtualizaDataMovEstoque;

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


  Select
    Par.FlagGerarDuplicata,
    cast(coalesce(ParSeq.UltimaNota,0) as Integer),
    case when :FlagCupom = 1 then 99999
         when ParSerie.QuantItemNota > 0 then cast(ParSerie.QuantItemNota as int)
         else 99999 end
  From ParamControle Par
--   Eder Ramos Chamado 304095
    Left Join ParamControleSerie ParSerie on ParSerie.Empresa = :Empresa
                                         and ParSerie.Serie = :SerieControle
    Left Join paramcontrolesequencia ParSeq on ParSeq.Empresa = :Empresa
                                         and ParSeq.Serie = :SerieControle
  where Par.Empresa=:Empresa
  Into :FlagGerarDuplicata, :SalvaNumDocumento, :quantquebranota;

--MARCELO - CHAMADO 158510/199271
  if (FlagSepararServico = 1) then
  begin
    Select
      Coalesce(ParSeq.UltimaNota, 0)
--      ParSerie.FlagNaoGerenciarNumDocumento
    From ParamControle Par
--    Rafael chamado 254456
--    Left Join ParamControleSerie ParSerie on ParSerie.Empresa = :Empresa
--                                            and ParSerie.Serie = :SerieControleServico
      Left Join paramcontrolesequencia ParSeq on ParSeq.Empresa = :Empresa
                                           and ParSeq.Serie = :SerieControleServico
    where Par.Empresa = :Empresa
    into :SalvaNumDocumentoServico;
  end

  if (FlagGerarDuplicata is null) then
  begin
    MensagemErro = 'Não Existe Parâmetro de Controle Cadastrado!';
    suspend;
    exit;
  end

  if ((FlagPrce100 = 0) and
     (exists(select TItem.CodPedido
               from TempPrft110Pedido TPed
                Left Join TempPrce100Itens TItem on TItem.Empresa = TPed.Empresa
                                                 and TItem.CodPedido = TPed.CodPedido
               where TPed.Empresa=:Empresa
                 and TPed.NumSequencia = :Ped_Sequencia
                 and TItem.CodPedido is not null))) then
  begin
    MensagemErro = 'Existem Pedidos em uso e não podem ser processados!';
    suspend;
    exit;
  end

  If (Exists(Select T.Empresa
             From TempPrft110Pedido T, Pedidos P
             Where T.Empresa=:Empresa
               and T.NumSequencia = :Ped_Sequencia
               and P.Empresa = T.Empresa
               and P.CodPedido = T.CodPedido
--MARCELO - CHAMADO 204046
               and P.FlagProcessar = 2
               and P.StatusNota <> 0)) then
  begin
    MensagemErro = 'Existem Pedidos faturados e não podem ser processados novamente!';
    suspend;
    exit;
  end

-- Não permitir que seja informada operaçõe para serviços com parâmetros diferentes
-- da operação fiscal principal de produtos
--MARCELO - CHAMADO 158510/199271
  Existe = null;

  Select OpItem.Codigo
  From Operacoes OpItem
    Left Join Operacoes OpServ on OpServ.Codigo = :CodOperacaoServico
  Where OpItem.Codigo = :CodOperacao
    and (OpItem.TipoBaixaEstoquePedido <> OpServ.TipoBaixaEstoquePedido
         or OpItem.TipoMovimento <> OpServ.TipoMovimento
         or OpItem.CodTipoEstoque <> OpServ.CodTipoEstoque
         or OpItem.CodTipoEstoqueContra <> OpServ.CodTipoEstoqueContra
         or OpItem.TipoDuplicataPedido <> OpServ.TipoDuplicataPedido)
  into :Existe;

  if ((FlagSepararServico = 1) and (Existe is not null)) then
  begin
    MensagemErro = 'As configurações da operação fiscal para a Nota Fiscal de Produtos' || '#13' ||
                   'estão diferentes da operação fiscal para a Nota Fiscal de Serviços.' || '#13' ||
                   'Verifique os seguintes campos: Tipo de Movimento, Controle de Baixa de Estoque,' || '#13' ||
                   'Geração de Duplicatas e Detalhamento do Estoque.';
    suspend;
    exit;
  end

--Limpa os dados da tabela temporaria de nota
  delete from TempPrft110Nota where NumSequencia = :Ped_Sequencia;

  select EmpresaEstoque
  from Empresas
  where Codigo = :Empresa
  into :EmpresaEstoque;

--Pega os Dados do Primeiro Pedido mais antigo que vai processar
  Select First 1
    TempPrft110Pedido.CodPedido, Pedidos.TipoPedido,
--MARCELO - CHAMADO 158510/199271
--    Pedidos.CodOs, TempPrft110Pedido.Empresa
    Pedidos.CodOs, Pedidos.EmpresaOS,
  --341745
  Case when coalesce(OrdemServico.CodEntidadeNF,'') ='' then Pedidos.CodEntidade
                                   else OrdemServico.CodEntidadeNF end  
  from TempPrft110Pedido
    left Join Pedidos On Pedidos.Empresa = TempPrft110Pedido.Empresa
                     and Pedidos.CodPedido = TempPrft110Pedido.CodPedido
  --341745
  Left Join OrdemServico On OrdemServico.Codigo = Pedidos.CodOS and OrdemServico.Empresa = Pedidos.EmpresaOS       
  where NumSequencia = :Ped_Sequencia
  order By Pedidos.CodOS Desc, TempPrft110Pedido.DataMovimento Desc, TempPrft110Pedido.CodPedido Desc
  Into :CodPedido, :TipoPedido, :CodOS, :EmpresaAntOS,
  --341745
  :entidadenotafiscal;

  --Ronaldo Chamado 346431
  For
    Select Pedidos.codtransp from TempPrft110Pedido
    left Join Pedidos On Pedidos.Empresa = TempPrft110Pedido.Empresa and Pedidos.CodPedido = TempPrft110Pedido.CodPedido
    Left Join OrdemServico On OrdemServico.Codigo = Pedidos.CodOS and OrdemServico.Empresa = Pedidos.EmpresaOS
    where NumSequencia = :Ped_Sequencia
    order By Pedidos.CodOS Desc, TempPrft110Pedido.DataMovimento Desc, TempPrft110Pedido.CodPedido Desc
    Into :CodTransp
  do
  Begin
    if (:Codtransp <> '') then
      break;
  end


  Existe = null;
--verifica se existem pedidos de empresa diferente para regravar as empresas
  select First 1 CodPedido
  from TempPrft110Pedido
  where NumSequencia = :Ped_Sequencia
    and Empresa <> :Empresa
  into :Existe;

  if (Existe is not null) then
  begin
    For
      Select Empresa, CodPedido
      from TempPrft110Pedido
      where NumSequencia = :Ped_Sequencia
        and Empresa <> :Empresa
      Into :AuxEmpresa, :AuxCodPedido
    Do
    Begin
--Atualiza a Empresa dos itens dos Pedidos
      update MovEstoque
         set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;

--Atualiza a Empresa dos Pedidos
      update Pedidos
         set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;

--Atualiza a Empresa dos Vencimentos do Pedido
      update VencPedido
         set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;

--Atualiza a Empresa das Embalagens do Pedido
      update EmbalagemPedido
         set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;

--Atualiza a Empresa das Observações do Pedido
      update ObsPedidos
         set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;

--Atualiza as Retencoes do Pedido
      Update PedidosRetencao
         Set Empresa=:Empresa,
             StatusTransacao=1
       where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa<>:Empresa;

--Atualiza as Anotacoes do Pedido
      Update Anotacoes
         Set EmpresaAnotacao = :Empresa,
             StatusTransacao = 1
       Where EmpresaAnotacao = :AuxEmpresa
         and TipoAnotacao = 4
         and ChaveTipo = cast(:AuxCodPedido as varchar(15));

--MARCELO - CHAMADO 191865 - Atualiza os Contatos do Pedido
      Update PedidoContatos
         Set Empresa = :Empresa,
             StatusTransacao = 1
       Where Empresa = :AuxEmpresa
         and CodPedido = :AuxCodPedido
         and Empresa <> :Empresa;
    end

--Atualiza a Empresa dos Pedidos da Tabela Temporaria
    update Tempprft110Pedido
       set Empresa=:Empresa
     where NumSequencia = :Ped_Sequencia /*Sequencia da tabela temporaria*/
       and Empresa <> :Empresa;
  end

--Controle de baixa de estoque do pedido
--Não baixa estoque se for "baixa na separação" ou "não baixa estoque"
  select
    Case When TipoBaixaEstoquePedido = 2 Then 0      /*não baixa pois será baixado na seperaçao*/
         When TipoBaixaEstoquePedido = 3 then -1     /*nunca baixa estoque*/
         Else 1 End,                                 /*Baixa estoque*/
    case TipoMovimento when 1 then 1 else 0 end
  from Operacoes
  where Codigo=:CodOperacao
  into :FlagMovEstoque, :FlagDevolucao;

  if ((TipoPedido = 0) or (TipoPedido = 1))  then    /*Pedido/Requisicao*/
  begin
    TipoControle = 2;   /*--Saída*/
    TipoDuplicata = case FlagDevolucao when 1 then 1 else 2 end; /*--Duplicata A receber*/
  end
  else
  if (TipoPedido = 4) then /*--entrada*/
  begin
    TipoControle = 1;
    TipoDuplicata = case FlagDevolucao when 1 then 2 else 1 end; /*--Duplicata a Pagar*/
  end

  Existe = 1;
  while (Existe = 1) do
  Begin
    if (TipoControle = 1) then    /*--Entrada*/
    begin
      Select SequenciaGerada From ProximaSequencia('NOTASFISCAISENTRADA', :Empresa, 1)
      into :CodControle;
    end
    else
    begin
      Select SequenciaGerada From ProximaSequencia('NOTASFISCAISSAIDA', :Empresa, 1)
      into :CodControle;
    end
    if (not exists(select CodControle from NotasFiscais
                   where Empresa=:Empresa
                     and TipoControle=:TipoControle
                     and CodControle = :CodControle)) then
    begin
       Existe = 0;
    end
  end


--Move o Codigo do controle da Primeira Nota para as embalagens dos pedidos
--196249
  for
    select CodPedido, Empresa
    From Tempprft110Pedido Tmp
    Where NumSequencia = :Ped_Sequencia
    Into :AuxCodPedido, :AuxEmpresa do
  begin
    update EmbalagemPedido
       set TipoControle=:TipoControle,
           CodControle=:CodControle,
           StatusTransacao=1
     where Empresa = :AuxEmpresa
       and CodPedido = :AuxCodPedido;
  end

--MARCELO - CHAMADO 129410
  Select rs_snvl(Max(NumSerieECF),'')
--From AcumuloECF
  From EquipamentoECF
  Where Empresa=:Empresa
    and NumEquipamento = :NumEquipamentoCF
  Into :NumSerieECF;

--MARCELO - CHAMADO 158510/199271
  QuantNotaItem = 0;
  QuantNotaServico = 0;
  QuantNotaTotal = 0;

--Eder - Chamado 252446
  select
    (count(*) / :quantquebranota),
    mod(count(*), :quantquebranota)
  from TempPrft110Pedido, MovEstoque
  where TempPrft110Pedido.NumSequencia = :Ped_Sequencia
    and MovEstoque.Empresa = TempPrft110Pedido.Empresa
    and MovEstoque.CodPedido = TempPrft110Pedido.CodPedido
    and MovEstoque.CodProduto <> 8888888 /*--Nao pode considerar servicos como Item*/
    and MovEstoque.QuantAtendida > 0 /*--Itens sem quantidade não podem ser considerados*/
--MARCELO - CHAMADO 158510/199271
--  into :QuantNota, :Resto;
  into :QuantNotaItem, :Resto;

--MARCELO - CHAMADO 158510/199271
--  if ((Resto <> 0) or (QuantNota <= 0)) then
--    QuantNota = QuantNota + 1;

  if (Resto <> 0) then
    QuantNotaItem = QuantNotaItem + 1;


--MARCELO - CHAMADO 158510/199271
-- para processameto que separa NFs de serviços das NFs de produtos, soma ao contador
-- as notas que irão conter os serviços
  if (FlagSepararServico = 1) then
  begin                                         
    select First 1 1
    from TempPrft110Pedido, MovEstoque
    where TempPrft110Pedido.NumSequencia = :Ped_Sequencia
      and MovEstoque.Empresa = TempPrft110Pedido.Empresa                                      
      and MovEstoque.CodPedido = TempPrft110Pedido.CodPedido                                      
      and MovEstoque.CodProduto = 8888888 /*----Nao pode considerar servicos como Item*/
      and MovEstoque.QuantAtendida > 0 /*--Itens sem quantidade não podem ser considerados*/
    into :QuantNotaServico;
                                      
    if (QuantNotaServico is null) then
      QuantNotaServico = 0;
  end

--MARCELO - CHAMADO 158510/199271
  QuantNotaTotal = QuantNotaItem + QuantNotaServico;

  ContadorNota = 0;

--MARCELO - CHAMADO 158510/199271
  if (QuantNotaTOTAL = 0) then
  begin
    QuantNotaTOTAL = 1;
    QuantNotaItem = 1;
  end

--MARCELO - CHAMADO 158510/199271
--  while (ContadorNota < QuantNota) do
  while (ContadorNota < QuantNotaTotal) do
  begin
    ContadorNota = ContadorNota + 1;

    if (ContadorNota <> 1) then
    begin
      if (TipoControle = 1) then
      begin
        Select SequenciaGerada
        From ProximaSequencia('NOTASFISCAISENTRADA', :Empresa, 1)
        into :CodControle;
      end
      else
      begin
        Select SequenciaGerada
        From ProximaSequencia('NOTASFISCAISSAIDA', :Empresa, 1)
        into :CodControle;
      end
    end

--MARCELO - CHAMADO 136025
--verifica se existem lançamentos de movestoque associados ao controle que está sendo gerado
    If (Exists(Select First 1 CodControle
               From MovEstoque
               Where Empresa = :Empresa
                 and TipoControle = :TipoControle
                 and CodControle = :CodControle)) then
    begin
      MensagemErro = 'O controle ' || cast(:CodControle as varchar(10)) || ' que está sendo gerado, já possui Itens associados ! (Avise a Ribeirão System)';
      suspend;
      exit;
    end
--MARCELO - CHAMADO 136025
--verifica se existem duplicatas associadas ao controle que está sendo gerado
    If (Exists(Select First 1 CodControle
               From Duplicatas
               Where Empresa = :Empresa
                 and TipoControle = :TipoControle
                 and CodControle = :CodControle)) then
    begin
      MensagemErro = 'O Controle ' || cast(:CodControle as varchar(10)) || ' que está sendo gerado, já possui Duplicatas associadas ! (Avise a Ribeirão System)';
      suspend;
      exit;
    end
--MARCELO - CHAMADO 136025
    If (Exists(Select First 1 CodControle
               From LancamentosFiscais
               Where Empresa = :Empresa
                 and TipoControle = :TipoControle
                 and CodControle = :CodControle)) then
    begin
      MensagemErro = 'O controle ' || cast(:CodControle as varchar(10)) || ' que está sendo gerado, já possui Lançamentos Fiscais associados ! (Avise a Ribeirão System)';
      suspend;
      exit;
    end

--MARCELO - CHAMADO 158510/199271
-- quando está na primeira nota ou quando vai começar as notas de serviço
-- atualiza os dados lidos da série do parametro de controle
    if ((ContadorNota = 1) or (ContadorNota = (QuantNotaItem + 1))) then
    begin
      FlagAtualizaDuplicata = 0;
                                      
      if (ContadorNota <= (QuantNotaItem)) then
      begin
        SerieControleCursor = :SerieControle;
        CodOperacaoCursor = :CodOperacao;
      end
      else
      begin
        SerieControleCursor = :SerieControleServico;
        CodOperacaoCursor = :CodOperacaoServico;
      end

      ExisteDuplicata = null;

      Select first 1 NumSequencia
      From TempPrft110Venc
      where NumSequencia = :Venc_Sequencia
      into :ExisteDuplicata;

      Select abs(UltimaDuplicata - UltimaNota)
--      Rafael chamado 254456
--      From ParamControleSerie
      From ParamControleSequencia
      Where Empresa = :Empresa
        and Serie = :SerieControleCursor
      into :UltimaDuplicata;

      if ((:ExisteDuplicata is not null) OR /*---Tem Duplicatas*/
          ((:ExisteDuplicata is null) AND /*--Nao tem Duplicatas*/
           (:UltimaDuplicata = 0))) then /*--Numero de Nota igual ao de Duplicata*/
      begin
        FlagAtualizaDuplicata = 1;
      end

      Select DataMovimento,
--   Eder Ramos Chamado 302201
        FlagNaoGerenciarNumDocumento
      from ParamControleSerie
      Where Empresa = :Empresa
        and Serie = :SerieControleCursor
      into :DataMovimento, :FlagNaoGerenciarNumDocumento;
  
      PrazoMedio = 0;

      Select Sum(Cast(Vencimento - :DataMovimento as int) * Valor)
      From TempPrft110Venc
      Where NumSequencia = :Venc_Sequencia
        and Vencimento > :DataMovimento
      into :AuxPmvAcumulo;

      Select Sum(Valor+ValorComplementar)
      From TempPrft110Venc
      Where NumSequencia = :Venc_Sequencia
      into :AuxPmvValores;

      If (AuxPmvValores > 0) then
        PrazoMedio = coalesce(rs_rounddec(:AuxPmvAcumulo / :AuxPmvValores, 0), 0);
    end

    insert into TempPrft110Nota
      (NumSequencia, PosicaoNota, Empresa, TipoControle, CodControle)
    values
      (:Ped_Sequencia, :ContadorNota, :Empresa, :TipoControle, :CodControle);

--Eder Ramos chamado 302201
    if (FlagNaoGerenciarNumDocumento = 0)  then
    begin
        if ((FlagCupom = 0) or (FlagCupom = 2)) then /*--Processamento de Nota, ou nota e cupom pega o numero da nota*/
        begin
            Especie = 'NF';
            select UltimaNota + 1
--            Rafael chamado 254456
--            from ParamControleSerie
            from ParamControleSequencia
            where Empresa=:Empresa
--MARCELO - CHAMADO 158510/199271
--          and Serie=:SerieControle
            and Serie=:SerieControleCursor
            into :NumDocumento;

--Verifica Se Ja existe nota fiscal com o numero de documento que achou
            if (exists(select first 1 CodControle
                 from NotasFiscais
                 where Empresa=:Empresa
                   and TipoControle=2
                   and NumDocumento = :NumDocumento
                   and Especie = :Especie
--MARCELO - CHAMADO 158510/199271
--                   and Serie=:SerieControle)) then
                   and Serie=:SerieControleCursor)) then
            begin
                MensagemErro = 'Já Existe Nota Fiscal Cadastrada com o Número de Documento: '
                       || cast(NumDocumento as varchar(6))
                       || ' e série '
--MARCELO - CHAMADO 158510/199271
--                       || cast(SerieControle as varchar(3))
                       || cast(SerieControleCursor as varchar(3))
                       || '.';
            suspend;
            exit;
            end
--            Rafael chamado 254456
--            update ParamControleSerie
            update paramcontrolesequencia
            set UltimaNota = :NumDocumento,
              StatusTransacao=1
            where Empresa=:Empresa
--MARCELO - CHAMADO 158510
--         and Serie=:SerieControle;
            and Serie=:SerieControleCursor;
            end
            else
            begin  /*--Processamento de cupom, nao pega o ultimo documento*/
                Especie = 'CF';
                NumDocumento = 0;
            end
    end
-- Eder Ramos Chamado - 302201
    else
    begin  /*--Flag Nao Gerenciar num documento nao pegar ultimo documento*/
                Especie = 'NF';
                NumDocumento = 0;
    end




    insert into NotasFiscais (
           Empresa, TipoControle, CodControle,
           DataMovimento, DataDocumento, Especie, NumDocumento, Serie,
           CodEntidade, EmpresaOS, CodOS, CodOperacao, CodVendInterno,
           CodVendExterno, CodVendParceiro, CodCondPagto, CodTransp, CodTranspRedespacho, TipoFrete,
           CodPedido, CodUsuarioInc, CodUsuarioFat,
           StatusImpNota,
           StatusImpCupom,
           FlagCancelada, FlagDuplicataGerada, FlagAtualizaPreco, PrazoMedio,
           AliqISS,
           CodDepartamento, CodBanco, StatusTransacao, NumEquipamentoCF,
--253322
           StatusNFe,
--356099
           FlagEmissaoPropria,CodcidadeServicoRealizado)
    select :Empresa, :TipoControle, :CodControle,
--MARCELO - CHAMADO 158510/199271
--           :DataMovimento, :DataMovimento, :Especie, :NumDocumento, :SerieControle,
           :DataMovimento, :DataMovimento, :Especie, :NumDocumento, :SerieControleCursor,
--           P.CodEntidade, :EmpresaAntOS, :CodOS, :CodOperacao, :CodVendInterno,
           --341745
           --P.CodEntidade, :EmpresaAntOS, :CodOS, :CodOperacaoCursor, :CodVendInterno,
           :entidadenotafiscal, :EmpresaAntOS, :CodOS, :CodOperacaoCursor, :CodVendInterno,
           --Ronaldo Chamado 346431
           --:CodVendExterno, P.CodVendParceiro, :CodCondPagto, :P.CodTransp,P.CodTranspRedespacho, P.TipoFrete,
           :CodVendExterno, P.CodVendParceiro, :CodCondPagto, :CodTransp,P.CodTranspRedespacho, P.TipoFrete,
           :CodPedido, :CodUsuario, :CodUsuario,
           case when :FlagCupom = 0 then 0      /*--Somente Nota (imprimir nota)*/
                when :FlagCupom = 1 then -2     /*--Somente Cupom (nao imprimir Nota)*/
                when :FlagCupom = 2 then 0 end, /*--Nota e Cupom (imprimir nota)*/
           case when :FlagCupom = 0 then 1      /*--Somente Nota (nao imprimir cupom)*/
                when :FlagCupom = 1 then 0      /*--Somente Cupom (Imprimir cupom)*/
                when :FlagCupom = 2 then 0 end, /*--Nota e Cupom (Imprimir Cupom)*/
           0, 0, 1, :PrazoMedio,
           case when O.FlagCalcularISS <> 1 then 0
--MARCELO - CHAMADO 158510/199271
--                else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacao)) end,
--Ronaldo 367126  else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacaoCursor)) end,
                  else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacaoCursor,P.CodCidadeServicoRealizado)) end,
           :CodDepartamento, :CodBanco, 1, :NumSerieECF,
--253322
      Case When :FlagCupom = 1 then -1 else 0 end,
      --356099
      1,
      --Ronaldo Chamado 367126
      P.CodCidadeServicoRealizado
    from Pedidos P
--MARCELO - CHAMADO 158510/199271
--      left join Operacoes O on O.Codigo = :CodOperacao
      left join Operacoes O on O.Codigo = :CodOperacaoCursor
    where P.Empresa=:Empresa
      and P.CodPedido=:CodPedido;   /*--Primeiro Pedido da Lista*/
  end /*--Fim do loop*/

--Regrava os Itens dos Pedidos da Tabela Temporaria para as respectivas Notas Fiscais
---Contador Item deve comecar do zero, para que a conta dê certo
  ContadorItem = 0;
  ContadorNota = 0;
  for
    select
--MARCELO - CHAMADO 158510/199271
-- garantir que os serviços virão por último quando for
-- separar nota de produtos das notas de serviços
      Case When (:FlagSepararServico = 0) then 0
           When (:FlagSepararServico = 1) and (Mov.CodProduto <> 8888888) then 0
           When (:FlagSepararServico = 1) and (Mov.CodProduto = 8888888) then 1 end,
      Mov.Empresa, Mov.NumLancamento, Mov.CodProduto,
      --341745
      --Mov.QuantAtendida, Ped.CodEntidade, coalesce(Es.ClasseABC,'')
      Mov.QuantAtendida,coalesce(Es.ClasseABC,'')
    from TempPrft110Pedido T
      Left Join MovEstoque Mov on Mov.Empresa = T.Empresa
                              and Mov.CodPedido = T.CodPedido
      left join Pedidos Ped on Ped.Empresa = Mov.Empresa
                           and Ped.CodPedido = Mov.CodPedido
      left join EstoqueProduto ES on Es.CodProduto = Mov.CodProduto
                                 and Es.Empresa = :EmpresaEstoque
    where T.NumSequencia = :Ped_Sequencia
--MARCELO - CHAMADO 158510/199271
--    order by Mov.Empresa, Mov.CodPedido, Mov.NumLancamento
    order by 1, Mov.Empresa, Mov.CodPedido, Mov.NumLancamento
    into :FlagServico, :AuxEmpresa, :AuxNumLancamento, :AuxCodProduto,
         --341745
         --:AuxQuantAtendida, :AuxCodEntidade, :ClasseABC
         :AuxQuantAtendida,:ClasseABC
  do
  begin
    ContadorNota = (:ContadorItem / :quantquebranota) + 1;

--MARCELO - CHAMADO 158510/199271
--       quando separa o servico, os movestoques de serviço virão sempre depois
--       dos produtos, então se chegou no 8888888, tem que jogar para a última nota
--       que conterá todos os serviço
--MARCELO - CHAMADO 194083
    if ((FlagServico = 1) and (ContadorNota <= QuantNotaItem)) then
      ContadorNota = ContadorNota + 1;

    select
      T.TipoControle, T.CodControle,
      Oper.CodTipoEstoque, Oper.CodTipoEstoqueContra
    from TempPrft110Nota T
      Left Join Operacoes Oper on Oper.Codigo = :CodOperacao
    where T.NumSequencia = :Ped_Sequencia
      and T.PosicaoNota = :ContadorNota
    into :TipoControle, :CodControle,
         :CodTipoEstoque, :CodTipoEstoqueContra;

    update MovEstoque
       set TipoControle    = :TipoControle,
           CodControle     = :CodControle,
--MARCELO - CHAMADO 158510/199271
--           CodOperacao     = :CodOperacao,
           CodOperacao     = Case :FlagServico When 0 Then :CodOperacao Else :CodOperacaoServico End,
--            Renato - Chamado 271880
--           DataMovimento   = :DataMovimento,
           DataMovimento   = Case Coalesce(:TipoAtualizaDataMovEstoque,0) When 0 Then :DataMovimento Else DataMovimento End,
           DataFaturamento = :DataMovimento,
          --341745
           --CodEntidade     = :AuxCodEntidade,
           CodEntidade     = :entidadenotafiscal,
           ClasseABC       = :ClasseABC,
           --Ronaldo Chamado 398662
           --FlagMovEstoque  = :FlagMovEstoque,
           FlagMovEstoque = Case When :FlagMovEstoque = 0 and FlagMovEstoque = 1
                                    Then FlagMovEstoque
                                    else :FlagMovEstoque end,

           CodDepartamento = :CodDepartamento,
           FlagNaoGeradoNFE = coalesce((select first 1
                                    case when o.FlagDesconsiderarNaoGeradoNFE = 1 
                                         Then 0 
                                    else Prod.FlagNaoGeradoNFE
                                    end 
                             From Produtos Prod
                             left join operacoes o on o.codigo = MovEstoque.CodOperacao
                             where Prod.Codigo = MovEstoque.CodProduto),0),
           StatusTransacao = 1
     where Empresa = :AuxEmpresa
       and NumLancamento = :AuxNumLancamento;

    Update MovEstoqueAux
       Set CodTipoEstoque = :CodTipoEstoque,
           CodTipoEstoqueContra = :CodTipoEstoqueContra
     Where Empresa = :AuxEmpresa
       and NumLancamento = :AuxNumLancamento;

    Existe = null;

    Select First 1 Empresa
    From MovEstoqueAux
    Where Empresa = :AuxEmpresa
      and NumLancamento = :AuxNumLancamento
    Into :Existe;

    If (((CodTipoEstoque <> 0) or (CodTipoEstoqueContra <> 0)) and (Existe is null))  then
    begin
      Insert Into MovEstoqueAux(NumLancamento, Sequencia, Empresa,
             CodProduto, TipoMovimento, FlagMovEstoque, EmpresaEstoque,
             QuantAtendida, QuantMovimentada, CodTipoEstoque, CodTipoEstoqueContra, StatusTransacao)
      Select :AuxNumLancamento, 1, :AuxEmpresa,
             Mov.CodProduto, Mov.TipoMovimento, Mov.FlagMovEstoque, Mov.EmpresaEstoque,
             Mov.QuantAtendida, Mov.QuantMovimentada, :CodTipoEstoque, :CodTipoEstoqueContra, 1
      From MovEstoque Mov
      Where Mov.Empresa = :AuxEmpresa
        and Mov.NumLancamento = :AuxNumLancamento;
    end

    if ((AuxCodProduto <> 8888888) and /*--Nao pode considerar servicos como sendo Item*/
        (AuxQuantAtendida > 0)) then /*--Não pode considerar itens sem quantidade*/
    begin
      ContadorItem = ContadorItem + 1;
    end
  end

--Atualizacação do ICM e totais de cada nota processada
  ContadorNota = 0;
--MARCELO - CHAMADO 158510/199271
--while (ContadorNota < QuantNota) do
  while (ContadorNota < QuantNotaTotal) do
  begin
    ContadorNota = ContadorNota + 1;

--MARCELO - CHAMADO 158510/199271
    SerieControleCursor = (Case When ContadorNota <= QuantNotaItem
                                then SerieControle
                                else SerieControleServico end);


--Atualiza as variaveis de tipo de controle para nao ter que usar a tabela temporaria para posicionar as notas,
--otimizando a performance do banco
    select TipoControle, CodControle
    from TempPrft110Nota
    where NumSequencia = :Ped_Sequencia
      and PosicaoNota = :ContadorNota
    into :TipoControle, :CodControle;

--    Existe = 0;
--    Select FlagDecomporProdutos
--    From ParamControle Where Empresa = :Empresa
--    Into :Existe;

    if (TipoControle = 2) then
      execute procedure Stored_PRFT110DecomporProdutos :Empresa, :TipoControle, :CodControle;

    execute procedure Stored_Prft110GeraNota :Ped_Sequencia, :Empresa, :TipoControle, :CodControle, :ContadorNota;

--MARCELO - CHAMADO 208567
    if (FlagCustoMedio = 1) then
    begin
      execute procedure CalcularCustoMedio 1, :EmpresaEstoque, :Empresa, :TipoControle, :CodControle,
                  null, null, null, null, null, null, :DataMovimento, :DataMovimento, 0;
    end
    else
    begin
--MARCELO - CHAMADO 208567
      if (Exists(Select * From MovEstoque Mov
                   Left Join Produtos Pro on Pro.Codigo = Mov.CodProduto
                 Where Mov.Empresa = :Empresa
                   and Mov.TipoControle = :TipoControle
                   and Mov.CodControle = :CodControle
                   and Pro.TipoLote = 1
                   and Pro.FlagLoteUnitario = 1)) then
      begin
        execute procedure CalcularCustoMedioLote current_timestamp, 1, :EmpresaEstoque, :Empresa,
                                                 :TipoControle, :CodControle, null, null,
                                                 null, null, null;
      end
    end

--183245
--192672
    Select
      Sum(Case When Mov.CodProduto <> 8888888
          then Cast((Mov.ValorCustoFor * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
          else 0 End),
      Sum(Case When Mov.CodProduto <> 8888888
          then Cast((Mov.ValorCustoUlt * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
          else 0 End),
      Sum(Case When Mov.CodProduto <> 8888888
          then Cast((Mov.ValorCustoUltReal * Mov.FatorRedCusto) as numeric(18,4)) * Mov.QuantAtendida
          Else 0 End),
      Sum(Case When Mov.CodProduto <> 8888888
          then Mov.ValorCustoMed * Mov.QuantAtendida
          Else 0 End),
      Sum(Case When Mov.CodProduto = 8888888
          then Mov.ValorCustoFor * Mov.QuantAtendida
          Else 0 End)
    From MovEstoque Mov
    Where Empresa = :Empresa
      And TipoControle = :TipoControle
      And CodControle = :CodControle
    Into :ValorCustoForTotal, :ValorCustoUltTotal, :ValorCustoUltRealTotal,
         :ValorCustoMedTotal, :ValorCustoSerTotal;

--183245
    Update NotasFiscais Set
      ValorCustoForTotal = Coalesce(:ValorCustoForTotal,0),
      ValorCustoUltTotal = Coalesce(:ValorCustoUltTotal,0),
      ValorCustoUltRealTotal = Coalesce(:ValorCustoUltRealTotal,0),
      ValorCustoMedTotal = Coalesce(:ValorCustoMedTotal,0),
      ValorCustoSerTotal = Coalesce(:ValorCustoSerTotal,0)
    Where Empresa = :Empresa
      And TipoControle = :TipoControle
      And CodControle = :CodControle;

--Calculo de Comissao da Nota

    execute procedure Stored_Prft110Comissao :Empresa, :TipoControle, :CodControle;

--Atualiza o Número da Ultima duplicata no parametro de controle Quando:
--1 Tem Duplicatas
--2 Nao tem duplicatas mas segue a mesma numeracao de nota e duplicata

    Select
--   Eder Ramos Chamado 310096
        FlagNaoGerenciarNumDocumento
      from ParamControleSerie
      Where Empresa = :Empresa
        and Serie = :SerieControleCursor
      into :FlagNaoGerenciarNumDocumento;

--Eder Ramos Chamado - 302201
    if(FlagNaoGerenciarNumDocumento = 0) then
    begin
        select FlagGerarDuplicata
        from ParamControle
        where Empresa = :Empresa /*--Controle de Gerar Duplicata*/
        into :Existe;

        if ((Existe = 1) and (FlagCupom in(0,2)) and (FlagAtualizaDuplicata = 1)) then
        begin
--            Rafael chamado 254456
--            update ParamControleSerie
             update paramcontrolesequencia
             set UltimaDuplicata = UltimaDuplicata + 1,
                StatusTransacao=1
             where Empresa=:Empresa
--MARCELO - CHAMADO 158510/199271
--           and Serie=:SerieControle;
             and Serie=:SerieControleCursor;
        end
    end

    select FlagGerarDuplicata
    from ParamControle
    where Empresa = :Empresa
    into :Existe;

    --Gabriella - 382313
--     Renato - Chamado 260385 -> Movida para ser executada antes da Stored_Prft110Duplicata
    --execute procedure Stored_Prft110Observacao :Empresa, :TipoControle, :CodControle, :ObsCupom,:FLAGUNIROBSERVACAO ;
    execute procedure Stored_Prft110Observacao :Empresa, :TipoControle, :CodControle, :ObsCupom, :FLAGUNIROBSERVACAO, :Venc_Sequencia;


    if ((Venc_Sequencia <> 0)  /*--Vencimentos escohidos*/
        and (Existe = 1) /*--Controle de Gerar Duplicata*/
        and (TipoDuplicataPedido = 0)) then  /*--gera duplicatas no processamento*/
    begin
--MARCELO - CHAMADO 215809
--Recuperar o valor de ST dos Pedidos
      --Gabriella - 301399
      if (empid = 'DINAMAR') then
      begin
        select Coalesce(Sum(Ped.ValorSubTrib + Ped.valorfrete + Ped.ValorDespesas), 0)
        from TempPRFT110Pedido T
        left join Pedidos Ped on Ped.Empresa = T.Empresa
                             and Ped.CodPedido = T.CodPedido
        where T.NumSequencia = :Ped_Sequencia
        into :ValorSTPedido;
      end
      else
      begin
        select Coalesce(Sum(Ped.ValorSubTrib), 0)
        from TempPRFT110Pedido T
        left join Pedidos Ped on Ped.Empresa = T.Empresa
                             and Ped.CodPedido = T.CodPedido
        where T.NumSequencia = :Ped_Sequencia
        into :ValorSTPedido;
      end

--   Rafael chamado 271610
      if (ValorSTPedido is null) then
         ValorSTPedido = 0;


--Recuperar o valor de ST das Notas Fiscais
      --Gabriella - 301399
      if (empid = 'DINAMAR') then
      begin
        select Coalesce(Sum(NF.ValorSubTrib + NF.ValorFrete + NF.ValorDespesas), 0)
        from TempPRFT110Nota T
        left join NotasFiscais NF on NF.Empresa = T.Empresa
                                 and NF.TipoControle = T.TipoControle
                                 and NF.CodControle = T.CodControle
        where T.NumSequencia = :Ped_Sequencia
        into :ValorSTNota;
      end
      else
      begin
        select Coalesce(Sum(NF.ValorSubTrib), 0)
        from TempPRFT110Nota T
        left join NotasFiscais NF on NF.Empresa = T.Empresa
                                 and NF.TipoControle = T.TipoControle
                                 and NF.CodControle = T.CodControle
        where T.NumSequencia = :Ped_Sequencia
        into :ValorSTNota;
      end

--   Rafael chamado 271610
      if (ValorSTNota is null) then
        ValorSTNota = 0;


--Recuperar o dias de vencimento da duplicata de ST
      select DiasVencimentoDupST
      from ParamControle
      where Empresa = :Empresa
        and ValorMinimoST > 0
        and DiasVencimentoDupST > 0
      into :DiaVencimentoST;

      if (DiaVencimentoST is null) then
        DiaVencimentoST = 0;

--MARCELO - CHAMADO 233642
/*      if ((DiaVencimentoST > 0) and (ValorSTPedido <> ValorSTNota)) then
      begin
        DataVencimentoDupST = :DataMovimento + :DiaVencimentoST;
         
        update TempPRFT110Venc set
           Valor = (Valor - :ValorSTPedido) + :ValorSTNota
        where NumSequencia = :Venc_Sequencia
          and Vencimento = :DataVencimentoDupST;
      end*/
      if (DiaVencimentoST > 0) then
      begin
        DataVencimentoDupST = :DataMovimento + :DiaVencimentoST;

        --Gabriella - 301399
        if (empid = 'DINAMAR') then
        begin
          update TempPRFT110Venc set
            Valor = case when (:ValorSTPedido <> :ValorSTNota)
                         then (Valor - :ValorSTPedido) + :ValorSTNota
                         else Valor end,
            FlagDuplicataST = case when (:ValorSTPedido = 0)
                                   then  0
                                   else 1 end
          where NumSequencia = :Venc_Sequencia
            and Vencimento = :DataVencimentoDupST
            --Gabriella - 349341
            --and Valor = :ValorSTNota;
            and :DiaVencimentoST < (select min(CPV.DiaVencimento)
                                    from CondPagtoVenc CPV
                                    where CPV.CodCondPagto = :CodCondPagto
                                     and CPV.MesVencimento = 0);
        end
        else
        begin
          update TempPRFT110Venc set
            Valor = case when (:ValorSTPedido <> :ValorSTNota)
                         then (Valor - :ValorSTPedido) + :ValorSTNota
                         else Valor end,
--            Rafael chamado 271610
--            FlagDuplicataST = 1
            FlagDuplicataST = case when (:ValorSTPedido = 0)
                                   then  0
                                   else 1 end
          where NumSequencia = :Venc_Sequencia
            and Vencimento = :DataVencimentoDupST;
        end
      end

      select sum(Valor)
      from TempPrft110Venc
      where NumSequencia = :Venc_Sequencia
      into :AuxValorTotal;

--MARCELO - CHAMADO 233642
      if (not Exists(select First 1 Empresa from MovEstoque
                     where Empresa = :Empresa
                       and TipoControle = :TipoControle
                       and CodControle = :CodControle
                       and CodProduto <> 8888888)) then
      begin
        select Valor from TempPRFT110Venc
        where NumSequencia = :Venc_Sequencia
          and FlagDuplicataST = 1
        into :ValorDuplicataST;

        if (ValorDuplicataST is null) then
          ValorDuplicataST = 0;

        AuxValorTotal = :AuxValorTotal - :ValorDuplicataST;
      end

-- processa as duplicatas
      execute procedure Stored_Prft110Duplicata :Empresa, :TipoControle, :CodControle, :CodBanco,
             :CodOperacaoDup, :Venc_Sequencia, :AuxValorTotal,
--MARCELO - CHAMADO 158510/199271
--             :FlagCupom, :SerieControle;
             :FlagCupom, :SerieControleCursor;
    end

    if ((Venc_Sequencia <> 0) /*-- vencimentos informados*/
         and (TipoDuplicataPedido = 1)) then /*--duplicatas no pedido*/
    begin
--196249
--           update Duplicatas
--           set TipoControle=:TipoDuplicata,
--               CodControle=:CodControle,
--               StatusTransacao=1
--          where Duplicatas.Empresa = :Empresa
--            and Duplicatas.TipoDuplicata = :TipoDuplicata
--            and Duplicatas.CodDuplicata in (select CodDuplicata from TempPrft110Venc
--                                             where NumSequencia = :Venc_Sequencia);


--196249
      for
        Select CodDuplicata
        from TempPrft110Venc
        where NumSequencia = :Venc_Sequencia
        Into :CodDuplicata do
      begin
        update Duplicatas
           set TipoControle = :TipoDuplicata,
               CodControle  = :CodControle,
               StatusTransacao = 1
         where Empresa = :Empresa
           and TipoDuplicata = :TipoDuplicata
           and CodDuplicata = :Codduplicata;
      end
    end

--Processa os lançamentos fiscais
    execute procedure Stored_Prft110Fiscal :Ped_Sequencia, :Empresa, :TipoControle, :CodControle;

-- 183245
--      if (FlagCustoMedio = 1) then
--         execute procedure CalcularCustoMedio 1, :EmpresaEstoque, :Empresa, :TipoControle, :CodControle,
--                  null, null, null, null, null, null, :DataMovimento, :DataMovimento, 0;
--Grava as observacoes da Nota Fiscal


--    Renato - Chamado 260385 -> Movida para ser executada antes da Stored_Prft110Duplicata
--    execute procedure Stored_Prft110Observacao :Empresa, :TipoControle, :CodControle, :ObsCupom,:FLAGUNIROBSERVACAO ;

    --Gabriella - 358073
    --Insere na tabela de Relação da Retenção todos os registros da Temporária
    Insert Into NotasFiscaisRelacaoRetencao
          (Empresa, TipoDuplicata, 
           CodDuplicata, TipoControle, 
           CodControle, TipoRetencao, 
           ValorBase, Aliquota,
           ValorRetencao, FlagRetencaoGerada, 
           TipoControleRetencao, CodControleRetencao,
           StatusTransacao, TransacaoEmpresas)
    Select :Empresa, TempRel.TipoDuplicata,
           TempRel.CodDuplicata, TempRel.TipoControle, 
           TempRel.CodControle, TempRel.TipoRetencao,
           TempRel.ValorBase, TempRel.Aliquota,
           TempRel.ValorRetencao, 1, 
           :TipoControle, :CodControle,
           1, ''
      From TempPrft110RelacaoRetencao TempRel
      --Gabriella - 367244
      Left Join NotasFiscais NF on NF.Empresa = :Empresa
                               and NF.TipoControle = :TipoControle
                               and NF.CodControle = :CodControle
     where TempRel.NumSequencia = :Venc_Sequencia
       and TempRel.CodDuplicata <> ''
       --Gabriella - 367244
       and TempRel.TipoRetencao in (1,2,3)  
       and NF.ValorServicos > 0;
  end
--Fim do Loop

--Atualiza os dados dos Pedidos/OS
  execute procedure Stored_Prft110Totalizar(:Empresa, :TipoControle, :CodControle, :EmpresaAntOS, :Ped_Sequencia, :CodStatusPed);

--MARCELO - CHAMADO 158510/199271
  select MensagemErro
  from STORED_PRFT110Validar(:Empresa, :CodOperacao, :FlagCupom, :Ped_Sequencia,
                             :Venc_Sequencia, :CodCondPagto, :TipoDuplicata,
                             :TipoDuplicataPedido, :FlagSepararServico,
                             :SerieControle, :SalvaNumDocumento, 
                             :SerieControleServico, :SalvaNumDocumentoServico,
                             :QuantNotaItem, :QuantNotaServico)
  into :MensagemErro;

  if (MensagemErro <> '') then
  begin
    suspend;
    exit;
  end

END^

SET TERM ; ^

  
--Gabriella - 397525
ALTER TRIGGER TRIGGERINCLUIPRODUTO INACTIVE;
ALTER TRIGGER TRIGGERALTERAPRODUTO INACTIVE;
ALTER TRIGGER TRIGGERDELETAPRODUTO INACTIVE;

ALTER TABLE PRODUTOS ADD UNIDADEPRODUCAO VARCHAR(3) DEFAULT '' NOT NULL COLLATE WIN_PTBR;
ALTER TABLE PRODUTOS ADD QUANTIDADEPRODUCAO NUMERIC(18,8) DEFAULT 0 NOT NULL;

ALTER TRIGGER TRIGGERINCLUIPRODUTO ACTIVE;
ALTER TRIGGER TRIGGERALTERAPRODUTO ACTIVE;
ALTER TRIGGER TRIGGERDELETAPRODUTO ACTIVE;

ALTER TRIGGER INSEREITEMOP INACTIVE;
ALTER TRIGGER ALTERAITEMOP INACTIVE;
ALTER TRIGGER DELETAITEMOP INACTIVE;

update RDB$FIELDS set
RDB$FIELD_SCALE = -4,
RDB$FIELD_PRECISION = 13
where RDB$FIELD_NAME = (SELECT FIRST 1 RDB$FIELD_SOURCE  FROM RDB$RELATION_FIELDS
                        WHERE RDB$RELATION_NAME = 'ITEMOP'
                          AND RDB$FIELD_NAME    = 'QUANTPEDIDA');

update RDB$FIELDS set
RDB$FIELD_SCALE = -4,
RDB$FIELD_PRECISION = 13
where RDB$FIELD_NAME = (SELECT FIRST 1 RDB$FIELD_SOURCE  FROM RDB$RELATION_FIELDS
                        WHERE RDB$RELATION_NAME = 'ITEMOP'
                          AND RDB$FIELD_NAME    = 'QUANTATENDIDA');

ALTER TRIGGER INSEREITEMOP ACTIVE;
ALTER TRIGGER ALTERAITEMOP ACTIVE;
ALTER TRIGGER DELETAITEMOP ACTIVE;


--400345

ALTER TABLE BANCOS  ADD MENSAGEMPROTESTO VARCHAR(100) DEFAULT '' NOT NULL COLLATE WIN_PTBR;



UPDATE  BANCOS
SET MENSAGEMPROTESTO =''
WHERE
MENSAGEMPROTESTO IS NULL ;


--Chamado 399694
ALTER TABLE ITEMCOTACAOFOR ALTER PRAZOENTREGA TYPE smallint;

--Gabriella - 399232
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)
       --Gabriella - 399232
       --Select :SqlTimeStamp, Ip.CodProduto, Null
       Select Distinct :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
                                        And Mov.QuantAtendida > 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.EmpresaEstoque = :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;

--365358
          update Produtos
          set TransacaoEmpresas =''
          where
          codigo = :AuxProCodProduto;

      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 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),
    codentidade char(7))
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);
--386798 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;


/*386798
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 ; ^


--Ronaldo Chamado 401206
SET TERM ^ ;

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),
    notavaloritenssomenteimposto numeric(18,2))
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;
declare variable aliqcomplicm numeric(5,2);
declare variable aliqcomplpis numeric(5,2);
declare variable aliqcomplcofins numeric(5,2);
declare variable notavalorprodutoscalc numeric(11,2);
declare variable flagsomenteimposto smallint;
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; */

 --Gabriella - 392386
 NotaValorProdutosCalc = NotaValorProdutos - NotaValorItensSomenteImposto;

 -- 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,
          --Gabriella - 392386
          T.FlagSomenteImposto

     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,
          --Gabriella - 392386
          0 as FlagSomenteImposto
     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,
         --Gabriella - 392386
         :FlagSomenteImposto
    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

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

          --AcrescimoBaseICM = (NotaValorDespesas - NotaValorDesconto) * (cast(ValorTotal as numeric(18,9)) / NotaValorProdutos);
          AcrescimoBaseICM = (NotaValorDespesas - NotaValorDesconto) * (cast(ValorTotal as numeric(18,9)) / NotaValorProdutosCalc);
          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);
          AcrescimoBaseSubTrib = (AcrescimoBaseSubTrib - NotaValorDesconto) * (ValorTotal / NotaValorProdutosCalc);

          AcrescimoRedVenda = NotaValorDespesasVenda * (ValorTotal / NotaValorProdutos);

          --Gabriella - 392386
          if (FlagSomenteImposto = 1) then
          begin
            AcrescimoBaseIPI = 0;
            AcrescimoBaseICM = 0;
            AcrescimoBaseSubTrib = 0;
          end
        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)
      --Ronaldo Chamado 401206
      --order by SeqTemporaria, NumLancamento
      Order By ValorTotal Desc
      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)
      --Ronaldo Chamado 401206
      --order by SeqTemporaria, NumLancamento, NumSequencia
      Order By ValorTotal Desc
      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 ^ ;

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;
declare variable aliqcomplicm numeric(5,2);
declare variable aliqcomplpis numeric(5,2);
declare variable aliqcomplcofins numeric(5,2);
declare variable sumvaloritenssomenteimposto numeric(18,2);
declare variable auxsumvaloritenssomenteimposto numeric(18,2);
declare variable valorprodutostotalcalc numeric(11,2);
declare variable valoritenssomenteimposto numeric(18,2);
declare variable flagsomenteimposto smallint;
begin
/**********************  
VERSÃO 3.02
**********************/  
--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),
       --Gabriella - 392386
       coalesce(Sum(Ped.ValorItensSomenteImposto),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,
      --Gabriella - 392386
      :ValorItensSomenteImposto;
  
--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;

--Gabriella - 392386
ValorProdutosTotalCalc = ValorProdutosTotal - ValorItensSomenteImposto;
/*
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),
            --Gabriella - 392386
            Cast(Mov.FlagSomenteImposto 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),
            --Gabriella - 392386
            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,
          --Gabriella - 392386
          :FlagSomenteImposto
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

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

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

      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);
      AuxAcrescimoBaseSubTrib = (AuxAcrescimoBaseSubTrib - ValorDesconto) * (AuxValorTotal / ValorProdutosTotalCalc);

      AuxAcrescimoRedVenda = ValorDespesasNaoInc + ValorDesconto;
      If ((ValorFrete > 0) and (ValorFreteTransp > 0)) then
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + (ValorFreteTransp - ValorFrete);
      Else
        AuxAcrescimoRedVenda = AuxAcrescimoRedVenda + ValorFreteTransp;
      AuxAcrescimoRedVenda = AuxAcrescimoRedVenda * (AuxValorTotal / ValorProdutosTotal);

      --Gabriella - 392386
      if (FlagSomenteImposto = 1) then
      begin
        AuxAcrescimoBaseIPI = 0;
        AuxAcrescimoBaseICM = 0;
        AuxAcrescimoBaseSubTrib = 0;
      end  
   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;
--Gabriella - 392386
SumValorItensSomenteImposto = 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)),
           --Gabriella - 392386
           Cast(Sum(Case When Mov.CodProduto <> 8888888 and Mov.FlagSomenteImposto = 1
                    then Mov.ValorTotal 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)),
           --Gabriella - 392386
           Cast(0  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,
          --Gabriella - 392386
          :auxsumvaloritenssomenteimposto
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;

     --Gabriella - 392386
     If (not (AuxSumValorItensSomenteImposto is null)) then
        SumValorItensSomenteImposto = SumValorItensSomenteImposto + AuxSumValorItensSomenteImposto;
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),
       --Gabriella - 392386
       ValorItensSomenteImposto = rs_dnvl(:SumValorItensSomenteImposto, 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)
      --Ronaldo Chamado 401206
      --Order By NumLancamento
      Order By ValorTotal Desc
      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)
      --Ronaldo Chamado 401206
      --Order By NumLancamento
      Order By ValorTotal Desc
      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 ; ^

--402652



ALTER TABLE PARAMCONTROLESERIE ADD TIPOGERARINFORCONSUMIDORFINAL INTEGER DEFAULT 0 NOT NULL;


UPDATE  PARAMCONTROLESERIE
SET  TIPOGERARINFORCONSUMIDORFINAL= 0
WHERE
FLAGPRINCIPAL IS NULL;




UPDATE  PARAMCONTROLESERIE
SET  TIPOGERARINFORCONSUMIDORFINAL= CASE WHEN FLAGPRINCIPAL = 1 THEN 1 
                                         WHEN FLAGPRINCIPAL = 0 THEN 2
                                    ELSE 0 END     
WHERE
TIPOGERARINFORCONSUMIDORFINAL = 0;

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;
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 (TipoCalcExterno = 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 (TipoCalcExterno in(2,3,4,6,7,9,10,11))) and ((flagitemcontemletracomissao = 0)  or (flagcomissaoLetralistaPreco = 0) ) )
    OR
    ((TipoCalculo = 1) and (TipoCalcExterno = 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
 
--401108 ( (TipoCalculo = 2) and (TipoCalcInterno = 1) and  (flagitemcontemletracomissao = 0) or (flagcomissaoLetralistaPreco = 0 ) )
    ( (TipoCalculo = 2) and (TipoCalcParceiro = 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 (TipoCalcParceiro in(2,3,4,6,7,9,10,11))) and ((flagitemcontemletracomissao = 0)  or (flagcomissaoLetralistaPreco = 0) ) )
    OR
    ((TipoCalculo = 1) and (TipoCalcParceiro = 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
^

SET TERM ; ^

SET TERM ^ ;

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(5,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(5,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),
    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 numeric(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 numeric(5,2);
declare variable percicmcusto numeric(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 smallint;
declare variable oprflagicmssobreservicos smallint;
declare variable flagconsiderarsomentepercredst integer;
BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.02
*********************/
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,
  --Ronaldo Chamado 372149
  FlagConsiderarSomentePercRedST

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,
  --Ronaldo Chamado 372149
  :FlagConsiderarSomentePercRedST;

 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
    --Ronaldo chamado 372149
    --CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
    CASE WHEN :RedBaseSubTrib = 0 and :FlagConsiderarSomentePercRedST = 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;

--Gabriella - 381216
--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
--Ronaldo Chamado 372149
/*--364660
--  (redbasesubtrib <> 999.99) and*/
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1 AliqICM,
         CASE WHEN :RedBaseSubTrib = 0 and :FlagConsiderarSomentePercRedST = 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

--Gabriella - 381216
IF (trialiqinternasubtrib <> 0) THEN
 EstAliqInterna = triAliqInternaSubTrib;
    
IF (EstAliqInterna IS NULL) THEN
   EstAliqInterna = 0;

--Ronaldo Chamado 372149
/*--364660
-- quando informada 999.99, tem que zerar para não calcular
--if (RedBaseSubTrib = 999.99) then
--  RedBaseSubTrib = 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

--Ronaldo Chamado 383605
if (OprPerRedICM <> 99.99) then
begin
  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
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
  --Ronaldo Chamado 383605
  --IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0) THEN
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0 and OprPerRedICM <> 99.99) 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
  --Ronaldo Chamado 383605
  --IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0) THEN
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0 and OprPerRedICM <> 99.99) 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        
    --Eder - 383214 - Quando ha redução na base, considerar apenas a parte tributada para outras (St)
    --ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    --ValorIsentoICM = 0;
     if (ValorIsentoICM <> 0 and ValorBaseICM <> 0) Then
       ValorOutrasICM = ValorBaseICM;
     else      
     begin    
       ValorOutrasICM = ValorBaseICM + ValorIsentoICM;
       ValorIsentoICM = 0;
     end      
  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
  begin
    --397007
    if (AcrescimoRedVenda > ValorTotal) then
      FatorRedVenda = 0;
    else  
      FatorRedVenda = FatorRedVenda -
                     Rs_RoundDec(((CAST(AcrescimoRedVenda AS NUMERIC(9,4)) * 100) / CAST(ValorTotal AS NUMERIC(11,4))) / 100,4);
  end

  --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
    --danilo IF (EntTipoPessoa IN('F','N','C','P')) THEN
    IF (EntTipoPessoa IN('F','N')) 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 383214
--Eder - 297029
--If (ValorBaseICM > 0 and ValorIsentoICM > 0) then
  If ((ValorBaseICM > 0 or ValorOutrasICM > 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 ; ^

--Gabriella - 403908
DROP TRIGGER UPDATEITEMPEDIDOCOMPRA;
DROP TRIGGER DELETEITEMPEDIDOCOMPRA;
DROP TRIGGER INSERTITEMPEDIDOCOMPRA;

CREATE TABLE ESTOQUEPRODUTOCOMPRA
 (
  CODPRODUTO                INT           DEFAULT 0   NOT NULL,
  EMPRESA                   INT           DEFAULT 0   NOT NULL,
  QUANTPENDENCIACOMPRA      NUMERIC(10,3) DEFAULT 0   NOT NULL,
  QUANTPENDENCIAVENDACASADA NUMERIC(10,3) DEFAULT 0   NOT NULL,
  DATAENTREGACOMPRA         TIMESTAMP,
  DATAATUALIZACAO           TIMESTAMP,
  STATUSTRANSACAO           SMALLINT      DEFAULT 0   NOT NULL,
  TRANSACAOEMPRESAS         VARCHAR(50)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR
 );

ALTER TABLE ESTOQUEPRODUTOCOMPRA ADD CONSTRAINT
    PK_ESTOQUEPRODUTOCOMPRA PRIMARY KEY
    (
     CODPRODUTO,
     EMPRESA);

INSERT INTO ESTOQUEPRODUTOCOMPRA(CODPRODUTO, EMPRESA, QUANTPENDENCIACOMPRA, QUANTPENDENCIAVENDACASADA,
                                 DATAENTREGACOMPRA, STATUSTRANSACAO, TRANSACAOEMPRESAS)
SELECT CODPRODUTO, EMPRESA, QUANTPENDENCIACOMPRA, QUANTPENDENCIAVENDACASADA,
       DATAENTREGACOMPRA, STATUSTRANSACAO, TRANSACAOEMPRESAS
FROM ESTOQUEPRODUTO;

ALTER TABLE ESTOQUEPRODUTO DROP QUANTPENDENCIACOMPRA;
ALTER TABLE ESTOQUEPRODUTO DROP QUANTPENDENCIAVENDACASADA;
ALTER TABLE ESTOQUEPRODUTO DROP DATAENTREGACOMPRA;

SET TERM ^ ;

ALTER trigger triggerincluiempresa for empresas
active after insert or update position 0
AS
begin
  insert into EstoqueProduto
         (CodProduto, Empresa, ClasseABC, StatusTransacao)
     select 
       distinct
       Produtos.Codigo,
       New.EmpresaEstoque,
       'N',
       1 as StatusTransacao
       from Produtos
       where New.EmpresaEstoque > 0
         and not Exists(Select * from EstoqueProduto 
                         where EstoqueProduto.Empresa = New.EmpresaEstoque
                         and EstoqueProduto.CodProduto = Produtos.Codigo);

  insert into EstoqueProdutoCompra
         (CodProduto, Empresa, StatusTransacao)
     select 
       distinct
       Produtos.Codigo,
       New.EmpresaEstoque,
       1 as StatusTransacao
       from Produtos
       where New.EmpresaEstoque > 0
         and not Exists(Select * from EstoqueProdutoCompra
                         where EstoqueProdutoCompra.Empresa = New.EmpresaEstoque
                         and EstoqueProdutoCompra.CodProduto = Produtos.Codigo);

  -- Cria itens no EstoqueDetalhado para cada produto em cada empresaestoque
  insert into EstoqueDetalhado
      (CodProduto, EmpresaEstoque, CodTipo, StatusTransacao)
   select 
      distinct
      Produtos.Codigo,
      New.EmpresaEstoque,
      TipoEstoque.Codigo,
      1 
      from Produtos, TipoEstoque
      where New.EmpresaEstoque > 0
         and not Exists(Select * from EstoqueDetalhado Ed
                        where Ed.EmpresaEstoque = New.EmpresaEstoque
                          and Ed.CodProduto = Produtos.Codigo
                          and Ed.CodTipo = TipoEstoque.Codigo);

end
^

ALTER trigger triggerincluiproduto for produtos
active after insert position 0
AS
begin
  --Gera a pesquisa auxiliar para o produto
  Execute Procedure QuebraProdutosPesquisa(New.Codigo,0);

--Incluir um registro na tabela para cada "EmpresaEstoque" que existir
  Insert into EstoqueProduto
  (CodProduto, Empresa, ClasseABC, StatusTransacao)
  Select
     Distinct
     New.Codigo,
     EmpresaEstoque,
     'N',
     1
  from Empresas
  where EmpresaEstoque > 0
    and Not Exists(Select CodProduto From EstoqueProduto
                     Where EstoqueProduto.CodProduto = New.Codigo
                       and EstoqueProduto.Empresa = Empresas.EmpresaEstoque);

  Insert into EstoqueProdutoCompra
  (CodProduto, Empresa, StatusTransacao)
  Select
     Distinct
     New.Codigo,
     EmpresaEstoque,
     1
  from Empresas
  where EmpresaEstoque > 0
    and Not Exists(Select CodProduto From EstoqueProdutoCompra
                     Where EstoqueProdutoCompra.CodProduto = New.Codigo
                       and EstoqueProdutoCompra.Empresa = Empresas.EmpresaEstoque);


-- Cria itens no EstoqueDetalhado para cada produto em cada empresaestoque
  insert into EstoqueDetalhado
      (CodProduto, EmpresaEstoque, CodTipo, StatusTransacao)
   select
      distinct
        New.Codigo,
        Empresas.EmpresaEstoque,
        TipoEstoque.Codigo,
        1
        from Empresas, TipoEstoque
        where Empresas.EmpresaEstoque > 0
          and not Exists(Select * from EstoqueDetalhado Ed
                          where Ed.EmpresaEstoque = Empresas.EmpresaEstoque
                            and Ed.CodProduto = New.Codigo
                             and Ed.CodTipo = TipoEstoque.Codigo);

end
^

ALTER trigger triggerdeletaproduto for produtos
active after delete position 0
AS
begin
/* FB */

--Apaga os Indices de Pesquisa do Produto
  Delete From ProdutosPesquisa Where ProdutosPesquisa.Codigo = OLD.Codigo;

--Apaga as Listas de Preço do Produto
  Delete From ItemListaPreco Where ItemListaPreco.CodProduto = OLD.Codigo;

--Apaga as composicoes do produto
  Delete From ComposicaoProduto Where ComposicaoProduto.CodProdutoPrin = OLD.Codigo or
                                      ComposicaoProduto.CodProdutoComp = OLD.Codigo;

--Apaga os Numeros auxiliares do produto
  Delete From NumerosAux Where NumerosAux.CodProduto = OLD.Codigo;

--Apaga os Coeficientes do Produto
  Delete From CoeficientesProduto Where CoeficientesProduto.CodProduto = OLD.Codigo;

--Apaga os Lotes do Produto
  Delete From Lotes Where Lotes.CodProduto = OLD.Codigo;

--Move 999999 para os itens do pedido de compra
  Update ItemPedidoCompra
       Set CodProduto = 9999999
       Where ItemPedidoCompra.CodProduto = OLD.Codigo
         and OLD.Codigo <> 8888888;

--Move 999999 para o Movimento de Estoque
  Update MovEstoque
     Set CodProduto = 9999999
     Where MovEstoque.CodProduto = OLD.Codigo
       and OLD.Codigo <> 8888888;

  Update MovEstoque
     Set CodProdutoMov = 9999999
     Where MovEstoque.CodProdutoMov = OLD.Codigo
       and OLD.Codigo <> 8888888;

---Apaga os Estoques do Produto
---Deve estar apos o Update do movestoque que ira chamar a trigger de acerto
---de estoque, senão cria novamente o EstoqueProduto.
  delete from  EstoqueProduto where EstoqueProduto.CodProduto = OLD.Codigo;

  delete from  EstoqueProdutoCompra where EstoqueProdutoCompra.CodProduto = OLD.Codigo;

  delete from  EstoqueDetalhado where EstoqueDetalhado.CodProduto = OLD.Codigo;

  delete from  DescricaoProduto where DescricaoProduto.CodProduto = OLD.Codigo;

  --MARCELO - CHAMADO 123974
  delete from CodigoBarraProdutos where CodigoBarraProdutos.CodProduto = Old.Codigo;

  Delete From ProdutosSugeridos Where ProdutosSugeridos.CodProduto = OLD.Codigo or
                                      ProdutosSugeridos.CodProdutoSugerido = OLD.Codigo;

  -- Rafael chamado 268459
  delete from ItensCatalogo where ItensCatalogo.CodProduto = Old.Codigo;

  --Gabriella - 353940
  delete from NFeRelacaoProduto where NFeRelacaoProduto.CodProduto = Old.Codigo;

end
^

SET TERM ; ^

--Gabriella - 401428
CREATE TABLE ORDEMSERVICORELACIONAMENTO
 (
  EMPRESA                   INT           DEFAULT 0   NOT NULL,
  CODOS                     INT           DEFAULT 0   NOT NULL,
  TIPOCONTROLE              INT           DEFAULT 0   NOT NULL,
  CODCONTROLE               INT           DEFAULT 0   NOT NULL,
  STATUSTRANSACAO           SMALLINT      DEFAULT 0   NOT NULL,
  TRANSACAOEMPRESAS         VARCHAR(50)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR
 );

ALTER TABLE ORDEMSERVICORELACIONAMENTO ADD CONSTRAINT
    PK_ORDEMSERVICORELACIONAMENTO PRIMARY KEY
    (EMPRESA,
     CODOS,
     TIPOCONTROLE,
     CODCONTROLE);

update RDB$FIELDS set
RDB$FIELD_LENGTH = 20,
RDB$CHARACTER_LENGTH = 20
where RDB$FIELD_NAME = (select rdb$field_source from rdb$relation_fields
                        where Upper(rdb$relation_name) = 'VEICULOS'
                        and Upper(rdb$field_name) = 'NUMFROTA');
                        
ALTER TRIGGER TRIGGERDELETAOS INACTIVE;                        

ALTER TABLE ORDEMSERVICO ADD NUMOSCLIENTE VARCHAR(20) DEFAULT '' NOT NULL COLLATE WIN_PTBR;
ALTER TABLE ORDEMSERVICO ADD NUMAUTORIZAFAT VARCHAR(20) DEFAULT '' NOT NULL COLLATE WIN_PTBR;

ALTER TRIGGER TRIGGERDELETAOS ACTIVE;  

ALTER TABLE OPERACOES ADD FLAGRELACIONAROS SMALLINT DEFAULT 0 NOT NULL;
                     


--Gabriella - 386495
ALTER TABLE ESTOQUEPRODUTO ADD ESTOQUEMAXIMO INTEGER DEFAULT 0 NOT NULL;


--Eder - Chamado 406360


#SE [
    SELECT FIRST 1 * FROM EMPRESAS WHERE ID <> 'JUMORI'
    ]

CREATE INDEX MOVDESPESA4 ON MOVDESPESA(NUMLANCAMENTO, NUMLOTE, PERIODO, EMPRESA);

#FIMSE

--Gabriella - 404852
ALTER TABLE DETALHESENTIDADEEMPRESA ADD CODREGIAOENTREGA INT DEFAULT 0 NOT NULL;

ALTER TABLE VENDEDORESCOMISSAO ADD CODREGIAOENTREGA INT DEFAULT 0 NOT NULL;

--Gabriella - 402801
#SE [
Select * From ProdutosOrigemMercadoria
Where not exists(Select * From ProdutosOrigemMercadoria Where Codigo = 8)
]

Insert Into ProdutosOrigemMercadoria(Codigo, DescOrigem, StatusTransacao, TransacaoEmpresas)
Values(8, 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70%', 1, '');

update ProdutosOrigemMercadoria
set DescOrigem = 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% e inferior ou igual a 70%'
where Codigo = 3;

#FIMSE


--Gabriella - 406500
#SE [
SELECT *  FROM RDB$DATABASE
      WHERE (SELECT COUNT(*) FROM RDB$RELATION_FIELDS F
              WHERE F.RDB$RELATION_NAME = 'PORTASRELATORIO'
                AND F.RDB$FIELD_NAME IN ('EMPRESA'))  = 0
]

ALTER TABLE PORTASRELATORIO ADD EMPRESA SMALLINT DEFAULT 0 NOT NULL;

UPDATE PORTASRELATORIO
SET EMPRESA = 0
WHERE
EMPRESA IS NULL;

ALTER TABLE PORTASRELATORIO DROP CONSTRAINT PK_PORTASRELATORIO;

ALTER TABLE PORTASRELATORIO ADD CONSTRAINT PK_PORTASRELATORIO
PRIMARY KEY (EMPRESA, CODUSUARIO, NOME);

#FIMSE




--Gabriella - 404958
ALTER TABLE ENTIDADES ADD DATAVALIDADESUFRAMA TIMESTAMP;

Alter Table CLASSFISCAIS
  Add MVABASEENTRADA numeric(5,2) default 0; 
  
  SET TERM ^ ;

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(5,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(5,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),
    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 numeric(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 numeric(5,2);
declare variable percicmcusto numeric(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 smallint;
declare variable oprflagicmssobreservicos smallint;
declare variable flagconsiderarsomentepercredst integer;
declare variable ClaMVABaseEntrada numeric(5,2);
declare variable MVA numeric(18,8);

BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.03
*********************/
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,
--389093
    MVABaseEntrada
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
    :ClaAliqPisCofins,
    :ClaMVABaseEntrada;

  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,
  --Ronaldo Chamado 372149
  FlagConsiderarSomentePercRedST

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,
  --Ronaldo Chamado 372149
  :FlagConsiderarSomentePercRedST;

 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;


--389093
if  ((ClaMVABaseEntrada <> 0) and
    (((FlagEntrada = 1) and (OprTipoMovimento <> 1)) or  ((FlagEntrada = 0) and (OprTipoMovimento = 1))))
then
  MVA = ClaMVABaseEntrada;
else
  MVA = TriMargemLucroSubst;


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
    (MVA <> 0) AND
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1
     AliqICM,
     --MARCELO - CHAMADO 214200
     --PerReducaoICM
    --Ronaldo chamado 372149
    --CASE WHEN :RedBaseSubTrib = 0 THEN PerReducaoICM ELSE :RedBaseSubTrib END
    CASE WHEN :RedBaseSubTrib = 0 and :FlagConsiderarSomentePercRedST = 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;

--Gabriella - 381216
--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
    (MVA <> 0) AND
--Ronaldo Chamado 372149
/*--364660
--  (redbasesubtrib <> 999.99) and*/
    (NOT Existe IS NULL)) THEN
BEGIN
  SELECT FIRST 1 AliqICM,
         CASE WHEN :RedBaseSubTrib = 0 and :FlagConsiderarSomentePercRedST = 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

--Gabriella - 381216
IF (trialiqinternasubtrib <> 0) THEN
 EstAliqInterna = triAliqInternaSubTrib;
    
IF (EstAliqInterna IS NULL) THEN
   EstAliqInterna = 0;

--Ronaldo Chamado 372149
/*--364660
-- quando informada 999.99, tem que zerar para não calcular
--if (RedBaseSubTrib = 999.99) then
--  RedBaseSubTrib = 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));
--407202
if (NumCstIPI = 49 and FlagEntrada = 0) then
  NumCstIPI = 99;
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


--389093
-- calcula MVA ajustado, para fazer equalização de alíquota
if ((ClaMVABaseEntrada <> 0) and
   (((FlagEntrada = 1) and (OprTipoMovimento <> 1)) or ((FlagEntrada = 0) and (OprTipoMovimento = 1)))) then
begin
/* 
  exemplo:  @AliqICM = 4 e @EstAliqInterna = 18 e @ClaMVABaseEntrada = 52.27
  A = (1 - 0.04) / (1 - 0.18) = 1.170
  B = 1 + 0.5227 = 1.5227
  C = A * B --> 1.170 * 1.5227 = 1.7815
  D = (C - 1) * 100  --> (1.7815 - 1) * 100 = 75.15
*/

  MVA = (1 - (AliqICM/100)) / (1 - (EstAliqInterna/100));
  MVA = MVA * (1 + (ClaMVABaseEntrada/100));
  MVA = (MVA - 1) * 100;
  MVA = Round (MVA,2);
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 (MVA <> 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 MVA <> 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

--Ronaldo Chamado 383605
if (OprPerRedICM <> 99.99) then
begin
  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
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 MVA <> 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
  --Ronaldo Chamado 383605
  --IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0) THEN
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTrib <> 0 and OprPerRedICM <> 99.99) 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 (MVA <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
        ValorBaseSubTrib = ValorBaseSubTrib +  ((ValorBaseSubTrib * MVA) / 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 MVA <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  --Aplica a redução na base de substituição do estado de destino para o estado de destino
  --Ronaldo Chamado 383605
  --IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0) THEN
  IF (RedBaseSubTrib <> 0 AND ValorBaseSubTribCarga  <> 0 and OprPerRedICM <> 99.99) 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 (MVA <> 999.99) THEN --Considera como se não houvesse margem de lucro, mas calcula a substituição
       ValorBaseSubTribCarga = ValorBaseSubTribCarga +  ((ValorBaseSubTribCarga * MVA) / 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 (MVA <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    --Eder - 383214 - Quando ha redução na base, considerar apenas a parte tributada para outras (St)
    --ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    --ValorIsentoICM = 0;
     if (ValorIsentoICM <> 0 and ValorBaseICM <> 0) Then
       ValorOutrasICM = ValorBaseICM;
     else      
     begin    
       ValorOutrasICM = ValorBaseICM + ValorIsentoICM;
       ValorIsentoICM = 0;
     end      
  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 (MVA <> 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
  begin
    --397007
    if (AcrescimoRedVenda > ValorTotal) then
      FatorRedVenda = 0;
    else  
      FatorRedVenda = FatorRedVenda -
                     Rs_RoundDec(((CAST(AcrescimoRedVenda AS NUMERIC(9,4)) * 100) / CAST(ValorTotal AS NUMERIC(11,4))) / 100,4);
  end

  --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
    --danilo IF (EntTipoPessoa IN('F','N','C','P')) THEN
    IF (EntTipoPessoa IN('F','N')) 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 383214
--Eder - 297029
--If (ValorBaseICM > 0 and ValorIsentoICM > 0) then
  If ((ValorBaseICM > 0 or ValorOutrasICM > 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;
  MVA = 0;
end 

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = MVA;


--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 (MVA <> 0)))) OR
        (OprTipoICM = 2)) THEN
    BEGIN
      ValorOutrasICM = ValorIsentoICM;
      ValorIsentoICM = 0;
    END
  END
END

SUSPEND;

END
^

SET TERM ; ^

--Gabriella - 401561
ALTER TRIGGER DELETAENTIDADES INACTIVE;

ALTER TABLE ENTIDADES ADD QUANTITENSNOTAGARANTIA NUMERIC(12,3) DEFAULT 0 NOT NULL;
ALTER TABLE ENTIDADES ADD VALORNOTAGARANTIA NUMERIC(11,2) DEFAULT 0 NOT NULL;

ALTER TRIGGER DELETAENTIDADES ACTIVE;

CREATE TABLE GARANTIALAUDO
 (
  EMPRESAESTOQUE           INT           DEFAULT 0   NOT NULL,
  CODGARANTIA              INT           DEFAULT 0   NOT NULL,
  NUMSEQUENCIALAUDO        VARCHAR(20)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  DATAMOVIMENTO            TIMESTAMP,
  CODPRODUTO               INT           DEFAULT 0   NOT NULL,
  DESCRICAOLAUDO           VARCHAR(4000) DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  TIPORETORNO              INT           DEFAULT 0   NOT NULL,
  STATUSTRANSACAO          SMALLINT      DEFAULT 0   NOT NULL,
  TRANSACAOEMPRESAS        VARCHAR(50)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR
 );

ALTER TABLE GARANTIALAUDO ADD CONSTRAINT
    PK_GARANTIALAUDO PRIMARY KEY
    (
     EMPRESAESTOQUE,
     CODGARANTIA,
     NUMSEQUENCIALAUDO
    );

