I have some problems generating bulk tickets using the BoletoPHP open source system, as I need to have hundreds of tickets generated in a script through information coming from the Database.
These tickets are stored on the server inside a folder where I can download them later or send them by email.
But I'm having problems with the information coming from Function_itau, since the barcode line is coming with a single registration value on all tickets.
And this system should generate 126 ticket currently but it is only generating 44 because of the ob_start () function where I tested it by removing it and all 126 bank records are generated but does not show the ticket in the pdf.
I ask the help of someone who knows how to solve this problem, which is apparently simple, but I'm having problems.
File Generating Ticket
<?php
$mysqli = new mysqli("localhost", "", "", "");
$query = "SELECT * FROM gerar_boleto";
$query2 = "SELECT * FROM boletos_gerados ORDER BY id DESC";
$result = $mysqli->query($query);
$result2 = $mysqli->query($query2);
$row2 = $result2->fetch_assoc();
$nosso_Numero = $row2['nosso_numero'];
while ($row = $result->fetch_assoc()) {
$valores = $row['valor_boleto'];
$cliente = $row['cliente'];
$cnpj = $row['cnpj'];
$email = $row['email'];
$documento = $row['documento'];
$vencimento = $row['data_vencimento'];
$data_vencimento = date("d/m/Y",strtotime("$vencimento"));
$documento = $row['data_documento'];
$data_documento = date("d/m/Y",strtotime("$documento"));
$vencimento_remessa = date("Y-m-d",strtotime("$vencimento"));
$documento_remessa = date("Y-m-d",strtotime("$documento"));
$endereco = $row['endereco'];
$bairro = $row['bairro'];
$cep = $row['cep'];
$cidade = $row['cidade'];
$estado = $row['estado'];
$id = $row['id'];
$data = date('m');
$numero_Documento = "CONT-".date('m')."/".date('Y');
$posicao_Numero = '320000'.$id;
$data_atual = date("Y");
$registro = $posicao_Numero;
// DADOS DO BOLETO PARA O SEU CLIENTE
$dias_de_prazo_para_pagamento = 0;
$taxa_boleto = "0,00";
$data_venc = $data_vencimento; // Prazo de X dias OU informe data: "13/04/2006";
$valor_cobrado = $valores; // Valor - REGRA: Sem pontos na milhar e tanto faz com "." ou "," ou com 1 ou 2 ou sem casa decimal
$valor_cobrado = str_replace(",", ".",$valor_cobrado);
$valor_boleto=number_format($valor_cobrado+$taxa_boleto, 2, ',', '');
$dadosboleto["nosso_numero"] = $posicao_Numero; // Nosso numero - REGRA: M�ximo de 8 caracteres!
$dadosboleto["numero_documento"] = $numero_Documento; // Num do pedido ou nosso numero
$dadosboleto["data_vencimento"] = $data_venc; // Data de Vencimento do Boleto - REGRA: Formato DD/MM/AAAA
$dadosboleto["data_documento"] = $data_documento; // Data de emiss�o do Boleto
$dadosboleto["data_processamento"] = $data_documento; // Data de processamento do boleto (opcional)
$dadosboleto["valor_boleto"] = $valores; // Valor do Boleto - REGRA: Com v�rgula e sempre com duas casas depois da virgula
// DADOS DO SEU CLIENTE
$dadosboleto["sacado"] = $cliente .' - '. $cnpj;
$dadosboleto["endereco1"] = $endereco. '-' .$bairro;
$dadosboleto["endereco2"] = $cidade. '-'. $estado. '- CEP:'. $cep;
// INFORMACOES PARA O CLIENTE
$dadosboleto["demonstrativo1"] = "Filiação - ";
$dadosboleto["demonstrativo2"] = "Contribuição REF. JANEIRO/2019";
$dadosboleto["demonstrativo3"] = " - https://www..org.br";
$dadosboleto["instrucoes1"] = "- Sr. Caixa, não receber após o vencimento";
$dadosboleto["instrucoes2"] = "";
$dadosboleto["instrucoes3"] = "- Em caso de dúvidas entre em contato conosco: ";
$dadosboleto["instrucoes4"] = " Emitido por ";
// DADOS OPCIONAIS DE ACORDO COM O BANCO OU CLIENTE
$dadosboleto["quantidade"] = "1";
$dadosboleto["valor_unitario"] = $valores;
$dadosboleto["aceite"] = "S";
$dadosboleto["especie"] = "R$";
$dadosboleto["especie_doc"] = "R$";
// ---------------------- DADOS FIXOS DE CONFIGURAÇÃO DO SEU BOLETO --------------- //
// DADOS DA SUA CONTA - SICREDI
$dadosboleto["agencia"] = "1111"; // Num da agencia, sem digito
$dadosboleto["conta"] = "22222"; // Num da conta, sem digito
$dadosboleto["conta_dv"] = "2"; // Digito do Num da conta
// DADOS PERSONALIZADOS - SICREDI
$dadosboleto["carteira"] = "109";
// SEUS DADOS
$dadosboleto["identificacao"] = "NOME";
$dadosboleto["cpf_cnpj"] = "CNPJ";
$dadosboleto["endereco"] = "ENDEREÇO";
$dadosboleto["cidade_uf"] = "CIDADE / ESTADO";
$dadosboleto["cedente"] = "CEDENTE";
ob_start();
// NÃO ALTERAR!
include_once("include/funcoes_itau.php");
include("include/layout_sicredi.php");
$content = ob_get_clean();
// convert
require_once(dirname(__FILE__).'/html2pdf/html2pdf.class.php');
try
{
$html2pdf = new HTML2PDF('P','A4','fr', array(0, 0, 0, 0));
/* Abre a tela de impressão */
//$html2pdf->pdf->IncludeJS("print(true);");
$html2pdf->pdf->SetDisplayMode('real');
/* Parametro vuehtml = true desabilita o pdf para desenvolvimento do layout */
$html2pdf->writeHTML($content, isset($_GET['vuehtml']));
/* Abrir no navegador */
//$html2pdf->Output('boleto.pdf');
mkdir('boletos/'.date('m-Y'));
/* Salva o PDF no servidor para enviar por email */
$html2pdf->Output('boletos/'.date('m-Y').'/'.$id.'.pdf', 'F');
/* Força o download no browser */
//$html2pdf->Output('boleto'.$id.'.pdf', 'D');
}
catch(HTML2PDF_exception $e) {
echo $e;
exit;
}
/*
// Inclui o arquivo class.phpmailer.php localizado na pasta class
require_once("PHPMailer_5.2.0/class.phpmailer.php");
// Inicia a classe PHPMailer
$mail = new PHPMailer(true);
// Define os dados do servidor e tipo de conexão
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->IsSMTP(); // Define que a mensagem será SMTP
try {
$mail->Host = ''; // Endereço do servidor SMTP (Autenticação, utilize o host smtp.seudomínio.com.br)
$mail->SMTPAuth = true; // Usar autenticação SMTP (obrigatório para smtp.seudomínio.com.br)
$mail->Port = 587; // Usar 587 porta SMTP
$mail->Username = ''; // Usuário do servidor SMTP (endereço de email)
$mail->Password = ''; // Senha do servidor SMTP (senha do email usado)
//Define o remetente
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->SetFrom('', ''); //Seu e-mail
$mail->AddReplyTo('', ''); //Seu e-mail
$mail->CharSet = 'utf-8';
$mail->Subject = '';//Assunto do e-mail
//Define os destinatário(s)
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->AddAddress($email, $cliente);
//Campos abaixo são opcionais
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//$mail->AddCC('[email protected]', 'Destinatario'); // Copia
//$mail->AddBCC('[email protected]', 'Destinatario2''); // Cópia Oculta
$mail->AddAttachment('boletos/'.date('m-Y').'/'.$cliente.'.pdf'); // Adicionar um anexo
//Define o corpo do email
$mail->MsgHTML("<p>Bom dia</p>
<p>Prezada Filiada,</p>
<p></p>
<p>Segue em anexo boleto referente a contribuição,</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>Dúvidas estou à disposição</p>
<p>Atenciosamente</p>
<table border='0' cellpadding='0' cellspacing='0' style='width:347px;' width='347'>
<tbody>
<tr>
<td style='width:205px;height:86px;'>
<p>
<img alt='dezembro laranja' height='68' src='https://www.SITE.org.br/mail.jpg' width='217' /></p>
</td>
<td style='width:142px;height:86px;'>
<p>
<strong></strong></p>
<p>
<strong><em></em></strong></p>
<p>
<strong></strong></p>
<p>
</td>
</tr>
</tbody>
</table>
<p>
</p>
");
////Caso queira colocar o conteudo de um arquivo utilize o método abaixo ao invés da mensagem no corpo do e-mail.
//$mail->MsgHTML(file_get_contents('arquivo.html'));
$mail->Send();
echo "Mensagem enviada com sucesso</p>\n";
//caso apresente algum erro é apresentado abaixo com essa exceção.
}catch (phpmailerException $e) {
echo $e->errorMessage(); //Mensagem de erro costumizada do PHPMailer
}
*/
$sql="INSERT INTO boletos_gerados (id,nosso_numero, numero_documento, data_vencimento, data_documento, valor_boleto, id_cliente) VALUES ('','$registro','$numero_Documento','$data_vencimento','$data_documento','$valores','$id')";
$insert = $mysqli->query($sql);
$sql2="INSERT INTO boleto_filiadas (id,nosso_numero, numero_documento, data_vencimento, data_documento, valor, nome_cliente, tipo_documento, documento, logradouro, bairro, cep, cidade, estado) VALUES ('','$registro','$numero_Documento','$vencimento_remessa','$documento_remessa','$valores','$cliente','CNPJ','$cnpj','$endereco', '$bairro', '$cep', '$cidade', '$estado')";
$insert2 = $mysqli->query($sql2);
}
File that has function to generate barcode line.
<?php
// +----------------------------------------------------------------------+
// | BoletoPhp - Versão Beta |
// +----------------------------------------------------------------------+
// | Este arquivo está disponível sob a Licença GPL disponível pela Web |
// | em http://pt.wikipedia.org/wiki/GNU_General_Public_License |
// | Você deve ter recebido uma cópia da GNU Public License junto com |
// | esse pacote; se não, escreva para: |
// | |
// | Free Software Foundation, Inc. |
// | 59 Temple Place - Suite 330 |
// | Boston, MA 02111-1307, USA. |
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | Originado do Projeto BBBoletoFree que tiveram colaborações de Daniel |
// | William Schultz e Leandro Maniezo que por sua vez foi derivado do |
// | PHPBoleto de João Prado Maia e Pablo Martins F. Costa |
// | |
// | Se você quer colaborar, nos ajude a desenvolver p/ os demais bancos :-)|
// | Acesse o site do Projeto BoletoPhp: www.boletophp.com.br |
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | Equipe Coordenação Projeto BoletoPhp: <[email protected]> |
// | Desenvolvimento Boleto Itaú: Glauber Portella |
// +----------------------------------------------------------------------+
$codigobanco = "341";
$codigo_banco_com_dv = geraCodigoBanco($codigobanco);
$nummoeda = "9";
$fator_vencimento = fator_vencimento($dadosboleto["data_vencimento"]);
//valor tem 10 digitos, sem virgula
$valor = formata_numero($valores,10,0,"valor");
//agencia é 4 digitos
$agencia = formata_numero($dadosboleto["agencia"],4,0);
//conta é 5 digitos + 1 do dv
$conta = formata_numero($dadosboleto["conta"],5,0);
$conta_dv = formata_numero($dadosboleto["conta_dv"],1,0);
//carteira 175
$carteira = $dadosboleto["carteira"];
//nosso_numero no maximo 8 digitos
$nnum = formata_numero($dadosboleto["nosso_numero"],8,0);
$codigo_barras = $codigobanco.$nummoeda.$fator_vencimento.$valor.$carteira.$nnum.modulo_10($agencia.$conta.$carteira.$nnum).$agencia.$conta.modulo_10($agencia.$conta).'000';
// 43 numeros para o calculo do digito verificador
$dv = digitoVerificador_barra($codigo_barras);
// Numero para o codigo de barras com 44 digitos
$linha = substr($codigo_barras,0,4).$dv.substr($codigo_barras,4,43);
$nossonumero = $carteira.'/'.$nnum.'-'.modulo_10($agencia.$conta.$carteira.$nnum);
$agencia_codigo = $agencia." / ". $conta."-".modulo_10($agencia.$conta);
$dadosboleto["codigo_barras"] = $linha;
$dadosboleto["linha_digitavel"] = monta_linha_digitavel($linha); // verificar
$dadosboleto["agencia_codigo"] = $agencia_codigo ;
$dadosboleto["nosso_numero"] = $nossonumero;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
// FUNÇÕES
// Algumas foram retiradas do Projeto PhpBoleto e modificadas para atender as particularidades de cada banco
function digitoVerificador_barra($numero) {
$resto2 = modulo_11($numero, 9, 1);
$digito = 11 - $resto2;
if ($digito == 0 || $digito == 1 || $digito == 10 || $digito == 11) {
$dv = 1;
} else {
$dv = $digito;
}
return $dv;
}
function formata_numero($numero,$loop,$insert,$tipo = "geral") {
if ($tipo == "geral") {
$numero = str_replace(",","",$numero);
while(strlen($numero)<$loop){
$numero = $insert . $numero;
}
}
if ($tipo == "valor") {
/*
retira as virgulas
formata o numero
preenche com zeros
*/
$numero = str_replace(",","",$numero);
while(strlen($numero)<$loop){
$numero = $insert . $numero;
}
}
if ($tipo == "convenio") {
while(strlen($numero)<$loop){
$numero = $numero . $insert;
}
}
return $numero;
}
function fbarcode($valor){
$fino = 1 ;
$largo = 3 ;
$altura = 50 ;
$barcodes[0] = "00110" ;
$barcodes[1] = "10001" ;
$barcodes[2] = "01001" ;
$barcodes[3] = "11000" ;
$barcodes[4] = "00101" ;
$barcodes[5] = "10100" ;
$barcodes[6] = "01100" ;
$barcodes[7] = "00011" ;
$barcodes[8] = "10010" ;
$barcodes[9] = "01010" ;
for($f1=9;$f1>=0;$f1--){
for($f2=9;$f2>=0;$f2--){
$f = ($f1 * 10) + $f2 ;
$texto = "" ;
for($i=1;$i<6;$i++){
$texto .= substr($barcodes[$f1],($i-1),1) . substr($barcodes[$f2],($i-1),1);
}
$barcodes[$f] = $texto;
}
}
//Desenho da barra
//Guarda inicial
?><img src=imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=imagens/p.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
<?php
$texto = $valor ;
if((strlen($texto) % 2) <> 0){
$texto = "0" . $texto;
}
// Draw dos dados
while (strlen($texto) > 0) {
$i = round(esquerda($texto,2));
$texto = direita($texto,strlen($texto)-2);
$f = $barcodes[$i];
for($i=1;$i<11;$i+=2){
if (substr($f,($i-1),1) == "0") {
$f1 = $fino ;
}else{
$f1 = $largo ;
}
?>
src=imagens/p.png width=<?php echo $f1?> height=<?php echo $altura?> border=0><img
<?php
if (substr($f,$i,1) == "0") {
$f2 = $fino ;
}else{
$f2 = $largo ;
}
?>
src=imagens/b.png width=<?php echo $f2?> height=<?php echo $altura?> border=0><img
<?php
}
}
// Draw guarda final
?>
src=imagens/p.png width=<?php echo $largo?> height=<?php echo $altura?> border=0><img
src=imagens/b.png width=<?php echo $fino?> height=<?php echo $altura?> border=0><img
src=imagens/p.png width=<?php echo 1?> height=<?php echo $altura?> border=0>
<?php
} //Fim da função
function esquerda($entra,$comp){
return substr($entra,0,$comp);
}
function direita($entra,$comp){
return substr($entra,strlen($entra)-$comp,$comp);
}
function fator_vencimento($data) {
$data = explode("/",$data);
$ano = $data[2];
$mes = $data[1];
$dia = $data[0];
return(abs((_dateToDays("1997","10","07")) - (_dateToDays($ano, $mes, $dia))));
}
function _dateToDays($year,$month,$day) {
$century = substr($year, 0, 2);
$year = substr($year, 2, 2);
if ($month > 2) {
$month -= 3;
} else {
$month += 9;
if ($year) {
$year--;
} else {
$year = 99;
$century --;
}
}
return ( floor(( 146097 * $century) / 4 ) +
floor(( 1461 * $year) / 4 ) +
floor(( 153 * $month + 2) / 5 ) +
$day + 1721119);
}
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)
// 2002-07-07 01:33:34 Macete para adequar ao Mod10 do Itaú
$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=9, $r=0) {
/**
* Autor:
* Pablo Costa <[email protected]>
*
* Função:
* Calculo do Modulo 11 para geracao do digito verificador
* de boletos bancarios conforme documentos obtidos
* da Febraban - www.febraban.org.br
*
* Entrada:
* $num: string numérica para a qual se deseja calcularo digito verificador;
* $base: valor maximo de multiplicacao [2-$base]
* $r: quando especificado um devolve somente o resto
*
* Saída:
* Retorna o Digito verificador.
*
* Observações:
* - Script desenvolvido sem nenhum reaproveitamento de código pré existente.
* - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.
*/
$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;
}
}
// Alterada por Glauber Portella para especificação do Itaú
function monta_linha_digitavel($codigo) {
// campo 1
$banco = substr($codigo,0,3);
$moeda = substr($codigo,3,1);
$ccc = substr($codigo,19,3);
$ddnnum = substr($codigo,22,2);
$dv1 = modulo_10($banco.$moeda.$ccc.$ddnnum);
// campo 2
$resnnum = substr($codigo,24,6);
$dac1 = substr($codigo,30,1);//modulo_10($agencia.$conta.$carteira.$nnum);
$dddag = substr($codigo,31,3);
$dv2 = modulo_10($resnnum.$dac1.$dddag);
// campo 3
$resag = substr($codigo,34,1);
$contadac = substr($codigo,35,6); //substr($codigo,35,5).modulo_10(substr($codigo,35,5));
$zeros = substr($codigo,41,3);
$dv3 = modulo_10($resag.$contadac.$zeros);
// campo 4
$dv4 = substr($codigo,4,1);
// campo 5
$fator = substr($codigo,5,4);
$valor = substr($codigo,9,10);
$campo1 = substr($banco.$moeda.$ccc.$ddnnum.$dv1,0,5) . '.' . substr($banco.$moeda.$ccc.$ddnnum.$dv1,5,5);
$campo2 = substr($resnnum.$dac1.$dddag.$dv2,0,5) . '.' . substr($resnnum.$dac1.$dddag.$dv2,5,6);
$campo3 = substr($resag.$contadac.$zeros.$dv3,0,5) . '.' . substr($resag.$contadac.$zeros.$dv3,5,6);
$campo4 = $dv4;
$campo5 = $fator.$valor;
return "$campo1 $campo2 $campo3 $campo4 $campo5";
}
function geraCodigoBanco($numero) {
$parte1 = substr($numero, 0, 3);
$parte2 = modulo_11($parte1);
return $parte1 . "-" . $parte2;
}
?>