Jump to content

2 Dia do ACBr

Agradecemos a todos os presentes. Fotos e vídeos do evento serão disponibilizados em breve.
Site do Evento

Nova Loja Oficial
loja.projetoacbr.com.br
Ajude o projeto a crescer, com estilo

Comprar

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/10/2016 in all areas

  1. 18 points
    PERGUNTA: Eu uso o ACBr. Posso colocar o ACBr como Reponsável Técnico na emissão de algum documento fiscal eletrônico (ou DF-e, isto é, NF-e, NFC-e, CT-e, MDF-e, etc...) ? Mesmo que você use o ACBrMonitor Plus, a ACBrLib, os componente ACBr, algum programa exemplo que disponibilizamos, a resposta simples é NÃO. Não entenda mal. Reafirmamos nosso compromisso em ajudar os usuários do ACBr a resolver seus problemas no uso dos componentes, bibliotecas ou aplicativos que disponibilizamos na medida do possível. E claro, damos prioridades aos casos reportados por usuários que fazem uso do SAC ACBr. Mas não somos o responsável técnico pelo seu sistema, mesmo que ele use qualquer ferramenta que provemos. Talvez você queira entender um pouco mais, então vamos a uma resposta longa sobre isso. Vamos usar como exemplo a NF-e e NFC-e que são de longe os DF-es mais utilizados. Se você ler a nota técnica 2018.005 da NF-e/NFC-e vai encontrar o item "2 Sobre a Identificação do Responsável Técnico". Nesse item há a seguinte frase no parágrafo que explica o que é essa informação (grifo é meu): Veja que a primeira frase menciona que o "responsável técnico" não é simplesmente o desenvolvedor, mas a empresa responsável tecnicamente pelo sistema de emissão. O que neste caso é vocês. Vocês respondem perante seu cliente e perante as autoridades pela emissão do documento fiscal. O ACBr (seja o monitor, lib ou algum componente) nesse processo é apenas uma ferramenta. É como se fosse um framework/biblioteca/componente que ajuda seu sistema e sua empresa a emitir os documentos. Veja, não disponibilizamos sistemas para emissão, apenas ferramentas. Isso fica mais claro quando lemos o restante do parágrafo, porque ele explica não só o que é o "responsável técnico", mas também o objetivo dessa informação. Veja: A ideia é a SEFAZ poder entrar em contato com o responsável pelo emissor em caso de dúvidas ou problemas na emissão. Em caso de anomalias na emissão, com quem a SEFAZ teria que entrar em contato? Por exemplo: Em uma das reuniões do ENCAT, um sistema tentou retransmitir uma nota 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 XML que já sabia era rejeitado... Isso é praticamente um ataque de DDOS, nos servidores do SEFAZ... Quem a SEFAZ teria que contatar se essa empresa fosse seu cliente? É evidente que em caso de dúvidas ou problemas sobre o uso nas empresas que são seus clientes eles deverão entrar em contato com a sua empresa. Afinal de contas, nós não sabemos como seu sistema funciona, nem conhecemos os seus clientes. Ainda mais, o ACBr, (quero dizer ACBrMonitor, ACBrLib, ou qualquer componente ou biblioteca que fornecemos), por si só nunca faz uso de um WebService. Ele é acionado por sua aplicação. Ela, a sua aplicação, é responsável pela emissão. Chamar o ACBr de responsável seria basicamente o mesmo que colocar como responsável a Microsoft porque você usa o Windows nos seus clientes, ou a biblioteca OpenSSL porque você a usa pra assinar os documentos. Existe mais um detalhe, o item "2.1 Código de Segurança do Responsável Técnico - CSRT" que nos ajuda a entender. Esse item fala do credenciamento do software emissor de DF-e na SEFAZ da UF e da empresa responsável. Se sua UF já tem esse cadastro, ou algum cadastro similar como era o caso do PAF-ECF, sem dúvida você entende que é sua empresa e seu software que deve ser cadastrado, independente de usar ou não alguma ferramenta de terceiros em seu sistema. Peraí! Tem mais! No terceiro parágrafo há a seguinte explicação sobre o CSRT, que pode ser exigido em formato de hash: Mais uma vez, se essa é uma informação conhecida somente entre a empresa desenvolvedora e Fisco, não teria como ser disponibilizada por nós. Senão, poderíamos nos passar por você. Seria como você dar seu RG ou Passaporte para outra pessoa se passar por você. Então para pra deixar isso claro pra qualquer pessoa com dúvida no futuro: O projeto ACBr não se responsabiliza por mal uso de nenhum dos programas, bibliotecas, componentes, ou códigos fontes disponibilizados. Usar qualquer um desses, incluindo o ACBrMonitor Plus, não dá direito a ninguém colocar a DJ System ou o Projeto ACBr como responsável técnico, ou de qualquer outra forma responsável perante clientes ou autoridades. Se alguém pensar diferente, informamos que não tem licença para utilizar o que provemos. Pedimos o favor de ler com cuidado as licenças LGPL e GPL que usamos.
  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. 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).
  10. 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
  11. 9 points
    Apliquei algumas correções nos fontes:
  12. 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
  13. 8 points
  14. 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.
  15. 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
  16. 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.
  17. 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
  18. 7 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
  19. 7 points
    @Filipe Natividade estamos em fase final de implementação para liberação, a liberação deve ocorrer até o final da próxima semana, se tudo der certo.
  20. 6 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
  21. 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.
  22. 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).
  23. 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/
  24. 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.
  25. 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
  26. 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/
  27. 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...
  28. 5 points
    Boa tarde, Remova o percurso, quando a UF de inicio faz divisa com a UF de fim não se deve informar o percurso. Detalhe, quanto informar o percurso, devemos colocar somente as UFs entre a de inicio e fim, por exemplo: UFIni = SP UFFim = RS ==> Percurso: PR; SC
  29. 5 points
    Bom dia a todos, Na pasta: ...\Exemplos\ACBrDFe\Schemas\CTe temos os schemas: cteTiposBasico_v3.00.xsd cteTiposBasico_v3.00_Homologacao.xsd O schema cteTiposBasico_v3.00_Homologacao contempla as mudanças ocorridas na estrutura do XML do CT-e na versão 3.00a, já o outro não contempla. Até o dia 25/08/2019 devemos usar o arquivo cteTiposBasico_v3.00 em nossos clientes uma vez que eles estão emitindo os CT-e em produção. Para aqueles que desejam realizar os testes no ambiente de Homologação deverão seguir os passos abaixo: rename cteTiposBasico_v3.00.xsd cteTiposBasico_v3.00_Producao.xsd rename cteTiposBasico_v3.00_Homologacao.xsd cteTiposBasico_v3.00.xsd A partir do dia 26/08/2019 deveremos enviar para os nossos clientes o arquivo cteTiposBasico_v3.00_Homologacao renomeado para cteTiposBasico_v3.00 Isso se a SEFAZ comprir com as datas publicadas.
  30. 5 points
    De forma semelhante ao material disponibilizado pela SEFAZ-MG, a SEFAZ-SP também publicou em seu portal a relação das regras de validação facultativas a UF da NT 2019.001 as quais a mesma exigirá. Clique aqui para visualizar a tabela publicada no portal da SEFAZ-SP.
  31. 5 points
    Boa tarde! Enquanto aguardamos o teu arquivo, aproveito para alerta-lo sobre o CST do IPI. No XML que você postou a operação é de saída e você colocou código CST de IPI como de entrada. Aproveite e corrija isto também, pois poderá ter alguma complicação mais tarde ou receber um email da SEFAZ, já que agora eles estão solicitando as informações do grupo técnico Teu XML: A partir de 01/04/2010 os contribuintes do IPI deverão utilizar a seguinte Tabela de CST/IPI: SAÍDAS 50 – Saída Tributada 51 – Saída Tributável com Alíquota Zero 52 – Saída Isenta 53 – Saída Não Tributada 54 – Saída Imune 55 – Saída com Suspensão 99 – Outras Saídas ENTRADAS 00 – Entrada com Recuperação de Crédito 01 – Entrada Tributada com Alíquota Zero 02 – Entrada Isenta 03 – Entrada Não Tributada 04 – Entrada Imune 05 – Entrada com Suspensão 49 – Outras Entradas
  32. 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
  33. 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.
  34. 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
  35. 5 points
    Pesquisando sobre esse erro, encontrei um tópico que indica que um problema no logo poderia gerar especificamente este erro. Sendo assim, queira por favor atualizar e verificar se as alterações propostas hoje corrigem o problema do logo e também esse.
  36. 5 points
    Um ótimo evento, com certeza só tende a crescer. Foi uma experiência legal, com um ótimo Networking.
  37. 5 points
    Alguns membros do Fórum estão recebendo e-mail indicando um cupom, permitindo desconto nas inscrições do Dia do ACBr. Isso é verdade ! O melhor é que agora você pode ter acesso a esse desconto diferenciado. Para os "de longe" e os "de muito longe" podemos avaliar descontos melhores. Fale conosco pelo [email protected] Agora você ainda não decidiu, seja rápido, pois esse cupom tem quantidade limitada e curto período de validade. Acesse o formulário de inscrição e aplique o código [email protected] no campo indicado conforme abaixo:
  38. 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:
  39. 5 points
  40. 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?
  41. 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...
  42. 5 points
    Notícias do site do EFD-REINF de ontem (18/04): Publicada nova versão dos esquemas XSD de comunicação WSDL da EFD-Reinf. Publicada nova versão do Manual do Desenvolvedor da EFD-Reinf Atualização do Ambiente de Produção Restrita da EFD-Reinf
  43. 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...
  44. 4 points
    Foi enviada uma correção ao SVN favor baixar, recompilar e refazer os testes.
  45. 4 points
    Bom dia. Veja também nossa área relativa aos requisitos Fiscais por UF . Att.
  46. 4 points
    Boa tarde, Muito obrigado pela postagem. Já se encontra disponível no repositório tanto a atualização dos schemas bem como do componente que visa atender a Nota Técnica em questão. Favor atualizar todos os fontes de todas as pastas. Reinstalar a suíte ACBr usando o ACBrInstall_Trunk2 deixando marcado a opção para apagar os arquivos antigos.
  47. 4 points
    Bom dia. O Santander trabalha com o Código de Transmissão também, verifique esta propriedade. Att.
  48. 4 points
    serviço da Sefaz-BA normalizado.... Consultado normal as chaves de acesso atuais e chaves de acesso já autorizadas.
  49. 4 points
    Bom dia! Estou com esta solicitação também de clientes! E consegui emitir em homologação lançando na chave da nota o CPF juntamente com os três zeros complementando 14 dígitos e a série acima de 920 conforme especificação da NT. Alterando o fonte "pcnNFeW.pas" na function TNFeW.GerarXml: Boolean; Logo abaixo xCNPJCPF := nfe.emit.CNPJCPF; efetuei o teste> if length(xCNPJCPF) = 11 then xCNPJCPF := '000' + xCNPJCPF; Dessa forma consegui validar!
  50. 4 points
    Quero parabenizar a todos do projeto, em especial os idealizadores, dos quais nos programadores somos gratos, tambem pelo auxilio de todos que participam dos foruns, trazendo ideias, debatendo solucoes/problemas. Fico grato e honrado em participar deste (SITE/projeto) ... Bom final de semana a todos.
×
×
  • Create New...