ACBRMONITORPLUS TCP/IP

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

Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por HASA »

- Boa tarde, uso o acbr com troca de arquivos TXT, agora estava tentando usar a troca de informações via tcp/ip na tentativa de agilizar o processo, algum colega teria como dar alguma dica ?

:)´
HASA
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

ACBRMONITORPLUS TCP/IP

Mensagem por janio »

tbm quero!

acompanhando...
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
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ACBRMONITORPLUS TCP/IP

Mensagem por fladimir »

Quando instala o ACBr tem uma pasta com exemplos e tem um deles de como fazer esta comunicação via Sockets, já tentaram?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ACBRMONITORPLUS TCP/IP

Mensagem por JoséQuintas »

Não seria interessante via hbnetio?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ACBRMONITORPLUS TCP/IP

Mensagem por fladimir »

Não dá pra usar o hbnetio pra isso

Tem q acessar o ACBr via porta X pre definida ele
E enviar o comando e ler a resposta
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ACBRMONITORPLUS TCP/IP

Mensagem por JoséQuintas »

É que você poderia ter o aplicativo Harbour na máquina do ACBR, e comunicar o Harbour pelo hbnetio.
Aliás, nem precisa hbnetio pra isso, poderia ser dbf ou mysql, ou qualquer outra coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ACBRMONITORPLUS TCP/IP

Mensagem por fladimir »

Sim nesse caso sim, mas o X da questão é comunicar com o ACBR sem ser por troca de arquivo TXT e sim via TCP
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por HASA »

- Pessoal acho que o Kapiaba deu a letra, vejam:

http://fivewin.com.br/index.php?/files/ ... 0-acbrprg/

HASA

:))
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ACBRMONITORPLUS TCP/IP

Mensagem por fladimir »

Show de Bola... da pra usar ai para as outras funcionalidades...
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por HASA »

:))
Na verdade achei o link mas... ainda não tive tempo de testar ou adequar para Minigui, as vezes os código de FiveWin chamam recursos da lib especicificamente e temos que traduzir para funções da Minigui, pretento ver isso até o finalk de semana ok.

:xau
HASA
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por Kapiaba »

Hasa, não lembro se é este mesmoo, já que o link de download quebrou no fivewin brasil.

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//  Programa: ACBR.PRG                                                        //
//  Funcao..: FUNCAO AcbrMonitor/Boleto                       Em: 15/06/2016  //
//                                                                            //
//  Programador...: DORNELES                                                  //
//  Skype.........: soft.tres                                                 //
//  soft-tres@uol.com.br                                                      //
//  www.soft-tres.com.br                                                      //
////////////////////////////////////////////////////////////////////////////////

#include "fivewin.ch"
#include "fileio.ch"
#INCLUDE ".\Include\RetornoI.Ch"

#define  ETX chr(3)
#define  CR  chr(13)
#define  LF  chr(10)

Static sENDER   := ''  ,;
       SEM_ERRO := .F. ,;
       RET_IMP  := ''

Static sSOCKET

////////////////////////////////////////////////////////////////////////////////
#IFDEF __PLATFORM__Linux
 #DEFINE PATH_DEL '/'
 #DEFINE DIR_DEL ''
 #DEFINE K_GO_TOP    409
 #DEFINE K_GO_BOTTOM 417
#ELSE
 #DEFINE PATH_DEL '\'
 #DEFINE DIR_DEL ':'
 #DEFINE K_GO_TOP    chr(31)
 #DEFINE K_GO_BOTTOM chr(30)
#ENDIF

* MODO DA WINDOW  *
#define SW_HIDE 0  
#define SW_SHOWNORMAL 1  
#define SW_NORMAL 1  
#define SW_SHOWMINIMIZED 2  
#define SW_SHOWMAXIMIZED 3  
#define SW_MAXIMIZE 3  
#define SW_SHOWNOACTIVATE 4  
#define SW_SHOW 5  
#define SW_MINIMIZE 6  
#define SW_SHOWMINNOACTIVE 7  
#define SW_SHOWNA 8  
#define SW_RESTORE 9

* DEFAULT -> Caso a variavel seja nula substitui pelo valor passado.
#command DEFAULT <p> TO <val> [,<pn> TO <valn>]                     ;
         =>                                                         ;
         <p> = iif(<p> = NIL,<val>,<p>)                             ;
         [;<pn> = iif(<pn> = NIL,<valn>,<pn>)]

* ADEL_VET -> Apaga um elemento do vetor e reajusta o seu tamanho
#DEFINE  ADEL_VET(VET,NUM) adel(VET,NUM) ; asize(VET,len(VET) - 1)

* AINS_VET -> Insere in elemento em um vetor
#define AINS_VET(vetor,n_elem,conteudo)                             ;
 iif(n_elem > len(vetor),aadd(vetor,conteudo),vetor[n_elem] := conteudo)

* COMPILE -> Transforma uma varivel em um bloco de codigo
#define COMPILE(c_expr) &("{||"+c_expr+"}")

////////////////////////////////////////////////////////////////////////////////
Function ACBR_INIT(ENDERECO)   // Abre a comunicação com o ACBrmonitor
   * ENDERECO -> Diretorio ( quando usando TXT)  Ex: C:\ACBR\
////////////////////////////////////////////////////////////////////////////////
   Local P, RET := .T., TFIM, IP, PORTA, RESP

   if ! empty(sENDER)  // J  est  aberto...
      return .t.
   endif

   SEM_ERRO := .F.
   sENDER   := alltrim(ENDERECO)
   IP       := ''
   PORTA    := 0

   P := at(':',sENDER)
   if P = 0
      P := len(sENDER)+1
   endif
   IP    := substr(sENDER,1,P-1)
   if empty(IP)
      RET := .F.
   else
      PORTA := val(substr(sENDER,P+1))
      if PORTA = 0
         PORTA := 3434
      endif
      inetinit()
      RET := .F.
      TFIM := Seconds() + 5             /// Tenta conectar durante 5 segundos ///
      do while Seconds() < TFIM .and. ! RET
         sSOCKET := inetconnect(IP,PORTA)
         RET     := (ineterrorcode(sSOCKET) = 0)
         SysWait(0.2)
      enddo
   endif
   if RET
   
   	TRY
      	InetSetTimeout( sSOCKET, 300 )   // Timeout de Recepção 3 seg //
      	RESP := InetRecvEndBlock( sSOCKET, ETX )
	   CATCH
		END
	
      RET  := ('Conectado' $ RESP )   // Recebeu as boas vindas ?
      
   endif
   if ! RET
      sENDER := ''
   endif
return RET
////////////////////////////////////////////////////////////////////////////////
function ACBR_BOL_Comando( cIndice, cDados )
////////////////////////////////////////////////////////////////////////////////
   LOCAL ret_line := "chr(13)+chr(10)"
   LOCAL cTcpIp   := "1"
   LOCAL lReturn  := .T.
   
   // Checar se o ACBR está instalado...
   cPath := "C:\ACBrMonitorPLUS"
   IF ! lIsDir(cPath)
      MsgInfo("O ACBrMonitor não está instalado", "Aviso")
      RETURN(.F.)
   ENDIF
   
   cTcpIp := GetPvProfString( "ACBrMonitor", "Modo_TCP", " ", "C:\ACBrMonitorPLUS\ACBrMonitor.ini")
   cIsTxt := GetPvProfString( "ACBrMonitor", "Modo_TXT", " ", "C:\ACBrMonitorPLUS\ACBrMonitor.ini")
   c_Gate := GetPvProfString( "ACBrMonitor", "TCP_Porta", "3434", "C:\ACBrMonitorPLUS\ACBrMonitor.ini")
   c_Ende := ""
   IF cTcpIp = "1" ; c_Ende := "127.0.0.1:"+c_Gate ; ENDIF
   IF cIsTxt = "1" ; c_Ende := "C:\ACBrMonitorPLUS" ; ENDIF
   IF EMPTY(c_Ende) ; MSGINFO("Detectado erro de configuração no ACBrMonitor","Aviso"); RETURN .F. ; ENDIF
   cDirDoMonitor := cPath
   errfile  := "ENT.CMD"
   cDados   := iif(ValType(cDados)#"C","",cDados)
   cBuffer := cIndice + iif( len( cDados )=0,"()","(" + cDados + ")")

   IF cIsTxt = "1"
   
      errhandle := FCREATE(errfile)
      FWRITE(errhandle,cBuffer+&ret_line.)
      FCLOSE(errhandle)
      FERASE( cDirDoMonitor+"\ENT.TXT" )
      FERASE( cDirDoMonitor+"\SAI.TXT" )
      COPY FILE &(errfile) TO &(cDirDoMonitor+"\"+errfile)
      FRENAME( cDirDoMonitor+"\"+errfile, cDirDoMonitor+"\ENT.TXT" )
      
   ELSEIF cTcpIp = "1"
   
   	TRY
      	IF ! ACBR_INIT(c_Ende) 
	      	SysRefresh()
   	   	ACBR_END()
      		SysRefresh()
				MsgAlert("Erro ao tentar abrir a porta de comunicação!","Aviso!") 
				lReturn  := .F. 
	   	ENDIF
	   CATCH
		END
			
		IF !lReturn 
		   RETURN(.F.)
		ENDIF
	
      SysRefresh()
      IF ! ACBR_ABERTA() ; RETURN .F. ; ENDIF
      SysRefresh()
      ACBR_COMANDO( cBuffer )
      SysRefresh()
   ENDIF
   
   RETURN(.T.)   
////////////////////////////////////////////////////////////////////////////////   
Function ACBR_ABERTA()   // Retorna .t. se a COM ja est  aberta
////////////////////////////////////////////////////////////////////////////////
return ! empty(sENDER)
////////////////////////////////////////////////////////////////////////////////
Function IBR_OK(RESP)   // Retorna .T. se a String inicia com OK:
////////////////////////////////////////////////////////////////////////////////
return (substr(RESP,1,3) == 'OK:')
////////////////////////////////////////////////////////////////////////////////
Function ACBR_END()   // Fecha a porta da Impressora
   * Encerra a comunicacao com a impressora, nao precisa de parametros
////////////////////////////////////////////////////////////////////////////////
   if ! empty(sENDER)
      inetsendall( sSocket, 'ACBR.bye' )
   endif
   if sSOCKET <> NIL
      inetclose(sSOCKET)
      inetdestroy(sSOCKET)
      inetcleanup()
      SysWait(0.2)
      sSOCKET := NIL
   endif
   sENDER  := ''
	return(.t.)
////////////////////////////////////////////////////////////////////////////////
Function ACBR_COMANDO(CMD,VET_PARAM,ESPERA,TENTA)
   * Funcao de uso interno para enviar os comandos e
   * registrar os erros retornados. Exibe os erros se existirem
////////////////////////////////////////////////////////////////////////////////
   Local REQ, RESP, TEMPOR, TINI, TFIM, BLOCO, BYTES, I, TIPO_PARAM

   if empty(sENDER)
      if ! SEM_ERRO
         MsgAlert('ACBrMonitor n†o foi inicializado.',"Aviso")
      endif
      return ''
   endif

   DEFAULT VET_PARAM   to {} ,;
           ESPERA      to 900 ,; // 5 minutos
           TENTA       to .t.

   RET_IMP  := ''
   c_Cmmd := SUBSTR(CMD,1,AT("(",CMD)-1)
   SysRefresh()

   //////// Transmitindo o comando /////////
   CMD := ALLTRIM(CMD)+CRLF+"."+CRLF // Requisitos do ACBR
   
   TRY
   	InetSetTimeout( sSOCKET, 300 )  // Timeout de Envio 3 seg //
   CATCH
	END	
   	
   if inetsendall( sSOCKET, CMD ) <= 0
      RET_IMP := 'ERRO: Nao foi possivel transmitir dados para o ACBrMonitor|'+;
                 '('+AllTrim(Str(InetErrorCode( sSOCKET )))+') '+;
                 InetErrorDesc( sSOCKET ) + ETX
   endif

   TINI   := Seconds()
   do while (right(RET_IMP,1) <> ETX)
   
      SysRefresh()                               
      BLOCO := space(64)
      
      //////// Lendo a resposta ////////
      TRY
      	InetSetTimeout( sSOCKET, 300 )
  	      BYTES   := inetrecv(sSOCKET, @BLOCO, 64)
      CATCH
		END	

      RET_IMP += left(BLOCO,BYTES)

      if Seconds() > (TINI + ESPERA)
         if ! TENTA
            RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+;
                       ' segundos (TimeOut)' + ETX
         else
            if ALERT('O ACBrMonitor n†o est  respondendo. '+;
                     'Deseja tentar novamente ?',{'SIM','NAO'}) # 1
               RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+;
                          ' segundos (TimeOut)' + ETX
            else
               TINI := Seconds()
            endif
         endif
      endif
   enddo

   do while right(RET_IMP,1) $ CR+LF+ETX   // Remove sinalizadores do final
      RET_IMP := left(RET_IMP,len(RET_IMP)-1)
   enddo

return RET_IMP
////////////////////////////////////////////////////////////////////////////////
FUNCTION ACBR_GravaCedente()
////////////////////////////////////////////////////////////////////////////////
	LOCAL cLinha    := ""
	LOCAL cArquivo  := "C:\ACBrMonitorPLUS\Cedente.ini"
	LOCAL lCloseEmp := .F.
	LOCAL lCloseCon := .F.
	
	IF FILE(cArquivo)
	   FErase(cArquivo)
	ENDIF   
	                         
	IF SELECT("Empresa") = 0
	   IF !AbreDbfNtx({"Empresa"})
	      RETURN(.F.)
	   ENDIF
	   lCloseEmp := .T.
	ENDIF

	IF SELECT("Convenio") = 0
	   IF !AbreDbfNtx({"Convenio"})
	      RETURN(.F.)
	   ENDIF
	   lCloseCon := .T.
	ENDIF
	
	SELECT Empresa
	SET ORDE TO 1
	ClearMyFilter()
	SetMyFilter(cCod_Emp,cCod_Emp)
	
	SELECT Convenio
	SET ORDE TO 3 
	SetMyFilter("1")
	Convenio->(DbGoTop())

   cLinha := "[Cedente]"+CRLF
   cLinha += "Nome="+Empresa->nm_empresa+CRLF
	cLinha += "CNPJCPF="+TRANSF(Empresa->cnpjcpf,"@R 99.999.999/9999-99")+CRLF
	cLinha += "Logradouro="+Empresa->endereco+CRLF
	cLinha += "Numero="+TRANSF(Empresa->nro,"99999")+CRLF
	cLinha += "Bairro="+Empresa->bairro+CRLF
	cLinha += "Cidade="+Empresa->cidade+CRLF
	cLinha += "CEP="+TRANSF(Empresa->cep,"@R 99.999-999")+CRLF
	cLinha += "Complemento="+CRLF
	cLinha += "UF="+Empresa->uf+CRLF
	cLinha += "RespEmis=0"+CRLF    //[0] Cliente Emite  [1] Banco Emite    [2] Banco Reemite [3] Banco não Reemite
	cLinha += "TipoPessoa=1"+CRLF  //[0] Pessoa Física  [1] Pessoa Juridica [2] Outros
	cLinha += "CodigoCedente="+LTRIM(Convenio->codcedente)+CRLF
	cLinha += "LayoutBol="+TRANSF(Convenio->idlayout,"9")+CRLF   //[0] Padrão         [1] Carnê 	[2] - Fatura (Não implementado = Padrão)	[3] Padrão Entrega
	cLinha += "Modalidade=3"+CRLF
	cLinha += "CaracTitulo=0"+CRLF //[0] Cobrança Simples [1] Cobrança Vinculada [2] Cobrança Caucionada [3] Cobrança Descontada [4] Cobrança Vendor
	cLinha += "Convenio="+LTRIM(Convenio->nroconveni)+CRLF
	cLinha += ""+CRLF
	cLinha += "[Conta]"+CRLF
	cLinha += "Conta="+LTRIM(TRANS(Convenio->nroconta,"@!"))+CRLF
	cLinha += "DigitoConta="+LTRIM(TRANS(Convenio->digconta,"9"))+CRLF
	cLinha += "Agencia="+LTRIM(TRANS(Convenio->nroage,"@!"))+CRLF
	cLinha += "DigitoAgencia="+LTRIM(TRANS(Convenio->digage,"@!"))+CRLF
	cLinha += ""+CRLF
	cLinha += "[Banco]"+CRLF
	cLinha += "Numero="+LEFT(TRANS(Convenio->nrobancodv,"@!"),3)+CRLF
	cLinha += "CNAB=0"+CRLF
	cLinha += "IndiceACBr="+LTRIM(TRANS(Convenio->idbanco,"99"))+CRLF
	
 				/* INDICEACBR
					Este campo não é obrigatório, desde que o número do banco seja informado.
               Caso ambos sejam informados, o Número terá prioridade.
               1 - Banco do Brasil
               2 - Santander
               3 - Caixa Econômica Federal (Convênio SIGCB)
               4 - Caixa Econômica Federal (Convênio SICOB)
               5 - Bradesco
               6 - Itaú
               7 - Banco Mercantil
               8 - Sicred
               9 - Bancoob
               10 - Banrisul
               11- HSBC
               12- Banestes
               13- Banco do Nordeste
               14- Banco BRB 	*/
               
	FWriteLine(cArquivo  , cLinha )
   FClose(cArquivo)
   
   IF lCloseEmp 
      CloseFile("Empresa")
   ENDIF

   IF lCloseCon
   	CloseFile("Convenio")
   ENDIF
   
	RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////	
FUNCTION ACBR_GravaTitulo()
////////////////////////////////////////////////////////////////////////////////	
	LOCAL cLinha    := ""
	LOCAL cArquivo  := "C:\ACBrMonitorPLUS\titulos.ini"
	LOCAL nNroTitulo:=0
	
	IF FILE(cArquivo)
	   FErase(cArquivo)
	ENDIF   

   DbSelectArea("aTitulos") 
   aTitulos->(DbGoTop())
   
   WHILE aTitulos->(!EOF())
   
   		nNroTitulo++
      	cLinha += "[titulo"+LTRIM(STR(nNroTitulo,2))+"]"+CRLF
      	cLinha += "NumeroDocumento="+LTRIM(aTitulos->NUMERODOC)+CRLF
      	cLinha += "NossoNumero="+LTRIM(aTitulos->NOSSONUME)+CRLF
      	cLinha += "Carteira="+LTRIM(aTitulos->carteira)+CRLF
      	cLinha += "ValorDocumento="+STRTRAN(LTRIM(TRANSF(aTitulos->VALORDOC,"999,999,999.99")),".",",")+CRLF
      	cLinha += "Vencimento="+LTRIM(TRANSF(aTitulos->DTVCTO,"@D"))+CRLF
      	cLinha += "DataDocumento="+LTRIM(TRANSF(aTitulos->DTEMISSAO,"@D"))+CRLF
      	cLinha += "DataProcessamento="+LTRIM(TRANSF(aTitulos->DTPROCESSA,"@D"))+CRLF
      	cLinha += "DataAbatimento="+LTRIM(TRANSF(aTitulos->DTABATIMEN,"@D"))+CRLF
      	cLinha += "DataDesconto="+LTRIM(TRANSF(aTitulos->DTDESCONTO,"@D"))+CRLF
      	cLinha += "DataProtesto="+LTRIM(TRANSF(aTitulos->DTPROTESTO,"@D"))+CRLF
      	cLinha += "PercentualMulta="+LTRIM(TRANSF(aTitulos->PERMULTA,"99.99"))+CRLF
      	cLinha += "LocalPagamento=Pagavel em qualquer agência bancaria mesmo após o vencimento"+CRLF
      	cLinha += "EspecieDoc="+LTRIM(TRANSF(aTitulos->ESPECIE,"@!"))+CRLF
      	cLinha += "EspecieMod="+LTRIM(TRANSF(aTitulos->MOEDA,"@!"))+CRLF
      	cLinha += "Sacado.NomeSacado="+LTRIM(aTitulos->CLIENTE)+ " / "+TRANS(aTitulos->ID_CLIENTE,"99999")+CRLF
      	cLinha += "Sacado.CNPJCPF="+LTRIM(aTitulos->CNPJCPF)+CRLF
      	cLinha += "Sacado.Pessoa="+aTitulos->pessoa+CRLF
      	cLinha += "Sacado.Logradouro="+LTRIM(aTitulos->ENDERECO)+CRLF
      	cLinha += "Sacado.Numero="+LTRIM(TRANSF(aTitulos->NRO,"99999"))+CRLF
      	cLinha += "Sacado.Bairro="+LTRIM(aTitulos->BAIRRO)+CRLF
      	cLinha += "Sacado.Complemento="+CRLF
      	cLinha += "Sacado.Cidade="+LTRIM(aTitulos->CIDADE)+CRLF
      	cLinha += "Sacado.UF="+LTRIM(aTitulos->ESTADO)+CRLF
      	cLinha += "Sacado.CEP="+LTRIM(TRANSF(aTitulos->CEP,"@r 99.999-999"))+CRLF
      	cLinha += "Sacado.Email="+LTRIM(aTitulos->EMAIL)+CRLF
      	cLinha += "Mensagem="+aTitulos->MENSAGEM+CRLF
      	cLinha += "Aceite="+LTRIM(aTitulos->ACEITE)+CRLF
      	cLinha += "OcorrenciaOriginal=0"+CRLF
      	cLinha += "Parcela=1"+CRLF
      	cLinha += "TotalParcelas=1"+CRLF
      	cLinha += "SeuNumero="+LTRIM(aTitulos->NOSSONUME)+CRLF+CRLF
      	
   		aTitulos->(DbSkip())
	END

	FWriteLine(cArquivo  , cLinha )
   FClose(cArquivo)

	RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////	
FUNCTION CriaTmpTitulo()
////////////////////////////////////////////////////////////////////////////////
LOCAL xxArq1    := {}

IF SELECT("aTitulos") <> 0
	CloseFile("aTitulos",.T.)
ENDIF	

aadd( xxArq1, { 'ID_CLIENTE', 'N',  5,  0 } )
aadd( xxArq1, { 'CLIENTE   ', 'C', 40,  0 } )
aadd( xxArq1, { 'FANTASIA  ', 'C', 20,  0 } )
aadd( xxArq1, { 'LOGRADOR  ', 'C',  3,  0 } )
aadd( xxArq1, { 'ENDERECO  ', 'C', 40,  0 } )
aadd( xxArq1, { 'NRO       ', 'N',  5,  0 } )
aadd( xxArq1, { 'CEP       ', 'C',  9,  0 } )
aadd( xxArq1, { 'BAIRRO    ', 'C', 15,  0 } )
aadd( xxArq1, { 'CIDADE    ', 'C', 60,  0 } )
aadd( xxArq1, { 'ESTADO    ', 'C',  2,  0 } )
aadd( xxArq1, { 'CNPJCPF   ', 'C', 20,  0 } )
aadd( xxArq1, { 'PESSOA    ', 'C',  1,  0 } ) //0 - Pessoa Física  1 - Pessoa Juridica
aadd( xxArq1, { 'EMAIL     ', 'C', 80,  0 } )

aadd( xxArq1, { 'NUMERODOC' , 'C', 20,  0 } ) //Numero Doc
aadd( xxArq1, { 'NOSSONUME' , 'C', 20,  0 } ) //Nosso Numero
aadd( xxArq1, { 'CARTEIRA'  , 'C', 03,  0 } ) //Carteira

aadd( xxArq1, { 'VALORDOC'  , 'N', 16,  2 } ) //Valor do Boleto
aadd( xxArq1, { 'VALMULTA'  , 'N', 16,  2 } ) //texto com o valor da multa
aadd( xxArq1, { 'VALJUROS'  , 'N', 16,  2 } ) //texto com o valor do juros
aadd( xxArq1, { 'VALDESCT'  , 'N', 16,  2 } ) //texto com o valor do desconto
aadd( xxArq1, { 'PERMULTA'  , 'N', 16,  2 } ) //Percendual de multa

aadd( xxArq1, { 'DTVCTO'    , 'D', 08,  0 } ) //Data Vencimento
aadd( xxArq1, { 'DTEMISSAO ', 'D', 08,  0 } ) //Data Emissao
aadd( xxArq1, { 'DTPROCESSA', 'D', 08,  0 } ) //Data Processamento
aadd( xxArq1, { 'DTABATIMEN', 'D', 08,  0 } ) //Data ABATIMENTO
aadd( xxArq1, { 'DTDESCONTO', 'D', 08,  0 } ) //Data Processamento
aadd( xxArq1, { 'DTPROTESTO', 'D', 08,  0 } ) //Data Protesto

aadd( xxArq1, { 'ESPECIE'   , 'C',  3,  0 } ) //Especie
aadd( xxArq1, { 'ACEITE'    , 'C',  1,  0 } ) //Aceite
aadd( xxArq1, { 'MOEDA'     , 'C',  2,  0 } ) //MOEDA
aadd( xxArq1, { 'MENSAGEM'  , 'C',300,  0 } ) //MENSAGEM

HB_DBCreateTemp("aTitulos",xxArq1,"DBFCDX")

RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////
FUNCTION ACBF_SHOW()
////////////////////////////////////////////////////////////////////////////////
LOCAL hWnd
   If ( hWnd := SeekACBR() ) == 0
   	If ( hWnd := SeekACBR() ) == 0
  	       BringWindowToTop( hWnd )
	       ShowWindow( hWnd, 8 ) //  SW_RESTORE )
   	ENDIF
   Else
       BringWindowToTop( hWnd )
       ShowWindow( hWnd, 8 ) //  SW_RESTORE )
   Endif
Return Nil
////////////////////////////////////////////////////////////////////////////////    
STATIC FUNCTION SeekACBR()
////////////////////////////////////////////////////////////////////////////////    

    LOCAL aCaptions := { 'ACBrMonitorPLUS', 'ACBrMonitor', 'ACBrMonitorPLUS','ACBrMonitorPLUS' }
    LOCAL nPos, hWnd
    For nPos = 1 to Len(aCaptions)
        If ( hWnd := FindWindow( 0, aCaptions[nPos] ) ) > 0
            Return hWnd
        EndIf
    Next
Return hWnd
////////////////////////////////////////////////////////////////////////////////    
FUNCTION ACBR_Imprimir_Boleto()
////////////////////////////////////////////////////////////////////////////////    

	ACBR_GravaCedente()
	
   ACBR_GravaTitulo()

  ** ACBF_SHOW()

	IF !ACBR_INIT("localhost:3434")
	    MsgStop("Erro de comunicação com o ACBR","ATENÇÃO !!!")
	ENDIF
	
   cCmd           := "bAltTab"
   **ACBR_BOL_Comando( "ACBr.Run", ["]+cCmd+["] )
   
   cCmd           := "ACBrMonitorPLUS"   
//	ACBR_BOL_Comando( "ACBr.AppActivate", ["]+cCmd+["] )
	
   cCmd           := ""
   //LIMPAR LISTA
   ACBR_BOL_Comando( "BOLETO.LimparLista", ["]+cCmd+["] )
    
   //CONFIGURAR CEDENTE
   cCmd       := "C:\ACBrMonitorPLUS\cedente.ini"
   ACBR_BOL_Comando( "BOLETO.ConfigurarDados", ["]+cCmd+["] )

	cCmd           := "%{TAB}" 
	ACBR_BOL_Comando( "ACBr.SendKeys", ["]+cCmd+["] )

   cArquivo         := "C:\ACBrMonitorPLUS\titulos.ini"
   
   cImprime         := "I" //IMPRIMIR 
   cImprime         := "E" //EMAIL
   cImprime         := "P" //PDF
   cImprime         := ""  
   IF Convenio->email
   	cImprime         := "E"  
   ENDIF	

   cCmd             := ["]+cArquivo+[","]+cImprime
   ACBR_BOL_Comando( "BOLETO.IncluirTitulos",cCmd+["]) 
             
   cCmd           := ""
   //ACBR_NFE_Comando( "BOLETO.GerarPDF", cCmd )
   ACBR_BOL_Comando( "BOLETO.Imprimir", cCmd )
   //ACBR_NFE_Comando( "BOLETO.GerarHTML", cCmd )
   
   //cCmd           := "bAltTab"
   //ACBR_BOL_Comando( "ACBr.Run", ["]+cCmd+["] )
   
//   cCmd           := "ACBrMonitor.exe"   
//	ACBR_BOL_Comando( "ACBr.AppExists", ["]+cCmd+["] )

	ACBR_END()
	
	RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////    
FUNCTION ACBR_Remessa_Boleto(nNroRemessa)
////////////////////////////////////////////////////////////////////////////////    
	ACBR_GravaCedente()
	
   ACBR_GravaTitulo()

	IF !ACBR_INIT("localhost:3434")
	    MsgStop("Erro de comunicação com o ACBR","ATENÇÃO !!!")
	ENDIF
	   
   cCmd           := ""
   //LIMPAR LISTA
   ACBR_BOL_Comando( "BOLETO.LimparLista", ["]+cCmd+["] )
    
   //CONFIGURAR CEDENTE
   cCmd       := "C:\ACBrMonitorPLUS\cedente.ini"
   ACBR_BOL_Comando( "BOLETO.ConfigurarDados", ["]+cCmd+["] )
				 
   cArquivo         := "C:\ACBrMonitorPLUS\titulos.ini"
   cImprime         := ""
   cCmd             := ["]+cArquivo+[","]+cImprime
   ACBR_BOL_Comando( "BOLETO.IncluirTitulos",cCmd+["]) 
   
   cCmd           := ""
   ACBR_BOL_Comando( "BOLETO.GerarRemessa","c:\remessa\",nNroRemessa,STRZERO(nNroRemessa,6)+".rem" )
	ACBR_END()
	
	RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////    
Function ACBR_Retorno_Boleto()  
////////////////////////////////////////////////////////////////////////////////
LOCAL nIDR      := 0
LOCAL nItem     := 0
LOCAL nValor    := 0
LOCAL aFiles    :=  cGetFile("Arquivos (*.ret) |*.RET|" ,"Selecione o Arquivo!")
LOCAL nLinhas   := 0
LOCAL nTotRec	 := 0
LOCAL cLinha    := ""
LOCAL aRetorno  := {}
LOCAL oTxt      
LOCAL nRat

fErase("C:\Retorno\Retorno.ini")

IF EMPTY(ALLTRIM(aFiles))
	MsgStop("ERRO na Abertura do Arquivo!","Atenção")
   RETURN(.T.)
ENDIF

IF !ACBR_INIT("localhost:3434")
   MsgStop("Erro de comunicação com o ACBR","ATENÇÃO !!!")
   RETURN(.T.)
ENDIF
	   
cCmd           := ""
ACBR_BOL_Comando( "BOLETO.LimparLista", ["]+cCmd+["] )

cFile := cFileName(aFiles)
nRat  := Rat( "\", aFiles )

SELECT RetLog
SET ORDE TO 2
RetLog->(DbSeek(cFile))

IF FOUND()
   MsgStop("Arquivo Retorno já foi processado!","ATENÇÃO !!!")
   SELECT RetLog
	ORDDESCEND(,, .T.) 
	RetLog->(DbGoTop())
   RETURN(.F.)
ENDIF

cPasta         := Subs( aFiles, 1, nRat )//"c:\retorno\"
cArquivo		   := cFile 
cCmd           := cPasta+[","]+cArquivo
ACBR_BOL_Comando( "BOLETO.LerRetorno", ["]+cCmd+["] )

ACBR_END()

SELECT ReTitulo
SET ORDE TO 2
SetMyFilter("1")

ReTitulo->(DbGoBottom())
ReTitulo->(DbSkip())
aRetorno  := ReTitulo->(InitData())

aFiles := "C:\Retorno\Retorno.ini"

IF !FILE(aFiles)
	MsgStop("ERRO na Abertura do Arquivo/Retorno!","Atenção")
   RETURN(.T.)
ENDIF

nIDR := PsqControle( Retorno->(dbf()) ) 

oTxt      := TTxtFile():New( ALLTRIM(aFiles) )
nLinhas   := oTxt:nTLines
nTotRec	 := oTxt:nTLines
oTxt:Gotop()    
 
FOR i = 1 TO nLinhas
   
     	cLinha := oTxt:cLine
   	
      IF 	 AT("Vencimento=", cLinha) <> 0
      		 aRetorno.ret_dtvcto  	 := CTOD(Subs(cLinha,12,10))
      ELSEIF AT("DataDocumento=", cLinha) <> 0	
				 //DataDocumento=30/12/1899 //2
				 //aRetorno.ret_dtvcto  := CTOD(Subs(cLinha,12,10))
		ELSEIF AT("NumeroDocumento=", cLinha) <> 0				
				 aRetorno.ret_numerodoc  := Subs(cLinha,17,10)
		ELSEIF AT("DataProcessamento=", cLinha) <> 0							
				 aRetorno.ret_data  		 := CTOD(Subs(cLinha,19,10))
		ELSEIF AT("NossoNumero=", cLinha) <> 0								
				 aRetorno.ret_nossonro   := Subs(cLinha,13,17)
		ELSEIF AT("ValorDocumento=", cLinha) <> 0											
				 aRetorno.ret_vltitulo   := ConverteCartValor(Subs(cLinha,15,15))
		ELSEIF AT("DataOcorrencia=", cLinha) <> 0														
			 	 aRetorno.ret_dtocorrenc := CTOD(Subs(cLinha,15,10))
		ELSEIF AT("DataCredito=", cLinha) <> 0																	
				 aRetorno.ret_dtcredito  := CTOD(Subs(cLinha,12,10))
		ELSEIF AT("ValorDespesaCobranca=", cLinha) <> 0																				
				 aRetorno.ret_vltaxa     := ConverteCartValor(Subs(cLinha,11,15))
		ELSEIF AT("ValorAbatimento=", cLinha) <> 0																							
				 //aRetorno.ret_vltitulo  := VAL(Subs(cLinha,16,15))
		ELSEIF AT("ValorDesconto=", cLinha) <> 0			
				 aRetorno.ret_vldesconto := ConverteCartValor(Subs(cLinha,15,15))
		ELSEIF AT("ValorMoraJuros=", cLinha) <> 0						
				 aRetorno.ret_vljuros := ConverteCartValor(Subs(cLinha,16,15))
		ELSEIF AT("ValorIOF=", cLinha) <> 0									
				 //ValorIOF=0      //13
		ELSEIF AT("ValorOutrasDespesas=", cLinha) <> 0												
				 //ValorOutrasDespesas=0 //14
		ELSEIF AT("ValorOutrosCreditos=", cLinha) <> 0															
				 aRetorno.ret_vlmulta := ConverteCartValor(Subs(cLinha,20,15))
		ELSEIF AT("ValorRecebido=", cLinha) <> 0																		
				 //ValorRecebido=237,61      //16
				 aRetorno.ret_vlpago := ConverteCartValor(Subs(cLinha,15,15))
		ELSEIF AT("DescricaoTipoOcorrencia=", cLinha) <> 0																					
		
				 aRetorno.ret_id_ocorren := Subs(cLinha,25,2)
				 aRetorno.ret_nm_ocorren := Subs(cLinha,28,50)				 
				 
				 IF VAL(aRetorno.ret_id_ocorren) = 6 .OR. VAL(aRetorno.ret_id_ocorren) = 17 //ver nos outros bancos se é esses mesmo codigos
				 
					 SELECT Receber
					 SET ORDE TO 10
				    Receber->(DbSeek(aRetorno.ret_nossonro))
			 
					 IF FOUND()
		   			 aRetorno.ret_id_cliente := Receber->id_cliente
						 aRetorno.ret_nm_cliente := Receber->nm_cliente
						 aRetorno.ret_vltitulo   := Receber->valor
						 aRetorno.ret_id_conta   := Receber->id_conta
						 nValor += Receber->valor
					 ELSE
		   			 aRetorno.ret_id_cliente := 99999
						 aRetorno.ret_nm_cliente := "CLIENTE SEM IDENTIFICACAO"
	   			 ENDIF
	   			 
	   			 nItem++
	   			 aRetorno.ret_id_retorno   := nIDR
	   			 aRetorno.ret_dt_retorno   := DATE()
	   			 aRetorno.ret_status       := "1"
	   			 
	       		 IF aRetorno.ret_id_cliente <> 99999 .AND. aRetorno.ret_vlpago <> 0
	         	    aRetorno.ret_seleciona:= .T.
	         	 ENDIF   
	         	 
	         	 SELECT ReTitulo
					 SET ORDE TO 2
	         	 IF ReTitulo->(AddRec(10))
	         	 	 ReTitulo->(ReplData(aRetorno))
	         	 	 ReTitulo->(FINALI())
	         	 ENDIF	 
	         	 
         	 ENDIF
         	 
				 ReTitulo->(DbGoBottom())
				 ReTitulo->(DbSkip())
				 aRetorno  := ReTitulo->(InitData())
         	 
		ENDIF
			
		oTxt:skip()
			
NEXT

/*Os códigos de movimento '06', '09' e '17' estão relacionados com a descrição C047-C. Domínio: 

'02' = Entrada Confirmada 
'03' = Entrada Rejeitada 
'04' = Transferência de Carteira/Entrada 
'05' = Transferência de Carteira/Baixa 
'06' = Liquidação 
'07' = Confirmação do Recebimento da Instrução de Desconto 
'08' = Confirmação do Recebimento do Cancelamento do Desconto 
'09' = Baixa 
'11' = Títulos em Carteira (Em Ser) 
'12' = Confirmação Recebimento Instrução de Abatimento 
'13' = Confirmação Recebimento Instrução de Cancelamento Abatimento 
'14' = Confirmação Recebimento Instrução Alteração de Vencimento 
'15' = Franco de Pagamento 
'17' = Liquidação Após Baixa ou Liquidação Título Não Registrado 
'19' = Confirmação Recebimento Instrução de Protesto 
'20' = Confirmação Recebimento Instrução de Sustação/Cancelamento de Protesto 
'23' = Remessa a Cartório (Aponte em Cartório) 
'24' = Retirada de Cartório e Manutenção em Carteira 
'25' = Protestado e Baixado (Baixa por Ter Sido Protestado) 
'26' = Instrução Rejeitada 
'27' = Confirmação do Pedido de Alteração de Outros Dados 
'28' = Débito de Tarifas/Custas */

SELECT RetLog
ORDDESCEND(,, .T.) 
RetLog->(DbGoTop())

SELECT ReTitulo
SET ORDE TO 2
ClearMyFilter()
SetMyFilter("1")

RETURN(.T.)
////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION ConverteCartValor(vValor)
////////////////////////////////////////////////////////////////////////////////
RETURN(VAL(STRTRAN(vValor,",",".")))
////////////////////////////////////////////////////////////////////////////////
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por HASA »

:D :)) :*
Esse é o cara.
Valeu Kapi,
:{
HASA
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por Kapiaba »

Qualquer coisa que faltar, chame o Dorneles(autor), se quiser o skype dele, me chame no skype porfa. abs.
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

ACBRMONITORPLUS TCP/IP

Mensagem por HASA »

:)Pos
Combinado.
:xau
HASA
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ACBRMONITORPLUS TCP/IP

Mensagem por fladimir »

A rotina funciona, só não sei como tratar qdo fica demorando o retorno do ACBr pra ele ficar aguardando, pq da tipo Timeout da conexão Socket... queria q ficasse tentando X tempo.

Exemplo em TXT mando aguardar o retorno até 5 min pq dependendo o tamanho do arquivo TXT de uma NFCe por exemplo demora mais tempo o retorno do componente...

Queria adotar a mesma metodologia, se bem q nem sei se a lógica seria igual.

Alguém sabe?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Responder