update Versao
set PatchVersao = 3
where versao = 3
  and subversao = 2;

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 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 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 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 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);
declare variable tipomargemlucro smallint;
declare variable lispercdesconto1 numeric(4,2);
declare variable lispercdesconto2 numeric(4,2);
declare variable lispercdesconto3 numeric(4,2);
declare variable lispercdesconto4 numeric(4,2);
declare variable lispercdesconto5 numeric(4,2);
declare variable lispercacrescimo1 numeric(4,2);
declare variable lispercacrescimo2 numeric(4,2);
declare variable lispercacrescimo3 numeric(4,2);
declare variable lisvalorcustobruto numeric(13,4);
declare variable lisvalorcustoliquido numeric(13,4);
declare variable valorcustocalc numeric(13,4);
declare variable valoricmcustocalc numeric(13,2);
declare variable tipomargemliquida smallint;
declare variable valorpis numeric(11,2);
declare variable valorcofins numeric(11,2);
declare variable empid varchar(15);
BEGIN
--Limpa as de calculo
/*FB*/
/*********************
VERSÃO 3.03
*********************/

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
  'M' || Rs_Replicate('0',(6 - Rs_Length(:Empresa))) || CAST(:Empresa AS VARCHAR(10)),
  ID
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :AEmpMestre, :EmpID;

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

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,
--408846
  TipoMargemLiquida
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem,
     :TipoMargemLiquida;


-- 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;
--408846 ClaAliqPisCofins = 0;
IF (ltrim(CodClassFiscal) <> '') THEN
BEGIN
  SELECT
    FlagSubTributaria,
--408846    AliqPisCofins,
--389093
    MVABaseEntrada
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
--408846    :ClaAliqPisCofins,
    :ClaMVABaseEntrada;

  IF (ClaFlagSubTributaria IS NULL) THEN
     ClaFlagSubTributaria = 1;
--408846  IF (ClaAliqPisCofins IS NULL) THEN
--408846     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,
--408846  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,
--408846  :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;
--408846 IF (OprFlagCalcPIS_COFINS IS NULL) THEN
--408846   OprFlagCalcPIS_COFINS = 0;
IF (OprFlagDefaultLancamentoOutras = 1) THEN
  OprFlagDefaultLancamentoOutras = 0;
--408846 IF (OprFlagCalcPIS_COFINS = 1) THEN
--408846   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,
  --408846
  Ilp.PercDesconto1,
  Ilp.PercDesconto2,
  Ilp.PercDesconto3,
  Ilp.PercDesconto4,
  Ilp.PercDesconto5,
  Ilp.PercAcrescimoInc1,
  Ilp.PercAcrescimoInc2,
  Ilp.PercAcrescimoInc3,
  Ilp.ValorCustoBruto,
  Ilp.ValorCustoLiquido
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,
  --408846
  :LisPercDesconto1,
  :LisPercDesconto2,
  :LisPercDesconto3,
  :LisPercDesconto4,
  :LisPercDesconto5,
  :LisPercAcrescimo1,
  :LisPercAcrescimo2,
  :LisPercAcrescimo3,
  :LisValorCustoBruto,
  :LisValorCustoLiquido;


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 = RS_RoundDec (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                                        

--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,
       --408846
      ValorPis, ValorCofins
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,
       --408846
       :ValorPis, :ValorCofins;

--408846
aliqpiscofins = 0;
if (AliqPIS is not null) then
  aliqpiscofins = aliqpiscofins + AliqPIS;
if (aliqcofins is not null) then
  aliqpiscofins = aliqpiscofins + aliqcofins;


--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
    --Eder 378979 - SOLUCAO DE CONTORNO PARA O CASO DOS IMPORTADOS A 4%
    if ((EmpId in ('DINATEC','DINAMAR')) and (TriAliqICM = 4)) then
    begin
      Select Case When P.Origem in (2,3) Then 0.8612   -- 13.88%   Importados adquiridos no mercado interno
                  Else  (100 - 18.00) / (100 - :AliqICM)  -- 14.58 %
             End
      From Produtos P
      Where P.Codigo = :CodProduto
      Into :FatorRedCusto;
    end
    else
      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
     --408846 IF (ValorBaseICM = ValorTotal + AcrescimoBaseICM) THEN
    IF (ValorBaseICM = ValorTotal) 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
  begin
     --408846 FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);
     if (valorbasepiscofins = ValorTotal) then
       FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);
     else
     if (ValorTotal > 0) then
       FatorRedVenda = FatorRedVenda - Rs_RoundDec(((CAST(Valorpis + ValorCofins AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);
  end

  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
    --408846  
    if ((TipoMargemLucro = 0) and (TipoMargemLiquida = 0)) then
    begin
      Select ValorCusto
      From CalculaCustoLiquido (:Empresa, :LisValorCustoBruto,
            :LisPercDesconto1, :LisPercDesconto2, :LisPercDesconto3, :LisPercDesconto4,
            :LisPercDesconto5, :LisPercAcrescimo1, :LisPercAcrescimo2, :LisPercAcrescimo3,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      Into :ValorCustoCalc;

      ValorICMCustoCalc = Rs_Rounddec((PercICMCusto / 100.00) * ValorCustoCalc,2);
      
      if (LisValorCustoLiquido > 0) then
      begin
        FatorRedCusto = FatorRedCusto -  (ValorICMCustoCalc / LisValorCustoLiquido);
      end
      Else
        FatorRedCusto =0;
      
    end  
    else
      FatorRedCusto = FatorRedCusto - (PercICMCusto / 100);
  END
END

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

/*408846 - cálculo do pis/cofins foi movido mais para cima
--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;

if (EmpID = 'DINATEC') then
begin
 IF (:CodOperacao = 220) Then
    FatorRedCusto = 1;
 IF (:CodOperacao = 88) Then
    FatorRedCusto = 1;
 IF (:CodOperacao = 89) Then
    FatorRedCusto = 1;
end    



--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 ; ^