Página 1 de 1

Boletos via HTML

Enviado: 20 Dez 2007 10:48
por Pablo César
Abrí novo tópico aqui, a fim de desviar o tópico https://pctoledo.org/forum/viewtopic.php?t=239 a fim de diversificar os boletos conforme cada banco. Nesta primeira oportunidade, está sendo postado e disponibilizados os arquivos para a impressão/visualização de boletos do banco Itaú em: Arquivos Gifs - Itaú

Código: Selecionar todos

*/
   TBO2.prg - Gera arq. padrao HTML para Boleto
   Autor: Hu Chia Fo - hucf
*/

#include "fileio.ch" 

priv __dir_banc,__dir_img,__lin_digi,__cod_barr,__cod_banc,__dat_venc 
priv __val_nomi,__dat_refe,vcod := {},vlin := {},__vnm_docu 
priv __aceite,__esp_docu,__nom_cede,__nom_saca 
set date format 'DD-MM-YYYY' 

cls 
* Dados a serem definidos 
__cod_banc := '341' 
__cod_agen := 'nnnn' // string com n.o agencia bco 
__cod_cart := '175' 
__num_docu := '00000000' 
__cta_cede := 'nnnnn' // string com n.o cta corrente 
__cta_dgvf := '0' 
__dat_refe := ctod('07-10-1997') 
__dat_venc := ctod(' - - ') 
__val_nomi := 0 
__vnm_docu := val(__num_docu) 
__nom_arqu := spac(30) 
* 1234567890123456789012345678901234567890 
__nom_saca := 'ACME DO BRASIL ' 
__dad_juro := spac(40) 
__dad_mult := spac(40) 

@05,05 say 'Cod. Banco .....:' get __cod_banc pict '999' 
@06,05 say 'Cod. Agencia ...:' get __cod_agen pict '9999' 
@07,05 say 'Cod. Carteira ..:' get __cod_cart pict '999' 
@08,05 say 'N.o Documento ..:' get __vnm_docu pict '@r 99999999' valid !empty(__vnm_docu) 
* 567890123456789012 34567 
@09,05 say 'N.o Conta ......:' get __cta_cede pict '99999' 
@09,28 say '-' get __cta_dgvf pict '9' 
@10,05 say 'Valor Titulo ...:' get __val_nomi pict '@er 999,999,999.99' valid !empty(__val_nomi) 
@11,05 say 'Data Vencimento :' get __dat_venc valid (__dat_venc > __dat_refe) 
@12,05 say 'Nome Sacado ....:' get __nom_saca pict '@!' 
@13,05 say 'Juros ..........:' get __dad_juro pict '@!' 
@14,05 say 'Multa ..........:' get __dad_mult pict '@!' 
@15,05 say 'Nome Arq. ......:' get __nom_arqu pict '@!' valid !empty(__nom_arqu) 
read 

if lastkey() = 27 
   quit
endif

__cod_moed := '9' 
__nom_saca := alltrim(__nom_saca) 
__nom_arqu := alltrim(__nom_arqu) 
__num_docu := strzero(__vnm_docu,8) 
__fat_venc := strzero(__dat_venc-__dat_refe,4) 
__dat_venc :=dtoc(__dat_venc) 
* Digito verif. "Nosso Numero" 
__dgvf := mod_10(__cod_agen+__cta_cede+__cod_cart+__num_docu) 

__aceite := ' Não ' 
__nom_cede := 'XXX' // string com nome cedente 
__esp_docu := 'DP' 

*aadd(vobs,'*** Não pagar este boleto ***') 
*aadd(vobs,'É apenas uma demonstração') 

* Seq. numerica ref. para calcular __dig_veri 
__cod_barr := '' 
__cod_barr += __cod_banc // 001-003 cod. banco 
__cod_barr += __cod_moed // 004-004 cod. moeda 9 -> Real 
*__cod_barr += __dig_veri // 005-005 dig. verificador 
__cod_barr += __fat_venc // 005-008 fat. vencimento (n.o dias a partir data ref.) 
__cod_barr += strzero(__val_nomi * 100,10) // 009-018 val. nominal do titulo 
__cod_barr += __cod_cart // 019-021 cod. carteira 
__cod_barr += __num_docu // 022-029 n.o documento 
__cod_barr += __dgvf // 030-030 dig. verif. n.o docu 
__cod_barr += __cod_agen // 031-034 cod. agencia 
__cod_barr += __cta_cede // 035-039 conta cedente sem digito 
__cod_barr += __cta_dgvf // 040-040 dig. verif. conta 
__cod_barr += '000' // 041-043 zero fixo 

* Calculando e inserindo dig. verificador 
__dig_veri := mod_11(__cod_barr) 
__cod_barr := stuff(__cod_barr,5,0,__dig_veri) 

*memowrit('cod_bar.txt',__cod_barr) 

aadd(vcod,__cod_banc) // 001-003 cod. banco 
aadd(vcod,__cod_moed) // 004-004 cod. moeda 9 -> Real 
aadd(vcod,__dig_veri) // 005-005 dig. verificador 
aadd(vcod,__fat_venc) // 006-009 fat. vencimento (n.o dias a partir data ref.) 
aadd(vcod,strzero(__val_nomi * 100,10)) // 010-019 val. nominal do titulo 
aadd(vcod,__cod_cart) // 020-022 cod. carteira 
aadd(vcod,__num_docu) // 023-030 n.o documento 
aadd(vcod,__dgvf) // 031-031 dig. verif. n.o docu 
aadd(vcod,__cod_agen) // 032-035 cod. agencia 
aadd(vcod,__cta_cede) // 036-040 conta cedente sem digito 
aadd(vcod,__cta_dgvf) // 041-041 dig. verif. conta cedente 
aadd(vcod,'000') // 042-044 zero fixo 

__lin_digi := '' 
__lin_digi += __cod_banc // 001-003 cod. banco 
__lin_digi += __cod_moed // 004-004 cod. moeda 9 -> Real 
__lin_digi += __cod_cart + left(__num_docu,2) // 005-009 pos. 20-24 cod. barras 
__lin_digi += mod_10(__lin_digi) // 010-010 digito verif. 1.o campo 
__lin_digi += right(__num_docu,6) // 011-016 pos. 25 a 30 
__lin_digi += __dgvf // 017-017 pos. 31 
__lin_digi += left(__cod_agen,3) // 018-020 3 dig. agencia 
__lin_digi += mod_10(subs(__lin_digi,11,10)) // 021-021 digito verif. 2.o campo 
__lin_digi += right(__cod_agenc,1) // 022-022 ult. dig. agencia 
__lin_digi += __cta_cede // 023-027 
__lin_digi += __cta_dgvf // 028-028 
__lin_digi += '000' // 029-031 pos. 44 
__lin_digi += mod_10(subs(__lin_digi,22,10)) // 032-032 digito verif. 3.o campo 
__lin_digi += __dig_veri // 033-033 digito verif. geral 
__lin_digi += __fat_venc // 034-037 
__lin_digi += strzero(__val_nomi * 100,10) // 038-047 

* 1 2 3 4 
* 123456789012345678901234567890123456789012345678901234567890 
* 6 2 8 5 1 8 0 
* 99999.99999 99999.999999 99999.999999 9 99999999999999 
__lin_digi := stuff(__lin_digi, 6,0,'.') 
__lin_digi := stuff(__lin_digi,12,0,' ') 
__lin_digi := stuff(__lin_digi,18,0,'.') 
__lin_digi := stuff(__lin_digi,25,0,' ') 
__lin_digi := stuff(__lin_digi,31,0,'.') 
__lin_digi := stuff(__lin_digi,38,0,' ') 
__lin_digi := stuff(__lin_digi,40,0,' ') 

*memowrit('lin_dig.txt',__lin_digi) 

aadd(vlin,__cod_banc ) // 001-003 cod. banco 
aadd(vlin,__cod_moed ) // 004-004 cod. moeda 9 -> Real 
aadd(vlin,__cod_cart + left(__num_docu,2)) // 005-009 cod. carteira + ... 
aadd(vlin,mod_10(__lin_digi) ) // 010-010 digito verif. 1.o campo 
aadd(vlin,right(__num_docu,6) ) // 011-016 pos. 25 a 30 
aadd(vlin,__dgvf ) // 017-017 pos. 31 
aadd(vlin,left(__cod_agen,3) ) // 018-020 3 dig. agencia 
aadd(vlin,mod_10(subs(__lin_digi,11,10)) ) // 021-021 digito verif. 2.o campo 
aadd(vlin,right(__cod_agenc,1) ) // 022-022 ult. dig. agencia 
aadd(vlin,__cta_cede ) // 023-027 
aadd(vlin,__cta_dgvf ) // 028-028 
aadd(vlin,'000' ) // 029-031 pos. 44 
aadd(vlin,mod_10(subs(__lin_digi,22,10)) ) // 032-032 digito verif. 3.o campo 
aadd(vlin,__dig_veri ) // 033-033 digito verif. geral 
aadd(vlin,__fat_venc ) // 034-037 
aadd(vlin,strzero(__val_nomi * 100,10) ) // 038-047 

html_boleto(__lin_digi,__cod_barr,vlin,vcod) 



function html_boleto 
memvar __cod_banc,__cod_agen,__cod_cart,__num_docu,__cta_cede,__cta_dgvf,; 
__dat_venc,__val_nomi,__dgvf,__nom_cede,__nom_saca,__esp_docu,; 
__aceite,__nom_arqu 
para __linh,__bcod,vlin,vcod 
priv __text,vtab := {},__tref 

__val_nomi := tran(__val_nomi,'@er 9,999,999.99') 
__dat_docu := dtoc(date()) 
__dat_proc := __dat_docu 

aadd(vtab,{'0','NNWWN'}) 
aadd(vtab,{'1','WNNNW'}) 
aadd(vtab,{'2','NWNNW'}) 
aadd(vtab,{'3','WWNNN'}) 
aadd(vtab,{'4','NNWNW'}) 
aadd(vtab,{'5','WNWNN'}) 
aadd(vtab,{'6','NWWNN'}) 
aadd(vtab,{'7','NNNWW'}) 
aadd(vtab,{'8','WNNWN'}) 
aadd(vtab,{'9','NWNWN'}) 

* Def. padrao 2 of 5 do cod. barras 
__segm := '' 
for __i = 1 to len(__bcod) step 2 
    * Segmento barra
    __npos := ascan(vtab,{ |v| v[1] = subs(__bcod,__i,1) })
    __segb := vtab[__npos,2]
    * Segmento espaco
    __npos := ascan(vtab,{ |v| v[1] = subs(__bcod,__i+1,1) })
    __sege := vtab[__npos,2]
    for __j = 1 to len(__segb)
        __segm += subs(__segb,__j,1) + subs(__sege,__j,1)
    next
next 

__narq := 'bol_ref.txt' 
__crrt := chr(13)+chr(10) 
if !file(__narq) 
   alert(' Nao tem Arq. ')
endif

__text := '' 
__npos := 1 
__tref := memoread(__narq) 

do while .t.
   __ltxt := ''
   for __i = __npos to len(__tref)
       if (subst(__tref,__i,1) + subst(__tref,__i+1,1)) = __crrt
          __npos += 2
          exit
       endif
       __ltxt += subst(__tref,__i,1)
       __npos += 1
   next
   * Verificando se existe campo variavel
   if !empty((__pos_camp := at('',__ltxt)))
      __ltxt := subst(__ltxt,__pos_camp+1,len(alltrim(__ltxt))-2)
      __ltxt := &__ltxt
   endif
   __text += __ltxt
   __text += __crrt
   if __npos >= len(__tref)
      exit
   endif
enddo
__text += ' <tr valign="top">' + __crrt 
__text += ' <td width="67%" valign="center">  ' + __crrt 
* Start Code 
__text += ' <img src="pf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 
__text += ' ><img src="bf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 
__text += ' ><img src="pf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 
__text += ' ><img src="bf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 

for __i = 1 to len(__segm) 
    __text += ' ><img src="'
    if mod(__i,2) # 0
       __text += iif(subs(__segm,__i,1)='W','pg.gif"','pf.gif"')
    else
       __text += iif(subs(__segm,__i,1)='W','bg.gif"','bf.gif"')
    endif
    __text += ' border="0"'
    __text += iif(subs(__segm,__i,1)='W',' width="3"',' width="1"')
    __text += ' height="49"' + chr(13) + chr(10)
next 

* Stop Code 
__text += ' ><img src="pg.gif" border="0" width="3" height="49"' + chr(13) + chr(10) 
__text += ' ><img src="bf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 
__text += ' ><img src="pf.gif" border="0" width="1" height="49"' + chr(13) + chr(10) 
** 
__text += ' </td>' + __crrt 
__text += ' <td width="33%" align="center">' + __crrt 
__text += '  ' + __crrt 
__text += ' </td>' + __crrt 
__text += ' </tr>' + __crrt 
__text += '</table>' + __crrt 
__text += '</html>' 
** 
memowrit(__nom_arqu,__text) 
return NIL

function mod_10 
* MOD 10 - formula LUHN 
para __nref 
priv __i,__soma,__dver,__vsgm 

__soma := 0 
for __i = 1 to len(__nref) 
    __segm := subst(__nref,len(__nref)-__i+1,1)
    __vsgm := iif(mod(__i,2)#0,2*val(__segm),val(__segm))
    __vsgm := iif(__vsgm>9,iif(__vsgm=18,9,mod(__vsgm,9)),__vsgm) // <---
    __soma += __vsgm
next 

__dver := 10 - mod(__soma,10) 
__dver := iif(__dver=10,0,__dver) 
return alltrim(str(__dver,0))

function mod_11 
para __nref 
priv __i,__j,__soma,__dver 

__soma := 0 
for __i = 1 to len(__nref) step 8 
    for __j = 2 to 9
        if len(__nref)-__i-__j+3 < 1
           __i := len(__nref)
           exit
        endif
        __segm := subst(__nref,len(__nref)-__i-__j+3,1)
        __soma += val(__segm) * __j
    next
next 

__dver := 11 - mod(__soma,11) 
__dver := iif(__dver=1 .or. __dver=10 .or. __dver=11,1,__dver) 

return alltrim(str(__dver,0))
Conforme os colega encontrarem instrução e os gifs adequados para cada banco, poderiamos constituir a impressão de diversos bancos através deste tópico. Desta forma disponibilizando a todos os diferentes bancos.

Enviado: 20 Dez 2007 10:52
por Maligno
Conforme os colega encontrarem instrução e os gifs adequados para cada banco
Detalhe: em bloquetos, a imagem do logotipo do banco não é necessária. É um detalhe estético opcional. Eu não perderia tempo com isso.

Enviado: 20 Dez 2007 13:05
por Pablo César
Eu procurei no fórum e econtrei duas formas de impressão do arquivo HTM. Uma é feito um aplicativo em xHarbour ora mencionado em: https://pctoledo.org/forum/viewto ... +htm#26380 e outra opção é utilizando o aplicativo PRWIN 2.4 do Wagner Nunes. Na falta de tal aplicativo xHarbour e pelo motivo do PRWIN não ser gratuito, teria alguma outro aplicativo que possa ser disponibilizado para todos de forma OPENSOURCE/FREEWARE a fim de imprimir arquivos HTM ?

Enviado: 20 Dez 2007 13:25
por Pablo César
Falo de um aplicativo para imprimir HTM para no caso que o programador decida fazer a geração de digamos 50 boletos e crie 50 arquivos, daí mandar tais arquivos um por um de forma automática e consecutivamente. No entanto também poderá fazer gerar os 50 boletos num só arquivo HTM e depois manualmente mandar para impressora. No entanto imagino que no final da página de cada par de boletos (são duas vias uma fica com o banco e outra com o cliente), terá que insirir um comando HTML para QUEBRA de página. Acho que é este o comando:

<br style="page-break-before:always">