Arquivo Retorno do AcbrnfeMonitor para clipper

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

marciotullio
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 28 Ago 2009 15:17
Localização: Joao Pessoa

Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por marciotullio »

Boa tarde a todos.

Alguem tem alguma função para ler o retorno do AcbrNfeMonitor , estou com grande dificuldade em como fazer , isso ja achei aqui no forum uma função mas e para Fivewin , e estou com clipper então tem um monte de chamadas externas que não existem no clipper, Qualquer ajuda e bem vinda.
Editado pela última vez por Toledo em 03 Jun 2010 22:25, em um total de 1 vez.
Razão: O presente tópico foi movido da seção CA-Clipper, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com o Clipper.
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por anacatacombs »

Você começou alguma coisa ?
Eu tenho essa rotina implementada, mas é bem focada ao sistema, talvez você nem consiga aproveitar..
Dificuldades em que?

[]'s

Ana
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por Toledo »

Márcio, segue abaixo uma função que criei para tratar o arquivo de retorno do ACBrNFeMonitor, mas como eu uso MiniGui, tive que fazer algumas alterações, que não testei, mas acho que vai funcionar no Clipper, somente dê uma olhada nas variáveis que estão com mais de 10 caracteres, que não é aceito pelo Clipper.

Código: Selecionar todos

FUNC ESP_RET(v_pro)
LOCAL ret:=.T.,nContador:=0
PRIV v_aOk:={}
DO WHILE !FILE(cArqSAI)
 nContador+=1
 inkey(.5)
 IF nContador>120
   msgNFE:="COMUNICACAO COM SEFAZ;Favor verificar se sua Conexão com a Internet esta ativa."
   IF ALERT(msgNFE,{"Tentar Novamente","Cancelar"})==1
    nContador=0
    LOOP
   ELSE
    if file(cArqENT)
     delete file (cArqENT)
    endif
    AADD(v_aOk,.F.)
    AADD(v_aOk,"99-Falta de Comunicacao")
    RETU (v_aOk)
   ENDIF
 ENDIF
ENDDO

nFileHandle = FOPEN( cArqSAI )
nFileSize = FSEEK( nFileHandle, 0, 2 )
FSEEK( nFileHandle, 0, 0 )
nBytesRead = 0
aLinha = ReadLin( nFileSize )
FCLOSE( nFileHandle )
IF LEN(aLinha)>0
 v_l:=aLinha[1]
 IF "OK:" $ v_l
  IF v_pro="AdicionarNFe"
   v_chv:=RIGHT(ALLTRIM(v_l),52)
   AADD(v_aOk,.T.)
   AADD(v_aOk,LEFT(v_chv,44))
  ENDIF
  IF v_pro="StatusServico"
   AADD(v_aOk,.T.)
  ENDIF
  IF v_pro="ConsultarNFe"
   AADD(v_aOk,.T.)
   FOR vli=1 TO LEN(aLinha)
    v_l:=aLinha[vli]
    IF LEFT(v_l,6)="CStat="
     AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
    ENDIF
    IF LEFT(v_l,8)="XMotivo="
     AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
    ENDIF
    IF LEFT(v_l,9)="DhRecbto="
     AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
    ENDIF
    IF LEFT(v_l,6)="NProt="
     AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
    ENDIF
    IF LEFT(v_l,7)="DigVal="
     AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
    ENDIF
   NEXT
  ENDIF
  IF v_pro="CancelarNFe"
   IF "Rejeição:" $ v_l
    AADD(v_aOk,.F.)
    FOR vli=1 TO LEN(aLinha)
     v_l:=aLinha[vli]
     IF LEFT(v_l,6)="CStat="
      AADD(v_aOk,"Código = "+ALLTRIM(SUBS(v_l,7)))
     ENDIF
     IF LEFT(v_l,8)="XMotivo="
      AADD(v_aOk,"Motivo = "+ALLTRIM(SUBS(v_l,9)))
     ENDIF
    NEXT
   ELSE
    AADD(v_aOk,.T.)
    FOR vli=1 TO LEN(aLinha)
     v_l:=aLinha[vli]
     IF LEFT(v_l,6)="CStat="
      AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
     ENDIF
     IF LEFT(v_l,8)="XMotivo="
      AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
     ENDIF
     IF LEFT(v_l,9)="DhRecbto="
      AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
     ENDIF
     IF LEFT(v_l,6)="NProt="
      AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
     ENDIF
     IF LEFT(v_l,7)="DigVal="
      AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
     ENDIF
    NEXT
   ENDIF
  ENDIF
  IF v_pro="EnviarLoteNFe"
   AADD(v_aOk,.T.)
   vTag=1
   vNRec=""
   FOR vli=14 TO LEN(aLinha)
    v_l:=aLinha[vli]
    IF LEFT(v_l,5)="NRec="
     vNRec=ALLTRIM(SUBS(v_l,6))
     AADD(v_aOk,vNRec)
    ENDIF
    IF LEFT(v_l,6)="CStat="
     IF vTag>2
      AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,8)="XMotivo="
     IF vTag>2
      AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,9)="DhRecbto="
     IF vTag>2
      AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,4)="[NFE"
     v_temp=STRTRAN(SUBS(v_l,5),"]","")
     v_n_nfe:=STRZERO(VAL(v_temp),6)
     AADD(v_aOk,"NFE"+v_n_nfe)
    ENDIF
    IF LEFT(v_l,6)="NProt="
     AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
    ENDIF
    IF LEFT(v_l,7)="DigVal="
     AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
    ENDIF
   NEXT
  ENDIF
 ELSE
  AADD(v_aOk,.F.)
  FOR vli=1 TO LEN(aLinha)
   AADD(v_aOk,aLinha[vli])
  NEXT
 ENDIF  
ELSE
 AADD(v_aOk,.F.)
 AADD(v_aOk,"98-Arquivo de retorno vazio")
ENDIF
IF FILE(cArqSAI)
 DELETE FILE (cArqSAI)
ENDIF
RETU v_aOk

FUNCTION ReadLin(nFileSize)
PRIV v_L:={}
cAccumText:=""
DO WHILE nBytesRead<=nFileSize
   cSingle = FREADSTR( nFileHandle, 1 )
   nBytesRead = nBytesRead + 1
   IF cSingle = CHR(13)
      cSingle = FREADSTR( nFileHandle, 1 )
      nBytesRead = nBytesRead + 1
      IF cSingle = CHR(10)
         cSingle = FREADSTR( nFileHandle, 1 )
         nBytesRead = nBytesRead + 1
         IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
            FSEEK( nFileHandle, -1, 1 )
            nBytesRead = nBytesRead - 1
         ENDIF
      ELSE
         IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
           FSEEK( nFileHandle, -1, 1 )
           nBytesRead = nBytesRead - 1
         ENDIF
      ENDIF
      AADD(v_L,cAccumText)
      cSingle = ""
      cAccumText = ""
   ELSE
      cAccumText = cAccumText + cSingle
   ENDIF
ENDDO
RETURN v_L
Declarar as seguintes variáveis:

Código: Selecionar todos

Private cArqENT:="C:\ACBrNFeMonitor\ENTNFE.TXT"
Private cArqSAI:="C:\ACBrNFeMonitor\SAINFE.TXT"
Exemplo de uso:

Código: Selecionar todos

 aOk2=ESP_RET("ConsultarNFe")

 IF aOk2[1]
  FOR v_i=2 TO LEN(aOk2)
   IF LEFT(aOk2[v_i],6)="CStat="
    vSCAL5_40:=SUBS(aOk2[v_i],7)
   ENDIF
   IF LEFT(aOk2[v_i],8)="XMotivo="
    vSCAL5_32:=SUBS(aOk2[v_i],9)
   ENDIF
   IF LEFT(aOk2[v_i],9)="DhRecbto="
    vSCAL5_42:=SUBS(aOk2[v_i],10)
   ENDIF
   IF LEFT(aOk2[v_i],6)="NProt="
    vSCAL5_34:=SUBS(aOk2[v_i],7)
   ENDIF
   IF LEFT(aOk2[v_i],7)="DigVal="
    vSCAL5_43:=SUBS(aOk2[v_i],8)
   ENDIF
  NEXT
  //AQUI GRAVA OS DADOS NO DBF
 ELSE
  vMsg:="Ocorreu um Erro da Consulta!"
  FOR i=2 TO LEN(aOk2)
   vMsg+=";"+aOk2[i]
  NEXT
  TONE(1000)
  ALERT(vMsg)
 ENDIF
Esta minha função também está bem focada para o meu sistema, então vai servir apenas como base para você.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
marciotullio
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 28 Ago 2009 15:17
Localização: Joao Pessoa

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por marciotullio »

Blz Obrigado ja deu uma luz no fim do tunel , vou começar a verificar os retornos e fazer os ajustes.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por rochinha »

Amiguinho,

Voce deve olhar o tópico *** Presente de Ano Novo **** Gerenciamento de ECFS.

Neste tópico eu abordo como gerenciar vários tipos de ECF usando apenas um código de impressão, ou seja, uma rotina de impressão de cupoms generalizada com suporte aos ECFs conhecidos no mercado sem tanta programação.

O mesmo possui um sub-módulo para uso do ACBr. Pelo exposto basta que voce tenha uma variavel publica com o nome do motor que vai usar:

Código: Selecionar todos

PUBLIC ECF_Driver = "MATRICIAL" // Pode ser também "URANO","DARUMA","BEMATECH","MECAF","SWEDA","SCHALTER","QUATTRO","ACBR"
O codigo para uso da impressão:

Código: Selecionar todos

ECF_AbreCupom( cCNPJ )
do while not. eof()
     ECF_VendeItem( cCodigo, cDescricao, cAliquota, cTipoQtde, 
     skip
enddo
ECF_IniciaFechamentoCupom( cTipo, cEspecie, cValor )
ECF_EfetuaFormaPagamento( cForma, cValor )
ECF_FechaCupom( cForma, cValor )
Simples né, agora é só analisar, fazer as alterações necessárias e usar sem susto.

Se precisar de apoio abra um tópico que as células pensantes do forum começarão a funcionar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
marciotullio
Usuário Nível 1
Usuário Nível 1
Mensagens: 16
Registrado em: 28 Ago 2009 15:17
Localização: Joao Pessoa

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por marciotullio »

Ja uso o Acbr para ECF , a minha duvida era para usar o ACBR NFE MONITOR , pra nfe eletronica.

mas agradecido pela dica.
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por janio »

Toledo,

Achei bem legal sua função de tratamento de retorno do AcbrNfeMonitor.

Para eu poder fechar aqui minha rotina gostaria q vc mostrasse um EXEMPLO DE USO para ENVIO da Nfe e também para CANCELAMENTO da Nfe.

É possível?

Obrigado
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Arquivo Retorno do AcbrnfeMonitor para clipper

Mensagem por Toledo »

janio, segue abaixo os exemplos:

Cancelamento de NFe:

Código: Selecionar todos

aOk2=ESP_RET("CancelarNFe")

IF aOk2[1]
  FOR v_i=2 TO LEN(aOk2)
   IF LEFT(aOk2[v_i],6)="CStat="
    vSCAL5_40:=SUBS(aOk2[v_i],7)
   ENDIF
   IF LEFT(aOk2[v_i],8)="XMotivo="
    vSCAL5_32:=SUBS(aOk2[v_i],9)
   ENDIF
   IF LEFT(aOk2[v_i],9)="DhRecbto="
    vSCAL5_42:=SUBS(aOk2[v_i],10)
   ENDIF
   IF LEFT(aOk2[v_i],6)="NProt="
    vSCAL5_34:=SUBS(aOk2[v_i],7)
   ENDIF
   IF LEFT(aOk2[v_i],7)="DigVal="
    vSCAL5_43:=SUBS(aOk2[v_i],8)
   ENDIF
  NEXT
  // Aqui voce grava os dados
  vMsg:="Código Stat: "+vSCAL5_40+Local1+;
        "Situação: "+vSCAL5_32
  MsgInfo(vMsg,"Resultado do Cancelamento da NFe "+NFS_100->SCAL5_01)
ELSE
  vMsg:="Ocorreu um Erro no Cancelamento!"
  FOR i=2 TO LEN(aOk2)
   vMsg+=Local1+aOk2[i]
  NEXT
  PlayExclamation()
  MsgInfo(vMsg,"Resultado do Cancelamento da NF-e "+NFS_100->SCAL5_01)
ENDIF
Envio de NFe:

Código: Selecionar todos

aOk2=ESP_RET("EnviarNFe")

IF aOk2[1]
     FOR v_i=3 TO LEN(aOk2)
       IF LEFT(aOk2[v_i],6)="CStat="
           vSTATUS:=SUBS(aOk2[v_i],7)
       ENDIF
       IF LEFT(aOk2[v_i],8)="XMotivo="
           vXMOTIVO:= SUBS(aOk2[v_i],9,50)
       ENDIF
       IF LEFT(aOk2[v_i],6)="NProt="
           vNPROT:= SUBS(aOk2[v_i],7)
       ENDIF
       IF LEFT(aOk2[v_i],7)="DigVal="
           vDIGVAL:= SUBS(aOk2[v_i],8)
       ENDIF
       IF LEFT(aOk2[v_i],9)="DhRecbto="
           vDHRECBTO:= SUBS(aOk2[v_i],10)
       ENDIF
       IF LEFT(aOk2[v_i],6)="ChNFe="
           vCHAVE:=SUBS(aOk2[v_i],7)
       ENDIF
       IF LEFT(aOk2[v_i],5)="NRec="
           vRECIBO:= SUBS(aOk2[v_i],6)
       ENDIF
     NEXT
     //Aqui voce grava os dados
ELSE
   v_Erros+=1
   AADD(aErro,"Criar e Enviar NFe")
   AADD(aErro,"NFe: "+N_NOTA)
   FOR v_i=2 TO LEN(aOk2)
     AADD(aErro,aOk2[v_i])
   NEXT
ENDIF
No meu caso, eu não envio as NFes individualmente, envio por lote. Então, no meu exemplo da mensagem anterior, depois da linha 94, acrescente:

Código: Selecionar todos

  IF v_pro="EnviarNFe"
   AADD(v_aOk,.T.)
   vTag=1
   vNRec=""
   FOR vli=14 TO LEN(aLinha)
    v_l:=aLinha[vli]
    IF LEFT(v_l,5)="NRec="
     vNRec=ALLTRIM(SUBS(v_l,6))
     AADD(v_aOk,"NRec="+vNRec)
    ENDIF
    IF LEFT(v_l,6)="CStat="
     IF vTag>2
      AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,8)="XMotivo="
     IF vTag>2
      AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,9)="DhRecbto="
     IF vTag>2
      AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
     ELSE
      vTag+=1
     ENDIF
    ENDIF
    IF LEFT(v_l,6)="NProt="
     AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
    ENDIF
    IF LEFT(v_l,7)="DigVal="
     AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
    ENDIF
    IF LEFT(v_l,6)="ChNFe="
     AADD(v_aOk,"ChNFe="+ALLTRIM(SUBS(v_l,7)))
    ENDIF
   NEXT
  ENDIF
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder