Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 06-02-2019 em Posts
-
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 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
-
Para sugerir mudanças e melhorias nos fontes do ACBr, por favor anexe as Units modificadas...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
-
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
-
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
-
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, 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
-
Bom dia Danilo, Favor atualizar todos os fontes de todas as pastas e reinstale os componentes. Faça novos testes.1 ponto
-
Tópico dividido de: https://www.projetoacbr.com.br/forum/topic/49163-problema-ao-gerar-vl_abat_nt-no-registro-c170/1 ponto
-
Vejam um resumo da ATA da reunião ocorrida em 05/02, provido pelo colega @Giovanne Fontenele Trevia1 ponto
-
1 ponto
-
Obrigado por compartilhar essa informação. Algum link oficial?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
-
não cheguei lá ainda, ainda vou dar uma aprofundada na documentação1 ponto
-
Pelo que eu li neste link aqui ele vai ser um arquivo assinado. Sabe-se se será transmitido via webservice?1 ponto
-
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 XML1 ponto
-
Obrigado Henrique, estava com o mesmo problema, testei aqui com o arquivo que você enviou e funcionou corretamente.1 ponto
-
https://acbr.sourceforge.io/ACBrMonitor/AssinarBlocoXReducaoZ.html1 ponto
-
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
-
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
-
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
-
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
