Jump to content

Compre o Delphi
Com até 30% de desconto
e parcelado em até 12x sem juros

Saiba Mais

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

Leaderboard


Popular Content

Showing content with the highest reputation since 12/07/2012 in all areas

  1. 16 points
    Olá pessoal! Temos o prazer de informar que mais um novo componente foi adicionado ao projeto: ACBrLCDPR. O ACBrLCDPR foi criado para facilitar a geração do LCDPR - Livro Caixa Digital do Produtor Rural. Esse componente segue a mesma ideia de outros componentes para geração de arquivos como ACBrSPEDFiscal, ACBrSPEDPISCOFINS, ACBrSEF2, etc... Com ele você pode gerar o arquivo sem se preocupar com o layout do arquivo. A sua preocupação será apenas com as informações que precisa aprensentar. Como é um componente novo, temos consciência de que alguns ajustes talvez sejam necessários. Todos podem ficar à vontade reportar problemas. Podem fazer isso por criar um novo tópico com ajustes e anexar nele. Crie o tópico no subfórum ACBrTXT -> Outros (ACBrLFD, ACBrSEF2, etc). Mas queremos agradecer ao @Willian Hübner que pôs a mão na massa e fez a doação do componente que serviu como base dessa versão. Queremos também aproveitar a oportunidade para agradecer aos nossos usuários SAC. Seu apoio nos ajuda a continuar avançando.
  2. 16 points
    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.
  3. 15 points
    Boa tarde a todos! Gostaria de parabenizar o trabalho e a dedicação de toda a equipe, patrocinadores e empresas envolvidas, foi uma grande oportunidade e privilegio participar com todos vocês...Pena que foi só um dia!? Agradeço a todos que estiveram envolvidos nesse grande projeto. Essa equipe é sensacional:
  4. 13 points
    O que é o ACBrPosPrinter e Esc/Pos ? Para quem ainda não conhece, o ACBrPosPrinter é o nosso componente para acesso a Impressoras de Bobinas, Não fiscais... Essas impressoras, denominadas Impressoras POS (Point of Sale), contemplam uma linguagem de impressão de linha, interna, onde podemos realizar tarefas como: Modificar os atributos de impressão Imprimir códigos de barras 1D e 2D (QRCode) Acionar dispositivos ligados a Impressora, como Gaveta de Dinheiro, Guilhotina Ler status da Impressora (Tampa aberta, pouco ou sem papel, etc) No mercado brasileiro, há vários modelos, que contemplam várias linguagens, como por exemplo: EscPos, EscBema, EscDaruma, etc... As linguagens são chamadas de "Esc", pois os comandos geralmente iniciam com o caractere não imprimível, ESC ou #27... Exemplo: se enviarmos para a Impressora a String: chr(27) + 'E' + chr(01), ligaremos o modo Negrito A grande maioria dos fabricantes, procurou seguir o padrão Epson, que é a marca mundialmente líder nesse segmento, e a sua linguagem Epson Esc/Pos... O componente ACBrPosPrinter suporta a grande maioria das linguagens e modelos existentes no mercado brasileiro... mas nem todos os recursos, estão disponíveis em todas as linguagens... Usar o ACBrPosPrinter é extremamente simples, e não requer o conhecimento de Esc/Pos... Através de suas Tags, você pode construir ricos relatórios, com várias formatações de fontes, alinhamento, Imagens, códigos de barra e QRCode... A título de Exemplo, usamos o próprio componente ACBrPosPrinter, para criar o Extrato do SAT, Unit ACBrSATExtratoESCPOS.pas e o DANFCe, unit ACBrNFeDANFeESCPOS.pas Se você usa o ACBrMonitorPLUS, poderá acessar o ACBrPosPrinter pelo objeto ESCPOS... Veja no manual: https://acbr.sourceforge.io/ACBrMonitor/ESCPOSImprimirTags.html Você pode baixar um Demo compilado do ACBrPosPrinter em: Você pode baixar uma Apresentação sobre o ACBrPosPrinter em: Se você não programa em ObjectPascal (Delphi/Lazarus), pode baixar a biblioteca (DLL) ACBrLibPosPrinter em: https://www.projetoacbr.com.br/forum/files/category/35-acbrlibposprinter/ Sobre a Impressão de Imagens no ACBrPosPrinter A muito tempo eu sentia falta dos seguintes recursos, no componente ACBrPosPrinter Impressão de Imagens Gravação e manipulação de Logos na memória da Impressora... Agora isso já é possível... Após muita pesquisa, e com a ajuda de vários outros artigos que encontrei na Internet (veja referência nos fontes), consegui implementar a Impressão de Imagens no modo "Raster Image"... Devido a característica desses equipamentos, apenas a impressão de Imagens monocromáticas é suportada. Existem vários sites de conversão de Imagem, para BMP Monocromático, on-line, como por exemplo: https://online-converting.com/image/convert2bmp/ Novos métodos no componente ACBrPosPrinter procedure ImprimirImagemStream(ABMPStream: TStream); // Permite Imprimir uma Imagem, no formato BMP Monocromático, de um Stream procedure ImprimirImagemArquivo(ArquivoBMP: String); // Carrega e imprime uma Imagem de um Arquivo. Em aplicações visuais (não console) será usado o Objeto TPicture, que permite carregar vários formatos de Imagem, podendo ser Colorida ou em Escala de cinza. A Imagem será convertida para BMP Monocromática. Entretanto, procure sempre usar Imagens BMP Moncromáticas, para evitar processamento desnecessário procedure ImprimirImagemRasterStr(const ARasterStr: AnsiString; AWidth, AHeight: Integer); // Imprime uma Imagem a partir de uma String no formato "Raster Image" (veja abaixo) procedure ImprimirLogo(AKC1: Integer = -1; AKC2: Integer = -1; AFatorX: Integer = -1; AFatorY: Integer = -1); // Imprime um Logo préviamente gravado na memória da Impressora. Se os parâmetros não foram informados, serão usados os valores de ACBrPosPrinter.ConfigLogo procedure GravarLogoStream(ABMPStream: TStream; AKC1: Integer = -1; AKC2: Integer = -1); // Grava uma Imagem de Logo, no formato BMP Monocromático, a partir de um Stream, nas posições informadas. Se os parâmetros não foram informados, serão usados os valores de ACBrPosPrinter.ConfigLogo procedure GravarLogoArquivo(ArquivoBMP: String; AKC1: Integer = -1; AKC2: Integer = -1); // Grava uma Imagem de Logo, a partir de um arquivo em Disco, nas posições informadas. Se os parâmetros não foram informados, serão usados os valores de ACBrPosPrinter.ConfigLogo procedure ApagarLogo(AKC1: Integer = -1; AKC2: Integer = -1); // Remove um Logo da memória da Impressora. Se os parâmetros não foram informados, serão usados os valores de ACBrPosPrinter.ConfigLogo Nova Tag de Bloco <bmp> - Imprime Imagem BMP monocromática. Conteúdo pode ser: Path da Imagem, Stream em Base64 ou AscII Art (0 e 1) Veja alguns exemplos de uso: Inicializa </zera>, define o alinhamento no centro </ce>, e efetua a impressão da Imagem em disco, no Path "C:\temp\acbrmono.bmp" </zera></ce><bmp>C:\temp\acbrmono.bmp</bmp> Imprimir uma Imagem de BMP Mono, codificada em Base64 <bmp> Qk3eDQAAAAAAAD4AAAAoAAAA+gAAAG0AAAABAAEAAAAAAKANAAAAAAAAAAAAAAIAAAAAAAAAAAAAAP///wD/////////////////////////////////////////wP/////////////////////////////////////////A/////////////////////////////////////////8D/////////////////////////////////////////wP4AAAAAAAAAAAAAAA8A8AAAAAAAAAAAAAAAAAAAAD/A/AAAAAAAAAAAAAAADwD4AAAAAAAAAAAAAAAAAAAAD8D4AAAAAAAAAAAAAAAPAHwAAAAAAAAAAAAAAAAAAAAHwOAAAAAAAAAAAAAAAA8APgAAAAAAAAAgAAAAAAAAAAHAwAAAAAAAAAAAAAAADwAfAAAAAAAAAcAAAAAAAAAAAcDAAAAAAAAAAAAAAAAPAA+AAAAAAAAfgAAAAAAAAAAAwIAAAAAAAAAAAAADgAQAB8AAAAAAAH+AAAAAAAAAAABAgAAAAAAAAAAAAACAAAABAAAAAAAAAAAAAAAAAAAAAEAAAAAADDvjnnNn489ngHw4zM+cPM/MD8w7PO4AAAAAAAAAAAAMN+e/c2fn7+/A/nzMz9x+z8wP7Hd27gAAAAAAAAAAAA/2ZnNzZ2YO7ODGxszf3ODOzAxsdx7uAAAAAAAAAAAABmZmc3Nj7gfs4cDGzN/c4MfMDO4ffu4AAAAAAAAAAAAH5mYzd2BmYOzBwObuzNzmxMwPzgdg7gAAAAAAAAAAAAfGb55+5+fHx4HAfP/Pn3zHzAzvvz7uAAAAAAAAAAAAA8AGAAAAAAAAAO4AAAAAAAAMDOAAAA4AAAAAAIAAAAADwAIAAAAAB4AA/AAAMAAAwAwPwAAA7gAAAABAgAAAAAAAAAAAAAAADwA4A+H/4AADwAAAAAAAAAAAAEDAAAAAAAAAAAAAAAAPAAAB//4AAAfAAAAAAAAAAAAAwOAAAAAAAAAAAAAAAA8AAAD/8AAAB4AAAAAAAAAAAAHA8AAAAAAAAAAAAAAADwAAAH/AAAAHAAAAAAAAAAAAA8D4AAAAAAAAAAAAAAAPAAAAPAAAAA4AAAAAAAAAAAAHwP4AAAAAAAAAAAAAAA8AAAAAAAAAHgAAAAAAAAAAAB/A/////////////////////////////////////////8D/////////////////////////////////////////wP/////////////////////////////////////////A/////////////////////////////////////////8D///////gAP///Af////gA//////+Af//4B///////wP///+AAeAB4AB4D+AAB/ADwAAAAf+B4AHgH///////A////4AA4AHgAHgfgAAB+APAAAAAH8HgAeAf//////8D////wADgAeAAeD4AAAB8A8AAAAAHweAB4B///////wP////AAPABwABw+AAAAB4DwAAAAAHx4AHgH///////A////+AA///AAPD4AAAAHwPAAAAAAPHgAeAf//////8D////4AB//8AA4eAAAAAHg8AAAAAAeeAB4B///////wP////wAH//wAHj4AAAAAeDwAAAAAB54AHgH///////A/////AAf/+AAePAAAAAA8PAAAAAADngAeAf//////8D////8AAAAAADx4AAAAAD48AAAAAAPeAB4D///////wP////wAAAAAAPHAAAAAAHjwAAAAAA94AHgP///////A/////gAAAAAA48AAP8AAOPAAP/gAB3gAeA///////8D////+AAAAAADjwAB/4AA48AA//AAH+AB4D///////wP////8AAAAAAe+AAP/wADzwAD/+AAf4AHgf///////A/////wAAAAAB/4AB8PgAPPAAOf4AB/gAeB///////8D/////AAAAAAP/AAHgfAAc8AA7zgAH+AB4H///////wP////+AAAAAA/8AA8A8AP7wAD/+AAd4AHg////////A/////4AAAAAD5wADgBwH/vAAP/4AD3gAeD///////8D/////wAH/AAePAAOAHB/+8AA//AAPeAA4P///////wP/////AAf8ABw8AA4Af/8DwAD/gAA54ADg////////A/////8AB/gAPDwAHgB//APAAAAAAHngAPH///////8D/////4AH+AA8PAAeAD+AA8AAAAAA+eAAf////////wP/////gAf4ADw8AB4APgADwAAAAAHx4AB/////////A/////+AA/gAf7wAHgAwAAPAAAAAA+HgAH////////8D/////8AD8AB//AAeAAAAA8AAAAAfweAAHP///////wP/////wAHwAH/8AB4AAAADwAAAAB+B4AAAf///////A//////gAfAA8fwAHgA4AAPAAAAAB8HgAAA///////8D/////+AB4ADwPAAOAH+AA8AAAAADweAAAD///////wP/////4ADgAeA8AA4Af/gDwAAAAAHh4AAAP///////A//////wAMAB4BwADgB//+PAAP/AAPHgAgAf//////8D//////AAwAHAHAAPAHP/+8AA/+AA8eACAB///////wP/////+ADAA8AcAAfx8A/7wAD/4ADx4AMAD///////A//////4AEADgB4AB//gAPPAAODgAHHgA4AP//////8D//////gAQAOAHgAD/+AA88AA8+AAeeADwB///////wP//////AAAB4AOAAH/gADjwAD/4AB5////////////A//////8AAAHgA8AAP8AAOPAAP/gAHn///////////8D//////wAAA8ABwAAAAAB48AA/wAAef///////////wP//////gAADwAHgAAAAAPDwAAAAABwAAH/////////A//////+AAAOAAOAAAAAA8PAAAAAAPAAAf////////8D//////8AAB4AA+AAAAAHg8AAAAAA8AAD/////////wP//////wAAHgAB4AAAAA8DwAAAAADgAAf/////////A///////AAA8AAD4AAAAHwPAAAAAA/AAD/////////8D//////8AADwAAPgAAAA+A8AAAAAD+AAP/////////wP//////4AAPAAAfgAAAHwDwAAAAAf4AB//////////A///////gAA4AAAfgAAB+APAAAAAHzwAP/////////8D///////AAHgAAA/gAAfwA8AAAAD/PgA//////////wP/////////8AAAB////8AD//////wfAH//////////A//////////wAAAB////gAP//////88A//////////8D//////////gAAAB///4AB////////4H//////////wP//////////AAAAAP/wAAHgAAAAB//w///////////A//////////+AAAAAAHAAA8AAAAAAf/n//////////8D//////////8AAAAAAcAAHwAAAAAAB////////////wP//////////4AAAAABwAAeAAAAAAAAf///////////A///////////wAAAAAHAADwAAAAAAAA///////////8D///////////gAAAAAcAAeAAAAAAAAH///////////wP///////////AAAAABwAD4AAAAAAAA////////////A////////////AAAAAHAAeAAAAAAAAH///////////8D///////////8AAAAAeAD4AAAAAAAA////////////wP///////////4AAAAB4APAAAAAAAAH////////////A////////////4AAAAHgB4AAAAAAAB////////////8D////////////wAAAAeAPAAAAAAAAP////////////wP////////////wAAAB4B8AAAAAAAD/////////////A/////////////gAAAHgHgAAAAAAAf////////////8D/////////////AAAAOA8AAAAAAAD/////////////wP/////////////AAAA4HwAAAAAAA//////////////A//////////////AAADgeAAAAAAAP/////////////8D//////////////AAAPHwAAAAAAD//////////////wP//////////////AAA8eAAAAAAA///////////////A///////////////AADz4AAAAAAH//////////////8D///////////////AAPeAAAAAAD///////////////wP///////////////gA/4AAAAAA////////////////A////////////////wD/AAAAAA////////////////8D////////////////wH4AAAAAP////////////////wP////////////////4fAAAAAH/////////////////A//////////////////8AAAAP/////////////////8D//////////////////8AAA///////////////////wP/////////////////////////////////////////A/////////////////////////////////////////8D/////////////////////////////////////////wA== </bmp> Imprimir uma Imagem, baseado em ASCII ART Na Unit ACBrImage.pas, do pacote ACBrComum, é onde a mágica acontece... essa Unit implementa os seguintes métodos function IsPCX(S: TStream; CheckIsMono: Boolean = True): Boolean; // Retorna True se o Stream contém uma Imagem em PCX function IsBMP(S: TStream; CheckIsMono: Boolean = True): Boolean; // Retorna True se o Stream contém uma Imagem em BMP procedure RasterStrToAscII(const ARasterStr: AnsiString; AWidth: Integer; InvertImg: Boolean; AscIIArtLines: TStrings); // Converte uma String codificada em "Raster Image", para ASCII ART procedure AscIIToRasterStr(AscIIArtLines: TStrings; out AWidth: Integer; out AHeight: Integer; out ARasterStr: AnsiString); // Converte uma String codificada em ASCII ART para "Raster Image" procedure BMPMonoToRasterStr(ABMPStream: TStream; InvertImg: Boolean; out AWidth: Integer; out AHeight: Integer; out ARasterStr: AnsiString); // Converte uma Imagem no formato BMP Monocromático, gravada em um Stream, para uma String codificada em "Raster Image" procedure RasterStrToBMPMono(ARasterStr: AnsiString; AWidth: Integer; InvertImg: Boolean; ABMPStream: TStream); // Converte uma String codificada e "Raster Image", para uma Imagem no formato BMP Monocromático, gravando-a em um Stream {$IfNDef NOGUI} procedure BitmapToRasterStr(ABmpSrc: TBitmap; InvertImg: Boolean; out AWidth: Integer; out AHeight: Integer; out ARasterStr: AnsiString; LuminosityThreshold: Byte = C_LUMINOSITY_THRESHOLD); // Apenas disponível se a aplicação não for console. converte uma Imagem de um TBitMap, para uma String codificada e "Raster Image" {$EndIf} Use a força, leia os fontes Não deixe de estudar os fontes do Projeto Demo, PosPrinterTeste, na pasta: \ACBr\Exemplos\ACBrSerial\ACBrPosPrinter\Delphi Nesse projeto há vários exemplos de como Imprimir Imagens, e manipular Logotipos, usando as Tags e Métodos do componente ACBrPosPrinter O que é o modo "Raster Image" ? O Modo Raster é um fluxo de Bytes que representam os Pixels da Imagem... https://pt.wikipedia.org/wiki/Raster Exemplo: Imagine a Seguinte imagem, de 16 x 16 Pixels... Se fôssemos representá-la em ASCII ART, teríamos: 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 1010101010101010 Para transformá-la em Raster, agrupamos os Bits, em Bytes (8 bits)... portanto a primeira linha ficaria: Em Binário: 10101010 + 10101010 Em Hexa: AA + AA Em Decimal: 170 + 170 Então a String em Raster Image, da Imagem acima seria o equivalente a: #170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170+#170 Para imprimir uma String em Raster, é fundamental sabermos qual a largura em Pixels, da imagem A Epson disponibiliza utilitário, para converter imagens para o formato Raster: Epson BmpToRaster (o estudo do conteúdo do arquivo gerado por esse Utilitário, foi essencial na implementação dos métodos de ACBrImage)
  5. 13 points
    Olá pessoal, Na postagem "Como obter o XML do Fornecedor" mostrei o uso do método DistribuicaoDFePorChaveNFe, nessa nova postagem vou mostrar mais dois métodos: DistribuicaoDFePorUltNSU e DistribuicaoDFePorNSU. Vamos a sintaxe, que por sinal é semelhante ao do DistribuicaoDFePorChaveNFe. DistribuicaoDFePorUltNSU( <código da UF do destinatário>, <CNPJ do destinatário>, <numero do ultimo NSU> ) DistribuicaoDFePorNSU( <código da UF do destinatário>, <CNPJ do destinatário>, <numero do NSU> ) Primeiramente vamos entender o que vem a ser esse tal de NSU. NSU - numero sequencial único, é um numero atribuído pelo Ambiente Nacional ao documento ora compartilhado pelas SEFAZ-Autorizadora. Exemplo: o emitente da nota é do Estado de São Paulo, logo a nota é enviada para a SEFAZ-SP esta por sua vez vai compartilhar com o Ambiente Nacional as notas que foram autorizadas, o Ambiente Nacional por sua vez atribui um NSU para cada nota que receber. Na verdade o Ambiente Nacional gera um resumo da nota e atribui o NSU a esse resumo primeiramente e não a nota propriamente dita. Um NSU só será atribuído a nota quando o destinatário enviar o evento de Manifestação do Destinatário. Lembre-se o NSU da nota será um numero diferente do NSU do resumo dela, e por ser gerado após o envio do evento de Manifestação do Destinatário, podemos concluir que o NSU da nota é maior que o NSU do resumo. Vamos agora entender como funciona os dois métodos mencionados acima. O método DistribuicaoDFePorNSU é o mais simples de entender, pois este simplesmente baixa o documento que possui o NSU informado. Note que usei o termo documento, pois o webservice DistribuicaoDFe pode retornar os seguintes tipos de documentos: Resumo de Nota, Nota Completa, Resumo de Evento e Evento Completo. Se o NSU informado no método DistribuicaoDFePorNSU for o NSU de um resumo, o que teremos como retorno será o XML do resumo e não o XML da Nota. Por outro lado o método DistribuicaoDFePorUltNSU nos retorna uma lista com até 50 documentos, cujos NSU são superiores ao NSU informado. Exemplo: DistribuicaoDFePorUltNSU( 35, 12345678000123, 450 ) ===> 450 é o valor do Ultimo NSU. Ao executar o método, como dito anteriormente poderá nos retornar uma lista com até 50 documentos, pois bem suponha que retorne 50, os NSU desse documentos retornados serão, 451, 452, 453, ...., 498, 499, 500. Lembre-se que nessa lista podemos ter Resumos de Notas, Notas Completas, Resumo de Eventos e Eventos Completos. Através de uma propriedade chamada Schema nos traz a informação do tipo de documento retornado. Temos também outras duas propriedades muito importantes, são elas: UltNSU e MaxNSU. A propriedade UltNSU nos informa o numero do NSU referente ao ultimo documento da lista, já a propriedade MaxNSU nos informar o maior NSU existente no Ambiente Nacional. Continuando o exemplo acima, vamos supor que após a execução os valores de UltNSU e MaxNSU são respectivamente 500 e 750. Era de se esperar mesmo que o valor de ultNSU seja 500 pois informamos 450 e foi retornado 50 documentos, logo o NSU do ultimo é 500. A próxima vez que formos executar o DistribuicaoDFePorUltNSU devemos informar o valor 500, para que ele retorne os documentos a partir de 501 que é o próximo da lista. E devemos repetir o procedimento até que o valor de ultNSU seja igual a maxNSU, desta forma vamos ter baixado todos os documentos disponibilizados pelo Ambiente Nacional. Lembre-se que o valor de MaxNSU tende sempre a crescer a medida que novas notas forem emitidas e compartilhadas com o Ambiente Nacional e a medida que o destinatário for enviando o evento de Manifestação do Destinatário. Entre uma execução e outra do DistribuicaoDFePorUltNSU você pode realizar a manifestação referente a cada resumo de nota obtido, ou seja, enviar o evento de Manifestação do Destinatário. Desta forma a medida que você vai avançando na lista o Ambiente Nacional já vai liberando a Nota Completa (notas manifestadas) e disponibilizando ela na lista. O DistribuicaoDFe não serve apenas para que possamos obter o XML do fornecedor, mas também descobrirmos se existe alguma empresa emitindo notas contra o nosso CNPJ sem no nosso consentimento. Você descobre isso através do DistribuicaoDFePorUltNSU e pode avisar a SEFAZ enviando o evento de Manifestação do Destinatário: Desconhecimento da Operação. Esse evento diz a SEFAZ que você não comprou desse fornecedor. Para saber mais sobre Manifestação do Destinatário vide a Nota Técnica 2012/002 versão 1.02 e para saber mais sobre o Distribuição DFe vide a Nota Técnica 2014/002 versão 1.02b, ambas estão disponíveis no Portal Nacional da NF-e.
  6. 12 points
    Olá a todos, Para quem não sabe nas configurações do componente ACBrNFe, temos dentro do grupo Arquivos um subgrupo chamado DownloadNFe, que contem as propriedades PathDownload e SepararPorNome. Através dessas duas propriedades definimos o caminho onde os XML retornados pelo método DistribuicaoDFe vão ser salvos e se desejamos separar por nome ou não. A primeira alteração realizada foi a migração da definição dessas propriedades de configuração da unit ACBrNFeConfiguracoes para ACBrDFeConfiguracoes. A motivação para essa mudança é que a definição dessas propriedades também se encontravam nas units ACBrCTeConfiguracoes, ACBrMDFeConfiguracores e ACBrBPeConfiguracoes, agora temos em apenas um lugar, ou seja, na unit ACBrDFeConfiguracoes. Com essa mudança temos uma redução de código e caso futuramente tenhamos alguma correção ou melhoria, elas serão feitas em apenas um lugar, desta forma agilizando o tempo de manutenção do código. Como nem tudo são flores, quem tem em seu código as linhas para configurar o Download deverá fazer a seguinte alteração para que a aplicação seja compilada com sucesso (exemplo no caso da NF-e): Antes: ACBrNFe.Configuracoes.Arquivos.DownloadNFe.PathDownload Alteração: ACBrNFe.Configuracoes.Arquivos.DownloadDFe.PathDownload Falando em melhoria, antes tínhamos uma função chamada GetPathDownload que tem como finalidade gerar o Path final onde será gravado os XML referentes aos Resumos de Notas e Notas Completas. Agora além da função citada acima temos também a função GetPathDownloadEvento que tem como finalidade gerar o Path final onde será gravado os XML referentes aos Resumos de Eventos e Eventos Completos. O que motivou a criar essa nova função é que antes o DistribuicaoDFe ao salvar os XML referentes aos eventos estava usando o mesmo Path dos eventos enviados, ou seja, estava misturando os eventos enviados com os eventos baixados pelo DistribuicaoDFe. Resumindo, a primeira alteração visou a redução de código nos componentes ACBrNFe, ACBrCTe, ACBrMDFe e ACBrBPe e a segunda visou organização dos XML baixados pelo método DistribuicaoDFe. Qualquer duvida ou problemas, favor postar no fórum.
  7. 11 points
    Graças aos esforços do @edunucleo e @JoãoDJ, estamos agora operando em HTTPS... Estamos usando um Certificado com criptografia TLS, Gratuito, fornecido pela Let's Encrypt
  8. 10 points
    Pessoal É com grande alegria que venho agradecer o meu presente por ter sido o primeiro a fazer a inscrição E parabenizar a todos pelo evento
  9. 10 points
    Boa tarde a todos Seguindo alguns tópicos que encontrei no fórum, fiz um resumo da conversão que fiz para quem estiver migrando para o trunk 2, espero que possa ajudar alguém: CTe ** CTe * Valida De: ACBrCTe1.Conhecimentos.Valida; Para: ACBrCTe1.Conhecimentos.Validar; * Configuracoes.Geral.PathSalvar De: ACBrCTe1.Configuracoes.Geral.PathSalvar Para: ACBrCTe1.Configuracoes.Arquivos.PathSalvar * EnviarEventoCTe De: ACBrCTe1.EnviarEventoCTe(idLote); Para: ACBrCTe1.EnviarEvento(idLote); * De: if ACBrCTe1.Conhecimentos.Items[i].Confirmada then Para: if ACBrCTe1.Conhecimentos.Items[i].Confirmado then * De: ACBrCTe1.Conhecimentos.Items[i].SaveToFile(cFileName); Para: ACBrCTe1.Conhecimentos.Items[i].GravarXML(cFileName); * De: DFEUtil.LimpaNumero(cDocumento) Para: OnlyNumber(cDocumento) * De: ACBrCTe1.Configuracoes.Certificados.DataVenc Para: ACBrCTe1.SSL.CertDataVenc NFe ** NFe * De: cNroSerieCertificado := ACBrNFe1.Configuracoes.Certificados.SelecionarCertificado; Para: cNroSerieCertificado := ACBrNFe1.SSL.SelecionarCertificado; * De: ACBrNFe1.NotasFiscais.Valida; Para: ACBrNFe1.NotasFiscais.Validar; * De: ACBrNFe1.Configuracoes.Geral.PathSalvar; Para: ACBrNFe1.Configuracoes.Arquivos.PathSalvar; * De: ACBrNFe1.EnviarEventoNFe(idLote); Para: ACBrNFe1.EnviarEvento(idLote); * De: cSituacao := SituacaoNFeToStr(AcbrNFe1.WebServices.ConsNFeDest.retConsNFeDest.ret.Items[idx].resNFe.cSitNFe); Para: cSituacao := SituacaoDFeToStr(AcbrNFe1.WebServices.ConsNFeDest.retConsNFeDest.ret.Items[idx].resNFe.cSitNFe); * De: ACBrNFe1.NotasFiscais.Items[i].SaveToFile(cFileName); Para: ACBrNFe1.NotasFiscais.Items[i].GravarXML(cFileName); * Removidos: ( não existe mais DPEC) ACBrNFe1.WebServices.EnviarDPEC.Executar ACBrNFe1.WebServices.ConsultaDPEC.NFeChave ACBrNFe1.WebServices.ConsultaDPEC.Executar; * De: NFe.Det[idx].Prod.nItemPed := 0; Para: NFe.Det[idx].Prod.nItemPed := ''; * Disponível NFe.Det[idx].Prod.CEST ( trunk 2 ) * Remover Componentes ACBrNFeDANFERave1 e ACBrNFeDANFERaveCB1 * De: ACBrNFe1.NotasFiscais.Items[idx].SaveToFile(cFileName ); Para: ACBrNFe1.NotasFiscais.Items[idx].GravarXML(cFileName); * De: ACBrNFe1.Configuracoes.Certificados.DataVenc Para: ACBrNFe1.SSL.CertDataVenc NFSe ** NFSe * De: ACBrNFSe1.Configuracoes.Arquivos.PastaMensal := True Para: ACBrNFSe1.Configuracoes.Arquivos.SepararPorMes := True * De: ACBrNFSe1.Configuracoes.WebServices.CodigoMunicipio := 9999 Para: ACBrNFSe1.Configuracoes.Geral.CodigoMunicipio := 9999 * De: ACBrNFSe1.Configuracoes.WebServices.SetConfigMunicipio(ACBrNFSe1.Configuracoes.Geral.PathSchemas); Para: ACBrNFSe1.Configuracoes.Geral.SetConfigMunicipio; * De: ACBrNFSe1.Configuracoes.WebServices.SenhaWeb := cSenhaWeb; Para: ACBrNFSe1.Configuracoes.Geral.SenhaWeb := cSenhaWeb; * De: ACBrNFSe1.Configuracoes.WebServices.UserWeb := cUserWeb; Para: ACBrNFSe1.Configuracoes.Geral.UserWeb := cUserWeb; * De: cProvedor := ACBrNFSe1.Configuracoes.WebServices.xProvedor; Para: cProvedor := ACBrNFSe1.Configuracoes.Geral.xProvedor; * De: ACBrNFSe1.Configuracoes.Geral.PathSalvar; Para: ACBrNFSe1.Configuracoes.Arquivos.PathSalvar; * De: ACBrNFSe1.NotasFiscais.Items[0].NFSe.NaturezaOperacao := noTributacaoNoMunicipio; ACBrNFSe1.NotasFiscais.Items[0].NFSe.NaturezaOperacao := StrToNaturezaOperacao(ok, cNaturezaOperacao); Geral * pcnConversao ( ainda existe ) - especializado para pcnConversaoNFe e pcteConversaoCTe adicionem no uses pcnConversaoNFe e pcteConversaoCTe junto com pcnConversao * ACBrDFeUtil // Unificado: ACBrNFeUtil-ACBrNFEsUtil-ACBrCTeUtil ( não existem mais ) remover ACBrNFeUtil-ACBrNFEsUtil-ACBrCTeUtil e deixem ACBrDFeUtil * Added novo uses ACBrUtil * EstaVazio De: if DFeUtil.EstaVazio(cPathSalvar) then Para: if EstaVazio(cPathSalvar) then
  10. 9 points
    Boa tarde, iniciei os estudos para implementar a emissão do MDF-e, e uma das regras que mais me chamou atenção foi sobre as informações do percurso do manifesto, nas viagens intermunicipais. Gostaria de compartilhar um pequeno projeto desenvolvido em Lazarus, (meu objetivo é montar um cadastro de percursos, a fim de evitar a rejeição de "Percurso inválido") considerando as seguintes validações verificadas na documentação do MDF-e: Validações SEM percurso: 1) UF ini e UF fim são iguais -> não deve selecionar nenhuma UF de percurso 2) UF ini e UF fim são diferentes e fazem divisa -> não deve selecionar nenhuma UF de percurso Validações COM percurso: 3) nem UF ini nem UF fim devem estar selecionadas no percurso. 4) a primeira UF da lista deve fazer divisa com a UF inicial (carregamento) 5) entre as UF selecionadas, cada UF deve fazer divisa com a UF seguinte, na ordem de cima para baixo. 6) a ultima UF da lista deve fazer divisa com a UF final (descarregamento) Basicamente, foi montada uma classe TUF (uufclass.pas), onde para cada objeto de UF criado, ele cria num vetor a lista das outras UF que fazem divisa com esta. Também tem um Form mostrando como o usuário informaria as UF inicial e final, assim como selecionar (TCheckListBox) as UFs do percurso. Também é possível ordenar as UFs (TListBox). Por último, foi feito uma "perfumaria", desenhando o percurso selecionado, no mapa do Brasil (TImage). Espero que seja útil, qualquer sugestão é bem vinda. Att Ricardo valida_percurso_lazarus.zip
  11. 9 points
    Bom dia a todos, Foi feito uma generalização nas Units: pcnConsCad, pcnRetConsCad, pcnConsStatServ, pcnRetConsStatServ, pcnDistDFeInt e pcnRetDistDFeInt. A motivação é porque elas aparecem de forma repetidas com nomes diferentes nos fontes dos componentes ACBrNFe, ACBrCTe, ACBrMDFe e ACBrBPe. A generalização e migração para a pasta PCNComum faz com que tenhamos mais controle das correções e melhorias, sem falar na redução de código. Infelizmente ao generalizar o pcnRetDistDFeInt ocorreu uma quebra de código, pois se fez necessário alterar o nome de uma classe e de algumas propriedades publicas. Para quem usa o DistribuicaoDFe será necessários fazer alguns ajustes no código da aplicação. Trocar os resNFe por resDFe e chNFe por chDFe (para quem baixa as Notas). Trocar os resCTe por resDFe e chCTe por chDFe (para quem baixa os Conhecimentos). Trocar os resMDFe por resDFe e chMDFe por chDFe (para quem baixa os Manifestos).
  12. 9 points
    Estão todos de parabéns, foi um ótimo evento e estaremos no próximo com certeza! Palestras esclarecedores e uma fonte enorme de promovermos o contato profissional! A única dúvida que ficou no ar é quem é @BigWings kkkkkk
  13. 9 points
    Apliquei algumas correções nos fontes:
  14. 9 points
    Bom dia a todos, Dentro de alguns minutos vou estar disponibilizando os fontes do componente ACBrNFe com as alterações necessárias para suportar a nova versão 3.10 da NF-e e NFC-e. A liberação do ambiente de homologação ocorreu no dia 02/12/2013 para ambos os modelos de documentos fiscais. Quanto ao de produção esta previsto a liberação para o dia 06/01/2014 ( NFC-e ) e 10/03/2014 ( NF-e ). A versão 2.00 da NF-e vai ser aceita até 01/12/2014, data também prevista para o término da versão 3.00 da NFC-e. Para deixar o componente configuravel a nivel de execução foi acrescentado uma nova propriedade chamada: VersaoDF = Versão do Documento Fiscal. Dica de configuração para que o componente gere o XML no modelo e versão correta: ACBrNFe.Configuracoes.Geral.ModeloDF := moNFe; ACBrNFe.Configuracoes.Geral.VersaoDF := ve200; No exemplo acima o XML a ser gerado vai ser o da NF-e na versão 2.00 Valores aceitos pela propriedade ModeloDF: moNFe e moNFCe. Quando o modelo for moNFe, os valores aceitos pela propriedade VersaoDF são: ve200 e ve310. Quando o modelo for moNFCe, os valores aceitos pela propriedade VersaoDF são: ve300 e ve310. Como o componente esta ganhando uma nova propriedade, se faz necessário a compilação do pacote de instalação do mesmo ou a sua reinstalação com o ACBrInstall, caso contrario essa nova propriedade não vai aparecer no Object Inspector. Favor reportar erros e problemas.
  15. 8 points
    É com muita satisfação que recebemos a ELGIN, como patrocinadora do Dia do ACBr... Participe do Dia do ACBr e conheça os produtos e a equipe técnica da ELGIN... Conheça a Plataforma Fiscal Elgin, que será lançada no Evento
  16. 8 points
  17. 8 points
    Os pacotes de impressão ACBr que utilizam Fortes foram atualizados e já estão disponíveis no repositório.
  18. 7 points
    Bom dia pessoal, Com a versão 3.00a do CT-e temos um novo evento chamado Comprovante de Entrega. Esse evento é emitido pela própria transportadora e não pelo destinatário da mercadoria. Nesse evento temos um campo obrigatório chamado hashEntrega, cuja descrição: Hash (SHA1) no formato Base64 resultante da concatenação: Chave de acesso do CT-e + Base64 da imagem capturada da entrega (Exemplo: imagem capturada da assinatura eletrônica, digital do recebedor, foto, etc) Nota 1: A critério do autor deste evento, este campo pode ser utilizado como índice para acesso as informações do Comprovante de entrega. Nota 2: A SEFAZ não tem nenhum controle sobre a informação deste campo. Observação: 28 caracteres são representados no schema como 20 bytes do tipo base64Binary. Nesse primeiro momento o componente não esta calculado o hash ficando a cargo da aplicação do desenvolvedor, pois vamos verificar a possibilidade de implementar. Para quem utiliza o ACBrMonitor abaixo segue um exemplo de como montar o arquivo INI do evento de Comprovante de Entrega: [EVENTO] idLote=1 [EVENTO001] chCTe= chave do CT-e cOrgao= Codigo da UF CNPJ= CNPJ do emitente dhEvento=25/07/2019 10:30:00 tpEvento=110180 nSeqEvento=1 nProt= numero do protocolo de autorização do CT-e dhEntrega=24/07/2019 17:30:00 nDoc= Documento de identificação da pessoa que recebeu a entrega xNome= Nome da pessoa que recebeu a entrega latitude= Latitude do ponto da entrega (detectado pelo equipamento do transportador, exemplo: PDA, tablet, celular) longitude= Longitude do ponto da entrega (detectado pelo equipamento do transportador, exemplo: PDA, tablet, celular) hashEntrega= Hash (SHA1) no formato Base64 resultante da concatenação: Chave de acesso do CT-e + Base64 da imagem capturada da entrega (Exemplo: imagem capturada da assinatura eletrônica, digital do recebedor, foto, etc) dhHashEntrega= Data e hora da geração do hash da entrega ; xxxx pode variar de 0001 até 2000 [infEntregaxxxx] chNFe= chave da NF-e da mercadoria que foi entregue Para quem utiliza o componente, abaixo temos um exemplo de como enviar o evento em questão: ACBrCTe1.EventoCTe.Evento.Clear; with ACBrCTe1.EventoCTe.Evento.New do begin infEvento.chCTe := ChaveCTe; infEvento.CNPJ := CNPJEmitente; infEvento.dhEvento := now; infEvento.tpEvento := teComprEntrega; infEvento.nSeqEvento := 1; infEvento.detEvento.nProt := nProtocoloAutorizacao; infEvento.detEvento.dhEntrega := datahoraEntrega; infEvento.detEvento.nDoc := NumeroDocumento; infEvento.detEvento.xNome := NomedoRecebedor; infEvento.detEvento.latitude := fLatitude; infEvento.detEvento.longitude := fLongitude; infEvento.detEvento.hashEntrega := hashdaEntrega; infEvento.detEvento.dhHashEntrega := datahhoradoHashEntrega; InfEvento.detEvento.infEntrega.Clear; // o bloco abaixo poderá se repetir por até 2000 vezes with InfEvento.detEvento.infEntrega.New do chNFe := ChaveNFe; end; ACBrCTe1.EnviarEvento( 1 ); // 1 = Numero do Lote
  19. 7 points
    Olá Pessoal, Muitos tem interesse em obter o XML do fornecedor para facilitar a entrada dos materiais no Estoque, Contas a Pagar, etc. Segundo a legislação, quem emite uma NF-e tem por obrigação legal de disponibilizar o XML assinado e com o protocolo de autorização ao destinatário da mercadoria, assim que a SEFAZ autorizar a nota. Essa disponibilização pode ser feita por e-mail, ou seja, o emitente envia para o destinatário o XML via e-mail. Sabemos que isso nem sempre ocorre, por 2 motivos: 1. No cadastro do destinatário não consta o endereço de e-mail; 2. A aplicação do emitente não possui esse recurso ou esta desativado. Mas temos uma alternativa. Com certeza o DANFE foi impresso e entregue junto com a mercadoria. De posse do DANFE temos a chave e com ela podemos primeiramente enviar o evento de Manifestação do Destinatário. Temos duas situações: 1. Se as mercadorias foram entregues conforme o combinado, devemos enviar o evento: Confirmação da Operação (Código: 210200); 2. Se algo estiver errado e alguma mercadoria esta errada, quebrada, ...., devemos enviar o evento: Operação não Realizada (Código: 210240), neste evento se faz necessário informar uma justificativa. Após manifestar todas as notas, podemos obter o XML através do método: DistribuicaoDFePorChaveNFe, esse método possui 3 parâmetros, sendo eles: Código da UF do Destinatário, CNPJ do Destinatário e a Chave da NF-e previamente manifestada. Conclui-se que devemos executar o método acima para cada nota manifestada. Informação importante, tanto a Manifestação do Destinatário quanto o Distribuição DF-e, são atendidos pelo Ambiente Nacional, portanto não tem nada haver com a SEFAZ-Autorizadora do emitente da nota ou do destinatário da mercadoria. Se algo falhar nesse processo, a "culpa" é do Ambiente Nacional.
  20. 7 points
    Sim, pensei nisso... alias essa foi a decisão mais difícil... Há prós e contras... fazer um evento desse porte em SP é no mínimo 4x mais caro... (porém é bem mais rápido de vender) No fim, os fatores decisivos, para escolher o Interior, foram: O (terrível) transito de SP, e as espaçosas acomodações do Parque Tecnológico de Sorocaba
  21. 7 points
    Olá pessoal. Temos novidades na área das impressões dos DF-e. Com o objetivo de facilitar o trabalho e reduzir a duplicação de código, estamos promovendo um refactoring nas classes de impressões de DF-e. Essas alterações ainda não foram enviadas ao SVN, mas queremos avisar com antecedência para que todos possam se preparar. Fizemos um vídeo para explicar os objetivos e as principais alterações. Você pode acessar aqui: Mas... se você não é muito fã de vídeos, vou resumir os principais pontos nesse tópico. Os objetivos desse refactoring são: Diminuir código duplicado; Padronizar os componentes de impressão; Isso vai simplificar o trabalho com componentes diferentes; Minimiza a necessidade de aprender vários detalhes diferentes; Melhor organização de código; Mais fácil pra você ler, entender e debugar o código; Lançar base para melhorias futuras; Podemos resumir a principal diferença como: Agora há classes para padronizar o comportamento mesmo em componentes de impressão diferentes. Na nova estrutura os componentes de impressão herdam da classe base TACBrDFeReport (unit ACBrDFeReport.pas) que se encontra no pacote ACBrDFeComum. Esta classe visa englobar todas as propriedades e/ou métodos que são usados por todas as impressões DFe. Por exemplo: PathPDF, CasasDecimais, etc.. Se assemelha a esse organograma: Veja algumas propriedades que foram alteradas, removidas ou mudaram de nome: Essas são as modificações principais. Podem haver outras, mas acreditamos que são menores e darão menos dor de cabeça. A previsão é enviar ao SVN antes do Dia do ACBr. Assim que enviarmos ao SVN vou postar uma nova mensagem aqui.
  22. 7 points
    Gostaria de deixar registrado meus agradecimentos a todos que colaboram com esse projeto, principalmente por solucionar situacoes criticas (Software-houve - Cliente ) do qual me sinto segunro em sempre usar esse pacote maravilhoso (acbrmonitorplus) integrador show de bola. Obrigado a todos mais uma vez
  23. 7 points
    D7 já está morto faz tempo... não faz sentido ficar preso ao passado... para quem tem como descupa o custo de uma nova IDE, hoje em dia o Lazarus/FPC é muito melhor do que o D7, e "de grátis" (na DJSystem já usamos o mesmo a anos)... Os novos Delphis XE, são fantásticos, e ainda compilam para Mobile... sinceramente, não vejo porque ficar preso ao passado
  24. 7 points
    Queria deixar os meus parabéns a todos os envolvidos no projeto do Trunk2. As melhoras na estrutura e no código do componente nessa remodelação estão fantásticas. Sei que dificuldades iniciais existirão para todos, mas o benefício dessa reestruturação, no meu ponto de vista, são incalculáveis para o projeto. Espero conseguir em breve voltar a colaborar (como antes) para esse grande projeto que é o ACBr. Grande abraço e bons códigos a todos. João Henrique
  25. 6 points
    Visulizar Arquivo Como agregar valor ao software com dados fiscais e gerenciais inteligentes Por: Marco Polo Viana Forneça informações fiscais e gerenciais que já estão no seu sistema e não são exploradas. Eles podem alertar os usuários preventivamente de riscos e cenários importantes Autor Daniel Simoes Enviado 24-09-2019 Categoria Dia do ACBr 2a edição  
  26. 6 points
    Opa! Não entendi muito bem sua pergunta. Mas vamos lá... Caso queira baixar notas fiscais emitidas CONTRA o CNPJ do seu cliente. Deve-se utilizar o método de DistribuicaoDFe. (Aqui uma explicação, e aqui um exemplo prático) Observação 1: você consegue baixar um resumo das notas fiscais para que seja possível você realizar o manifesto. Após o evento de manifestação o Ambiente Nacional disponibiliza o XML da nota em questão. Observação 2: O Ambiente Nacional disponibiliza o resumo/DFe apenas se o seu cliente for o Destinatário, Transportadora ou o CNPJ estiver na tag <AutXML>. Caso queira RECUPERAR um ou mais XML EMITIDO pelo seu cliente. Deve-se alimentar o componente com os dados da venda/nota, assinar e consultar. (Aqui um exemplo prático) Observação 1: Não é muito indicado ficar fazendo isso. Já que na lei diz que o contribuinte é obrigado guardar o XML do documento fiscal. Observação 2: Caso você tenha o XML assinado, você pode carregar o XML e executar o método Consultar apenas... Dessa forma o XML será atualizado com o protocolo. Observação 3: O único método oficial pela SEFAZ é realizar o download do documento fiscal diretamente pelo portal, utilizando o certificado digital. Sites como Arquivei lite fornece um XML válido porém sem validade jurídica já que a assinatura não é a do emitente.
  27. 6 points
    Boa tarde a todos, Vocês devem ter notado que os componentes mencionados ao configurar para o ambiente de teste devemos atribuir o valor taHomologacao a propriedade de configuração: Ambiente. Mas ao alimentar qualquer evento o valor atribuído ao campo tpAmb tem que ser taProducaoRestrita que nada mais é do que um ambiente de teste, ou seja, homologação. Não me perguntem porque os responsáveis pelo e-Social e Reinf resolveram chamar o ambiente de teste de Produção Restrita em vez de Homologação. É sabido que o tipo de ambiente informado na configuração tem que ser o mesmo ao alimentar os dados do evento, para facilitar a vida resolvi remover o campo tpAmb. Isso vai fazer com que ao compilar a sua aplicação após a atualização dos fontes da suíte ACBr vai ocorrer erros de compilação, apontando para o campo tpAmb e acusando o mesmo de não existir. Como proceder? Simples, remova a linha da sua aplicação que contem o campo tpAmb nas rotinas que alimentam os eventos. A geração da tag <tpAmb> vai conter o valor atribuído ao configurar o componente. Se o valor de Ambiente = taProducao a tag receberá o valor 1, por outro lado se for igual a taHomologacao receberá o valor 2 que é o mesmo valor de taProducaoRestrita. Com essa alteração nos componentes ACBreSocial e ACBrReinf nunca mais vai ocorrer de um evento ser rejeitado pelo fato do tipo de ambiente informado no XML ser diferente do ambiente para o qual foi enviado. O envio dessa alteração para o repositório ocorra amanhã (29/03/2019).
  28. 6 points
    Bom dia, ALA. Sugiro assinar o SAC para que você possa ter acesso a todo o conteúdo do Dia do ACBr, documentos, vídeos, download e muito mais! Lembrando que você pode assinar um mês, sem cobranças futuras! É uma boa oportunidade e uma grande fonte de conhecimento... Para contratar o SAC, veja esse link: https://www.projetoacbr.com.br/forum/sac/sobre/
  29. 6 points
    https://www.embarcadero.com/products/rad-studio/whats-new-in-10-3-rio Lembrando que o Delphi Communitty Edition também é atualizado. basta usar o mesmo instalador.
  30. 6 points
    Ola.. Galera.. Seguindo a Recomendaçao do icaro.. vamos la. Já fui um Cara forte e fraco, ja´foi o Doutor Hass, e ja fui tambem Mestre Jedi. Atualmente sou o Senhor dos Windevs. e Porque isso. Eu sempre postei videos, aulas, ha muitos anos,tenho muitos blogs, e videos. mas a 3 e meio conheci o windev, e paixao a primeira vista. quando eu estava aprendendo, eu ja fazia video, e virou o sucesso que é hoje. Ja dava aula em cursinho em 88, e posso dizer que ja consegui fazer muitos virarem programadores, e ganham seu dinheiro hoje. e ate hoje faço isso. Posso dizer que depois que me for , ficarei na eternidade. Atualmente preciso chegar a 1000 inscritos , e ja estou com 824. Se quizerem se inscrever no canal vamos la.. convido a todos. Canal Youtube: Amarildo Matos
  31. 6 points
    Nessa página do Portal, temos um bom índice de como achar, Info, Manual e Download do MonitorPLUS https://www.projetoacbr.com.br/acbr-monitor-plus/
  32. 6 points
    Olá pessoal.. Pedimos desculpas a todos, por estarmos fora do ar, no dia de hoje, durante várias horas... Tivemos um problema no arquivo de atualização enviado pelo Invision Power Board Isso corrompeu a tabela com os Temas e nos obrigou a restaurar um Backup de hoje cedo... Ou seja... pode haver perda de alguns dos tópicos postados hoje... Antes de restaurar o Backup de hoje cedo, eu fiz uma cópia do Banco no Estado que estava... então, se necessário, posso tentar restaurar alguns dos tópicos perdidos... Também recebemos cópias dos tópicos e fórum que assinamos.. então se for o caso, por favor fiquem a vontade para repostar os tópicos que foram acidentalmente removidos... Mais uma vez, pedimos sinceras desculpas pelo ocorrido...
  33. 6 points
    Bom dia a todos recentemente os clientes da empresa em qual trabalho vem recebido emails falsos de cobrança com boletos falsos, porem contendo informações verdadeiras.. como a compra realmente existir, dados cadastrais do destinatário e do remente vencimento e valor, apos muita investigação cheguei a seguinte conclusão: Estão usando portal da nfe, os hackers consultam chaves aleatoriamente no portal da nfe, e como exige apenas um captcha eles tem acesso as informações da empresam, do cliente e do financeiro usando apenas um parser de html simples ( como muitos usam para "baixar" o dito xml do portal se o uso do certificado digital) e como no portal é exibido também o e-mail do destinatário fica de prato cheio a eles. Isso descobri após uma analise das informações enviadas no boleto falso estão exatamente iguais as informações que registro na nfe que tem alguns detalhes diferentes de quanto eu envio o boleto real ao meu cliente. Como medida de segurança parei de enviar o e-mail do cliente em meus xmls, desta forma ao consultar a informação no portal do nfe ele nao tem como enviar ao cliente
  34. 6 points
    Bom dia Galera um amigo conseguiu fala com a Sefaz, eles informaram que é um erro de sistema e que até as 11h estaria solucionado
  35. 6 points
    O componente foi atualizado, bem como o demo demonstrando os novos campos, basta atualizar e testar. Aproveitei e adicionei as tabelas de todos os estados ao repositorio SVN também, as tabelas se encontram no diretório: "<ACBr>\Exemplos\ACBrIBPTax\tabela\"
  36. 6 points
    Boa tarde maikews, Segundo a legislação, a Nota Fiscal hoje é um arquivo eletrônico no formato XML, assinado digitalmente pelo emitente e protocolado pela SEFAZ autorizadora do mesmo. Portanto o XML nas condições acima é um Documento Fiscal válido Juridicamente, logo não se trata de um arquivo XML qualquer. Na legislação consta também que o Emitente é obrigado a disponibilizar o XML assinado e protocolado de forma imediata ao destinatário da mercadoria assim que ele obter o protocolo de autorização da SEFAZ. E se uma transportadora for envolvida no transporte dessa mercadoria, ela também tem o direito de receber o XML da NF-e. No meu entendimento a maneira mais simples de disponibilizar um arquivo de computador a outra pessoa, é simplismente envia-lo por e-mail. O Destinatário e a transportadora no caso tem a obrigação de solicitar o arquivo junto ao emitente, principalmente o Destinatário, pelo simples fato de que ambos, emitente e destinatário devem possuir e guardar pelo tempo legal (5 anos) o XML da NF-e para fins de fiscalização. Caso o emitente se recuse a disponibilizar, o destinatário pode e deve no meu entendimento denunciar junto ao Fisco a atitude do mesmo. A SEFAZ não pode e não vai disponibilizar o XML de um transação comercial para Deus e todo mundo. Veja bem não estamos falando de um XML qualquer, trata-se de um documento fiscal. Não estou criticando ninguem apenas interpretando a legislação.
  37. 6 points
    Olá Pessoal! Então... acho que tenho boas notícias... Conforme o Daniel havia dito, era pra funcionar como se fosse no no Linux (a compilação). No entanto, haviam alguns ifs de diretivas ( não sei bem como vocês chamam esses ifs aqui ) meio restritivos... Para o OS X usamos { $IFDEF DARWIN }... e para o Linux, analogamente { $IFDEF LINUX }. Porém para evitar a repetição de código desnecessária... e observando a similaridade dos *unix ( Mac OS e Linux ) , arrisquei mudar ambos para { $IFNDEF MSWINDOWS }. É claro que o mínimo possível (só onde houve erro). Não sei se mexi em algo que não devia ( acho que não ), mas para tirar qualquer dúvida segue uns prints da diferenças entre os arquivos que alterei... (apenas dois arquivos: ACBrUtil.pas e GIf3.pas). ../Fontes/ACBrComum/ACBrUtil.pas ..Fontes/ACBrDiversos/Gif3.pas Bom, mas até aqui houve um pequeno avanço. Até então nada instalava agora consegui instalar os pacotes ACBrComum e ACBrDiversos. O que mais preciso é o serial, portanto amanhã volto a trabalhar nisso. Abaixo segue alguns screens dos componentes instalados... (poucos ainda..., mas lindos!) Testei alguns projetos (exemplos) e rodaram normalmente... Bem pessoal... por hoje é só... Mas amanhã vou tentar mais avanços. Se vocês acharem que as modificações feitas não quebram a compatibilidade com as outras plataforma (não tive tempo de verificar isso) e que são pertinentes, eu posso enviar os arquivos alterados... (apesar que, por enquanto, as alterações forma mínimas) Por enquanto, muito obrigado a todos pela atenção e pelas opiniões. []`s Messias Henrique
  38. 5 points

    Version 1.0.0

    51 downloads

    Veja o vídeo da Palestra Não sabe direito nem o que é um boleto e seu cliente está te apertando para colocar no sistema? Nunca ouviu falar nem de remessa, nem de retorno? Pode ficar tranquilo, o Bruto vai te guiar pelas noções desse mundo de boletos. OU, já fez tudo o que tinha que fazer, mas não sabe exatamente qual propriedade preencher pra gerar o valor que o banco pede na posição 130 a 135? O bruto vai te ensinar a dissecar os fontes do componente até as entranhas dele para descobrir tudo o que você necessita.
  39. 5 points
    Bom dia Sergio, o interessante é você consultar um analista contábil pra te ajudar nesse quesito, ele saberá (ou ao menos deveria) responder todos seus questionamentos acerca do assunto com maior exatidão. Há várias regras e situações diferentes para cada empresa, então fica complicado lhe passar como são feitos os cálculos sendo que pode resultar em problemas futuros, ao menos em minha opinião, não é mesmo? Abraço
  40. 5 points
    E quando terceiros prestam serviço de manutenção? Quem é o responsável técnico? Dúvidas assim podem surgir quando fixamos na mente mais a ideia de um "representante da classe de programação" perante a lei do que na ideia de um responsável pelo sistema. Talvez isso aconteça porque o termo usado é "responsável técnico". Logo nos vem a mente um engenheiro responsável pela obra e tal... Mas veja bem, a ideia do responsável técnico, é ter uma "pessoa" para quem a Sefaz vai mandar um e-mail quando quiser falar sobre o software emissor do DF-e. Como dito antes, suponha que o software emissor tentou retransmitir a mesma NF-e com erros no XML, por 70.000 vezes... ou seja, mesmo recebendo o erro de rejeição por XML inválido, a aplicação ficou em algum Loop, tentando retransmitir o mesmo XML que já sabia era rejeitado, isso por 70 mil vezes. Nesse caso, quem a SEFAZ deveria contatar? Pensar nesses termos, nos ajuda a entender o motivo das tags Responsável Técnico e assim saber como preencher. Vamos a dois exemplos, com base nas perguntas desse link: Imagine uma microempresa, distribuidora de produtos de limpeza, que para emitir a notas fiscais, paga a um programador fazer as alterações nos fontes de um sistema emissor. Esse programador é pessoa física. Como fica esta situação? Não se engane. A resposta depende mais do tipo do vínculo entre eles e menos de o programador ser uma pessoa física. A questão que deve ser respondida é: Quem é o responsável pelo software? Quem a SEFAZ deve contatar caso queira falar sobre o sistema? Isso vai depender de cada caso e talvez de cada UF. Responder algumas perguntas podem ajudar a resolver a questão: Atualmente, o sistema é da ME distribuidora de produtos de limpeza? O programador é chamado como um terceirizado ou mesmo como funcionário temporário da empresa, não tendo de fato vínculo com o sistema? Por exemplo, ele pode ser substituído por outro programador? (Note, não importa aqui o conhecimento interno do sistema...) Se a resposta a essas perguntas for sim então, a menos que algo diferente esteja em contrato, o responsável técnico é a empresa distribuidora de produtos de limpeza.  Ela contrata outra pessoa para dar manutenção mas, ainda assim, ela é responsável, porque o sistema é dela. No PAF-ECF, chamávamos isso de "sistema próprio". Quer dizer próprio da empresa. Não é um sistema que ela aluga. Caso alguma resposta para as perguntas for não, então, provavelmente, o responsável técnico é o programador. Será necessário verificar com a UF como ele deve ser informado já que ele não tem CNPJ. No caso da empresa ter uma pessoa que saiba programação e faça estas alterações mas não é programador registrado e sim diretor ou gerente ADM, como fica? Nesse caso, sem dúvida, o responsável técnico é a própria empresa. Ela tem um sistema próprio, desenvolvido internamente para emitir os DF-e. Não importa se quem faz as alterações é um programador ou o contínuo da empresa. O importante é quem é responsável perante a SEFAZ e, nesse caso, é claro que a SEFAZ não vai querer saber quem deu manutenção no sistema. Quando ela precisar falar com um responsável, ela vai querer contatar diretamente a empresa. Afinal de contas, se a empresa não quisesse isso ela teria contratado um sistema de alguém ao invés de permitir um funcionário (ou sobrinho do dono) criar o sistema.
  41. 5 points
    Atenção: Há atualizações das informações desta homologação nas respostas deste tópico. Revisão: 1 --- Introdução: Recebemos gentilmente da Sweda, a impressora não fiscal SI-300S, para testes. Utilizando os exemplos do ACBr, PosPrinterTeste.exe e SATTeste.exe. Ambiente: Computador Desktop Dell Vostro 220s Sistema Operacional Windows 8.1 64Bit atualizado (19/12/2017) Processador Intel Pentium Dual Core Memória 2 GB USB 3.0 Porta Serial física Identificado como COM1 usando conector DB9 Impressora SI-300S Protocolo Epson Esc/Pos Meios de comunicação Serial Física usando conectores DB9 ou RJ45 Serial emulada através da porta USB USB Disposição dos Dip-Switches e Impressão do Autoteste: Antes de realizar a etapa da instalação da impressora no Sistema Operacional, é necessário definir a disposição dos dip-switches de acordo com o meio de comunicação desejado, ou seja, eles definirão se a comunicação será USB ou emular uma porta serial COM pelo USB. Um dip-switch é um componente eletrônico com várias chaves liga/desliga. Na base da impressora há uma tampa para acesso aos dois dip-switches existentes, eles permitem definir várias configurações. O DIP SW1 define as configurações de porta serial, emulada ou não. Por exemplos: velocidade em baud, tipo de paridade, tamanho da palavra, etc. O DIP SW2 define configurações gerais como: habilitar campainha, habilitar guilhotina, densidade da impressão, etc. Para realizar o acesso e a alteração dos dip-switches, recomendamos a leitura do manual de instalação do fabricante. Link: http://sistemas.sweda.com.br/downloads/535_manual_de_instalacao_si3aa.pdf Para saber qual a disposição dos dip-switches sem abrir a impressora, imprima um autoteste. Para tal, com a impressora desligada, ligue a impressora com o botão FEED pressionado: Será impresso um autoteste e nele constará a disposição atual dos dip-switches. No exemplo abaixo, a chave 8 do dip-switch 1 é a única ligada: Será exatamente esta chave que faremos alterações para alternar entre os meios de comunicações da impressora. Nos procedimentos de instalação da impressora, será exibido como a chave 8 deverá ficar. Instalação da Impressora SI-300S: Os drivers e manuais são disponibilizados em um CD que acompanha a impressora. Contudo, utilizamos o driver atualizado disponível no site da Sweda: 509_si_3aal.exe link: http://sweda.com.br/produtos/impressora-nao-fiscal/impressora-termica-sweda-si-300s/ USB/Spooler Windows: Disposição dos dip-switches: Para realizar a instalação siga as etapas abaixo: Realize o download do driver; Conecte a impressora no USB; Será exibido o dispositivo Suporte de impressão USB no Gerenciador de Dispositivos: Com o usuário administrador, execute o driver 509_si_3aal.exe Selecione SI-300S(1) e clique em Next(2? Escolha USB CONNECTION(1) e clique em Next(2? Finalize a instalação aceitando as perguntas feitas pelo instalador; Após a instalação do driver, aparecerá uma nova impressora com o nome Sweda SI-300s USB/COM Emulada: Disposição dos dip-switches: Obs.: Chave 8 ligada habilita a emulação da porta serial através do USB Para realizar a instalação siga as etapas abaixo: Realize o download do driver; Com o usuário administrador, execute o driver 509_si_3aal.exe. Quando a janela de seleção de impressoras abrir, clique em Cancel: Obs.: Esse procedimento extrai o driver da Sweda em C:\Program Files (x86)\SWEDA PrinterDriver. Ele se faz necessário porque o instalador do driver não o instala automaticamente. Conecte a impressora no USB; Será exibido o dispositivo USB To Serial Interface(1) no Gerenciador de Dispositivos; Clique com o botão direito e depois em Atualizar Driver(2? Clique em Localizar e instalar software manualmente: Clique em Procurar e selecione o caminho abaixo(1), deixe Incluir subpastas(2) selecionado e clique em Avançar(3? Após finalizar a instalação, o dispositivo serial COM7 foi instalado: Não instale o driver de spooler da impressora caso queira usá-la com comandos Esc/POS. O driver de spooler mantém a porta serial ocupada, não permitindo o uso por outro programa. USB/COMxx com Spooler do Windows: Disposição dos dip-switches: Obs.: Chave 8 ligada habilita a emulação da porta serial através do USB. Para realizar a instalação siga as etapas abaixo: Execute da etapa 1 até a 9 do procedimento USB/COMxx descrito acima; Com o usuário administrador, execute o driver 509_si_3aal.exe Selecione SI-300S(1) e clique em Next(2? Escolha SERIAL / VCOM CONNECTION(1) e clique em Next(2? Selecione a mesma porta COM exibida no Gerenciador de Dispositivos: Clique em Next: Finalize a instalação aceitando as perguntas feitas pelo instalador; Após a instalação do driver, aparecerá uma nova impressora com o nome Sweda SI-300S; COMxx: Disposição dos dip-switches: Não há necessidade de alteração. Conosco funcionou com a chave 8 do DIP-SW1 ligada e desligada. Não se faz necessário realizar quaisquer intervenção para utilizá-la no Windows. Basta conectá-la a porta serial do computador e será possível enviar impressões de texto puro (ASCII) para a impressora. Para imprimir usando os componentes do ACBr, se faz necessário configurar a porta serial no componente(1) definindo a velocidade de transmissão (Bauds/segundo). No nosso teste, estamos usando a impressora em sua velocidade máxima de transmissão, ou seja, 115200 Baud(2), portanto definimos as configurações dos componentes conforme ilustra as imagens abaixo: Obs.: As chaves 5, 6 e 7 controlam a velocidade da porta serial. Esta configuração define 115200 Baud Adicionar o Logotipo Para adicionar o logotipo na impressora, se faz necessário o programa SI-300 Tool Ver 2.03, disponível neste link: http://sistemas.sweda.com.br/downloads/SI-300_Tool_Ver_2.03.zip As etapas abaixo descreve como adicionar o logotipo: Selecione o modelo da impressora e a forma de comunicação(1); Selecione a porta serial(2) usada pela impressora e depois clique em OK(3); Clique em User Setup(4); Na aba Select Image(5), clique em Open File(6) e selecione o arquivo de imagem(7) desejado; Ao clicar em Abrir(8), será exibido o arquivo de imagem em Bitmap List(9? Na aba Upload Image(10) clique em Upload(11) e aguarde o envio do arquivo de logotipo para a impressora: Testes usando os componentes e Demos do ACBr Utilizamos o PosPrinterTeste.exe, demo do ACBrPosPrinter, parte do projeto ACBr, para efetuar testes na impressora. O PosPrinterTestes.exe está disponível neste link: https://www.projetoacbr.com.br/forum/files/file/364-posprintertesteexe/ Deixamos as configurações desta forma: Modelo: ppEscPosEpson; Porta: COM7; Colunas: 42; Pag. codigo: pc860; Demais configurações não alteramos; Testes de comunicação: Testamos os 3 tipos de comunicação com a impressora (Campo Porta): COMxx– Para comunicação serial por uma porta COM existente no computador. No nosso ambiente, o Windows a definiu como COM1; USB/COMxx(Emulada)– Para comunicação virtual serial. No nosso ambiente reconheceu COM7; RAW:nome da instalação da impressora (USB)– Para enviar a impressão ao Spool do Windows em modo RAW. (exemplo: RAW:SWEDA SI-300S) RAW:nome da instalação da impressora (USB/Serial)– Usando também o Spool do Windows, mas através do USB/COMxx; Resultados: As imagens abaixo exemplificam os resultados dos testes padrões do ACBrPosPrinter. Observe que apenas o código de barras code128c com 44 caracteres não foi impresso. Acreditamos que o motivo seja o limite de 42 caracteres por linha da impressora, pois realizamos alguns testes e chegamos a, no máximo, 41 caracteres impressos para este padrão. As demais impressões o equipamento se saiu muito bem, efetuando corretamente a impressão de acordo com os comandos suportados pelo protocolo Epson Esc/Pos: Formatação de Carácter; Alinhamento; Leitura de Informações; Logotipo; Código de Barras; QRCode; Teste de acentuação: Para realizarmos os testes de acentuação com diferentes páginas de código, procedemos da seguinte forma: Inserimos um pantograma da língua portuguesa, contendo todas as letras e acentos(1); No cabeçalho foi colocado a tag </zera>(2) para limpar as configurações a cada teste; Foi realizada uma impressão por página de código disponível na impressora(3); pc473: Alguns acentos agudos e circunflexos foram ignorados; pc850: Todos os acentos foram impressos corretamente; pc852: Todos os acentos circunflexos e o til foram ignorados; pc860: Todos os acentos foram impressos corretamente; pc1252: Todos os acentos foram impressos corretamente; Leitura de Status: A leitura de Status é funcional através das portas seriais física e emulada (COM1 e COM7 respectivamente). Abaixo alguns status retornados pela impressora: Pronta para uso: “Nennhum Erro encontrado”; Tampa aberta: “stErro, stSemPapel, stTampaAberta,”; Pouco papel: “Nenhum Erro encontrado”; Sem papel: “stErro, stSemPapel,”; Gaveta aberta: “stGavetaAberta”; Demais testes: Gulhotina: Cortou no local esperado. Suportou corte completo e destacável; Abertura de gaveta: Funcionou de forma esperada; Impressão de extratos do SAT com SATTeste: O SATTeste é um demo do ACBrSAT, parte do projeto ACBr. Realize o download neste link: https://www.projetoacbr.com.br/forum/files/file/316-sattesteexe/ Testamos a impressão usando o Spool do Windows através do Gerador de Relatórios Fortes Report, e também usando a impressão em ESC/POS. As configurações utilizadas foram as seguintes: Fortes EscPOS Largura: 277 Topo: 0 Fundo: 0 Esquerda: 1 Direita: 1 Colunas: 42 Espaço Linhas: 10 Linhas Pular: 2 Pag.codigo: pc860 Modelo: ppEscEpson Porta: COM7 Exemplo de um cupom fiscal impresso pela SWEDA SI-300S, usando comandos EscPOS(Esquerda) e Fortes (Direita): Teste de desempenho: Através de comandos EscPOS, realizamos a impressão de vários extratos de SAT com diversas quantidades de itens, coletando os tempos de impressão. Para uma medição mais precisa do tempo de impressão do equipamento nos testes envolvendo o Spooler do Windows (RAW:SWEDA SI-300), não usamos o gerenciamento de fila de impressões do Spool do Windows nos testes , devido ele usar a memória do computador para gerenciar a fila de impressões. Portanto, habilitamos a opção Imprimir diretamente na impressora na aba Avançado nas Propriedades da impressora. Desta forma, o serviço de Spooler do Windows apenas repassa a impressão diretamente para a impressora, não gerenciando a fila de impressões para o equipamento. Todas as formas de comunicação disponibilizada pela SI-380S foram testadas: USB/Spooler do Windows: As configurações foram as seguintes: Modelo: ppEscEpson Porta: RAW:SWEDA SI-300S Colunas: 42 Espaços Linhas: 10 Linhas Pular: 2 Pag. codigo: pc860 Resultados: USB/COM emulada: As configurações foram as seguintes: Modelo: ppEscEpson Porta: COM7 Colunas: 42 Espaços Linhas: 10 Linhas Pular: 2 Pag. codigo: pc860 Resultados: USB/COM emulada com Spool do Windows: As configurações foram as seguintes: Modelo: ppEscEpson Porta: RAW:SWEDA SI-300S Colunas: 42 Espaços Linhas: 10 Linhas Pular: 2 Pag. codigo: pc860 Resultados: COM física: Verificamos que ao enviar impressões em Esc/Pos, com Extratos de 500 itens na COM física, a impressora não finaliza a impressão. Acreditamos que seja algo relacionado com ao tamanho do buffer. Porém, como a impressão é feita através da porta COM, foi possível contornar esta situação, usando uma configuração específica em ACBrPosPrinter.Device, que permite configurar o tamanho máximo do buffer na porta COM. ACBrPosPrinter.Device.SendBytesCount: Determina o número máximo de bytes a serem enviados pela porta. ACBrPosPrinter.Device.SendBytesInterval: Determina o número de milissegundos a aguardar, antes de enviar o próximo Buffer de dados Para efetuar tal configuração no SATTeste, vá na aba Impressão(1), clique no ícone de configuração(2), e configure o Buffer de Envio(3) e o Espera Buffer (4) conforme imagem abaixo: Obs.: O tempo de impressão foi o mesmo usando um tamanho de Buffer alto como 8192, quando usando o valor 1024. As configurações foram as seguintes: Modelo: ppEscEpson Porta: COM1 Colunas: 42 Espaços Linhas: 10 Linhas Pular: 2 Pag. codigo: pc860 Resultados: Sobre o equipamento: A impressora Sweda SI-300S tem um gabinete bem resistente. Em sua base há alguns orifícios permitindo fixá-la na parede. A chave liga/desliga fica protegida, evitando o seu acionamento de forma acidental. O botão de avanço do papel e as luzes de sinalização de estado estão em inglês, dificultando um pouco a interpretação, por exemplo, o aviso que está acabando papel (paper out). No topo há uma alavanca para abrir o compartimento da bobina de papel, facilitando sua troca. Ela permite a comunicação por USB, porta serial física através de conectores DB9 ou RJ45, ou porta serial emulada através do USB. Em seu compartimento da bobina de papel, há ranhuras para a instalação de uma divisória permitindo bobinas de 58mm. Esta divisória é um componente opcional, portanto não acompanha a impressora. Sobre a utilização do equipamento: O processo de instalação para comunicação através do USB e porta serial física foram simples. Em poucos minutos a impressora estava pronta para o uso. Para a instalação da porta serial emulada pelo USB, foi preciso realizar a instalação de forma manual. A SI-300S demonstrou-se bastante rápida para realizar impressões. Para tal, definimos a velocidade de impressão como 220mm/sec e velocidade de comunicação do serial como 115200 bauds por segundo. Essas configurações foram feitas através da ferramenta SI-300 Tool Ver 2.03 e pelos dip-switches presentes na impressora. Ficha técnica fornecida pelo fabricante: Características de Software: Impressão de Código de Barras 1D (Inclusive Code 128) Impressão de Código de Barras 2D (Inclusive o QR Code) Impressão de Logomarca Mecanismo de Corte Automático Modo Gráfico Nativo Código de Barras Nativo Sensores Fim de Papel Tampa Aberta Temperatura da Cabeça de Impressão Drivers Linux, Windows, OPOS Protocolo ESCPOS Nativo 100% Compatível com Automatic Status Back (ASB) Tecnologia de Impressão Método de Impressão: Térmico Velocidade de Impressão: Máx. 270mm/s Resolução: 180 dpi Largura de Impressão: Papel 80 mm (Máx. 72 mm) / Papel 58 mm (Máx. 54 mm) Bobina de Papel Método de carregamento: Drop in / Easy Load Diâmetro do papel: 83 mm (max.) Largura do papel: 80 ± 1 mm Diâmetro interno do tubete: 12 mm Papel recomendado: VCP KPH 856 AM, Hansol HPK-110, Mitsubishi PB670, Mitsubishi PB770 O papel inadequado poderá diminuir a vida útil da cabeça térmica e prejudicar seu funcionamento. Confiabilidade MCBF (Mecanismo): 70 milhões de linhas Cabeça Térmica: 150 km Guilhotina: 1,5 milhão de cortes Interfaces Comunicação: Wi-Fi/ USB Nativo Conexão para Gaveta: 1 porta (+ 24V) Fonte de Alimentação Entrada: 90 ~ 264 V Saída: 24 Vdc, 2.5A Características Físicas Dimensões produto: 137 (A) x 144 (L) x 195 (P) mm Peso produto: 1,9 Kg Dimensões produto embalado: 210 (A) x 235 (L) x 255 (P) mm Peso produto embalado: 3,3 Kg
  42. 5 points
    Um ótimo evento, com certeza só tende a crescer. Foi uma experiência legal, com um ótimo Networking.
  43. 5 points
    Questão: "NT 2018.002 - idCSRT do responsavel técnico pelo aplicativo emissor. Onde adquirir esse codigo?" Resposta SEFAZ/MG em 18/09/2018:
  44. 5 points
  45. 5 points
    Porque nem o Padre Quevedo conseguiria usar a versão 4.00 sem receber um TimeOut Tá bom ACBr, pode me enviar meu boné, por favor?
  46. 5 points
    Ok, acho que foi falha de interpretação da minha parte... Eu pessoalmente acho que a Elgin derrapou no final, em não atuar de forma mais conclusiva nas doações das impressoras... Mas em nenhum momento a Elgin disse que não irá cumprir com o prometido... As impressoras estão sendo entregues, e as falhas estão sendo tratadas... Todos os canais para tratar as falhas, estão abertos, inclusive eu mesmo me dispus a ajudar, nesse mesmo tópico... Em tempo... não faço parte da Elgin, e não recebi nada pelas palestras... mas como o convite partiu do ACBr, eu me sinto no direito de interceder pelos usuários do ACBr... Mas não é muito legal, vir fazer propaganda de fabricante B, sendo que quem promoveu as palestras e distribuiu os brindes, foi o fabricante A... (todo o evento foi gratuito) Convide o fabricante B, para fazer o mesmo que o Fabricante A fez... pode ser em outro estado... 4 palestras e aproximadamente 300 impressoras doadas...
  47. 5 points
    Olá @bylaardt, Agradeço muito as suas sugestões, são de altíssimo nível... Confesso que já pensamos ou temos planos semelhantes a algumas de suas sugestões... Temos algo semelhante.. em: https://www.projetoacbr.com.br/forum/forum/63-equipamentos-testados/ Mas nesse momento, ainda estou "criando a necessidade"... Hoje, em dia, tudo que solicito ao fabricante, para a emissão de um relatório como esse, é um equipamento para testes... Isso já é bom, e nos garante acesso a praticamente todos os equipamentos que lançam... Não cobro pelo tempo do técnico / consultor que demora até 5 dias para escrever um relatório.. mas penso em cobrar no futuro... Não em sua totalidade... Isso faz sentido para os nossos componentes, que suportam equipamentos como: SAT, ECF, Impressoras, balanças... Mas não faz sentido para o componente ACBrNFe, por exemplo (que deve ser o carro chefe do ACBr) O fato do ACBr ser focado principalmente em Delphi / Lazarus, também limita o nosso "poder" de barganha com os fabricantes... Com ACBrXXX.dll, conforme está nos nossos planos, isso pode se tornar cada vez mais evidente e real... No momento vou abrir mão dessa receita, e tentar formar uma comunidade de consultores autônomos (freelancers), em: https://www.projetoacbr.com.br/forum/companies/ Acho que isso pode fortalecer MUITO o projeto... pois favorece o livre comercio e a competição... o usuário que precisa de consultoria pode mudar de "fornecedor", se não gostar do atendimento... e o suporte não irá parar, se uma empresa "fechar as portas".... O consultor que estiver ganhando dinheiro prestando serviços, terá total interesse em contribuir tecnicamente para o ACBr... O modelo de consultoria com "freelancers" parece fazer mais sentido para uma comunidade OpenSource Fizemos alguns testes assim... veja que temos um sub-forum da Epson e da Bematech... Mas acho que faltou irmos mais a fundo... termos realmente um contrato de prestação de serviços com o Fabricante, e garantir que toda dúvida referente ao equipamento dele, será tratada com o mesmo padrão do SAC... Vou tratar isso como prioridade... Mais uma vez, muito obrigado...
  48. 5 points
    Adaptei e corrigi alguns erros da unit YMOFCReader.pas para realizar a leitura das novas versões dos arquivos OFX e OFC. Importar os arquivos OFX/OFC poupa um bom tempo na gestão financeira e agrega valor ao seu software ERP. Disponível neste endereço: https://github.com/leogregianin/ofx-reader
  49. 5 points
    Regys, muito obrigado pela retorno, Deus seja louvado através de sua vida... Muito obrigado Mesmo Daniel respondeu de uma forma direta, obrigado meu amigo...!! Responta que precisava, acabei aqui descobrindo isto na prática, tenho um .exe responsável por códificar / decodificar texto para meu sistema, ao migrar ele para XE "Unicode" usei AnsiString e String... Usando String ao decodificar não voltava para o mesmo texto, alguns caracteres eram perdidos, dai cheguei a conclusão do Daniel, agora ele com sua vasta experiência evidencia o que notei aqui... Muito obrigado a todos, e em parte pressão de vocês me vez evoluir estou satisfeitíssimo com todos os meus projetos na plataforma XE.
  50. 5 points
    Motivo do erro: Ele foi gerado com criptografia 2048 bits. Solução: Converte o certificado para criptografia 1024 bit´s. Passos: Faça download do instalador : http://www.onlinecertificadora.com.br/arquivo/suporte/validcertificadora.zip ou anexo Execute, Seleciona o Modelo A1, Selecione o Certificado e Pronto. Fonte: Alessando - OnlineCerificadora Outra Solução: Instalar no WinXP, Exportar a chave. Xp nao aceita criptografia 2048, ira converter automaticamente para 1024 e ao ser exportado ira manter a criptografia 1024. Cristiano Barbosa
×
×
  • Create New...