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

SET TERM ^ ;

ALTER PROCEDURE CALCULAR_ICM (
    empresa integer,
    codproduto integer,
    codtributacao char(5),
    codentidade char(7),
    codoperacao integer,
    valortotal numeric(11,2),
    acrescimobaseicm numeric(11,2),
    acrescimobasesubtrib numeric(11,2),
    redbasesubtrib numeric(5,2),
    aliqipi numeric(4,2),
    codclassfiscal varchar(15),
    flagentrada integer,
    acrescimoredvenda numeric(11,2),
    codlistapreco integer,
    aliqicmfixo numeric(4,2),
    codsubtributaria integer,
    perreddespesa numeric(15,8),
    acrescimobaseipi numeric(11,2))
returns (
    aliqicm numeric(4,2),
    valorbaseicm numeric(11,2),
    valoricm numeric(11,2),
    valorisentoicm numeric(11,2),
    valoroutrasicm numeric(11,2),
    perreducaoicm numeric(5,2),
    valorbasesubtrib numeric(11,2),
    valorsubtrib numeric(11,2),
    valorbasesubtribcarga numeric(11,2),
    valorsubtribcarga numeric(11,2),
    perredbasesubtrib numeric(5,2),
    fatorredcusto numeric(15,8),
    fatorredvenda numeric(7,4),
    numcfop char(10),
    aliqpiscofins numeric(4,2),
    valorbasepiscofins numeric(11,2),
    aliqpis numeric(4,2),
    aliqcofins numeric(4,2),
    numcsticm varchar(3),
    numcstipi varchar(3),
    numcstpiscofins varchar(3),
    numcsosn varchar(3),
    natreceitapiscofins integer,
    natbasecalccredito smallint,
    indnaturezafrete smallint,
    valorbaseipi numeric(11,2),
    valorisentoipi numeric(11,2),
    valoroutrasipi numeric(11,2),
    aliqicmsst numeric(5,2),
    percmvaicmsst numeric(5,2),
    aliqcomplicm numeric(5,2),
    aliqcomplpis numeric(5,2),
    aliqcomplcofins numeric(5,2))
as
declare variable codestadoleitura char(2);
declare variable aempmestre char(7);
declare variable vauxvaloripi decimal(11,2);
declare variable auxcodtributacaosubtrib char(5);
declare variable auxflagsubtributaria integer;
declare variable auxentidade char(7);
declare variable valorbasesubtribdestino numeric(11,2);
declare variable calcbasesubtrib numeric(11,2);
declare variable calcvalorsubtrib numeric(11,2);
declare variable calcbasesubtribdestino numeric(11,2);
declare variable partiporeducaoicm smallint;
declare variable paraliqcpmf numeric(4,2);
declare variable paraliqicmsimples numeric(4,2);
declare variable partiporegimetributario smallint;
declare variable enttipopessoa char(1);
declare variable cidcodestado char(2);
declare variable estaliqcontrib decimal(4,2);
declare variable estflagconvsub smallint;
declare variable estaliqinterna decimal(4,2);
declare variable cidempcodestado char(2);
declare variable trialiqicm decimal(4,2);
declare variable triflagisentoprodutor smallint;
declare variable triflagsubtributaria smallint;
declare variable trimargemlucrosubst numeric(5,2);
declare variable triperreducaoicm numeric(6,4);
declare variable triperredmargem decimal(4,2);
declare variable tritipocfop smallint;
declare variable tricodtributacaosubtrib char(5);
declare variable tritipovalornaotributado smallint;
declare variable triperreducaosubtrib numeric(6,2);
declare variable trialiqinternasubtrib numeric(5,2);
declare variable trinumcst_icm smallint;
declare variable trinumcst_ipi smallint;
declare variable trinumcsosn smallint;
declare variable claflagsubtributaria smallint;
declare variable claaliqpiscofins numeric(4,2);
declare variable gruflagsubtributaria smallint;
declare variable oprtipoicm smallint;
declare variable oprtipoipi smallint;
declare variable opraliqicmfixo decimal(4,2);
declare variable oprperredicm decimal(4,2);
declare variable oprperredmargem decimal(4,2);
declare variable oprcfop1_normal char(10);
declare variable oprcfop1_normal_ncfora char(10);
declare variable oprcfop2_industrializado char(10);
declare variable oprcfop2_industrializado_ncfora char(10);
declare variable oprcfop3_subrevenda char(10);
declare variable oprcfop3_subrevenda_nc char(10);
declare variable oprcfop4_subrevendaml char(10);
declare variable oprcfop4_subrevendaml_nc char(10);
declare variable oprcfop5_subfabricacao char(10);
declare variable oprcfop5_subfabricacao_nc char(10);
declare variable oprcfop6_subfabricacaoml char(10);
declare variable oprcfop6_subfabricacaoml_nc char(10);
declare variable oprcfop7_importado char(10);
declare variable oprcfop_servico char(10);
declare variable oprcfop_servico_ncfora char(10);
declare variable oprcfop9_petroleo varchar(10);
declare variable oprcfop9_petroleo_nc varchar(10);
declare variable oprflagcalcpis_cofins smallint;
declare variable oprflagdefaultlancamentooutras integer;
declare variable oprflagsubtribipi integer;
declare variable oprtipomovimento integer;
declare variable oprtiposubtributaria integer;
declare variable oprtiposubtributariacarga integer;
declare variable oprflagipisobrepiscofins smallint;
declare variable lispercacrescimoadm1 numeric(4,2);
declare variable lispercacrescimoadm2 numeric(4,2);
declare variable lispercacrescimoadm3 numeric(4,2);
declare variable proorigem smallint;
declare variable subaliquotainterna numeric(5,2);
declare variable submargemlucro numeric(5,2);
declare variable subpercreducao numeric(5,2);
declare variable subindicereducao numeric(9,6);
declare variable subflagabatericm smallint;
declare variable subflagsomaipi smallint;
declare variable existe integer;
declare variable regiaodestino varchar(10);
declare variable regiaodestinoleitura varchar(10);
declare variable regiaoorigem varchar(10);
declare variable 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;
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))
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :AEmpMestre;

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

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

-- Renato - 278440
SELECT FlagDeduzirDespNaoInclNaMargem,
--408846
  TipoMargemLiquida
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem,
     :TipoMargemLiquida;


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

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

 Existe = NULL;

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

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


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

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

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


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


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

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


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


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

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

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 
--Leitura da Lista de Preço
SELECT
  Ilp.PercAcrescimoAdm1, Ilp.PercAcrescimoAdm2, Ilp.PercAcrescimoAdm3,
  --Renato - 290579
  Ilp.PercSubTrib, Ilp.PercICMCusto,
  --408846
  Ilp.PercDesconto1,
  Ilp.PercDesconto2,
  Ilp.PercDesconto3,
  Ilp.PercDesconto4,
  Ilp.PercDesconto5,
  Ilp.PercAcrescimoInc1,
  Ilp.PercAcrescimoInc2,
  Ilp.PercAcrescimoInc3,
  Ilp.ValorCustoBruto,
  Ilp.ValorCustoLiquido
FROM ItemlistaPreco Ilp
  LEFT JOIN Empresas Emp ON Emp.Codigo = :Empresa
WHERE Ilp.CodLista=:CodListaPreco
  AND Ilp.CodProduto=:CodProduto
  AND Ilp.Empresa = Emp.EmpresaListaPreco
INTO :LisPercAcrescimoAdm1, :LisPercAcrescimoAdm2, :LisPercAcrescimoAdm3,
      --Renato - 290579
      :PercSubTribCusto, :PercICMCusto,
  --408846
  :LisPercDesconto1,
  :LisPercDesconto2,
  :LisPercDesconto3,
  :LisPercDesconto4,
  :LisPercDesconto5,
  :LisPercAcrescimo1,
  :LisPercAcrescimo2,
  :LisPercAcrescimo3,
  :LisValorCustoBruto,
  :LisValorCustoLiquido;


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


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

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

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

Existe = NULL;

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

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

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

Existe = NULL;

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

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

  CodTributacao = TriCodTributacaoSubTrib;
END

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

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

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

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

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


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


Existe = NULL;

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

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

  ORDER BY
    TipoPessoa
  INTO
    :EstAliqInterna,
    :RedBaseSubTrib;
END

IF (RedBaseSubTrib IS NULL) THEN
  RedBaseSubTrib = 0;

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

Existe = NULL;

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

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

   ORDER BY TipoPessoa
   INTO :EstAliqInterna , :RedBaseSubTrib;
END

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

--Ronaldo Chamado 372149
/*--364660
-- quando informada 999.99, tem que zerar para não calcular
--if (RedBaseSubTrib = 999.99) then
--  RedBaseSubTrib = 0;*/
                              

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

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

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

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

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



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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

--Ronaldo Chamado 383605
if (OprPerRedICM <> 99.99) then
begin
  IF (TriPerReducaoICM <> 0 AND ValorBaseIcm <> 0) THEN
  BEGIN
    ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * TriPerReducaoICM) / 100);
    ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * TriPerReducaoICM) / 100);
    CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * TriPerReducaoICM) / 100);
  END

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

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

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

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

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

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

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

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

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

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

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


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


IF ((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (MVA <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    --Eder - 383214 - Quando ha redução na base, considerar apenas a parte tributada para outras (St)
    --ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    --ValorIsentoICM = 0;
     if (ValorIsentoICM <> 0 and ValorBaseICM <> 0) Then
       ValorOutrasICM = ValorBaseICM;
     else      
     begin    
       ValorOutrasICM = ValorBaseICM + ValorIsentoICM;
       ValorIsentoICM = 0;
     end      
  END
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = MVA;


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

SUSPEND;

END
^

SET TERM ; ^



SET TERM ^ ;

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


  MensagemErro = '';

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

  ContadorNota = 0;

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

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

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

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

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

      ExisteDuplicata = null;

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

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

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

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

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

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

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

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

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

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




    insert into NotasFiscais (
           Empresa, TipoControle, CodControle,
           DataMovimento, DataDocumento, Especie, NumDocumento, Serie,
           CodEntidade, EmpresaOS, CodOS, CodOperacao, CodVendInterno,
           CodVendExterno, CodVendParceiro, CodCondPagto, CodTransp, CodTranspRedespacho, TipoFrete,
           CodPedido, CodUsuarioInc, CodUsuarioFat,
           StatusImpNota,
           StatusImpCupom,
           FlagCancelada, FlagDuplicataGerada, FlagAtualizaPreco, PrazoMedio,
           AliqISS,
           CodDepartamento, CodBanco, StatusTransacao, NumEquipamentoCF,
--253322
           StatusNFe,
--356099
           FlagEmissaoPropria,CodcidadeServicoRealizado)
    select :Empresa, :TipoControle, :CodControle,
--MARCELO - CHAMADO 158510/199271
--           :DataMovimento, :DataMovimento, :Especie, :NumDocumento, :SerieControle,
           :DataMovimento, :DataMovimento, :Especie, :NumDocumento, :SerieControleCursor,
--           P.CodEntidade, :EmpresaAntOS, :CodOS, :CodOperacao, :CodVendInterno,
           --341745
           --P.CodEntidade, :EmpresaAntOS, :CodOS, :CodOperacaoCursor, :CodVendInterno,
           :entidadenotafiscal, :EmpresaAntOS, :CodOS, :CodOperacaoCursor, :CodVendInterno,
           --Ronaldo Chamado 346431
           --:CodVendExterno, P.CodVendParceiro, :CodCondPagto, :P.CodTransp,P.CodTranspRedespacho, P.TipoFrete,
           :CodVendExterno, P.CodVendParceiro, :CodCondPagto, :CodTransp,P.CodTranspRedespacho, P.TipoFrete,
           :CodPedido, :CodUsuario, :CodUsuario,

           --Ronaldo Chamado 408945
           --case when :FlagCupom = 0 then 0      /*--Somente Nota (imprimir nota)*/
           Case When :FlagCupom = 0 and :FlagNaoGerenciarNumDocumento = 0 then 0  --Somente Nota (imprimir nota)
                When :FlagCupom = 0 and :FlagNaoGerenciarNumDocumento = 1 then -2
                when :FlagCupom = 1 then -2     /*--Somente Cupom (nao imprimir Nota)*/
                when :FlagCupom = 2 then 0 end, /*--Nota e Cupom (imprimir nota)*/

           case when :FlagCupom = 0 then 1      /*--Somente Nota (nao imprimir cupom)*/
                when :FlagCupom = 1 then 0      /*--Somente Cupom (Imprimir cupom)*/
                when :FlagCupom = 2 then 0 end, /*--Nota e Cupom (Imprimir Cupom)*/
           0, 0, 1, :PrazoMedio,
           case when O.FlagCalcularISS <> 1 then 0
--MARCELO - CHAMADO 158510/199271
--                else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacao)) end,
--Ronaldo 367126  else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacaoCursor)) end,
                  else (select AliqISS from Calcular_ISS(:Empresa, P.CodEntidade, :CodOperacaoCursor,P.CodCidadeServicoRealizado)) end,
           :CodDepartamento, :CodBanco, 1, :NumSerieECF,
--253322
      Case When :FlagCupom = 1 then -1 else 0 end,
      --356099
      1,
      --Ronaldo Chamado 367126
      P.CodCidadeServicoRealizado
    from Pedidos P
--MARCELO - CHAMADO 158510/199271
--      left join Operacoes O on O.Codigo = :CodOperacao
      left join Operacoes O on O.Codigo = :CodOperacaoCursor
    where P.Empresa=:Empresa
      and P.CodPedido=:CodPedido;   /*--Primeiro Pedido da Lista*/
  end /*--Fim do loop*/

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

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

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

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

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

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

    Existe = null;

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

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

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

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

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


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

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

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

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

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

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

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

--Calculo de Comissao da Nota

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

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

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

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

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

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

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


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

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


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

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


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

      if (DiaVencimentoST is null) then
        DiaVencimentoST = 0;

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

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

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

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

        if (ValorDuplicataST is null) then
          ValorDuplicataST = 0;

        AuxValorTotal = :AuxValorTotal - :ValorDuplicataST;
      end

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

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


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

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

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


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

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

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

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

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

END^

SET TERM ; ^



SET TERM ^ ;



ALTER TRIGGER ALTERA_MOVDUPLICATA 
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Existe          integer;
declare variable NumMovimento1   integer;
declare variable CodConta1       integer; 
declare variable Valor1          float;
declare variable Observacao1     varchar(200);
declare variable TipoLancamento1 integer;
declare variable CodDepartamentoDup varchar(9);
declare variable FlagFinanceiroSemTrigger smallint; --JALDO - CHAMADO 296750
--Ronaldo Chamado 409235
declare variable RazaoSocialEntidade varchar(50);
begin
/*FB*/

  /********************
  -- VERSÃO 3.01
 ********************/

 --JALDO - CHAMADO 296750

select
  FlagFinanceiroSemTrigger
from
  ConfiguracaoSistema
into
 :FlagFinanceiroSemTrigger;

if (FlagFinanceiroSemTrigger is null) then
  FlagFinanceiroSemTrigger = 0;

--292366
Select CodDepartamento, E.RazaoSocial From Duplicatas
Left join Entidades E on E.Codigo = Duplicatas.CodEntidade
Where Duplicatas.empresa = new.EmpresaDuplicata
  and Duplicatas.TipoDuplicata = new.TipoDuplicata
  and Duplicatas.CodDuplicata  = new.CodDuplicata
Into :CodDepartamentoDup, :RazaoSocialEntidade;

if (CodDepartamentoDup is null) then
  coddepartamentodup = '';

--JALDO - CHAMADO 296750
if (FlagFinanceiroSemTrigger = 0) then
begin
-- altera o lancamento da duplicata
update movdespesa set
  valor = Abs(New.ValorRecebido - New.ValorJuros + New.ValorDesconto),
  DataMovimento     = New.DataMovimento,
  CodConta          = rs_invl(new.codconta ,0),
--292366  CodDepartamento   = rs_snvl(new.coddepartamento,''),
  CodDepartamento   = rs_snvl(new.coddepartamento, :CodDepartamentoDup),
  Statustransacao   = 1,
  CodDetalhe        = rs_invl(new.CodDetalhe,0), --Karina - 135887
  --Ronaldo Chamado 409235
  Observacao = Rs_Left('Dup nr.: ' || new.CodDuplicata || ' - ' || rs_snvl(:RazaoSocialEntidade, '') || rs_snvl(' - Obs.: '||new.Observacao,''),200)

where
  empresa = new.empresa
  and TipoMovimento = New.TipoMovimento
  and TipoRelacionamento = 2
  and NumSequencia = New.NumSequencia
  and NumOcorrencia = new.NumOcorrencia;

-- Grava movimento da despesa na inclusao do movimento de duplicata
Existe = 0;
Select
  1,
--190808  (select rs_invl(max(NumMovimento),0) + 1 from movDespesa where empresa = New.empresa),
  new.CodConta, New.ValorRecebido - New.ValorJuros + New.ValorDesconto,
  Rs_Left('Dup nr.: ' || New.CodDuplicata || ' - ' || rs_snvl(RazaoSocial, '')|| rs_snvl(' - Obs.: '||new.Observacao,''),200),
  case when New.TipoDuplicata = 1 Then 0 else 1 end
From
  Duplicatas
  left join Entidades E on E.Codigo = Duplicatas.CodEntidade
  left join OperacoesDup OD on OD.Codigo = New.CodOperacaoDup
where
  Empresa           = New.EmpresaDuplicata
  and TipoDuplicata = New.TipoDuplicata
  and CodDuplicata  = New.CodDuplicata
  and New.TipoMovimento = 3
  and new.codconta <> 0
  and new.ValorRecebido <> 0
  and OD.FlagLancamentos = 1
into
  :Existe, 
--190808  :NumMovimento1,
  :CodConta1, :Valor1,
  :Observacao1,
  :TipoLancamento1;

if (Existe = 1) then
begin
  Existe = 0;
  Select
    1
  From
    MovDespesa
  where
    empresa = New.Empresa
    and NumSequencia = New.NumSequencia
    and NumOcorrencia = New.NumOcorrencia
    and TipoMovimento = New.TipoMovimento
    and TipoRelacionamento = 2
  Into
    :Existe;

  If (Existe = 0) then
  Begin

    --Gabriella - 342382
    --190808
    --Select rs_invl(Max(NumMovimento),0) + 1
    --From MovDespesa
    --Where Empresa = New.Empresa
    --into :NumMovimento1;
    Select SequenciaGerada From ProximaSequencia('MOVDESPESA', New.Empresa, 1)
           Into :NumMovimento1;

    insert into MovDespesa (
      Empresa, NumMovimento,
      TipoDuplicata, CodDuplicata, TipoControle, CodControle,
      DataMovimento, CodConta, Valor,
      Observacao, TipoRelacionamento, TipoMovimento,
      NumSequencia, TipoLancamento, NumOcorrencia,
      CodDepartamento, StatusTransacao, CodDetalhe) -- Karina - 135887
    values (
      New.Empresa, :NumMovimento1,
      0, '', 0, 0,
      New.DataMovimento, :CodConta1, Abs(:Valor1),
      :Observacao1, 2, New.TipoMovimento,
      New.numsequencia,
      Case :Valor1
        When Abs(:Valor1) Then :TipoLancamento1
        Else (Case :TipoLancamento1 When 1 Then 0 Else 1 End)
      End,
      New.NumOcorrencia,
      New.CodDepartamento, 1, New.CodDetalhe); -- Karina - 135887
  end

end


-- altera o lancamento de juros
update movdespesa set
  valor = New.ValorJuros,
  DataMovimento = New.DataMovimento,
  CodConta =   (Select rs_dnvl((case New.TipoDuplicata when 1
                                                         Then (case New.codContajuros 
                                                                 when 0 Then OD.CodContaJurosPagar
                                                               else New.codContajuros end)
                                  else (case New.codContajuros when 0
                                             Then OD.CodContaJurosReceber
                                        else New.codContajuros end)
                                  end),0)
                    From OperacoesDup OD Where OD.codigo  = New.CodOperacaoDup),
  CodDepartamento = rs_snvl(New.CodDepartamento, ''),
  CodDetalhe      = rs_invl(New.CodDetalhe, 0), -- Karina - 135887
  StatusTransacao = 1
Where
  empresa = New.empresa
  and TipoMovimento = New.TipoMovimento
  and TipoRelacionamento = 3
  and NumSequencia = New.NumSequencia
  and NumOcorrencia = new.NumOcorrencia
  and 1 = (Select FlagLancamentos From OperacoesDup OD Where OD.codigo = New.CodOperacaoDup);

Existe = 0;
Select
  1
From
  MovDespesa
where
  empresa = New.empresa
  and NumSequencia = New.NumSequencia
  and NumOcorrencia = New.NumOcorrencia
  and TipoMovimento = New.TipoMovimento
  and TipoRelacionamento = 3
Into
  :Existe;

if (Existe = 0) then
begin
-- Inclusao do mov de despesa de Juros pagos e recebidos
  Existe = 0;
  Select
    1,
--190808    (select rs_invl(max(NumMovimento),0) + 1 from movDespesa where empresa = New.empresa),
--    case when New.TipoDuplicata = 1 then OD.jurospagar else OD.jurosreceber end,
-- Alterado na versao 1.48
    case New.TipoDuplicata when 1
                           Then (case New.codContajuros when 0
                                                          Then OD.CodContaJurosPagar
                                 else New.codContajuros end)
    else (case New.codContajuros when 0
                                   Then OD.CodContaJurosReceber
          else New.codContajuros end)
    end,
-- Alterado na versao 1.48
    case when New.TipoDuplicata = 1 then 'Juros pagos Dup. nr. ' || New.CodDuplicata else 'Juros Recebidos Dup. nr. ' || New.CodDuplicata  end,
    case when New.TipoDuplicata = 1 Then 0 else 1 end
  From
    OperacoesDup OD
  where
    OD.Codigo  = new.CodOperacaoDup
    and (New.TipoMovimento = 3 or New.TipoMovimento = 2)
    and ((New.CodContaJuros <> 0) or (New.TipoDuplicata = 1 and OD.CodContaJurosPagar <> 0) or
         (New.TipoDuplicata = 2 and OD.CodContaJurosReceber <> 0))
    and new.ValorJuros > 0
    and OD.FlagLancamentos = 1 
  into
    :Existe,
--190808    :NumMovimento1,
    :CodConta1,
    :Observacao1,
    :TipoLancamento1;

  if (Existe = 1) then
  begin
    --Gabriella - 342382
    --190808
    --Select rs_invl(Max(NumMovimento),0) + 1
    --From MovDespesa
    --Where Empresa = New.Empresa
    --into :NumMovimento1;
    Select SequenciaGerada From ProximaSequencia('MOVDESPESA', New.Empresa, 1)
           Into :NumMovimento1;

    insert into MovDespesa (
      Empresa, NumMovimento,
      TipoDuplicata, CodDuplicata, TipoControle, CodControle,
      DataMovimento, CodConta, Valor,
      Observacao, TipoRelacionamento, TipoMovimento,
      NumSequencia, TipoLancamento, NumOcorrencia,
      CodDepartamento, StatusTransacao, CodDetalhe) -- Karina - 135887
    values (
      New.Empresa, :NumMovimento1,
      0, '', 0, 0,
      New.DataMovimento, :CodConta1, New.ValorJuros,
      :Observacao1, 3, New.TipoMovimento,
      New.NumSequencia, :TipoLancamento1, New.NumOcorrencia,
      New.CodDepartamento, 1, New.CodDetalhe); -- Karina - 135887
  end
end


-- altera o lancamento de desconto
update
  movdespesa
set
  valor           = New.ValorDesconto,
  DataMovimento   = New.DataMovimento,
--  CodDespesa      = (Select rs_dnvl((case when New.TipoDuplicata = 1 Then OD.DescontoPagar else OD.DescontoReceber end),0) From operacoesdup OD where OD.Codigo = New.CodOperacaoDup),
-- Alterado na versao 1.48
  CodConta =  (Select rs_dnvl((case New.TipoDuplicata when 1
                                                         Then (case New.codContadesconto when 0
                                                                                           Then OD.CodContadescontopagar
                                                               else New.codContadesconto end)
                                  else (case New.codContadesconto when 0
                                             Then OD.CodContadescontoreceber
                                        else New.codContadesconto end)
                                  end),0)
                    From OperacoesDup OD Where OD.codigo  = New.CodOperacaoDup),
-- Alterado na versao 1.48
  CodDepartamento = rs_snvl(New.CodDepartamento, ''),
  CodDetalhe = rs_invl(New.CodDetalhe, 0), -- Karina - 135887
  StatusTransacao = 1
where
  empresa                = New.empresa
  and TipoMovimento      = New.TipoMovimento
  and TipoRelacionamento = 4
  and NumSequencia       = New.NumSequencia
  and NumOcorrencia      = New.NumOcorrencia
  and 1 = (Select FlagLancamentos From OperacoesDup OD Where OD.codigo = New.CodOperacaoDup);

Existe = 0;
Select
  count(NumMovimento)
From
  MovDespesa
where
  empresa = New.empresa
  and NumSequencia = New.NumSequencia
  and NumOcorrencia = New.NumOcorrencia
  and TipoMovimento = New.TipoMovimento
  and TipoRelacionamento = 4
Into
  :Existe;

if (Existe = 0) then
begin
-- Inclusao do mov de despesa de descontos pagos e recebidos
  Existe = 0;
  Select
    1,
    --190808 (select rs_invl(max(NumMovimento),0) + 1 from movDespesa where empresa = New.empresa),
--    case when New.TipoDuplicata = 1 then OD.descontopagar else OD.descontoreceber end,
-- Alterado na versao 1.48
     case New.TipoDuplicata when 1
                            Then (case New.codContadesconto when 0
                                                              Then OD.CodContadescontopagar
                                  else New.codContadesconto end)
     else (case New.codContadesconto when 0
                                       Then OD.CodContadescontoreceber
           else New.codContadesconto end)
     end,
-- Alterado na versao 1.48
    'Desconto Dup. nr. ' || New.CodDuplicata,
    case when New.TipoDuplicata = 1 Then 1 else 0 end
  From
    OperacoesDup OD
  where
    OD.Codigo  = New.CodOperacaoDup and
    (New.TipoMovimento = 3 or New.TipoMovimento = 2)
    and ((New.CodContaDesconto <> 0) or (New.TipoDuplicata = 1 and OD.CodContadescontoPagar <> 0) or 
         (New.TipoDuplicata = 2 and OD.CodContadescontoReceber <> 0))
    and New.ValorDesconto > 0
    and OD.FlagLancamentos = 1
  Into
    :Existe,
--190808    :NumMovimento1,
    :CodConta1, 
    :Observacao1,
    :TipoLancamento1;

  if (Existe = 1) then
  begin
    --Gabriella - 342382
    --190808
    --Select rs_invl(Max(NumMovimento),0) + 1
    --From MovDespesa
    --Where Empresa = New.Empresa
    --into :NumMovimento1;
    Select SequenciaGerada From ProximaSequencia('MOVDESPESA', New.Empresa, 1)
           Into :NumMovimento1;

    insert into MovDespesa (
      Empresa, NumMovimento,
      TipoDuplicata, CodDuplicata, TipoControle, CodControle,
      DataMovimento, CodConta, Valor,
      Observacao, TipoRelacionamento, TipoMovimento,
      NumSequencia, TipoLancamento, NumOcorrencia,
      CodDepartamento, StatusTransacao, CodDetalhe) -- Karina - 135887
    values (
      New.Empresa, :NumMovimento1,
      0, '', 0, 0,
      New.DataMovimento, :CodConta1, New.valordesconto,
      :Observacao1, 4, New.TipoMovimento,
      New.NumSequencia, :TipoLancamento1, New.NumOcorrencia,
      New.coddepartamento, 1, New.CodDetalhe); -- Karina - 135887
  end
end


-- altera o lancamento de valor adicional
update movdespesa set
  valor           = New.ValorDesconto,
  DataMovimento   = New.DataMovimento,
  CodConta =  (Select rs_dnvl((case New.TipoDuplicata when 1                                                          
                                 Then OD.CodContaAdicionalpagar
                                 Else OD.CodContaAdicionalreceber
                               end),0)
               From OperacoesDup OD Where OD.codigo  = New.CodOperacaoDup),
  CodDepartamento = rs_snvl(New.CodDepartamento, ''),
  CodDetalhe      = rs_invl(New.CodDetalhe,0), -- Karina - 135887
  StatusTransacao = 1
where
  empresa                = New.empresa
  and TipoMovimento      = New.TipoMovimento
  and TipoRelacionamento = 5
  and NumSequencia       = New.NumSequencia
  and NumOcorrencia      = New.NumOcorrencia
  and 1 = rs_invl((Select FlagLancamentos From OperacoesDup OD Where OD.codigo = New.CodOperacaoDup),0);

Existe = 0;
Select
  count(NumMovimento)
From
  MovDespesa
where
  empresa = New.empresa
  and NumSequencia = New.NumSequencia
  and NumOcorrencia = New.NumOcorrencia
  and TipoMovimento = New.TipoMovimento
  and TipoRelacionamento = 5
Into
  :Existe;

if (Existe = 0) then
begin
-- Inclusao do mov de despesa de descontos pagos e recebidos
  Existe = 0;
  Select
    1,
--190808    (select rs_invl(max(NumMovimento),0) + 1 from movDespesa where empresa = New.empresa),
     case New.TipoDuplicata when 1
       Then OD.CodContaAdicionalpagar
       Else OD.CodContaAdicionalreceber
     end,
    'Vl. Adicional Dup. nr. ' || New.CodDuplicata,
    case when New.TipoDuplicata = 1 Then 0 else 1 end
  From
    OperacoesDup OD
  where
    OD.Codigo  = New.CodOperacaoDup and
    (New.TipoMovimento = 2) and 
    ((New.TipoDuplicata = 1 and OD.CodContaAdicionalPagar <> 0) or 
     (New.TipoDuplicata = 2 and OD.CodContaAdicionalReceber <> 0))
    and New.ValorAdicional > 0
    and OD.FlagLancamentos = 1
  Into
    :Existe,
--190808    :NumMovimento1,
    :CodConta1, 
    :Observacao1,
    :TipoLancamento1;

  if (Existe = 1) then
  begin
    --Gabriella - 342382
    --190808
    --Select rs_invl(Max(NumMovimento),0) + 1
    --From MovDespesa
    --Where Empresa = New.Empresa
    --into :NumMovimento1;
    Select SequenciaGerada From ProximaSequencia('MOVDESPESA', New.Empresa, 1)
           Into :NumMovimento1;

    insert into MovDespesa (
      Empresa, NumMovimento,
      TipoDuplicata, CodDuplicata, TipoControle, CodControle,
      DataMovimento, CodConta, Valor,
      Observacao, TipoRelacionamento, TipoMovimento,
      NumSequencia, TipoLancamento, NumOcorrencia,
      CodDepartamento, StatusTransacao, CodDetalhe) -- Karina - 135887
    values (
      New.Empresa, :NumMovimento1,
      0, '', 0, 0,
      New.DataMovimento, :CodConta1, New.valordesconto,
      :Observacao1, 5, New.TipoMovimento,
      New.NumSequencia, :TipoLancamento1, New.NumOcorrencia,
      New.coddepartamento, 1, New.CodDetalhe); -- Karina - 135887
  end
end

end

--Acumula os valores de Juros,Desconto,Despesas e ValorRecebido na duplicata
/*230629
   Update Duplicatas
     Set ValorRecebido = Duplicatas.ValorRecebido - Case When Old.TipoMovimento = 3
                                                         Then Old.ValorRecebido Else 0 End
                                                  + Case When New.TipoMovimento = 3
                                                         Then New.ValorRecebido Else 0 End,
         ValorJuros     = Duplicatas.ValorJuros     - Old.ValorJuros     + New.ValorJuros,
         ValorDesconto  = Duplicatas.ValorDesconto  - Old.ValorDesconto  + New.ValorDesconto,
         ValorDespesa   = Duplicatas.ValorDespesa   - Old.ValorDespesa   + New.ValorDespesa,
         ValorAdicional = Duplicatas.ValorAdicional - Old.ValorAdicional + New.ValorAdicional
    Where Duplicatas.Empresa       = New.EmpresaDuplicata
      and Duplicatas.TipoDuplicata = New.TipoDuplicata
      and Duplicatas.CodDuplicata  = New.CodDuplicata;*/

--230629
  Update Duplicatas Set
    ValorRecebido = Duplicatas.ValorRecebido - Case When Old.TipoMovimento = 3
                                                         Then Old.ValorRecebido Else 0 End,
    ValorJuros     = Duplicatas.ValorJuros - Old.ValorJuros,
    ValorDesconto  = Duplicatas.ValorDesconto - Old.ValorDesconto,
    ValorDespesa   = Duplicatas.ValorDespesa - Old.ValorDespesa,
    ValorAdicional = Duplicatas.ValorAdicional - Old.ValorAdicional
  Where Duplicatas.Empresa       = Old.EmpresaDuplicata
    and Duplicatas.TipoDuplicata = Old.TipoDuplicata
    and Duplicatas.CodDuplicata  = Old.CodDuplicata;

--230629
  Update Duplicatas Set
    ValorRecebido = Duplicatas.ValorRecebido + Case When New.TipoMovimento = 3
                                                    Then New.ValorRecebido Else 0 End,
         ValorJuros     = Duplicatas.ValorJuros + New.ValorJuros,
         ValorDesconto  = Duplicatas.ValorDesconto + New.ValorDesconto,
         ValorDespesa   = Duplicatas.ValorDespesa + New.ValorDespesa,
         ValorAdicional = Duplicatas.ValorAdicional + New.ValorAdicional
  Where Duplicatas.Empresa       = New.EmpresaDuplicata
    and Duplicatas.TipoDuplicata = New.TipoDuplicata
    and Duplicatas.CodDuplicata  = New.CodDuplicata;

end
^


SET TERM ; ^


ALTER TABLE MOVESTOQUEFICHA ADD NOMEMAQUINA  VARCHAR(50) COLLATE WIN_PTBR;
ALTER TABLE MOVESTOQUEFICHA ADD NOMEAPLICACAO VARCHAR(50) COLLATE WIN_PTBR;

SET TERM ^ ;

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

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

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

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

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

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

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


SELECT
  NF.CodCondPagto,

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

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


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

ValorTotalNotaTratada = ValorTotalNotaInicial;

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

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

  ValorTotalNotaTratada = ValorTotalNotaTratada - ValoresAdicionais;
end 

--Karina - 125968
PrimeiraDuplicata = '';

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

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

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

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

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


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

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

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

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

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

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

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

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



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

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

    PrimeiraDuplicata = CodDuplicata;
  end

  --Ronaldo Chamado 411291
  if (:ValorTituloDuplInicial = 0) then
  begin
    suspend;
    exit;
  end

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

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

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

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

  END

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

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

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

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

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

    END

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

  END

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


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

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

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

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

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

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


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

END^

SET TERM ; ^


CREATE TABLE STATUSORDEMSERVICOLOG
 (
  CODOS                  NUMERIC(9,0) DEFAULT 0   NOT NULL,
  EMPRESA                SMALLINT           DEFAULT 0   NOT NULL,
  NUMSEQUENCIA           SMALLINT           DEFAULT 0   NOT NULL,
  CODSTATUS              SMALLINT           DEFAULT 0   NOT NULL,
  DATAHORAINICIO         TIMESTAMP,
  DATAHORATERMINO        TIMESTAMP,
  CODCOLABORADOR         NUMERIC(9,0) DEFAULT 0   NOT NULL,
  CODUSUARIO             NUMERIC(9,0) DEFAULT 0   NOT NULL,
  STATUSTRANSACAO        SMALLINT      DEFAULT 0   NOT NULL,
  TRANSACAOEMPRESAS      VARCHAR(50)   DEFAULT ''  NOT NULL COLLATE WIN_PTBR
 );

ALTER TABLE STATUSORDEMSERVICOLOG ADD CONSTRAINT
    PK_STATUSORDEMSERVICOLOG PRIMARY KEY
    (
     CODOS,
     EMPRESA,
     NUMSEQUENCIA);

SET TERM ^ ;

CREATE TRIGGER ALTERAORDEMSERVICO for ORDEMSERVICO
active after update position 0
AS
BEGIN

  UPDATE StatusOrdemServicoLog
  set
    DataHoraTermino = current_timestamp

  where
      StatusOrdemServicoLog.Empresa   =  NEW.Empresa
  and StatusOrdemServicoLog.CodOS     =  NEW.Codigo
  and StatusOrdemServicoLog.CodStatus <> NEW.CodStatus
  and NEW.CodStatus <> 0
  and StatusOrdemServicoLog.NumSequencia = (Select first 1 NumSequencia from StatusOrdemServicoLog
                                            Where
                                             Empresa   = NEW.Empresa
                                           and CodOS = NEW.Codigo
                                           order by NumSequencia Desc
                                           );

  if (( NEW.CodStatus<>0 ) and
     ( NEW.CodStatus <> OLD.CodStatus)) then
  begin

    Insert Into StatusOrdemServicoLog (
      CodOS, Empresa, NumSequencia, CodStatus,
      DataHoraInicio, DataHoraTermino, StatusTransacao,
      CodUsuario)
    VALUES(
           OLD.Codigo,
           OLD.Empresa,
           (select coalesce (max(STOS.NumSequencia),0)+1 from StatusOrdemServicoLog STOS
            Where
                STOS.Empresa =old.Empresa
            and STOS.CodOS =old.Codigo
           ),
           new.CodStatus,
           current_timestamp,
           NULL,
           1,
           new.codstatus
          );
  end
end

^

SET TERM ; ^

--Eder - Chamado 412516
update RDB$FIELDS set
  RDB$FIELD_LENGTH = 8000,
  RDB$CHARACTER_LENGTH = 8000
where RDB$FIELD_NAME IN
  (select RDB$FIELD_SOURCE from rdb$relation_fields
   where upper(rdb$relation_name) = 'PRODUTOS'
     and upper(rdb$field_name) in ('REFCOMERCIAL', 'REFTECNICA'));


CREATE TABLE PRODUTOSFCI
(      
   CODPRODUTO             NUMERIC(7,0) DEFAULT 0  NOT NULL,      
   EMPRESAESTOQUE         NUMERIC(2,0) DEFAULT 0  NOT NULL,      
   SEQUENCIA              INT          DEFAULT 0  NOT NULL,      
   NUMFCI                 VARCHAR(40)  DEFAULT '' NOT NULL COLLATE WIN_PTBR,      
   PERCCONTEUDOIMPORTACAO NUMERIC(4,2) DEFAULT 0  NOT NULL,      
   DATAREGISTROFCI        TIMESTAMP,           
   FLAGATIVO              INT          DEFAULT 0  NOT NULL,
   STATUSTRANSACAO        INT          DEFAULT 0  NOT NULL,  
   TRANSACAOEMPRESAS      VARCHAR(50)  DEFAULT '' NOT NULL COLLATE WIN_PTBR
);      

ALTER TABLE PRODUTOSFCI 
  ADD CONSTRAINT PK_PRODUTOSFCI 
  PRIMARY KEY    
  (     
     CODPRODUTO,
     EMPRESAESTOQUE,
     SEQUENCIA
  );  


--Gabriella - 409465
ALTER TRIGGER INSERTITEMLISTAPRECO INACTIVE;
ALTER TRIGGER UPDATEITEMLISTAPRECO INACTIVE;
ALTER TRIGGER DELETAITEMLISTAPRECO INACTIVE;

ALTER TABLE ITEMLISTAPRECO ADD VALORCOTACAOMOEDA NUMERIC(18,8) DEFAULT 0 NOT NULL;
ALTER TABLE MOEDAS ADD TIPOCALCULOPRECO SMALLINT DEFAULT 0 NOT NULL;

ALTER TRIGGER INSERTITEMLISTAPRECO ACTIVE;
ALTER TRIGGER UPDATEITEMLISTAPRECO ACTIVE;
ALTER TRIGGER DELETAITEMLISTAPRECO ACTIVE;

SET TERM ^ ;

ALTER PROCEDURE CALCULABLOQUEIOITEMPEDIDO(
    EMPRESA INTEGER,
    NUMLANCAMENTO INTEGER,
    SEQTEMPORARIA INTEGER,
    CODPEDIDO INTEGER,
    TIPOPRECOMINIMO INTEGER,
    TIPOMARGEMLUCRO INTEGER,
    FLAGMOSTRARITENS SMALLINT,
    CODENTIDADE VARCHAR(7),
    FLAGVISTA INTEGER)
RETURNS (
    BLOQUEIO INTEGER)
AS
BEGIN
  SUSPEND;
END^

ALTER PROCEDURE STORED_PRCE060AJUSTE(
    EMPRESA SMALLINT,
    EMPRESAESTOQUE SMALLINT,
    CODPRODUTOINI INTEGER,
    CODPRODUTOFIM INTEGER,
    CODOPERACAOENT INTEGER,
    CODOPERACAOSAI INTEGER,
    TIPOVALOR SMALLINT,
    DATAMOVIMENTO TIMESTAMP,
    CODUSUARIO INTEGER)
AS
BEGIN
  EXIT;
END^

ALTER PROCEDURE STORED_PRFT110DECOMPORPRODUTOS(
    EMPRESA SMALLINT,
    TIPOCONTROLE SMALLINT,
    CODCONTROLE INTEGER)
AS
BEGIN
  EXIT;
END^

SET TERM ; ^

DROP VIEW VIEWITEMLISTAPRECO;

CREATE VIEW VIEWITEMLISTAPRECO(
    CODIGO,
    CODLISTA,
    FLAGPRINCIPAL,
    FLAGPROMOCAO,
    QUANTPROMOCAO,
    QUANTVENDIDA,
    DATAVALIDADE,
    VALORCUSTOLIQUIDO,
    VALORCUSTOBRUTO,
    PERCDESCONTO1,
    PERCDESCONTO2,
    PERCDESCONTO3,
    PERCDESCONTO4,
    PERCDESCONTO5,
    FLAGIPIVENDA,
    ALIQIPI,
    EMPRESA,
    PRECOVENDA1,
    PRECOVENDA2,
    PRECOVENDA3,
    PRECOVENDA4,
    PRECOVENDA5)
AS
Select
 Item.CodProduto as Codigo,
 Item.CodLista,
 Item.FlagPrincipal,
 Item.FlagPromocao,
 Item.QuantPromocao,
 Item.QuantVendida,
 Item.DataValidade,
 --Gabriella - 358087
 --JALDO - CHAMADO  267580
 --Rs_RoundDec(Item.ValorCustoLiquido * Coalesce(Moe.ValorCotacao,1),Par.QtdCasasCusto) as ValorCustoLiquido,
 --Rs_RoundDec(Item.ValorCustoBruto * Coalesce(Moe.ValorCotacao,1),Par.QtdCasasCusto) as ValorCustoBruto,
 --Rafael chamado 279702
 --rs_rounddec(Cast(item.ValorCustoLiquido as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION),
 --             Par.QtdCasasCusto ) as ValorCustoLiquido,
 --rs_rounddec(Cast(Item.ValorCustoBruto as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION),
 --             Par.QtdCasasCusto
 --           ) as ValorCustoBruto,
 --rs_rounddec(Cast(item.ValorCustoLiquido as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION),
 /*rs_rounddec(Cast(item.ValorCustoLiquido as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),
              Par.QtdCasasCusto) as ValorCustoLiquido,*/
 --Gabriella - 409465
 Case when Mo.TipoCalculoPreco = 1 Then rs_rounddec(Cast(item.ValorCustoLiquido as DOUBLE PRECISION)
                                         * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),
                                         Par.QtdCasasCusto)
      else rs_rounddec(Cast(item.ValorCustoLiquido as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                       * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),
                       Par.QtdCasasCusto) end as ValorCustoLiquido,

 /*rs_rounddec(Cast(Item.ValorCustoBruto as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION),
              Par.QtdCasasCusto) as ValorCustoBruto,*/
  --Gabriella - 409465
 Case when Mo.TipoCalculoPreco = 1 Then rs_rounddec(Cast(Item.ValorCustoBruto as DOUBLE PRECISION), Par.QtdCasasCusto)
      else rs_rounddec(Cast(Item.ValorCustoBruto as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION),
                       Par.QtdCasasCusto) end as ValorCustoBruto,
 Item.PercDesconto1,
 Item.PercDesconto2,
 Item.PercDesconto3,
 Item.PercDesconto4,
 Item.PercDesconto5,
 Item.FlagIPIVenda, --MARCELO - CHAMADO 200972
 Item.AliqIPI,
 Item.Empresa,
 /* Rs_RoundDec(
   Cast(Case
        When Item.MargemLucro1 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro1 as double precision)
        When Item.MargemLucro1 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro1 as double precision)
        --Gabriella - 358087
        --Rafael chamado 279702
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION)
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
        Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                        * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
   ,Par.QtdCasasVenda) as PrecoVenda1,
  Rs_RoundDec(
   Cast(Case
        When Item.MargemLucro2 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro2 as double precision)
        When Item.MargemLucro2 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro2 as double precision)
        --Gabriella - 358087
        --Rafael chamado 279702
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION)
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
        Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                        * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
   ,Par.QtdCasasVenda) as PrecoVenda2,
  Rs_RoundDec(
   Cast(Case
        When Item.MargemLucro3 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro3 as double precision)
        When Item.MargemLucro3 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro3 as double precision)
        --Gabriella - 358087
        --Rafael chamado 279702
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION)
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
        Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                        * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
   ,Par.QtdCasasVenda) as PrecoVenda3,
  Rs_RoundDec(
   Cast(Case
        When Item.MargemLucro4 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro4 as double precision)
        When Item.MargemLucro4 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro4 as double precision)
        --Gabriella - 358087
        --Rafael chamado 279702
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION)
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
        Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                        * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
   ,Par.QtdCasasVenda) as PrecoVenda4,
  Rs_RoundDec(
   Cast(Case
        When Item.MargemLucro5 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro5 as double precision)
        When Item.MargemLucro5 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro5 as double precision)
        --Gabriella - 358087
        --Rafael chamado 279702
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Moe.ValorCotacao,1) as DOUBLE PRECISION)
        --Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
        Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                                        * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
   ,Par.QtdCasasVenda) as PrecoVenda5 */
  --Gabriella - 409465
  Case When Mo.TipoCalculoPreco = 1 Then Rs_RoundDec(Cast(Case
                  When Item.MargemLucro1 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro1 as double precision)
                  When Item.MargemLucro1 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro1 as double precision)
                  Else 0 End as DOUBLE PRECISION)
             * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),Par.QtdCasasVenda)
        else Rs_RoundDec(Cast(Case When Item.MargemLucro1 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro1 as double precision)
                                   When Item.MargemLucro1 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro1 as double precision)
                                   Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
        ,Par.QtdCasasVenda) end as PrecoVenda1,

  Case When Mo.TipoCalculoPreco = 1 Then Rs_RoundDec(Cast(Case
                  When Item.MargemLucro2 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro2 as double precision)
                  When Item.MargemLucro2 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro2 as double precision)
                  Else 0 End as DOUBLE PRECISION)
             * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),Par.QtdCasasVenda)
        else Rs_RoundDec(Cast(Case When Item.MargemLucro2 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro2 as double precision)
                                   When Item.MargemLucro2 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro2 as double precision)
                                   Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
        ,Par.QtdCasasVenda) end as PrecoVenda2,

  Case When Mo.TipoCalculoPreco = 1 Then Rs_RoundDec(Cast(Case
                  When Item.MargemLucro3 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro3 as double precision)
                  When Item.MargemLucro3 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro3 as double precision)
                  Else 0 End as DOUBLE PRECISION)
             * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),Par.QtdCasasVenda)
        else Rs_RoundDec(Cast(Case When Item.MargemLucro3 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro3 as double precision)
                                   When Item.MargemLucro3 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro3 as double precision)
                                   Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
        ,Par.QtdCasasVenda) end as PrecoVenda3,

  Case When Mo.TipoCalculoPreco = 1 Then Rs_RoundDec(Cast(Case
                  When Item.MargemLucro4 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro4 as double precision)
                  When Item.MargemLucro4 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro4 as double precision)
                  Else 0 End as DOUBLE PRECISION)
             * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),Par.QtdCasasVenda)
        else Rs_RoundDec(Cast(Case When Item.MargemLucro4 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro4 as double precision)
                                   When Item.MargemLucro4 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro4 as double precision)
                                   Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
        ,Par.QtdCasasVenda) end as PrecoVenda4,

  Case When Mo.TipoCalculoPreco = 1 Then Rs_RoundDec(Cast(Case
                  When Item.MargemLucro5 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro5 as double precision)
                  When Item.MargemLucro5 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro5 as double precision)
                  Else 0 End as DOUBLE PRECISION)
             * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION),Par.QtdCasasVenda)
        else Rs_RoundDec(Cast(Case When Item.MargemLucro5 > 0 And Par.TipoPreco = 0 then Item.ValorCustoLiquido / cast(Item.MargemLucro5 as double precision)
                                   When Item.MargemLucro5 > 0 And Par.TipoPreco = 1 then Item.ValorCustoLiquido * cast(Item.MargemLucro5 as double precision)
                                   Else 0 End as DOUBLE PRECISION) * Cast(Coalesce(Mo.UltimaCotacao,1) as DOUBLE PRECISION)
                              * Cast(Coalesce(1 + (Ma.PerAcrescimoCusto/100),1) as DOUBLE PRECISION)
        ,Par.QtdCasasVenda) end as PrecoVenda5
From ItemListaPreco Item
-- Rafael chamado 279702
/*
  Left Join CotacaoMoeda Moe on Item.CodMoeda <> ''
        and Moe.CodMoeda = Item.CodMoeda
        and Moe.DataCotacao = (Select First 1 MoeAux.DataCotacao From CotacaoMoeda MoeAux
                                Where MoeAux.CodMoeda = Item.CodMoeda Order By MoeAux.DataCotacao Desc)
 */
  Left Join Moedas Mo on   Item.CodMoeda <> ''
                       and Mo.Codigo= Item.CodMoeda             
  
  Left join ParamControle Par on Par.Empresa = Item.Empresa

  --Gabriella - 358087
  Left Join Produtos Pro on Pro.Codigo = Item.CodProduto
  Left Join Marcas Ma on Ma.Codigo = Pro.CodMarca
;

SET TERM ^ ;

ALTER PROCEDURE CALCULABLOQUEIOITEMPEDIDO (
    empresa integer,
    numlancamento integer,
    seqtemporaria integer,
    codpedido integer,
    tipoprecominimo integer,
    tipomargemlucro integer,
    flagmostraritens smallint,
    codentidade varchar(7),
    flagvista integer)
returns (
    bloqueio integer)
as
declare variable flagbloqprecominimo integer;
declare variable flagbloqmargem integer;
declare variable margem numeric(5,2);
declare variable codproduto integer;
declare variable codlista integer;
declare variable valorcusto numeric(13,4);
declare variable valorunitario numeric(13,4);
declare variable quantatendida numeric(10,3);
declare variable codmarca char(10);
declare variable codgrupo integer;
declare variable codservico varchar(15);
declare variable fatorredvenda numeric(7,4);
declare variable precovenda1 numeric(13,4);
declare variable precovenda2 numeric(13,4);
declare variable precovenda3 numeric(13,4);
declare variable precovenda4 numeric(13,4);
declare variable precovenda5 numeric(13,4);
declare variable menorpreco numeric(13,4);
declare variable margemminima numeric(5,2);
declare variable margemmaxima numeric(5,2);
declare variable valorbaseicm numeric(11,2);
declare variable aliqicm numeric(4,2);
declare variable valorunitcomdeducao numeric(13,4);
declare variable tipodeduzirimpostovalorunit integer;
declare variable percdescontopreco1 numeric(13,4);
declare variable percdescontopreco2 numeric(13,4);
declare variable percdescontopreco3 numeric(13,4);
declare variable percdescontopreco4 numeric(13,4);
declare variable percdescontopreco5 numeric(13,4);
declare variable valorbruto numeric(13,4);
declare variable valorcomparacao numeric(13,4);
declare variable qtdcasasvenda integer;
declare variable id varchar(15);
declare variable acrecimoprecoprepedido numeric(5,2);
BEGIN


  --236035
  Select
    TipoDeduzirImpostoValorUnit,id
  From
    Empresas
  Where
    Codigo = :Empresa
  Into
    :TipoDeduzirImpostoValorUnit,:id;

  Select
    QtdCasasVenda
  From
    ParamControle
  Where
    Empresa = :Empresa
  Into
   :QtdCasasVenda;

  --236243
  Select
    rs_dnvl(PercDescontoPreco1,0),
    rs_dnvl(PercDescontoPreco2,0),
    rs_dnvl(PercDescontoPreco3,0),
    rs_dnvl(PercDescontoPreco4,0),
    rs_dnvl(PercDescontoPreco5,0)
  From
    Entidades
  Where
    Codigo = :CodEntidade
  Into
    :PercDescontoPreco1,
    :PercDescontoPreco2,
    :PercDescontoPreco3,
    :PercDescontoPreco4,
    :PercDescontoPreco5;




--319527
 Select
   rs_dnvl(AcrescimoPreco,0)
 From
  PrePedidoLote                   
 Where
      NumlancamentoMovCliente = :NumLancamento
  and CodPedidoVendaCliente   = :CodPedido
  and EmpresaOrigem           = :Empresa
  into
    :AcrecimoPrecoPrePedido;




--Calcula o Acrescimo de Pre Pedido, sobre o preço com desconto (% sobre %)
  if (:AcrecimoPrecoPrePedido > 0) then
  begin
    PercDescontoPreco1 = abs(100 - (100 * (1 - (:PercDescontoPreco1 / 100))) * (1 + (:AcrecimoPrecoPrePedido / 100)));
    PercDescontoPreco2 = abs(100 - (100 * (1 - (:PercDescontoPreco2 / 100))) * (1 + (:AcrecimoPrecoPrePedido / 100)));
    PercDescontoPreco3 = abs(100 - (100 * (1 - (:PercDescontoPreco3 / 100))) * (1 + (:AcrecimoPrecoPrePedido / 100)));
    PercDescontoPreco4 = abs(100 - (100 * (1 - (:PercDescontoPreco4 / 100))) * (1 + (:AcrecimoPrecoPrePedido / 100)));
    PercDescontoPreco5 = abs(100 - (100 * (1 - (:PercDescontoPreco5 / 100))) * (1 + (:AcrecimoPrecoPrePedido / 100)));
  end




  IF (:FlagMostrarItens = 0) THEN
  BEGIN
    SELECT 
      QuantAtendida,
      --236035/236243
      (ValorUnitario +
      CASE WHEN :TipoDeduzirImpostoValorUnit in (1,3) THEN
              rs_rounddec(ValorUnitario * AliqIPI / 100, :QtdCasasVenda)
      ELSE 0 END +
           CASE WHEN :TipoDeduzirImpostoValorUnit in (2,3) THEN
                 CASE WHEN QuantAtendida > 0 THEN
                   rs_rounddec(ValorSubTrib / QuantAtendida, :QtdCasasVenda)
                 ELSE
                   rs_rounddec(ValorSubTrib, :QtdCasasVenda)
                 END
            ELSE 0 END),
      ValorUnitario,
      (CASE WHEN :TipoMargemLucro = 0 THEN ValorCustoFor * FatorRedCusto
                             WHEN :TipoMargemLucro = 1 THEN ValorCustoUlt * FatorRedCusto
                             ELSE ValorCustoMed
                        END) AS ValorCusto,
      FatorRedVenda,
      CodProduto,
      CodListaPreco,
      CodMarca,
      CodServico,
      rs_dnvl((SELECT CodGrupo FROM Produtos WHERE Produtos.Codigo = TempPrce100itens.CodProduto),0) AS CodGrupo,
      --126455
      ValorBaseICM,
      AliqICM,
      --236243
      ValorBruto
    FROM 
      TempPrce100Itens
    WHERE
      Empresa           = :Empresa
      AND NumLancamento = :NumLancamento
      AND SeqTemporaria = :SeqTemporaria
      AND CodPedido     = :CodPedido
    INTO
      :QuantAtendida,
      --236035
      :ValorUnitComDeducao,
      :ValorUnitario,
      :ValorCusto,
      :FatorRedVenda,
      :CodProduto,
      :CodLista,
      :CodMarca,
      :CodServico,
      :CodGrupo,
      :ValorBaseICM,
      :AliqICM,
      --236243
      :ValorBruto;
  END

  IF (:FlagMostrarItens = 1) THEN
  BEGIN
    SELECT 
      QuantAtendida,
      --236035
      (ValorUnitario +
      CASE WHEN :TipoDeduzirImpostoValorUnit in (1,3) THEN
              rs_rounddec(ValorUnitario * AliqIPI / 100, :QtdCasasVenda)
      ELSE 0 END +
           CASE WHEN :TipoDeduzirImpostoValorUnit in (2,3) THEN
                 CASE WHEN QuantAtendida > 0 THEN
                   rs_rounddec(ValorSubTrib / QuantAtendida, :QtdCasasVenda)
                 ELSE
                   rs_rounddec(ValorSubTrib, :QtdCasasVenda)
                 END
            ELSE 0 END),
      ValorUnitario,
      (CASE WHEN :TipoMargemLucro = 0 THEN ValorCustoFor * FatorRedCusto
                             WHEN :TipoMargemLucro = 1 THEN ValorCustoUlt * FatorRedCusto
                             ELSE ValorCustoMed
                        END),
      FatorRedVenda,
      CodProduto,
      CodListaPreco,
      CodMarca,
      CodServico,
      rs_dnvl((SELECT CodGrupo FROM Produtos WHERE Produtos.Codigo = MovEstoque.CodProduto),0),
      --126455 
      ValorBaseICM,
      AliqICM,
      --236243
      ValorBruto
    FROM
      MovEstoque
    WHERE
      Empresa           = :Empresa
      AND NumLancamento = :NumLancamento
    INTO
      :QuantAtendida,
      --236035
      :ValorUnitComDeducao,
      :ValorUnitario,
      :ValorCusto,
      :FatorRedVenda,
      :CodProduto,
      :CodLista,
      :CodMarca,
      :CodServico,
      :CodGrupo,
      :ValorBaseICM,
      :AliqICM,
      --236243
      :ValorBruto;
  END

  FlagBloqPrecoMinimo = 0;
  FlagBloqMargem      = 0;

  --Calculo da Margem de Lucro
  SELECT
    Margem
  FROM
    calculamargemlucro(:Empresa, :TipoMargemLucro, (:QuantAtendida * :ValorCusto), 
      (:QuantAtendida * :ValorUnitario), (:QuantAtendida * :ValorUnitario * :FatorRedVenda),
      ((:ValorBaseICM*:AliqICM)/100)) --126455
  INTO
    :Margem;

  --Bloqueio pelo preco minimo
  --133329
  IF ((:TipoPrecoMinimo IN (1,2)) AND (CodProduto NOT IN(9999999,8888888))) THEN
  BEGIN
    SELECT 
      --236243
      --rs_dnvl(VIlp.PrecoVenda1,0),
      --rs_dnvl(VIlp.PrecoVenda2,0),
      --rs_dnvl(VIlp.PrecoVenda3,0),
      --rs_dnvl(VIlp.PrecoVenda4,0),
      --rs_dnvl(VIlp.PrecoVenda5,0)

--270314
 --     rs_dnvl((Case When VIlp.FlagPrincipal = 1 Then
 --                               VIlp.PrecoVenda1 - rs_rounddec((VIlp.PrecoVenda1 * :PercDescontoPreco1 / 100), :QtdCasasVenda)
 --                             Else
 --                               VIlp.PrecoVenda1
 --                             End),0),




      rs_dnvl(( Case When VIlp.FlagPrincipal = 1 Then
                  Case When :Id = 'GOOP' and :flagvista =1 Then
                    VIlp.PrecoVenda1 - rs_Rounddec(VIlp.PrecoVenda1 * ( ((1.04 * (1 +  :PercDescontoPreco1/100)-1 )) ), :QtdCasasVenda)
                  Else
                    VIlp.PrecoVenda1 - rs_rounddec((VIlp.PrecoVenda1 * :PercDescontoPreco1 / 100), :QtdCasasVenda) End
               Else
                 VIlp.PrecoVenda1
               End),0),
      

      rs_dnvl(( Case When VIlp.FlagPrincipal = 1 Then
                                VIlp.PrecoVenda2 - rs_rounddec((VIlp.PrecoVenda2 * :PercDescontoPreco2 / 100), :QtdCasasVenda)
                              Else 
                                VIlp.PrecoVenda2 
                              End),0),

      rs_dnvl(( Case When VIlp.FlagPrincipal = 1 Then
                                VIlp.PrecoVenda3 - rs_rounddec((VIlp.PrecoVenda3 * :PercDescontoPreco3 / 100), :QtdCasasVenda)
                              Else 
                                VIlp.PrecoVenda3
                              End),0),

      rs_dnvl(( Case When VIlp.FlagPrincipal = 1 Then
                                VIlp.PrecoVenda4 - rs_rounddec((VIlp.PrecoVenda4 * :PercDescontoPreco4 / 100), :QtdCasasVenda)
                              Else 
                                VIlp.PrecoVenda4 
                              End),0),

      rs_dnvl(( Case When VIlp.FlagPrincipal = 1 Then
                                VIlp.PrecoVenda5 - rs_rounddec((VIlp.PrecoVenda5 * :PercDescontoPreco5 / 100), :QtdCasasVenda)
                              Else 
                                VIlp.PrecoVenda5 
                              End),0)
    FROM 
      Empresas Emp,
      ViewItemListaPreco VIlp
    WHERE Emp.Codigo = :Empresa
      AND VIlp.Codigo = :CodProduto
      AND VIlp.Codlista = :CodLista
      AND VIlp.Empresa = Emp.EmpresaListaPreco
    INTO
      :PrecoVenda1,
      :PrecoVenda2,
      :PrecoVenda3,
      :PrecoVenda4,
      :PrecoVenda5;

    --Rafael chamado 244766
    --IF (PrecoVenda1 IS NULL) THEN
      --PrecoVenda1 = 0;
    --IF (PrecoVenda2 IS NULL) THEN
      --PrecoVenda2 = 0;
    --IF (PrecoVenda3 IS NULL) THEN
      --PrecoVenda3 = 0;
    --IF (PrecoVenda4 IS NULL) THEN
      --PrecoVenda4 = 0;
    --IF (PrecoVenda5 IS NULL) THEN
      --PrecoVenda5 = 0;
    --MenorPreco = PrecoVenda1;



    
    IF ((PrecoVenda1 IS NULL) or (PercDescontoPreco1 = 100))    THEN
      PrecoVenda1 = 0;
    IF ((PrecoVenda2 IS NULL) or (PercDescontoPreco2 = 100))  THEN
      PrecoVenda2 = 0;
    IF ((PrecoVenda3 IS NULL) or (PercDescontoPreco3 = 100))   THEN
      PrecoVenda3 = 0;
    IF ((PrecoVenda4 IS NULL) or (PercDescontoPreco4 = 100))   THEN
      PrecoVenda4 = 0;
    IF ((PrecoVenda5 IS NULL) or (PercDescontoPreco5 =100))  THEN
      PrecoVenda5 = 0;


    MenorPreco = PrecoVenda1;
    IF ((PrecoVenda2 > 0) AND (PrecoVenda2 < MenorPreco)) THEN
      MenorPreco = PrecoVenda2;
    IF ((PrecoVenda3 > 0) AND (PrecoVenda3 < MenorPreco)) THEN
      MenorPreco = PrecoVenda3;
    IF ((PrecoVenda4 > 0) AND (PrecoVenda4 < MenorPreco)) THEN
      MenorPreco = PrecoVenda4;
    IF ((PrecoVenda5 > 0) AND (PrecoVenda5 < MenorPreco)) THEN
      MenorPreco = PrecoVenda5;

    --236035
    --IF (((ValorUnitario < MenorPreco) AND (MenorPreco > 0))
    --   OR ((ValorUnitario = 0 AND MenorPreco > 0))) THEN
    --  FlagBloqPrecoMinimo = 1;
    --IF (((ValorUnitComDeducao < MenorPreco) AND (MenorPreco > 0))
    --   OR ((ValorUnitComDeducao = 0 AND MenorPreco > 0))) THEN
    --  FlagBloqPrecoMinimo = 1;

    IF (:TipoDeduzirImpostoValorUnit = 0) THEN
      ValorComparacao = ValorUnitario;

    IF (:TipoDeduzirImpostoValorUnit <> 0) THEN
    BEGIN
      ValorComparacao = ValorUnitComDeducao;
      --Renato - 325312
      --IF ((MenorPreco = ValorBruto) or (flagvista = 1))THEN
      IF ((Cast(MenorPreco as Numeric(13,2)) = Cast(ValorBruto as Numeric(13,2))) or (flagvista = 1))THEN
        ValorComparacao = ValorComparacao + 0.05;   --Até 5 centavos de diferença
    END

    IF (((ValorComparacao < MenorPreco) AND (MenorPreco > 0))
       OR ((ValorComparacao = 0 AND MenorPreco > 0))) THEN
      FlagBloqPrecoMinimo = 1;

  END

  --Bloqueio por Margem da Marca
  --133329
  IF ((CodProduto <>  8888888) AND  (QuantAtendida > 0)) THEN
  BEGIN
    SELECT 
      MargemMinima,
      MargemMaxima
    FROM 
      Marcas 
    WHERE 
      Codigo = :CodMarca
    INTO
      :MargemMinima,
      :MargemMaxima;

    IF (MargemMinima IS NULL) THEN
      MargemMinima = 0;
    IF (MargemMaxima IS NULL) THEN
      MargemMaxima = 0;
    IF (((MargemMinima > 0) AND (Margem < MargemMinima))
       OR ((MargemMaxima > 0) AND (Margem > MargemMaxima))) THEN
      FlagBloqMargem = 1;
  END


  --Bloqueio por Margem do Grupo
  IF ((CodProduto <> 8888888) AND (QuantAtendida > 0)) THEN
  BEGIN
    SELECT 
      MargemMin,
      MargemMax
    FROM 
      Grupos
    WHERE 
      Codigo = :CodGrupo
    INTO
      :MargemMinima,
      :MargemMaxima;

    IF (MargemMinima IS NULL) THEN
      MargemMinima = 0;
    IF (MargemMaxima IS NULL) THEN
      MargemMaxima = 0;
    IF (((MargemMinima > 0) AND (Margem < MargemMinima))
       OR ((MargemMaxima > 0) AND (Margem > MargemMaxima))) THEN
      FlagBloqMargem = 1;
  END

  --Bloqueio por Margem do Servico
  IF (CodProduto = 8888888) THEN
  BEGIN
    SELECT 
      MargemMinima,
      MargemMaxima
    FROM 
      Servicos
    WHERE 
      Codigo = :CodServico
    INTO
      :MargemMinima,
      :MargemMaxima;

    IF (MargemMinima IS NULL) THEN
      MargemMinima = 0;
    IF (MargemMaxima IS NULL) THEN
      MargemMaxima = 0;
    IF (((MargemMinima > 0) AND (Margem < MargemMinima))
       OR ((MargemMaxima > 0) AND (Margem > MargemMaxima))) THEN
      FlagBloqMargem = 1;
  END

-- 0 se não tiver bloqueio nenhum
-- 1 se tiver bloqueio somente por preco minimo
-- 2 se tiver bloqueio somente por margem
-- 3 se tiver bloqueio por margem e por preco minimo

  IF (FlagBloqPrecoMinimo = 1) THEN
    IF (FlagBloqMargem = 1) THEN
      Bloqueio = 3;
    ELSE
      Bloqueio = 1;
  ELSE
  IF (FlagBloqMargem = 1) THEN
    Bloqueio = 2;
  ELSE
    Bloqueio = 0;
  SUSPEND;
END
^

ALTER PROCEDURE STORED_PRFT110DECOMPORPRODUTOS (
    empresa smallint,
    tipocontrole smallint,
    codcontrole integer)
as
declare variable numlancamento integer;
declare variable codproduto integer;
declare variable empresalista smallint;
declare variable empresaestoque smallint;
declare variable valorunitario numeric(13,4);
declare variable valortotalcomposicao numeric(13,4);
declare variable codprodutocomp integer;
declare variable valortotalcomponente numeric(18,8);
declare variable quantcomposicao numeric(13,4);
declare variable quantatendida numeric(10,3);
declare variable numsequencia smallint;
declare variable qtdcasas smallint;
declare variable arredondamento numeric(13,4);
declare variable quantcomponentes smallint;
declare variable quantatendidavalor numeric(10,3);
declare variable valordiferenca numeric(10,3);
declare variable somavalorcomponentes numeric(10,3);
declare variable primeiroitemcomp integer;
begin
/********************    
-- VERSÃO 1.97
********************/   
Select
  E.EmpresaListaPreco,
  E.EmpresaEstoque,
  P.QtdCasasVenda
From   
  Empresas E  
  Left Join ParamControle P on P.Empresa = E.Codigo  
Where  
  E.Codigo = :Empresa
Into
  :EmpresaLista, :EmpresaEstoque, :QtdCasas;

for
--MARCELO - CHAMADO 210269
/*  Select
    Mov.NumLancamento, Mov.CodProduto, Mov.ValorUnitario, Mov.QuantAtendida,  
    rs_dnvl((Select Sum(rs_dnvl(V.ValorCustoLiquido,C.CustoUnitario) * C.Quantidade)
            From ComposicaoProduto C  
              Left Join ViewItemListaPreco V on V.Codigo = C.CodProdutoComp  
                And V.FlagPrincipal = 1  
                And V.Empresa = :EmpresaLista
            Where C.CodProdutoPrin = Mov.CodProduto  
              And (C.CodProdutoComp not in (9999999,8888888))),0) ,
    rs_dnvl((Select count(*)
            From ComposicaoProduto C  
              Left Join ViewItemListaPreco V on V.Codigo = C.CodProdutoComp  
                And V.FlagPrincipal = 1  
                And V.Empresa = :EmpresaLista
            Where C.CodProdutoPrin = Mov.CodProduto  
              And (C.CodProdutoComp not in (9999999,8888888))),0)  
  From MovEstoque Mov  
    left join Produtos P on P.Codigo = Mov.CodProduto
  Where Mov.Empresa      = :Empresa
    and Mov.TipoControle = :TipoControle
    and Mov.CodControle  = :CodControle
    and Mov.CodProduto not in (8888888,9999999)  
    and P.FlagDecomporProduto = 1
    and Exists (Select * From ComposicaoProduto C  
                Where C.CodProdutoPrin = Mov.CodProduto  
                  and CodProdutoComp not in (8888888,9999999)) */

  Select        
    Min(Mov.NumLancamento), 
    Min(Mov.CodProduto), 
    Min(Mov.ValorUnitario), 
    Min(Mov.QuantAtendida),        
    Sum(Coalesce(V.ValorCustoLiquido,IComp.ValorCustoFor) * (IComp.QuantAtendida / IPrin.QuantAtendida)),
    Count(IComp.CodProduto)
  From MovEstoque Mov        
    left join Produtos P on P.Codigo = Mov.CodProduto  
    left join MovEstoqueAux MAux on MAux.Empresa = Mov.Empresa
                                and MAux.NumLancamento = Mov.NumLancamento
    Left Join ItemOP IPrin on IPrin.CodProduto = MAux.CodProduto
                          and IPrin.EmpresaEstoque = MAux.EmpresaEstoque
                          and IPrin.CodLote = MAux.CodLote
    left join ItemOP IComp on IComp.CodOrdem = IPrin.CodOrdem
                          and IComp.EmpresaEstoque = IPrin.EmpresaEstoque
                          --JALDO - CHAMADO 261167
                          --   and IComp.NumItemOP = IPrin.NumItem
                          and IComp.TipoItem = 2
                          and IComp.CodProduto not in (8888888,9999999)
    left Join ViewItemListaPreco V on V.Codigo = IComp.CodProduto
                                  and V.FlagPrincipal = 1        
                                  and V.Empresa = :EmpresaLista
  Where Mov.Empresa      = :Empresa
    and Mov.TipoControle = :TipoControle
    and Mov.CodControle  = :CodControle
    and Mov.CodProduto not in (8888888,9999999)  
    and P.FlagDecomporProduto = 1
    --Gabriella - 393902
    --Eder - Chamado 274892
    --Group By Mov.CodProduto
    Group By Mov.NumLancamento, Mov.CodProduto

into :NumLancamento, :CodProduto, :ValorUnitario,
                                :QuantAtendida, :ValorTotalComposicao, :QuantComponentes
DO
Begin

  --JALDO - CHAMADO 276726
  ValorDiferenca = 0;
  SomaValorComponentes = 0;

  NumSequencia = 0;

  if (QuantAtendida = 0) then
    QuantAtendidaValor = 1;
  else
    QuantAtendidaValor = QuantAtendida;

  Arredondamento = (ValorUnitario * QuantAtendidaValor);
  
  For
  --MARCELO - CHAMADO 210269
/*    Select
      C.CodProdutoComp, C.Quantidade,  
      rs_dnvl(V.ValorCustoLiquido, C.CustoUnitario) * C.Quantidade
    From ComposicaoProduto C  
      Left Join ViewItemListaPreco V on V.Codigo = C.CodProdutoComp  
        and V.FlagPrincipal = 1  
        and V.Empresa = :EmpresaLista
    Where C.CodProdutoPrin = :CodProduto
      and CodProdutoComp not in (8888888,9999999)  */
    Select
      IComp.CodProduto,
      IComp.QuantAtendida / IPrin.QuantAtendida,        
      (IComp.QuantAtendida / IPrin.QuantAtendida) * rs_dnvl(V.ValorCustoLiquido, IComp.ValorCustoFor)
    From MovEstoqueAux MAux
      Left Join ItemOP IPrin on IPrin.CodProduto = MAux.CodProduto
                            and IPrin.EmpresaEstoque = MAux.EmpresaEstoque
                            and IPrin.CodLote = MAux.CodLote
      left join ItemOP IComp on IComp.CodOrdem = IPrin.CodOrdem
                            and IComp.EmpresaEstoque = IPrin.EmpresaEstoque
                            --JALDO - CHAMADO 261167
                            --and IComp.NumItemOP = IPrin.NumItem
                            and IComp.TipoItem = 2
                            and IComp.CodProduto not in (8888888,9999999)
      Left Join ViewItemListaPreco V on V.Codigo = IComp.CodProduto
                                    and V.FlagPrincipal = 1        
                                    and V.Empresa = :EmpresaLista
    where MAux.Empresa = :Empresa
      and MAux.NumLancamento = :NumLancamento
      --MARCELO - CHAMADO 242477
      and IComp.QuantAtendida > 0
  into :CodProdutoComp, :QuantComposicao, :ValorTotalComponente
  do
  Begin  
    NumSequencia = NumSequencia + 1;
  
    if (ValorTotalComposicao = 0) then
      ValorTotalComponente = 0;
    else  
    begin  
      -- acha a proporcao em relacao ao total da composicao   
      ValorTotalComponente = (ValorTotalComponente / ValorTotalComposicao);

      -- multplica o fator encontrado pelo valor de venda do item  
      --313121
      --ValorTotalComponente = rs_rounddec(ValorTotalComponente * (ValorUnitario * QuantAtendidaValor),2);
      ValorTotalComponente = rs_rounddec(ValorTotalComponente * cast((ValorUnitario * QuantAtendidaValor) as numeric(18,4)),2);

      Arredondamento = Arredondamento - ValorTotalComponente;

      if (QuantComponentes = NumSequencia) then
        ValorTotalComponente =  ValorTotalComponente + Arredondamento;
    end

    --JALDO - CHAMADO 276726
    SomaValorComponentes = SomaValorComponentes + :ValorTotalComponente;
  
    Insert Into MovComponente (  
      EmpresaEstoque, NumLancamento, NumSequencia, Empresa,  
      TipoControle, CodControle, CodProduto, Descricao,  
      NumOriginal, NumFabricante, Unidade, QuantAtendida,  
      ValorUnitario, ValorTotal,   
      ValorCustoFor, ValorCustoMed,
      ValorCustoUlt, ValorCustoUltReal,
      FatorRedCusto, FatorRedVenda, CodTributacao,
      CodClassFiscal, CodListaPreco, StatusTransacao,
      DataMovimento
      )   
    Select  
      :EmpresaEstoque, :NumLancamento, :NumSequencia, :Empresa,
      :TipoControle, :CodControle, :CodProdutoComp, P.Descricao,
      P.NumOriginal, P.NumFabricante, P.UnidVenda, (:QuantComposicao * :QuantAtendida),
      rs_Rounddec(:ValorTotalComponente / (:QuantComposicao * :QuantAtendidaValor),4),
      Case when :QuantAtendida = 0 then 0 else :ValorTotalComponente end,
      rs_dnvl(V.ValorCustoLiquido,0), rs_dnvl(Es.ValorCustoMed,0),
      rs_dnvl(Es.ValorCustoUlt,0), rs_dnvl(Es.ValorCustoUltReal,0),
      1, 1, P.CodTributacaoSai,
      P.CodClassFiscal, rs_invl(V.CodLista,0), 1,
      --Eder 379894     
      NF.DataMovimento
    From Produtos P
      Left Join ViewItemListaPreco V on V.Codigo = P.Codigo
        and V.FlagPrincipal = 1  
        and V.Empresa = :EmpresaLista
      Left Join EstoqueProduto Es on Es.CodProduto = P.Codigo
        and Es.Empresa = :EmpresaEstoque
      --Eder 379894
      Left Join NotasFiscais NF on NF.Empresa = :Empresa
                               and NF.TipoControle = :TipoControle
                               and NF.CodControle  = :CodControle
    Where P.Codigo = :CodProdutoComp;
  end
End

  --JALDO - CHAMADO 276726
  --Acertar a diferença no primeiro item dos componentes

  ValorDiferenca = ((:ValorUnitario * :QuantAtendida) - :SomaValorComponentes);

  if (:ValorDiferenca <> 0) then
  begin
    Select First 1 Mov.NumSequencia
        from  MovComponente Mov
    where
        Mov.EmpresaEstoque = :EmpresaEstoque
    and Mov.NumLancamento = :NumLancamento
    Into :PrimeiroItemComp;

    Update MovComponente
      Set ValorTotal = ValorTotal + :ValorDiferenca
    Where
        EmpresaEstoque = :EmpresaEstoque
    and NumLancamento = :NumLancamento
    and NumSequencia = :PrimeiroItemComp;
  end

  suspend;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE STORED_PRCE100PEDIDOCOMPRA (
    empresa integer,
    empresaestoque integer,
    codpedido integer,
    datamovimento timestamp,
    codusuarioinc integer,
    gerarpedcompraporitem integer)
RETURNS (
    BLOQUEIO INTEGER)
AS
BEGIN
  SUSPEND;
END^

SET TERM ; ^

DROP VIEW VIEWCUSTOSPRODUTO;

CREATE VIEW VIEWCUSTOSPRODUTO(
    CODIGO,
    CODLISTA,
    FLAGPRINCIPAL,
    EMPRESA,
    VALORCUSTOFOR,
    VALORULTIMACOMPRA,
    VALORCUSTOMEDIO,
    VALORULTIMACOMPRAREAL)
AS
Select 
    Pro.Codigo,
    coalesce(Item.CodLista,0) as CodLista,
    coalesce(Item.FlagPrincipal,0) as FlagPrincipal,
    Emp.EmpresaEstoque as Empresa,
    --JALDO - CHAMADO 267580
    --Rs_RoundDec(coalesce((Select First 1 Item.ValorCustoLiquido * Moe.ValorCotacao From CotacaoMoeda Moe

    -- Rafael chamado 279702
    /*
    Rs_RoundDec(coalesce((Select First 1 cast(Item.ValorCustoLiquido as double precision) * cast(coalesce(Moe.ValorCotacao,1) as double precision)
        From CotacaoMoeda Moe
                    Where Moe.CodMoeda = Item.CodMoeda 
                      and Item.CodMoeda <> ''
                    Order By Moe.DataCotacao Desc), coalesce(Item.ValorCustoLiquido,0))
                  ,coalesce((Select Par.QtdCasasCusto From ParamControle Par
                      where Par.Empresa = Emp.EmpresaEstoque),0)) as ValorCustoFor,
    */

    /*Rs_RoundDec(coalesce(cast(Item.ValorCustoLiquido as double precision) * cast(coalesce(Mo.UltimaCotacao,1) as double precision)
              , coalesce(Item.ValorCustoLiquido,0)),coalesce((Select Par.QtdCasasCusto From ParamControle Par
                                                              where Par.Empresa = Emp.EmpresaEstoque),0)) as ValorCustoFor,*/

    --Gabriella - 409465
    Case When Mo.TipoCalculoPreco = 1 Then
               Rs_RoundDec(coalesce(Item.ValorCustoLiquido,0), coalesce((Select Par.QtdCasasCusto From ParamControle Par
                                                                         where Par.Empresa = Emp.EmpresaEstoque),0))
          else Rs_RoundDec(coalesce(cast(Item.ValorCustoLiquido as double precision) * cast(coalesce(Mo.UltimaCotacao,1) as double precision)
               , coalesce(Item.ValorCustoLiquido,0)),coalesce((Select Par.QtdCasasCusto From ParamControle Par
                                                              where Par.Empresa = Emp.EmpresaEstoque),0)) end as ValorCustoFor,

    coalesce(Es.ValorCustoUlt,0) as ValorUltimaCompra,
    coalesce(Es.ValorCustoMed,0) as ValorCustoMedio,
    coalesce(Es.ValorCustoUltReal,0) as ValorUltimaCompraReal
  From Produtos Pro
  Left Join Empresas Emp on Emp.Codigo = Emp.EmpresaEstoque
  left join ItemListaPreco Item on Item.CodProduto = Pro.Codigo
                               and Item.Empresa = Emp.EmpresaListaPreco
                               and Item.FlagPrincipal = 1
  Left Join EstoqueProduto Es on Es.CodProduto = Pro.Codigo and Es.Empresa = Emp.EmpresaEstoque
  -- Rafael chamado 279702
  Left Join Moedas Mo on   Item.CodMoeda <> ''
                     and   Mo.Codigo = Item.CodMoeda
;

SET TERM ^ ;

ALTER PROCEDURE STORED_PRCE060AJUSTE (
    empresa smallint,
    empresaestoque smallint,
    codprodutoini integer,
    codprodutofim integer,
    codoperacaoent integer,
    codoperacaosai integer,
    tipovalor smallint,
    datamovimento timestamp,
    codusuario integer)
as
declare variable numlancamento integer;
declare variable codproduto integer;
declare variable tipomovimento smallint;
declare variable valorunitario numeric(13,4);
declare variable quantajuste numeric(9,2);
begin
/*FB*/
  delete from TempPrce060Ajuste where Empresa = :Empresa;

  insert into TempPrce060Ajuste(Empresa, CodProduto, QuantEstoque, QuantMovimento)
  select Es.Empresa, Pr.Codigo, Es.QuantEstoque,
    (
      rs_dnvl((select sum(Mov.QuantMovimentada) from MovEstoque Mov where Mov.EmpresaEstoque = Es.Empresa and Mov.CodProdutoMov = Pr.Codigo and Mov.TipoMovimento = 1 and Mov.FlagMovEstoque = 1),0)
      -
      rs_dnvl((select sum(Mov.QuantMovimentada) from MovEstoque Mov where Mov.EmpresaEstoque = Es.Empresa and Mov.CodProdutoMov = Pr.Codigo and Mov.TipoMovimento = 2 and Mov.FlagMovEstoque = 1),0)
    )
  from Produtos Pr
       left join EstoqueProduto Es on Es.Empresa = :EmpresaEstoque and Es.CodProduto = Pr.Codigo
  where Es.Empresa = :EmpresaEstoque
        and Es.QuantEstoque <>
            (
              rs_dnvl((select sum(Mov.QuantMovimentada) from MovEstoque Mov where Mov.EmpresaEstoque = Es.Empresa and Mov.CodProdutoMov = Pr.Codigo and Mov.TipoMovimento = 1 and Mov.FlagMovEstoque = 1),0)
              -
              rs_dnvl((select sum(Mov.QuantMovimentada) from MovEstoque Mov where Mov.EmpresaEstoque = Es.Empresa and Mov.CodProdutoMov = Pr.Codigo and Mov.TipoMovimento = 2 and Mov.FlagMovEstoque = 1),0)
            )
        and Pr.Codigo between :CodProdutoIni and :CodProdutoFim
        and Pr.Codigo not in (8888888,9999999);


  for
    select
      T.CodProduto,
      case
        when T.QuantMovimento > T.QuantEstoque then 2
        else 1
      end as TipoMovimento,
      abs(T.QuantEstoque - T.QuantMovimento) as QuantAjuste,
      RS_DNVL(case :TipoValor
        when 0 then ViewP.PrecoVenda1
        when 1 then ViewP.ValorCustoLiquido
        when 2 then (select rs_dnvl(ViewCusto.ValorUltimaCompra,0) from ViewCustosProduto ViewCusto where ViewCusto.Codigo = T.CodProduto
                                          and ViewCusto.Empresa = :EmpresaEstoque and ViewCusto.FlagPrincipal = 1)
        when 3 then (select rs_dnvl(ViewCusto.ValorCustoMedio,0) from ViewCustosProduto ViewCusto where ViewCusto.Codigo = T.CodProduto
                                         and ViewCusto.Empresa = :EmpresaEstoque and ViewCusto.FlagPrincipal = 1)
      end,0) as ValorUnitario
    from
      TempPrce060Ajuste T
      left join Produtos P on P.Codigo = T.CodProduto
      Left Join Empresas Emp on Emp.Codigo = :EmpresaEstoque
      left join viewitemlistapreco ViewP on ViewP.Codigo = T.CodProduto
            and Viewp.flagprincipal = 1 and ViewP.Empresa = Emp.EmpresaListaPreco
    where T.Empresa = :EmpresaEstoque
    into :CodProduto, :TipoMovimento, :QuantAjuste, :ValorUnitario
  do
  begin
    --175823 execute procedure IncrementaMovEstoque(:EmpresaEstoque);
    Select NumLancamentoGerado From IncrementaMovEstoque (:EmpresaEstoque)
    Into :NumLancamento;

--175823
--    Select Sequencia from Sequencias
--    Where Empresa = :EmpresaEstoque
--      and Tabela = 'MOVESTOQUE'
--    Into :NumLancamento;

    insert into MovEstoque
      (Empresa, NumLancamento, EmpresaEstoque, CodProduto, CodProdutoMov,
       DataMovimentoEstoque,
       DataMovimento, DataFaturamento, TipoMovimento, FlagMovEstoque,
       CodOperacao,
       ValorBruto, ValorUnitario, ValorTotal, QuantPedida, QuantAtendida, QuantMovimentada,
       ValorCustoFor, FatorRedCusto, CodMarca, Descricao, Localizacao, NumOriginal, NumFabricante,
       CodTributacao,
       Unidade,
       CodUsuarioInc, ClasseABC, StatusTransacao)
    select
      :Empresa, :NumLancamento, :EmpresaEstoque, :CodProduto, :CodProduto,
      Current_Date,
      :DataMovimento, :DataMovimento, :TipoMovimento, 1,
      case when :TipoMovimento =  1 then :CodOperacaoEnt else :CodOperacaoSai end,
      :ValorUnitario, :ValorUnitario, (:QuantAjuste * :ValorUnitario), :QuantAjuste, :QuantAjuste, :QuantAjuste,
      :ValorUnitario, 1, Pr.CodMarca, Pr.Descricao, rs_snvl(Es.Localizacao,''), Pr.NumOriginal, Pr.NumFabricante,
      case :TipoMovimento when 1 then Pr.CodTributacaoEnt else Pr.CodTributacaoSai end,
      case :TipoMovimento when 1 then Pr.UnidCompra else Pr.UnidVenda end,
      :CodUsuario, Es.ClasseABC, 1
    from
      Produtos Pr
      left join EstoqueProduto Es on Es.Empresa = :EmpresaEstoque and Es.CodProduto= Pr.Codigo
    where Pr.Codigo = :CodProduto;
  end
  suspend;
END
^

ALTER PROCEDURE STORED_PRCE100PEDIDOCOMPRA (
    empresa integer,
    empresaestoque integer,
    codpedido integer,
    datamovimento timestamp,
    codusuarioinc integer,
    gerarpedcompraporitem integer)
as
declare variable codpedidocompra integer;
declare variable existe integer;
declare variable cur_aliqipi numeric(4,2);
declare variable cur_codfornecedor char(7);
declare variable cur_codpedidocompra integer;
declare variable cur_numlancamentovenda integer;
declare variable cur_seqtemporariavenda integer;
declare variable cur_numlancamentocompra integer;
declare variable cur_seqtemporariacompra integer;
declare variable cur_tipogerarentrada integer;
declare variable cur_statusitemped char(1);
declare variable cur_statusitemvenda char(1);
declare variable cur_valorfrete numeric(11,2);
declare variable cur_valorseguro numeric(11,2);
declare variable cur_valordespesas numeric(11,2);
declare variable cur_diavenc1 integer;
declare variable cur_diavenc2 integer;
declare variable cur_diavenc3 integer;
declare variable cur_diavenc4 integer;
declare variable cur_diavenc5 integer;
declare variable cur_diavenc6 integer;
declare variable cur_diavenc7 integer;
declare variable cur_diavenc8 integer;
declare variable cur_diavenc9 integer;
declare variable cur_codcondpagto char(5);
declare variable numlancamentocompra integer;
declare variable cur_quantidade numeric(9,2);
declare variable cur_valorunitario numeric(13,4);
declare variable numlancamentoentrada integer;
declare variable cur_codoperacao integer;
declare variable tipopedido smallint;
declare variable valorbloqueiopedido decimal(11,2);
declare variable cur_flagimprimir smallint;
declare variable cur_observacao varchar(2000);
declare variable cur_percdesconto numeric(4,2);
declare variable auxvalorprodutos decimal(18,2);
declare variable auxvalorservicos decimal(18,2);
declare variable auxvaloripi decimal(18,2);
declare variable cur_codtributacao char(5);
declare variable codentidade char(7);
declare variable valorsubtrib decimal(11,2);
declare variable valortotalpcantesalteracao decimal(11,2);
BEGIN

/*FB*/
   -- Renato - Chamado 261016
   -- Renato - Chamado 256946
   --SeqMovEstoque = :SequenciaMovEstoque;

Existe = null;
SELECT First 1 TmpPed.CodPedidoVenda
  FROM TempPrce100PedCompra TmpPed
  LEFT JOIN TempPrce100Itens TmpItem ON TmpItem.Empresa = TmpPed.Empresa
        AND TmpItem.NumLancamento = TmpPed.NumLancamentoVenda
        AND TmpItem.SeqTemporaria = TmpPed.SeqTemporariaVenda
        AND TmpItem.CodPedido = :CodPedido
   WHERE TmpPed.Empresa = :Empresa
     AND TmpPed.CodPedidoVenda = :CodPedido
  INTO :Existe;

IF (coalesce(:Existe,0) = 0) THEN
begin
   -- Renato - Chamado 261016
   --suspend;
   EXIT;
end
  -- Renato - Chamado 261016
  -- Renato - Chamado 256946
  --NumLancamentoEntrada = :SequenciaMovEstoque;
--Eder 321198
Select   
  case when Upper(coalesce(PPed.Conteudo,'')) = Cast('ORDEM DE FABRICAÇÃO' as varchar(20))
       then 1 else 0 end,
  Case when PPedCompra.Conteudo <> ''
       Then Cast(Rs_Replace(Rs_Replace(PPedCompra.Conteudo,'.','') ,',','.') as decimal(18,2))
       else 0 End
   From Usuarios U
   Left Join  PermissoesPrograma PPed on PPed.CodGrupo = Coalesce(U.CodGrupo,-1)
                                     and PPed.Empresa = :Empresa
                                     and PPed.Programa = 'PRCE100'
                                     and PPed.Identificador = 75  --prce100_TipoPedidoCompra
   Left Join  PermissoesPrograma PPedCompra on PPedCompra.CodGrupo = Coalesce(U.CodGrupo,-1)
                             and PPedCompra.Empresa = :Empresa
                             and PPedCompra.Programa = 'PRPC100'
                             and PPedCompra.Identificador = 11 --prpc100_ValorPedidoBloqueio
Where U.Codigo = :CodUsuarioInc
  Into :TipoPedido, :ValorBloqueioPedido;

if (TipoPedido is null) then
  TipoPedido = 0;
if (ValorBloqueioPedido is null) then
  ValorBloqueioPedido = 0;


FOR
  SELECT DISTINCT TmpPed.CodPedidoCompra, TmpPed.CodFornecedor,
       rs_dnvl(Det.ValorFrete,0), rs_dnvl(Det.ValorSeguro,0), rs_dnvl(Det.ValorDespesas,0),
       rs_invl(Det.DiaVenc1,0), rs_invl(Det.DiaVenc2,0), rs_invl(Det.DiaVenc3,0),
       rs_invl(Det.DiaVenc4,0), rs_invl(Det.DiaVenc5,0), rs_invl(Det.DiaVenc6,0),
       rs_invl(Det.DiaVenc7,0), rs_invl(Det.DiaVenc8,0), rs_invl(Det.DiaVenc9,0),
       rs_invl(Det.codoperacao, 0), rs_snvl(Det.CodCondPagto, 0),
       --171342
       rs_invl(DEt.FlagImprimir, 0),
       rs_snvl(Det.Observacao, 0) -- 206247
    FROM TempPrce100PedCompra TmpPed
    LEFT JOIN TempPrce100Itens TmpItem ON TmpItem.Empresa = TmpPed.Empresa
          AND TmpItem.NumLancamento = TmpPed.NumLancamentoVenda
          AND TmpItem.SeqTemporaria = TmpPed.SeqTemporariaVenda
          AND TmpItem.CodPedido = :CodPedido
          and TmpItem.Status <> 'L'
    LEFT JOIN TempPrce100DetalhesPedCompra Det ON Det.Empresa = TmpPed.Empresa
         AND Det.CodPedidoCompra = TmpPed.CodPedidoCompra
         --Gabriella - 303840
         AND Det.CodPedidoVenda = TmpPed.CodPedidoVenda

         AND Det.CodFornecedor = TmpPed.CodFornecedor
    WHERE TmpPed.Empresa=:Empresa
      AND TmpPed.CodPedidoVenda=:CodPedido
    INTO :Cur_CodPedidoCompra, :Cur_CodFornecedor,
         :Cur_ValorFrete, :Cur_ValorSeguro, :Cur_ValorDespesas,
         :Cur_DiaVenc1, :Cur_DiaVenc2, :Cur_DiaVenc3,
         :Cur_DiaVenc4, :Cur_DiaVenc5, :Cur_DiaVenc6,
         :Cur_DiaVenc7, :Cur_DiaVenc8, :Cur_DiaVenc9,
         :Cur_CODOPERACAO, :Cur_CodCondPagto,
         --171342
         :Cur_FlagImprimir,
         :Cur_Observacao -- 206247

DO
BEGIN
  --Insere os Pedidos de Compra Novos
  CodPedidoCompra = Cur_CodPedidoCompra;

  --Insere os pedidos dos itens novos
  IF (CodPedidoCompra = 0) THEN
  BEGIN
    CodPedidoCompra = null;

    if (GerarPedCompraPorItem = 0) then
    begin
      select first 1 CodPedidoCompra
      from TempPRCE100PedCompra
      where Empresa = :EmpresaEstoque
        and CodPedidoVenda = :CodPedido
        and CodFornecedor = :Cur_CodFornecedor
        and CodPedidoCompra > 0
      into :CodPedidoCompra;

      --171342
      if ((CodPedidoCompra is not null) and (CodPedidoCompra <> 0) and (Cur_FlagImprimir <> 0)) then
      begin
        Update TempPRCE100DetalhesPedCompra Set
          FlagImprimir = :Cur_FlagImprimir
        Where Empresa = :Empresa
          and CodPedidoVenda = :CodPedido
          and CodPedidoCompra = :CodPedidoCompra
          and CodFornecedor = :Cur_CodFornecedor
          and FlagImprimir = 0;
      end
    end

        if (CodPedidoCompra is null) then
        begin
            --fica em loop até achar um pedido que não esteja cadastrado
            Existe = 1;
            WHILE (Existe = 1) DO
            BEGIN
              Select SequenciaGerada from ProximaSequencia('PEDIDOCOMPRA', :EmpresaEstoque, 1)
                Into :CodPedidoCompra;

              if (Not Exists(Select EmpresaEstoque
                               From PedidoCompra
                              Where EmpresaEstoque=:EmpresaEstoque
                                and CodPedido=:CodPedidoCompra)) then
                 Existe = 0;
            END

            --grava o pedido de compra
            INSERT INTO PedidoCompra
                (EmpresaEstoque, CodPedido, TipoPedido, DataMovimento, DataEntrega,
                CodFornecedor, StatusTransacao, CodOperacao,
                Observacoes) -- 206247
            VALUES
                (:EmpresaEstoque, :CodPedidoCompra, :TipoPedido, :DataMovimento, :DataMovimento,
                :Cur_CodFornecedor, 1, :Cur_CodOperacao,
                :Cur_Observacao); -- 206247
            UPDATE TempPrce100DetalhesPedCompra
            SET CodPedidoGerado = :CodPedidoCompra
            WHERE Empresa = :Empresa
                   AND CodPedidoVenda = :CodPedido
                   AND CodPedidoCompra = :Cur_CodPedidoCompra
                   AND CodFornecedor =  :Cur_CodFornecedor;
        end
      END


   --pega os Itens do Pedido                      
   FOR
      SELECT TmpPed.NumLancamentoVenda, TmpPed.SeqTemporariaVenda,
             TmpPed.NumLancamentoCompra, TmpPed.SeqTemporariaCompra,
             TmpPed.TipoGerarEntrada,
             TmpPed.Quantidade, TmpPed.ValorUnitario, TmpPed.AliqIPI,
             TmpPed.Status, TmpItem.Status,TmpPed.PercDesconto,
             --Ronaldo Chamado 323448
             TmpPed.CodTributacao
        FROM TempPrce100PedCompra TmpPed
        LEFT JOIN TempPrce100Itens TmpItem ON TmpItem.Empresa = TmpPed.Empresa
              AND TmpItem.NumLancamento = TmpPed.NumLancamentoVenda
              AND TmpItem.SeqTemporaria = TmpPed.SeqTemporariaVenda
              AND TmpItem.CodPedido = :CodPedido
        WHERE TmpPed.Empresa=:Empresa
          AND TmpPed.CodPedidoVenda=:CodPedido
          AND TmpPed.CodPedidoCompra = :Cur_CodPedidoCompra
          AND TmpPed.CodFornecedor = :Cur_CodFornecedor
        INTO :Cur_NumLancamentoVenda, :Cur_SeqTemporariaVenda,
             :Cur_NumLancamentoCompra, :Cur_SeqTemporariaCompra,
             :Cur_TipoGerarEntrada, :Cur_Quantidade, :Cur_ValorUnitario, :Cur_AliqIPI,
             :Cur_StatusItemPed, :Cur_StatusItemVenda,:cur_percdesconto,:Cur_CodTributacao
      DO
       BEGIN
         NumLancamentoCompra = Cur_NumLancamentoCompra;

         IF ((Cur_CodPedidoCompra = 0) AND (Cur_StatusItemPed <> 'E') AND
             (Cur_StatusItemVenda <> 'E')) THEN
            BEGIN
              NumLancamentoCompra = NULL;
              --Pega a proxima sequencia do item do pedido de compra                                        
              SELECT FIRST 1 NumLancamento
                 FROM ItemPedidoCompra
                 WHERE EmpresaEstoque=:EmpresaEstoque AND CodPedido=:CodPedidoCompra
                 ORDER BY NumLancamento DESC
                 INTO :NumLancamentoCompra;
              IF (NumLancamentoCompra IS NULL) THEN
                 NumLancamentoCompra = 0;
              NumLancamentoCompra = NumLancamentoCompra + 1;

              --grava o item do pedido de compra                    
              INSERT INTO ItemPedidoCompra
                  (EmpresaEstoque, CodPedido, NumLancamento,
                   CodProduto, QuantPedida,
                   ValorBruto, PercDesconto, AliqIPI, ValorUnitario,
                   Descricao, NumOriginal, NumFabricante,
                   UnidCompra, CodMarca, TipoGerarEntrada, StatusTransacao, CodListaPreco,
                   CodFornecedor,  --MARCELO - CHAMADO 166938
                   --Rafael chamado 273385
                   CodTributacao,
                   --370677  
                   CodServico
                   )
               SELECT :EmpresaEstoque, :CodPedidoCompra, :NumLancamentoCompra,
                      TmpPed.CodProduto, :Cur_Quantidade,
                      --208493
                      --:Cur_ValorUnitario, 0, :Cur_AliqIPI, :Cur_ValorUnitario,
                      :Cur_ValorUnitario, :cur_percdesconto, :Cur_AliqIPI, :Cur_ValorUnitario,
                      TmpItem.Descricao, Tmpitem.NumOriginal, TmpItem.NumFabricante,
                      TmpItem.Unidade, TmpItem.CodMarca, TmpPed.TipoGerarEntrada, 1, Coalesce(Ilp.CodLista, 0),
                      :Cur_CodFornecedor, --MARCELO - CHAMADO 166938
                      --Ronaldo Chamado 323448
                      --Rafael chamado 273385  
                      --P.CodTributacaoEnt
                      :Cur_CodTributacao,
                      --370677
                      TmpPed.CodServico
                 FROM TempPrce100PedCompra TmpPed
                 --marcelo 19/01/2006
                 LEFT JOIN TempPrce100Itens TmpItem ON TmpItem.Empresa = TmpPed.Empresa
                     AND TmpItem.CodPedido = :CodPedido
                     AND TmpItem.NumLancamento = TmpPed.NumLancamentoVenda
                     AND TmpItem.SeqTemporaria = TmpPed.SeqTemporariaVenda
                 LEFT JOIN ItemListaPreco Ilp ON Ilp.CodProduto = TmpItem.CodProduto
                   --372020 and Ilp.Empresa = TmpItem.Empresa
                     and Ilp.Empresa = (Select E.EmpresaListaPreco From Empresas E Where E.Codigo = TmpItem.Empresa)
                     AND Ilp.FlagPrincipal = 1
                 --Ronaldo Chamado 323448
                 --Rafael chamado  273385
                 --Left join Produtos P on P.Codigo = TmpPed.CodProduto
                 WHERE TmpPed.Empresa = :Empresa
                   AND TmpPed.CodPedidoVenda = :CodPedido
                   AND TmpPed.CodPedidoCompra = :Cur_CodPedidoCompra
                   AND TmpPed.NumLancamentoVenda = :Cur_NumLancamentoVenda
                   AND TmpPed.SeqTemporariaVenda = :Cur_SeqTemporariaVenda
                   AND TmpPed.NumLancamentoCompra = :Cur_NumLancamentoCompra
                   AND TmpPed.SeqTemporariaCompra = :Cur_SeqTemporariaCompra;

                                                                                                  
              --Atualiza o pedido gerado na tabela temporaria para quando tiver o numero do lancamento da Venda,
              --regravar no pedido de compra este numero da venda
              UPDATE TempPrce100PedCompra
                 SET CodPedidoCompra = :CodPedidoCompra,
                     NumLancamentoCompra = :NumLancamentoCompra
                WHERE Empresa = :Empresa
                  AND CodPedidoVenda = :CodPedido
                  AND NumLancamentoVenda = :Cur_NumLancamentoVenda
                  AND SeqTemporariaVenda = :Cur_SeqTemporariaVenda
                  AND CodPedidoCompra = :Cur_CodPedidoCompra
                  AND NumLancamentoCompra = :Cur_NumLancamentoCompra
                  AND SeqTemporariaCompra = :Cur_SeqTemporariaCompra;
            END --Fim Inserçao

         IF ((Cur_CodPedidoCompra <> 0) AND (Cur_StatusItemPed <> 'E') AND
             (Cur_StatusItemVenda <> 'E')) THEN
            BEGIN
              UPDATE ItemPedidoCompra
                 SET QuantPedida = :Cur_Quantidade,
                     ValorBruto = :Cur_ValorUnitario,
                     ValorUnitario = :Cur_ValorUnitario,
                     AliqIPI = :Cur_AliqIPI,
                     TipoGerarEntrada = CASE WHEN :Cur_TipoGerarEntrada <> 2 THEN :Cur_TipoGerarEntrada
                                             ELSE TipoGerarEntrada
                                        END,
                     --Ronaldo Chamado 323448
                     codtributacao = :Cur_CodTributacao,
                     StatusTransacao = 1,
                     PercDesconto = :CUR_PERCDESCONTO
                WHERE EmpresaEstoque = :EmpresaEstoque
                  AND CodPedido = :CodPedidoCompra
                  AND NumLancamento = :NumLancamentoCompra;
            END

         IF ((Cur_CodPedidoCompra <> 0) AND
             ((Cur_StatusItemPed = 'E') OR (Cur_StatusItemVenda = 'E'))) THEN
            BEGIN
              DELETE FROM ItemPedidoCompra
                WHERE EmpresaEstoque = :EmpresaEstoque
                  AND CodPedido = :CodPedidoCompra
                  AND NumLancamento = :NumLancamentoCompra;
            END

         --Faz a entrada do item no estoque                         
         IF ((Cur_StatusItemPed <> 'E') AND (Cur_StatusItemVenda <> 'E') AND
             (Cur_TipoGerarEntrada = 1)) THEN
            BEGIN
              --Pega a Proxima sequencia do MovEstoque                          
              --175823 execute procedure IncrementaMovEstoque(:EmpresaEstoque);

              -- Renato - Chamado 261016
              -- Renato - Chamado 256946
              Select  NumLancamentoGerado From IncrementaMovEstoque(:EmpresaEstoque)
              Into :NumLancamentoEntrada;
              /*ExisteNumLancamentoEntrada = 1;
              While (:ExisteNumLancamentoEntrada = 1) do
              begin
                NumLancamentoEntrada = :NumLancamentoEntrada + 1;
                SeqMovEstoque = :NumLancamentoEntrada;
                if (not (Exists (Select Empresa
                                 From MovEstoque
                                 Where Empresa=:EmpresaEstoque
                                   and NumLancamento=:NumLancamentoEntrada))) Then
                begin
                  ExisteNumLancamentoEntrada = 0;
                end
              end*/

              /*175823
              Select SequenciaGerada from ProximaSequencia('MOVESTOQUE', :EmpresaEstoque, 1)
               Into :NumLancamentoEntrada;*/

              --Gera a Entrada em estoque do item de compra
              INSERT INTO MovEstoque
                  (Empresa, NumLancamento, EmpresaEstoque, CodProduto, CodProdutoMov,
                   DataMovimentoEstoque, DataMovimento,
                   CodOperacao, TipoMovimento, FlagMovEstoque,
                   CodPedido, TipoControle, CodControle,
                   QuantPedida, QuantAtendida, QuantMovimentada,
                   ValorBruto, ValorUnitario, ValorTotal,
                   ValorCustoFor,
                   FatorRedCusto, FatorRedVenda, AliqIPI, CodMarca, Descricao,
                   NumOriginal, NumFabricante, Unidade,
                   CodEntidade, CodPedCompra, SeqItemPedCompra,
                   ValorCustoUlt, ValorCustoUltReal, ValorCustoMed,
                   StatusTransacao,
                   --Ronaldo Chamado 323448
                   -- Renato - Chamado 270510
                   CodClassFiscal, ClasseABC, CodTributacao, CodListaPreco, NumCFOP, AliqPisCofins,
                   --370677  
                   CodServico)
                SELECT 
                   :Empresa, :NumLancamentoEntrada, :EmpresaEstoque, TItem.CodProduto, TItem.CodProduto,
                   --Eder - Chamado 180510
                   --CURRENT_DATE, :DataMovimento,
                   CURRENT_DATE, CURRENT_DATE,
                   :Cur_CodOperacao, 1, 1,
                   0, 0, 0,
                   :Cur_Quantidade, :Cur_Quantidade, :Cur_Quantidade,
                   :Cur_ValorUnitario, :Cur_ValorUnitario, (:Cur_ValorUnitario * :Cur_Quantidade),
                   :Cur_ValorUnitario,
                   1, 1, :Cur_AliqIPI, TItem.CodMarca, TItem.Descricao,
                   --Renato - Chamado 270510 
                   --Alterado Para pegar a unidade de compra do pruduto
                   --TItem.NumOriginal, TItem.NumFabricante, TItem.Unidade,
                   TItem.NumOriginal, TItem.NumFabricante, P.UnidCompra,

                   :Cur_CodFornecedor, :CodPedidoCompra, :NumLancamentoCompra,
                   COALESCE(Vcus.ValorUltimaCompra,0), COALESCE(Vcus.ValorUltimaCompraReal,0), COALESCE(VCus.ValorCustoMedio,0), 1,
                   --Ronaldo Chamado 323448
                   --Renato - Chamado 270510
                   --P.CodClassFiscal, EP.ClasseABC, P.CodTributacaoEnt, COALESCE(Ilp.CodLista, 0), Op.CFOP1_Normal,
                   P.CodClassFiscal, EP.ClasseABC, :Cur_CodTributacao, COALESCE(Ilp.CodLista, 0), Op.CFOP1_Normal,
                   Case When Op.FlagCalcPis_Cofins = 1 then CF.AliqPisCofins else 0 end,
                   --370677
                   TPed.CodServico

                   FROM TempPrce100PedCompra TPed
                   LEFT JOIN TempPrce100Itens TItem ON TItem.Empresa = TPed.Empresa
                         AND TItem.CodPedido = :CodPedido
                         AND TItem.SeqTemporaria = :Cur_SeqTemporariaVenda
                         AND TItem.NumLancamento = :Cur_NumLancamentoVenda
                   LEFT JOIN ViewCustosProduto VCus ON VCus.Codigo = TItem.CodProduto
                                                   AND VCus.Empresa = :EmpresaEstoque
                   --Renato - Chamado 270510
                   LEFT JOIN Produtos P on P.Codigo = TItem.CodProduto
                   LEFT JOIN ClassFiscais CF on CF.Codigo = P.CodClassFiscal
                   LEFT JOIN EstoqueProduto EP on EP.Empresa = TPed.Empresa
                        AND EP.CodProduto = TItem.CodProduto
                   LEFT JOIN ItemListaPreco Ilp on Ilp.CodProduto = TItem.CodProduto
                   --372121 and Ilp.Empresa = TItem.Empresa
                       and Ilp.Empresa = (Select E.EmpresaListaPreco From Empresas E Where E.Codigo = TItem.Empresa)
                       AND Ilp.FlagPrincipal = 1
                   LEFT JOIN Operacoes Op on Op.Codigo = :Cur_CodOperacao

                   WHERE TPed.Empresa = :Empresa
                     AND TPed.CodPedidoVenda = :CodPedido
                     AND TPed.NumLancamentoVenda = :Cur_NumLancamentoVenda
                     AND TPed.SeqTemporariaVenda = :Cur_SeqTemporariaVenda
                     AND TPed.CodPedidoCompra = :CodPedidoCompra
                     AND TPed.NumLancamentoCompra = :NumLancamentoCompra
                     AND TPed.SeqTemporariaCompra = :Cur_SeqTemporariaCompra;

              UPDATE ItemPedidoCompra
                 SET TipoGerarEntrada = 2,
                     StatusTransacao = 1
               WHERE EmpresaEstoque = :EmpresaEstoque
                 AND CodPedido = :CodPedidoCompra
                 AND NumLancamento = :NumLancamentoCompra;
                  
              UPDATE TempPRCE100PedCompra
                 SET TipoGerarEntrada = 2
              WHERE Empresa = :Empresa
                AND CodPedidoVenda = :CodPedido
                AND NumLancamentoVenda = :Cur_NumLancamentoVenda
                AND SeqTemporariaVenda = :Cur_SeqTemporariaVenda
                AND CodPedidoCompra = :CodPedidoCompra
                AND NumLancamentoCompra = :NumLancamentoCompra
                AND SeqTemporariaCompra = :Cur_SeqTemporariaCompra;
            END --Fim gera entrada

                       
        END

       --Ronaldo Chamado 323448
       Select CodFornecedor from PedidoCompra
       where CodPedido = :CodPedidoCompra
       and EmpresaEstoque = :EmpresaEstoque
       into :CodEntidade;

       --Ronaldo Chamado 323448
       Execute procedure stored_prpc100CalcularICM(
       2, --Atualizar Valores direto na ItempedidoCompra
       :EmpresaEstoque,
       :CodPedidoCompra,
       :Cur_CodOperacao,
       :AuxValorProdutos,
       :AuxValorServicos,
       0,0,0,:CodEntidade,:AuxValorIPI);


       --Eder 321198
       AuxValorProdutos = 0;
       AuxValorServicos = 0;
       AuxValorIPI = 0;
       --Ronaldo Chamado 323448  
       valorsubtrib = 0;
       Select sum(Case When CodProduto <> 8888888
                       then rs_roundDec(ValorUnitario * QuantPedida,2)
                       Else 0 End),
              sum(Case When CodProduto = 8888888
                       then rs_roundDec(ValorUnitario * QuantPedida,2)
                       Else 0 End),
              sum(Case When CodProduto <> 8888888
                       then rs_roundDec(ValorUnitario * QuantPedida * AliqIPI / 100,2)
                       Else 0 End),
              --Ronaldo Chamado 323448  
              sum(rs_roundDec(ValorSubTrib,2))
       FROM ItemPedidoCompra
       WHERE EmpresaEstoque=:EmpresaEstoque
         AND CodPedido=:CodPedidoCompra
        Into :AuxValorProdutos, :AuxValorServicos, :AuxValorIPI, :ValorSubTrib;

       --Totaliza o pedido de compra gerado
       UPDATE PedidoCompra
          SET ValorProdutos = rs_dnvl(:AuxValorProdutos,0),
              ValorServicos = rs_dnvl(:AuxValorServicos,0),
              ValorIPI      = rs_dnvl(:AuxValorIPI,0),
              ValorFrete = :Cur_ValorFrete,
              ValorSeguro = :Cur_ValorSeguro,
              ValorDespesas = :Cur_ValorDespesas,
              DiaVenc1 = :Cur_DiaVenc1,
              DiaVenc2 = :Cur_DiaVenc2,
              DiaVenc3 = :Cur_DiaVenc3,
              DiaVenc4 = :Cur_DiaVenc4,
              DiaVenc5 = :Cur_DiaVenc5,
              DiaVenc6 = :Cur_DiaVenc6,
              DiaVenc7 = :Cur_DiaVenc7,
              DiaVenc8 = :Cur_DiaVenc8,
              DiaVenc9 = :Cur_DiaVenc9,
              StatusTransacao=1,
              CodOperacao = :Cur_Codoperacao,
              CodCondPagto = :Cur_CodCondPagto,
              Observacoes = :Cur_Observacao, -- 206247
              --JALDO - CHAMADO 329710
              --Ronaldo Chamado 323448  
              --ValorSubTrib = :ValorSubTrib
              ValorSubTrib = rs_dnvl(:ValorSubTrib,0)
          WHERE EmpresaEstoque=:EmpresaEstoque
            AND CodPedido=:CodPedidoCompra;

     --JALDO - CHAMADO 338888
     SELECT Coalesce(ValorTotalPedido,0)
     FROM PEDIDOCOMPRA
     WHERE CodPedido =:CodPedidoCompra
     and EmpresaEstoque=:EmpresaEstoque
     into :ValorTotalPCAntesAlteracao;

       --Eder - 321198
       Update PedidoCompra
          set TipoBloqueio = Case When ValorTotalPedido > :ValorBloqueioPedido and :ValorBloqueioPedido > 0
                                  --JALDO - CHAMADO 338888
                                  Then
                                  --1
                                  Case When TipoBloqueio = 2 and :ValorTotalPCAntesAlteracao = ValorTotalPedido then
                                    2 Else 1 End
                                  When TipoBloqueio = 2 Then 2  --Não teve bloqueio, mas pedido ja foi liberado, continua liberado
                             else 0 End
        Where EmpresaEstoque=:EmpresaEstoque
          and CodPedido=:CodPedidoCompra;

       Existe = null;
       SELECT First 1 CodPedido FROM ItemPedidoCompra
          WHERE EmpresaEstoque=:EmpresaEstoque
            AND CodPedido=:CodPedidoCompra
          INTO :Existe;
       IF (Coalesce(Existe,0) = 0)  THEN
          BEGIN
            DELETE FROM PedidoCompra
              WHERE EmpresaEstoque=:EmpresaEstoque
                AND CodPedido=:CodPedidoCompra;
            --Não volta a ultima sequencia propositalmente, para evitar bagunçar os pedidos de compra
          END

END
-- Renato - Chamado 261016
-- Renato - Chamado 256946
--suspend;

END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

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

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

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

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

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

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

  DataAux = AuxProDataMovimento - 1;

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

      --Eder = 321038
      --Atualiza o preço de custo com o custo médio
      If ((:FlagAtualizarCustoMedioPreco = 1) and (coalesce(:AtuValorCustoMed,0) > 0)) then
      begin
       --Gabriella - 409465      
       Select Case when Mo.TipoCalculoPreco = 1 and I.ValorCotacaoMoeda > 0
                   Then I.ValorCotacaoMoeda else 0 end
       From ItemListaPreco I              
       Left Join Moedas Mo on I.CodMoeda <> ''
                    and Mo.Codigo = I.CodMoeda 
          Where CodProduto = :AuxProCodProduto
            and FlagPrincipal = 1
            and Empresa = :EmpresaListaPreco
       Into :ValorCotacaoMoeda;
        
       if (coalesce(:ValorCotacaoMoeda,0) = 0) then
         ValorCotacaoMoeda = 1;

        Update ItemListaPreco
           Set ValorCustoBruto = coalesce(:AtuValorCustoMed,0),
               --Gabriella - 409465 
               --ValorCustoLiquido = (Select ValorCusto From CalculaCustoLiquido(:EmpresaEstoque, coalesce(:AtuValorCustoMed,0),
               ValorCustoLiquido = (Select ValorCusto From CalculaCustoLiquido(:EmpresaEstoque, coalesce(:AtuValorCustoMed,0) * :ValorCotacaoMoeda,
                                       ItemListaPreco.PercDesconto1, ItemListaPreco.PercDesconto2, ItemListaPreco.PercDesconto3, ItemListaPreco.PercDesconto4, ItemListaPreco.PercDesconto5,
                                       ItemListaPreco.PercAcrescimo1, ItemListaPreco.PercAcrescimo2, ItemListaPreco.PercAcrescimo3, ItemListaPreco.PercFrete,
                                       ItemListaPreco.FlagIPIVenda, ItemListaPreco.AliqIPI, ItemListaPreco.PercICMCusto, ItemListaPreco.PercPISCOFINSCusto, ItemListaPreco.PercDescontoAdicional,
                                       ItemListaPreco.PercSubTrib, ItemListaPreco.PercAcrescimoInc1, ItemListaPreco.PercAcrescimoInc2, ItemListaPreco.PercAcrescimoInc3,
                                       ItemListaPreco.PercFreteInc, ItemListaPreco.PercDescontoNaoInc))
          Where CodProduto = :AuxProCodProduto
            and FlagPrincipal = 1
            and Empresa = :EmpresaListaPreco;

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

      end

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

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

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


END
^

SET TERM ; ^


SET TERM ^ ;

ALTER trigger insertitemlistapreco
active after insert position 0
AS
DECLARE VARIABLE QTDCASASVENDA INTEGER;
DECLARE VARIABLE TIPOPRECO INTEGER;
begin
/* FB */

Select First 1 QtdCasasVenda, TipoPreco
  From ParamControle
  Order By Empresa
  Into :QtdCasasVenda, :TipoPreco;

if (:QTDCASASVENDA is null) then
  QTDCASASVENDA = 2;
if (:TIPOPRECO is null) then
  TIPOPRECO = 0;

--Se o item foi marcado como promocao, desmarca das outras listas
Update ItemListaPreco
   Set FlagPromocao = 0,
       StatusTransacao = 1
   Where ItemListaPreco.CodProduto = New.CodProduto
     and ItemListaPreco.CodLista <> New.CodLista
     and ItemListaPreco.Empresa = New.Empresa
     and New.FlagPromocao = 1;

--Se o item foi marcado como principal, desmarca das outras listas
Update ItemListaPreco
   Set FlagPrincipal = 0,
       StatusTransacao = 1
   Where ItemListaPreco.CodProduto = New.CodProduto
     and ItemListaPreco.CodLista <> New.CodLista
     and ItemListaPreco.Empresa = New.Empresa
     and New.FlagPrincipal = 1;

--Se marcou o flag de Alterar preço de custo nas outras listas, desmarca o flag das demais listas
--Obs: Tem que fazer o custo antes da venda para nao dar diferenca na venda
If (New.FlagCustoOutrasListas = 1) then
   Update ItemListaPreco
      Set FlagCustoOutrasListas = 0,
          ValorCustoBruto = New.ValorCustoBruto,
          PercDesconto1 = New.PercDesconto1,
          PercDesconto2 = New.PercDesconto2,
          PercDesconto3 = New.PercDesconto3,
          PercDesconto4 = New.PercDesconto4,
          PercDesconto5 = New.PercDesconto5,
          PercAcrescimo1 = New.PercAcrescimo1,
          PercAcrescimo2 = New.PercAcrescimo2,
          PercAcrescimo3 = New.PercAcrescimo3,
          PercFrete = New.PercFrete,
          PercICMCusto = New.PercICMCusto,
          PercDescontoAdicional = New.PercDescontoAdicional,
          ValorCustoLiquido = New.ValorCustoLiquido,
          AliqIPI = New.AliqIPI,
          FlagIPIVenda = New.FlagIPIVenda,
          CodMoeda = New.CodMoeda,
          ValorCotacaoMoeda = New.ValorCotacaoMoeda,
          StatusTransacao = 1
      Where ItemListaPreco.CodProduto = New.CodProduto
        and ItemListaPreco.Empresa = New.Empresa
        and ItemListaPreco.CodLista <> New.CodLista;

--Altera o preço de venda nas outras listas se marcou a lista alterada
If (New.FlagVendaOutrasListas = 1) then
   Update ItemListaPreco
      Set FlagVendaOutrasListas = 0,
          MargemLucro1 = Case when (:TipoPreco = 0 and New.MargemLucro1 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro1),:QtdCasasVenda)) < 999
                              then  --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro1),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro1 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro1),:QtdCasasVenda)/ ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro1),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro2 = Case when (:TipoPreco = 0 and New.MargemLucro2 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro2),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro2),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro2 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro2),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then  --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro2),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro3 = Case when (:TipoPreco = 0 and New.MargemLucro3 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro3),:QtdCasasVenda)) < 999
                              then  --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro3),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro3 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro3),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro3),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro4 = Case when (:TipoPreco = 0 and New.MargemLucro4 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro4),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro4),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro4 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro4),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro4),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro5 = Case when (:TipoPreco = 0 and New.MargemLucro5 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro5),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro5),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro5 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro5),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro5),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          StatusTransacao = 1
   Where ItemListaPreco.CodProduto = New.CodProduto
     and ItemListaPreco.Empresa = New.Empresa
     and ItemListaPreco.CodLista <> New.CodLista;

--Gera a Pesquisa Auxiliar para os produtos
if (New.NumReferencia <> '') then
begin
   Execute Procedure QuebraProdutosPesquisa(New.CodProduto, 1);
end

end
^

ALTER trigger updateitemlistapreco
active after update position 0
AS
DECLARE VARIABLE QTDCASASVENDA INTEGER;
DECLARE VARIABLE TIPOPRECO INTEGER;
begin
/* FB */
Select First 1 QtdCasasVenda, TipoPreco
  From ParamControle
  Order By Empresa
  Into :QtdCasasVenda, :TipoPreco;
if (:QTDCASASVENDA is null) then
  QTDCASASVENDA = 2;
if (:TIPOPRECO is null) then
  TIPOPRECO = 0;

--Se o item foi marcado como principal, desmarca das outras listas
If (New.FlagPrincipal = 1) then
   Update ItemListaPreco
      Set FlagPrincipal = 0
----------nao mover o statustransacao pois nao precisa passar esse registro que foi alterado pela trigger
----------StatusTransacao = 1
    Where ItemListaPreco.CodProduto = New.CodProduto
      and ItemListaPreco.empresa = New.Empresa
      and ItemListaPreco.CodLista <> New.CodLista
      and Old.empresa = new.Empresa
      and Old.CodProduto = New.CodProduto
      and Old.CodLista = New.CodLista
      and New.FlagPrincipal = 1
      and Old.FlagPrincipal = 0
      and ItemListaPreco.FlagPrincipal = 1;

--Se o item foi marcado como promocao, desmarca das outras listas
If (New.FlagPromocao = 1) then
   Update ItemListaPreco
      Set FlagPromocao = 0
    Where ItemListaPreco.CodProduto = New.CodProduto
      and ItemListaPreco.empresa = New.Empresa
      and ItemListaPreco.CodLista <> New.CodLista
      and Old.empresa = new.Empresa
      and Old.CodProduto = New.CodProduto
      and Old.CodLista = New.CodLista
      and New.FlagPromocao = 1
      and Old.FlagPromocao = 0
      and ItemListaPreco.FlagPromocao = 1;

--Se marcou o flag de Alterar preço de custo nas outras listas, desmarca o flag das demais listas
--Obs: Tem que fazer o custo antes da venda para nao dar diferenca na venda
If (New.FlagCustoOutrasListas = 1) then
   Update ItemListaPreco
      Set FlagCustoOutrasListas = 0,
          ValorCustoBruto = New.ValorCustoBruto,
          PercDesconto1 = New.PercDesconto1,
          PercDesconto2 = New.PercDesconto2,
          PercDesconto3 = New.PercDesconto3,
          PercDesconto4 = New.PercDesconto4,
          PercDesconto5 = New.PercDesconto5,
          PercAcrescimo1 = New.PercAcrescimo1,
          PercAcrescimo2 = New.PercAcrescimo2,
          PercAcrescimo3 = New.PercAcrescimo3,
          PercFrete = New.PercFrete,
          PercICMCusto = New.PercICMCusto,
          PercDescontoAdicional = New.PercDescontoAdicional,
          ValorCustoLiquido = New.ValorCustoLiquido,
          AliqIPI = New.AliqIPI,
          FlagIPIVenda = New.FlagIPIVenda,
          --Ronaldo Chamado 391351
          PercSubTrib = New.PercSubTrib,
          PercDescontoNaoInc = New.PercDescontoNaoInc,
          CodMoeda = New.CodMoeda,
          ValorCotacaoMoeda = New.ValorCotacaoMoeda,
          StatusTransacao = 1
      Where ItemListaPreco.CodProduto = New.CodProduto
        and ItemListaPreco.empresa = New.Empresa
        and ItemListaPreco.CodLista <> New.CodLista;

--Altera o preço de venda nas outras listas se marcou a lista alterada
If (New.FlagVendaOutrasListas = 1) then
   Update ItemListaPreco
      Set FlagVendaOutrasListas = 0,
          MargemLucro1 = Case when (:TipoPreco = 0 and New.MargemLucro1 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro1),:QtdCasasVenda)) < 999
                              then  --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro1),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro1 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro1),:QtdCasasVenda)/ ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro1),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro2 = Case when (:TipoPreco = 0 and New.MargemLucro2 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro2),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro2),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro2 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro2),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then  --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro2),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro3 = Case when (:TipoPreco = 0 and New.MargemLucro3 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro3),:QtdCasasVenda)) < 999
                              then  --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro3),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro3 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro3),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro3),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro4 = Case when (:TipoPreco = 0 and New.MargemLucro4 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro4),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro4),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro4 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro4),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro4),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          MargemLucro5 = Case when (:TipoPreco = 0 and New.MargemLucro5 > 0)
                                   and (ItemListaPreco.ValorCustoLiquido / Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro5),:QtdCasasVenda)) < 999
                              then --Custo atual dividido pelo preço
                                   ItemListaPreco.ValorCustoLiquido /
                                   Rs_RoundDec((New.ValorCustoLiquido / New.MargemLucro5),:QtdCasasVenda)
                              When (:TipoPreco = 1 and ItemListaPreco.ValorCustoLiquido > 0 and New.MargemLucro5 > 0)
                                   and (Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro5),:QtdCasasVenda) / ItemListaPreco.ValorCustoLiquido) < 999
                              then --Preço Novo dividido pelo Custo Atual
                                   Rs_RoundDec((New.ValorCustoLiquido * New.MargemLucro5),:QtdCasasVenda)
                                   / ItemListaPreco.ValorCustoLiquido
                              else 0
                         End,
          StatusTransacao = 1
   Where ItemListaPreco.CodProduto = New.CodProduto
     and ItemListaPreco.empresa = New.Empresa
     and ItemListaPreco.CodLista <> New.CodLista;

--Gera a chave de pesquisa auxiliar para o produto
if (New.NumReferencia <> Old.NumReferencia) then
begin
  Execute Procedure QuebraProdutosPesquisa(New.CodProduto,1);
end

end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULAR_ICM (
    empresa integer,
    codproduto integer,
    codtributacao char(5),
    codentidade char(7),
    codoperacao integer,
    valortotal numeric(11,2),
    acrescimobaseicm numeric(11,2),
    acrescimobasesubtrib numeric(11,2),
    redbasesubtrib numeric(5,2),
    aliqipi numeric(4,2),
    codclassfiscal varchar(15),
    flagentrada integer,
    acrescimoredvenda numeric(11,2),
    codlistapreco integer,
    aliqicmfixo numeric(4,2),
    codsubtributaria integer,
    perreddespesa numeric(15,8),
    acrescimobaseipi numeric(11,2))
returns (
    aliqicm numeric(4,2),
    valorbaseicm numeric(11,2),
    valoricm numeric(11,2),
    valorisentoicm numeric(11,2),
    valoroutrasicm numeric(11,2),
    perreducaoicm numeric(5,2),
    valorbasesubtrib numeric(11,2),
    valorsubtrib numeric(11,2),
    valorbasesubtribcarga numeric(11,2),
    valorsubtribcarga numeric(11,2),
    perredbasesubtrib numeric(5,2),
    fatorredcusto numeric(15,8),
    fatorredvenda numeric(7,4),
    numcfop char(10),
    aliqpiscofins numeric(4,2),
    valorbasepiscofins numeric(11,2),
    aliqpis numeric(4,2),
    aliqcofins numeric(4,2),
    numcsticm varchar(3),
    numcstipi varchar(3),
    numcstpiscofins varchar(3),
    numcsosn varchar(3),
    natreceitapiscofins integer,
    natbasecalccredito smallint,
    indnaturezafrete smallint,
    valorbaseipi numeric(11,2),
    valorisentoipi numeric(11,2),
    valoroutrasipi numeric(11,2),
    aliqicmsst numeric(5,2),
    percmvaicmsst numeric(5,2),
    aliqcomplicm numeric(5,2),
    aliqcomplpis numeric(5,2),
    aliqcomplcofins numeric(5,2))
as
declare variable codestadoleitura char(2);
declare variable aempmestre char(7);
declare variable 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);
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))
  FROM Empresas
 WHERE Codigo = :Empresa
INTO :AEmpMestre;

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

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

-- Renato - 278440
SELECT FlagDeduzirDespNaoInclNaMargem,
--408846
  TipoMargemLiquida
FROM ConfiguracaoSistema
INTO :FlagDeduzirDespNaoInclNaMargem,
     :TipoMargemLiquida;


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

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

 Existe = NULL;

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

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


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

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

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


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


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

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


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


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

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

IF (GruFlagSubTributaria IS NULL) THEN
  GruFlagSubTributaria = 1;
IF (ProOrigem IS NULL) THEN
  ProOrigem = 0;
 
--Leitura da Lista de Preço
SELECT
  Ilp.PercAcrescimoAdm1, Ilp.PercAcrescimoAdm2, Ilp.PercAcrescimoAdm3,
  --Renato - 290579
  Ilp.PercSubTrib, Ilp.PercICMCusto,
  --408846
  Ilp.PercDesconto1,
  Ilp.PercDesconto2,
  Ilp.PercDesconto3,
  Ilp.PercDesconto4,
  Ilp.PercDesconto5,
  Ilp.PercAcrescimoInc1,
  Ilp.PercAcrescimoInc2,
  Ilp.PercAcrescimoInc3,
  Ilp.ValorCustoBruto,
  Ilp.ValorCustoLiquido
FROM ItemlistaPreco Ilp
  LEFT JOIN Empresas Emp ON Emp.Codigo = :Empresa
WHERE Ilp.CodLista=:CodListaPreco
  AND Ilp.CodProduto=:CodProduto
  AND Ilp.Empresa = Emp.EmpresaListaPreco
INTO :LisPercAcrescimoAdm1, :LisPercAcrescimoAdm2, :LisPercAcrescimoAdm3,
      --Renato - 290579
      :PercSubTribCusto, :PercICMCusto,
  --408846
  :LisPercDesconto1,
  :LisPercDesconto2,
  :LisPercDesconto3,
  :LisPercDesconto4,
  :LisPercDesconto5,
  :LisPercAcrescimo1,
  :LisPercAcrescimo2,
  :LisPercAcrescimo3,
  :LisValorCustoBruto,
  :LisValorCustoLiquido;


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


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

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

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

Existe = NULL;

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

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

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

Existe = NULL;

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

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

  CodTributacao = TriCodTributacaoSubTrib;
END

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

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

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

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

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


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


Existe = NULL;

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

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

  ORDER BY
    TipoPessoa
  INTO
    :EstAliqInterna,
    :RedBaseSubTrib;
END

IF (RedBaseSubTrib IS NULL) THEN
  RedBaseSubTrib = 0;

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

Existe = NULL;

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

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

   ORDER BY TipoPessoa
   INTO :EstAliqInterna , :RedBaseSubTrib;
END

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

--Ronaldo Chamado 372149
/*--364660
-- quando informada 999.99, tem que zerar para não calcular
--if (RedBaseSubTrib = 999.99) then
--  RedBaseSubTrib = 0;*/
                              

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

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

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

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

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



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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

--Ronaldo Chamado 383605
if (OprPerRedICM <> 99.99) then
begin
  IF (TriPerReducaoICM <> 0 AND ValorBaseIcm <> 0) THEN
  BEGIN
    ValorBaseIcm = ValorBaseIcm - ((ValorBaseIcm * TriPerReducaoICM) / 100);
    ValorBaseSubTribDestino = ValorBaseSubTribDestino - ((ValorBaseSubTribDestino * TriPerReducaoICM) / 100);
    CalcBaseSubTribDestino = CalcBaseSubTribDestino - ((CalcBaseSubTribDestino * TriPerReducaoICM) / 100);
  END

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

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

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

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

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

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

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

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

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

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

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


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


IF ((OprTipoSubTributaria IN(2,3)) AND (ClaFlagSubTributaria = 1) AND (GruFlagSubTributaria = 1)
   AND (OprTipoICM = 0) AND (EstFlagConvSub = 1)
   AND ((TriFlagSubTributaria = 1) OR (MVA <> 0) OR (SubMargemLucro <> 0))) THEN
BEGIN                          
  IF (OprTipoSubTributaria = 2) THEN
     ValorIsentoICM = ValorIsentoICM + ValorBaseICM;
  IF (OprTipoSubTributaria = 3) THEN
  BEGIN        
    --Eder - 383214 - Quando ha redução na base, considerar apenas a parte tributada para outras (St)
    --ValorOutrasICM = ValorOutrasICM + ValorBaseICM + ValorIsentoICM;
    --ValorIsentoICM = 0;
     if (ValorIsentoICM <> 0 and ValorBaseICM <> 0) Then
       ValorOutrasICM = ValorBaseICM;
     else      
     begin    
       ValorOutrasICM = ValorBaseICM + ValorIsentoICM;
       ValorIsentoICM = 0;
     end      
  END
  ValorBaseIcm = 0;
  ValorICM = 0;
END                                        

--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
     FatorRedCusto = (100 - TriAliqICM) / (100 - AliqICM);
  END

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

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

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

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

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

  IF (AliqPISCOFINS > 0) THEN
  begin
     --408846 FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);
     if (valorbasepiscofins = ValorTotal) then
       FatorRedVenda = FatorRedVenda - (CAST(AliqPISCOFINS AS NUMERIC(7,4)) / 100);
     else
     if (ValorTotal > 0) then
       FatorRedVenda = FatorRedVenda - Rs_RoundDec(((CAST(Valorpis + ValorCofins AS NUMERIC(11,4)) * 100) / CAST (ValorTotal AS NUMERIC(11,4))) / 100,4);
  end

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

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

  --Renato - 290579
  -- Se for uma venda fora do estado e os Percentuais de ICMS e SubTrib da Compra estiverem informados
  -- no Item da Lista de Preco vai abater o ICMS da compra no Custo.
  IF ((CidEmpCodEstado <> CidCodEstado) AND (PercICMCusto > 0) AND (PercSubTribCusto > 0)) THEN
  BEGIN
    --408846  
    if ((TipoMargemLucro = 0) and (TipoMargemLiquida = 0)) then
    begin
      Select ValorCusto
      From CalculaCustoLiquido (:Empresa, :LisValorCustoBruto,
            :LisPercDesconto1, :LisPercDesconto2, :LisPercDesconto3, :LisPercDesconto4,
            :LisPercDesconto5, :LisPercAcrescimo1, :LisPercAcrescimo2, :LisPercAcrescimo3,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      Into :ValorCustoCalc;

      ValorICMCustoCalc = Rs_Rounddec((PercICMCusto / 100.00) * ValorCustoCalc,2);
      FatorRedCusto = FatorRedCusto -  (ValorICMCustoCalc / LisValorCustoLiquido);
    end  
    else
      FatorRedCusto = FatorRedCusto - (PercICMCusto / 100);
  END
END

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

/*408846 - cálculo do pis/cofins foi movido mais para cima
--Eder - 303720            
AcrDespesasPisCOFINS = AcrescimoBaseICM;
if (OprFlagIPISobrePisCofins = 1) then --Calcula IPI sobre Pis e COFINS
  AcrDespesasPisCOFINS = AcrDespesasPisCOFINS + VAuxValorIPI;

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

*/

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

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

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

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

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


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

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

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

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

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

AliqICMSST    = EstAliqInterna;
PercMvaICMSST = MVA;


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

SUSPEND;

END
^

SET TERM ; ^

SET TERM ^ ;



ALTER TRIGGER TRIGGERDELETAPRODUTO 
ACTIVE AFTER DELETE POSITION 0
AS
begin
/* FB */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  --Ronaldo Chamado 408757
  Delete from ProdutosFci Where ProdutosFci.CodProduto = Old.codigo;

end
^


SET TERM ; ^


--Ronaldo Chamado 400942
CREATE TABLE ACUMULOOPERACAOBANCARIA(
  EMPRESA           INTEGER       DEFAULT 0   NOT NULL,
  MESANO            VARCHAR(7)    DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  CODENTIDADE       VARCHAR(7)    DEFAULT ''  NOT NULL COLLATE WIN_PTBR,
  VALORTOTALDEBITO  NUMERIC(11,2) DEFAULT 0   NOT NULL,
  VALORTOTALCREDITO NUMERIC(11,2) DEFAULT 0   NOT NULL,
  STATUSTRANSACAO    SMALLINT DEFAULT 0 NOT NULL,
  TRANSACAOEMPRESAS  VARCHAR(50) DEFAULT '' NOT NULL COLLATE WIN_PTBR
);

ALTER TABLE ACUMULOOPERACAOBANCARIA
ADD CONSTRAINT PK_ACUMULOOPERACAOBANCARIA PRIMARY KEY
(
  EMPRESA,
  MESANO,
  CODENTIDADE
);

#SE [
      SELECT *  FROM RDB$DATABASE
      WHERE (SELECT COUNT(*) FROM RDB$RELATION_FIELDS F
              WHERE F.RDB$RELATION_NAME = 'MARCAS'
                AND F.RDB$FIELD_NAME IN ('DESCRICAOSITE'))  = 0
    ]

ALTER TABLE MARCAS
ADD  DESCRICAOSITE VARCHAR(50) DEFAULT '' NOT NULL COLLATE WIN_PTBR;

UPDATE MARCAS
SET DESCRICAOSITE = '';

#FIMSE

#SE [
      SELECT *  FROM RDB$DATABASE
      WHERE (SELECT COUNT(*) FROM RDB$RELATION_FIELDS F
              WHERE F.RDB$RELATION_NAME = 'ATIVIDADES'
                AND F.RDB$FIELD_NAME IN ('TIPOORIGEMRESSARCIMENTOST'))  = 0
    ]

ALTER TABLE ATIVIDADES
ADD  TIPOORIGEMRESSARCIMENTOST SMALLINT DEFAULT 0 NOT NULL;

UPDATE ATIVIDADES
SET TIPOORIGEMRESSARCIMENTOST = 0;


#FIMSE





SET TERM ^ ;

ALTER PROCEDURE CALCULAR_PISCOFINS (
    empresa integer,
    codproduto integer,
    codentidade char(7),
    codtributacao char(5),
    codoperacao integer,
    codclassfiscal varchar(15),
    valortotal numeric(11,2),
    valoracrdespesas numeric(11,2),
    flagentrada smallint)
returns (
    valorbasepiscofins numeric(11,2),
    aliqpis numeric(4,2),
    valorpis numeric(11,2),
    aliqcofins numeric(4,2),
    valorcofins numeric(11,2),
    aliqcomplpis numeric(5,2),
    aliqcomplcofins numeric(5,2),
    numcstpiscofins varchar(3),
    natreceitapiscofins integer,
    natbasecalccredito smallint)
as
declare variable aempmestre char(7);
declare variable cstpiscofins smallint;
declare variable flagopcalcpiscofins smallint;
BEGIN
  /*********************                                                    
   VERSÃO 2.10
  *********************/

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

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

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

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

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

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

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

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

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

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

         ELSE Trib.AliqComplCofins               
       END,

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

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

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

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

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

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

  IF (NatReceitaPisCofins IS NULL) THEN NatReceitaPisCofins = 0;

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

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

  SUSPEND;
END
^

SET TERM ; ^


