Página 1 de 2

ACBRMONITORPLUS TCP/IP

Enviado: 29 Mar 2017 18:01
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

ACBRMONITORPLUS TCP/IP

Enviado: 31 Mar 2017 10:54
por janio
tbm quero!

acompanhando...

ACBRMONITORPLUS TCP/IP

Enviado: 02 Abr 2017 08:50
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?

ACBRMONITORPLUS TCP/IP

Enviado: 02 Abr 2017 10:09
por JoséQuintas
Não seria interessante via hbnetio?

ACBRMONITORPLUS TCP/IP

Enviado: 02 Abr 2017 17:33
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

ACBRMONITORPLUS TCP/IP

Enviado: 02 Abr 2017 18:28
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.

ACBRMONITORPLUS TCP/IP

Enviado: 02 Abr 2017 20:29
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

ACBRMONITORPLUS TCP/IP

Enviado: 04 Abr 2017 11:37
por HASA
- Pessoal acho que o Kapiaba deu a letra, vejam:

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

HASA

:))

ACBRMONITORPLUS TCP/IP

Enviado: 04 Abr 2017 11:53
por fladimir
Show de Bola... da pra usar ai para as outras funcionalidades...

ACBRMONITORPLUS TCP/IP

Enviado: 04 Abr 2017 13:32
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

ACBRMONITORPLUS TCP/IP

Enviado: 05 Abr 2017 10:50
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,",",".")))
////////////////////////////////////////////////////////////////////////////////

ACBRMONITORPLUS TCP/IP

Enviado: 05 Abr 2017 11:07
por HASA
:D :)) :*
Esse é o cara.
Valeu Kapi,
:{
HASA

ACBRMONITORPLUS TCP/IP

Enviado: 05 Abr 2017 11:45
por Kapiaba
Qualquer coisa que faltar, chame o Dorneles(autor), se quiser o skype dele, me chame no skype porfa. abs.

ACBRMONITORPLUS TCP/IP

Enviado: 05 Abr 2017 11:47
por HASA
:)Pos
Combinado.
:xau
HASA

ACBRMONITORPLUS TCP/IP

Enviado: 15 Dez 2017 12:52
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?