Clipper On Line • Ver Tópico - MRBoleto pronto para o uso.
Página 1 de 5

MRBoleto pronto para o uso.

MensagemEnviado: 27 Nov 2012 20:15
por rochinha
Amiguinhos,

em minha xeretagem usando a MRBoleto, consegui criar um executável que roda em linha de comando recebendo dados via arquivos .INI.

Bastará à aqueles que não conseguirem compilá-lo(por enquanto) preencher o arquivo .INI e executar o DemoUm.exe

Para não chocar os sources com o original usei outros nomes.

Compilei usando a versão Borland de binários do Harbour build harbour-3.2-17431.

O .BAT deve apontar somente para a pasta onde estiver o Harbour:
DemoUm.bat
@ECHO OFF

SET hbversao=harbour-3.2-17431
SET HBDIR=
SET HBDIR=%caminho%\%hbversao%
SET pathOLD=%PATH%
SET path=%PATH%;%HBDIR%\BIN
SET BCDIR=d:\develop\bcc55

HARBOUR -build
DEL DemoUm.Exe
HBMK2 DemoUm.hbp
DemoUm.exe

SET PATH=%pathOLD%


.HBP Modificado para compilar somente o exemplo:
DemoUm.hbp
-w3

-es2

-gtwvg

-gui

hbhpdf.hbc
hbzebra.hbc

-oDemoUm.exe

DemoUm.prg
MRboleto.prg


Codigo fonte resumido:
DemoUm.prg
#include "inkey.ch"
#include "hbgtinfo.ch"

Procedure Main

   Local oBoleto, oIni
   Local cFilePdf := 'DemoUm.PDF'

   F_Set_Desktop()

   oBoleto  := MR_Boleto():New( cFilePdf )

   oIni = TIniFile():New( "DemoUm.ini" )

   oBoleto:Banco________ :=                oIni:ReadString( "MRBOLETO", "Banco________", "001" )
   oBoleto:Banco_Agencia :=                oIni:ReadString( "MRBOLETO", "Banco_Agencia", "3482" )
   oBoleto:Banco_Ag_Dv__ :=                oIni:ReadString( "MRBOLETO", "Banco_Ag_Dv__", "07" )
   oBoleto:Banco_Ag_Un_A :=                oIni:ReadString( "MRBOLETO", "Banco_Ag_Un_A", "" )
   oBoleto:Conta________ :=                oIni:ReadString( "MRBOLETO", "Conta________", "90090" )
   oBoleto:Conta_DV_____ :=                oIni:ReadString( "MRBOLETO", "Conta_DV_____", "7" )
   oBoleto:Conta_OP_____ :=                oIni:ReadString( "MRBOLETO", "Conta_OP_____", "" )
   oBoleto:Carteira_____ :=                oIni:ReadString( "MRBOLETO", "Carteira_____", "18" )
   oBoleto:Carteira_Tipo :=                oIni:ReadString( "MRBOLETO", "Carteira_Tipo", "" )
   oBoleto:NossoNumero__ :=                oIni:ReadString( "MRBOLETO", "NossoNumero__", "62160101" )
   oBoleto:Doc_Origem___ :=                oIni:ReadString( "MRBOLETO", "Doc_Origem___", "NFe" )
   oBoleto:Prefixo______ :=                oIni:ReadString( "MRBOLETO", "Prefixo______", "153454" )
   oBoleto:Prefixo_DV___ :=                oIni:ReadString( "MRBOLETO", "Prefixo_DV___", "9" )
   oBoleto:Doc_Numero___ :=                oIni:ReadString( "MRBOLETO", "Doc_Numero___", "00001234" )
   oBoleto:Doc_Aceite___ :=                oIni:ReadString( "MRBOLETO", "Doc_Aceite___", "N" )
   oBoleto:Doc_Especie__ :=                oIni:ReadString( "MRBOLETO", "Doc_Especie__", "R$" )
   oBoleto:Doc_Data_____ :=                oIni:ReadDate( "MRBOLETO", "Doc_Data_____", date() )
   oBoleto:Vencimento___ :=                oIni:ReadDate( "MRBOLETO", "Vencimento___", date()+29 )
   oBoleto:Valor________ :=                oIni:ReadNumber( "MRBOLETO", "Valor________", ( 13.37 * 1 ) )
   oBoleto:Multa_Auto___ :=                oIni:ReadNumber( "MRBOLETO", "Multa_Auto___", 2 )
   oBoleto:Juros_Mes____ :=                oIni:ReadNumber( "MRBOLETO", "Juros_Mes____", 2 )
   oBoleto:Numero_Vias__ :=                oIni:ReadNumber( "MRBOLETO", "Numero_Vias__", 2 )
   oBoleto:Local_Pagamen :=                oIni:ReadString( "MRBOLETO", "Local_Pagamen", "Pague em qualquer banco até o limite da data de vencimento" )
   oBoleto:Instrucoes___ := StringToArray( oIni:ReadString( "MRBOLETO", "Instrucoes___", "Desconto de 5% se pago até o dia "+Transf( Date()+10, "@E 999" )+"|Não receber após 30 dias da data de vencimento" ), "|" )
   oBoleto:Demonstrativo := StringToArray( oIni:ReadString( "MRBOLETO", "Demonstrativo", "Vetor: pode a exemplo ser utilizado para se demonstrar o rateio de despesas para condominios||Utiliza Fonte com espaçamento de tamanho fixo ( Courier ), o que permite geração de demostrativos financeiros flexiveis.||O limite é sua criatividade :)||Exiba detalhes importantes para o usuario||Valores em cobrança||Contratos||Informações úteis||Etc..." ), "|" )
   oBoleto:Cedente______ := StringToArray( oIni:ReadString( "MRBOLETO", "Cedente______", "Cedente: CNPJ|Cedente: Nome|Cedente: Endereço ( Opcional )" ), "|" )
   oBoleto:Sacado_______ := StringToArray( oIni:ReadString( "MRBOLETO", "Sacado_______", "Sacado: CNPJ|Sacado: Nome|Sacado: Endereço Completo" ), "|" )
   oBoleto:Avalista_____ := StringToArray( oIni:ReadString( "MRBOLETO", "Avalista_____", "Avalista: CNPJ|Avalista: Nome|Avalista: Endereço ( Opcional )" ), "|" )

   oBoleto:AddPage()

   oBoleto:Finish()
   
   IF FILE( cFilePdf )

      hb_Run("Explorer.exe " + cFilePdf )

   ELSE

      ALERT( 'ERRO NA GERACAO DO ARQUIVO...;;' + cFilePdf )

   ENDIF

Return

//*----------------------------------------------------------------------------*
// F_Set_Desktop()
//*----------------------------------------------------------------------------*
PROCEDURE F_Set_Desktop()

   REQUEST HB_LANG_PT
   REQUEST HB_CODEPAGE_PT850

   REQUEST HB_GT_WVG_DEFAULT
   REQUEST HB_GT_WVT
   REQUEST HB_GT_WIN

   *---------------------------------------------------------------------------*
   * ANO COM 04 DIGITOS
   *---------------------------------------------------------------------------*
   SET CENTURY ON

   *---------------------------------------------------------------------------*
   * DATAS: -50 DATA ATUAL + 50
   *---------------------------------------------------------------------------*
   SET EPOCH TO YEAR( DATE() ) - 50

   SETMODE( 33, 112 )

   SetColor( 'N/W' )

   CLS

   hb_langSelect( hb_UserLang(), "PT850" ) // .OR. HB_LANGSELECT( 'pt-BR', "PT850" )
   hb_cdpSelect( "PT850" )

   Set ( _SET_SCOREBOARD, .F. )
   Set ( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )

   *---------------------------------------------------------------------------*
   // CONFIGURAÇÕES REGIONAIS / VIDEO
   *---------------------------------------------------------------------------*
   hb_gtInfo( HB_GTI_CLIPBOARDDATA )
   hb_gtInfo( HB_GTI_SELECTCOPY, .T. )
   hb_gtInfo( HB_GTI_MOUSESTATUS, 1 )
   hb_gtInfo( HB_GTI_MAXIMIZED, .F. )
   hb_gtInfo( HB_GTI_CLOSABLE, .T. )
   hb_gtInfo( HB_GTI_ISGRAPHIC, .T. )
   hb_gtInfo( HB_GTI_STDERRCON, .T. )

RETURN

Function Random( nMaximo )
   static nRandom
   local nTemporal
   nMaximo = if( nMaximo == NIL, 65535, nMaximo )
   if nRandom == NIL
      nRandom = seconds()
   endif
   nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
   nTemporal = if( nTemporal < 1, 1, nTemporal )
   nRandom = nTemporal + seconds()
   RETURN int( nTemporal )

function StringToArray( cString, cSeparator )
   LOCAL nPos
   LOCAL aString := {}
   cSeparator := iif(cSeparator=nil,";",cSeparator)
   cString := ALLTRIM( cString ) + cSeparator
   DO WHILE .T.
      nPos := AT( cSeparator, cString )
      IF nPos = 0
         EXIT
      ENDIF
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) )
      cString := SUBSTR( cString, nPos+1 )
   ENDDO
   RETURN ( aString )

function fun()
   return .t.
   
#include "inifiles.prg"


Exemplo do .INI que sua aplicação deverá gerar e passar para o DemoUm.exe:
DemoUm.ini
[MRBOLETO]
Banco________=001
Banco_Agencia=3482
Banco_Ag_Dv__=07
Banco_Ag_Un_A=
Conta________=90090
Conta_DV_____=7
Conta_OP_____=
Carteira_____=18
Carteira_Tipo=
NossoNumero__=62160101
Doc_Origem___=NFe
Prefixo______=153454
Prefixo_DV___=9
Doc_Numero___=00001234
Doc_Aceite___=N
Doc_Especie__=R$
Doc_Data_____=20121127
Vencimento___=20121226
Valor________=13.37
Multa_Auto___=2
Juros_Mes____=2
Numero_Vias__=2
Local_Pagamen=Pague em qualquer banco até o limite da data de vencimento
Instrucoes___=Desconto de 5% se pago até o dia 07/12/2012|Não receber após 30 dias da data de vencimento
Demonstrativo=Vetor: pode a exemplo ser utilizado para se demonstrar o rateio de despesas para condominios||Utiliza Fonte com espaçamento de tamanho fixo ( Courier ), o que permite geração de demostrativos financeiros flexiveis.||O limite é sua criatividade :)||Exiba detalhes importantes para o usuario||Valores em cobrança||Contratos||Informações úteis||Etc...
Cedente______=Cedente: CNPJ|Cedente: Nome|Cedente: Endereço ( Opcional )
Sacado_______=Sacado: CNPJ|Sacado: Nome|Sacado: Endereço Completo
Avalista_____=Avalista: CNPJ|Avalista: Nome|Avalista: Endereço ( Opcional )


Vejam nas ultimas linhas que existe um caracter separador de parágrafos, "|" que será traduzido pela função StringToArray() para um elemento de um vetor.

Arquivo necessário para dar a característica de leitura de arquivo de parâmetros:
inifiles.prg
//
// $Id: inifiles.prg,v 1.1 2007/08/02 00:51:33 masturm Exp $
//
#define CRLF (Chr(13) + Chr(10))

function TIniFile()
   static oClass

   if oClass == nil
      oClass := HBClass():New( 'TINIFILE' ) // starts a new class definition

      oClass:AddData( 'FileName' )           // define this class objects datas
      oClass:AddData( 'Contents' )

      oClass:AddMethod( 'New',  @New() )  // define this class objects methods
      oClass:AddMethod( 'ReadString', @ReadString() )
      oClass:AddMethod( 'WriteString', @WriteString() )
      oClass:AddMethod( 'ReadNumber', @ReadNumber() )
      oClass:AddMethod( 'WriteNumber', @WriteNumber() )
      oClass:AddMethod( 'ReadDate', @ReadDate() )
      oClass:AddMethod( 'WriteDate', @WriteDate() )
      oClass:AddMethod( 'ReadBool', @ReadBool() )
      oClass:AddMethod( 'WriteBool', @WriteBool() )
      oClass:AddMethod( 'ReadSection', @ReadSection() )
      oClass:AddMethod( 'ReadSections', @ReadSections() )
      oClass:AddMethod( 'DeleteKey', @DeleteKey() )
      oClass:AddMethod( 'EraseSection', @EraseSection() )
      oClass:AddMethod( 'UpdateFile', @UpdateFile() )

      oClass:Create()                     // builds this class
   endif

return oClass:Instance()                  // builds an object of this class

static function New(cFileName)
   local Self := QSelf()
   local Done, hFile, cFile, cLine, cIdent, nPos
   local CurrArray

   if empty(cFileName)
      // raise an error?
      outerr('No filename passed to TIniFile():New()')
      return nil

   else
      ::FileName := cFilename
      ::Contents := {}
      CurrArray := ::Contents

      if File(cFileName)
         hFile := fopen(cFilename, 0)

      else
         hFile := fcreate(cFilename)
      endif

      cLine := ''
      Done := .f.
      while !Done
         cFile := space(256)
         Done := (fread(hFile, @cFile, 256) <= 0)

         cFile := strtran(cFile, chr(10), '') // so we can just search for CHR(13)

         // prepend last read
         cFile := cLine + cFile
         while !empty(cFile)
            if (nPos := at(chr(13), cFile)) > 0
               cLine := left(cFile, nPos - 1)
               cFile := substr(cFile, nPos + 1)

               if !empty(cLine)
                  if Left(cLine, 1) == '[' // new section
                     if (nPos := At(']', cLine)) > 1
                        cLine := substr(cLine, 2, nPos - 2);

                     else
                        cLine := substr(cLine, 2)
                     endif

                     AAdd(::Contents, { cLine, { /* this will be CurrArray */ } } )
                     CurrArray := ::Contents[Len(::Contents)][2]

                  elseif Left(cLine, 1) == ';' // preserve comments
                     AAdd( CurrArray, { NIL, cLine } )

                  else
                     if (nPos := At('=', cLine)) > 0
                        cIdent := Left(cLine, nPos - 1)
                        cLine := SubStr(cLine, nPos + 1)

                        AAdd( CurrArray, { cIdent, cLine } )

                     else
                        AAdd( CurrArray, { cLine, '' } )
                     endif
                  endif
                  cLine := '' // to stop prepend later on
               endif

            else
               cLine := cFile
               cFile := ''
            endif
         end
      end

      fclose(hFile)
   endif
return Self

static function ReadString(cSection, cIdent, cDefault)
   local Self := QSelf()
   local cResult := cDefault
   local i, j, cFind

   if Empty(cSection)
      cFind := lower(cIdent)
      j := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind .and. ValType(x[2]) == 'C'} )

      if j > 0
          cResult := ::Contents[j][2]
      endif

   else
      cFind := lower(cSection)
      i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind} )

      if i > 0
         cFind := lower(cIdent)
         j := AScan( ::Contents[i][2], {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind} )

         if j > 0
            cResult := ::Contents[i][2][j][2]
         endif
      endif
   endif
return cResult

static procedure WriteString(cSection, cIdent, cString)
   local Self := QSelf()
   local i, j, cFind

   if Empty(cIdent)
      outerr('Must specify an identifier')

   elseif Empty(cSection)
      cFind := lower(cIdent)
      j := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind .and. ValType(x[2]) == 'C'} )

      if j > 0
         ::Contents[j][2] := cString

      else
         AAdd(::Contents, nil)
         AIns(::Contents, 1)
         ::Contents[1] := {cIdent, cString}
      endif

   else
      cFind := lower(cSection)
      if (i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind .and. ValType(x[2]) == 'A'})) > 0
         cFind := lower(cIdent)
         j := AScan( ::Contents[i][2], {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cFind} )

         if j > 0
            ::Contents[i][2][j][2] := cString

         else
            AAdd( ::Contents[i][2], {cIdent, cString} )
         endif

      else
         AAdd( ::Contents, {cSection, {{cIdent, cString}}} )
      endif
   endif
return

static function ReadNumber(cSection, cIdent, nDefault)
   local Self := QSelf()
return Val( ::ReadString(cSection, cIdent, str(nDefault)) )

static procedure WriteNumber(cSection, cIdent, nNumber)
   local Self := QSelf()

   ::WriteString( cSection, cIdent, alltrim(str(nNumber)) )
return

static function ReadDate(cSection, cIdent, dDefault)
   local Self := QSelf()
return SToD( ::ReadString(cSection, cIdent, DToS(dDefault)) )

static procedure WriteDate(cSection, cIdent, dDate)
   local Self := QSelf()

   ::WriteString( cSection, cIdent, DToS(dDate) )
return

static function ReadBool(cSection, cIdent, lDefault)
   local Self := QSelf()
   local cDefault := Iif( lDefault, '.t.', '.f.' )

return ::ReadString(cSection, cIdent, cDefault) == '.t.'

static procedure WriteBool(cSection, cIdent, lBool)
   local Self := QSelf()

   ::WriteString( cSection, cIdent, Iif(lBool, '.t.', '.f.') )
return

static procedure DeleteKey(cSection, cIdent)
   local Self := QSelf()
   local i, j

   cSection := lower(cSection)
   i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cSection} )
   
   if i > 0
      cIdent := lower(cIdent)
      j := AScan( ::Contents[i][2], {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cIdent} )

      ADel( ::Contents[i][2], j )
      ASize( ::Contents[i][2], Len(::Contents[i][2]) - 1 )
   endif
return

static procedure EraseSection(cSection)
   local Self := QSelf()
   local i

   if Empty(cSection)
      while (i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. ValType(x[2]) == 'C'})) > 0
         ADel( ::Contents, i )
         ASize( ::Contents, len(::Contents) - 1 )
      end

   else
      cSection := lower(cSection)
      if (i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. lower(x[1]) == cSection .and. ValType(x[2]) == 'A'})) > 0
         ADel( ::Contents, i )
         ASize( ::Contents, Len(::Contents) - 1 )
      endif
   endif
return

static function ReadSection(cSection)
   local Self := QSelf()
   local i, j, aSection := {}

   if Empty(cSection)
      for i := 1 to len(::Contents)
         if valtype(::Contents[i][1]) == 'C' .and. valtype(::Contents[i][2]) == 'C'
            aadd(aSection, ::Contents[i][1])
         endif
      next

   else
      cSection := lower(cSection)
      if (i := AScan( ::Contents, {|x| valtype(x[1]) == 'C' .and. x[1] == cSection .and. ValType(x[2]) == 'A'})) > 0

         for j := 1 to Len(::Contents[i][2])

            if ::Contents[i][2][j][1] <> NIL
               AAdd(aSection, ::Contents[i][2][j][1])
            endif
         next
      endif
   endif
return aSection

static function ReadSections()
   local Self := QSelf()
   local i, aSections := {}

   for i := 1 to Len(::Contents)

      if ValType(::Contents[i][2]) == 'A'
         AAdd(aSections, ::Contents[i][1])
      endif
   next
return aSections

static procedure UpdateFile()
   local Self := QSelf()
   local i, j, hFile

   hFile := fcreate(::Filename)

   for i := 1 to Len(::Contents)
      if ::Contents[i][1] == NIL
         fwrite(hFile, ::Contents[i][2] + Chr(13) + Chr(10))

      elseif ValType(::Contents[i][2]) == 'A'
         fwrite(hFile, '[' + ::Contents[i][1] + ']' + Chr(13) + Chr(10))
         for j := 1 to Len(::Contents[i][2])

            if ::Contents[i][2][j][1] == NIL
               fwrite(hFile, ::Contents[i][2][j][2] + Chr(13) + Chr(10))

            else
               fwrite(hFile, ::Contents[i][2][j][1] + '=' + ::Contents[i][2][j][2] + Chr(13) + Chr(10))
            endif
         next
         fwrite(hFile, Chr(13) + Chr(10))

      elseif ValType(::Contents[i][2]) == 'C'
         fwrite(hFile, ::Contents[i][1] + '=' + ::Contents[i][2] + Chr(13) + Chr(10))

      endif
   next
   fclose(hFile)
return


.CH necessário ao Harbour pois não estava no conjunto:
harupdf.ch
Dentro do download abaixo.


.CH necessário ao Harbour pois não estava no conjunto:
hbzebra.ch
Dentro do download abaixo.


Resumindo, o aplicativo não fica muito pequeno, mas já é uma mão na roda para quem ainda não trocou o Harbour somente pela característica de um projeto.

Ás vezes ficamos sem aproveitar muitos projetos devida a grande dificuldade de adaptá-los às várias versões de uso.

Faça o download

Extras:

hbZebra.lib
HaruPDF.rar

MRBoleto pronto para o uso.

MensagemEnviado: 02 Abr 2013 13:37
por RamonXHB
Boa tarde !
Estou tentando compilar este MRboleto com o Harbour da minigui e Borland BCC, usando a XDEV
Mas dá muitos erros, alguem teria a versão mais atualizada do harbour pro Borland BCC ???

MRBoleto pronto para o uso.

MensagemEnviado: 02 Abr 2013 22:09
por rochinha
Amiguinho,

Eu teste e tive bons resultados com a versão 3.2.0 revisão 17431 para Borland

Harbour 3.2.0 revisão 17431 para Borland

MRBoleto pronto para o uso.

MensagemEnviado: 04 Abr 2013 17:12
por Paulo Pereira
Oi,
Estou procurando um emissor de boleto, nao quero ficar inventado a roda..
tentei o hboleto. mas estou com dificuldades.

Show de bola esse esse MRBOLETO gerar em PDF..
e consegui compilar.. !!!

1-Se eu quiser gerar direto para impressora
uma sequencia de 10 boletos por exemplo ? como fazer ?

2-Outra coisa, aquela parte de cima com 37 linhas é muito grande
teria problema se fossem impressas só as que tem conteudo ?
e sem a numeracao no 01, 02..

3-O HBoleto , tem um formato, mais classico, o Recibo do sacado em cima
e 2 boletos iguais em baixo.. a sua opca é valida ?

Obrigado

MRBoleto pronto para o uso.

MensagemEnviado: 04 Abr 2013 21:41
por rochinha
Amiguinho,

Não sei se dá pra comparar o hbBoleto e o MrBoleto. As duas ferramentas são muito boas e cumprem o prometido por cada uma. Se voce fizer um bom uso nãos as terá como concorrentes e sim como parceiros diários.

No meu caso eu consigo compilar NetIO mas não cosigo LetoDB, consigo compilar MrBoleto, mas não consigo compilar hbBoleto.

1-Se eu quiser gerar direto para impressora
uma sequencia de 10 boletos por exemplo ? como fazer ?


Se voce compilar monte um laço com o trecho que usa a classe MrBoleto, caso queira usar o executável, gere o .INI com os dados do boleto, salve-o e execute o DemoUm.exe.

2-Outra coisa, aquela parte de cima com 37 linhas é muito grande
teria problema se fossem impressas só as que tem conteudo ?
e sem a numeracao no 01, 02..


???, não entendi, seja mais explicito.

3-O HBoleto , tem um formato, mais classico, o Recibo do sacado em cima
e 2 boletos iguais em baixo.. a sua opca é valida ?


As duas opções são usadas por vários usuários e depende de quais bancos se necessitam e qual delas tem o desejado.

Os boletos após gerados devem ser levados ao banco para teste de pagamento.

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2013 00:53
por Paulo Pereira
Outra coisa, aquela parte de cima com 37 linhas é muito grande

é a parte do recibo do sacado, que vem antes o boleto. tem 37 linhas.. em outros que vi nao sao assim..

Se voce compilar monte um laço com o trecho que usa a classe MrBoleto, caso queira usar o executável, gere o .INI com os dados do boleto, salve-o e execute o DemoUm.exe.

Sim mas nesse caso, vai gerar o pdf e pedir para o usuario imprimir cada um(nao é ?)
Pergunto se nao da para gerar o PDF, sem mostrar o prevew e mandar o pdf gerado direto para impressora..

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2013 11:52
por billy1943
No meu sistema (em Clipper), faço o seguinte:

1. escolho os títulos que terão os boletos impressos e guardo suas variáveis em um .DBF a partir dos arquivos de clientes, créditos, etc.
2. escolho o cedente bancário para obter a sequencia de nosso número, contas, etc.
3. gravo as informações em formato do boleto em arquivo .RTF
4. abre-se automaticamente o Word para ver o preview de todos os boletos em formato de impressão
5. basta solicitar a impressão de todos eles, de uma só vez

O layout do meu boleto tem três partes:
a) recibo de entrega com todas as informações possíveis sobre o título para servir de controle até à baixa do título, feita pelo
retorno bancário, inclusive contendo o código digitável e o código de barras em formato reduzido

b) recibo do sacado - destina-se ao controle do cliente devedor

c) ficha de compensação - controle do agente recebedor

A parte mais complicada é a geração do arquivo em .RTF pois tudo deve ser passado para este modelo, inclusive os logotipos
bancários, em formato binário.

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2013 14:05
por Paulo Pereira
E vc faz o boleto na unha ? , ou usa o HBoleto ou MRBoleto ?

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2013 23:18
por rochinha
Amiguinhos,

E vc faz o boleto na unha ?...


Isto é pros fracos. O billy1943 faz é na cuticula.

MRBoleto pronto para o uso.

MensagemEnviado: 25 Abr 2013 14:42
por executiva_rpr
Boa tarde colegas,

Estou tentando compilar o MRBoleto.prg com o HMG 3.0.35 e ocorre erro na linha 171 sendo erro de sintaxe no seguinte comando Method Draw_Zebra( ... ). Alguém pode nos auxiliar?

Testamos o hbboleto porém o banco HSBC não aprovou a leitura do código de barras.

Obrigada !

At. Rosana.

MRBoleto pronto para o uso.

MensagemEnviado: 26 Abr 2013 18:43
por rochinha
Amiguinho,

Caso o seu Harbour não aceite funções com parâmetros invisiveis ou desconhecidos, faça assim:
Function teste( ... )


Function teste( a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z )


Programação Orientada a Gambiarra.

MRBoleto pronto para o uso.

MensagemEnviado: 27 Abr 2013 09:20
por billy1943
Respondendo ao Paulo Pereira e já desculpando-me pelo atraso, informo:

- desenha-se pelo Word o boleto padrão;
- ao invés de gravar em formato .DOC grava-se em formato .RTF
- esse .RTF gerado pelo Word, com todas as suas células de dados preenchidas com valores exemplos para melhor localização servirá como entrada ou fonte, dentro do programa em Clipper;
- depura-se o .RTF gravado, decompondo-o em 3 partes (comprovante de entrega, recibo e ficha de compensação) pelos valores exemplos, que serão substituídos pelos dados do sacado, do título, etc. pois ele já vem com tudo o que será impresso em termos de cercaduras, mensagens, etc.
- para o código de barras usa-se o fonte Interleaved20f5 para substituir os dígitos que o compõe;
- no mais o .RTF é puro texto e a rotina em Clipper precisa apenas gerar a impressão;
- abra um .RTF com um editor de texto qualquer e verá o que afirmo

Alerto porém que é bem trabalhoso o processo, devido ao fato de que dentro do .RTF gerado pelo Word, alguns trechos estão em binário, no caso, os logotipos, mas o resultado compensa pois a impressão é muito boa, rápida, e na hora de imprimirmos o(s) boletos, mandamos o Word se virar com ele, pois como diz o ditado "Quem o pariu, que o cuide..."

MRBoleto pronto para o uso.

MensagemEnviado: 27 Abr 2013 13:45
por lugab
Rochinha, bom dia.

Vc pode atualizar o link so seu primeiro post ? O atual está quebrado

MRBoleto pronto para o uso.

MensagemEnviado: 28 Abr 2013 00:46
por rochinha
Amiguinhos,

Link de download revitalizado!

MRBoleto pronto para o uso.

MensagemEnviado: 30 Abr 2013 17:42
por executiva_rpr
Boa tarde Rochinha,

Agradecemos pela ajuda !

Com seu auxílio conseguimos avançar na compilação, porém esta ocorrendo os seguintes erros:
Error: Unresolved external '_HB_FUN_HB_ZEBRA_CREATE_ITF' referenced from D:\SISTEMA\OBJ\MRBOLETO.OBJ
Error: Unresolved external '_HB_FUN_HB_ZEBRA_GETERROR' referenced from D:\SISTEMA\OBJ\MRBOLETO.OBJ
Error: Unresolved external '_HB_FUN_HB_ZEBRA_DESTROY' referenced from D:\SISTEMA\OBJ\MRBOLETO.OBJ
Error: Unresolved external '_HB_FUN_HB_ZEBRA_DRAW' referenced from D:\SISTEMA\OBJ\MRBOLETO.OBJ
Error: Unresolved external '_HB_FUN_HB_RUN' referenced from D:\SISTEMA\OBJ\PROGRAMA.OBJ

Colegas, alguém pode nos informar onde encontramos estas funções ?

Obrigada !

MRBoleto pronto para o uso.

MensagemEnviado: 30 Abr 2013 22:30
por rochinha
Amiguinho,

Seu link esta chamando a hbzebra.lib ou hbzebra.o?

MRBoleto pronto para o uso.

MensagemEnviado: 02 Mai 2013 17:54
por executiva_rpr
Boa tarde,

Onde posso encontrar a hbzebra.lib ?

MRBoleto pronto para o uso.

MensagemEnviado: 03 Mai 2013 02:42
por rochinha
Amiguinhos,

Olhe novamente no primeiro post deste tópico. Acrescentei os links necessários.

MRBoleto pronto para o uso.

MensagemEnviado: 03 Mai 2013 16:32
por JoséQuintas
Não entendo porque a classe usa nomes como banco___________________
Variável de classe é só dela, não vai conflitar com nada de nenhum sistema.
Deveria ter sido usado cBanco ou nBanco.

MRBoleto pronto para o uso.

MensagemEnviado: 11 Mai 2013 16:38
por Paulo Pereira
Estou começando a usar.. compilei ok, achei show gerar em PDF,

Mas no homologacao banco do Brasil deu problema:

Porque para carteiras que nao sao a 16 e 18. sao colocados zeros a esquerda 00000017 ?
Dessa forma a variaval campo livre fica com mais de 25 posicoes,
e quando vai fazer a linha digitavel, vai pegar zeros na posicao da carteira.
aAux[ 3 ] := SubStr( ::Campo_Livre__, 16, 10 )

Tirei e vou tentar homologar...



Method Banco_001() Class MR_Boleto

   ::Banco_Dv_____ := "9"
   ::Banco_Nome___ := "Banco do Brasil"

   ::Prefixo______ := PADL( ALLTRIM( Left( ::Prefixo______, 6 ) ), 6, '0' )
   ::Prefixo_DV___ := PADL( ALLTRIM( Left( ::Prefixo_DV___, 1 ) ), 1, '0' )

   IF Left( ::Carteira_____, 2 ) $ "16|18|SR"

      ::Carteira_____ := PADL( ALLTRIM( Left( ::Carteira_____, 2 ) ), 2, '0' )

      ::Conta________ := PADL( ALLTRIM( Left( ::Conta________, 8 ) ), 8, '0' )

      ::NossoNumero__ := ::Prefixo______ + ::Prefixo_DV___+ PADL( ALLTRIM( Left( ::NossoNumero__, 10 ) ), 10, '0' )
      ::NossoNumer_DV := ::DC_Mod11( ::Banco________, 9, .F. , ::NossoNumero__, .F. )

      ::NossoNumero_z := ::NossoNumero__ + '-' + ::NossoNumer_DV

           //*-----------------------------------------------------------------*
           // Indicacao do NN com 17 Posicoes Livres
           //*-----------------------------------------------------------------*
      ::Campo_Livre__:= REPL( '0', 6 ) + ::NossoNumero__ + ::Carteira_____

   ELSE

      // ::Carteira_____ := PADL( ALLTRIM( Left( ::Carteira_____, 2 ) ), 8, '0' )   ???

      ::Carteira_____ := PADL( ALLTRIM( Left( ::Carteira_____, 2 ) ), 2, '0' )

      ::Conta________ := PADL( ALLTRIM( Left( ::Conta________, 8 ) ), 8, '0' )

      ::NossoNumero__ := ::Prefixo______ + PADL( ALLTRIM( Left( ::NossoNumero__, 5 ) ), 5, '0' )
      ::NossoNumer_DV := ::DC_Mod11( ::Banco________, 9, .F., ::NossoNumero__, .F. )

      ::NossoNumero_z := Tran( ::NossoNumero__, "@R 99.999.999.999" ) + "-" + ::NossoNumer_DV
      ::Campo_Livre__:= ::NossoNumero__ + ::Banco_Agencia + ::Conta________ + ::Carteira_____

   ENDIF


MRBoleto pronto para o uso.

MensagemEnviado: 21 Mai 2013 12:47
por Paulo Pereira
ok
foi validado no Banco do Brasil, tirando os zeros da cateira..17
Tb foi passado que o endereco do cedente é obrigatorio

MRBoleto pronto para o uso.

MensagemEnviado: 30 Dez 2013 23:41
por JAIR PINHO
Ola pessoal estou trabalhando nesta classe para homologar na caixa econômica federal. gostaria de saber o que houve com o tópico MR-Boleto onde baixei os códigos fontes.

Desenvolvi em HMG -IDE criei um formulário para entrada de dados e escolha do banco depois gerar o boleto

MRBoleto pronto para o uso.

MensagemEnviado: 31 Dez 2013 09:20
por Toledo
O Tópico inicial do MRBoleto:

MR-Boleto: Boleto Bancario em Harbour ( hbHPdf e hbZebra )

Abraços,

MRBoleto pronto para o uso.

MensagemEnviado: 31 Dez 2013 09:22
por sygecom

MRBoleto pronto para o uso.

MensagemEnviado: 31 Dez 2013 12:20
por JAIR PINHO
Ola Pessoal estive olhando o tópico em dicas mas esta trancado onde postaremos sobre este MR-Boleto seria neste Tópico

MRBoleto pronto para o uso.

MensagemEnviado: 31 Dez 2013 14:47
por sygecom
Nada lhe impede de abrir um novo tópico sobre suas duvidas.

MRBoleto pronto para o uso.

MensagemEnviado: 04 Abr 2014 11:12
por formiga
Amigos, estou perguntando no mesmo tópico para centralizar as dúvidas.

Seguinte, compilei o MRBoleto no meu sistema, uso o xHarbour. Compilou ok, mas quando abro o aplicativo, solicita uma dll que não está no pacote e não encontrei em lugar algum:
HARBOUR-32-BCC.DLL

Existe uma lib com esse nome harbour-32-bcc.lib que está sendo linkada.

Onde encontrar a DLL ? ou o motivo do erro é outro?

[]´s

MRBoleto pronto para o uso.

MensagemEnviado: 04 Abr 2014 19:08
por rochinha
Amiguinho,

Esta DLL pode ser encontrada dentro da pasta BIN de seu Harbour, pelo menos no Harbour 3.2.

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2014 00:15
por formiga
Rochinha

tenho o harbour 3.2 e 1.1 em nenhum tem a dll.

Vc tem um link para baixa-la?

Fiz um teste em um programa a parte, somente usando harbour, funcionou sem problemas.

O caso é que preciso usar em um sistema maior, que é compilado em xHarbour. Com o xHarbour é que pede essa dll.

[]´s

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2014 01:01
por rochinha
Amiguinhos,

download

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2014 08:29
por formiga
Você mandou a
harbour-32.dll

O sistema está pedindo a

harbour-32-bcc.dll

[]´s

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2014 15:54
por rochinha
Amiguinho,

Renomeia que acho que funciona.

MRBoleto pronto para o uso.

MensagemEnviado: 05 Abr 2014 20:59
por formiga
Camarada, nananina, não funcionou renomear, só mudou o erro:

Imagem

MRBoleto pronto para o uso.

MensagemEnviado: 17 Mai 2014 15:52
por Alexandre Silva
Pessoal, uso o Mr Boleto na versao 3.1 do Harbour há um ano..e tudo bem..
tem alguma atualizaçaao ?? preciso para o Banco 756 - SICOOB ....

MRBoleto pronto para o uso.

MensagemEnviado: 30 Jun 2014 21:07
por janio
Rochinha,

Meu harbour3.2 reclama da falta da função tIniFile()

MRBoleto pronto para o uso.

MensagemEnviado: 30 Jun 2014 21:28
por rochinha
Amiguinho,

tINIFile() é uma classe existente no Fivewin. Volte ao topo do tópico e a encontrará. Mas nada o impede de usar algum outro recurso que já conheça para manipular arquivos .INI.

MRBoleto pronto para o uso.

MensagemEnviado: 28 Jul 2014 10:27
por formiga
Companheiros

O MrBoleto está funcionando perfeito, exceto para o banco 033 - Santander;
não gera corretamente o código de barras nem o campo Nosso Número.

Alguém está usando o MrBoleto com o Santander ?

MRBoleto pronto para o uso.

MensagemEnviado: 28 Jul 2014 14:23
por rochinha
Amiguinho,

Se o MRBoleto gera boleto para o antigo banco Real, faça o teste, use o bloco do Real para gerar para o Santander e verifique se passa.

Boletos reais do Santander dão problemas mesmo ao ser descontados em outros bancos que não sejam Santander. A desculpa dada nos caixas para dizer que só podem ser descontados no caixa deles é que o código de barras é modelo banco Real.

MRBoleto pronto para o uso.

MensagemEnviado: 28 Jul 2014 18:10
por formiga
Rochinha

Para o Real, dá o mesmo erro que para o Santander.

Para os demais utilizados, BB, Bradesco, Itaú, perfeito.

[]´s

MRBoleto pronto para o uso.

MensagemEnviado: 03 Ago 2014 14:43
por ANDRIL
Rochinha,

Procurei no codigo fonte e não encontrei uma forma de mandar o PDF criado diretamente para impressora. Sabe me dizer quais funções da classe PDF utilizar para isso? Ao executar o DemoUm.exe abre uma tela que logo some, teria como não exibi-la?

Ate+

MRBoleto pronto para o uso.

MensagemEnviado: 03 Ago 2014 23:54
por rochinha
Amiguinho,

Nesta segunda(03/08) irei dar uma olhada, mas o aplicativo é gerenciado por arquivo externo e que pode conferir algum meio de interagir através de alguma variável.

Verifique a existencia de um preview como configuração ou parametro na linha de comando.

MRBoleto pronto para o uso.

MensagemEnviado: 26 Ago 2014 17:23
por ANDRIL
Pessoal, alguém conseguiu usar corretamente o MRboleto para B.B (001) com carteira 18 (SEM REGISTRO) com campo LIVRE de 17 posicoes? Emiti um boleto e ao apresentar ao gerente, fazendo a leitura acusou outra empresa e não a agência e conta informada, creio que há algo a ser tratado na geração do codigo de barras e na linha digitável.

No poste no inicio do tópico consta o preenchimento de alguns campos e não sei como preenchê-los:

Banco_Ag_Un_A=
Conta_OP_____=
Carteira_Tipo=
NossoNumero__=
Prefixo______=
Prefixo_DV___=

Na emissão para o Banco do Brasil, o nosso numero usa o Prefixo______+Prefixo_DV___ para compô-lo, so que no meu sistema estes campos estao vazios (nao sei com que preenche-los), seria este o problema de estar acusando o erro de identificação da conta no momento do pagamento?

Até+

MRBoleto pronto para o uso.

MensagemEnviado: 18 Set 2014 14:49
por JoséQuintas
Acabei usando o mrboleto pro Bradesco, mas fiz uma classe que herda a original.
Ainda estou fazendo testes junto ao Bradesco.

#include "inkey.ch"
#include "hbclass.ch"

PROCEDURE demojose
   LOCAL oBoleto, nCont
   LOCAL cFilePdf := 'Boleto.PDF'

   REQUEST HB_CODEPAGE_PTISO
   SET( _SET_CODEPAGE, "PTISO" )
   SET EPOCH TO YEAR( DATE() ) - 50
   SET CENTURY ON
   SetMode( 33, 80 )

   oBoleto  := MyBoletoPDFClass():New( cFilePdf )

   //*----------------------------------------------------------------------*
   // BRADESCO
   //*----------------------------------------------------------------------*
   FOR nCont = 1 TO 3
      oBoleto:cCarteira        := "06"
      oBoleto:cNossoNumero     := '12345'
      oBoleto:cDocOrigem       := 'NFe'
      oBoleto:cDocNumero       := '00001234'
      oBoleto:dDocData         := Date()
      oBoleto:dVencimento      := Ctod( "18/09/2014" )
      oBoleto:nValor           := 5.67
      oBoleto:acInstrucoes     := {}
      oBoleto:acDemonstrativo  := {}
      oBoleto:acBeneficiario   := { "CNPJ", "NOME", "ENDERECO" }
      oBoleto:acPagador        := { "CNPJ", "NOME", "ENDERECO", "CEP" }
      oBoleto:acAvalista       := { "CNPJ", "NOME", "ENDERECO" }
      oBoleto:AddPage()
      oBoleto:AddCnab()
   NEXT

   oBoleto:Finish()

   IF FILE( cFilePdf )
      hb_Run( "Explorer.exe " + cFilePdf )
   ELSE
      ALERT( "ERRO NA GERACAO DO ARQUIVO...;;" + cFilePdf )
   ENDIF

   RETURN

CREATE CLASS MyBoletoPDFClass INHERIT BoletoPDFClass
   VAR cBanco               INIT "237"
   VAR cBancoAgencia        INIT "0000"
   VAR cBancoAgenciaDV      INIT ""
   VAR cBancoAgenciaUnA     INIT ""
   VAR cBancoConta          INIT "00000"
   VAR cBancoContaDV        INIT "0"
   VAR cBancoContaOP        INIT ""
   VAR cCarteira            INIT "09"
   VAR cCarteiraTipo        INIT ""
   VAR cNossoNumero         INIT ""
   VAR cDocOrigem           INIT ""
   VAR cPrefixo             INIT ""
   VAR cPrefixoDV           INIT ""
   VAR cDocNumero           INIT ""
   VAR cDocAceite           INIT "N"
   VAR cDocEspecie          INIT "R$"
   VAR dDocData             INIT Ctod("")
   VAR dVencimento          INIT Ctod("")
   VAR nValor               INIT 0
   VAR nMultaAuto           INIT 0
   VAR nJurosMes            INIT 9
   VAR nNumeroVias          INIT 3
   VAR acLocalPagamento     INIT { "PAGÁVEL EM QUALQUER BANCO ATÉ O LIMITE DA DATA DO VENCIMENTO" }
   VAR acInstrucoes         INIT {}
   VAR acDemonstrativo      INIT {}
   VAR acBeneficiario       INIT {}
   VAR acPagador            INIT {}
   VAR acAvalista           INIT {}
   VAR Cnab400              INIT {}
   METHOD AddPage()
   METHOD AddCnab()
   METHOD DigitoDoc( cDocNumero, cCarteira )
   METHOD SaveCnab( cPath )
   END CLASS

METHOD AddPage() CLASS MyBoletoPDFClass
   ::Banco________ := ::cBanco
   ::Banco_Agencia := ::cBancoAgencia
   ::Banco_Ag_Dv__ := ::cBancoAgenciaDV
   ::Banco_Ag_Un_A := ::cBancoAgenciaUnA
   ::Conta________ := ::cBancoConta
   ::Conta_DV_____ := ::cBancoContaDV
   ::Conta_OP_____ := ::cBancoContaOP
   ::Carteira_____ := ::cCarteira
   ::Carteira_Tipo := ::cCarteiraTipo
   ::NossoNumero__ := ::cNossoNumero
   ::Doc_Origem___ := ::cDocOrigem
   ::Prefixo______ := ::cPrefixo
   ::Prefixo_DV___ := ::cPrefixoDV
   ::Doc_Numero___ := ::cDocNumero
   ::Doc_Aceite___ := ::cDocAceite
   ::Doc_Especie__ := ::cDocEspecie
   ::Doc_Data_____ := ::dDocData
   ::Vencimento___ := ::dVencimento
   ::Valor________ := ::nValor
   ::Multa_Auto___ := ::nMultaAuto
   ::Juros_Mes____ := ::nJurosMes
   ::Numero_Vias__ := ::nNumeroVias
   ::Local_Pagamen := ::acLocalPagamento
   ::Instrucoes___ := ::acInstrucoes
   ::Demonstrativo := ::acDemonstrativo
   ::Cedente______ := ::acBeneficiario
   ::Sacado_______ := { ::acPagador[ 1 ], ::acPagador[ 2 ], ::acPagador[ 4 ] + " " + ::acPagador[ 3 ] }
   ::Avalista_____ := ::acAvalista
   ::Super:AddPage()
   RETURN NIL

METHOD AddCnab() CLASS MyBoletoPDFClass
   LOCAL cTxt
   IF ::cBanco == "237"
      IF Len( ::Cnab400 ) == 0
         ::Cnab400 := { "", "" }
         //----- registro inicial ---
         /*     */ cTxt := ""
         /* 001 */ cTxt += "0"                                // Fixo: 0=Registro inicial
         /* 002 */ cTxt += "1"                                // Fixo: ID Remessa
         /* 003 */ cTxt += "REMESSA"                          // Fixo: Decricao
         /* 010 */ cTxt += "01"                               // Fixo: Codigo de Servico
         /* 012 */ cTxt += Pad( "COBRANCA", 15 )              // Fixo: Literal Servico
         /* 027 */ cTxt += Padl( "0000000", 20, "0" )         // Codigo da empresa no Bradesco
         /* 047 */ cTxt += Pad( ::acBeneficiario[ 2 ], 30 )   // Nome da empresa
         /* 077 */ cTxt += ::cBanco                           // Fixo: Codigo do Banco
         /* 080 */ cTxt += Pad( "BRADESCO", 15 )              // Fixo: Nome do Banco
         /* 095 */ cTxt += StrZero( Day( Date() ), 2 ) + StrZero( Month( Date() ), 2 ) + Right( StrZero( Year( Date() ), 4 ), 2 ) // Data da gravacao Dia/Mes/Ano, 2 digitos de cada
         /* 101 */ cTxt += Space(8)                           // Espacos
         /* 109 */ cTxt += "01"                               // MX - olhar pag. 16, pag. 20, posicao 109/110 -> 01=remessa
         /* 111 */ cTxt += StrZero( 1, 7 )                    // Num. sequencial de remessa - olhar pag. 16 // nao pode pular, reiniciar ou zerar
         /* 118 */ cTxt += Space(277)                         // Espacos
         /* 395 */ cTxt += StrZero( 1, 6 )                    // Num. sequencial de registro
         ::cnab400[ 1 ] := cTxt
      ENDIF
      // ----- registro detalhe -----
      /*     */ cTxt := ""
      /* 001 */ cTxt += "1"                                   // Fixo: 1=Movimentacao
      /* 002 */ cTxt += StrZero( 0, 5 )                       // Opcional: Agencia do Pagador
      /* 007 */ cTxt += "0"                                   // Opcional: Digito da Agencia do Pagador
      /* 008 */ cTxt += StrZero( 0, 5 )                       // Opcional: Razao da Conta do Pagador
      /* 013 */ cTxt += StrZero( 0, 7 )                       // Opcional: Número da Conta do Pagador
      /* 020 */ cTxt += "0"                                   // Optional: Digito do Número da Conta do Pagador
      /* 021 */ cTxt += "0" + StrZero( Val( ::cCarteira ), 3 ) + StrZero( Val( ::cBancoAgencia ), 5 ) + StrZero( Val( ::cBancoConta ), 7 ) + StrZero( Val( ::cBancoContaDV ), 1 ) // 17 // Zero + Carteira + Agencia sem digito + Conta + Digito Conta do Beneficiario
      /* 038 */ cTxt += Space(25)                             // Número de controle do participante - olhar pag. 17
      /* 063 */ cTxt += StrZero(0, 3 )                        // Codigo do banco a ser debitado - olhar pag.17
      /* 066 */ cTxt += "0"                                   // Multa, 2=percentual, 0=sem multa
      /* 067 */ cTxt += StrZero( 0, 4 )                       // Percentual de multa - olhar pag 17
      /* 071 */ cTxt += StrZero( Val( ::cDocNumero ), 11 )    // ID do titulo no banco - olhar pag. 17 - 10 caracteres + digito = 11 caracteres
      /* 082 */ cTxt += ::DigitoDoc( StrZero( Val( ::cDocNumero ), 10 ) )  // Digito de controle da ID do titulo
      /* 083 */ cTxt += StrZero( 0, 10 )                      // Desconto Bonificacao por dia
      /* 093 */ cTxt += "2"                                   // 1=Banco emite, 2=Cliente emite - olhar pag. 19
      /* 094 */ cTxt += "N"                                   // N=Nao registra, outracoisa=banco emite para debito automatico - olhar pag. 19
      /* 095 */ cTxt += Space(10)                             // Brancos
      /* 105 */ cTxt += Space(1)                              // Indicacao de Rateio
      /* 106 */ cTxt += Space(1)                              // Enderecamento para aviso de debito
      /* 107 */ cTxt += Space(2)                              // Brancos
      /* 109 */ cTxt += "01"                                  // Identificacao da ocorrencia - 01=Remessa
      /* 111 */ cTxt += Space(10)                             // Número do documento
      /* 121 */ cTxt += StrZero( Day( ::dVencimento ), 2 ) + StrZero( Month( ::dVencimento ), 2 ) + Right( StrZero( Year( ::dVencimento ), 4 ), 2 ) // Data vencto DDMMAA
      /* 127 */ cTxt += StrZero( ::nValor * 100, 13 )     // Valor do titulo
      /* 140 */ cTxt += StrZero( 0, 3 )                       // Zeros - Banco Encarregado da cobranca
      /* 143 */ cTxt += StrZero( 0, 5 )                       // Zeros - Agencia depositaria
      /* 148 */ cTxt += "99"                                  // 01-duplicata, 05-Recibo, 99-Outros
      /* 150 */ cTxt += "N"                                   // Sempre N - identificacao
      /* 151 */ cTxt += StrZero( Day( ::dDocData ), 2 ) + StrZero( Month( ::dDocData ), 2 ) + Right( StrZero( Year( ::dDocData ) , 4 ), 2 ) // Data de emissao do titulo DDMMAA
      /* 157 */ cTxt += "00"                                  // Instrucao - olhar pag. 20 // 00=nada,06=protestar,18=Baixar
      /* 159 */ cTxt += "00"                                  // Instrucao - olhar pag. 20 // complemento do anterior, indicando qtde. dias
      /* 161 */ cTxt += StrZero( ::nJurosMes * ::nValor / 30, 13 )    // Multa por dia - olhar pag. 21
      /* 174 */ cTxt += StrZero( 0, 6 )                       // Data limite pra desconto
      /* 180 */ cTxt += StrZero( 0, 13 )                      // Valor do desconto
      /* 193 */ cTxt += StrZero( 0, 13 )                      // Valor IOF
      /* 206 */ cTxt += StrZero( 0, 13 )                      // Valor Abatimento
      /* 219 */ cTxt += iif( Len( SoNumeros( ::acPagador[ 1 ] ) ) == 14, "02", "01" ) // 01=CPF, 02=CNPJ, 98=Nao tem, 99=Outros
      /* 221 */ cTxt += StrZero( Val( SoNumeros( ::acPagador[ 1 ] ) ), 14 )  // Número do CPF ou CNPJ - olhar pag. 21
      /* 235 */ cTxt += Pad( ::acPagador[ 2 ], 40 )            // Nome do pagador
      /* 275 */ cTxt += Pad( ::acPagador[ 3 ], 40 )           // Endereco do pagador
      /* 315 */ cTxt += Space(12)                             // Primeira mensagem
      /* 327 */ cTxt += ::acPagador[ 4 ]                      // CEP
      /* 335 */ cTxt += Space(60)                             // Sacador/Avalista ou segunda mensagem
      /* 395 */ cTxt += StrZero( Len( ::cnab400 ), 6 )        // Número sequencial de registro
      ::cnab400[ Len( ::cnab400 ) ] := cTxt
      // ----- registro final -----
      /*     */ cTxt := ""
      /* 001 */ cTxt += "9"                                   // Fixo: 9=Final
      /* 002 */ cTxt += Space(393)                            // Brancos
      /* 395 */ cTxt += StrZero( Len( ::cnab400 ) + 1, 6 )    // Número de registro
      AAdd( ::cnab400, cTxt )
   ENDIF
   RETURN NIL

METHOD DigitoDoc( cDocNumero, cCarteira ) CLASS MyBoletoPDFClass
   LOCAL nCont, nNumero, nSoma, nResto, cDigito
   nSoma := 0
   FOR nCont = 1 TO 11
      nNumero := Val( Substr( Right( cCarteira, 2 ) + cDocNumero, nCont, 1 ) ) // 2 dig.carteira + 10 dig.Número (11 c/ dig.controle)
      nSoma := nSoma + ( nNumero * { 2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 }[ nCont ] )
   NEXT
   nResto := Mod( nSoma, 11 )
   IF nResto == 0
      cDigito := "0"
   ELSEIF nResto == 1
      cDigito := "P"
   ELSE
      cDigito := Str( 11 - nResto, 1 )
   ENDIF
   RETURN cDigito

METHOD SaveCnab( cPath ) CLASS MyBoletoPDFClass
   LOCAL cNumero, cFileName, nCont, cTxt := ""
   IF ::cCarteira != "09"
      RETURN NIL
   ENDIF
   cPath := iif( cPath == NIL, "", cPath )
   cNumero   := "01"
   cFileName := cPath + "CB" + StrZero( Day( Date() ), 2 ) + StrZero( Month( Date() ), 2 )
   DO WHILE File( cFileName + cNumero + ".TST" )
      cNumero := StrZero( Val( cNumero ) + 1, 2 )
   ENDDO
   FOR nCont = 1 TO Len( ::Cnab400 )
      cTxt += ::Cnab400[ nCont ] + HB_EOL()
   NEXT
   hb_MemoWrit( cFileName + cNumero + ".TST", cTxt )
   RETURN NIL

MRBoleto pronto para o uso.

MensagemEnviado: 19 Set 2014 10:37
por Itamar M. Lins Jr.
Ola!

Aqui um cliente está utilizando p/ o Banco Santander.
Só enfrentei uma pequena dificuldade em entender como jogar os números com ou sem dígito. Porém fui olhando o boleto original e ficou igual.

Saudações,
Itamar M. Lins J.

MRBoleto pronto para o uso.

MensagemEnviado: 19 Set 2014 10:43
por Itamar M. Lins Jr.
José Quintas, você pode enviar o seu código p/ o dono do MRBoleto e ele adicionar.
Esse CNAB400 ? é isso ?
Outro ajuste, é diminuir as linhas não impressa, fica:
1:
2:
3:...
Até 27 sem necessidade.

Saudações,
Itamar M. LIns Jr.

MRBoleto pronto para o uso.

MensagemEnviado: 19 Set 2014 11:33
por Alexandre Silva
Uso o Mr Boleto BB, Bradesco , Itau, Santander

Fiz pequenas mudanças para acrescentar aqueles termos:
Beneficiário: antigo Cedente
Pagador: antigo Sacado
Agencia\Codigo do Beneficiário: antigo Agencia\Codigo do Cedente
Também 'tentei' alinhar os valores a direita, nao ficou 100% mas passou no Itau...

No Santander a linha campo_livre, nao tinha a carteria embora eu use só a 101

::Campo_Livre__ := '9' + ::Prefixo______ + ::Prefixo_DV___ + ::NossoNumero__ + + ::NossoNumer_DV + '0'+ ::Carteira_____

MRBoleto pronto para o uso.

MensagemEnviado: 19 Set 2014 17:21
por JoséQuintas
No caso do boleto Bradesco, enviei pra análise e a resposta foi esta:

Boletos analisados e validados.
Porém se faz necessário estes ajustes:
Campo local de pagamento, mencionar: “Pagável preferencialmente na Rede Bradesco ou Bradesco Expresso”.
Campo espécie documento,de acordo com o ramo de atividade, poderá ser utilizada uma das siglas: DM-Duplicata Mercantil, NP-Nota Promissória, NS-Nota de Seguro, CS-Cobrança Seriada, REC-Recibo, ND-Nota de Débito, DS-Duplicata de Serviços, OU-Outros.


O arquivo CNAB ainda tem duas pendências, vou revisar:

Registro Header
Posição - 109 a 110 - gravar MX

Registro de Transação
Posição - 082 a 082 - digito verificador do nosso numero esta sendo calculado erroneamente, para o registro 000002

Registro Trailler
OK


Mas como eu disse, o trabalhoso vai ser controlar o número de remessa, porque segundo o manual o Bradesco não deixa pular.
No Itaú não existe essa sequência.
Não é a sequência numérica dos registros, é numerar no próprio arquivo cada arquivo.
Se mandou um arquivo com numero 1, o próximo tem que ser 2, não pode ser 3.
Talvez precise de algo pra deixar alterar esse número depois, refazendo o arquivo de remessa.

Nota: o dígito de controle do cnab é calculado pela minha rotina e não pelo mr boleto, é minha rotina que não bate.

MRBoleto pronto para o uso.

MensagemEnviado: 19 Set 2014 20:25
por JoséQuintas
Não tinha reparado em uma coisa:
Imprimi aqui, e na impressão corta o último dígito da linha digitável.
Impressora HP Laser Color CP1215.
Não sei quanto ao código de barras, porque quando tinha feito o meu, fui obrigado a alterar a resolução da parte do código de barras pra poder funcionar, e no mrboleto usa a mesma resolução pra tudo.

MRBoleto pronto para o uso.

MensagemEnviado: 17 Out 2014 13:59
por JoséQuintas
Até agora ainda com problemas no Bradesco, e agora é com o que é impresso em nosso número.
Tentar simplificar as rotinas.

Só pra explicar:
O nosso número, quando emitido pelo banco sai um, e quando emitido pelo Mr Boleto sai outro.
O cliente pagar pelo boleto não tem problema.
Mas a taxa cobrada pelo banco acaba sendo o dobro do preço ao usar o boleto do mr. boleto, só por causa desse número diferente, que não bate com o número gerado pelo banco.
É algo como 99/00/999999 e o mr boleto imprime 99/9999/999999 (4 números ao invés de 2 zeros, na parte interna).

MRBoleto pronto para o uso.

MensagemEnviado: 20 Out 2014 13:02
por JoséQuintas
Algumas modificações de gosto pessoal.

1) Redução do fonte LARGE pra linha digitável sair sem cortes na impressão

2) aPos[ PAGE_LEFT ], aPos[ PAGE_LINE_SIZE ], aPos[ PAGE_POS_SAA ], aPos[ PAGE_POS_SBB ], aPos[ PAGE_POS_VERT ] e Apos[ PAGE_POS_ZZZ ]

alterados pra nPageLeft, nPageLineSize, nPagePosSAA, nPagePosSBB, nPagePosVert e nPagePosZZZ ( e eliminado array aPos de 20 elementos)

3) Eliminado uso de cAux
cAux := variável
Draw_Text( ...., cAux, ...)

para Draw_Text( ..., variável, ...)

4) Definido tamanho default na rotina Draw_text como ::oFontVariavel e BOLETO_FONTE_NORMAL
Como isso é o mais usado no boleto, muitos Draw_Text() foram reduzidos

5) Nosso número do Bradesco agora igual no Bradesco

6) Alteração do post anterior, ref. Banco Santander

7) Uma alteração pessoal foi no número de documento do Bradesco, acrescentando uma barra "/" pra separar o último dígito, que no meu caso indica a parcela.

Em anexo também a rotina quebra galho intermediária ao MrBoleto, que gera CNAB Bradesco.
Nota: o nome ZZ_mrboleto é pra quando listar fontes em ordem alfabética, LIBs ficarem juntas no final, só isso.

NOTA:
Fontes atualizados depois do post original, porque o que postei antes dava erro
Nomes internos alterados pra eu não precisar mais converter na classe do cnab
Cuidado, porque isso deixa incompatível com a mrboleto original, já os nomes de variáveis foram alterados.

MRBoleto pronto para o uso.

MensagemEnviado: 20 Out 2014 19:57
por Alexandre Silva
Para o Banco 085 - TranspoCred.. imagino que nao está configurado..
tenho o manual.. se alguem quiser...

MRBoleto pronto para o uso.

MensagemEnviado: 20 Out 2014 20:47
por JoséQuintas
No meu caso estou mexendo porque precisei pro Bradesco, e para o cnab Bradesco.
O próximo será Itaú, sendo que já gero cnabs de 3 carteiras diferentes enviados ao banco mas não imprimo.
Em todo caso, poste o manual, vai que sobra um tempinho...

MRBoleto pronto para o uso.

MensagemEnviado: 20 Out 2014 20:51
por Alexandre Silva
ta ai...

MRBoleto pronto para o uso.

MensagemEnviado: 21 Out 2014 12:51
por JoséQuintas
Reduzir fonte virou mania, não consigo me controlar....

Como o formulário é A4, os tamanhos são sempre os mesmos, então deixei fixos como variáveis, incluindo margem e largura de linha.

Em toda Draw_Text() passa como parâmetro a margem + coluna
Então coloquei pra somar a margem direto em Draw_Text() e retirei de todas as chamadas.

O bloco da linha digitável é utilizado nos 3 boletos, exatamente igual, então movi pra um método e coloquei chamadas.
Pena que o restante do boleto é diferente em cada via, senão daria pra reduzir mais o fonte.

Aquela alteração do número do documento mostrando parcela que fiz pro meu uso, reparei que estava fazendo isso só em uma das vias.
Então igual tem no nosso número, uma variável só pra formatar impressão, fiz o mesmo para o número do documento.
E pra preencher esse campo, alterei no método Update().

Ficam aí as dicas pro Mr Boleto, pelo menos referente à margem/Draw_Text() é interessante.

MRBoleto pronto para o uso.

MensagemEnviado: 28 Out 2014 10:09
por JoséQuintas
Mais outra dica:
Em todas as chamadas Draw_Line() usa a margem esquerda, então menos fonte se já considerar margem esquerda dentro de Draw_Line()

Algo como alterar de:
Draw_Line( Margem + algo, ... )
Draw_Line( Margem + algo, ... )
Draw_Line( Margem + algo, ... )
Draw_Line( Margem, ... )

METHOD Draw_Line( x, ... )


para:

Draw_Line( algo, ... )
Draw_Line( algo, ... )
Draw_Line( algo, ... )
Draw_Line( 0, ... )

METHOD Draw_Line( x, ... )
x = x + Margem

MRBoleto pronto para o uso.

MensagemEnviado: 28 Out 2014 23:23
por JoséQuintas
Ao administrador do fórum:

Peço remover os fontes que postei aqui, do Mr Boleto alterado, porque não consta o autor original do Mr Boleto.

MRBoleto pronto para o uso.

MensagemEnviado: 05 Jan 2021 11:47
por momente
Amigos,

Primeiramente, Feliz Ano Novo pra todos deste grupo que muito já me ajudou, com muita saúde e paz!

Estou iniciando com MR.Boleto, porém não encontrei nada sobre o SICOOB, existe alguma programação ou jeito de gerar boleto pra este banco?

Eu precisaria de um norte em relação a isto, estou precisando muito!

Obrigado!

MRBoleto pronto para o uso.

MensagemEnviado: 11 Jan 2021 15:17
por momente
Boa tarde!

Alguém tem alguma informação à respeito do SICOOB no MR. Boleto?

Me ajudaria muito. Obrigado!

MRBoleto pronto para o uso.

MensagemEnviado: 30 Jan 2021 11:07
por HASA
- Bom dia, algum colega teria a formula de calculo do NOSSO NÚMERO para cobrança SICCOB?

HASA

MRBoleto pronto para o uso.

MensagemEnviado: 31 Jan 2021 14:22
por alxsts
Olá!

É só baixar o manual no site do Banco. Tem tudo lá.

MRBoleto pronto para o uso.

MensagemEnviado: 02 Fev 2021 09:08
por HASA
- Bom dia, obrigado, amigo, vendo no manual não entendi como incorporar a conta da CALCULO DO NOSSO número:
Constante para cálculo = 3197 ? Alguem teria apenas essa parte para compartilhar.
:-(
HASA

MRBoleto pronto para o uso.

MensagemEnviado: 02 Fev 2021 16:51
por alxsts
Olá!
HASA escreveu:não entendi como incorporar a conta da CALCULO DO NOSSO número:
Constante para cálculo = 3197

É fácil, uma receita de bolo. Só seguir o manual.

Teu sistema vai gerar boletos de cobrança referentes a títulos emitidos pelo teu cliente. Para poder fazer isto, teu cliente precisa ter uma conta aberta junto ao banco (no caso o Sicoob, 756) e firmar um convênio junto ao banco para o registro e processamento dos boletos, através dos arquivos de remessa e retorno.
Com isto você vai ter:
==> o número da cooperativa, que é a agência e um número de conta corrente (que não é usado para geração do nosso número)
==> o código do cliente junto ao banco. Este número não é o número da conta corrente e sim o código de cliente atribuído pelo banco ao cliente quando da criação do convênio

Além disto, o teu sistema tem que armazenar e manter em algum lugar a numeração sequencial que será usada nos boletos (nosso número)

Segundo o manual:
3.13. Nosso número: Código de controle que permite ao Sicoob e à empresa identificar os dados da cobrança que deu origem ao boleto.

Para o cálculo do dígito verificador do nosso número, deverá ser utilizada a fórmula abaixo:
Número da Cooperativa 9(4) – vide planilha ""Capa"" deste arquivo
Código do Cliente 9(10) – vide planilha ""Capa"" deste arquivo
Nosso Número 9(7) – Iniciado em 1

Constante para cálculo = 3197

a) Concatenar na seqüência completando com zero à esquerda.
Ex.:Número da Cooperativa = 0001
Número do Cliente = 1-9
Nosso Número = 21
000100000000190000021

b) Alinhar a constante com a seqüência repetindo de traz para frente.
Ex.: 000100000000190000021
319731973197319731973

c) Multiplicar cada componente da seqüência com o seu correspondente da constante e somar os resultados.
Ex.: 1*7 + 1*3 + 9*1 + 2*7 + 1*3 = 36

d) Calcular o Resto através do Módulo 11.
Ex.: 36/11 = 3, resto = 3

e) O resto da divisão deverá ser subtraído de 11 achando assim o DV (Se o Resto for igual a 0 ou 1 então o DV é igual a 0).
Ex.: 11 – 3 = 8, então Nosso Número + DV = 21-8

FUNCTION TesteDV()
   
   Cls

   Alert( Str( DVNossoNumeroSicoob(), 1, 0 ) )

RETURN NIL
//----------------------------------------------------------
FUNCTION DVNossoNumeroSicoob( nCooper, nCodCli, nNossoNumero )
   
   LOCAL cSequencia
   LOCAL cFatores
   LOCAL nTotal
   LOCAL nDigito
   LOCAL nResto
   LOCAL s, f

   nCooper := If( nCooper == NIL, 1, nCooper )       // valor inicial conforme exemplo do manual
   nCodCli := If( nCodCli == NIL, 19, nCodCli )      // valor inicial conforme exemplo do manual
   nNossoNumero := If( nNossoNumero == NIL, 21, nNossoNumero ) // valor inicial conforme exemplo do manual (trazer da tua base de dados)

   /* a) Concatenar na seqüência completando com zero à esquerda.
      Ex.:Número da Cooperativa  = 0001
          Número do Cliente  = 1-9
          Nosso Número  = 21
          000100000000190000021 */

   cSequencia := StrZero( nCooper, 4 ) + ;
                 StrZero( nCodCli, 10 ) + ;
                 StrZero( nNossoNumero, 7 )  // Total de 21 bytes

   /* b) Alinhar a constante com a seqüência repetindo de traz para frente.
      Ex.: 000100000000190000021
           319731973197319731973 */
           
   cFatores := Left( Replicate( "3197", 6 ), 21 )  // Total de 21 bytes

   /* c) Multiplicar cada componente da seqüência com o seu correspondente da constante e somar os resultados.
      Ex.: 1*7 + 1*3 + 9*1 + 2*7 + 1*3 = 36 */

   nTotal := 0

   For Each s, f In cSequencia, cFatores
     nTotal += Val(s) * Val(f)
   Next

   /* d) Calcular o Resto através do Módulo 11.
      Ex.: 36/11 = 3, resto = 3 */
   nResto := nTotal % 11

   /* e) O resto da divisão deverá ser subtraído de 11 achando assim o DV (Se o Resto for igual a 0 ou 1 então o DV é igual a 0).
      Ex.: 11 – 3 = 8, então Nosso Número + DV = 21-8 */
   nDigito := If( nResto <= 1, 0, 11 - nResto )
   
RETURN nDigito

MRBoleto pronto para o uso.

MensagemEnviado: 02 Fev 2021 18:33
por HASA
- Boa Noite alxsts , agradeço ficou super claro.
:-)
HASA

MRBoleto pronto para o uso.

MensagemEnviado: 04 Ago 2022 09:14
por adzdoni
Bom dia a todos

Gostaria de ajuda com o codigo de barras do
boleto sicredi (mrboleto.)
O meu problema esta no codigo de barras, envio a linha digitavel sem os
pontos e espacos para imprimir. Ele imprime, porem aparece o numero 0(zero)
a esquerda.
Exemplo: linha digitavel 74891.12222 00157.907239 23348.021058 9
90570000029704
envio para imprimir assim: 74891122220015790723923348021058990570000029704
Apos a impressao, quando passo o leitor fica assim
074891122220015790723923348021058990570000029704, este zero nao deixa o
boleto ser pago no caixa eletronico, diz que o tamanho é incompativel. Se
digitar a linha digitavel passa e faz o pagamento.
Uso para o banco Itau a muitos anos, nunca deu este problema.
Alguem ja possou por isso e tem a solucao ? obrigado.
Donizete

MRBoleto pronto para o uso.

MensagemEnviado: 04 Ago 2022 10:52
por Alexandre Silva
Opa
No meu Mrboleto eu fiz esses ajustes abaixo e funcionou

//*----------------------------------------------------------------------------*
//
// M., Ronaldo: Boleto Bancario em Harbour
//
// Method Banco_748() Class MR_Boleto
//
//*----------------------------------------------------------------------------*
Method Banco_748() Class MR_Boleto

   LOCAL cAux,vnosso,vposto,vbyte:='2'
   LOCAL vseqnosso := PADL( ALLTRIM( Left( ::NossoNumero__, 5 ) ), 5, '0' )
   LOCAL cAno := RIGHT(::NossoNumero__,2)
   * LOCAL cAno := RIGHT( hb_NtoS( YEAR(::Doc_Data_____ ) ), 2 )

   ::Banco_Dv_____ := "X"
   ::Banco_Nome___ := "Banco Cooperativo Sicredi"

   ::Carteira_____ := PADL( ALLTRIM( Left( ::Carteira_____, 2 ) ), 1, '0' )
   ::Carteira_Tipo := PADL( ALLTRIM( Left( ::Carteira_Tipo, 1 ) ), 1, '0' )

   ::Banco_Agencia := PADL( ALLTRIM( Left( ::Banco_Agencia, 4 ) ),  4, '0' )
   vposto := PADL( ALLTRIM( Left( ::Banco_Ag_Un_A, 2 ) ),  2, '0' )

   ::Conta________ := PADL( ALLTRIM( Left( ::Conta________, 5 ) ), 5, '0' )
   ::Conta_DV_____ := PADL( ALLTRIM( Left( ::Conta_DV_____, 1 ) ), 1, '0' )
   vcedente:= PADL( ALLTRIM( Left( ::Prefixo______, 5 ) ), 5, '0' )

   ::NossoNumero__ := cAno + '2' +vseqnosso  // 2+1+5 = 8

   cAux := ::Banco_Agencia + vposto + vcedente + cAno + vbyte + vseqnosso
   ::NossoNumer_DV := ::DC_Mod11( ::Banco________, 7, .F. , cAux, .F. )

   ::NossoNumero_z := cAno + '/' + '2' + vseqnosso+ '-' + ::NossoNumer_DV

   ::Ag_Cod_Cedent := ::Banco_Agencia + '.' + vposto + '.' + vcedente

   vnosso:=::NossoNumero__ +::NossoNumer_DV  // c 9
   ::Campo_Livre__ := ::Carteira_____ + ::Carteira_Tipo +vnosso
   ::Campo_Livre__ += ::Banco_Agencia + vposto + vcedente + '10'
   ::Campo_Livre__ += ::DC_Mod11( ::Banco________, 7, .F. , ::Campo_Livre__, .F. )

   Return NIL



//*----------------------------------------------------------------------------*
//
// M., Ronaldo: Boleto Bancario em Harbour
//
// Method DC_Mod11( c_Banco, mBSDG, mFGCB, mNMOG, lMult10 ) Class MR_Boleto
//
// bradesco -> DC_Mod11("237", 7, .F., carteira+agencia+nossonumero, .F.)
// mFGCB // se .t. indica codigo de barras
// Cod_Barras_DV := ::DC_Mod11( ::Banco________, 9, .T. , ::Banco________ + ::Moeda________ + ::Vencim_Fator_ + StrZero( ::Valor________ * 100,10 ) + ::Campo_Livre__, .F. )
//*----------------------------------------------------------------------------*
Method DC_Mod11( c_Banco, mBSDG, mFGCB, mNMOG, lMult10 ) Class MR_Boleto
LOCAL mSMMD,mCTDG,mSQMP,mRSDV,mDCMD,vdifer,vpesos,tt,jj,vresto,vdv,vfat

   // mFGCB := IIF( EMPTY( mFGCB ), .F., mFGCB )
   // mFGCB := IIF( EMPTY( lMult10 ), .F., lMult10 )

   mSMMD := 0
   mSQMP := 2

   FOR mCTDG := 1 TO Len( mNMOG )
      mSMMD += Val( SubStr( mNMOG,Len(mNMOG ) - mCTDG + 1,1 ) ) * ( mSQMP )
      mSQMP := IF( mSQMP == mBSDG, 2, mSQMP + 1 )
   NEXT
   IF lMult10
      mSMMD *= 10
   ENDIF
   // if c_Banco == "748"  // sicredi formula abaixo
   //    mFGCB:=.f.
   //  endif

   mRSDV := ( mSMMD % 11 )
   IF mFGCB  // para codigo de barras aparentemente nao tem excecao
      mDCMD := IF( mRSDV > 9 .OR. mRSDV < 2, "1", Str( 11 - mRSDV,1 ) )
   ELSE
      IF c_Banco == "001"    // Brasil
         mDCMD := IF( mRSDV == 0, "0", IF( mRSDV == 1,"X",Str(11 - mRSDV,1 ) ) )

      ELSEIF c_Banco $ "008|033|353" //Santander Banespa

         mDCMD := IF( mRSDV < 2, "0", IF( mRSDV == 10,"1",Str(11 - mRSDV,1 ) ) )

      ELSEIF c_Banco == "748"  // sicredi
         vfat:=2
         tt:=0
         for jj:=len(mNMOG) to 1 step -1
             tt+=val(substr(mNMOG,jj,1))*vfat
             vfat++
             if vfat>9
                vfat:=2
             endif
         next
         vresto:=tt%11
         dv:=11-vresto
         if dv=10 .or. dv=11
            mDCMD:='0'
         else
            mDCMD:=str(dv,1)
         endif

      ELSEIF c_Banco == "756" .or. c_Banco == "085"
         vdifer:=11-mRSDV
         if vdifer=0 .or. vdifer=1 .or. vdifer>9
            mDCMD := '1'
         else
            mDCMD := Str(vdifer,1)
         endif
      ELSEIF c_Banco == "104"             // Caixa
         mRSDV := 11 - mRSDV
         mDCMD := IF( mRSDV > 9, "0", Str( mRSDV,1 ) )
      ELSEIF c_Banco == "237"             // Bradesco
         mDCMD := IF( mRSDV == 0, "0", IF( mRSDV == 1,"P",Str(11 - mRSDV,1 ) ) )
      ELSEIF c_Banco == "341"             // Itau
         mDCMD := IF( mRSDV == 11, "1", Str( 11 - mRSDV,1 ) )
      ELSEIF c_Banco == "409"             // Unibanco
         mDCMD := IF( mRSDV == 0 .OR. mRSDV == 10, "0", Str( mRSDV,1 ) )
      ELSEIF c_Banco == "422"             // Safra
         mDCMD := IF( mRSDV == 0, "1", IF( mRSDV == 1,"0",Str(11 - mRSDV,1 ) ) )
      ENDIF
   ENDIF

   RETURN mDCMD



MRBoleto pronto para o uso.

MensagemEnviado: 22 Ago 2022 11:55
por adzdoni
Ola Alexandre, deu certo a rotina que você passou. Vou anexar um arquivo ini do sicredi para ajudar outros colegas, obrigado.

MRBoleto QRCODE

MensagemEnviado: 01 Ago 2023 10:33
por Alexandre Silva
Opa
Uso o MrBoleto há bastante tempo
Alguem ja usou QrCode no Mrboleto ? Nao tenho esse metodo

MRBoleto pronto para o uso.

MensagemEnviado: 01 Ago 2023 16:09
por JoséQuintas
gerar o boleto é uma coisa, obter QRCode é outra.
Boleto com QRCode depende de API de banco.

MRBoleto pronto para o uso.

MensagemEnviado: 01 Ago 2023 17:26
por Alexandre Silva
Pensei que era feito um string com dados do boleto, gerava um QRCODE disso, e colocava na impressao do PDF do Boleto
Entao somente por API para ter QRCode ?

Uso sistema remessa retorno.

MRBoleto pronto para o uso.

MensagemEnviado: 01 Ago 2023 19:55
por JoséQuintas
Eu também pensava isso.
É o banco que vai fornecer um código pra ser usado como QRCode.
Sem API do banco, sem QRCode no boleto.