fork download
  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | BoletoPhp - Versão Beta |
  4. // +----------------------------------------------------------------------+
  5. // | Este arquivo está disponível sob a Licença GPL disponível pela Web |
  6. // | em http://p...content-available-to-author-only...a.org/wiki/GNU_General_Public_License |
  7. // | Você deve ter recebido uma cópia da GNU Public License junto com |
  8. // | esse pacote; se não, escreva para: |
  9. // | |
  10. // | Free Software Foundation, Inc. |
  11. // | 59 Temple Place - Suite 330 |
  12. // | Boston, MA 02111-1307, USA. |
  13. // +----------------------------------------------------------------------+
  14.  
  15. // +----------------------------------------------------------------------+
  16. // | Originado do Projeto BBBoletoFree que tiveram colaborações de Daniel |
  17. // | William Schultz e Leandro Maniezo que por sua vez foi derivado do |
  18. // | PHPBoleto de João Prado Maia e Pablo Martins F. Costa |
  19. // | |
  20. // | Se vc quer colaborar, nos ajude a desenvolver p/ os demais bancos :-)|
  21. // | Acesse o site do Projeto BoletoPhp: www.boletophp.com.br |
  22. // +----------------------------------------------------------------------+
  23.  
  24. // +----------------------------------------------------------------------+
  25. // | Equipe Coordenação Projeto BoletoPhp: <boletophp@boletophp.com.br> |
  26. // | Desenvolvimento Boleto CEF: Elizeu Alcantara |
  27. // +----------------------------------------------------------------------+
  28.  
  29.  
  30. $codigobanco = "104";
  31. $codigo_banco_com_dv = geraCodigoBanco($codigobanco);
  32. $nummoeda = "9";
  33. $fator_vencimento = fator_vencimento($dadosboleto["data_vencimento"]);
  34.  
  35. //valor tem 10 digitos, sem virgula
  36. $valor = formata_numero($dadosboleto["valor_boleto"],10,0,"valor");
  37. //agencia é 4 digitos
  38. $agencia = formata_numero($dadosboleto["agencia"],4,0);
  39. //conta é 5 digitos
  40. $conta = formata_numero($dadosboleto["conta"],5,0);
  41. //dv da conta
  42. $conta_dv = formata_numero($dadosboleto["conta_dv"],1,0);
  43. //carteira é 2 caracteres
  44. $carteira = $dadosboleto["carteira"];
  45.  
  46. //nosso número (sem dv) é 10 digitos
  47. $nnum = $dadosboleto["inicio_nosso_numero"] . formata_numero($dadosboleto["nosso_numero"],8,0);
  48. //dv do nosso número
  49. $dv_nosso_numero = digitoVerificador_nossonumero($nnum);
  50. $nossonumero_dv ="$nnum$dv_nosso_numero";
  51.  
  52. //conta cedente (sem dv) é 11 digitos
  53. $conta_cedente = formata_numero($dadosboleto["conta_cedente"],11,0);
  54. //dv da conta cedente
  55. $conta_cedente_dv = formata_numero($dadosboleto["conta_cedente_dv"],1,0);
  56.  
  57. $ag_contacedente = $agencia . $conta_cedente;
  58.  
  59. // 43 numeros para o calculo do digito verificador do codigo de barras
  60. $dv = digitoVerificador_barra("$codigobanco$nummoeda$fator_vencimento$valor$nnum$ag_contacedente", 9, 0);
  61. // Numero para o codigo de barras com 44 digitos
  62. $linha = "$codigobanco$nummoeda$dv$fator_vencimento$valor$nnum$ag_contacedente";
  63.  
  64. $nossonumero = substr($nossonumero_dv,0,10).'-'.substr($nossonumero_dv,10,1);
  65. $agencia_codigo = $agencia." / ". $conta_cedente ."-". $conta_cedente_dv;
  66.  
  67.  
  68. $dadosboleto["codigo_barras"] = $linha;
  69. $dadosboleto["linha_digitavel"] = monta_linha_digitavel($linha);
  70. $dadosboleto["agencia_codigo"] = $agencia_codigo;
  71. $dadosboleto["nosso_numero"] = $nossonumero;
  72. $dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
  73.  
  74. function digitoVerificador_nossonumero($numero) {
  75. $resto2 = modulo_11($numero, 9, 1);
  76. $digito = 11 - $resto2;
  77. if ($digito == 10 || $digito == 11) {
  78. $dv = 0;
  79. } else {
  80. $dv = $digito;
  81. }
  82. return $dv;
  83. }
  84.  
  85.  
  86. function digitoVerificador_barra($numero) {
  87. $resto2 = modulo_11($numero, 9, 1);
  88. if ($resto2 == 0 || $resto2 == 1 || $resto2 == 10) {
  89. $dv = 1;
  90. } else {
  91. $dv = 11 - $resto2;
  92. }
  93. return $dv;
  94. }
  95.  
  96.  
  97. // FUNÇÕES
  98. // Algumas foram retiradas do Projeto PhpBoleto e modificadas para atender as particularidades de cada banco
  99.  
  100. function formata_numero($numero,$loop,$insert,$tipo = "geral") {
  101. if ($tipo == "geral") {
  102. $numero = str_replace(",","",$numero);
  103. while(strlen($numero)<$loop){
  104. $numero = $insert . $numero;
  105. }
  106. }
  107. if ($tipo == "valor") {
  108. /*
  109. retira as virgulas
  110. formata o numero
  111. preenche com zeros
  112. */
  113. $numero = str_replace(",","",$numero);
  114. while(strlen($numero)<$loop){
  115. $numero = $insert . $numero;
  116. }
  117. }
  118. if ($tipo == "convenio") {
  119. while(strlen($numero)<$loop){
  120. $numero = $numero . $insert;
  121. }
  122. }
  123. return $numero;
  124. }
  125.  
  126.  
  127. function fbarcode($valor){
  128.  
  129. $fino = 1 ;
  130. $largo = 3 ;
  131. $altura = 50 ;
  132.  
  133. $barcodes[0] = "00110" ;
  134. $barcodes[1] = "10001" ;
  135. $barcodes[2] = "01001" ;
  136. $barcodes[3] = "11000" ;
  137. $barcodes[4] = "00101" ;
  138. $barcodes[5] = "10100" ;
  139. $barcodes[6] = "01100" ;
  140. $barcodes[7] = "00011" ;
  141. $barcodes[8] = "10010" ;
  142. $barcodes[9] = "01010" ;
  143. for($f1=9;$f1>=0;$f1--){
  144. for($f2=9;$f2>=0;$f2--){
  145. $f = ($f1 * 10) + $f2 ;
  146. $texto = "" ;
  147. for($i=1;$i<6;$i++){
  148. $texto .= substr($barcodes[$f1],($i-1),1) . substr($barcodes[$f2],($i-1),1);
  149. }
  150. $barcodes[$f] = $texto;
  151. }
  152. }
  153.  
  154.  
  155. //Desenho da barra
  156.  
  157.  
  158. //Guarda inicial
  159. ?><img src=imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
  160. src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
  161. src=imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
  162. src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
  163. <?php
  164. $texto = $valor ;
  165. if((strlen($texto) % 2) <> 0){
  166. $texto = "0" . $texto;
  167. }
  168.  
  169. // Draw dos dados
  170. while (strlen($texto) > 0) {
  171. $i = round(esquerda($texto,2));
  172. $texto = direita($texto,strlen($texto)-2);
  173. $f = $barcodes[$i];
  174. for($i=1;$i<11;$i+=2){
  175. if (substr($f,($i-1),1) == "0") {
  176. $f1 = $fino ;
  177. }else{
  178. $f1 = $largo ;
  179. }
  180. ?>
  181. src=imagens/p.png width=<?php echo $f1?> height=<?php echo $altura?> border=0><img
  182. <?php
  183. if (substr($f,$i,1) == "0") {
  184. $f2 = $fino ;
  185. }else{
  186. $f2 = $largo ;
  187. }
  188. ?>
  189. src=imagens/b.png width=<?php echo $f2?> height=<?php echo $altura?> border=0><img
  190. <?php
  191. }
  192. }
  193.  
  194. // Draw guarda final
  195. ?>
  196. src=imagens/p.png width=<?php echo $largo?> height=<?php echo $altura?> border=0><img
  197. src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
  198. src=imagens/p.png width=<?php echo 1?> height=<?php echo $altura?> border=0>
  199. <?php
  200. } //Fim da função
  201.  
  202. function esquerda($entra,$comp){
  203. return substr($entra,0,$comp);
  204. }
  205.  
  206. function direita($entra,$comp){
  207. return substr($entra,strlen($entra)-$comp,$comp);
  208. }
  209.  
  210. function fator_vencimento($data) {
  211. $data = explode("/",$data);
  212. $ano = $data[2];
  213. $mes = $data[1];
  214. $dia = $data[0];
  215. return(abs((_dateToDays("1997","10","07")) - (_dateToDays($ano, $mes, $dia))));
  216. }
  217.  
  218. function _dateToDays($year,$month,$day) {
  219. $century = substr($year, 0, 2);
  220. $year = substr($year, 2, 2);
  221. if ($month > 2) {
  222. $month -= 3;
  223. } else {
  224. $month += 9;
  225. if ($year) {
  226. $year--;
  227. } else {
  228. $year = 99;
  229. $century --;
  230. }
  231. }
  232. return ( floor(( 146097 * $century) / 4 ) +
  233. floor(( 1461 * $year) / 4 ) +
  234. floor(( 153 * $month + 2) / 5 ) +
  235. $day + 1721119);
  236. }
  237.  
  238. function modulo_10($num) {
  239. $numtotal10 = 0;
  240. $fator = 2;
  241.  
  242. // Separacao dos numeros
  243. for ($i = strlen($num); $i > 0; $i--) {
  244. // pega cada numero isoladamente
  245. $numeros[$i] = substr($num,$i-1,1);
  246. // Efetua multiplicacao do numero pelo (falor 10)
  247. $temp = $numeros[$i] * $fator;
  248. $temp0=0;
  249. foreach (preg_split('//',$temp,-1,PREG_SPLIT_NO_EMPTY) as $k=>$v){ $temp0+=$v; }
  250. $parcial10[$i] = $temp0; //$numeros[$i] * $fator;
  251. // monta sequencia para soma dos digitos no (modulo 10)
  252. $numtotal10 += $parcial10[$i];
  253. if ($fator == 2) {
  254. $fator = 1;
  255. } else {
  256. $fator = 2; // intercala fator de multiplicacao (modulo 10)
  257. }
  258. }
  259.  
  260. // várias linhas removidas, vide função original
  261. // Calculo do modulo 10
  262. $resto = $numtotal10 % 10;
  263. $digito = 10 - $resto;
  264. if ($resto == 0) {
  265. $digito = 0;
  266. }
  267.  
  268. return $digito;
  269.  
  270. }
  271.  
  272. function modulo_11($num, $base=9, $r=0) {
  273. /**
  274.   * Autor:
  275.   * Pablo Costa <pablo@users.sourceforge.net>
  276.   *
  277.   * Função:
  278.   * Calculo do Modulo 11 para geracao do digito verificador
  279.   * de boletos bancarios conforme documentos obtidos
  280.   * da Febraban - www.febraban.org.br
  281.   *
  282.   * Entrada:
  283.   * $num: string numérica para a qual se deseja calcularo digito verificador;
  284.   * $base: valor maximo de multiplicacao [2-$base]
  285.   * $r: quando especificado um devolve somente o resto
  286.   *
  287.   * Saída:
  288.   * Retorna o Digito verificador.
  289.   *
  290.   * Observações:
  291.   * - Script desenvolvido sem nenhum reaproveitamento de código pré existente.
  292.   * - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.
  293.   */
  294.  
  295. $soma = 0;
  296. $fator = 2;
  297.  
  298. /* Separacao dos numeros */
  299. for ($i = strlen($num); $i > 0; $i--) {
  300. // pega cada numero isoladamente
  301. $numeros[$i] = substr($num,$i-1,1);
  302. // Efetua multiplicacao do numero pelo falor
  303. $parcial[$i] = $numeros[$i] * $fator;
  304. // Soma dos digitos
  305. $soma += $parcial[$i];
  306. if ($fator == $base) {
  307. // restaura fator de multiplicacao para 2
  308. $fator = 1;
  309. }
  310. $fator++;
  311. }
  312.  
  313. /* Calculo do modulo 11 */
  314. if ($r == 0) {
  315. $soma *= 10;
  316. $digito = $soma % 11;
  317. if ($digito == 10) {
  318. $digito = 0;
  319. }
  320. return $digito;
  321. } elseif ($r == 1){
  322. $resto = $soma % 11;
  323. return $resto;
  324. }
  325. }
  326.  
  327. function monta_linha_digitavel($codigo) {
  328.  
  329. // Posição Conteúdo
  330. // 1 a 3 Número do banco
  331. // 4 Código da Moeda - 9 para Real
  332. // 5 Digito verificador do Código de Barras
  333. // 6 a 9 Fator de Vencimento
  334. // 10 a 19 Valor (8 inteiros e 2 decimais)
  335. // 20 a 44 Campo Livre definido por cada banco (25 caracteres)
  336.  
  337. // 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições
  338. // do campo livre e DV (modulo10) deste campo
  339. $p1 = substr($codigo, 0, 4);
  340. $p2 = substr($codigo, 19, 5);
  341. $p3 = modulo_10("$p1$p2");
  342. $p4 = "$p1$p2$p3";
  343. $p5 = substr($p4, 0, 5);
  344. $p6 = substr($p4, 5);
  345. $campo1 = "$p5.$p6";
  346.  
  347. // 2. Campo - composto pelas posiçoes 6 a 15 do campo livre
  348. // e livre e DV (modulo10) deste campo
  349. $p1 = substr($codigo, 24, 10);
  350. $p2 = modulo_10($p1);
  351. $p3 = "$p1$p2";
  352. $p4 = substr($p3, 0, 5);
  353. $p5 = substr($p3, 5);
  354. $campo2 = "$p4.$p5";
  355.  
  356. // 3. Campo composto pelas posicoes 16 a 25 do campo livre
  357. // e livre e DV (modulo10) deste campo
  358. $p1 = substr($codigo, 34, 10);
  359. $p2 = modulo_10($p1);
  360. $p3 = "$p1$p2";
  361. $p4 = substr($p3, 0, 5);
  362. $p5 = substr($p3, 5);
  363. $campo3 = "$p4.$p5";
  364.  
  365. // 4. Campo - digito verificador do codigo de barras
  366. $campo4 = substr($codigo, 4, 1);
  367.  
  368. // 5. Campo composto pelo fator vencimento e valor nominal do documento, sem
  369. // indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
  370. // tratar de valor zerado, a representacao deve ser 000 (tres zeros).
  371. $p1 = substr($codigo, 5, 4);
  372. $p2 = substr($codigo, 9, 10);
  373. $campo5 = "$p1$p2";
  374.  
  375. return "$campo1 $campo2 $campo3 $campo4 $campo5";
  376. }
  377.  
  378. function geraCodigoBanco($numero) {
  379. $parte1 = substr($numero, 0, 3);
  380. $parte2 = modulo_11($parte1);
  381. return $parte1 . "-" . $parte2;
  382. }
  383.  
  384. ?>
  385.  
Success #stdin #stdout #stderr 0.02s 24448KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 33
PHP Notice:  Undefined offset: 2 in /home/RJuh9o/prog.php on line 212
PHP Notice:  Undefined offset: 1 in /home/RJuh9o/prog.php on line 213
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 36
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 38
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 40
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 42
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 44
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 47
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 47
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 53
PHP Notice:  Undefined variable: dadosboleto in /home/RJuh9o/prog.php on line 55