Ir para conteúdo
  • Cadastre-se

dev botao

Correção - ACBrNFe.NotasFiscais.LoadFromString


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 1355 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa Tarde,

@Juliomar Marchetti, não sei seria para encaminhar para você, mas segue sugestão de correção do componente, 

caso não seja com vc, favor, citar a pessoa para conhecimento...

 

Ao utilizar o método ACBrNFe.NotasFiscais.LoadFromString me deparei com erros ao carregar propriedades dos Itens da NF-e.

 

Erro 1 ************

unit pcnNFeR;

Linha 650 

      (*N18*)NFe.Det[i].Imposto.ICMS.modBCST     := StrToModBCST(ok, Leitor.rCampo(tcStr, 'modBCST'));

Erro encontrado - Ao fazer a leitura do campo 'modBCST'  o valor é '', porém ao fazer a conversão, não existe a opção para vazio retornando um valor não nulo errado na propriedade.

Correção Aplicada: 

unit pcnConversao;

Linha 90 = Adicionado a propriedade 'dbisNenhum' para a classe TpcnDeterminacaoBaseIcmsST;

Linha 875 =

function modBCSTToStr(const t: TpcnDeterminacaoBaseIcmsST): string;
begin
  // 0 – Preço tabelado ou máximo sugerido;
  // 1 - Lista Negativa (valor);
  // 2 - Lista Positiva (valor);
  // 3 - Lista Neutra (valor);
  // 4 - Margem Valor Agregado (%);
  // 5 - Pauta (valor);
  // 6 - Valor da Operação
  result := EnumeradoToStr(t, ['0', '1', '2', '3', '4', '5', '6', ''],
    [dbisPrecoTabelado, dbisListaNegativa, dbisListaPositiva, dbisListaNeutra,
     dbisMargemValorAgregado, dbisPauta, dbisValordaOperacao, dbisNenhum]);
end;

Adicionado '' e dbisNenhum

 

Linha 889

function StrTomodBCST(out ok: boolean; const s: string): TpcnDeterminacaoBaseIcmsST;
begin
  result := StrToEnumerado(ok, s, ['0', '1', '2', '3', '4', '5', '6', ''],
    [dbisPrecoTabelado, dbisListaNegativa, dbisListaPositiva, dbisListaNeutra,
     dbisMargemValorAgregado, dbisPauta, dbisValordaOperacao, dbisNenhum]);
end;

Adicionado '' e dbisNenhum

 

Erro 2 ***************

Linha 668 

      (*N28*)NFe.Det[i].Imposto.ICMS.motDesICMS  := StrTomotDesICMS(ok, Leitor.rCampo(tcStr, 'motDesICMS'));

Erro encontrado - Ao fazer a leitura do campo 'motDesICMS'  o valor é '', porém ao fazer a conversão, não existe a opção para vazio retornando um valor não nulo errado na propriedade.

Correção Aplicada: 

unit pcnConversao;

Linha 93 = Adicionado a propriedade 'mdiNenhum' para a classe TpcnMotivoDesoneracaoICMS;

Linha 897

function motDesICMSToStr(const t: TpcnMotivoDesoneracaoICMS): string;
begin
    // 1 – Táxi;
    // 2 – Deficiente Físico;
    // 3 – Produtor Agropecuário;
    // 4 – Frotista/Locadora;
    // 5 – Diplomático/Consular;
    // 6 – Utilitários e Motocicletas da
    // Amazônia Ocidental e Áreas de
    // Livre Comércio (Resolução
    // 714/88 e 790/94 – CONTRAN e
    // suas alterações);
    // 7 – SUFRAMA;
    // 8 – Venda a Orgãos Publicos;
    // 9 – outros. (v2.0)
    // 10 – Deficiente Condutor (Convênio ICMS 38/12). (v3.1)
    // 11 – Deficiente não Condutor (Convênio ICMS 38/12). (v3.1)
    // 12 - Orgão Fomento
    // 16 - Olimpiadas Rio 2016
  result := EnumeradoToStr(t, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90', ''],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum]);
end;

 

Adicionado '' e mdiNenhum nas comparações;

 

Linha 923

function StrTomotDesICMS(out ok: boolean; const s: string): TpcnMotivoDesoneracaoICMS;
begin
  result := StrToEnumerado(ok, s, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90', ''],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum]);
end;

 

Adicionado '' e mdiNenhum nas comparações;

 

 

Segue unit para validação das alterações...

Att:

Gustavo Déo...

 

pcnConversao.pas

  • Fundadores
Postado
Em 10/03/2021 at 16:35, Gustavo Déo da Silva disse:

Ao utilizar o método ACBrNFe.NotasFiscais.LoadFromString me deparei com erros ao carregar propriedades dos Itens da NF-e.

Não compreendi, quais são exatamente os erros... ele causa um Exception ? Lê o XML de forma errada ?

poderia por favor, descrever melhor o problema ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
4 horas atrás, Daniel Simoes disse:

Não compreendi, quais são exatamente os erros... ele causa um Exception ? Lê o XML de forma errada ?

poderia por favor, descrever melhor o problema ?

Boa tarde,

Quando o xml não tem as tags modBCST e motDesICMS (NF do simples nacional) o componente retorna valor para nas propriedades, sendo que deveriam ficar '';

Obrigado!!!

 

  • Consultores
Postado

Boa tarde Gustavo,

O problema é o seguinte: o componente ACBrNFe não possui uma classe para cada CST e CSOSN , possui somente a classe ICMS.

E dentro dessa classe temos todos os campos que contempla todos os CST e CSOSN.

Os campos modBCST e motDesICMS não são do tipo string ou integer e sim um tipo que possui enumeradores como você notou ao editar a unit pcnConversao.

Sendo assim ao ler um XML se a rotina não encontra esses campos é atribuído o primeiro valor da lista de enumeradores.

A classe da NF-e no componente ACBrNFe que eu me recordo já faz uns bons anos que é assim.

No meu entendimento você pode contornar essa situação lendo somente os campos que pertence a um CST ou CSOSN para popular o banco de dados.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Fundadores
Postado

Mudar nos enumerados, adicionando um item antes, em teoria, não seria um problema...

A não ser que algum sistema esteja usando Inteiros e fazento Typecast para os enumerados.. ai sim, os valores ficariam todos errados...

A sugestão parece boa.. pois corrige uma informação que não fica condizente no componente, quando a mesma não existe.... mas pode introduzir o risco de quebra de código, mencionado acima...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Consultores
Postado

Boa tarde Daniel,

Concordo com você, inclusive o Gustavo teve o cuidado de incluir o novo enumerador por ultimo.

Por outro lado essa informação errada que fica nesses dois campos pode ser tratada do lado da aplicação do desenvolvedor, conforme a minha postagem acima.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado
1 hora atrás, Italo Giurizzato Junior disse:

Boa tarde Gustavo,

O problema é o seguinte: o componente ACBrNFe não possui uma classe para cada CST e CSOSN , possui somente a classe ICMS.

E dentro dessa classe temos todos os campos que contempla todos os CST e CSOSN.

Os campos modBCST e motDesICMS não são do tipo string ou integer e sim um tipo que possui enumeradores como você notou ao editar a unit pcnConversao.

Sendo assim ao ler um XML se a rotina não encontra esses campos é atribuído o primeiro valor da lista de enumeradores.

A classe da NF-e no componente ACBrNFe que eu me recordo já faz uns bons anos que é assim.

No meu entendimento você pode contornar essa situação lendo somente os campos que pertence a um CST ou CSOSN para popular o banco de dados.

Boa tarde @Italo Giurizzato Junior,

Obrigado pelo retorno...

Sim... a classe usa enumeradores, e eu editei esses enumerados, pois em outras propriedades que tb utilizam os enumerados foi feito um enumerador do tipo "vazio" para contemplar a falta da propriedade em um xml.

Fiz a correção e sugeri como melhoria, pois assim evito ficar fazendo if cst = xx then... dessa forma, eu poderia ler todos os campos do xml, os que não existe, me retorna vazio e não me causa nenhum problema.

Mas ok, se pra vcs não ficou viável fazer a alteração na unit, vou contornar de outra forma.

Obrigado.

 

Postado
Em 12/03/2021 at 16:28, Daniel Simoes disse:

Mudar nos enumerados, adicionando um item antes, em teoria, não seria um problema...

A não ser que algum sistema esteja usando Inteiros e fazento Typecast para os enumerados.. ai sim, os valores ficariam todos errados...

A sugestão parece boa.. pois corrige uma informação que não fica condizente no componente, quando a mesma não existe.... mas pode introduzir o risco de quebra de código, mencionado acima...

Boa tarde, 

Desculpe a insistência, mas a solução que eu propus, acho que seria de grande valia para a comunidade.

Pois eu vou trabalhar com a unit alterada, mas toda vez que eu atualizar o meu componente, terei que lembrar de fazer tudo novamente.

Seria muito difícil de a equipe do AcBr reavaliar este caso?

Obrigado..

Att.:

Gustavo....

  • Fundadores
  • Solution
Postado

O que estamos vendo.. é que vários pontos do ACBr, tem situações semelhantes... Aparentemente seria um 8 ou 80..

Mas como seria muito trabalhoso, revisar e editar todos os fontes, para que todos se comportem da mesma maneira que você está sugerindo... e como esses fontes já estão assim a anos sem outras reclamações de outros  usuários... então, talvez, mesmo parecendo mais correto, a modificação não faça sentido, sem uma revisão completa, de todos os fontes do ACBr

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
16 horas atrás, Daniel Simoes disse:

O que estamos vendo.. é que vários pontos do ACBr, tem situações semelhantes... Aparentemente seria um 8 ou 80..

Mas como seria muito trabalhoso, revisar e editar todos os fontes, para que todos se comportem da mesma maneira que você está sugerindo... e como esses fontes já estão assim a anos sem outras reclamações de outros  usuários... então, talvez, mesmo parecendo mais correto, a modificação não faça sentido, sem uma revisão completa, de todos os fontes do ACBr

Bom dia...

Por outro lado, já tem outros enumerator do sistema que já fazem esse tratamento, ex. csticms...
Acho que poderia ir corrigindo conforme aparecer solicitações, eu mesmo faria todas que eu encontrasse...

Eu estava fazendo a leitura do xml manualmente, achei que com o componente minimizaria a possibilidade de erro, pois temos uma comunidade muito grande utilizando ele. O componente é fantástico, mas com esses pequenos detalhes, tive problemas de validações. 

Se precisar de voluntário para ajudar a validação de enumerator, sou voluntário..

Obrigado.

Att.:

Gustavo Déo.

  • Moderadores
Postado

Q Tipo de erro, foi encontrado por você ? @Gustavo Déo da Silva

Segue rotina 

Function TModelEntityImportacaoNfe.Processar: Integer;
var
  i: Integer;
  lDaoFactory: iModelDaoFactory;
begin
  Result := 0;
  lDaoFactory := TModelDao.New.Fabrica;
  fNotaDanfe.DadosDanfe(fsComp);
  with fNotaDanfe.OBjDmDanfe.ACBrNFe1.NotasFiscais.Items[0].NFe do
  begin
    if lDaoFactory.DaoNfeFornecedor.BuscaChaveNfe(procNFe.chNFe)
      .ChaveNotaEntrada > 0 then
      raise exception.Create('Nota Fiscal Exportada');
    lDaoFactory.DaoNotaEntrada.ChaveNotaEntrada := 0;
    lDaoFactory.DaoNotaEntrada.CODIGODOCLIENTE :=
      ManterCodigodoCliente(emit.CNPJCPF);
    lDaoFactory.DaoNotaEntrada.NNOTA := Ide.nNF;
    lDaoFactory.DaoNotaEntrada.DATAEMI := Ide.dEmi;
    lDaoFactory.DaoNotaEntrada.BASEICMS := Total.ICMSTot.vBC;
    lDaoFactory.DaoNotaEntrada.VALICMS := Total.ICMSTot.vICMS;
    lDaoFactory.DaoNotaEntrada.BCST := Total.ICMSTot.vBCST;
    lDaoFactory.DaoNotaEntrada.ST := Total.ICMSTot.vST;
    lDaoFactory.DaoNotaEntrada.VALPRO := Total.ICMSTot.vProd;
    lDaoFactory.DaoNotaEntrada.FRETE := Total.ICMSTot.vFrete;
    lDaoFactory.DaoNotaEntrada.SEGURO := Total.ICMSTot.vSeg;
    lDaoFactory.DaoNotaEntrada.VALDESC := Total.ICMSTot.vDesc;
    lDaoFactory.DaoNotaEntrada.IMPIMPORTACAO := Total.ICMSTot.vII;
    lDaoFactory.DaoNotaEntrada.VALIPI := Total.ICMSTot.vIPI;
    lDaoFactory.DaoNotaEntrada.OUTRO := Total.ICMSTot.vOutro;
    lDaoFactory.DaoNotaEntrada.TOT_NOTA := Total.ICMSTot.vNF;
    lDaoFactory.DaoNotaEntrada.fcp := Total.ICMSTot.vFCP;
    lDaoFactory.DaoNotaEntrada.fcpSt := Total.ICMSTot.vFCPST;
    lDaoFactory.DaoNotaEntrada.Tranferido := 0;
    lDaoFactory.DaoNotaEntrada.ChaveNotaEntrada :=
      lDaoFactory.DaoNotaEntrada.Manutencao;
  end;
  //
  for i := 0 to fNotaDanfe.OBjDmDanfe.ACBrNFe1.NotasFiscais.Items[0]
    .NFe.Det.Count - 1 do
  begin
    with fNotaDanfe.OBjDmDanfe.ACBrNFe1.NotasFiscais.Items[0]
      .NFe.Det.Items[i] do
    begin
      lDaoFactory.DaoNotaEntradaItem.REGISTRO := 0;
      lDaoFactory.DaoNotaEntradaItem.eanforn := Prod.cProd;
      lDaoFactory.DaoNotaEntradaItem.cfop := StrToInt(Prod.cfop);
      lDaoFactory.DaoNotaEntradaItem.ChaveNotaEntrada :=
        lDaoFactory.DaoNotaEntrada.ChaveNotaEntrada;
      lDaoFactory.DaoNotaEntradaItem.EAN :=
        BuscaProduto(lDaoFactory.DaoNotaEntrada.CODIGODOCLIENTE, Prod.cProd,
        Prod.xProd);
      lDaoFactory.DaoNotaEntradaItem.QUANTIDADE := Converter(Prod.qCom);
      lDaoFactory.DaoNotaEntradaItem.UNITARIO :=
        NovoUntirario((Prod.vUnCom * Prod.qCom),
        lDaoFactory.DaoNotaEntradaItem.QUANTIDADE);
      lDaoFactory.DaoNotaEntradaItem.VDESCONTO := Prod.vDesc;
      lDaoFactory.DaoNotaEntradaItem.vFrete := Prod.vFrete;
      lDaoFactory.DaoNotaEntradaItem.vSeg := Prod.vSeg;
      lDaoFactory.DaoNotaEntradaItem.vOutro := Prod.vOutro;
      lDaoFactory.DaoNotaEntradaItem.ICMS_PICMS := Imposto.ICMS.pICMS;
      lDaoFactory.DaoNotaEntradaItem.ICMS_VICMS := Imposto.ICMS.vICMS;
      lDaoFactory.DaoNotaEntradaItem.PMVAST := Imposto.ICMS.PMVAST;
      lDaoFactory.DaoNotaEntradaItem.PICMSST := Imposto.ICMS.PICMSST;
      lDaoFactory.DaoNotaEntradaItem.VICMSST := Imposto.ICMS.VICMSST;
      lDaoFactory.DaoNotaEntradaItem.IPI := Imposto.IPI.pIPI;
      lDaoFactory.DaoNotaEntradaItem.VALIPI := Imposto.IPI.vIPI;
      lDaoFactory.DaoNotaEntradaItem.fcp := Imposto.ICMS.vFCP;
      lDaoFactory.DaoNotaEntradaItem.fcpSt := Imposto.ICMS.vFCPST;
      lDaoFactory.DaoNotaEntradaItem.TaxaFcp := Imposto.ICMS.pFCP;
      lDaoFactory.DaoNotaEntradaItem.Manutencao;
      lDaoFactory.DaoNotaEntrada.NAT := StrToInt(Prod.cfop);
    end;
    lDaoFactory.DaoNotaEntrada.Manutencao;
  end;
  Result := lDaoFactory.DaoNotaEntrada.ChaveNotaEntrada;
  lDaoFactory.DaoNfeFornecedor.ChaveNotaEntrada := Result;
  lDaoFactory.DaoNfeFornecedor.chaveNfe :=
    fNotaDanfe.OBjDmDanfe.ACBrNFe1.NotasFiscais.Items[0].NFe.procNFe.chNFe;
  lDaoFactory.DaoNfeFornecedor.compartilhado := fsComp;
  lDaoFactory.DaoNfeFornecedor.Persistir;
end;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

  • Moderadores
Postado

A rotina executa a leitura do xml e grava as informações nas devidas tabelas. Não existe um único IF.

Por que ? sei que quase todas propriedades , possuem um valor padrão :

    property orig: TpcnOrigemMercadoria read Forig write Forig default oeNacional;
    property CST: TpcnCSTIcms read FCST write FCST default cst00;
    property CSOSN: TpcnCSOSNIcms read FCSOSN write FCSOSN;
    property modBC: TpcnDeterminacaoBaseIcms read FmodBC write FmodBC default dbiMargemValorAgregado;

 

Dica, mantenha pcnConversao original.

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

  • Moderadores
Postado

Então, seria muito bom se pudesse :

De

  TpcnMotivoDesoneracaoICMS = (mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora, mdiDiplomaticoConsular,
                               mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos, mdiOutros, mdiDeficienteCondutor,
                               mdiDeficienteNaoCondutor, mdiOrgaoFomento, mdiOlimpiadaRio2016, mdiSolicitadoFisco );

Para

    TpcnMotivoDesoneracaoICMS = (mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora, mdiDiplomaticoConsular,
                               mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos, mdiOutros, mdiDeficienteCondutor,
                               mdiDeficienteNaoCondutor, mdiOrgaoFomento, mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum);

e

 

De 

// N28 - Motivo da desoneração do ICMS ***************************
function motDesICMSToStr(const t: TpcnMotivoDesoneracaoICMS): string;
begin
    // 1 – Táxi;
    // 2 – Deficiente Físico;
    // 3 – Produtor Agropecuário;
    // 4 – Frotista/Locadora;
    // 5 – Diplomático/Consular;
    // 6 – Utilitários e Motocicletas da
    // Amazônia Ocidental e Áreas de
    // Livre Comércio (Resolução
    // 714/88 e 790/94 – CONTRAN e
    // suas alterações);
    // 7 – SUFRAMA;
    // 8 – Venda a Orgãos Publicos;
    // 9 – outros. (v2.0)
    // 10 – Deficiente Condutor (Convênio ICMS 38/12). (v3.1)
    // 11 – Deficiente não Condutor (Convênio ICMS 38/12). (v3.1)
    // 12 - Orgão Fomento
    // 16 - Olimpiadas Rio 2016
  result := EnumeradoToStr(t, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90'],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco]);
end;

Para 

// N28 - Motivo da desoneração do ICMS ***************************
function motDesICMSToStr(const t: TpcnMotivoDesoneracaoICMS): string;
begin
    // 1 – Táxi;
    // 2 – Deficiente Físico;
    // 3 – Produtor Agropecuário;
    // 4 – Frotista/Locadora;
    // 5 – Diplomático/Consular;
    // 6 – Utilitários e Motocicletas da
    // Amazônia Ocidental e Áreas de
    // Livre Comércio (Resolução
    // 714/88 e 790/94 – CONTRAN e
    // suas alterações);
    // 7 – SUFRAMA;
    // 8 – Venda a Orgãos Publicos;
    // 9 – outros. (v2.0)
    // 10 – Deficiente Condutor (Convênio ICMS 38/12). (v3.1)
    // 11 – Deficiente não Condutor (Convênio ICMS 38/12). (v3.1)
    // 12 - Orgão Fomento
    // 16 - Olimpiadas Rio 2016
  result := EnumeradoToStr(t, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90', ''],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum]);
end;

 

Mas..

Existe a Unit pcnNFe.pas. que precisaria ser atualizada , com outro(s) De.. para .. :

De

property motDesICMS: TpcnMotivoDesoneracaoICMS read FmotDesICMS write FmotDesICMS;

Para

   Property motDesICMS: TpcnMotivoDesoneracaoICMS read FmotDesICMS write FmotDesICMS default mdiNenhum;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

  • Consultores
Postado
4 horas atrás, Gustavo Déo da Silva disse:

Bom dia...

Por outro lado, já tem outros enumerator do sistema que já fazem esse tratamento, ex. csticms...
Acho que poderia ir corrigindo conforme aparecer solicitações, eu mesmo faria todas que eu encontrasse...

Eu estava fazendo a leitura do xml manualmente, achei que com o componente minimizaria a possibilidade de erro, pois temos uma comunidade muito grande utilizando ele. O componente é fantástico, mas com esses pequenos detalhes, tive problemas de validações. 

Se precisar de voluntário para ajudar a validação de enumerator, sou voluntário..

Obrigado.

Att.:

Gustavo Déo.

Gustavo, o maior problema é a quebra do código alheio. Nós nos preocupamos com isso.

Veja bem, um monte de gente guarda no banco o valor do enumerado ao invés de guardar no banco o valor da tag. Daí na hora de converter de volta, qualquer alteração na ordem dos enumerados vai dar problema para os valores que já estão no BD.

Nem é tanto pela alteração do código em si, que faz algum sentido. Mas pela retrocompatibilidade.

 

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado
Em 16/03/2021 at 14:21, hleorj disse:

Então, seria muito bom se pudesse :

De


  TpcnMotivoDesoneracaoICMS = (mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora, mdiDiplomaticoConsular,
                               mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos, mdiOutros, mdiDeficienteCondutor,
                               mdiDeficienteNaoCondutor, mdiOrgaoFomento, mdiOlimpiadaRio2016, mdiSolicitadoFisco );

Para


    TpcnMotivoDesoneracaoICMS = (mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora, mdiDiplomaticoConsular,
                               mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos, mdiOutros, mdiDeficienteCondutor,
                               mdiDeficienteNaoCondutor, mdiOrgaoFomento, mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum);

e

 

De 


// N28 - Motivo da desoneração do ICMS ***************************
function motDesICMSToStr(const t: TpcnMotivoDesoneracaoICMS): string;
begin
    // 1 – Táxi;
    // 2 – Deficiente Físico;
    // 3 – Produtor Agropecuário;
    // 4 – Frotista/Locadora;
    // 5 – Diplomático/Consular;
    // 6 – Utilitários e Motocicletas da
    // Amazônia Ocidental e Áreas de
    // Livre Comércio (Resolução
    // 714/88 e 790/94 – CONTRAN e
    // suas alterações);
    // 7 – SUFRAMA;
    // 8 – Venda a Orgãos Publicos;
    // 9 – outros. (v2.0)
    // 10 – Deficiente Condutor (Convênio ICMS 38/12). (v3.1)
    // 11 – Deficiente não Condutor (Convênio ICMS 38/12). (v3.1)
    // 12 - Orgão Fomento
    // 16 - Olimpiadas Rio 2016
  result := EnumeradoToStr(t, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90'],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco]);
end;

Para 


// N28 - Motivo da desoneração do ICMS ***************************
function motDesICMSToStr(const t: TpcnMotivoDesoneracaoICMS): string;
begin
    // 1 – Táxi;
    // 2 – Deficiente Físico;
    // 3 – Produtor Agropecuário;
    // 4 – Frotista/Locadora;
    // 5 – Diplomático/Consular;
    // 6 – Utilitários e Motocicletas da
    // Amazônia Ocidental e Áreas de
    // Livre Comércio (Resolução
    // 714/88 e 790/94 – CONTRAN e
    // suas alterações);
    // 7 – SUFRAMA;
    // 8 – Venda a Orgãos Publicos;
    // 9 – outros. (v2.0)
    // 10 – Deficiente Condutor (Convênio ICMS 38/12). (v3.1)
    // 11 – Deficiente não Condutor (Convênio ICMS 38/12). (v3.1)
    // 12 - Orgão Fomento
    // 16 - Olimpiadas Rio 2016
  result := EnumeradoToStr(t, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '16', '90', ''],
    [mdiTaxi, mdiDeficienteFisico, mdiProdutorAgropecuario, mdiFrotistaLocadora,
     mdiDiplomaticoConsular, mdiAmazoniaLivreComercio, mdiSuframa, mdiVendaOrgaosPublicos,
     mdiOutros, mdiDeficienteCondutor, mdiDeficienteNaoCondutor, mdiOrgaoFomento,
     mdiOlimpiadaRio2016, mdiSolicitadoFisco, mdiNenhum]);
end;

 

Mas..

Existe a Unit pcnNFe.pas. que precisaria ser atualizada , com outro(s) De.. para .. :

De


property motDesICMS: TpcnMotivoDesoneracaoICMS read FmotDesICMS write FmotDesICMS;

Para


   Property motDesICMS: TpcnMotivoDesoneracaoICMS read FmotDesICMS write FmotDesICMS default mdiNenhum;

 

Boa tarde,

Não precisaria, pois ele faz isso na conversão dos dados, hj fica errado devido a falta do "nenhum".
Se vc não usa if nessas tag, qd vc recebe uma nf que não consta essas informações, vc vai armazenar dados errado, pois ele vai trazer um dado padrão na conversão que não existe na nf.

Muitos devem estar fazendo errado sem saber que está errado.

Att.:

 

Gustavo Déo

Em 16/03/2021 at 16:54, EMBarbosa disse:

Gustavo, o maior problema é a quebra do código alheio. Nós nos preocupamos com isso.

Veja bem, um monte de gente guarda no banco o valor do enumerado ao invés de guardar no banco o valor da tag. Daí na hora de converter de volta, qualquer alteração na ordem dos enumerados vai dar problema para os valores que já estão no BD.

Nem é tanto pela alteração do código em si, que faz algum sentido. Mas pela retrocompatibilidade.

 

Entendo a preocupação de compatibilidade com o código dos usuários, porém como foi adicionado por último no enumerator, não traria problema, pois estaria fora da faixa do valor gravado.

E se o pessoal está usando da forma que está hj, estão gravando informação errada.

Mas ok, entendi que vcs julgam não ser viável a alteração. Só tentei seguir o padrão que havia em outras conversões onde está previsto o "nenhum".

Att.:

 

Gustavo Déo

  • Consultores
Postado
6 minutos atrás, Gustavo Déo da Silva disse:

Entendo a preocupação de compatibilidade com o código dos usuários, porém como foi adicionado por último no enumerator, não traria problema, pois estaria fora da faixa do valor gravado.

Na verdade, colocar no final traria problemas ainda maiores quando a SEFAZ criasse outro valor...

8 minutos atrás, Gustavo Déo da Silva disse:

Mas ok, entendi que vcs julgam não ser viável a alteração. Só tentei seguir o padrão que havia em outras conversões onde está previsto o "nenhum".

Acho que a questão aqui é discutir se é viável. Estamos apenas expondo as preocupações.

 

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado
2 minutos atrás, EMBarbosa disse:

Na verdade, colocar no final traria problemas ainda maiores quando a SEFAZ criasse outro valor...

Acho que a questão aqui é discutir se é viável. Estamos apenas expondo as preocupações.

 

***Na verdade, colocar no final traria problemas ainda maiores quando a SEFAZ criasse outro valor...****

Não, pois estou usando '', problema se ela criasse o valor '', mas ela usa sempre valores. No caso dos outros desenvolvedores, não teria problema de validação, pois se alguém usa número, nada mudaria, e caso vier uma nova numeração da SEFAZ, não precisar ser em ordem para a validação funcionar; Se alguém usa a posição do enumerator, a posição anterior não seria alterada.

Pra mim isso é um "bug" no componente, pois está trazendo uma informação equivocada. Mas ok, já percebi que não tive apoio na alteração, me desculpe pelo transtorno e pelo tempo "perdido" de vcs.

Att.:

Gustavo Déo.

 

 

  • Este tópico foi criado há 1355 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.