Jump to content

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/07/2012 in all areas

  1. 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.
  2. 15 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.
  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
    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).
  11. 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
  12. 9 points
    Apliquei algumas correções nos fontes:
  13. 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.
  14. 8 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
  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. 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
  18. 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.
  19. 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
  20. 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.
  21. 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
  22. 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
  23. 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  
  24. 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.
  25. 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).
  26. 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/
  27. 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.
  28. 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
  29. 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/
  30. 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...
  31. 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
  32. 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
  33. 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\"
  34. 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.
  35. 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
  36. 5 points
    Bom dia a todos, Esse provedor esta fazendo a checagem de fora errada. Devemos gerar o XML do RPS, assinar e depois colocar dentro do grupo GerarNfseEnvio. A ideia é a mesma da NF-e, onde devemos gerar o XML da NF-e, assinar e depois colocar dentro do grupo enviNFe. Mas sabe como é, os caras querem ser diferentes, são os bam bam bam dos documentos fiscais eletrônicos. Mas como dizia o meu pai, eles são novos, daqui umas 10 semanas santa eles aprendem. Com a reforma tributaria que se Deus quiser vai sair, a nota fiscal de serviço vai ser unificada a nota fiscal de venda de produtos. Isso significa que vamos utilizar a NF-e para emitir as notas fiscais de serviço em todo o território nacional. Vai demorar um pouco, mas existe uma luz no fundo do túnel. E quando isso ocorrer vou ter o prazer de diz Bye Bye provedores.
  37. 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
  38. 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
  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
    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.
  42. 5 points
    Um ótimo evento, com certeza só tende a crescer. Foi uma experiência legal, com um ótimo Networking.
  43. 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?
  44. 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
  45. 5 points
    Bom dia Graça, Quando você diz "um aplicativo sem ACBr não está ocorrendo o erro", você esta se referindo a um outro aplicativo que emiti CT-e, correto? Como você fez testes com os certificados A1 e A3 acredito que esteja usando o Capicom, correto? Você configurou o componente para o libCapicom ou libCapicomDelphiSoap? Quanto as configurações vamos esclarecer para que serve cada uma delas. Logo após o envio do lote recebemos o numero do recibo, que atesta que a SEFAZ recebeu o lote. De posse do numero do Recibo podemos consultar para saber o resultado do processamento. A propriedade AguardarConsultaRet determina o tempo (milissegundo) que o componente vai esperar para realizar a primeira consulta. Esse tempo de espera me refiro ao tempo entre o retorno do Envio e a primeira consulta. Se você atribuir o valor True a propriedade AjustaAguardaConsultaRet e antes de enviar, consulta o status de serviço, a propriedade AguardarConsultaRet será automaticamente configurada pelo componente através de uma informação retornada pela consulta ao status. Aconselho não adotar essa pratica, pois poderá ser incluída na lista de empresas que realizam consumo indevido do Web Service. E volto a informar que a SEFAZ estuda a possibilidade de acabar com o serviço de consulta ao status, sendo assim vamos deixar isso de lado. Ao realizar a primeira consulta podemos ter como resposta que o lote ainda se encontra em processamento, neste caso devemos aguardar um tempo e tentar novamente. O tempo de espera (milissegundo) entre uma consulta e outra devemos estabelecer na propriedade IntervaloTentativas e a quantidade de consultas a serem realizadas devemos definir em Tentativas. Depois de refrescar a memória sobre as propriedades, eu deixaria elas com a seguinte configuração: ACBrCTe1.Configuracoes.WebServices.Tentativas := 10; ACBrCTe1.Configuracoes.WebServices.IntervaloTentativas := 2000; ACBrCTe1.Configuracoes.WebServices.AguardarConsultaRet := 2000; ACBrCTe1.Configuracoes.WebServices.AjustaAguardaConsultaRet := False; Aconselho a parametrizar esses valores, ou seja, você deve ter uma tabela no banco de dados onde tem as configurações do componente, tais como UF, ambiente, PathSchemas, etc. É interessante incluir nessa tabela mais alguns campos para poder ter as configurações acima. Desta forma você pode mudar essa configurações em a necessidade de recompilar a aplicação.
  46. 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.
  47. 5 points
    Segue a tabela em formato script sql gerado em firebird. cest_sql.rar
  48. 5 points
    Bom dia colegas. Antes de tudo, leiam este tópico do Juliomar. Quando o cliente reclama a "exclusão" do certificado, é o nosso sistema que causou o dano. Quando dá erro no sistema operacional, é o nosso sistema que está com problema. Quanto o erro é mau funcionamento do hardware, é o nosso sistema que está comportando de forma errada. Sem contar que, até mesmo quando a impressão não sai, é o sistema que está com problemas. Ora, para isso a resposta é bem simples! É o nosso sistema que está em uso em noventa por cento dos casos, e, quando algo não está correto, é certo que o cliente vai reclamar, e, neste caso será conosco. Mas vamos por parte. Quando nos ligam, informando sobre um determinado problema, creio eu que “eles” acreditam que somos magos, ou seja, basta dizer que ao tentar fazer uma nota deu um erro, mas não diz exatamente os passos que seguiu até o tal erro ocorrer. Não diz que, ao tentar assinar a nota por exemplo, ao ser solicitado a senha do certificado, ele digitou várias vezes, que, ao digitar não observou que o “Num Lock” estava desligado etc. Não diz também que, a leitora do tal certificado está inserida na usb frontal, ou em algum adaptador, enfim, uma série de informações que são de extrema necessidade que neste caso é você que tem que solicitar para chegar a uma conclusão de que, o problema não está no sistema e sim, nos periféricos. Por fim, foi que fiz com um cliente. Ao ser indagado de que o sistema teria “excluindo” o certificado, argumentei que o sistema não faz isso, apenas lê a informação da chave, foi aí que o cliente disse que foi a certificadora que lhe disse. Diante disso, entrei em contato com a certificadora e pedi para falar com o setor responsável, e, solicitei que fosse emitido um laudo assinado informando exatamente em que momento o meu sistema excluiu a chave do certificado. Neste momento o responsável começou a gaguejar, disse que era apenas uma suspeita e que não teria como fazer tal laudo. Diante da impossibilidade de elaborar tal laudo, pedi para que ele então elaborasse um documento afirmando que foi o sistema que excluiu o certificado. Mais uma vez, negativo. Importante ressaltar que, a prova incumbe a quem alega, se afirmar que foi o meu sistema eu exijo que o faça por escrito, que prove, caso contrário, seque cogite esta ideia, foi o meio que encontrei para solucionar de uma vez por todas estas desconfianças. Espero que ajude alguém.
  49. 5 points
    Boa tarde Italo, No meu caso pode acontecer de ser realizado a inutilização de um número e posteriormente por alguma adversidade não consiga gravar essa inutilização. Como você disse uma rara exceção, porém preciso garantir um controle supremo referente a falhas, essa possibilidade dificilmente ira ocorrer, porém existe e preciso tratar caso ocorra. Solução: Em virtude da inexistência de um webservice de consulta referente a inutilização, pode-se contornar essa situação tratando o erro 563 - Já existe pedido de Inutilização com a mesma faixa de inutilização. Caso o número que estamos tentando inutilizar já foi inutilizado, retornar o erro 563, conforme o Carlos Marian menciona anteriormente. Nesse caso temos todas as informações necessárias da inutilização, inclusive o XML completo, porém seria necessário fazer um pequeno ajuste para gerar o XML completo quando o retorno for 563, pois esta gerando apenas quando o retorno for 102 - Inutilização de número homologado. Partindo da seguinte lógica, que após inutilizar uma numeração não tem mais oque fazer com aquele numero, não vejo problemas em gerar o XML quando o número já esta inutilizado. Dessa forma conseguimos contornar essa situação, se tornando assim um meio de consultar as informações de inutilização. Em anexo segue fonte com alteração sugerida. Observação: Aproveitando o gancho, estou mandando juntamente uma alteração para considerar o retorno 155-Cancelamento homologado fora de prazo, referente ao processo de cancelamento. ACBrNFeWebServices.pas
  50. 5 points
    Alexsandro, não sei se você leu o tópico inteiro mas eu anexei em uma mensagem anterior um exemplo (executável + fontes). Em todo caso, segue anexo uma versão mais atualizada. Unificador.zip
×
×
  • Create New...