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


SET TERM ^ ;

EXECUTE BLOCK AS BEGIN
if (not exists(SELECT * FROM RDB$RELATION_FIELDS F
              WHERE F.RDB$RELATION_NAME = 'ENTIDADES'
                AND F.RDB$FIELD_NAME = 'TIPOINDICADORIE')) then
execute statement 'ALTER TABLE ENTIDADES ADD TIPOINDICADORIE INT DEFAULT 0 NOT NULL;';
END
^

SET TERM ; ^

COMMIT WORK;

Update Entidades set 
  TipoIndicadorIE = 
    Case when ((TipoPessoa = 'F') or
        (coalesce((select C.CodEstado from cidades C where c.codigo = Entidades.codcidade),'') = 'EX')) then 9
         when TipoPessoa = 'N' then 2
         when (select Numero from SoNumeros(NumInscricao)) <> '0' then 1
         else 2 end
Where coalesce(tipoindicadorIE,0) = 0
   and rs_length(numinscricao) <  20;
                         
Update Entidades set 
  NumInscricao = ''
Where UPPER(NumInscricao) = 'ISENTO'
  or UPPER(NumInscricao) = 'ISENTA';

Alter Table MovEstoqueImposto Add AliqFCP numeric(5,2);  
Alter Table MovEstoqueImposto Add ValorFCP numeric (11,2);
Alter Table MovEstoqueImposto Add AliqICMDestino numeric(5,2);
Alter Table MovEstoqueImposto Add PercPartilhaICMOrigem numeric (5,2);
Alter Table MovEstoqueImposto Add PercPartilhaICMDestino numeric (5,2);
Alter Table MovEstoqueImposto Add ValorPartilhaICMOrigem numeric (11,2);
Alter Table MovEstoqueImposto Add ValorPartilhaICMDestino numeric (11,2);
Alter Table MovEstoqueImposto Add CEST varchar(7);

Alter Table TempPRCE050Itens Add AliqFCP numeric(5,2);
Alter Table TempPRCE050Itens Add ValorFCP numeric (11,2);
Alter Table TempPRCE050Itens Add AliqICMDestino numeric(5,2);
Alter Table TempPRCE050Itens Add PercPartilhaICMOrigem numeric (5,2);
Alter Table TempPRCE050Itens Add PercPartilhaICMDestino numeric (5,2);
Alter Table TempPRCE050Itens Add ValorPartilhaICMOrigem numeric (11,2);
Alter Table TempPRCE050Itens Add ValorPartilhaICMDestino numeric (11,2);
Alter Table TempPRCE050Itens Add CEST varchar(7);

Alter Table MovComponente Add AliqFCP numeric(5,2);
Alter Table MovComponente Add ValorFCP numeric (11,2);
Alter Table MovComponente Add AliqICMDestino numeric(5,2);
Alter Table MovComponente Add PercPartilhaICMOrigem numeric (5,2);
Alter Table MovComponente Add PercPartilhaICMDestino numeric (5,2);
Alter Table MovComponente Add ValorPartilhaICMOrigem numeric (11,2);
Alter Table MovComponente Add ValorPartilhaICMDestino numeric (11,2);
Alter Table MovComponente Add CEST varchar(7);

Alter Table TempPrce050Componentes Add AliqFCP numeric(5,2);
Alter Table TempPrce050Componentes Add ValorFCP numeric (11,2);
Alter Table TempPrce050Componentes Add AliqICMDestino numeric(5,2);
Alter Table TempPrce050Componentes Add PercPartilhaICMOrigem numeric (5,2);
Alter Table TempPrce050Componentes Add PercPartilhaICMDestino numeric (5,2);
Alter Table TempPrce050Componentes Add ValorPartilhaICMOrigem numeric (11,2);
Alter Table TempPrce050Componentes Add ValorPartilhaICMDestino numeric (11,2);
Alter Table TempPrce050Componentes Add CEST varchar(7);

Alter Table NotasFiscais Add ValorFCP numeric (11,2);
Alter Table NotasFiscais Add ValorPartilhaICMOrigem numeric (11,2);
Alter Table NotasFiscais Add ValorPartilhaICMDestino numeric (11,2);

Alter Table ClassFiscais Add CEST varchar(7);

Alter Table Estados Add AliqFCP numeric(5,2);

ALTER TRIGGER TRIGGERINCLUIEMPRESA INACTIVE;

Alter Table Empresas Add FlagCalcPartilhaICM smallint DEFAULT 1 NOT NULL;
Alter Table Empresas Add FlagAliqPartilhaICMAutomatica smallint DEFAULT 0 NOT NULL;

ALTER TRIGGER TRIGGERINCLUIEMPRESA ACTIVE;

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),
    aliqfcp numeric(5,2),
    valorfcp numeric(11,2),
    aliqicmdestino numeric(5,2),
    percpartilhaicmorigem numeric(5,2),
    percpartilhaicmdestino numeric(5,2),
    valorpartilhaicmorigem numeric(11,2),
    valorpartilhaicmdestino numeric(11,2),
    cest varchar(7))    
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);
declare variable tipoindicadorie smallint;
declare variable anopartilha integer;
declare variable valoricmdestino numeric(11,2);
declare variable valoricmdiferencial numeric(11,2);
declare variable tipoprodespecifico integer;
declare variable codprodutoanp integer;
declare variable flagcalcicmsinterestadualanp smallint;
declare variable flagcalcpartilhaicm smallint;
declare variable flagaliqpartilhaicmautomatica smallint;
declare variable flagcalcpartilhaicmempresa smallint;
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,
  FlagCalcPartilhaICM,
  FlagAliqPartilhaICMAutomatica
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :AEmpMestre, :EmpID, :FlagCalcPartilhaICMEmpresa, :FlagAliqPartilhaICMAutomatica;

--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;
SELECT
  TipoPessoa,
  Cidades.CodEstado,
  Cidades.CodEstado,
  TipoIndicadorIE
FROM
  Entidades
  LEFT JOIN Cidades ON Cidades.Codigo = Entidades.CodCidade
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EntTipoPessoa,
  :CidCodEstado,
  :CodEstadoLeitura,
  :TipoIndicadorIE;

 Existe = NULL;

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

IF (rs_invl(Existe,0) = 1) THEN
  CodEstadoLeitura = CidEmpCodEstado;
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;
  IF (RegiaoDestinoLeitura IS NULL) THEN
     RegiaoDestinoLeitura = RegiaoDestino;
END
ELSE
   RegiaoDestinoLeitura = RegiaoDestino;

SELECT
  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,
  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,
    Case When :FlagEntrada = 0 and Oper.TipoMovimento <> 1 then EstSai.AliqFCP
         When :FlagEntrada = 1 and Oper.tipomovimento = 1 then EstSai.AliqFCP
         Else EstEnt.AliqFCP 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
  LEFT JOIN Operacoes Oper ON Oper.Codigo = :CodOperacao
WHERE
  Entidades.Codigo = :CodEntidade
INTO
  :EstAliqContrib,
  :EstFlagConvSub,
  :EstAliqInterna,
  :AliqFCP;

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

ClaFlagSubTributaria = 1;
IF (ltrim(CodClassFiscal) <> '') THEN
BEGIN
  SELECT
    FlagSubTributaria,
    0
  FROM
    ClassFiscais
  WHERE
    Codigo=:CodClassFiscal
  INTO
    :ClaFlagSubTributaria,
    :ClaMVABaseEntrada;

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


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;
IF (OprFlagDefaultLancamentoOutras = 1) THEN
  OprFlagDefaultLancamentoOutras = 0;
IF (OprFlagSubTribIPI IS NULL) THEN
   OprFlagSubTribIPI = 0;
IF (OprTipoSubTributaria IS NULL) THEN
   OprTipoSubTributaria = 0;
IF (OprTipoMovimento IS NULL) THEN
   OprTipoMovimento = 0;
IF (OprTipoSubTributariaCarga IS NULL) THEN
   OprTipoSubTributaria = 0;
if (OprFlagIPISobrePisCofins is null) then
   OprFlagIPISobrePisCofins = 0;
if (OprFlagIPISobreBaseIcm is null) then
   OprFlagIPISobreBaseIcm = 0;

GruFlagSubTributaria = 1;
Select Gru.FlagSubTributaria,
       Pro.Origem,
       Pro.TipoProdEspecifico,
       Pro.CodProdutoANP
  From Produtos Pro 
  Left Join Grupos Gru on Gru.Codigo = Pro.CodGrupo
 Where Pro.Codigo = :CodProduto
  into :GruFlagSubTributaria, :ProOrigem, :TipoProdEspecifico, :CodProdutoANP;

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 IF (TipoProdEspecifico IS NULL) THEN
   TipoProdEspecifico = 0;
 IF (CodProdutoANP IS NULL) THEN
   CodProdutoANP = 0;
 if (TipoProdEspecifico <> 4) then
    FlagCalcICMSInterestadualANP = 1;
 else
 begin
    if (CodProdutoANP in (820101001,820101010, 810102001, 810102004, 810102002,
                          810102003, 810101002, 810101001, 810101003, 220101003,
                          220101004, 220101002, 220101001, 220101005, 220101006)) then
      FlagCalcICMSInterestadualANP = 1;
    else if (CodProdutoANP <= 0) then
      FlagCalcICMSInterestadualANP = 1;
    else                       
      FlagCalcICMSInterestadualANP = 0;
 end
 
--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
  0

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

Existe = NULL;

SELECT FIRST 1
  TipoCFOP
FROM
  Tributacoes
WHERE
  EstadoOrigem      = :CidEmpCodEstado
  AND Codigo        = :CodTributacao
  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
     AND RegiaoDestino=:RegiaoOrigem
     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;

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 ((CidCodEstado <> 'EX') and
     (CidEmpCodEstado <> CidCodEstado) and
     (EntTipoPessoa in('F','C','N')) and
     (TipoIndicadorIE = 9) and
     (FlagEntrada = 0) and
     (FlagCalcICMSInterestadualANP = 1) and
     (FlagCalcPartilhaICMEmpresa = 1) and
     (CodProduto <> 8888888)) THEN
    FlagCalcPartilhaICM = 1;
 else
    FlagCalcPartilhaICM = 0;
    
IF ((FlagCalcPartilhaICM = 0) AND
    (EntTipoPessoa = 'F') OR
    (EntTipoPessoa = 'N')) THEN
  AliqIcm = TriAliqICM;
ELSE
BEGIN
  IF (TriFlagPrevalecerAliqIcm = 1) then
    AliqICM = TriAliqICM;
  ELSE
  BEGIN
    IF (TriAliqICM < EstAliqContrib) THEN
      AliqICM = TriAliqICM;
    ELSE
      AliqICM = EstAliqContrib;
  END
END

 if ((FlagCalcPartilhaICM = 1) and (FlagAliqPartilhaICMAutomatica = 1)) THEN
 begin
    if (ProOrigem in (1, 2, 3, 8)) THEN
       AliqICM = 4.00;
    else if (((CidEmpCodEstado = 'PR') or
             (CidEmpCodEstado = 'SC') or
             (CidEmpCodEstado = 'RS') or
             (CidEmpCodEstado = 'MG') or
             (CidEmpCodEstado = 'RJ') or
             (CidEmpCodEstado = 'SP')) and
            ((CidCodEstado <> 'PR') and
             (CidCodEstado <> 'SC') and
             (CidCodEstado <> 'RS') and
             (CidCodEstado <> 'MG') and
             (CidCodEstado <> 'RJ') and
             (CidCodEstado <> 'SP'))) THEN
        AliqICM = 7.00;
    else
        AliqICM = 12.00;
 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;

IF (AliqICMFixo <> 0) THEN
BEGIN
  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

if ((ClaMVABaseEntrada <> 0) and
   (((FlagEntrada = 1) and (OprTipoMovimento <> 1)) or ((FlagEntrada = 0) and (OprTipoMovimento = 1)))) then
begin

  MVA = (1 - (AliqICM/100)) / (1 - (EstAliqInterna/100));
  MVA = MVA * (1 + (ClaMVABaseEntrada/100));
  MVA = (MVA - 1) * 100;
  MVA = RS_RoundDec (MVA,2);
end

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

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;

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

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;
ValorBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;
CalcBaseSubTribDestino = ValorTotal + AcrescimoBaseICM;

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

IF (OprTipoICM = 0 AND ClaFlagSubTributaria = 1 AND GruFlagSubTributaria = 1 AND MVA <> 0 AND
    OprTipoSubTributariaCarga = 0) THEN
BEGIN
  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

IF ((ParTipoRegimeTributario IN (1,2)) AND  --- Simples Nacional ou com excesso de sublimite receita bruta
    (FlagEntrada = 0 OR (FlagEntrada = 1 AND OprTipoMovimento = 1))  --Saida ou entrada por devolução
     and (FlagCalcPartilhaICM = 0)) THEN    
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        
     if (ValorIsentoICM <> 0 and ValorBaseICM <> 0) Then
       ValorOutrasICM = ValorBaseICM;
     else      
     begin    
       ValorOutrasICM = ValorBaseICM + ValorIsentoICM;
       ValorIsentoICM = 0;
     end      
  END
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        

 if (FlagCalcPartilhaICM = 1) THEN
 begin
    ValorFCP = Rs_RoundDec((ValorBaseIcm * AliqFCP) / 100, 2);
    AliqICMDestino = EstAliqInterna - AliqFCP;
    
    AnoPartilha = EXTRACT(YEAR from current_timestamp);
    if (AnoPartilha <= 2016) THEN
    begin
      PercPartilhaICMOrigem = 60.00;
      PercPartilhaICMDestino = 40.00;
    end
    else if (AnoPartilha = 2017) THEN
    begin
      PercPartilhaICMOrigem = 40.00;
      PercPartilhaICMDestino = 60.00;
    end
    else if (AnoPartilha = 2018) THEN
    begin
      PercPartilhaICMOrigem = 20.00;
      PercPartilhaICMDestino = 80.00;
    end    
    else if (AnoPartilha >= 2019) THEN
    begin
      PercPartilhaICMOrigem = 0.00;
      PercPartilhaICMDestino = 100.00;
    end        
    
    if (AliqICMDestino > 0) THEN
    begin
        ValorICMDestino = Rs_RoundDec((ValorBaseIcm * AliqICMDestino) / 100, 2);
        ValorICMDiferencial = ValorICMDestino - ValorICM;
        
        ValorPartilhaICMOrigem = Rs_RoundDec((ValorICMDiferencial * PercPartilhaICMOrigem) / 100, 2);
        ValorPartilhaICMDestino = Rs_RoundDec((ValorICMDiferencial * PercPartilhaICMDestino) / 100, 2);
    end
    
    CEST = '';
end
else
begin
   AliqFCP = 0;
   ValorFCP = 0;
   AliqICMDestino = 0;
   PercPartilhaICMOrigem = 0;
   PercPartilhaICMDestino = 0;
   ValorPartilhaICMOrigem = 0;
   ValorPartilhaICMDestino = 0;
   CEST = '';
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
    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
END
--Eder - Chamado 270320
IF ((TriPerRedMargem <> 0) AND (CodProduto <> 8888888)) THEN
BEGIN
  FatorRedCusto = FatorRedCusto - (TriPerRedMargem / 100);
END

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

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
   BEGIN
      --408846 IF (ValorBaseICM = ValorTotal + AcrescimoBaseICM) THEN
     IF (ValorBaseICM = ValorTotal) THEN
       if (FlagCalcPartilhaICM = 1) THEN
         FatorRedVenda = FatorRedVenda - ((CAST(AliqICMDestino AS NUMERIC(7,4)) + CAST(AliqFCP AS NUMERIC(7,4)))/ 100);
       else
         FatorRedVenda = FatorRedVenda - (CAST(AliqICM AS NUMERIC(7,4))/ 100);
     ELSE
       if (FlagCalcPartilhaICM = 1) THEN
         FatorRedVenda = FatorRedVenda -
                         Rs_RoundDec((((CAST(ValorICMDestino AS NUMERIC(11,4)) + CAST(ValorFCP AS NUMERIC(11,4))) * 100) 
                         / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);
       else
         FatorRedVenda = FatorRedVenda -
                         Rs_RoundDec(((CAST(ValorICM AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);
   END

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

  IF (AliqPISCOFINS > 0) THEN
  begin
     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);

  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

  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  

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

 IF (NumCFOP = '6405') THEN
  NumCFOP = '6404';

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


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
  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;
  FatorRedVenda = 1;
  AliqPISCOFINS = 0;
END
PerRedBaseSubTrib = RedBaseSubTrib;

  If ((ValorBaseICM > 0 or ValorOutrasICM > 0) and ValorIsentoICM > 0) Then
    PerReducaoICM = TriPerReducaoICM;
else
  PerReducaoICM = 0;

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    

IF ((CodProduto <> 8888888) AND (ValorIsentoICM > 0)) THEN
BEGIN
  IF ((OprTipoICM = 2) OR
      ((TriTipoValorNaoTributado = 1) AND (OprTipoICM = 0))) THEN
  BEGIN
    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 ; ^



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;
declare variable AliqFCP numeric(5,2);
declare variable ValorFCP numeric (11,2);
declare variable AliqICMDestino numeric(5,2);
declare variable PercPartilhaICMOrigem numeric (5,2);
declare variable PercPartilhaICMDestino numeric (5,2);
declare variable ValorPartilhaICMOrigem numeric (11,2);
declare variable ValorPartilhaICMDestino numeric (11,2);
declare variable CEST varchar(7);
declare variable SumValorFCP numeric(18,2);
declare variable AuxSumValorFCP numeric(18,2);
declare variable SumValorPartilhaICMOrigem numeric(18,2);
declare variable AuxSumValorPartilhaICMOrigem numeric(18,2);
declare variable SumValorPartilhaICMDestino numeric(18,2);
declare variable AuxSumValorPartilhaICMDestino numeric(18,2);
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
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
0
      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,
         AliqFCP,
         ValorFCP,
         AliqICMDestino,
         PercPartilhaICMOrigem,
         PercPartilhaICMDestino,
         ValorPartilhaICMOrigem,
         ValorPartilhaICMDestino,
         CEST
    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,
         :AliqFCP,
         :ValorFCP,
         :AliqICMDestino,
         :PercPartilhaICMOrigem,
         :PercPartilhaICMDestino,
         :ValorPartilhaICMOrigem,
         :ValorPartilhaICMDestino,
         :CEST;         

   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,
             AliqFCP = :AliqFCP,
             ValorFCP = :ValorFCP,
             AliqICMDestino = :AliqICMDestino,
             PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
             PercPartilhaICMDestino = :PercPartilhaICMDestino,
             ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
             ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
             CEST = :CEST,         
             --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,
                                       AliqFCP,
                                       ValorFCP,
                                       AliqICMDestino,
                                       PercPartilhaICMOrigem,
                                       PercPartilhaICMDestino,
                                       ValorPartilhaICMOrigem,
                                       ValorPartilhaICMDestino,
                                       CEST, 
                                       StatusTransacao)
                     Values (:Empresa, :AuxNumLancamento, :AuxPerReducaoICM, :NumCstICm, :NumCstIPI, :NumCstPisCofins, :NumCsosn, :NatReceitaPisCofins,
                             --Gabriella - 333391
                             :AuxValorBaseIPI,
                             :AuxValorIsentoIPI,
                             :AuxValorOutrasIPI,
                             --Renato - 360358
                             :AliqICMSST,
                             :PercMvaICMSST,
                             --Renato - 361650 
                             :AliqComplICM,
                             :AliqComplPIS,
                             :AliqComplCOFINS,
                             :AliqFCP,
                             :ValorFCP,
                             :AliqICMDestino,
                             :PercPartilhaICMOrigem,
                             :PercPartilhaICMDestino,
                             :ValorPartilhaICMOrigem,
                             :ValorPartilhaICMDestino,
                             :CEST,
                             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,
             AliqFCP = :AliqFCP,
             ValorFCP = :ValorFCP,
             AliqICMDestino = :AliqICMDestino,
             PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
             PercPartilhaICMDestino = :PercPartilhaICMDestino,
             ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
             ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
             CEST = :CEST,        
            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;
SumValorFCP = 0;
SumValorPartilhaICMOrigem = 0;
SumValorPartilhaICMDestino = 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 0 = 1
                    then Mov.ValorTotal Else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then MI.ValorFCP else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then MI.ValorPartilhaICMOrigem else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Mov.CodProduto <> 8888888 then MI.ValorPartilhaICMDestino 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)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorFCP else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorPartilhaICMOrigem else 0 End) as numeric(15,2)),
           Cast(Sum(Case When Comp.CodProduto <> 8888888 then Comp.ValorPartilhaICMDestino else 0 End) as numeric(15,2))
      From MovComponente Comp
      Where Comp.Empresa = :Empresa
        and Comp.TipoControle = :TipoControle
        and Comp.CodControle = :CodControle
     Into :AuxSumValorProdutos, :AuxSumValorBaseICM, :AuxSumValorIPI,
          :AuxSumValorICM,  :AuxSumValorSubTrib, :AuxSumValorBaseSubTrib,
--MARCELO - CHAMADO 195051
          :AuxSumValorSubTribCarga, :AuxSumValorBaseSubTribCarga, :AuxSumValorServicos,
          :AuxSumValorBaseISS, :AuxSumValorProdutosSemImpostos,
          --Gabriella - 392386
          :auxsumvaloritenssomenteimposto,
          :AuxSumValorFCP,
          :AuxSumValorPartilhaICMOrigem,
          :AuxSumValorPartilhaICMDestino          
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;
    If (not (AuxSumValorFCP is null)) THEN
        SumValorFCP = SumValorFCP + AuxSumValorFCP;
     
     If (not (AuxSumValorPartilhaICMOrigem is null)) THEN
        SumValorPartilhaICMOrigem = SumValorPartilhaICMOrigem + AuxSumValorPartilhaICMOrigem;
     
     If (not (AuxSumValorPartilhaICMDestino is null)) THEN
        SumValorPartilhaICMDestino = SumValorPartilhaICMDestino + AuxSumValorPartilhaICMDestino;        
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
  
       ValorFCP = rs_dnvl(:SumValorFCP,0),
       ValorPartilhaICMOrigem = rs_dnvl(:SumValorPartilhaICMOrigem,0),
       ValorPartilhaICMDestino = rs_dnvl(:SumValorPartilhaICMDestino,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 ; ^

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))

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;
declare variable codenqipi integer;
declare variable AliqFCP numeric(5,2);
declare variable ValorFCP numeric (11,2);
declare variable AliqICMDestino numeric(5,2);
declare variable PercPartilhaICMOrigem numeric (5,2);
declare variable PercPartilhaICMDestino numeric (5,2);
declare variable ValorPartilhaICMOrigem numeric (11,2);
declare variable ValorPartilhaICMDestino numeric (11,2);
declare variable CEST varchar(7);
















begin
  /************
   VERSAO 3.00
  *************/










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

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

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

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

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

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

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

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

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

--306221 end


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

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


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



     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,
           AliqFCP,
           ValorFCP,
           AliqICMDestino,
           PercPartilhaICMOrigem,
           PercPartilhaICMDestino,
           ValorPartilhaICMOrigem,
           ValorPartilhaICMDestino,
           CEST


















         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,
              :AliqFCP,
              :ValorFCP,
              :AliqICMDestino,
              :PercPartilhaICMOrigem,
              :PercPartilhaICMDestino,
              :ValorPartilhaICMOrigem,
              :ValorPartilhaICMDestino,
              :CEST;




















        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,
                 AliqFCP = :AliqFCP,
                 ValorFCP = :ValorFCP,
                 AliqICMDestino = :AliqICMDestino,
                 PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
                 PercPartilhaICMDestino = :PercPartilhaICMDestino,
                 ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
                 ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
                 CEST = :CEST















           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,
                 AliqFCP = :AliqFCP,
                 ValorFCP = :ValorFCP,
                 AliqICMDestino = :AliqICMDestino,
                 PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
                 PercPartilhaICMDestino = :PercPartilhaICMDestino,
                 ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
                 ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
                 CEST = :CEST












           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_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;
declare variable codenqipi integer;
declare variable AliqFCP numeric(5,2);
declare variable ValorFCP numeric (11,2);
declare variable AliqICMDestino numeric(5,2);
declare variable PercPartilhaICMOrigem numeric (5,2);
declare variable PercPartilhaICMDestino numeric (5,2);
declare variable ValorPartilhaICMOrigem numeric (11,2);
declare variable ValorPartilhaICMDestino numeric (11,2);
declare variable CEST varchar(7);
















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
          0



     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,
           AliqFCP,
           ValorFCP,
           AliqICMDestino,
           PercPartilhaICMOrigem,
           PercPartilhaICMDestino,
           ValorPartilhaICMOrigem,
           ValorPartilhaICMDestino,
           CEST


















         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,
              :AliqFCP,
              :ValorFCP,
              :AliqICMDestino,
              :PercPartilhaICMOrigem,
              :PercPartilhaICMDestino,
              :ValorPartilhaICMOrigem,
              :ValorPartilhaICMDestino,
              :CEST;




















        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,
                 AliqFCP = :AliqFCP,
                 ValorFCP = :ValorFCP,
                 AliqICMDestino = :AliqICMDestino,
                 PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
                 PercPartilhaICMDestino = :PercPartilhaICMDestino,
                 ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
                 ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
                 CEST = :CEST















           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,
                 AliqFCP = :AliqFCP,
                 ValorFCP = :ValorFCP,
                 AliqICMDestino = :AliqICMDestino,
                 PercPartilhaICMOrigem = :PercPartilhaICMOrigem,
                 PercPartilhaICMDestino = :PercPartilhaICMDestino,
                 ValorPartilhaICMOrigem = :ValorPartilhaICMOrigem,
                 ValorPartilhaICMDestino = :ValorPartilhaICMDestino,
                 CEST = :CEST












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

ALTER TABLE EMPRESAS
ADD TIPOCONTRIBUINTEIPI SMALLINT
DEFAULT 0 
NOT NULL ;

