Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 06-02-2019 em todas as áreas
-
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 Tanca6 pontos
-
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_Gallery5 pontos
-
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 Fazenda5 pontos
-
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
-
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
-
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 Marca2 pontos
-
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.pas2 pontos
-
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
-
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
-
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
-
2 pontos
-
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
-
Muito obrigado Ítalo. Conte com meu apoio se precisar testar algo ou passar algum outro parametro2 pontos
-
Bom dia Fernando, Muito obrigado pela colaboração, fiz o ajuste e ainda hoje estarei enviando para o repositório.2 pontos
-
Parece ser algo parecido com o SPED, correto ? Se SIM, um bom inicio, é verificar a estrutura de qualquer um dos componentes herdados de ACBrTXT2 pontos
-
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
-
Boa tarde, Conforme estabelecido pela Resolução 5313 de 01/11/2019, a partir de 01/02/2020 os contribuintes e com receita bruta anual auferida no ano-base 2018 superior ou igual 1.000.000,00 (um milhão) e inferior R$ 4.500.000,00 (quatro milhões e quinhentos mil reais) passarão a estar obrigados a emitir a NFCe. Fonte: http://www.fazenda.mg.gov.br/empresas/legislacao_tributaria/resolucoes/2019/rr5313_2019.htm Att.1 ponto
-
1 ponto
-
Descobri o problema, muitos dos clientes que utilizam o sistema em que eu trabalho, usam o provedor Betha para envio de nota, e este mesmo provedor disponibiliza um certificado para enviar nota. O problema que o certificado que o provedor gera, dentro do arquivo PFX tem 2 chaves publica, então quando carrega o certificado, tem na verdade 2, um com o numero de série 2 com o nome Betha e outro com o numero de série 10 com o nome do cliente. FCertificado := CoCertificate.Create; KeyLocation := CAPICOM_CURRENT_USER_KEY; if Integer(FpDFeSSL.StoreLocation) = CAPICOM_LOCAL_MACHINE_STORE then KeyLocation := CAPICOM_LOCAL_MACHINE_KEY; FCertificado.Load( WideString(FpDFeSSL.ArquivoPFX), WideString(FpDFeSSL.Senha), CAPICOM_KEY_STORAGE_DEFAULT, KeyLocation); Na hora de dar Load do arquivo PFX na classe do certificado, ele pega o certificado de numero de série 2, e eu preciso do 10. Vou ver se tem como pegar o outro, Italo tem alguma sugestão para o meu problema?1 ponto
-
Para NFCe o ideal é usar o modo síncrono (terceiro parâmetro do método Enviar) onde a resposta do processamento vem na mesma chamada, sem a necessidade de se fazer a consulta da situação do lote como ocorre no modo assíncrono. Estude o demo do ACBrNFe para saber como capturar os retornos nos dois modos.1 ponto
-
1 ponto
-
Pelo que entendi as suas alterações mesmo que muito confuso faz um pouco de sentido. Vamos tomar por base esse exemplo onde você aplicou os comentários; No meu entendimento se o tamanho estiver certo 9 dígitos ele aplica e faz a validação caso contrario passa direto e não avisa que esta fora do tamanho esperado; O que poderia ser feito nesse caso e gerar uma exceção avisando que o tamanho esta fora do esperado.1 ponto
-
Boa tarde, Conforme estabelecido pela Resolução 5234 de 05/02/2019, a partir de 28/02/2020 mesmo para operações realizadas fora do estabelecimento, não será mais permitido o uso da NF de Venda ao Consumidor modelo 2 Fonte: http://www.fazenda.mg.gov.br/empresas/legislacao_tributaria/resolucoes/2019/rr5234_2019.htm Att.1 ponto
-
To tentando colocar pra funcionar com esse. Parece que o layout é o "2.0" desse. Acbr ta me retornando que ta faltando algumas configurações. Assim que tiver resposta falo aqui. Muito obrigado Italo!1 ponto
-
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
-
Favor atualizar todos os fontes de todas as pastas, reinstalar os componentes usando o ACBrInstall_Trunk2 com a opção de remover arquivos antigos marcada. Refaçam os testes usando o programa exemplo, configurando para usar o libCapicom.1 ponto
-
Boa tarde, Conforme estabelecido pela Resolução 5234 de 05/02/2019, a partir de 01/04/2019 os contribuintes enquadrados no CNAE 4731-8/00, ou seja, contribuintes do comércio varejista de combustíveis para veículos automotores, estarão obrigados a emitir NFCe. Também passarão a estar obrigadas as empresas com receita bruta anual auferida no ano-base 2018 superior R$ 100.000.000,00 (cem milhões de reais) Fonte: http://www.fazenda.mg.gov.br/empresas/legislacao_tributaria/resolucoes/2019/rr5234_2019.htm Att.1 ponto
-
Boa tarde, Aparentemente com o ultimo revision a mensagem de erro mudou. Depois vou gastar um tempo para ver se consigo descobrir algo relacionado a essa situação. Caso tenha exito, volto a comentar.1 ponto
-
Olá pessoal, bom dia! Atualmente aqui na empresa utilizamos a versão 1.2.0.11 do ACBR (testado também na versão 1.2.0.39) e, o ACBR simplesmente congela (ou fecha sozinho) e não processa por completo o arquivo ent.txt. Acontece que estamos gerando boletos e remessas (vários, mais de 1000 ao mesmo tempo). Nosso sistema cria de principio um arquivo ent.tmp e, só depois de inserir todos os registros é que ele altera o arquivo ent.tmp para o nome ent.txt. Neste momento, o ACBR processa poucos registros e, imediatamente para de responder e não funciona mais. No gerenciador de tarefas do Windows, o ACBR fica consumindo sem parar 25% de CPU e, só finalizando a tarefa é que ele volta a funcionar. Diante do fato apresentado, gostaria de saber se há alguma limitação em relação a quantidade de registros no arquivo ent.txt - o ACBr possui algum limite? Há algo que possa ser feito para solucionar isto? OBS: Poucos registros ele funciona normalmente. Se for de valia, segue os arquivos que ficam assim que ele para de funcionar: ENT.TXT: BOLETO.GerarRemessa("c:\remessa\",12) ------------------------------ LOG.TXT (ALGUNS DADOS COMO NOME E CPF FORAM REMOVIDOS): 06/02/2019 10:38:51 - ATENÇÃO: Chave RSA Privada NÃO pode ser lida no arquivo "swh.ini". 06/02/2019 10:38:51 - ACBr MonitorPLUS Ver.1.2.0.11 06/02/2019 10:38:51 - Aguardando comandos ACBr 06/02/2019 10:38:51 - Monitorando Comandos TXT em: C:\AcBrMonitor\ENT.TXT 06/02/2019 10:38:51 - Respostas gravadas em: C:\AcBrMonitor\SAI.TXT 06/02/2019 10:38:51 - Log de comandos será gravado em: C:\AcBrMonitor\LOG.TXT 06/02/2019 10:39:09 - BOLETO.LimparLista 06/02/2019 10:39:09 - OK: 06/02/2019 10:39:17 - BOLETO.IncluirTitulos(" [Titulo1] NumeroDocumento=2014004401 NossoNumero=9406 Carteira=09 ValorDocumento=10,00 Sacado.NomeSacado=NOME DO CLIENTE Sacado.Pessoa=0 Sacado.CNPJCPF=1111111111 Sacado.Logradouro=Rua João Andrade Filho Sacado.Numero=1 Sacado.Bairro=Jardim Itaipu Sacado.Complemento= Sacado.Cidade=Ourinhos Sacado.UF=SP Sacado.CEP=18900-000 Mensagem=|| ValorMoraJuros=0,00 Vencimento=10/01/2014 (...) [Titulo1870] NumeroDocumento=201709541870 NossoNumero=11275 Carteira=09 ValorDocumento=10,00 Sacado.NomeSacado=NOME DO CLIENTE Sacado.Pessoa=0 Sacado.CNPJCPF=1111111111 Sacado.Logradouro=RUA ITALO RIOS Sacado.Numero= Sacado.Bairro=JD DAS ARVORES Sacado.Complemento= Sacado.Cidade=SCRPARDO Sacado.UF= Sacado.CEP=18900000 Mensagem=|| ValorMoraJuros=0,00 Vencimento=10/12/2017 " (sim, ele termina desta forma, com uma aspas no final do arquivo). Alguém tem alguma ideia do que pode estar acontecendo ou uma maneira de resolver isto? Estamos também com um outro cliente com o mesmo, só que relacionado a NFe. A nota tem muitos produtos e o ACBR dá a impressão que não consegue processar muitas requisições e para de funcionar no meio. Agradeço a atenção e obrigado.1 ponto
-
2.2 - Permaneça no assunto - Quando tiver uma dúvida diferente do assunto no tópico, poste em novo tópico. Não use algo equivalente a "aproveitando o gancho... [dúvida não relacionada com o tópico aqui]". Favor leia as regras do fórum. 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.1 ponto
-
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
-
Bom dia Danilo, Favor atualizar todos os fontes de todas as pastas e reinstale os componentes. Faça novos testes.1 ponto
-
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 Juros1 ponto
-
O Guia prático EFD ICMS IPI Versão 3.0 diz que esse campo, com respeito a obrigatoriedade de apresentação, é, tanto para entrada como saída, OC. Isso significa que ele pode sim ser apresentado vazio. Compare com o campo 28 - QUANT_BC_PIS. Veja:1 ponto
-
Olá walter, você conseguiu fazer essas alterações nos componentes usando o Fast Report?1 ponto
-
Bom dia Suas Contribuições foram disponibilizadas nos fontes do Projeto ACBr. Obrigado!1 ponto
-
O DANFE em Fast usa o ClientDataset internamente. Esse problema parece ter relação com a falta da MIDAS.DLL nesse terminal, que o ClientDataset necessita, ou uma versão incorreta dessa DLL. Você pode tentar copiar a DLL para a pasta do executável, ou tentar inserir MidasLib no uses do .dpr do seu projeto.1 ponto
-
Pelo que eu li neste link aqui ele vai ser um arquivo assinado. Sabe-se se será transmitido via webservice?1 ponto
-
Bom dia Adriano, Acredito ter identificado o problema, ainda hoje estarei enviando uma possível correção.1 ponto
-
Ele não tem a DLL, mas você pode integrar seu ERP nele, por meio de troca de arquivos. Daí quando o projeto ACBrLib tiver a biblioteca de MDF-e você pode migrar o funcionamento pra ela.1 ponto
-
Várias versões dos componentes no computador, ou várias compilações diferentes. Certifique-se que o Delphi está buscando os arquivos na pasta correta.1 ponto
-
A princípio deve manter estas características: https://www.projetoacbr.com.br/perguntas-frequentes/#sobre-os-fontes-do-acbr Só faltou dizer a que se refere esse novo "projeto", você quer dizer um novo componente?1 ponto
-
Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.1 ponto
-
Boa tarde. Os componentes ACBr são desenvolvidos para utilização e Pascal(Delphi/Lazarus) ou para quem vem de outras linguagens por meio das soluções ACBrMonitorPlus e ACBrLib (porém o SPED não faz parte de nenhuma das duas). Att.1 ponto
-
Realmente é confuso... a documentação do fabricante, não deixa clara, essa dependência das DLLs1 ponto
-
Resolvi, era um erro com a versão do arquivo.. Obrigado1 ponto
-
Version 1.0.0
93 downloads
Por: José M. S. Junior - Dicas e Truques ( 10 Recursos do ACBrMonitor para utilizar no seu PDV ) Uma demonstração prática de integração do ACBrMonitorPlus com o PDV (Demo), utilizando os equipamentos de Automação. Impressão de Etiqueta, Terminal de Consulta, Leitor Serial, Display, Balança, Emissão NFCe, Emissão SAT, Emissão NFe, Impressão ESCPOS Veja o video em:1 ponto -
O S-1200 deve ser gerado por regime de competência e o S-1210 por regime de caixa. Portanto o processo funciona da seguinte forma: Digamos que agora no dia 05/02/2019 você efetuou o pagamento do salário do colaborador referente a Janeiro de 2019, quando for gerar no dia 07/02/2019 você vai gerar o S-1200 referente a Janeiro de 2019, e no dia 07/03/2019 você gera o S-1210 do pagamento que você realizou no dia 05/02/2019.1 ponto
-
Então seu diretório de fontes está muito desatualizado... uma vez que isso foi implementado a um bom tempo, e o Instalador está no raiz dos fontes, quando baixado pelo SVN... Por favor lei: https://www.projetoacbr.com.br/fontes/1 ponto
-
1 ponto