Clipper On Line • Ver Tópico - ACBRMONITORPLUS TCP/IP

ACBRMONITORPLUS TCP/IP

Discussão sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (ECF, TEF, SINTEGRA, NF-e, ECD, EFD, etc.)

Moderador: Moderadores

 

ACBRMONITORPLUS TCP/IP

Mensagempor HASA » 29 Mar 2017 18:01

- 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 de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1043
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 44 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor janio » 31 Mar 2017 10:54

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 de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1844
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 64 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor fladimir » 02 Abr 2017 08:50

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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2430
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 148 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor JoséQuintas » 02 Abr 2017 10:09

Não seria interessante via hbnetio?
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14658
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor fladimir » 02 Abr 2017 17:33

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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2430
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 148 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor JoséQuintas » 02 Abr 2017 18:28

É 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14658
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor fladimir » 02 Abr 2017 20:29

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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2430
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 148 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor HASA » 04 Abr 2017 11:37

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

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

HASA

:))
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1043
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 44 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor fladimir » 04 Abr 2017 11:53

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 de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2430
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 148 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor HASA » 04 Abr 2017 13:32

:))
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
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1043
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 44 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor Kapiaba » 05 Abr 2017 10:50

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

////////////////////////////////////////////////////////////////////////////////
//  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,",",".")))
////////////////////////////////////////////////////////////////////////////////
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1561
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 296 vezes
Mens.Curtidas: 100 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor HASA » 05 Abr 2017 11:07

:D :)) :*
Esse é o cara.
Valeu Kapi,
:{
HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1043
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 44 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor Kapiaba » 05 Abr 2017 11:45

Qualquer coisa que faltar, chame o Dorneles(autor), se quiser o skype dele, me chame no skype porfa. abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1561
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 296 vezes
Mens.Curtidas: 100 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor HASA » 05 Abr 2017 11:47

:)Pos
Combinado.
:xau
HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1043
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 44 vezes

ACBRMONITORPLUS TCP/IP

Mensagempor fladimir » 15 Dez 2017 11:52

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.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2430
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 148 vezes

Próximo



Retornar para Legislação Fiscal e Tributária

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro