Ir para conteúdo
  • Cadastre-se

jjw.roberto

Membros
  • Total de ítens

    176
  • Registro em

  • Última visita

Posts postados por jjw.roberto

  1. Em 16/09/2016 at 16:53, Daniel Simoes disse:

    Preciso do Log do ACBrECF

    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?

  2. Em 16/09/2016 at 17:20, Juliomar Marchetti disse:

    Está correto!

    mas somente o que não usa o comum dav, pre venda nf-e etc

    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?

  3. 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.

    • Curtir 2
  4. 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?

  5. 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 ? 

     

  6. 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).

  7. 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 ?

  8. 19 minutos atrás, Régys Silveira disse:

    Se você utilizar o ACBrTED ele vai juntar os valores por forma de pagamento e abrir um CCD só no valor total imprimindo todos os comprovantes nele.

    Essa é a forma que ele funciona hoje.

    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 ?

  9. Em 30/08/2016 at 15:30, Juliomar Marchetti disse:

    Boa tarde

     o ACBrTEFD já está pronto para isso ele faz a impressão em um único CCD!

    para compatibilizar pois nem todas as ECF aceitam vários CCD para um cupom!

    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
  10. 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?

     

  11. 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?

    • Curtir 1
  12. 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!

     

  13. 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?

     

     

  14. 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

  15. 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.

  16. 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.

  17. 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;

     

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...