Geração de Codigo de Boleto
04/04/2016
0
Boa tarde galera, estou com um problema ao gerar o código de um boleto, será que alguém pode me ajudar, o problema é o seguinte:
Eu informo todos os dados para a geração do boleto, porém existe um código verificador dos códigos que não batem de jeito nenhum, vou colocar os dados para vcs entenderem melhor.
No boleto da Caixa o código de barras é
86680000002-2 02000703071-9 92015022500-0 00018211599-8
porém no que eu gero vem com o seguinte número:
86600000002-0 02000703071-9 92015022500-0 00018211599-8
o valor de pagamento do cliente é de 20 reais com vencimento para 25/02/2015 e o código do cliente é 1821. estou usando esta data e valor inicialmente para fazer os testes, pois já tenho um boleto deste funcionando antes de eu gerar o arquivo.
Vlw galera, conto com a ajuda de vcs.
Eu informo todos os dados para a geração do boleto, porém existe um código verificador dos códigos que não batem de jeito nenhum, vou colocar os dados para vcs entenderem melhor.
No boleto da Caixa o código de barras é
86680000002-2 02000703071-9 92015022500-0 00018211599-8
porém no que eu gero vem com o seguinte número:
86600000002-0 02000703071-9 92015022500-0 00018211599-8
o valor de pagamento do cliente é de 20 reais com vencimento para 25/02/2015 e o código do cliente é 1821. estou usando esta data e valor inicialmente para fazer os testes, pois já tenho um boleto deste funcionando antes de eu gerar o arquivo.
// aqui é a gravação dos dados para poder gerar o boleto <? session_start(); import_request_variables("gp"); include 'db.php'; db_connect() or die ("Erro ao tentar conectar ao banco de dados. Erro: ".mysql_error()); include 'funcoes_cef.php'; $dadosboleto["cnpj"]="07030719000114"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Pagamento</title> <link href="estilos.css" rel="stylesheet" type="text/css" /> <STYLE TYPE="text/css"> .folha { page-break-after:always; } <!--.cp { font: bold 10px Arial; color: black} <!--.ti { font: 9px Arial, Helvetica, sans-serif} <!--.ld { font: bold 15px Arial; color: #000000} <!--.ct { FONT: 9px "Arial Narrow"; COLOR: #000033} <!--.cn { FONT: 9px Arial; COLOR: black } <!--.bc { font: bold 20px Arial; color: #000000 } <!--.ld2 { font: bold 12px Arial; color: #000000 } --> </STYLE> </head> <body> <div id="print" align="right" style="border:1px gray solid;margin-bottom:10px;padding:3px;background-color:#FFFFCC;font-family:Arial;font"> <input type="button" style="border:1px black solid;" onClick="javascript:history.go(-2);" value="Voltar"> <input type="button" style="border:1px black solid;" onClick="document.getElementById('print').style.display='none';window.print(); document.getElementById('print').style.display='inline';" value="Imprimir"><br> </div> <div class='folha'> <? $dadosboleto["data_vencimento"]=$vencimento; list($dia, $mes, $ano)=explode("/", $vencimento); $vencimento="$ano-$mes-$dia"; $diacerto=""; $instrucoes="NÃO RECEBER APÓS O VENCIMENTO."; $ccc=mysql_query("select codigo, nome, endereco, bairro, cidade, cep, uf, numero, complemento, plano from clientes where codigo='$codcliente' ") or die ("Erro: ".mysql_error()); list($codigo, $dadosboleto["nomecliente"], $endereco, $bairro, $cidade, $cep, $uf, $numero, $complemento, $plano)=mysql_fetch_array($ccc); $dadosboleto["endereco1"]="$endereco $numero $complemento $bairro"; $dadosboleto["endereco2"]="$cep $cidade $uf"; ?> <table width="745" border="0" height="270"> <tr> <td height="20" colspan="3" class="lista2">ASSOCIACAO BRAS. BEN. DE APOIO AO CIDADÃO</td> <td width="381" rowspan="5" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr class="style7"> <td height="25" style="border-bottom:1.2px #000000 solid">Dependentes</td> <td style="border-bottom:1.2px #000000 solid">Parentesco</td> </tr> <? $ssql = mysql_query("select nome, parentesco from dependentes where codcliente='$codcliente' order by nome asc ") or die ("Erro: ".mysql_error()); while ($linha=mysql_fetch_array($ssql)){ list($dependente, $parentesco)=$linha; echo "<tr class=lista2> <td height='22'>$dependente</td> <td>$parentesco</td> </tr>"; } ?> </table></td> </tr> <tr> <td width="70" height="20"> </td> <td width="83" class="lista3">Associado(a)</td> <td width="193" align="right" class="textotitulo"><? echo str_pad($codigo, 9, "0", STR_PAD_LEFT); ?></td> </tr> <tr> <td width="72" height="50"> </td> <td colspan="2" valign="top" class="lista3"><? echo $dadosboleto["nomecliente"]."<br>$endereco, $numero $complemento <br> $bairro <br> $cep $cidade $uf"; ?></td> </tr> <tr> <td width="72"> </td> <td colspan="2"> </td> </tr> <tr> <td colspan="3"><p class="lista3">Para reemissão deste carnê será cobrada uma taxa de R$ 2,00 (Dois Reais)</p> <p class="textotitulo">ABBAC</p></td> </tr> </table> </div> <div class="folha"> <? $valoranterior=$valor; $nossonumero=$codigo.substr($vencimento, 2,2)."99"; $resultao=mysql_query("select adesao from plano where codigo='$plano' ") or die ("Erro: ".mysql_error()); list($adesao)=mysql_fetch_array($resultao); if (empty($adesao) or $adesao==0){ $adesao=10; } $TAXAUNICA=(((pravalor($valor))*12)*0.8)+$adesao; $result=mysql_query("insert into prestacoes (codcliente, nossonumero, parcela, emissao, valor, vencimento, usuariocad) values ( '$codcliente', '$nossonumero', 'UNICA', '".date("Y-m-d")."', '".$TAXAUNICA."', '$vencimento', '$_SESSION[login]')") or die ("Erro: ".mysql_error()); $dadosboleto["nosso_numero"]=str_pad($nossonumero, 13, "0", STR_PAD_LEFT); $parcela="UNICA"; $dadosboleto["valor_boleto"]=number_format($TAXAUNICA, 2, ",","."); include 'layout_cef.php'; unset($dadosboleto["valor_boleto"]); $instrucoes="APÓS 5 DIAS DE VENCIDO COBRAR JUROS DE 0,33% AO DIA."; for ($x=1; $x<=$parcelas; $x++){ $nossonumero=$codigo.substr($vencimento, 2,2).substr($vencimento, 5,2); if ($x==1){ $valor=number_format((pravalor($valor)+$adesao),2,",","."); $dadosboleto["valor_boleto"]=$valor; } else { $valor=$valoranterior; $dadosboleto["valor_boleto"]=$valor; } /* $valor=number_format($valor,2,",","."); $dadosboleto["valor_boleto"]=number_format($valor,2,",","."); $valor=number_format($x,2,",","."); $dadosboleto["valor_boleto"]=number_format($x,2,",","."); */ $result=mysql_query("insert into prestacoes (codcliente, nossonumero, parcela, emissao, valor, vencimento, usuariocad) values ( '$codcliente', '$nossonumero', '$x/$parcelas', '".date("Y-m-d")."', '".pravalor($valor)."', '$vencimento', '$_SESSION[login]')") or die ("Erro: ".mysql_error()); $adesao=0; $dadosboleto["nosso_numero"]=str_pad($nossonumero, 13, "0", STR_PAD_LEFT); $parcela="$x/$parcelas"; list($ano, $mes, $dia)=explode("-", $vencimento); $dadosboleto["data_vencimento"]="$dia/$mes/$ano"; //****** isso aqui não tinha ******//// echo "</div><div class='folha'>"; //***** depois ver se vai tirar esta linha de cima ****//// include 'layout_cefteste.php'; //if ($x==2 or $x==6 or $x==10){ echo "</div><div class='folha'>"; //} $mes++; if ($mes>12){ $mes=01; $ano++; } if ($mes==2 and $dia>28){ $diacerto=$dia; $dia=28; } if (($mes==4 or $mes==6 or $mes==9 or $mes==11) and $dia>30){ $diacerto=$dia; $dia=30; } $vencimento= $ano."-".str_pad($mes, 2, "0", STR_PAD_LEFT)."-".$dia; if ($diacerto!=""){ $dia=$diacerto; $diacerto=""; } } mysql_free_result($ccc); ?> </div> </body> </html> // aqui é quando eu chamo o layout <? $codigobanco = "104"; $codigo_banco_com_dv = geraCodigoBanco($codigobanco); $nummoeda = "86"; if ($parcela=="UNICA"){ $terceironum=6; } else { $terceironum=7; } list($dia, $mes, $ano)=explode("/", $dadosboleto["data_vencimento"]); $fator_vencimento = "$ano$mes$dia"; //valor tem 10 digitos, sem virgula $valorbol = formata_numero($dadosboleto["valor_boleto"],11,0,"valor"); //agencia é 4 digitos $cnpj = substr($dadosboleto["cnpj"],0,8); //conta é 5 digitos $conta = formata_numero($dadosboleto["conta"],5,0); //dv da conta $conta_dv = formata_numero($dadosboleto["conta_dv"],1,0); //carteira é 2 caracteres $nossonum = $dadosboleto["nosso_numero"]; //conta cedente (sem dv) com 11 digitos (Operacao de 3 digitos + Cedente de 8 digitos) $conta_cedente = formata_numero($dadosboleto["conta_cedente"],11,0); //dv da conta cedente $conta_cedente_dv = formata_numero($dadosboleto["conta_cedente_dv"],1,0); echo "$nummoeda$terceironum$valorbol$cnpj$fator_vencimento$nossonum"; $dv = digitoVerificador_barra("$nummoeda$terceironum$valorbol$cnpj$fator_vencimento$nossonum"); // Numero para o codigo de barras com 44 digitos $linha = "$nummoeda$terceironum$dv$valorbol$cnpj$fator_vencimento$nossonum"; $dadosboleto["codigo_barras"] = $linha; $dadosboleto["linha_digitavel"] = monta_linha_digitavelcar($linha); $dadosboleto["agencia_codigo"] = $agencia_codigo; $dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv; ?> //aqui são as funções function modulo_10($num) { $numtotal10 = 0; $fator = 2; // Separacao dos numeros for ($i = strlen($num); $i > 0; $i--) { // pega cada numero isoladamente $numeros[$i] = substr($num,$i-1,1); // Efetua multiplicacao do numero pelo (falor 10) $temp = $numeros[$i] * $fator; $temp0=0; foreach (preg_split('//',$temp,-1,PREG_SPLIT_NO_EMPTY) as $k=>$v){ $temp0+=$v; } $parcial10[$i] = $temp0; //$numeros[$i] * $fator; // monta sequencia para soma dos digitos no (modulo 10) $numtotal10 += $parcial10[$i]; if ($fator == 2) { $fator = 1; } else { $fator = 2; // intercala fator de multiplicacao (modulo 10) } } // várias linhas removidas, vide função original // Calculo do modulo 10 $resto = $numtotal10 % 10; $digito = 10 - $resto; if ($resto == 0) { $digito = 0; } return $digito; } function modulo_11($num, $base=43, $r=0) { $soma = 0; $fator = 2; /* Separacao dos numeros */ for ($i = strlen($num); $i > 0; $i--) { // pega cada numero isoladamente $numeros[$i] = substr($num,$i-1,1); // Efetua multiplicacao do numero pelo falor $parcial[$i] = $numeros[$i] * $fator; // Soma dos digitos $soma += $parcial[$i]; if ($fator == $base) { // restaura fator de multiplicacao para 2 $fator = 1; } $fator++; } /* Calculo do modulo 11 */ if ($r == 0) { $soma *= 10; $digito = $soma % 11; if ($digito == 10) { $digito = 0; } return $digito; } elseif ($r == 1){ $resto = $soma % 11; return $resto; } } function monta_linha_digitavel($codigo) { $p1 = substr($codigo, 0, 11); $p2 = modulo_11($p1); $campo1="$p1-$p2"; $p3 = substr($codigo, 11, 11); $p4 = modulo_10($p3); $campo2="$p3-$p4"; $p5 = substr($codigo, 22, 11); $p6 = modulo_10($p5); $campo3="$p5-$p6"; $p7 = substr($codigo, 33, 11); $p8 = modulo_10($p7); $campo4="$p7-$p8"; return "$campo1 $campo2 $campo3 $campo4"; }
Vlw galera, conto com a ajuda de vcs.
Carmélio
Curtir tópico
+ 0
Responder
Posts
05/04/2016
Marcio Araujo
É o gerador de código de boleto? Existem alguns posts sobre esse problema, já viu se algum deles pode te ajudar?
Responder
13/04/2016
Carmélio
teria como me passar um destes posts, o meu não é um boleto bancário como o Linha digitavel, é tipo um carnê, onde utilizo os padrões da febraban, quer q eu envie os arquivos para vc analisar?
Responder
Clique aqui para fazer login e interagir na Comunidade :)