Jump to content

jjw.roberto

Membros
  • Posts

    176
  • Joined

  • Last visited

Everything posted by jjw.roberto

  1. Só mais uma coisa. Nosso aplicativo está sendo criado utilizando Java. Estamos pensando em embarcar a JRE para evitar problemas de compatibilidade entre versões instaladas no cliente. Neste caso, iremos precisar homologar todos os arquivos da JRE também?
  2. Então Daniel, não é um problema na comunicação serial do ACBrECF, isso está funcionando maravilhosamente bem. O que estou questionando é a comunicação TCP/IP que o ACBrMonitorPlus fornece, no qual permite que uma aplicação terceira envie comandos para o ACBrMonitorPlus manipular o ECF (um controle remoto do ECF por meio TCP). A questão é a seguinte (pelo que existe na implementação do ACBrMonitorPlus): - Todo o comando recebido pelo servidor TCP/IP no ACBrMonitorPlus, sempre que, retorne da ECF uma string vazia tem o comportamento retornar o "RespostaComando" do ACBrECF por padrão. Por exemplo: Envio ao ACBrMonitorPlus isso: "ECF.MFAdicional" A impressora retorna "" Neste momento, no finally da tratativa de comandos TCP do ACBrMonitorPlus, ele identifica que está retornando uma string vazia e reatribui o valor de retorno com o valor da propriedade "ACBrECF.RespostaComando" Foi isso que citei nos primeiros POSTs à nível de fonte É estranho eu mandar para o ACBrMonitorPlus "ECF.MFAdicional" e ele me retornar o valor do "ECF.RespostaComando" Minha dúvida é esta, é uma questão de quebra do contrato da comunicação entre o ACBrMonitorPlus e a aplicação cliente. Como vou saber se o retorno do comando é o valor que requisitei e não o valor RespostaComando?
  3. Julimar, não entendi muito bem sua citação "mas somente o que não usa o comum dav, prevenda nf-e etc". Quer dizer que estes itens citados podem sim estar no retaguarda e são altamente dependentes de rede?
  4. Como sou de Santa Catarina, infelizmente temos que usar PAF-ECF, e neste caso não tenho como não usar o recurso de EAD. Acabei de descobrir desbravando os fontes do ACBr Monitor Plus como configurar ela, segue o passo à passo: Entre nas configurações do ACBr Monitor Plus Vá até a sessão "RFD" Selecione a checkbox "GerarRFD" Clique em salvar Provavelmente você será redirecionado para a sessão "Monitor" (se não for, passe ao próximo item) Neste momento é necessário informar uma senha de sua preferência na opção "Proteger Configurações" Esta senha serve para criptografar a sua chave privada dentro das configurações, assim ninguém terá acesso à ela sem esta senha Clique em salvar Agora você vai ser redirecionado para a sessão secreta "Cadastros > Software House" Nessa sessão vai ter um texto informando "ATENÇÃO: Chave RSA Privada NÃO pode ser lida no arquivo "swh.ini"." Se você já tem uma chave RSA, clique no botão Importar e a selecione Se não, clique em "Gerar Chave Privada" Vai aparecer ali no campo, no lugar do texto, a chave RSA Clique novamente em Salvar para concluir a configuração Pronto, agora você já pode assinar os arquivos com o EAD Se esqueci de algo, por favor me corrijam. Obrigado.
  5. Daniel, por favor, você poderia me dar a sua opinião?
  6. Pessoal, boa tarde. Me corrijam se eu estiver errado sobre o entendimento do requisito PAF-ECF abaixo: REQUISITO III 1. O PAF-ECF deve ser instalado de forma a possibilitar o funcionamento do ECF independentemente da rede, ainda que eventualmente, exceto quando destinado à utilização exclusiva para o transporte de passageiros. O que entendo sobre ele é, é que devo conseguir emitir cupons fiscais e somente isso. Recursos como: Exportações PAF do MENU FISCAL (as funções que requerem consultar dados como DAV, Pré-venda, etc) Impressão de DAV Impressão de Pré-venda Etc Estes estariam somente disponíveis quando a rede estivesse disponível. Concluindo, nessa linha de raciocínio eu estaria simplificando muito a solução ECF, pois precisaria trazer para o ECF somente os Produtos para conseguir realizar as vendas quando sem rede. ESTOU CORRETO PESSOAL?
  7. O que estou dizendo é que, quando envio um comando por TCP para o ACBrMonitorPlus, como por exemplo o "ECF.MFAdicional", caso este comando retorne o valor vazio, o ACBrMonitorPlus está (no finally) retornando o valor do comando "ECF.ResponstaComando" (isso que estou relatando no 2º post). Isso irá acontecer para TODOS os comandos que retornarem o resultado com length = 0. Se eu requisito um comando, e o valor dele é vazio, deveria retornar vazio e não o dado de outro comando que nem requisitei. Resumindo, não é estranho pra vc, enviar um comando e receber o retorno de outro ?
  8. Não é um problema de ECF, como descrito no post. É um problema de comportamento do ACBrMonitor Plus, referente ao protocolo de comunicação TCP. Leia novamente os 2 primeiros Posts que você irá entender.
  9. Pessoal, encontrei o "problema". Na unit "DoECFUnit.pas" na procedure "procedure DoECF( Cmd: TACBrCmd );" existe um try-finally, aonde no finally existe esta situação: try // comandos do ECF finally if Length( Cmd.Resposta ) = 0 then Cmd.Resposta := RespostaComando ; end ; Sendo assim, quando um comando (no caso o ECF.MFAdicional) é enviado e o retorno for "vazio", o ACBrMonitorPlus retorna a resposta da comunicação com a impressora ECF. Qual o motivo disso? Não acham estranho (despadronizado) esse comportamento, pois toda vez que um parâmetro retornar vazio da ECF vai acabar retornando uma string bizarra que não tem nada haver com o valor da propriedade pedida? Com base no que vi da implementação do ACBrMonitor Plus até agora, o certo deveria ser ter um comando para pegar essa informação quando necessário, por exemplo: "ECF.RespostaComando" (que inclusive já existe).
  10. Pessoal, bom dia. Estou utilizando o ACBrMonitor compilado com Lazarus 1.6. Durante a comunicação estou recebendo caracteres "extras" na resposta do ACBrMonitor Plus. Abaixo um exemplo do que está ocorrendo, mandei o comando "ECF.MFAdicional" e ele me retornou o seguinte abaixo. No exemplo abaixo existe: - comando (ecf.mfadicional) - resposta tratada como string - resposta completa convertida em chars ansi. ecf.mfadicional [RESPOSTA] OK: ? #79 + #75 + #58 + #32 + #2 + #63 + #0 + #0 + #28 + #63 + #28 + #28 + #0 + #0 + #28 + #28 + #69 + #80 + #48 + #56 + #49 + #51 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #49 + #28 + #77 + #70 + #68 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #48 + #49 + #28 + #69 + #80 + #83 + #79 + #78 + #28 + #84 + #77 + #45 + #84 + #56 + #49 + #32 + #70 + #66 + #73 + #73 + #73 + #28 + #69 + #67 + #70 + #45 + #73 + #70 + #28 + #48 + #49 + #46 + #48 + #48 + #46 + #48 + #52 + #28 + #57 + #57 + #28 + #57 + #57 + #28 + #51 + #48 + #48 + #49 + #50 + #48 + #49 + #51 + #49 + #53 + #49 + #65 + #3 Depurando o ACBrMonitor Plus, no método de retorno de comando notei que o problema já aparece ali. Coloquei para logar o tamanho da string que será retornada no memo de log do monitorplus, e vejam: Tamanho resposta: 112 ecf.mfadicional OK: ? Aqui o código que inseri no monitorplus (ACBrMonitor1.pas) marcado com o comentário "NOVO": procedure TFrmACBrMonitor.Resposta(Comando, Resposta: ansistring); var SL: TStringList; begin if rbTCP.Checked then begin if Assigned(Conexao) then begin // >>>>> NOVO !!!! mResp.Lines.Add('Tamanho resposta: ' + inttostr(length(Resposta))); // <<<<<<<<<<<<<<< if chbTCPANSI.Checked then Resposta := Utf8ToAnsi(Resposta); Resposta := StringReplace(Resposta, chr(3), '', [rfReplaceAll]); Conexao.SendString(Resposta); Conexao.SendByte(3); end; end; Alguém pode me ajudar para saber o que pode estar ocorrendo ?
  11. Sim mais no caso que exemplifiquei, vão existir 2 formas de pagamento programadas na ECF, e essas 2 vão ser usadas. Neste caso o ACBrTED vai pegar uma dessas formas de pagamento e totalizar o cupom todo nelas? Um exemplo comum seria assim, digamos que programei as seguintes formas de pagamento 02 - Cartao Credito 03 - Cartao Debito Aí faço uma venda de 100 reais e pago 50 na forma 02 e 50 na forma 03. Neste caso o ACBrTED vai, por exemplo, juntar os dois pagamentos de 50 na forma de pagamento 2 ?
  12. Juliomar, mas no caso eu poderei ter 1 CDC só para as 2 formas de pagamento? Digo isso porque assim, ao abrir o cupom vinculado, o valor da forma de pagamento vai junto e a ECF imprime assim: Valor da compra R$ 50,00 Valor do pagamento R$ 50,00 Número de Parcelas: 1 Isso está errado, pois o valor da compra foi 100 reais, e os pagamentos foram: 25 na forma de pagamento 2 25 na forma de pagamento 2 50 na forma de pagamento 3
  13. Pessoal, boa tarde. Estou com dúvidas de como proceder no seguinte caso. Digamos que tenho na ECF programas 2 formas de pagamento: 2 - CREDITO 3 - DEBITO No sistema PDV fiz uma venda de 100 reais e o pagamento foi feito assim: FORMA 2 - 25,00 reais (CARTAO A ) FORMA 2 - 25,00 reais (CARTAO B ) FORMA 3 - 50,00 reais (CARTAO C ) No cupom fiscal o fechamento irá imprimir o seguinte* : CREDITO 25,00 CREDITO 25,00 DEBITO 50,00 Como devo proceder para emitir o CCD dessa compra? Emitir todos os comprovantes em um só CCD abrir o CCD com a forma de pagamento 2 emitir todos os 3 comprovantes ignorar o fato de que o último comprovante seja da forma de pagamento 3 Emitir um CCD para cada forma de pagamento juntar as formas de pagamento iguais FORMA 2 = 25 + 25 = 50 FORMA 3 = 50 abrir um CCD para a forma 2 e emitir os comprovantes (dois comprovantes - 25,00 cada) abrir um CCD para a forma 3 e emitir o comprovante de 30,00 reais * Outra dúvida, posso efetuar uma forma de pagamento duplicada em qualquer ECF, ou isso pode não ser suportado em alguma impressora?
  14. Pessoal, boa tarde. Estou tentando utilizar a geração de arquivos do PAF com assinatura EAD, porém não estou conseguindo configurar a chave RSA. Não consegui encontrar nenhum lugar nas configurações para informá-la. Na documentação não encontrei nada. Quando chamo o comando ocorre o seguinte erro: ECF.PafMF_LMFS_Espelho("01/08/2016", "21/08/2016", "D:\EspLMFSPeriodo.txt") ERRO: Chave RSA Privada não especificada. - Selecione a aba "Chave RSA" - Calcule sua Chave Privada - Salve as configurações - Distribua a sua Chave Privada com o arquivo criptografado "swh.ini" Já fiz o cadastro básico na sessão "Configurações > Cadastros > Software House" informando: - Razao social - CNPJ - Aplicativo - Numero - Versao Preciso informar mais coisas? O que posso fazer para resolver isso?
  15. Funcionou, show! Pode comitar! hehehehehehe
  16. Pessoal, boa tarde. Baixei e compilei todo o projeto do ACBr em Lazarus 1.6 Windows. Comecei a utilizar o modo de comunicação do ACBr Monitor Plus via TCP, para integrar minha aplicação feita em Java. Até o momento tudo corria bem, mas agora me deparei com um problema, que acredito ser gerado pelo Lazarus. Tenho uma impressora Bematech e uma Epson. Ambas tem formas de pagamento com acentuação já programas. Quando obtenho junto ao ACBrMontiorPlus as formas de pagamento (comando ECF.CarregaFormasPagamento) o contrato de retorno está sendo quebrado. Veja no seguinte exemplo de retorno: OK: 1 Dinheiro| 2V Cartão Formatando melhor o retorno para verificarmos a falta de caracteres: IIIITDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD " 1 Dinheiro" " 2V Cartão" Note que na descrição cartão está faltando um caracter, são na verdade somente 29 posições (ao invés de 30) retornadas pelo ACBrMonitorPlus. Não estou conseguindo descobrir como resolver isso (até porque não tenho grandes conhecimentos em Lazarus), porém acredito que isso esteja ocorrendo pois a String é UTF-8, onde no caso a caracter ã é representado em 2 bytes em UTF-8, diferentemente que no ANSI aonde é 1 byte. Já tentei trocar aquele parâmetro no ACBrMonitor para usar comunicação ANSI mas o problema continua. Fiz a depuração do ACBrMonitorPlus, e o problema aparece no ACBrUtils.pas na função abaixo: function PadLeft(const AString : String; const nLen : Integer; const Caracter : Char) : String ; var Tam: Integer; begin Tam := Length(AString); <<< ESTE LENGTH('Cartão') retorna 7 ao invés de 6!!!! if Tam < nLen then Result := StringOfChar(Caracter, (nLen - Tam)) + AString else Result := LeftStr(AString, nLen) ; //RightStr(AString,nLen) ; end ; Alguém pode me ajudar a resolver isso? Obrigado!
  17. Pessoal, bom dia. Estou tentando automatizar a configuração do ACBrEcf (monitor plus), fazendo com que a minha aplicação escreva o INI e lance o ACBrMonitor. Sendo assim, na minha aplicação tenho somente a listagem das ECFs homologadas pelo governo. Nesta listagem (http://www.fazenda.mg.gov.br/empresas/ecf/informacoes/tabcniee.pdf) existe o CNIEE. Também sei que existe o TACBrCNIEE (show). Enfim, o que quero saber é sem tem como eu chavear pelo CNIEE o modelo (ecfBematech, ecfEscECF, etc) para configurar o modelo para comunicar com o ECF?
  18. Para ter uma idéia de como seria fácil fazer isso, basta adicionar o código abaixo (com o "+" são as linhas à adicionar): (( DoECFUnit.pas - Projeto: AcbrMonitor.lpi )) Procedure DoECF( Cmd : TACBrCmd ) ; . . . + if Cmd.Metodo = 'achar' then + begin + AcharECF(StrToBoolDef(Trim(Cmd.Params(0)),true), StrToBoolDef(Trim(Cmd.Params(1)),true), StrToIntDef(Trim(Cmd.Params(1)), 3)); + end + else . if Cmd.Metodo = 'ativar' then { Ativa o ecf } . . . Assim estou chamando pelo TCP ao AcbrMonitorPlus o comando: // parametros: ProcuraModelo (boolean), ProcuraPorta (boolean), Timeout (int) ECF.achar(true, true, 3) Logo depois pelo as configurações encontradas e gravo manualmente dentro do AcbrMonitor.ini // Exemplo de saída do meu console de testes comunicando com o AcbrMonitor ecf.achar >> OK: ecf.modelo >> OK: ecfEpson ecf.porta >> OK: COM8 Essa info (ecfEpson e COM8) eu gravarei no ini Aproveitando, path em anexo já DoECFUnit.pas.patch
  19. Pelo contrário, acho viável sim, veja o meu cenário. Fiz uma tela de configuração na minha aplicação para cadastrar as configurações do ECF. Para auxiliar o administrador à fazer esta configuração, criamos um botão "detectar", que faz justamente isso. Depois em diante, a configuração é especificada certinha dentro do AcbrMonitor.ini para justamente "não ficar sempre procurando". Resumindo, é um facilitador, assim como na tela de configuração do AcbrMonitor. Inclusive lá, quando vc selecionar Procurar em ambos os campos "Modelo" e "Porta", e clica no ativar... o monitor encontra as configurações e as seta nos componentes.
  20. Pessoal, boa tarde. Gostaria de saber como eu posso proceder para requisitar, ou até mesmo implementar e comitar, um novo recurso no ACBrMontior. O recurso seria ter o comando novo ECF.Achar Assim como já temos a possibilidade de fazer isso por dentro das configurações. Ou então, deixar gravar no AcbrMonitor.ini uma configuração para identificar que desejo procurar o Modelo e a Porta do ECF, por exemplo: [ECF] Modelo=-1 Porta=Procurar E então, ao chamar o comando ECF.Ativar fazer o que é feito no botão "Ativar" dentro das configurações do ECF.
  21. Olá, se você ainda estiver com esse problema, talvez isso aqui ajude:
  22. Pessoal, resolvido! Tive que setar o campo "Página de código" dentro do "ACBr Monitor Plus", sessão "ECF", na aba "Parametros II". Coloquei 850 e funcionou perfeitamente. O problema ocorria pois ao executar o comando "TACBrECFBematech.AbreCupomVinculado" (ACBrECFBematech.pas) é obtida a descrição da forma de pagamento para então enviar o comando #66 para a impressora. Abaixo o ponto aonde ocorria o problema. procedure TACBrECFBematech.AbreCupomVinculado(COO, CodFormaPagto, CodComprovanteNaoFiscal : String; Valor : Double ) ; Var FPG : TACBrECFFormaPagamento ; StrValor, FPGDesc : String ; ComandoCompleto : Boolean ; begin FPG := AchaFPGIndice( CodFormaPagto ) ; if FPG = nil then raise EACBrECFErro.create( ACBrStr('Forma de Pagamento: '+CodFormaPagto+ ' não foi cadastrada.') ) ; COO := Poem_Zeros( trim(COO) ,6) ; FPGDesc := PadRight( CodificarPaginaDeCodigoECF(FPG.Descricao), 16 ) ; <<<<<< AQUI VINHA A DESCRIÇÃO COM CARACTERES ERRADA!!!! //FPGDesc := UpperCase(copy(FPGDesc,1,1))+LowerCase(copy(FPGDesc,2,16)) ; BytesResp := 0 ; ComandoCompleto := ((Valor > 0) and (fs25MFD or (StrToIntDef( NumVersao,0 ) >= 310) )) ; StrValor := IntToStrZero( Round(Valor * 100) ,14) ; if ComandoCompleto then try AguardaImpressao := True ; EnviaComando( #66 + FPGDesc + StrValor + COO, 10) ; except ComandoCompleto := False ; end ; if not ComandoCompleto then begin AguardaImpressao := True ; EnviaComando( #66 + FPGDesc, 10) ; end ; end;
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.