Jump to content

CHAT ACBr faça parte desse grupo
Converse diretamente com os moderadores e consultores do Projeto ACBr
Brindes exclusivos do ACBr

Saiba mais

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. 92 points
    Olá pessoal, Com o intuito de acabar com a dependência da CAPICOM, nos fontes do Projeto ACBr, apliquei um amplo refactoring, nas Units de ACBrDFeSSL e suas derivadas... O que é CAPICOM ? https://en.wikipedia.org/wiki/CAPICOM Porque usávamos a CAPICOM ? Usar diretamente as APIs do Windows não é uma tarefa simples.... A CAPICOM, facilita um pouco, as tarefas que podem ser feitas com a WinCrypt (ou MS Crypto), para acesso a certificados digitais instalados no Windows Quais as desvantagens da CAPICOM ? A Microsoft condenou a mesma como obsoleta. (esse é o principal motivo) Ela precisa ser registrada no Windows para funcionar Não suporta 64 bits O que será usado no lugar da CAPICOM ? Usaremos diretamente as APIs do Windows, ou seja, a WinCrypt (também conhecida como "MS Crypto" ou "CAPI"). Ou seja, encaramos o desafio e agora usamos apenas métodos da WinCrypt para acessos a Certificados Digitais no Windows. Para facilitar o acesso a API WinCrypt, estamos usando as Units do diretório: "Fontes\Terceiros\CodeGear\", mas especificamente a Unit "ACBr_WinCrypt.pas". Quais as vantagens da WinCrypt ? Ela está presente de forma nativa, em todas as versões do Windows (desde o Windows XP), ou seja, não requer instalação. Possui versões 32 e 64 bits Não requer registro da DLL Não requer a instalação de pacotes .NET ou Java Onde posso encontrar a WinCrypt ? Ela já está instalada, de forma nativa, no seu Windows... com o nome: "crypt32.dll" Se o seu Windows é 64 bits, você encontrará a mesma em: 32 bits: "C:\Windows\SysWOW64" 64 bits "C:\Windows\System32" Se o seu Windows é 32 bits, você encontrará a mesma em: "C:\Windows\System32" O suporte a Delphi7 será mantido ? SIM. Apesar de já anunciarmos o fim do Suporte a D7, tivemos o cuidado de testar as alterações no D7. Para isso, adaptamos as units da pasta "Fontes\Terceiros\CodeGear\" para o suporte a D7... Como configurar para usar a WinCrypt e não a CAPICOM ? A maneira mais simples é configurar a seguinte propriedade: ACBrNFe1.Configuracoes.Geral.SSLLib := libWinCrypt; Na verdade, a propriedade ACBrDFe.Configuracoes.Geral.SSLLib passou a ser virtual... ou seja, ela configurará de forma indireta, as 3 novas bibliotecas de TDFeSSL... Se você ler os fontes, quando rodamos o código acima, o seguinte código será executado. procedure TGeralConf.SetSSLLib(AValue: TSSLLib); case AValue of ..... libWinCrypt: begin SSLCryptLib := cryWinCrypt; SSLHttpLib := httpWinHttp; SSLXmlSignLib := xsMsXml; end; end; Se você deseja uma configuração diferenciada, poderá configurar as bibliotecas individualmente...Exemplo: ACBrNFe1.Configuracoes.Geral.SSLCryptLib := cryWinCrypt; ACBrNFe1.Configuracoes.Geral.SSLHttpLib := httpWinINet; ACBrNFe1.Configuracoes.Geral.SSLXmlSignLib := xsXmlSec; Como remover completamente, as Units da CAPICOM dos meus fontes ? Abra o arquivo \ACBr\Fontes\ACBrComum\ACBr.inc e altere a seguinte linha: {.$DEFINE DFE_SEM_CAPICOM} para: {$DEFINE DFE_SEM_CAPICOM} Ou seja, remova o "." do inicio O que mudou em ACBrDFeSSL ? Muita coisa.... (veja abaixo o trecho do "Change-Log").. Estudar os fontes do projeto Demo "\ACBr\Exemplos\ACBrDFe\ACBrNFe\Delphi", é a melhor maneira de conhecer as modificações. Veja abaixo, um resumo ilustrado: 1 - Agora você pode criar a sua própria janela de escolha de Certificado Veja esse exemplo de código, extraído de ACBrNFe_Demo. onde usamos o método "ACBrNFe1.SSL.LerCertificadosStore", para carregar todos os certificados da Store, definida em "ACBrNFe1.SSL.StoreName", após isso, as informações dos certificados podem ser obtidas em "ACBrNFe1.SSL.ListaCertificados" ACBrNFe1.SSL.LerCertificadosStore; For I := 0 to ACBrNFe1.SSL.ListaCertificados.Count-1 do begin with ACBrNFe1.SSL.ListaCertificados[I] do begin 2 - Agora você pode selecionar as bibliotecas de TDFeSSL, individualmente CryptLib: Permite definir qual será a biblioteca de Criptografia. Ela possui métodos como:"SelecionarCertificado", "CarregarCertificado", "CalcHash". além de propriedades como "DadosCertificado" e "ListaCertificados". TSSLCryptLib = (cryNone, cryOpenSSL, cryCapicom, cryWinCrypt) HttpLib: Usada para acesso HTTP e HTTPs, permitindo informar o Certificado na conexão. Possui métodos como: "Enviar" e propriedades como: "HTTPResultCode" e "InternalErrorCode" TSSLHttpLib = (httpNone, httpWinINet, httpWinHttp, httpOpenSSL, httpIndy); XMLSignLib: Usada para validar XMLs (contra um Schema), assinar um XML, Validar a assinatura existente em um XML. Possui métodos como: "Assinar", "Validar" e "VerificarAssinatura" TSSLXmlSignLib = (xsNone, xsXmlSec, xsMsXml, xsMsXmlCapicom); 3 - Independência das configurações de segurança do I.E. Isso pode ser obtido, se você utilizar SSLHttpLib = "httpWinHttp" ou "httpOpenSSL" Você poderá definir nos seus fontes, independente das configurações do Internet Explorer, configurações como o Tipo de segurança e TimeOut da tentativa de conexão. Essa funcionalidade já estava presente nas Units de acesso que utilizavam o OpenSSL a algum tempo. e agora com a nova Unit que faz acesso a HTTPS, usando a API do Windows chamada "WinHTTP", isso também será possível. O modelo: "httpWinINet" irá usar a API do Windows, chamada "WinINet", a qual já utilizávamos, e ela depende de configurações do I.E. 4 - Carregar o certificado por ArquivoPFX ou DadosPFX, com a WinCrypt ou CAPICOM Essa funcionalidade já estava presente, quando SSLCryptLib = cryOpenSSL. e não estava disponível para CAPICOM. Mas agora isso é possível, com a SSLCryptLib = cryCapicom ou cryWinCrypt. Ou seja, Se você tem um certificado A1, você não precisa instalar o certificado no Windows. Isso pode parecer pouco importante em uma primeira impressão... Mas veja as possibilidades: O certificado A1 poderia estar em um Banco de dados, ou em um Servidor Web, e ser carregado de forma dinâmica pela sua aplicação, independente de ser instalado manualmente no Windows. 5 - Compilar seu Executável em 64 bits Lembre-se que quando você compila o seu programa em 64 bits, todas as DLLs externas de qual ele necessitar, também devem ser de 64 bits. Portanto para isso, você não poderá usar a XMLSignLib = xsMsXml, pois a biblioteca da Microsoft para assinatura de XMLs "MSXML" não possui versão 64 bits. Mas observe que agora você pode usar a biblioteca WinCrypt com a XmlSec, basta configurar corretamente as bibliotecas de criptografia. Nota: Ainda não conseguimos, fazer com que a XMLSec possa usar certificados A3, mas isso deverá ser possível no futuro, pois a XMLSec tem suporte a "MSCrypto" Diagrama de Classes Como posso ajudar ? (Tarefas a serem efetuadas) 1 - Fazer a XmlSec funcionar usando a "mscrypto" Ainda não conseguimos fazer a XMLSec, usar a MSCrypto, atualmente ele apenas usa a "openssl". Porque isso é importante ? Temos vários problemas, com a msxml, como por exemplo: A Microsoft não distribui a mesma, de forma nativa, com o Windows (arquivo msxml5.dll) Ela não suporta 64 bits A licença de uso dassa biblioteca, é valida apenas para quem tem o Office instalado... Portanto, seria ótimo se pudéssemos ficar livres da MSXML, mas para isso, precisamos fazer o ACBr conseguir usar a XMLSec com suporte a MSCrypto (hoje ele só suporta OpenSSL)... Na verdade, já podemos usar WinCrypt + XmlSec, mas apenas para certificados A1, pois o ACBr é capaz de exportar o certificado A1 do Windows, para que o mesmo seja usado pelo OpenSSL. (ele fará isso internamente, e de forma transparente para o usuário) Quando conseguirmos fazer a XmlSec usar a MSCrypto (ou WinCrypt), conseguiremos compilar a aplicação em 64 bits, e com suporte a certificados A3 2 - Compilar os fontes da XMLSec no Windows, em 32 e 64 bits Hoje o único site que distribui a XMLSec já compilada para Windows é https://www.zlatkovic.com/libxml.en.html (Thanks Igor). Entretanto, podemos notar que os binários estão defasados, e não há uma versão 64 bits, com suporte a "mscrypto" Veja como ficou o "Change-Log" do refactoring em ACBrDFeSSL -- ACBrDFeSSL -- [*] Amplo refactoring promovido, separando a classe "TDFeSSLClass" em 3 novas classes: "TDFeSSLCryptClass" - para Carregar certificados e efetuar criptografia "TDFeSSLHttpClass" - para comunicação HTTP/HTTPS com suporte a Certificados "TDFeSSLXmlSignClass" - Para Validar XMLs, validar assinaturas e Assinar XML com Certificados [+] "TSSLLib", adicionado os tipos "libWinCrypt, libCustom" [+] Criada nova classe "TDadosCertificado", para conter os dados do certificado carregado [+] Criada nova classe "TListaCertificados",para conter uma lista de Objetos do tipo TDadosCertificado, com todos os certificados de uma "Store", e após a chamada do método "TDFeSSL.LerCertificadosStore" [+] Adicionada propriedade "TDFeSSL.StoreName: String", usada apenas no Windows. Nome da Store a ser aberta, padrão "MY" [+] Adicionada propriedade "TDFeSSL.StoreLocation: TSSLStoreLocation", usada apenas no Windows. Default "slCurrentUser". TSSLStoreLocation = (slMemory, slLocalMachine, slCurrentUser, slActiveDirectory, slSmartCard); [+] Adicionado o método: "TDFeSSL.LerCertificadosStore", apenas Windows, para carregar todos os Certifcados de "TDFeSSL.StoreName" para a lista de Objetos: "TDFeSSL.ListaCertificados" [+] Adicionado a propriedade "TDFeSSL.DadosCertificado", para permitir acesso aos dados do certificado carregado [+] Adicionada a propriedade "TDFeSSL.SSLCryptLib: TSSLCryptLib" default cryNone; para definir a classe de criptografia TSSLCryptLib = (cryNone, cryOpenSSL, cryCapicom, cryWinCrypt); [+] Adicionada a propriedade "TDFeSSL.SSLHttpLib: TSSLHttpLib" default httpNone; para definir a classe de comunicação HTTP/HTTPS TSSLHttpLib = (httpNone, httpWinINet, httpWinHttp, httpOpenSSL, httpIndy); [+] Adicionada a propriedade "TDFeSSL.SSLXmlSignLib: TSSLXmlSignLib" default xsNone; para definir a classe de assinatura de validação de XML TSSLXmlSignLib = (xsNone, xsXmlSec, xsMsXml, xsMsXmlCapicom); [+] Adicionada a propriedades "TDFeSSL"SSLType: TSSLType" default LT_all; para permitir definir o tipo de criptografia em HTTPS sendo: TSSLType = (LT_all, LT_SSLv2, LT_SSLv3, LT_TLSv1, LT_TLSv1_1, LT_TLSv1_2, LT_SSHv2) suportado apenas em TDFeHttpOpenSSL e TDFeHttpWinHttp -- ACBrDFeConfiguracoes -- [+] Adicionada as propriedades: property SSLCryptLib: TSSLCryptLib property SSLHttpLib: TSSLHttpLib property SSLXmlSignLib: TSSLXmlSignLib [*] Propriedade "SSLLib: TSSLLib" passou a ser virtual, e mantida por compatibilidade. Ajusta-la irá produzir ajustes em "SSLCryptLib", "SSLHttpLib" e "SSLXmlSignLib". Exemplo: if SSLLib = libOpenSSL then begin SSLCryptLib := cryOpenSSL; SSLHttpLib := httpOpenSSL; SSLXmlSignLib := xsXmlSec; end; -- ACBrDFe -- [+] Adicionado suporte a configurações de "SSLCryptLib", "SSLHttpLib", "SSLXmlSignLib" -- ACBrDFeOpenSSL -- [*] Amplo refactoring. Removido código referente a comunicação HTTP/HTTPs que foi migrado para "ACBrDFeHttpOpenSSL" [*] Removido código referente a assinatura digital e Validação de XML, que foi migrado para "ACBrDFeXsXmlSec" -- ACBRDFeWinCrypt -- [+] Nova Unit, para manipular Certificados do Windows e efetuar assinatura digital, usando a Win API WinCrypt (MSCrypto/CAPI) -- ACBrDFeCapicom -- [*] Refactoring, para usar boa parte do código de "ACBRDFeWinCrypt" -- ACBrDFeHttpOpenSSL -- [+] Adicionada nova Unit, derivada de ACBrDFeOpenSSL, criando implementação da classe de TDFeSSLHttpClass para comunicação http e https, usando a Synapse e OpenSSL -- ACBrDFeHttpWinApi -- [+] Adicionada nova Unit, derivada de ACBrDFeCapicom, criando implementação da classe de TDFeSSLHttpClass para comunicação http e https, usando as APIs do Windows WinHttp ou WinINet -- ACBrDFeHttpIndy, ACBrDFeCapicomDelphiSoap -- [*] Unit renomeada de "ACBrDFeCapicomDelphiSoap" para "ACBrDFeHttpIndy", e refatorada para não depender da CAPICOM -- ACBrDFeXsXmlSec -- [+] Adicionada nova Unit, derivada de ACBrDFeOpenSSL, criando implementação da classe de TDFeSSLXmlSignClass usando a Lib XMLSEC -- ACBrDFeXsMsXml -- [+] Adicionada nova Unit, derivada de ACBrDFeCapicom, criando implementação da classe de TDFeSSLXmlSignClass usando a Lib MSXML -- ACBrDFeXsMsXmlCapicom -- [+] Adicionada nova Unit, derivada de ACBrDFeCapicom, criando implementação da classe de TDFeSSLXmlSignMsXml usando a Lib MSXML e CAPICOM -- ACBrDFeException -- [+] Adicionado o exception "EACBrDFeExceptionNoPrivateKey" -- ACBrDFeUtil -- [+] Adicionado o método "SignatureElement: String" (por DSA) Obrigado... e considere nos ajudar, contratando o SAC, por pelo menos 1 mês http://www.projetoacbr.com.br/forum/sacv2/sobre/ http://www.projetoacbr.com.br/forum/sacv2/questoes_importantes/ http://www.projetoacbr.com.br/forum/sacv2/cadastro/ Fique atento.... Em breve, organizaremos um Webinar sobre essas modificações
  2. 37 points
    É com prazer que anunciamos que o Dia do ACBr já tem data para acontecer. Em virtude das eleições que deverão ocorrer em outubro, sendo o primeiro turno no dia 07/10 e o segundo no dia 28/10, foi decidido que nosso encontro passará a ocorrer no dia 10/11/2018, desta forma todos poderão realizar seu voto e participar de nosso evento. O Dia do ACBr será realizado nas dependências do Parque Tecnológico de Sorocaba (PTS) situado na cidade de Sorocaba-SP, o qual conta com um amplo e moderno espaço. Vocês não podem perder, reserve esta data na sua agenda. O Evento Contaremos com palestras e workshops com diversos assuntos relacionados aos componentes ACBr, Object Pascal(Delphi/Lazarus), além do ACBrMonitorPlus e nossa novidade, a ACBrLib, entre outros temas relacionados ao nosso universo. Abaixo estão relacionados os palestrantes já confirmados: Daniel S. de Almeida (Fundador do Projeto ACBr) Italo Jurisato Jr (Responsável pelos componentes ACBrNFSe, ACBrBPe, ACBrCTe e ACBrMDFe) Rafael Teno Dias (Responsável pelo ACBrFramework e ACBr libs) José M. S. Junior (Responsável pelo ACBrBoleto e atual mantenedor do ACBrMonitorPlus) Juliomar Marchetti (MVP Embarcadero) Régys Borges da Silveira (MVP Embarcadero) Marcos Douglas B. Santos, responsável pelo blog Object Pascal Programming. Um momento que deverá ser bastante interessante é o Pergunte ao Desenvolvedor, no qual os participantes terão a oportunidade de realizar perguntas diretamente a vários moderadores do projeto ACBr. Além da oportunidade de um dia focado no universo ACBr, será uma grande oportunidade para conhecer os principais mantenedores do projeto, além de ampliar ainda mais seu Networking e conhecer casos de sucesso com o projeto ACBr. Sugestões de Palestras e Palestrantes Os usuários do fórum podem se candidatar para realizar palestras ou sugerir temas que gostariam que fossem abordados durante o evento, assim como indicação de palestrantes. Para se candidatar a palestras você deverá: Enviar resumo do assunto da palestra Descrever a relevância do tema proposto para a comunidade Opcionalmente enviar vídeo e outros materiais sobre o tema proposto Breve Currículo pessoal Para sugerir um tema/palestrante você deverá: Descrever a relevância do tema para a comunidade. Indicar o palestrante que gostaria que realizasse a palestra* (opcional). *Nota: As sugestões de palestrantes não garantem que os mesmos estarão palestrando no evento, somente sinaliza a equipe de organização o interesse da comunidade em ouvir o mesmo. Fique atento, em breve lançaremos nossa página para inscrições e noticias do Dia do ACBr.
  3. 30 points
    Olá pessoal, Acabei de enviar para o SVN, modificações para que o ACBrDFe e ACBrDFeOpenSSL suportem comunicação segura usando TLS 1.2 O componente ACBrNFe, já irá tentar ajustar a comunicação para TLS 1.2, se detectar que a versão é superior a 3.1 Atualizando o OpenSSL Para usar TLS 1.2, é necessário ter a versão do OpenSSL superior a 1.0.1, normalmente a versão usada é a 0.9.8.14, e portanto ela precisa ser substituída. Se você tentar utilizar uma versão inferior, o ACBrDFeOpenSSL acusará o seguinte erro: Porém não basta apenas baixar e copiar uma nova versão das DLLs do OpenSSL (libeay32.dll e ssleay32.dll). O problema, é que a libxmlsec, que se encontra na pasta: "ACBr\DLLs\XMLSec", não é compatível com OpenSSL superior a 0.9.8... e se você simplesmente atualizar as Libs do OpenSSL no seu sistema, provavelmente o ACBrNFe, passará a acusar Exceptions no momento de assinar o XML A solução, é utilizar um novo conjunto de DLLs, da OpenSSL e libXmlSec, libXML, e demais... você pode achar essas DLLs em: ftp://ftp.zlatkovic.com/libxml/ Essas DLLs foram compiladas com "MinGW", e portanto elas precisarão das DLLs de RunTime, da MinGW. Para sua conveniência, copiamos todas as DLLs necessárias para a pasta: \ACBr\\DLLs\XMLSec\MinGW. Observe que temos a versão 32 e 64 bits dessas DLLs... quais eu devo usar ? Em resumo, use 32 se o seu Compilador é 32 bits, e 64 apenas se você estiver usando um Compilador que gere .EXE em 64 bits... Leia esse tópico, para compreender melhor: Copie TODAS as DLLs (e não somente algumas) da pasta "\ACBr\DLLs\XMLSec\MinGW\32" ou "\ACBr\trunk2\DLLs\XMLSec\MinGW\64" (conforme o seu compilador), para o seu diretório de DLLs... (se não tem certeza para onde você deve copiar as DLLS, leia com atenção o Post indicado anteriormente) Outro problema, é que a MinGW, gera as DLLs com uma nomenclatura ligeiramente diferente do VisualC, exemplo: libxmlsec1.dll com MinGW, e "libxmlsec.dll" com VisualC. Portanto, o ACBr teria dificuldades em encontrar essas DLLs e carrega-las de forma dinâmica. Precisamos portanto, informar ao ACBr, que usaremos o conjunto de DLLs no formato da MinGW... Isso é feito, editando o arquivo: ACBr.inc. Repare que lá no final do ACBr.inc, temos a seguinte linha: {.$DEFINE USE_MINGW} Apenas remova o ".", alterando para: {$DEFINE USE_MINGW} Pronto... com isso você estará pronto para usar o ACBr com OpenSSL e TLS 1.2, seja em 32 ou 64 bits... Obrigado... e considere nos ajudar, contratando o SAC ocasionalmente: http://www.projetoacbr.com.br/forum/sacv2/sobre/ http://www.projetoacbr.com.br/forum/sacv2/questoes_importantes/ http://www.projetoacbr.com.br/forum/sacv2/cadastro/
  4. 23 points
    Desabafo do Menino Ney do TI "Configurar TLS, servidor fora, erro de schemas XML. Você pode achar que eu te acho exagerada, e, às vezes, você exagera mesmo. Mas a real é que eu sofro com essas suas Notas Técnicas e Manuais. Agora, na boa, você não imagina o que eu passo quando atendo o telefone às 22:00hrs só porque o caminhão tem q sair. Quando eu não faço as alterações de layout, não é porque eu sou preguiçoso, mas porque apenas não quero mexer no que está funcionando. Quando eu pareço nervoso, não é porque eu sou um moleque mimado. Mas é porque eu ainda não encontrei uma maneira de resolver os problemas que você vive criando. Dentro de mim ainda existe um menino do TI. Às vezes, ele encanta o mundo (consertando a impressora). E, às vezes, ele irrita todo mundo (quando esquece de atualizar os schemas). E minha luta é para manter esse menino do TI vivo. Mas dentro de mim, e não dentro do código. Você pode achar que o seu server SEFAZ não cai. Mas a verdade é que ele cai pra c****. Apenas está fora do ar, Direi ao usuário. Isso dói muito mais que bater o dedinho no pé da mesa. Eu demorei para corrigir as rejeições. Eu demorei para alterar o layout e adaptei o software para 4.0. Mas hoje eu tô aqui, de cara limpa, de peito aberto. Você caiu novamente. Mas foi eu que tive que explicar o porque ao usuário. Você pode continuar criando NTs. Ou pode parar de inventa-las e me ajudar a ter tempo para terminar o relatório do cliente. Porque quando compila, parça, o Brasil inteiro comemora comigo".
  5. 21 points
    Após uma atualização do Windows Update nos sistemas operacionais Windows 8 a 10, vários usuários começaram a ter problemas na conexão segura com o SEFAZ.... Onde geralmente foram exibidos os erros abaixo: Erro: 12175 - Um ou mais erros foram encontrados no certificado Secure Sockets Layer (SSL) enviado pelo servidor Erro: 12169 - O certificado SSL é inválido Erro: 12186 - Falha ao obter a Chave Privada do Certificado para comunicação segura Estes erros indicam uma falha na validação do certificado do servidor da SEFAZ, e entre as diversas causas que podem disparar este erro, podemos citar: Falta da cadeia de certificados instalado no cliente. Cadeia de certificados desatualizados. Erro no componente de validação do Windows. Erro no certificado da SEFAZ. SEFAZ enviou um certificado invalido. O problema foi confirmado pelo SEFAZ do PR, no comunicado abaixo: Para os usuários do Projeto ACBr, esse problema afetou apenas quem utiliza os componentes configurados com as bibliotecas Wincrypt ou CAPICOM pois os mesmo utilizam o sistema de validação do Windows. O problema não afetou usuários que usam a biblioteca OpenSSL. Em decorrência do problema, aplicamos um ajuste nos fontes da ACBrDFeSSL, visando ignorar erros na validação do certificado. Com isso a comunicação Segura ocorrerá normalmente... Os fontes alterados já se encontram no SVN... e excepcionalmente, efetuamos uma nova compilação do ACBrMonitorPLUS v 1.2.0.52, para os usuários do SAC Saiba mais sobre comunicação Segura do ACBr
  6. 19 points
    Para evitarmos diversos tópicos sobre o mesmo assunto, as alterações relativas a versão 4.00 da NFe/NFCe deverão ser concentradas neste tópico. Os fontes do componente já foram atualizados para permitir gerar os XMLs para essa nova versão. Também já foram ajustados para não gerar o SOAP Header quando configurado para a versão 4.0(ve400). Assim que os schemas e webservices forem disponibilizados pelo SEFAZ, iniciaremos os testes com o componente. Mais informações sobre as mudanças podem ser obtidas na NT 2016.002 - http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=c4S6yXTKpXY= Apenas como informação, neste manual fiquei com dúvida em dois campos: descANP - Campo numérico com tamanho de 2 - 95? O campo tem a seguinte descrição: Descrição do produto conforme ANP, então provavelmente deve ser do tipo carácter e não numérico. O campo vBCFCPSTRet possui o mesmo ID de outro campo na versão 3.10 - N27a - V3.10 vICMSDeson / V4.00 vBCFCPSTRet
  7. 18 points
    Olá amigos, depois de mais um cliente ter perdido o certificado resolvi que ia tentar descobrir oque estava causando isso, e depois de muita peleja(são 4:00 da manhã ), acho que consegui chegar ao causador do problema, pelo menos tive sucesso em excluir um certificado por diversas vezes assinando um XML. E como muito se falava, não é diretamente o ACBR que está excluindo o certificado, pelo que constatei é a MSXML que está "reiniciando" o certificado e somando isso a mais algum problema está causando a exclusão. Se você assinar um XML e deixar o administrador do token aberto, verá que no momento da assinatura, no trecho "xmldsig.sign(dsigKey, CERTIFICATES);" o token muda de: Operacional >> Ausente >> Presente >> Operacional, como se o cartão fosse removido e inserido novamente. Pensei aí tem coisa! Tentei remover o cartão durante a assinatura mas não consegui simular a exclusão do certificado, imaginei que não estava sendo rápido o suficiente. Então coloquei um loop no trecho do ACBR que pega a chave privada do certificado, antes de executar a assinatura, percebi que até aí o PIN do certificado não era solicitado, somente mais a frente quando ocorre a assinatura com "xmldsig.sign(dsigKey, CERTIFICATES);". Porém quando removi o certificado da leitora e inseri novamente dentro do loop(o mesmo que a MSXML faz durante a assinatura) foi me solicitado o PIN e logo depois veio a mensagem: "O conjunto de chaves não está definido", olhando no administrador do token que estava aberto pude ver o certificado sendo excluído: O PIN que ele me solicitou foi para excluir o certificado! O que imagino que esteja acontecendo é que se você chamar o método Assinar repetidamente, antes de dar tempo do cartão ficar operacional novamente, o certificado pode ser excluído. Isso explicaria o porque da exclusão ser esporádica e também não acontecer com todos os sistemas, pois dependeria da lógica usada por cada um para assinar, como assinaturas em sequência ou mesmo mais de uma thread acessando o certificado. Fiz um vídeo mostrando o momento da exclusão, note que não consegui excluir na primeira tentativa, porque demorei muito pra inserir o cartão, estava com uma mão ocupada filmando, ia editar isso mas tô com muito sono. MODERAÇÃO: vídeo removido a pedido do usuário Vou dormir um pouco e amanha ver se me aprofundo no problema.
  8. 16 points
    Boa tarde a todos, Foi publicado no Portal Nacional da NF-e a Nota Técnica 2018/004 versão 1.00 que trata sobre um novo tipo de evento que é o de Cancelamento por Substituição. A liberação do ambiente de homologação para iniciarmos os testes esta prevista para 25/02/2019. A principio esse evento só poderá ser utilizado com a NFC-e. Para mais detalhes favor baixar a NT do Portal e boa leitura (são apenas 12 paginas). Estamos finalizando as alterações no componente ACBrNFe para ser enviando para o repositório.
  9. 16 points
    Boa tarde Pessoal, Primeiro foi o CT-e e o MDF-e a ter o seu layout alterado para contemplar um novo grupo: <infRespTec> Informações do Responsável Técnico, agora esta chegando a vez da NF-e. Os 3 componentes já estão preparados para gerar esse grupo. Alguns desenvolvedores já estão gerando o grupo <infRespTec> para o CT-e e MDF-e, tanto em homologação quanto em produção. No caso da NF-e as datas previstas são: para o ambiente de homologação é 25/02/2019 e para produção é 29/04/2019 alterado para 07/05/2019 (conforme consta na versão 1.20 da NT 2018/005). Quero deixar claro que essas datas se referem ao prazo para que as SEFAZ finalizem a implementação em seus webservices, portanto somente a partir dessas datas é que poderemos enviar o XML da NF-e com esse grupo. Portanto, a partir do dia 25/02/2019 teremos um prazo de 2 meses para realizar os testes em ambiente de homologação. Outra coisa importante a ser dita é que esse grupo é opcional, mas vai ficar a critério de cada UF torna-lo obrigatório ou não. Quais são as informações que compõe esse grupo? O grupo <infRespTec> é composto pelos campos: CNPJ da empresa que desenvolveu o software, xContato é o nome da pessoa responsável pelo software, email e fone dessa pessoa ou da empresa. Caso você opte por gerar esse grupo independente da UF exigir ou não, as 4 informações acima deveram constar. Como dito acima os componentes ACBrNFe, ACBrCTe e ACBrMDFe já estão preparados para gerar o grupo <infRespTec>, para que isso ocorra basta acrescentar na sua rotina que alimenta o componente com os dados que vão fazer parte do XML as seguintes linhas... O exemplo abaixo é para a NF-e: with ACBrNFe.NotasFiscais.Add.NFe do begin (...) infRespTec.CNPJ := xCNPJ_RespTec; // CNPJ da Empresa infRespTec.xContato := xContato_RespTec; // Nome do Contato infRespTec.email := xEmail_RespTec; // email do Contato ou Empresa infRespTec.fone := xFone_RespTec; // fone do Contato ou Empresa end; As linhas em negrito acima são exatamente iguais para o CT-e e MDF-e. Nas Notas Técnicas da NF-e, CT-e e MDF-e que se refere a esse grupo tempos ainda mais dois campos: idCSRT e hashCSRT que vão ficar para uma segunda etapa. O CSRT - Código de Segurança do Responsável Técnico, trata-se de um código alfa numérico que será fornecido pela SEFAZ através de uma página própria ou por um webservice, conforme consta na Nota Técnica. Sendo assim, enquanto a SEFAZ não criar essa página ou webservice não temos como solicitar o CSRT e portanto não podemos incluir no XML o idCSRT que é um numero sequencial e o hashCSRT que é o resultado do hash (SHA1 - Base64) da concatenação do CSRT mais a chave do documento. Os componentes já possuem no rol de configurações, as propriedades idCSRT (Integer) e CSRT (String), nessa primeira etapa devemos atribuir o valor zero a idCSRT e uma string vazia para o CSRT, para que os campos: idCSRT e hashCSRT não sejam gerados. Os valores padrões estabelecidos pelo componente são: idCSRT = 0 e CSRT = '' (string vazia). Reforço que o preenchimento dessas propriedades só devem ser feitas a partir do momento que a SEFAZ lhe fornecer o idCSRT e o CSRT. Vamos supor que as UF: x, y e z venham a exigir o grupo <infRespTec> e criem uma pagina ou webservice para fornecer o CSRT, caso você tenha clientes usando ou seu software para emitir NF-e ou CT-e ou MDF-e será necessário solicitar o CSRT em cada uma das UF. Resumindo o CSRT fornecido pela UF x só é valida para os seus clientes dessa UF que usam o seu software. Quais são as UF que vão exigir o grupo <infRespTec> não sabemos, logo devemos ficar atentos. A minha sugestão é que o seu software gere esse grupo independente da UF exigir ou não, pois o dia que ela resolver exigir você não vai precisar fazer nada, pois já consta no XML o grupo. A questão agora é quanto ao CSRT, como dito anteriormente, vai ficar para uma segunda etapa visto que, se faz necessário a SEFAZ criar a página ou webservice. O meu conselho é que no seu software na tela de configuração tenha os campos: idCSRT e CSRT para que você possa informa-los assim que obter. Detalhe importante, os campos idCSRT e hashCSRT só serão gerados no XML e de forma automática dentro do grupo <infRespTec> a partir do momento que as propriedades de configuração: idCSRT e CSRT passarem a ter valores validos. O texto ficou longo, mas espero ter passado todas as informações necessárias para que vocês possam fazer as alterações em seus softwares e desta forma ficarem em conformidade com as nas Notas Técnicas. Para quem não leu as NT, por favor leiam. NT 2018/005 versão 1.20 - Alteração do layout da NF-e https://sourceforge.net/p/acbr/code/HEAD/tree/tools/DFe/NFe/NT/2018/ NT 2018/002 versão 1.01 - Alteração do layout do CT-e https://sourceforge.net/p/acbr/code/HEAD/tree/tools/DFe/CTe/NT/2018/ NT 2018/002 versão 1.02 - Alteração do layout do MDF-e https://sourceforge.net/p/acbr/code/HEAD/tree/tools/DFe/MDFe/NT/2018/
  10. 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.
  11. 16 points
    Olá pessoal, Compartilho com vocês, os Planos de Expansão do Projeto ACBr. Em anexo, está o PDF da apresentação Apresentação - ACBr - Planos de Expansão.pdf
  12. 16 points
    Sabemos que o assunto é sério e que muitas aplicações ainda não estão prontas... (mas não foi por falta de tempo... pois como podemos ver foram 20 meses após a publicação da primeira NT da 4.0) Alguns estados ainda estão fazendo o dever de casa... e é possível notar que vários estão com problemas no ambiente de homologação: http://hom.nfe.fazenda.gov.br/portal/disponibilidade.aspx?versao=0.00&amp;tipoConteudo=Skeuqr8PQBY= 31/07/2017 - 17:11 30/07/2017 - 18:16 O CONFAZ aproveitou a ocasião para criar ainda mais regras de validação, e novas Tags em um XML que atualmente é quase impossível de compreender o significado de todos os campos... Com isso inúmeros problemas foram criados nos WebServices e alguns persistem até hoje... Temos vários relatos aqui no fórum de exemplos de SEFAZ que não seguem a risca as próprias orientações das Notas Técnicas, ou ainda informações conflitantes, e passíveis de dupla interpretação... Isso obrigou a todos a criação de remendos e IFs, para suportar todas as SEFAZ... A grande pergunta é se realmente o SEFAZ irá ter a coragem (ou a irresponsabilidade) de desativar a 3.10 e causar o caos em um sistema tributário que já um dos mais infernais do mundo...
  13. 15 points
    Sempre acreditei que a informação deve ser algo democrático e acessível... Pensando nisso, tornei pública a nossa área de Base de Conhecimentos Nela você encontrará excelentes artigos, escritos pelos nossos experientes Consultores, e que tornarão o uso dos os componentes ACBr algo mais simples e funcional... Espero que gostem... e fiquem a vontade para sugerir novos artigos...
  14. 15 points
    Olá pessoal, Para quem ainda não conhece, o Lazarus/FPC é uma poderosa IDE e compilador da Linguagem Object Pascal, muito semelhante ao Delphi, e desenvolvido totalmente em Código Aberto... ( Saiba mais em: https://www.lazarus-ide.org/index.php?page=about ) Hoje ocorreu o lançamento da versão 2.0.0 do Lazarus... O anúncio oficial, pode ser lido no fórum do Lazarus: http://forum.lazarus-ide.org/index.php/topic,44161.0.html Essa versão ainda usa o FPC (Free Pascal Compiler), na versão 3.0.4, então não devemos ter mudanças brusca na compilação dos projetos existentes... Você pode baixar o Lazarus 2.0, na página oficial do Projeto: https://www.lazarus-ide.org/ (Observe porém, que o Download sugerido, provavelmente será de um Compilador para Windows 64... O que muitas vezes não é o desejado, para manter a compatibilidade com as diferentes versões de Windows e as DLLs existentes) Portanto, recomendo selecionar a versão 32 Bits, conforme destacado, na imagem abaixo... Se você quer realmente gerar aplicações 64 bits, ainda poderá fazer um Cross-compiling , baixando um instalador complementar em: https://sourceforge.net/projects/lazarus/files/Lazarus Windows 32 bits/Lazarus 2.0.0/ O ACBr tem um ótimo suporte ao Lazarus/FPC, isso porque a maioria dos Consultores do Projeto ACBr, usam Lazarus/FPC como principal IDE para Desenvolvimento, e todos os nosso projetos, como: ACBrMonitorPLUS, e ACBrLib, são desenvolvidos em Lazarus/FPC. Abaixo segue um Screen Shot da minha IDE de trabalho (clique para aumentar) Quer conhecer mais aplicações desenvolvidas em Lazarus ? Veja esse Link: http://wiki.freepascal.org/Lazarus_Application_Gallery
  15. 15 points
    Instalando o FixInsight para utilizar no seu projeto Para utilizar o TMS FixInsight no seu projeto, primeiro faça o download da versão trial no site oficial. O FixInsight está disponível para todas as versões do Delphi a partir do Delphi 2006. A versão pro possui linha de comando, permitindo você executar a ferramenta mesmo quando o Delphi não está aberto. Isso permite você integrar com seu sistema de Build ou sistema de integração contínua. A instalação é muito simples, bastando escolher em qual versão do Delphi você quer instalar. Após a instalação as seguintes entradas vão aparecer no menu Project: E também no "Project Manager" (clique com botão direito no projeto): A entrada "FixInsight Settings..." configura a ferramenta e pode habilitar ou desabilitar as mensagens geradas. Ela abre uma tela como essa: Na imagem acima você pode observar que a mensagem "C101 Method '%s' is too long (%d lines)" está selecionada e permite a configuração de quantas linhas para você um método, function ou procedure não deve exceder. Dá pra ver também que as mensagens C102 e C103 estão desabilitadas e assim não geram avisos. A entrada "Run FixInsight for unit1.pas" executa a ferramenta para a unit aberta atualmente (neste caso Unit1.pas). A entrada "Run FixInsight" executa a ferramenta no projeto atual inteiro. Rodando o FixInsight no seu projeto Como mencionado, é por meio da entrada 'Run FixInsight" que você executa a ferramenta no seu projeto. Então basta abrir o seu projeto e executar por meio do menu Project -> Run FixInsight. Ele vai ser executado e abrir uma aba na janela de mensagens como na imagem abaixo. Dois cliques te jogam na unit e linha relacionada a mensagem: Agora é com você. Você analisa a mensagem o código e verifica se algo pode ser feito.
  16. 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:
  17. 15 points
    Olá Pessoal, Agradeço do fundo do meu coração, a todos que participaram do 1o Dia do ACBr. Esperamos que sua experiência tenha sido tão boa quanto foi a nossa. Foi um dia muito especial, para o Projeto ACBr, pois somos uma comunidade de Desenvolvedores espalhada por todo o Brasil, e muitos de nós, nunca havíamos conversado pessoalmente… Há muito tempo eu idealizava a execução desse evento, mas sabia que não seria uma tarefa fácil… E realmente, projetar e executar um evento para mais de 400 participantes, se mostrou um desafio e tanto... Mas quando podemos contar com uma Equipe de colaboradores nota 10, os obstáculos são vencidos com mais facilidade. O ambiente estava descontraído, e como podemos ver pelas fotos, o riso rolava solto…. Creio ter sido um dia produtivo para os Congressistas, que além das Palestras, puderam conhecer de perto os Desenvolvedores, e os principais Fabricantes de Equipamentos para automação Comercial que estavam exibindo em primeira mão, produtos que ainda serão lançados em 2019. O Parque Tecnológico de Sorocaba, se mostrou um ótimo espaço… Com um amplo auditório, e 2 salas bem equipadas, conseguimos distribuir as palestras, baseado nas informações das inscrições. O amplo hall, todo envidraçado, e cercado por uma bela paisagem, foi o lugar perfeito para Networking, onde todos puderam conversar e ficar bem à vontade, durante os dois coffee break servidos… Tivemos um show de prêmios no final: Elgin 10 Kits SAT SDK + Impressora I9 Tanca 3 leitores TL-20 Dimep 2 SAT SDK Control iD: 1 Leitor Biométrico Bio, para cada CNPJ inscrito 4 Impressoras Print iD Embarcadero 1 kit Brindes Bematech 1 SAT Go (novo) Firebase 2 Livros, Guia de Migração para o Firebird 3 ACBr: Kit completo dos Produtos ACBr: 1a inscrição: Sebastião Donizete Ramos Usuário mais antigo do SAC: Geraldo José Rodrigues Usuário mais assíduo do SAC: Antonio Paulo Mangili Usuários mais distantes ao Norte/Nordeste: André Luiz Gurgel-RN e José Valber Aguiar-MA Usuários mais distantes ao Sul: Lucas Rebelato-RS e Dirlenio Batista-SC Já estamos subindo o material das Palestras, que foram apresentadas, nesse Link. Eles ficarão disponíveis para Download, para todos os membros que estiveram presentes no evento e para os usuários do SAC do ACBr. Você já pode encontrar algumas fotos do evento, nesse link. (só de ver as fotos, já dá saudades) Todas as palestras foram Filmadas, porém ainda estamos editando os vídeos, e pretendemos liberar até 4 palestras por mês… Sendo assim, se você perdeu alguma palestra, ou deseja recordar algum tópico, o vídeo será de grande ajuda… O acesso aos vídeos, será permitido a todos os participantes do Evento e usuários do SAC, através desse link Peço desculpas por algumas de nossas falhas, como por exemplo, o atraso de quase 30 min, no último bloco, antes do sorteio (justamente quando todos já estavam muito cansados) Sua opinião é muito importante para nós… Queremos aprender com nossos erros, para fazermos um evento cada vez melhor… Portanto, por favor preencha a nossa pesquisa de satisfação, clicando aqui nesse link. Se você precisa de um Certificado de Presença, poderá emitir o mesmo, clicando nesse link. As ideias já estão fervilhando para a 2a edição… Pretendemos abrir inscrições no início do próximo ano… Obrigado mais uma vez, e nos vemos na 2a edição do Dia do ACBr em 2019
  18. 15 points
    Boa tarde a todos, Teremos mudanças no layout do MDF-e, basicamente são quatro, a primeira é que agora será possível uma pessoa física desde de tenha Inscrição estadual emitir o MDF-e, sendo assim a propriedade CNPJ do emitente vai passar a se chamar CNPJCPF, a segunda se refere a consulta a Manifestos não encerrados que também vai aceitar o CPF sendo assim o campo passa a ser CNPJCPF, a terceira se refere ao modal aéreo que passa a ter um novo grupo <infEntregaParcial> e a quarta é o novo grupo chamado <infEmpresaSoft>. Este último grupo em um primeiro momento é opcional, ou seja, ele não precisa constar no XML, mas futuramente vai ficar a cargo de cada UF determinar a sua obrigatoriedade. Nesse grupo deveremos informar o CNPJ ou CPF do desenvolvedor, bem como o nome da empresa ou desenvolvedor, e-mail e telefone. O componente ACBrMDFe já foi alterado visando a geração desses grupos, estou apenas aguardando a liberação do ambiente de homologação para enviar para o repositório. Favor baixar e ler com atenção a Nota Técnica 2018/002 que se encontra no Portal Nacional do MDF-e. O Ambiente de Homologação vai ser liberado em 10/09/2018 e o de Produção em 15/10/2018.
  19. 15 points
    A NFe 3.10 deve continuar pq depois que surgiu a 4.00 o Daniel Simões virou hipocondríaco. O louco da tarja vermelha. Foi mal, mas não resisti.
  20. 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)
  21. 13 points
    Vão em um pc que está FUNCIONANDO, vá em executar e digitem certlm.msc depois vão na aba (Autoridades Certificação Raiz Confiável) depois em certificado, da um CTRL A clica com o botão direito, TODAS AS TAREFAS e EXPORTAR, avança ate pedir a senha. Põe num pendrive, depois vá no pc com problemas e faz a mesma coisa, vá em executar e digitem certlm.msc depois vão na aba (Autoridades Certificação Raiz Confiável) depois em certificado, da um CTRL A e deleta tudo, depois de deletar é só clicar com o direito de novo na parte que ficou em branco e importar o certificado que você exportou da maquina que estava boa na hora de escolher o local para armazenar não esqueçam de colocar ele no repositório (Autoridades Certificação Raiz Confiável) e pronto, tudo funcionando de novo, testei em vários windows, 7, 10, e 2012, todos funcionaram perfeito em mais de 10 clientes diferentes. coloquei a minha Cadeia de certificados boa aí. Cadeia de Certificado, senha 123.pfx Vão em um pc que está FUNCIONANDO, vá em executar e digitem certlm.msc depois vão na aba (Autoridades Certificação Raiz Confiável) depois em certificado, da um CTRL A clica com o botão direito, TODAS AS TAREFAS e EXPORTAR, avança ate pedir a senha. Põe num pendrive, depois vá no pc com problemas e faz a mesma coisa, vá em executar e digitem certlm.msc depois vão na aba (Autoridades Certificação Raiz Confiável) depois em certificado, da um CTRL A e deleta tudo, depois de deletar é só clicar com o direito de novo na parte que ficou em branco e importar o certificado que você exportou da maquina que estava boa na hora de escolher o local para armazenar não esqueçam de colocar ele no repositório (Autoridades Certificação Raiz Confiável) e pronto, tudo funcionando de novo, testei em vários windows, 7, 10, e 2012, todos funcionaram perfeito em mais de 10 clientes diferentes. coloquei a minha Cadeia de certificados boa aí. Cadeia de Certificado, senha 123.pfx
  22. 13 points
    Para atender a nova regra de validação Y01-20 foi adicionado a seguinte propriedade ao componente ACBrNFe: ACBrNFe1.Configuracoes.Geral.CamposFatObrigatorios Esta nova propriedade virá com valor default TRUE, ou seja, os campos nFat, vOrig, vDesc e vLiq sempre serão gerados mesmo com valores zerados caso existe algum campo do grupo FAT preenchido. Esta propriedade foi criada pois a NT 2016.002 - V 1.60 introduziu a regra Y01-20 e nem todos os estados ja adotaram a mesma. Alguns já estão validando em ambiente de produção, pois a NT previa inicialmente como data de entrada em produção dia 09/07/2018 e depois a data foi adiada para 23/07/2018. Caso você receba o erro abaixo significa que sua pasta schemas está desatualizada. Atualize sua pasta schemas. 1824 - Element '{http://www.portalfiscal.inf.br/nfe}vDesc': '0.00' is not a valid value of the atomic type '{http://www.portalfiscal.inf.br/nfe}TDec_1302Opc' Caso receba como retorno do envio "Falha no Schema XML" seu estado ainda não está aplicando a regra acima, neste caso a propriedade CamposFatObrigatorios deverá receber o valor FALSE. Disponível na revisão 15438 do SVN.
  23. 12 points
    until
    Webinar ACBr - Como emitir boletos com o ACBrMonitor No dia 07/03 realizamos o primeiro Webinar do Projeto ACBr com o título "NFC-e e SAT - Como tratar a contingência". No dia 16/03 as 16:00 iremos realizar o segundo encontro com o tema "Como emitir boletos com o ACBrMonitor". Para participar, basta ser assinante do SAC do ACBr, no dia 16/03 pela manhã todos os usuários com conta ativa no SAC receberão um convite para o Webinar. Apresentado por @Celso Evento disponível para todos os membros do SAC do ACBr E no dia 21/03 iremos repetir o tema do primeiro webinar, se você não pode assistir ou ficou com dúvidas aproveite para participar, o tema será o mesmo mas o evento será ao vivo. Slides e exemplos podem ser baixados no link abaixo.
  24. 11 points
    Bom dia pessoal, O Projeto ACBr também é Agente de Vendas Embarcadero. Para receber um orçamento, entre em contato com nossos consultores pelo email: agenteembarcadero@projetoacbr.com.br ou ainda fone (15) 2105-0750 ou pelo WhatsApp (15) 99790-2976. Atualmente o Delphi se divide 3 edições pagas, sendo elas Professional, Entrerprise e Architect além da edição Commmunity que é gratuita*. E agora qual edição devo escolher? Veja nossas dicas a seguir: Professional O Delphi® Professional é a maneira mais rápida para desenvolver e atualizar aplicativos hiperconectados, com muitos dados e visualmente interessantes para Windows, Mac, aparelhos móveis, IoT e muito mais usando Object Pascal. Restrições Suporta somente conexão local e somente para MySQL, Interbase e SQLite. Não permite desenvolver aplicações Linux Não faz modelagem UML Não faz aplicações multicamadas usando DataSnap O ponto forte do Delphi Professional, é o seu preço. Custando quase um terço do Delphi Enterprise, ele cabe no bolso de qualquer Desenvolvedor Micro Empreendedor. O Delphi Professional ainda pode ser pra você... Se seu único Empecilho é conexão com o banco de dados, esta questão pode ser contornada adotando-se componentes de terceiros, como por exemplo a Zeos Lib, que é Open Source, ou ainda comprar um componente como o DAC, da DevArt Enterprise A edição Enterprise inclui todos os recursos da edição Professional, além de uma licença de implantação do RAD Server para um único local (que vale US$ 5.000), bibliotecas de acesso de dados FireDAC, uma licença do InterBase ToGo e suporte para criação de aplicativos Linux no Delphi. Escolha a edição Enterprise se... Precisa utilizar os componentes de conexão com banco de dados local e remota nativos do Delphi, como o FireDAC, se seus sistemas também são criados para linux ou ainda se deseja obter os recursos adicionais desta edição. Architect O Delphi edição Architect inclui todos os recursos das edições Enterprise e Professional, além de uma licença de implantação em múltiplos locais do RAD Server, uma licença Sencha ExtJS Professional, licença do InterBase ToGo e design e modelagem de dados avançados. Receba ainda uma licença de Rad Server Multi Site (criação de serviços web. É usado para publicar suas próprias APIs/REST, como expor dados do banco de dados) + Aqua Data Studio (ferramenta para modelagem e arquitetura de banco de dados) + Sencha ExtJs Pro (framework para desenvolvimento JavaScript front-and) + Ranorex – 6 meses de trial (ferramenta para automação de testes funcionais em aplicações multiplataformas, como: mobile, desktop e web). Escolha a edição Acrchitect se... Se seu desenvolvimento requer uma das ferramentas exclusivas desta edição, o Delphi Architect deve ser sua escolha Quer saber mais detalhes sobre as diferentes edições, veja a a tabela a seguir...
  25. 11 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. É 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ã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 então é responsável pela emissão. Seria o mesmo que colocar como responsável a Microsoft porque você usa o Windows nos seus clientes, ou responsabilizar a OpenSSL porque você a usa pra assinar os documentos. Veja que existe mais um detalhe no item "2.1 Código de Segurança do Responsável Técnico - CSRT" que nos ajuda a entender. Esse 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. No terceiro parágrafo ainda 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. 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.
  26. 11 points

    Version 1.2.0.56

    9,510 downloads

    ACBrMonitorPLUS - Última versão disponível apenas a usuários do SAC. - Versão oficial compilada pela equipe do ACBr. Assinada digitalmente com o certificado da DJSystem.
  27. 11 points
    Boa tarde a todos, Teremos mudanças no layout do CT-e, basicamente são duas, a primeira se refere ao CT-e OS, mais precisamente no transporte de pessoas, teremos um novo grupo chamado <infFretamento> e a segunda que se aplica tanto no CT-e quanto no CT-e OS é o novo grupo chamado <infEmpresaSoft>. Este último grupo em um primeiro momento é opcional, ou seja, ele não precisa constar no XML, mas futuramente vai ficar a cargo de cada UF determinar a sua obrigatoriedade. Nesse grupo deveremos informar o CNPJ ou CPF do desenvolvedor, bem como o nome da empresa ou desenvolvedor, e-mail e telefone. O componente ACBrCTe já foi alterado visando a geração desses grupos, estou apenas aguardando a liberação do ambiente de homologação para enviar para o repositório. Favor baixar e ler com atenção a Nota Técnica 2018/002 que se encontra no Portal Nacional do CT-e. O Ambiente de Homologação vai ser liberado em 10/09/2018 e o de Produção em 15/10/2018.
  28. 11 points
    Evolua, Use IDEs modernas, sem gastar muito Você ainda usa versões antigas de Delphi, como o Delphi 7 ou inferior ? Você sabia que o Delphi 7 foi lançado em 2002 !! Pois eh... ele está quase completando a maioridade... Usar uma IDE antiga traz muitos problemas, e você fica de fora de vários recursos novos, somente existentes nas IDEs modernas... Provavelmente o maior de todos os problemas, é que o código gerado por esse compilador antigo, não é muito bem aceito, nas versões modernas do Windows... Não será nada legal, se o Windows acusar um Alerta de incompatibilidade, quando o seu sistema for executado... Não deixe a decisão de evoluir sua IDE para Ad aeternum. No Dia do ACBr, teremos palestras exclusivas, sobre como criar um ambiente de programação completo, usando versões de modernas IDEs como: Lazarus/FPC (open source) Delphi Community Edition (gratuita) Lazarus/FPC, vou muito bem, obrigado... (10:50-11:50, Auditório) - Breve História do FPC/Lazarus - Componentes Nativos - Recursos úteis da IDE - Online Package Manager - Técnicas avançadas da Linguagem - Dicas para quem vem do mundo Delphi e quer testar o Lazarus - Casos reais de Sucesso no Brazil e exterior! Lazarus e fpWeb - Criando Servidor Web para Validação de NFe (15:10-16:10, Sala 2) Veja como usar Lazarus e fpWeb para criar um BackEnd (API Web) que recebe e valida um XML de NF-e, mostrando os dados do Certificado do XML do assinante. Marcos Douglas B. Santos Engenheiro de Software com mais de 16 anos de experiência em Análise, Arquitetura e Desenvolvimento de Sistemas utilizando Programação Orientada a Objetos. Especialista em Object Pascal e Microsoft SQL Server. CEO da Delfire. Consultor. Revisor Técnico. Blogger. Mini PDV-NFC-e, com ACBr, Delphi Community e ORMBr (17:00-18:00, Auditório) Apresentação do Delphi Communitty Edition, suas principais caracteristicas, suas limitações e como usar para empreender e dar início ao seu projeto. Montando um mini projeto de um PDV com NFC-e usando o ACBr e Delphi CE Mostraremos como instalar na IDE do Delphi CE: - ACBr - Fortes Report CE (gerador de relatórios) - ZeosLib (para acesso a múltiplos Banco de Dados) - Framework ORMBr (pesistência de dados e orientação a objeto nunca foi tão simples) Juliomar Marchetti Gerente de Desenvolvimento de Software na ControlSoft.Embarcadero MVP Moderador e Commiter do Projeto ACBr ,moderador Projeto ORMBr, mantenedor Projeto FRCE Participação nos projetos MVCBr, GMLib e outros OpenSource. Trabalha com Agronegócio, Automação Comercial, Fiscal, Business Intelligence, Gestão Comercial Programação Completa
  29. 11 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.
  30. 11 points
    No dia de ontem, passamos por problemas técnicos com o nosso provedor de Hospedagem, a Locaweb... Inicialmente o problema afetava apenas a comunicação Segura de nosso servidor com Servidores externos a Locaweb... Isso afetou serviços como o Sistema de Licenciamento do Invision Power Board (este fórum), e também afetou a comunicação do nosso servidor com o PagSeguro, o que pode ter indisponibilizado a contratação do SAC do ACBr Como a Locaweb demorou a reconhecer o problema, perdemos muito tempo imaginando ser algo na configuração do nosso servidor... No período da tarde o problema na Locaweb se estendeu, e nosso servidor ficou literalmente inacessível.. A situação na Locaweb somente foi normalizada por volta das 22:00hs no dia de ontem Pedimos sinceras desculpas pelo ocorrido, e estamos fazendo planos para termos uma alternativa que nos permita subir o Projeto ACBr em outro Servidor, a fim de diminuir o Downtime, caso o problema volte a ocorrer.
  31. 11 points
    Comentário totalmente desnecessário... Acha que nós não estamos ocupados com outras atribuições ? Experimente fazer o seu próprio componente OpenSource para Boletos... e gerencie-o como acha que deve ser feito...
  32. 11 points
  33. 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
  34. 11 points
    Acabei de comitar as alterações para compatibilizar o ACBrSAT com o MFe, tive tempo de testar apenas os comandos compatíveis com o SAT, os comandos de pagamento ainda serão desenvolvidos. Abaixo um passo-a-passo para utilizar o integrador fiscal fornecido pela SEFAZ do Ceará com o ACBrSAT: Baixe o instalador em http://cfe.sefaz.ce.gov.br/mfe/informacoes/downloads#/ Faça a instalação do mesmo e ao executar pela primeira vez utilize os seguintes dados na tela de configuração/opções: CNPJ do Estabelecimento: 30146465000116 Inscrição Estadual do Estabelecimento: 065911482 CNPJ da Software House: 98155757000159 Código de Validação do Aplicativo Comercial: MD2Nof/O0tQMPKiYeeAydSjYt7YV9kU0nWKZGXHVdYIzR2W9Z6tgXni/Y5bnjmUAk8MkqlBJIiOOIskKCjJ086k7vAP0EU5cBRYj/nzHUiRdu9AVD7WRfVs00BDyb5fsnnKg7gAXXH6SBgCxG9yjAkxJ0l2E2idsWBAJ5peQEBZqtHytRUC+FLaSfd3+66QNxIBlDwQIRzUGPaU6fvErVDSfMUf8WpkwnPz36fCQnyLypqe/5mbox9pt3RCbbXcYqnR/4poYGr9M9Kymj4/PyX9xGeiXwbgzOOHNIU5M/aAs0rulXz948bZla0eXABgEcp6mDkTzweLPZTbmOhX+eA== Selecione o checkbox "Servidor" (Talvez seja necessário alterar o campo IsServer para True no arquivo Integrador.cnf - Use o SQLiteStudio -http://sqlitestudio.pl/) Atualize seu fontes do ACBr e no demo do ACBrSAT para Lazarus(E:\delphi\ACBr\trunk2\Exemplos\ACBrSAT\Lazarus) configure a nova aba MFE, escolha o modelo "MFe_Integrador_XML" e clique em inicializar. Para o MDK da TANCA use os seguinte dados na criação do XML de Venda: Código de Ativação: 12345678 CNPJ do Contribuinte: 08.723.218/0001-86 IE do Contribuinte: 562.377.111.111 CNPJ da Software House: 16.716.114/0001-72 Assinatura da Software House: SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT Pontos de atenção: Como tratar um comando com erro? Em todos os comandos existe o campo IDENTIFICADOR, mas ao enviar um comando com erro, a resposta não vem com este campo, então fica difícil saber se o XML que está na pasta se refere ao último comando enviado. Exemplo do arquivo de resposta a um comando com erro: 7b96d469f63c4973af180a991804f0ec20170425220009.xml
  35. 11 points
    Adicionei os seguintes itens, no tópico anterior: Como configurar para usar a WinCrypt e não a CAPICOM ? Como remover completamente, as Units da CAPICOM dos meus fontes ? Como posso ajudar ? (Tarefas a serem efetuadas)
  36. 10 points
    Olá pessoal, Com a NT 2018.005 foi introduzida uma nova rejeição para NFe: 938 - Rejeição: Não informada vBCSTRet, pST, vICMSSubstituto e vICMSSTRet. Os detalhes dessa rejeição foram alterados nas várias versões da NT, mas infelizmente isso já está causando algum problema (como podem ver nesse tópico aqui). Como é uma rejeição facultativa e cada UF tem uma legislação tivemos que adicionar uma nova propriedade no componente ACBrNFe para lidar com a situação. A nova propriedade se chama ForcarGerarTagRejeicao938. Após atualizar os componentes, não esqueça de reinstalar. O problema Como a descrição da rejeição explica, algumas UFs podem exigir a informação de algumas tags, como vICMSSubsituto, isso mesmo quando o valor da tag for zero. Por padrão o ACBrNFe não gera tags facultativas que são informadas com valor zero. E esse é o caso da tag vICMSSubstituto. Mas como essa é uma tag facultativa, não devia ser obrigatório para algumas UFs informá-la. E por isso, não podemos obrigar o ACBrNFe informar sempre. Assim a ideia é termos uma configuração que você possa alterar. Assim vai forçar gerar a tag de acordo com a necessidade de seu cliente ou da UF dele. A solução A configuração criada ForcarGerarTagRejeicao938 foi adicionada no ACBrNFe de modo que pode ser acessada como no código abaixo: ACBrNFe1.Configuracoes.Geral.ForcarGerarTagRejeicao938:= fgtNunca; Ou talvez no Object Inspector como abaixo: As opções são: fgtNunca -> Se o valor for zero, não vai forçar a geração da tag nunca; fgtSomenteProducao -> Força a tag ser gerada no ambiente de produção mesmo que o valor seja zero; fgtSomenteHomologacao -> Força a tag ser gerada no ambiente de homologação mesmo que o valor seja zero; fgtSempre -> mesmo que o valor seja zero, a tag será gerada sempre; A configuração padrão é fgtNunca conforme o comportamento do componente antes dessas alterações. Qual opção eu devo escolher? Como explicado, essa configuração foi necessária por causa de problemas em certas UFs. Então para escolher a melhor opção você precisa saber o que está sendo exigido no Webservice que você está acessando. Por exemplo, se você não está recebendo a rejeição, não há necessidade de alterar a configuração. Mas se está recebendo somente em homologação, quer dizer, a tag está sendo exigida somente em homologação, use a opção fgtSomenteHomologacao. E assim por diante.
  37. 10 points
    Conheça a loja dos produtos do Projeto ACBr, e ajude o projeto a crescer, com estilo. https://loja.projetoacbr.com.br Poucos sabem, mas dia 31 de janeiro é o dia do boné! Seja pela estética, ou pela proteção contra o sol, os bonés estão por todos os lados. Nossos bonés personalizados contam com qualidade em todos os processos de sua fabricação, como mostra o Grupo Kyoodai neste vídeo abaixo. Confira como são feitos os bonés do Projeto ACBr: Conheça a loja dos produtos do Projeto ACBr, onde você pode adquirir uma dessas obras-primas, e muitos outros produtos do projeto. Ajude o projeto a crescer, com estilo. https://loja.projetoacbr.com.br
  38. 10 points
    Olá pessoal, Introduzi no componente ACBrPosPrinter, um novo mecanismo de acesso a Impressora Agora poderemos acessar algumas impressoras, usando a Sintaxe: ACBrPosPrinter1.Porta := 'USB:MARCA'; Onde MARCA, será o nome da Marca do Fabricante da Impressora... Até o momento, temos suporte para as marcas "ELGIN", e "EPSON" A ideia por traz dessa nova sintaxe de Porta, é permitir usar a DLL/SO do Fabricante, para Imprimir diretamente na Impressora... Ok.. o ACBrPosPrinter, já conseguia acessar impressoras Não Fiscais, pela Porta USB, usando a Sintaxe "RAW:" ACBrPosPrinter1.Porta := 'RAW:Nome da Impressora no Windows'; Mas então porque desenvolvemos essa nova forma de acesso ? A nova sintaxe "USB:", tem algumas vantagens, em relação a sintaxe "RAW:" Não depende da instalação do Driver de Spool da Impressora.. (note porém, que em alguns casos, o Driver de Spool não pode estar instalado, pois ele bloqueia o acesso a USB) Podemos Ler Informações da Impressora (o que não é possível no modo RAW) Entretanto, como foi dito antes, dependemos de DLL exclusiva do fabricante, para o acesso a Impressora pela USB... Quais são essas DLLs ? Para onde eu devo copiá-las ? Vejamos como foi descrito no ACBrSerial-change-Log.txt Creio que isso responde as duas perguntas, correto ? Você pode encontrar as DLLs no nosso SVN, na pasta: \ACBr\DLLs\PosPrinter, ou ainda pela Web: http://svn.code.sf.net/p/acbr/code/trunk2/DLLs/PosPrinter/ Você pode ainda baixar uma versão do Demo PosPrinterTeste, atualizada, compilado em Lazarus/FPC no link abaixo: Como funciona essa nova técnica ? Quem faz todo acesso as Portas suportadas pelo ACBr, é um subcomponente chamado ACBrDevice, e há um bom tempo, esse componente já possui uma possibilidade de Integração por Hooks O que é Hook ? https://pt.wikipedia.org/wiki/Hooking A ideia por trás dos Hooks, é instalar ganchos, em eventos, que nos permitam interceptar algumas ações e chamadas... Veja esse trecho de código FDevice.HookAtivar := PosPrinterHookAtivar; FDevice.HookDesativar := PosPrinterHookDesativar; FDevice.HookEnviaString := PosPrinterHookEnviaString; FDevice.HookLeString := PosPrinterHookLeString; Aqui instruímos o subcomponente ACBrDevice, a chamar nossos eventos, quando ele precisar "Ativar", "Desativar" uma porta e também quando ele for "EnviarString" e "LeString", de uma determinada porta... Então no interior do componente ACBrPosPrinter, implementamos os eventos indicados acima (PosPrinterHookAtivar, PosPrinterHookDesativar, etc) ... Com isso, o ACBrDevice executará um código nosso, ao invés do que ele normalmente executaria... Veja que dentro dos eventos de ativação e desativação usamos uma Classe de Hook (leia mais abaixo) procedure TACBrPosPrinter.PosPrinterHookAtivar(const APort: String; Params: String); begin if Assigned(FHook) then FHook.Open(APort); end; procedure TACBrPosPrinter.PosPrinterHookDesativar(const APort: String); begin if Assigned(FHook) then FHook.Close; end; FHook por sua vez, é uma variável interna ao ACBrPosPrinter, que contem uma Classe de Hook (TACBrPosPrinterHook), e implementa os comandos necessários, para transmitir essas ações, a DLL do fabricante... Veja o exemplo abaixo, como fica a implementação dos Hooks de Ativar e Desativar, da ELGIN... observe que chamamos métodos Externos, da DLL da Elgin, como: "PrtPortOpenW" e "PrtPortClose" procedure TElginUSBPrinter.Open(const APort: String); var errorNo: Integer; begin if Connected then Exit; inherited Open(APort); try errorNo := xPrtPortOpenW(FPrinter, WideString(fpPort)); // <------- A Q U I ------- if (errorNo <> E_SUCCESS) then raise Exception.CreateFmt(CERROR_OPEN, [fpPort, fpPrinterName]); except fpConnected := False; fpPort := ''; raise; end; end; procedure TElginUSBPrinter.Close; var errorNo: Integer; begin if not Connected then Exit; errorNo := xPrtPortClose(FPrinter); // <------- A Q U I ------- if (errorNo <> E_SUCCESS) then raise Exception.CreateFmt(CERROR_CLOSE, [fpPort, fpPrinterName]); inherited Close; end; Com isso, conseguimos usar a DLL do Fabricante, para estabelecer um túnel entre o ACBrPosPrinter e o equipamento... Como posso implementar um Hook para um novo modelo ? Os Primeiros passos, são verificar: Se o Fabricante disponibiliza uma DLL para acesso direto ao equipamento (sem depender do Spooler) Se há nessa DLL, um método que nos permita Escrever e Ler Dados da Porta USB Ou seja, não precisamos de métodos de alto nível, que façam a formatação de caracteres, ou manipulem a impressora... Pois continua sendo o ACBrPosPrinter, quem montará toda a Sintaxe de comandos a serem enviados para a Impressora, usando a linguagem Esc/Pos... e igualmente, será o ACBrPosPrinter que fará a leitura de respostas, quando for necessário... Na DLL da Elgin, temos um ótimo exemplo de método para isso... function PrtDirectIO(printer:Pointer; // Ponteiro com a Impressora instanciada por PrtPrinterCreatorW writeData:PByte; // Buffer com dados a serem enviados writeNum:integer; // Número de Bytes em "writeData" (tamanho do Buffer) readData:PByte; // Ponteiro com o Retorno a ser Lido (Buffer de saída) readNum:integer; // Numero de bytes disponíveis para escrita em "readData" (tamanho disponível no Buffer de Saída) preadedNum:PInteger // Número de bytes realmente escritos em "readData" ): Integer; cdecl; // Status de retorno E_SUCCESS = 0; Tendo isso em mãos, podemos criar uma cópia de uma das Units já existentes, como por exemplo a Unit ACBrEscPosHookElginDLL.pas, e implementar o suporte usando a nova DLL, e efetuar os ajustes referente a nova Marca
  39. 10 points
    Lembrei disso hoje... e decidi procurar se o Post n.1 ainda existe... SIM, ele ainda está no Fórum da DevMedia, o qual eu frequentei por um bom tempo, e foi o espírito de cooperação dos usuários do fórum, que me motivou a criação do Projeto ACBr... Reparem no Post, que ainda não há menção do nome ACBr, e a ideia inicial, era fazer uma classe de Suportes a ECF (Emissor de Cupom Fiscal)... https://www.devmedia.com.br/forum/classe-para-acesso-direto-a-ecf-em-linux-windows/229474 Na abertura do último Dia do ACBr, eu menciono um pouco sobre a criação do Projeto... Classe para acesso Direto a ECF em Linux/Windows 03/05/2004 Ola, para todos.... Estou desenvolvendo uma Classe Multiplataforma para acesso direto a diversas Impressoras Fiscais. Na verdade o projeto ainda está engatinhando, mas já tive sucesso em Comunicação com a Bematech em Windows e Linux. Entretanto, como muitos programadores também necessitam ou já fazem acesso a ECF, resolvi usar a ideia de tornar isso um projeto OpenSource. P1 - Porque fazer mais uma biblioteca de acesso a ECF ? A ideia é fazer uma Classe que possa rodar em Linux / Windows. algo que nao existe hoje.... Alem de não exigir nenhuma DLL ou SO, a fim de evitar o ´inferno das DLL´s´ P2 - Como fazer acesso aos ECFs ? Como a classe deve rodar em Linux, fica descartado o uso de DLL´s... Todas as impressoras fiscais (pelo menos as que já programei) possuem manuais descrevendo os codigos de comandos e protocolos seriais. Atualmente acesso as impressoras: Bematech, Daruma, Schalter, Sweda, Mecaf (e compativeis) de forma direta, em DOS, usando a linguagem CLIPPER 5.02e.+Clipper Tools... O Executável não depende de nenhum arquivo externo ou device driver no CONFIG.SYS. A ideia é migrar as funçoes de Clipper para Delphi, usando um componente de acesso a Serial. P3 - Qual componente fará acesso a serial ? Dos que testei, apenas a classe SynaSer http://www.ararat.cz/synapse/ é multiplataforma (Kylix) P4 - Porque rodar em Linux ? Já pensou oferecer para os seus clientes uma solução de Aplicacação Comercial totalmente legalizada ? e sem pagar uma fortuna por isso ? Sem falar na estabilidade e segurança do Linux.... Qual usuário consegue apagar o sistema ? (alem do Root é claro Caracteristicas do projeto: - Deve ser OpenSource e com a distribuição dos fontes: - Deve ser Multi-plataforma (Windows ( CLX / VCL ) / Linux) - Nao deve depender de nehuma DLL ou SO. - Deve suportar as diferença entre os diversos modelos de ECF - As Classes Filhas devem tratar de forma transparente as pequenas diferenças na programaçao de Versoes diferente do mesmo Modelo de ECF. Ex: A classe TECFBematech deve ser capaz de trabalhar com todas as versoes da Bematech FI Vantagens do Projeto: - Total controle da Aplicação: Já vi DLL´s que simplesmente param o processamento do programa (Quem já homologou TEF discado, sabe o que eu quero dizer...) - Facil distribuição: Não precisa distribuir e instalar nenhuma DLL - Livre-se do Inferno das DLL´s Quando o usuário instala outro programa que usa a mesma DLL que você usa, porém em uma versão antiga (causando Bugs no seu programa) - Multiplataforma: Linux / Windows - Programação Limpa e Clara. Basta criar uma classe TECF com o modelo apropriado. O Codigo fonte sempre se refere a Classe criada, sem se preocupar com o Modelo Desvantagens do Projeto: - Se o hardware mudar, ficamos dependendo de novas informaçoes do fabricante, ou até mesmo de um modelo do equipamento para testes... - Geralmente as DLL´s incorporam novos Hardwares do mesmo fabricante.... Aqui teremos que implementar um novo filho da classe TECF para cada Hardware novo (somente se o novo hardware nao for compativel com o antigo) Estou lançando a ideia para ver a aceitação... Existe algum disposto a colaborar ? Posso enviar os fontes por e-mail para que estiver interessado... Em breve farei uma pagina para download do projeto... (Ou se alguem estiver disposto a fazer... ) A ser desenvolvido: - Terminar a implementação da Classe TECFBematech - Implementar as demais Classes (Daruma, Schalter, Sweda, Mecaf) - Criar Classe para Manupilação de TEF Discado para interagir com TECF Na verdade, nunca fiz nenhum projeto OpenSource... Gostaria de sugestões... Duvidas: - Como / Onde hospedar o projeto ? - Como cordernar ?.... - Como fica a questão legal de OpenSource ? É preciso registrar isso em cartório ? Ps: Srs Moderadores, desculpe postar essa msg em 2 áreas, mas acredito que seja do interesse...
  40. 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
  41. 10 points
    Chegou pessoal a minha camiseta Tenho um grande carinho e respeito por este projeto e por todos vocês que fazem parte e colaboram de uma forma outra. Parabéns!!!
  42. 10 points
    Como parte dos nossos esforços de melhoraria contínua da usabilidade de nossa comunidade, estamos aplicando várias melhorias... Recentemente inauguramos o nosso Novo Portal Aumentamos os recursos de nosso Servidor dedicado para 16gb x 6 processadores E agora estamos implementando um Novo Tema no fórum Esse Tema, se chama Infraskew e foi desenvolvido por TAMAN. Um experiente desenvolvedor de Temas para a plataforma que usamos, a Invision Power Board É um tema Moderno, Bonito, e funcional... Ele facilita muito a navegação no fórum, por manter o Menu Principal, sempre no topo da Tela. Reparem que nele também está a caixa de Busca no fórum... Esperamos que vocês gostem do novo Tema (e das novas cores)... Fiquem a vontade para nos enviar suas sugestões, elogios ou críticas sobre o novo tema... Caso você deseje continuar usando o Tema Tradicional do ACBr, basta selecionar o mesmo no final da Página...
  43. 10 points
    Algumas dicas para quem está utilizando o Integrador MFE: Onde encontrar os arquivos para download? O site oficial é http://cfe.sefaz.ce.gov.br/mfe/informacoes/downloads#/, mas nem sempre os links estão funcionando, atualmente as últimas versões foram disponibilizadas pelo @luiz renato da silva abade no seguinte link: https://drive.google.com/drive/folders/0B0H-Nn7Nqhd7QkNIWDFCeElSQzQ O que preciso instalar para que o Integrador funcione? Após instalar o integrador e executá-lo pela primeira vez, abra a pasta em que ele foi instalado(Geralmente %LOCALAPPDATA%\Programs\Integrador) e instale a última versão do Driver MFE(Atualmente DriverMFE_Instalador_01.04.01.exe). Após isto instale seu hardware MFE com os drivers específicos da marca do seu equipamento e configure o integrador com os dados abaixo. Quais os dados que devem ser usados na configuração do integrador? CNPJ do Estabelecimento: 30146465000116 Inscrição Estadual do Estabelecimento: 065911482 CNPJ da Software House: 98155757000159 Código de Validação do Aplicativo Comercial: MD2Nof/O0tQMPKiYeeAydSjYt7YV9kU0nWKZGXHVdYIzR2W9Z6tgXni/Y5bnjmUAk8MkqlBJIiOOIskKCjJ086k7vAP0EU5cBRYj/nzHUiRdu9AVD7WRfVs00BDyb5fsnnKg7gAXXH6SBgCxG9yjAkxJ0l2E2idsWBAJ5peQEBZqtHytRUC+FLaSfd3+66QNxIBlDwQIRzUGPaU6fvErVDSfMUf8WpkwnPz36fCQnyLypqe/5mbox9pt3RCbbXcYqnR/4poYGr9M9Kymj4/PyX9xGeiXwbgzOOHNIU5M/aAs0rulXz948bZla0eXABgEcp6mDkTzweLPZTbmOhX+eA== Selecione o checkbox "Servidor" (Talvez seja necessário alterar o campo IsServer para True no arquivo Integrador.cnf - Use o SQLiteStudio -http://sqlitestudio.pl/) O XML enviado para o aparelho de teste deve usar os mesmos dados do Integrador? Não, no caso cada marca possui dados específicos que deverão ser informados no XML de venda. TANCA: Código de Ativação: 12345678 CNPJ do Contribuinte: 08.723.218/0001-86 IE do Contribuinte: 562.377.111.111 CNPJ da Software House: 16.716.114/0001-72 Assinatura da Software House: SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT ELGIN: Código de Ativação: 123456789 CNPJ do Contribuinte: 14.200.166/0001-66 IE do Contribuinte: 1234567890 CNPJ da Software House: 08.490.295/0001-33 Assinatura da Software House: MD2Nof/O0tQMPKiYeeAydSjYt7YV9kU0nWKZGXHVdYIzR2W9Z6tgXni/Y5bnjmUAk8MkqlBJIiOOIskKCjJ086k7vAP0EU5cBRYj/nzHUiRdu9AVD7WRfVs00BDyb5fsnnKg7gAXXH6SBgCxG9yjAkxJ0l2E2idsWBAJ5peQEBZqtHytRUC+FLaSfd3+66QNxIBlDwQIRzUGPaU6fvErVDSfMUf8WpkwnPz36fCQnyLypqe/5mbox9pt3RCbbXcYqnR/4poYGr9M9Kymj4/PyX9xGeiXwbgzOOHNIU5M/aAs0rulXz948bZla0eXABgEcp6mDkTzweLPZTbmOhX+eA== * Caso receba o erro "Rejeicao: Emitente nao autorizado para uso do SAT", verifique se no XML informou os dados acima, lembrando que os dados do integrador serão diferentes dos dados enviados no XML. Onde obter suporte? O suporte atualmente é prestado através do email suporte.mfe@sefaz.ce.gov.br ou por um grupo no WhatsApp que pode ser acessado pelo link https://chat.whatsapp.com/2OjHVks1Q3sGMTgeZityxm Atualizado em 30/04/2017 - Novo grupo de suporte: https://groups.google.com/forum/?hl=pt-BR#!forum/sefaz_integrador_fiscal Existem módulos para desenvolvedores? Sim, atualmente TANCA e Elgin possuem equipamentos disponíveis. Consigo testar o integrador sem um aparelho de desenvolvimento? Sim, para isso crie na pasta quem que o Integrador está instalado(%LOCALAPPDATA%\Programs\Integrador) um arquivo com o nome debug.dbg. (Funciona apenas até a versão 1.5.86 do Integrador) Como simular os comandos de pagamento? Para usar os métodos EnviarPagamento e VerificarStatusValidador é necessário o uso do Simulador POS. Para cada comando EnviarPagamento deve ser gerado um valor diferente para o campo SerialPOS(Em ambiente de produção esse número será único para cada POS do estabelecimento). Após o comando EnviarPagamento ser executado, guarde o valor do campo IDPagamento, abra o programa simulador_pos.exe e no campo TERMINAL SERIAL informe o mesmo valor que foi informado no campo SerialPOS do comando EnviarPagamento. Clique na opção 1-VFP-e e será exibido o valor do pagamento solicitado. Depois você deve efetuar o pagamento clicando na opção 2-PAGAR. Após estes passos, você pode usar o comando VerificarStatusValidador informando o IdPagamento no campo IdFila para receber a confirmação do pagamento. Caso vc use o comando VerificarStatusValidador antes de efetuar o pagamento no simulador o campo Codigo Autorização virá com o seguinte conteúdo: <CodigoAutorizacao>queue item XXX not complete</CodigoAutorizacao>, onde o XXX se refere ao IdPagamento. Todos os comandos já estão implementados no ACBr? Além dos comandos já existentes no SAT, foram implementados os seguintes comandos no componente ACBrSAT - EnviarPagamento, VerificarStatusValidador, RespostaFiscal e EnviarStatusPagamento.
  44. 10 points
    Boas Novas: Consegui assinar usando a MScrypto sem MSXML e LibXMLSec. Amanhã vou refatorar e testar se não causa nenhum problema no certificado.
  45. 9 points
    Bom dia a todos, Os componentes ACBrNFe, ACBrCTe e ACBrMDFe já estão preparados para gerar o grupo <infRespTec> = Informações do Responsável Técnico. Para quem emite NF-e favor ler a Nota Técnica 2018/005, já os emitentes de CT-e - Nota Técnica 2018/002 versão 1.01, e MDF-e - Nota Técnica 2018/002 versão 1.02 Essas NT estão disponíveis nos Portais de cada Documento Fiscal Eletrônico. Para quem esta com os fontes atualizados e reinstalados, ao selecionar o componente ACBrNFe ou ACBrCTe ou ACBrMDFe vai notar no Object Inspector em Configurações o grupo RespTec e dentro deste as propriedades idCSRT e CSRT. O grupo <infRespTec> contem as seguintes informações: CNPJ, Nome, e-mail, telefone, idCSRT e HashCSRT do Responsável Técnico. Sendo que as duas ultimas são geradas automaticamente se as propriedades idCSRT e CSRT forem informadas. Logo o que muda na aplicação: Configuração: Configuracoes.RespTec.idCSRT := <identicador do CSRT> Configuracoes.RespTec.CSRT := <Código de Segurança do Responsável Técnico> Tanto o ID quanto o código serão fornecidos futuramente pela SEFAZ, sendo assim devemos atribuir zero ao idCSRT e uma string vazia para CSRT, nesse primeiro momento. Rotina que alimenta o componente: // Dados do Responsável Técnico infRespTec.CNPJ := xCNPJ_RespTec; infRespTec.xContato := xContato_RespTec; // Nome do responsável técnico infRespTec.email := xEmail_RespTec; infRespTec.fone := xFone_RespTec; Como dito acima o idCSRT e HashCSRT são gerados automaticamente caso o idCSRT seja diferente de zero e CSRT diferente de uma string vazia. Observação: Tanto a configuração quanto a alimentação do componente é exatamente a mesma conforme o exemplo acima para a NF-e, CT-e e MDF-e. A geração desse grupo esta condicionada a cada UF, sendo assim uma UF poderá exigir e outra não, logo devemos ficar atento a legislação de cada UF.
  46. 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).
  47. 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
  48. 9 points
    Parabéns a toda equipe de profissionais que lá estavam para nos oferecer conhecimentos. Um projeto fantástico e gigante que só cabe elogios aos seus responsáveis. Ótimas palestras, ótimos expositores, e uma confraternização de profissionais de muito ganho a todos. Quero dizer que jamais irei me ausentar de nenhum dia do ACBr, e que venha o 2,3,4,5,6,7.......... que estaremos lá. Parabéns mais uma vez, e que Deus abençoe todos esses profissionais, que de toda forma, nos engrandece profissionalmente, e comercialmente. Abs A todos
  49. 9 points
×
×
  • Create New...