Ir para conteúdo
  • Cadastre-se

Painel de líderes

Conteúdo popular

Showing content with the highest reputation on 06-02-2019 em todas as áreas

  1. Bom dia Houve um reunião na Sefaz e foi detalhado alguns topicos. Resumo da Reunião =============== 1) as mudanças faladas na reunião não afetarão o funcionamento dos softs q podem fazer as mudanças progressivas de acordo com a nessecidade. 2) Secretaria vai providenciar retratação do falado na nota do Jornal sobre SH 3) a comunicação do AC será direto com MFE. O Integrador ficará apenas com o envio dos pagamentos a cartão e com NFCe 4) novo driver Sefaz q faz comunicação direta será disponibilizado amanhã. Inclusive com correção de scanner de portas o q causava duplicidade de cupons 5) segunda serão atualizados de forma progressiva os integradores para um novo WebService 6) novo Integrador apartir do dia 21/02/19 disponibilizado no site 7) as mudanças para nova comunicação será feita pelas SH a medida q elas decidirem atualizar nos seus clientes ? A última IN terá prazo prorrogado 9) o MFE será obrigatório apenas para empresas q faturaram no ano anterior apartir de R$ 250.000,00 10) Elgin prometeu que de 10/15 dias está resolvido todos os probs de violação dos MFE. Alem do q estão chegando em torno de 700 MFE só pra troca 11) os MFE vão se comunicar por meio de Ethernet dispensando a USB. Somente será necessário para alimentação no caso do Tanca
    6 pontos
  2. Olá pessoal, Para quem ainda não conhece, o Lazarus/FPC é uma poderosa IDE e compilador da Linguagem Object Pascal, muito semelhante ao Delphi, e desenvolvido totalmente em Código Aberto... ( Saiba mais em: https://www.lazarus-ide.org/index.php?page=about ) Hoje ocorreu o lançamento da versão 2.0.0 do Lazarus... O anúncio oficial, pode ser lido no fórum do Lazarus: http://forum.lazarus-ide.org/index.php/topic,44161.0.html Essa versão ainda usa o FPC (Free Pascal Compiler), na versão 3.0.4, então não devemos ter mudanças brusca na compilação dos projetos existentes... Você pode baixar o Lazarus 2.0, na página oficial do Projeto: https://www.lazarus-ide.org/ (Observe porém, que o Download sugerido, provavelmente será de um Compilador para Windows 64... O que muitas vezes não é o desejado, para manter a compatibilidade com as diferentes versões de Windows e as DLLs existentes) Portanto, recomendo selecionar a versão 32 Bits, conforme destacado, na imagem abaixo... Se você quer realmente gerar aplicações 64 bits, ainda poderá fazer um Cross-compiling , baixando um instalador complementar em: https://sourceforge.net/projects/lazarus/files/Lazarus Windows 32 bits/Lazarus 2.0.0/ O ACBr tem um ótimo suporte ao Lazarus/FPC, isso porque a maioria dos Consultores do Projeto ACBr, usam Lazarus/FPC como principal IDE para Desenvolvimento, e todos os nosso projetos, como: ACBrMonitorPLUS, e ACBrLib, são desenvolvidos em Lazarus/FPC. Abaixo segue um Screen Shot da minha IDE de trabalho (clique para aumentar) Quer conhecer mais aplicações desenvolvidas em Lazarus ? Veja esse Link: http://wiki.freepascal.org/Lazarus_Application_Gallery
    5 pontos
  3. http://www.sped.fazenda.mg.gov.br/spedmg/noticias/Publicada-RESOLUCAO-N-5234-DE-5-DE-FEVEREIRO-DE-2019-que-estabelece-a-obrigatoriedade-de-emissao-da-Nota-Fiscal-de-Consumidor-Eletronica-NFC-e-/ http://www.fazenda.mg.gov.br/empresas/legislacao_tributaria/resolucoes/2019/rr5234_2019.htm RESOLUÇÃO Nº 5.234 DE 5 DE FEVEREIRO DE 2019 (MG de 06/02/2019) Estabelece obrigatoriedade de emissão da Nota Fiscal de Consumidor Eletrônica - NFC-e. O SECRETÁRIO DE ESTADO DE FAZENDA, no uso da atribuição que lhe confere o inciso III do § 1º do art. 93 da Constituição Estadual e tendo em vista o disposto no art. 36-B da Parte 1 do Anexo V do Regulamento do ICMS - RICMS -, aprovado pelo Decreto nº 43.080, de 13 de dezembro de 2002, RESOLVE: Art. 1º - Esta resolução estabelece a obrigatoriedade de emissão da Nota Fiscal de Consumidor Eletrônica - NFC-e -, prevista no inciso XXXVIII do art. 130 do Regulamento do ICMS - RICMS -, aprovado pelo Decreto nº 43.080, de 13 de dezembro de 2002. Parágrafo único - Além do disposto nesta resolução, o contribuinte obrigado à emissão da NFC-e deverá observar o disposto na Seção III do Capítulo IV da Parte 1 do Anexo V do RICMS e no Ajuste SINIEF 19, de 9 de dezembro de 2016. Art. 2º - Para acobertar as operações de varejo com entrega imediata ou em domicílio, destinadas a consumidor final não contribuinte do ICMS, exceto quando se tratar de comércio eletrônico (e-commerce) nas operações de venda pela internet, em substituição à Nota Fiscal de Venda a Consumidor, modelo 2, e ao Cupom Fiscal emitido por equipamento Emissor de Cupom Fiscal - ECF -, deverá ser emitida a NFC-e a partir de: I - 1º de março de 2019, para os contribuintes que se inscreverem no Cadastro de Contribuintes deste Estado a contar da referida data; II - 1º de abril de 2019, para os contribuintes: a) enquadrados no código 4731-8/00 da Classificação Nacional de Atividades Econômicas - CNAE - (comércio varejista de combustíveis para veículos automotores); b) cuja receita bruta anual auferida no ano-base 2018 seja superior ao montante de R$100.000.000,00 (cem milhões de reais), observado o disposto nos §§ 4º a 6º; III - 1º de julho de 2019, para os contribuintes cuja receita bruta anual auferida no ano-base 2018 seja superior ao montante de R$15.000.000,00 (quinze milhões de reais), até o limite máximo de R$100.000.000,00 (cem milhões de reais), observado o disposto nos §§ 4º a 6º; IV - 1º de outubro de 2019, para os contribuintes cuja receita bruta anual auferida no ano-base 2018 seja superior ao montante de R$ 4.500.000,00 (quatro milhões e quinhentos mil reais), até o limite máximo de R$15.000.000,00 (quinze milhões de reais), observado o disposto nos §§ 4º a 6º; V - 1º de fevereiro de 2020, para: a) os contribuintes cuja receita bruta anual auferida no ano-base 2018 seja inferior ou igual ao montante de R$ 4.500.000,00 (quatro milhões e quinhentos mil reais), observado o disposto nos §§ 4º a 6º; b) os demais contribuintes. § 1º - Fica facultada, a partir de 1º de março de 2019, ao contribuinte que ainda não esteja alcançado pela obrigação de emissão da NFC-e, efetuar a opção pela emissão da NFC-e, mediante credenciamento, observado o disposto no art. 5º. § 2º - Após o credenciamento para emissão da NFC-e ou, iniciado o período de obrigatoriedade de que tratam os incisos do caput, fica vedada: I - a emissão de Nota Fiscal de Venda a Consumidor, modelo 2, devendo ser cancelado o estoque remanescente, observados os procedimentos previstos na legislação, exceto na hipótese prevista no § 3º; II - a concessão de autorização para utilização de equipamento Emissor de Cupom Fiscal - ECF. § 3º - A vedação de que trata o inciso I do § 2º não se aplica, até 28 de fevereiro de 2020, na hipótese de utilização de Nota Fiscal de Venda a Consumidor, modelo 2, exclusivamente para acobertar as operações realizadas fora do estabelecimento, nos termos do Capítulo V da Parte 1 do Anexo IX do RICMS. § 4º - Para fins da obrigatoriedade de que trata esta resolução, considera-se receita bruta anual relativa a todos os estabelecimentos da empresa localizados no Estado de Minas Gerais, o produto da venda de bens e serviços nas operações por conta própria, o preço dos serviços prestados, mesmo que não sujeitos ao ICMS, e o resultado auferido nas operações por conta alheia, não incluído o Imposto sobre Produtos Industrializados - IPI -, as vendas canceladas e os descontos incondicionais concedidos. § 5º - Caso o período de atividade do contribuinte seja inferior a um ano, o limite de receita bruta, para os fins da obrigatoriedade de que trata esta resolução, será apurado proporcionalmente ao número de meses de exercício da atividade, considerado o ano-base de 2018. § 6º - A redução do faturamento em ano civil posterior a 2018 não desobriga o contribuinte da emissão da NFC-e na data de obrigatoriedade prevista nos incisos do caput. Art. 3º - Relativamente ao ECF, deverá ser observado o seguinte: I - fica facultado ao contribuinte a utilização do ECF já autorizado, por até nove meses, contados da data a que se refere o caput do § 2º do art. 2º, ou até que finde a memória do equipamento, o que ocorrer primeiro; II - enquanto possuir ECF autorizado para uso neste Estado, o contribuinte deverá observar todos os procedimentos relativos a sua utilização previstos na legislação, tais como uso de PAF-ECF, geração e guarda de documentos, escrituração e cessação de uso; III - em até sessenta dias após o prazo previsto no inciso I, caso o contribuinte não tenha providenciado a cessação de uso do ECF, este terá sua autorização de uso cancelada, devendo o contribuinte, após a cessação de uso do equipamento ou o cancelamento da autorização de uso, manter, pelo período decadencial, o dispositivo de armazenamento de dados do equipamento, para apresentação ao Fisco quando exigido. § 1º - A Nota Fiscal de Venda a Consumidor, modelo 2, emitida após as datas previstas nos §§ 2º e 3º do art. 2º, e o Cupom Fiscal emitido depois da data prevista no inciso I do caput serão considerados falsos para todos os efeitos fiscais, fazendo prova apenas a favor do Fisco, conforme previsto no art. 135 do RICMS. § 2º - Após a cessação de uso, o ECF poderá ser utilizado para impressão do Documento Auxiliar da NFC-e - DANFE NFC-e. Art. 4º - A obrigatoriedade de emissão de NFC-e prevista nesta resolução não se aplica ao Microempreendedor Individual - MEI -, de que trata o art. 18-A da Lei Complementar Federal nº 123, de 14 de dezembro de 2006. Art. 5º - Para emissão de NFC-e, o contribuinte deverá credenciar-se junto à SEF-MG, conforme orientações disponíveis no “Portal SPED MG” (http://www.sped.fazenda.mg.gov.br/spedmg /nfce/credenciamento/). § 1º - O credenciamento para emissão da NFC-e: I - é irrevogável e irretratável, devendo ser observado o disposto no § 2º do art. 2º; II - poderá ser realizado de ofício por Ato da SEF. § 2º - Quando do credenciamento, será fornecido ao contribuinte o Código de Segurança do Contribuinte - CSC -, de seu exclusivo conhecimento, que deverá ser utilizado para garantir a autoria e a autenticidade do DANFE NFC-e. Art. 6º - Esta resolução entra em vigor na data de sua publicação. Belo Horizonte, aos 5 de fevereiro de 2019; 231º da Inconfidência Mineira e 198º da Independência do Brasil. GUSTAVO DE OLIVEIRA BARBOSA Secretário de Estado de Fazenda
    5 pontos
  4. Foto por David Siglin em Unsplash. Olá pessoal, É bom quando encontramos uma ferramenta que facilita ou melhora nosso trabalho, não? Todos devem ter notado que ultimamente temos enviado vários commits ao SVN de remoção de warnings e hints, muitas vezes mencionando a ferramenta FixInsight. Para quem não conhece, essa ferramenta faz uma análise do seu código e aponta possíveis erros e sugere otimizações. Ela é uma ferramenta muito boa, tanto que foi comprada pela TMS e se tornou TMS FixInsight. Já tem um tempo que conheço a ferramenta e sempre tive o desejo de rodá-la em todo o código do ACBr. Mas devido ao tempo não tinha sido possível. Depois de um incentivo (valeu @Waldir Paim), eu resolvi baixar a versão trial e fazer isso. E que bom que fiz. Gostaríamos de compartilhar com vocês algumas coisas que encontramos no nosso código com a ajuda dessa ferramenta. Encontrando pequenos problemas num código gigante Vamos começar por um código que estava no ACBrValidador. Vejam esse código, onde a função ValidarCEP de baixo chama a função ValidarCEP de cima, e tente encontrar um problema: function ValidarCEP(const ACEP, AUF: String): String; begin Result := ValidarDocumento( docCEP, ACEP, AUF); end; function ValidarCEP(const ACEP: Integer; AUF: String): String; begin ValidarCEP( FormatarCEP(ACEP), AUF ); end; Conseguiu ver o problema? Essa função nunca retornaria que um CEP é inválido se você passasse o CEP como inteiro. Precisava de um “Result := ” no início. Simples? Nem tanto quando lembramos do tamanho do projeto ACBr. Temos mais de 200 componentes e mais de 779 mil linhas de código, contribuídos por dezenas ou talvez centenas de programadores, embora a nossa equipe de commiters seja realmente pequena. Só a unit ACBrValidador.pas em questão tem atualmente cerca de 2070 linhas. Não fica muito mais fácil quando uma ferramenta aponta pra você? [FixInsight Warning] ACBrValidador.pas(294): W521 Return value of function 'ValidarCEP' might be undefined Vamos a outro exemplo no pacote ACBrSerial, componente ACBrECF: [FixInsight Warning] ACBrECFDaruma.pas(4638): W503 Assignment right hand side is equal to its left hand side Veja o código (só a parte interessante): else if StrToIntDef(fsNumVersao, -1) >= 345 then begin RetCmd := EnviaComando( ESC + #240 ); RetCmd := Copy(RetCmd, 92, Length(RetCmd)); RetCmd := RetCmd; //<--- Viu aqui??? for A := 0 to fpAliquotas.Count-1 do begin fpAliquotas[A].Total := RoundTo( StrToFloatDef(Copy(RetCmd,(A*14)+1,14),0) / 100, -2 ); end; end; end; Uma linha que não faz absolutamente nada a não ser gastar espaço, memória e CPU. Uma linha desnecessária a menos no código. E você consegue encontrar um no seu aplicativo código que nunca será executado? Ainda no mesmo pacote, veja esse exemplo:  [FixInsight Warning] ACBrECFDataRegis.pas(1838): W509 Unreachable code Nesse código: if (fsArqPrgBcoTXT <> '') and (not FileExists( fsArqPrgBcoTXT )) then begin Msg := ACBrStr( 'Arquivo '+fsArqPrgBcoTXT+' não encontrado. '+ 'Valores padrões serão utilizados.' ) ; raise EACBrECFErro.Create( Msg ); fsArqPrgBcoTXT := '' ; //Essa linha nunca vai ser executada porque tem um raise acima. end ; Mais uma vez, tente imaginar procurar esse problema num projeto tão grande. Não é facilmente percebido se você não tiver olhos treinados e estiver procurando problemas. Vamos a outro exemplo ainda no componente ACBrECF:  [FixInsight Warning] ACBrECFEscECF.pas(1222): W517 Variable 'CHK' hides a class field, method or property Veja esse código: procedure TACBrECFEscECFResposta.SetResposta(const AValue: AnsiString); Var Soma, I, F, LenCmd : Integer ; CHK : Byte ; begin O problema desse código é que ele confunde uma variável local (CHK) com uma propriedade da classe (TACBrECFEscECFResposta.CHK). É preciso analisar todo código em cada lugar que isso acontece para ter certeza quando você está se referindo a propriedade e quando é a variável. Imagine se você confunde uma com a outra. Uma hora você pensa que sua variável está recebendo valores estranhos. Outra hora você pensa que sua propriedade não está sendo atualizada. Nesse caso específico, a variável foi renomeada para vCHK evitando a confusão com a propriedade CHK. O importante é que quando você for ler o código, não precise ficar pensando “Isso aqui é uma variável ou uma propriedade?”. Veja outro exemplo, agora no ACBrSMS: [FixInsight Warning] ACBrSMSClass.pas(192): W511 Object 'ListaSMS' created in TRY block begin try Self.Clear; if not FileExists(APath) then raise EACBrSMSException.CreateFmt('Arquivo "%s" não encontrado.', [APath]); ListaSMS := TStringList.Create; ListaSMS.LoadFromFile(APath); if ListaSMS.Count = 0 then Exit; //(bla bla bla...) finally FreeAndNil(ListaSMS); end; Não é apropriado esse código. O correto é mover a criação do objeto para fora do try..finally. Pense bem, se o objeto não for construído, você não quer que ele seja destruído. A mensagem ajudou a perceber também que esse bloco poderia ser escrito de outra maneira. Aquele raise não precisava estar dentro do try..finally. Evitando problemas futuros Rodando no pacote ACBrOpenSSL tivemos a seguinte mensagem no componente ACBrEAD: [FixInsight Optimization] ACBrEAD.pas(268): O804 Method parameter 'AChavePublicaOpenSSL' is declared but never used Quer dizer, parâmetro ‘AchavePublicaOpenSSL’ declarado mas não utilizado. Veja abaixo a a parte importante da função: function TACBrEAD.ConverteChavePublicaParaOpenSSH( const AChavePublicaOpenSSL: String): String; Var Buffer, Modulo, Expoente: AnsiString; {...} begin // https://www.netmeister.org/blog/ssh2pkcs8.html CalcularModuloeExpoente(Modulo, Expoente); Buffer := EncodeBufferSSH('ssh-rsa') + EncodeHexaSSH(Expoente) + EncodeHexaSSH('00'+Modulo); Result := 'ssh-rsa '+ EncodeBase64(Buffer); end; É estranho esse método ConverteChavePublicaParaOpenSSH não utilizar o parâmetro da chavePública. Qualquer pessoa que visse o método e tentasse chamar passando a chave pública não teria o resultado desejado. Analisando o código melhor vemos que o componente lê a chave pública por meio do método “LerChavePublica”. Nesse caso o correto seria remover o parâmetro para que não haja nenhuma confusão. E essa mensagem no TACBrBALToledo2090: [FixInsight Warning] ACBrBALToledo2090.pas(107): W508 Variable is assigned twice successively if (Length(wStrListDados[1]) = 16) then wDecimais := 1000; {APENAS BLOCO PROCESSADO} wResposta := wStrListDados[1]; //<---- sobreposto pela linha seguinte wResposta := Copy(wStrListDados[1], 5, 7); if (Length(wResposta) <= 0) then Exit; Veja que os dados de uma linha é sobreposta pela outra. O compilador nunca daria um aviso sobre isso. Mais dois exemplos de mensagens e o código a seguir: [FixInsight Warning] ACBrEscEpsonP2.pas(97): W514 Loop iterator could be out of range (missing -1?) [FixInsight Warning] ACBrEscEpsonP2.pas(100): W514 Loop iterator could be out of range (missing -1?) For I := 0 to Length(cTAGS_BARRAS) do TagsNaoSuportadas.Add( cTAGS_BARRAS[I] ); For I := 0 to Length(cTAGS_ALINHAMENTO) do TagsNaoSuportadas.Add( cTAGS_ALINHAMENTO[I] ); Essa eu não sei como não foi detectada antes. Por algum motivo não está sendo emitida a mensagem estouro quando o valor de I chega a 16 no primeiro caso e 3 no segundo. Encontrando erros gerados por Ctrl+C..Ctrl+V No pacote ACBrPAF veja a mensagem gerada: [FixInsight Optimization] ACBrPAF_T_Class.pas(137): O804 Method parameter 'ACampo2' is declared but never used function OrdenarT2(const ACampo1, ACampo2: Pointer): Integer; var Campo1, Campo2: String; begin Campo1 := FormatDateTime('YYYYMMDD', TRegistroT2(ACampo1).DT_MOV) + TRegistroT2(ACampo1).TP_DOCTO + TRegistroT2(ACampo1).SERIE + TRegistroT2(ACampo1).NUM_ECF; Campo2 := FormatDateTime('YYYYMMDD', TRegistroT2(ACampo1).DT_MOV) + TRegistroT2(ACampo1).TP_DOCTO + TRegistroT2(ACampo1).SERIE + TRegistroT2(ACampo1).NUM_ECF; Result := AnsiCompareText(Campo1, Campo2); end; Essa função é utilizada para ordenar os registros T2 do PAF. Mas veja que ela compara o registro “ACampo1” com ele mesmo. Suspeita: Ctrl+C e Ctrl+V... Quem nunca??... Outra situação diferente, mas relacionada com ordenação apareceu no ACBrSintegra. Na verdade 4 situações no ACBrSintegra, semelhantes entre si. Vou mostrar apenas uma, mas dessa vez a mensagem do FixInsight fica pra depois. Vamos a um jogo dos sete erros entre os ifs e else no código abaixo: function Sort60A(Item1, Item2: Pointer): Integer; var witem1, witem2 : TRegistro60A; begin witem1 := TRegistro60A(Item1); witem2 := TRegistro60A(Item2); if witem1.Emissao>witem2.Emissao then begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end else if witem1.Emissao = witem2.Emissao then begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end else begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end; end; Conseguiu encontrar os erros? Bem, se você procurou diferenças, não deve ter encontrado nada. E não existe mesmo. Veja a mensagem da ferramenta: [FixInsight Warning] ACBrSintegra.pas(3410): W507 THEN statement is equal to ELSE statement São dois if e um else pra fazer a mesma coisa... A correção foi remover o IFs e ELSE.  Agora vamos ao pacote ACBrSPED. Depois de remover muitos e muitos parâmetros desnecessários apontados pelo FixInsight, veja esse código: function CodAjToStr(const AValue: TACBrCodAj): string; begin if AValue = codAjAcaoJudicial then Result := '01' else if AValue = codAjAcaoJudicial then Result := '02' else if AValue = codAjLegTributaria then Result := '03' else if AValue = codAjEspRTI then Result := '04' else if AValue = codAjOutrasSituacaoes then Result := '05' else if AValue = codAjEstorno then Result := '06'; end; A mensagem é a seguinte: [FixInsight Warning] ACBrEPCBlocos.pas(2071): W512 Odd ELSE-IF condition (review lines 2071 and 2073) Viu lá? Os dois primeiros ifs estão comparando AValue com o mesmo valor, "codAjAcaoJudicial". O segundo deveria ser "codAjProAdministrativo". Provavelmente mais um Ctrl+C..Ctrl+V. Mensagens para otimização de código Nem todas as mensagens geradas são de erros. Algumas são mensagens de otimização. Muitos dos commits que temos feito estão relacionados a uma mensagem como estas abaixo: [FixInsight Optimization] ACBrSATClass.pas(776): O801 CONST missing for unmodified string parameter 'CNPJvalue' [FixInsight Optimization] ACBrSATClass.pas(776): O801 CONST missing for unmodified string parameter 'assinaturaCNPJs' Ela pode ser gerada numa função como essa: function TACBrSATClass.AssociarAssinatura( CNPJvalue, assinaturaCNPJs : AnsiString) : String ; begin ...// um código que não altera nenhum dos parâmetros citados end; Essas mensagens estão dizendo que os parâmetros 'CNPJvalue' e ‘assinaturaCNPJs’ do tipo string não estão sendo alterados dentro da função a que eles pertencem. Nesse caso é bem provável que os parâmetros devessem ter um prefixo CONST na sua declaração, como abaixo: function TACBrSATClass.AssociarAssinatura(const CNPJvalue, assinaturaCNPJs : AnsiString) : String ; begin ...// um código que não altera nenhum dos parâmetros citados end; Não vou entrar em muitos detalhes sobre isso, mas usar CONST tem alguns benefícios, principalmente em caso de strings: A execução é mais rápida, porque o compilador pode otimizar o código. No caso de strings, não tem contagem de referências; O compilador garante que você não vai alterar os parâmetros passados gerando um efeito colateral indesejado em quem chamou as funções; O código fica mais legível, porque você pode ler que a intenção é não alterar o parâmetro passado; Como os parâmetros são imutáveis, pode tornar o código mais ThreadSafe; Se quer saber um pouco mais sobre isso, recomendo os seguintes links: All hail the “const” parameters! Is the use of ‘const’ dogmatic or rational? Concluindo... Bom pessoal, ainda temos bastante pra fazer. Contudo, queremos dizer que o FixInsight tem nos ajudado melhorar nosso código. Ficamos tão satisfeitos que entramos em contato com a TMS e eles generosamente nos cederam uma licença da versão Pro pra continuar nosso trabalho. Muito obrigado TMS. Agora, se você quer nossa opinião, essa é uma ferramenta altamente recomendada e está disponível pra toda versão do Delphi a partir do Delphi 2006. Se você tem alguma dúvida, baixe a versão trial e comece agora mesmo a usar no seu código. A versão trial limita as mensagens a 5 por units e funciona por 30 dias. Mas é o suficiente pra se perceber como é muito útil, como aconteceu com a gente. Quer um passo a passo em como utilizá-la? Veja o próximo post logo abaixo.
    4 pontos
  5. Acho importante notar que o componente não é específico para busca no site dos Correios, embora esse seja o mais utilizado. Só se você fizer vários acessos simultâneos. O componente não é feito para isso. Não é invasão, nem mesmo entre aspas, porque tudo que é acessado é público e acessível por um browser. Não há quebra de senhas, captchas ou qualquer limitação imposta pelos correios ao seu sistema público quando você faz acesso por meio do componente. Não há garantias, implícitas ou explícitas, que uma mudança no sistema ou página dos Correios (e/ou outros sites semelhantes) não venha a deixar o componente disfuncional. Mas o uso do componente por si só não deixará o sistema dos correios inativo ou não operacional. Não implementamos nada que pudesse causar problemas ao sistema ou site dos correios ou qualquer outro site usado como serviço de um componente ACBr. Não entendo esse questionamento. Não existe uma instrução ou autorização para que você use o site dos correios. Existe? O componente não tem uma base geral de CEP's. Ele não permite buscas próprias ou offline. Ele é apenas para buscas individuais e on-line, na mesma forma disponibilizada gratuitamente pelos correios e outros sites.
    3 pontos
  6. Deu tudo certo agora, mudei o espacamento entre linhas para 40, ImprimeLogoLateral para false, e ImprimeQRCodeLateral deixe em true (padrao) para seguir o novo manual de orientacao Obrigado pela ajuda
    3 pontos
  7. Senhores Eu procedi conforme sugestão do Sr. Daniel. Baixei as Tabelas do IBPT , converti e atualizei nos clientes via script. Acredito que podem encerrar este tópico. Grato
    3 pontos
  8. Ao que parece está configurado para imprimir o logo e qr code lateralmente, se não quer imprimir assim tem que desativar essas opções. Veja este tópico para mais informações
    3 pontos
  9. Esse erro geralmente é firmware da impressora. De acordo com o site da bematech: "O modelo de impressora da Bematech que faz a impressão nativa do código QR é MP-4200 TH, sendo que sua versão deve ser a 1.3 ou superior (firmware)."
    3 pontos
  10. Instalando o FixInsight para utilizar no seu projeto Para utilizar o TMS FixInsight no seu projeto, primeiro faça o download da versão trial no site oficial. O FixInsight está disponível para todas as versões do Delphi a partir do Delphi 2006. A versão pro possui linha de comando, permitindo você executar a ferramenta mesmo quando o Delphi não está aberto. Isso permite você integrar com seu sistema de Build ou sistema de integração contínua. A instalação é muito simples, bastando escolher em qual versão do Delphi você quer instalar. Após a instalação as seguintes entradas vão aparecer no menu Project: E também no "Project Manager" (clique com botão direito no projeto): A entrada "FixInsight Settings..." configura a ferramenta e pode habilitar ou desabilitar as mensagens geradas. Ela abre uma tela como essa: Na imagem acima você pode observar que a mensagem "C101 Method '%s' is too long (%d lines)" está selecionada e permite a configuração de quantas linhas para você um método, function ou procedure não deve exceder. Dá pra ver também que as mensagens C102 e C103 estão desabilitadas e assim não geram avisos. A entrada "Run FixInsight for unit1.pas" executa a ferramenta para a unit aberta atualmente (neste caso Unit1.pas). A entrada "Run FixInsight" executa a ferramenta no projeto atual inteiro. Rodando o FixInsight no seu projeto Como mencionado, é por meio da entrada 'Run FixInsight" que você executa a ferramenta no seu projeto. Então basta abrir o seu projeto e executar por meio do menu Project -> Run FixInsight. Ele vai ser executado e abrir uma aba na janela de mensagens como na imagem abaixo. Dois cliques te jogam na unit e linha relacionada a mensagem: Agora é com você. Você analisa a mensagem o código e verifica se algo pode ser feito.
    3 pontos
  11. Olá pessoal, Introduzi no componente ACBrPosPrinter, um novo mecanismo de acesso a Impressora Agora poderemos acessar algumas impressoras, usando a Sintaxe: ACBrPosPrinter1.Porta := 'DLL:MARCA'; Onde MARCA, será o nome da Marca do Fabricante da Impressora... Até o momento, temos suporte para as marcas "ELGIN", e "EPSON" A ideia por traz dessa nova sintaxe de Porta, é permitir usar a DLL/SO do Fabricante, para Imprimir diretamente na Impressora... Ok.. o ACBrPosPrinter, já conseguia acessar impressoras Não Fiscais, pela Porta USB, usando a Sintaxe "RAW:" ACBrPosPrinter1.Porta := 'RAW:Nome da Impressora no Windows'; Mas então porque desenvolvemos essa nova forma de acesso ? A nova sintaxe "DLL:", tem algumas vantagens, em relação a sintaxe "RAW:" Não depende da instalação do Driver de Spool da Impressora.. (note porém, que em alguns casos, o Driver de Spool não pode estar instalado, pois ele bloqueia o acesso a USB) Podemos Ler Informações da Impressora (o que não é possível no modo RAW) Entretanto, como foi dito antes, dependemos de DLL exclusiva do fabricante, para o acesso a Impressora pela USB... Quais são essas DLLs ? Para onde eu devo copiá-las ? Vejamos como foi descrito no ACBrSerial-change-Log.txt Creio que isso responde as duas perguntas, correto ? Você pode encontrar as DLLs no nosso SVN, na pasta: \ACBr\DLLs\PosPrinter, ou ainda pela Web: http://svn.code.sf.net/p/acbr/code/trunk2/DLLs/PosPrinter/ Você pode ainda baixar uma versão do Demo PosPrinterTeste, atualizada, compilado em Lazarus/FPC no link abaixo: Como funciona essa nova técnica ? Quem faz todo acesso as Portas suportadas pelo ACBr, é um subcomponente chamado ACBrDevice, e há um bom tempo, esse componente já possui uma possibilidade de Integração por Hooks O que é Hook ? https://pt.wikipedia.org/wiki/Hooking A ideia por trás dos Hooks, é instalar ganchos, em eventos, que nos permitam interceptar algumas ações e chamadas... Veja esse trecho de código FDevice.HookAtivar := PosPrinterHookAtivar; FDevice.HookDesativar := PosPrinterHookDesativar; FDevice.HookEnviaString := PosPrinterHookEnviaString; FDevice.HookLeString := PosPrinterHookLeString; Aqui instruímos o subcomponente ACBrDevice, a chamar nossos eventos, quando ele precisar "Ativar", "Desativar" uma porta e também quando ele for "EnviarString" e "LeString", de uma determinada porta... Então no interior do componente ACBrPosPrinter, implementamos os eventos indicados acima (PosPrinterHookAtivar, PosPrinterHookDesativar, etc) ... Com isso, o ACBrDevice executará um código nosso, ao invés do que ele normalmente executaria... Veja que dentro dos eventos de ativação e desativação usamos uma Classe de Hook (leia mais abaixo) procedure TACBrPosPrinter.PosPrinterHookAtivar(const APort: String; Params: String); begin if Assigned(FHook) then FHook.Open(APort); end; procedure TACBrPosPrinter.PosPrinterHookDesativar(const APort: String); begin if Assigned(FHook) then FHook.Close; end; FHook por sua vez, é uma variável interna ao ACBrPosPrinter, que contem uma Classe de Hook (TACBrPosPrinterHook), e implementa os comandos necessários, para transmitir essas ações, a DLL do fabricante... Veja o exemplo abaixo, como fica a implementação dos Hooks de Ativar e Desativar, da ELGIN... observe que chamamos métodos Externos, da DLL da Elgin, como: "PrtPortOpenW" e "PrtPortClose" procedure TElginUSBPrinter.Open(const APort: String); var errorNo: Integer; begin if Connected then Exit; inherited Open(APort); try errorNo := xPrtPortOpenW(FPrinter, WideString(fpPort)); // <------- A Q U I ------- if (errorNo <> E_SUCCESS) then raise Exception.CreateFmt(CERROR_OPEN, [fpPort, fpPrinterName]); except fpConnected := False; fpPort := ''; raise; end; end; procedure TElginUSBPrinter.Close; var errorNo: Integer; begin if not Connected then Exit; errorNo := xPrtPortClose(FPrinter); // <------- A Q U I ------- if (errorNo <> E_SUCCESS) then raise Exception.CreateFmt(CERROR_CLOSE, [fpPort, fpPrinterName]); inherited Close; end; Com isso, conseguimos usar a DLL do Fabricante, para estabelecer um túnel entre o ACBrPosPrinter e o equipamento... Como posso implementar um Hook para um novo modelo ? Os Primeiros passos, são verificar: Se o Fabricante disponibiliza uma DLL para acesso direto ao equipamento (sem depender do Spooler) Se há nessa DLL, um método que nos permita Escrever e Ler Dados da Porta USB Ou seja, não precisamos de métodos de alto nível, que façam a formatação de caracteres, ou manipulem a impressora... Pois continua sendo o ACBrPosPrinter, quem montará toda a Sintaxe de comandos a serem enviados para a Impressora, usando a linguagem Esc/Pos... e igualmente, será o ACBrPosPrinter que fará a leitura de respostas, quando for necessário... Na DLL da Elgin, temos um ótimo exemplo de método para isso... function PrtDirectIO(printer:Pointer; // Ponteiro com a Impressora instanciada por PrtPrinterCreatorW writeData:PByte; // Buffer com dados a serem enviados writeNum:integer; // Número de Bytes em "writeData" (tamanho do Buffer) readData:PByte; // Ponteiro com o Retorno a ser Lido (Buffer de saída) readNum:integer; // Numero de bytes disponíveis para escrita em "readData" (tamanho disponível no Buffer de Saída) preadedNum:PInteger // Número de bytes realmente escritos em "readData" ): Integer; cdecl; // Status de retorno E_SUCCESS = 0; Tendo isso em mãos, podemos criar uma cópia de uma das Units já existentes, como por exemplo a Unit ACBrEscPosHookElginDLL.pas, e implementar o suporte usando a nova DLL, e efetuar os ajustes referente a nova Marca
    2 pontos
  12. Boa tarde, No manual disponibilizado pelo banco Santander há uma nota que indica que quando o valor informado for expresso em moeda variável ou referir-se a taxa de juros, deve-se utilizar cinco casas decimais. Hoje independentemente do valor utilizado, o mesmo possuí apenas duas casas decimais. Ao realizar a importação do arquivo de remessa 240 no sistema do banco, foi retornado a seguinte mensagem de rejeição: REGISTRO DETALHE -SEGMENTO P REMESSA 127-141 Valor da mora/dia ou Taxa mensal: . . SE CAMPO 118 INFORMAR 2 OU 6, ESTE CAMPO DEVE INFORMAR TAXA DE JUROS COM 5 CASA DECIMAIS, LINHA 3. . Para contornar a situação, realizei a criação de um metodo para identificar quantas casas decimais devem ser utilizadas na geração da informação da taxa de juros. Em anexo segue o arquivo alterado para análise e uma cópia do manual do banco com a nota que justifica tal alteração. Ver linhas em destaque (página 18). Manual CNAB 240 Santander.pdf ACBrBancoSantander.pas
    2 pontos
  13. O componente ACBrIBPTax faz parte do pacote ACBrTCP: A propósito, sempre que criar um tópico sobre uma mensagem de erro, seria bom você copiar e colar a mensagem aqui.
    2 pontos
  14. Boa tarde. Na tela inicial deixe Desmarcado a opção: "Exibir Linhas do Log na Tela em Respostas Enviadas", essa opção pode deixar mais lento.... O Componente não tem limite de títulos, mas tudo é processado em memória, portanto quanto mais títulos em um único arquivo, pode demorar mais a geração... Realize os testes com versões mais atualizadas, pois houve melhorias...
    2 pontos
  15. Obrigado BigWings. Tinha acabado de descobrir que era só passar o parametro "false". Ah. me perdoe escrever em caixa alta. Irei tomar cuidado da proxima vez. obrigado!
    2 pontos
  16. Não temos acesso a auditores independentes, então até segunda ordem, temos que seguir a legislação. Nesse caso o campo precisa ser passível de ser gerado tanto vazio como zero. A saída é implementar da forma que foi feito em outros campos usando o tipo Variant. Seria de grande ajuda se você puder ajudar a implementar. Por favor, veja esse tópico sobre esse assunto quando aconteceu em outros registros:
    2 pontos
  17. A Daruma não suporta Logo e QRCode lateral com o ACBr, pois ela não suporte "Page Mode"... Se quer manter o layout semelhante ao anterior, basta seguir a dica do Robert, e desabilitar as propriedades de Impressão de QRCode e Logo Lateral, conforme Tópico indicado... O Logo pode não estar sendo impresso de forma lateral, por ser muito grande... Deixe EspacoEntreLinhas em 40, que deve sair correta a impressão na Epson
    2 pontos
  18. Bom dia, vamos verificar para atualizar...
    2 pontos
  19. Por o processo ser síncrono e não haver a consulta do retorno nada é preenchido em ACBrCTe.WebServices.Retorno. Você pode usar: cdsCadMasterCSTAT.AsInteger := CTE.WebServices.Enviar.CTeRetornoOS.cStat; cdsCadMasterSTATUS.AsString := CTE.WebServices.Enviar.CTeRetornoOS.xMotivo; cdsCadMasterPROTOCOLO.AsString := CTE.WebServices.Enviar.CTeRetornoOS.protCTe.nProt;
    2 pontos
  20. Bom dia Milton, Não, a diferença entre Protocolo e Recibo é o seguinte: Recibo contem o numero do recibo que atesta o recebimento do lote pela SEFAZ para ser processado. Protocolo contem o numero do protocolo que atesta o processamento da nota com sucesso pela SEFAZ. Posso enviar um lote com até 50 notas, neste caso terei um único Recibo e um Protocolo para cada nota processada com sucesso. Isso no modo assíncrono. No modo síncrono só podemos enviar uma nota de cada vez, sendo assim teremos um único Recibo (tem SEFAZ que não retorna) e o Protocolo da nota caso esta tenha sido processada com sucesso.
    2 pontos
  21. Verifique a versão do firmware da impressora, pode ser preciso atualizar.
    2 pontos
  22. Muito obrigado Ítalo. Conte com meu apoio se precisar testar algo ou passar algum outro parametro
    2 pontos
  23. Bom dia Fernando, Muito obrigado pela colaboração, fiz o ajuste e ainda hoje estarei enviando para o repositório.
    2 pontos
  24. Bom dia As URLs de acesso ao webservice do componente ficam separadas por versões em: C:\ACBr\Fontes\ACBrDFe\ACBrReinf\ACBrReinfServicos.ini . Pode notar que já estão atualizadas...
    2 pontos
  25. Parece ser algo parecido com o SPED, correto ? Se SIM, um bom inicio, é verificar a estrutura de qualquer um dos componentes herdados de ACBrTXT
    2 pontos
  26. Não tenho ideia se a SEFAZ valida o regime da empresa. Essa é uma boa pergunta, e é provável que precise ser tirada com um contador. Vou mencionar o que eu penso que pode ser a resposta. As situações citadas me parecem gerar um novo documento, ou pelo menos, uma alteração do documento. Como as notas devem ser informadas com enfoque no declarante, é possível que seja no enquadramento atual da empresa.
    2 pontos
  27. Rejeição 222: Protocolo de Autorização de Uso difere do cadastrado - Como resolver? Rejeição 222 - Protocolo de Autorização de Uso difere do cadastrado Causa Quando for emitido um Evento de Cancelamento para um NF-e autorizada e o Número do Protocolo (Campo: detEvento / nProt - ID: HP20) de autorização da NF-e for diferente do informado no Evento de Cancelamento, será retornado a rejeição "222 - Protocolo de Autorização de Uso difere do cadastrado". Exemplo: Foi emitido um Evento de Cancelamento, para uma NF-e de Número do Protocolo "143150004507669", mas foi informado no evento o Número do Protocolo igual à "143130006510696". Nessa situação, a NF-e será rejeitada pelo motivo 222. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <evento versao="1.00"> <infEvento Id="ID1101114315109999999999999955110000000928166842136901"> <cOrgao>43</cOrgao> <tpAmb>2</tpAmb> <CNPJ>99999999999999</CNPJ> <chNFe>43151099999999999999551100000009281668421369</chNFe> <dhEvento>2015-10-29T10:22:24-02:00</dhEvento> <tpEvento>110111</tpEvento> <nSeqEvento>1</nSeqEvento> <verEvento>1.00</verEvento> <detEvento versao="1.00"> <descEvento>Cancelamento</descEvento> <nProt>143130006510696</nProt> <xJust>Teste para Evento de Cancelamento</xJust> </detEvento> </infEvento> </evento> Veja regra de validação da Sefaz: anexe o xml da NFC-e que está sendo cancelada e do evento
    2 pontos
  28. Configure "EspacoEntreLinhas", para valores entre 30 e 60
    2 pontos
  29. Boa tarde A Sefaz de MG finalmente publicou o cronograma de obrigatoriedade da NFC-e em MG. http://www.sped.fazenda.mg.gov.br/spedmg/nfce/Obrigatoriedade/
    1 ponto
  30. Se você tem tanto receio assim... Talvez o melhor a fazer, seja você contratar e usar o serviço de um dos outros diversos WebServices suportados pelo componente ACBrCEP
    1 ponto
  31. Testes efetuados com o provedor Digifred, cidade Frederico Westphalen - RS: Envio RPS - Ok Consulta RPS - OK Cancelamento NFS-e - OK Obrigado Italo. Poderia me dizer o que causou esse erro?
    1 ponto
  32. Boa tarde, Conforme estabelecido pela Resolução 5234 de 05/02/2019, a partir de 01/03/2019 todos os novos contribuintes estarão obrigados a emitir NFCe. Contribuintes ainda não obrigados, mas que queiram passar a emitir NFCe também poderão aderir voluntariamente a partir desta data. Fonte: http://www.fazenda.mg.gov.br/empresas/legislacao_tributaria/resolucoes/2019/rr5234_2019.htm
    1 ponto
  33. Revisei aqui, agora entendi, tenho de configurar o Componente e na hora do envio também, o componente esta errado, esta como Homologação, vou efetuar o teste e posto aqui se deu certo Obrigado
    1 ponto
  34. 6.3 - Mostre respeito pelo modo de escrever. Escreva de modo claro, gramaticalmente e semanticamente correto. Não escreva TUDO EM MAIÚSCULAS. Isso é lido como se estivesse gritando e é considerado rude. Favor leia as regras do fórum. O segundo parâmetro do método ACBrNFe.Enviar indica se deve imprimir o DANFE ou não. Então basta usar ACBrNFe1.Enviar(nLote, False);
    1 ponto
  35. Bom dia Danilo, Favor atualizar todos os fontes de todas as pastas e reinstale os componentes. Faça novos testes.
    1 ponto
  36. Seguindo manual este campo define se a cobrança será valor por dia ou percentual mensal. O campo DataMoraJuros vai definir a partir de quando será cobrado Juros
    1 ponto
  37. Vejam um resumo da ATA da reunião ocorrida em 05/02, provido pelo colega @Giovanne Fontenele Trevia
    1 ponto
  38. Por Enquanto o site padrão Sefaz CE
    1 ponto
  39. Bom dia, No manual que se refere ao RPS, logo na capa aparece escrito "Padrão ABRASF", se você pegar o manual da versão 1 ou 2 da ABRASF vai notar que o layout apresentado por esse manual não tem nada haver com o layout da ABRASF. Como esses caras colocam na capa de um manual "Padrão ABRASF" sendo que não tem nada haver, isso para mim cheira coisa estragada. Também não tem nada haver com o novo padrão. Esse layout é próprio desse provedor. Já no manual que se refere ao WS - Webservice aparece um endereço de e-mail na ultima página, que se refere a empresa ctatecnologia. No componente temos um provedor chamado CTA. Já tentou com esse?
    1 ponto
  40. Desculpe, não tinha me atentado que o conteúdo dessa String passada como parâmetro nesse método era o conteúdo inteiro do XML
    1 ponto
  41. Tópico movido para a área do SAC, para que o SLA de respostas seja considerado
    1 ponto
  42. Bom dia Verifique se suas configurações estão iguais a essa: Modelo: ppEscPosEpson Porta: Pode selecione o nome da impressora instalado ou a porta COM conectada ou emulada
    1 ponto
  43. https://acbr.sourceforge.io/ACBrMonitor/AssinarBlocoXReducaoZ.html
    1 ponto
  44. A tabela é disponibilizada pelo IBPT: Instituto Brasileiro de Planejamento e Tributação. Sendo assim, qualquer dúvida sobre as tributações devem ser dirigidas a ele. Queira entrar em contato com eles no site oficial: deolhonoimposto.ibpt.org.br .
    1 ponto
  45. Resolvi, era um erro com a versão do arquivo.. Obrigado
    1 ponto
  46. Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.
    1 ponto
  47. Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.
    1 ponto
  48. O contato foi realizado através do fale conosco (suporte ao desenvolvedor) . Sim, esta foi uma resposta deles. Mas fica evidente no texto que a advertência de pagamento deverá ocorrer em casos esporádicos. Se no seu sistema transmissor esta situação acontecer com muita frequência poderá acarretar sansões futuras.
    1 ponto
  49. Ao validar o XML da nfe recebo os erros :- Campo:Código de Barra do Item - Código GTIN inválido, o código GTIN deve conter somente números. Campo:Código de Barra do Item Tributação - Código GTIN inválido, o código GTIN deve conter somente números. Segue bloco do XML :- <prod> <cProd>81039.000.000.00.00</cProd> <cEAN>SEM GETIN</cEAN> <xProd>PORTA VASO P11</xProd> <NCM>39231090</NCM> <CFOP>5921</CFOP> <uCom>UN</uCom> <qCom>1.0000</qCom> <vUnCom>6.0000000000</vUnCom> <vProd>6.00</vProd> <cEANTrib>SEM GETIN</cEANTrib> <uTrib>UN</uTrib> <qTrib>1.0000</qTrib> <vUnTrib>6.0000000000</vUnTrib> <indTot>1</indTot> </prod> Obs :- SEFAZ de SP O que eu estou fazendo de errado?
    1 ponto
  50. André obrigado, está resolvido. Fiquei procurando tanto o problema e nem sequer prestei atenção a este detalhe.
    1 ponto
×
×
  • 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.

The popup will be closed in 10 segundos...