You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
diff($data_vencimento)->days;
} else {
// Novo fator de vencimento (resetado para 1000 a partir de 21/02/2025)
$data_nova_base = new DateTime('2025-02-22');
return 1000 + $data_nova_base->diff($data_vencimento)->days;
}
}
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);
}
/*
#################################################
FUNÇÃO DO MÓDULO 10 RETIRADA DO PHPBOLETO
ESTA FUNÇÃO PEGA O DÍGITO VERIFICADOR DO PRIMEIRO, SEGUNDO
E TERCEIRO CAMPOS DA LINHA DIGITÁVEL
#################################################
*/
function modulo_10($num) {
$numtotal10 = 0;
$fator = 2;
for ($i = strlen($num); $i > 0; $i--) {
$numeros[$i] = substr($num,$i-1,1);
$parcial10[$i] = $numeros[$i] * $fator;
$numtotal10 .= $parcial10[$i];
if ($fator == 2) {
$fator = 1;
}
else {
$fator = 2;
}
}
$soma = 0;
for ($i = strlen($numtotal10); $i > 0; $i--) {
$numeros[$i] = substr($numtotal10,$i-1,1);
$soma += $numeros[$i];
}
$resto = $soma % 10;
$digito = 10 - $resto;
if ($resto == 0) {
$digito = 0;
}
return $digito;
}
/*
#################################################
FUNÇÃO DO MÓDULO 11 RETIRADA DO PHPBOLETO
MODIFIQUEI ALGUMAS COISAS...
ESTA FUNÇÃO PEGA O DÍGITO VERIFICADOR:
NOSSONUMERO
AGENCIA
CONTA
CAMPO 4 DA LINHA DIGITÁVEL
#################################################
*/
function modulo_11($num, $base=9, $r=0) {
$soma = 0;
$fator = 2;
for ($i = strlen($num); $i > 0; $i--) {
$numeros[$i] = substr($num,$i-1,1);
$parcial[$i] = $numeros[$i] * $fator;
$soma += $parcial[$i];
if ($fator == $base) {
$fator = 1;
}
$fator++;
}
if ($r == 0) {
$soma *= 10;
$digito = $soma % 11;
//corrigido
if ($digito == 10) {
$digito = "X";
}
/*
alterado por mim, Daniel Schultz
Vamos explicar:
O módulo 11 só gera os digitos verificadores do nossonumero,
agencia, conta e digito verificador com codigo de barras (aquele que fica sozinho e triste na linha digitável)
só que é foi um rolo...pq ele nao podia resultar em 0, e o pessoal do phpboleto se esqueceu disso...
No BB, os dígitos verificadores podem ser X ou 0 (zero) para agencia, conta e nosso numero,
mas nunca pode ser X ou 0 (zero) para a linha digitável, justamente por ser totalmente numérica.
Quando passamos os dados para a função, fica assim:
Agencia = sempre 4 digitos
Conta = até 8 dígitos
Nosso número = de 1 a 17 digitos
A unica variável que passa 17 digitos é a da linha digitada, justamente por ter 43 caracteres
Entao vamos definir ai embaixo o seguinte...
se (strlen($num) == 43) { não deixar dar digito X ou 0 }
*/
if (strlen($num) == "43") {
//então estamos checando a linha digitável
if ($digito == "0" or $digito == "X" or $digito > 9) {
$digito = 1;
}
}
return $digito;
}
elseif ($r == 1){
$resto = $soma % 11;
return $resto;
}
}
/*
Montagem da linha digitável - Função tirada do PHPBoleto
Não mudei nada
*/
function monta_linha_digitavel($linha) {
// Posição Conteúdo
// 1 a 3 Número do banco
// 4 Código da Moeda - 9 para Real
// 5 Digito verificador do Código de Barras
// 6 a 19 Valor (12 inteiros e 2 decimais)
// 20 a 44 Campo Livre definido por cada banco
// 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições
// do campo livre e DV (modulo10) deste campo
$p1 = substr($linha, 0, 4);
$p2 = substr($linha,19, 5); //19
$p3 = modulo_10("$p1$p2");
$p4 = "$p1$p2$p3";
$p5 = substr($p4, 0, 5);
$p6 = substr($p4, 5);
$campo1 = "$p5.$p6";
// echo " " .$linha. " ". $p1 . " " .$p2. " " .$p3. " " .$p4 . " " .$p5 . " " .$p6 . " " ;
// 2. Campo - composto pelas posiçoes 6 a 15 do campo livre
// e livre e DV (modulo10) deste campo
$p1 = substr($linha, 24, 10);
$p2 = modulo_10($p1);
$p3 = "$p1$p2";
$p4 = substr($p3, 0, 5);
$p5 = substr($p3, 5);
$campo2 = "$p4.$p5";
// 3. Campo composto pelas posicoes 16 a 25 do campo livre
// e livre e DV (modulo10) deste campo
$p1 = substr($linha, 34, 10);
$p2 = modulo_10($p1);
$p3 = "$p1$p2";
$p4 = substr($p3, 0, 5);
$p5 = substr($p3, 5);
$campo3 = "$p4.$p5";
// 4. Campo - digito verificador do codigo de barras
$campo4 = substr($linha, 4, 1);
// 5. Campo composto pelo valor nominal pelo valor nominal do documento, sem
// indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
// tratar de valor zerado, a representacao deve ser 000 (tres zeros).
$campo5 = substr($linha, 5, 14);
return "$campo1 $campo2 $campo3 $campo4 $campo5";
}
function geraCodigoBanco($numero) {
$parte1 = substr($numero, 0, 3);
$parte2 = modulo_11($parte1);
return $parte1 . "-" . $parte2;
}
?>
The text was updated successfully, but these errors were encountered:
height= border=0>
src=imagens/b.png width= height= border=0><img
src=imagens/p.png width= height= border=0><img
src=imagens/b.png width= height= border=0><img 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= height= border=0><img
diff($data_vencimento)->days; } else { // Novo fator de vencimento (resetado para 1000 a partir de 21/02/2025) $data_nova_base = new DateTime('2025-02-22'); return 1000 + $data_nova_base->diff($data_vencimento)->days; } } 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); } /* ################################################# FUNÇÃO DO MÓDULO 10 RETIRADA DO PHPBOLETO ESTA FUNÇÃO PEGA O DÍGITO VERIFICADOR DO PRIMEIRO, SEGUNDO E TERCEIRO CAMPOS DA LINHA DIGITÁVEL ################################################# */ function modulo_10($num) { $numtotal10 = 0; $fator = 2; for ($i = strlen($num); $i > 0; $i--) { $numeros[$i] = substr($num,$i-1,1); $parcial10[$i] = $numeros[$i] * $fator; $numtotal10 .= $parcial10[$i]; if ($fator == 2) { $fator = 1; } else { $fator = 2; } } $soma = 0; for ($i = strlen($numtotal10); $i > 0; $i--) { $numeros[$i] = substr($numtotal10,$i-1,1); $soma += $numeros[$i]; } $resto = $soma % 10; $digito = 10 - $resto; if ($resto == 0) { $digito = 0; } return $digito; } /* ################################################# FUNÇÃO DO MÓDULO 11 RETIRADA DO PHPBOLETO MODIFIQUEI ALGUMAS COISAS... ESTA FUNÇÃO PEGA O DÍGITO VERIFICADOR: NOSSONUMERO AGENCIA CONTA CAMPO 4 DA LINHA DIGITÁVEL ################################################# */ function modulo_11($num, $base=9, $r=0) { $soma = 0; $fator = 2; for ($i = strlen($num); $i > 0; $i--) { $numeros[$i] = substr($num,$i-1,1); $parcial[$i] = $numeros[$i] * $fator; $soma += $parcial[$i]; if ($fator == $base) { $fator = 1; } $fator++; } if ($r == 0) { $soma *= 10; $digito = $soma % 11; //corrigido if ($digito == 10) { $digito = "X"; } /* alterado por mim, Daniel Schultz Vamos explicar: O módulo 11 só gera os digitos verificadores do nossonumero, agencia, conta e digito verificador com codigo de barras (aquele que fica sozinho e triste na linha digitável) só que é foi um rolo...pq ele nao podia resultar em 0, e o pessoal do phpboleto se esqueceu disso... No BB, os dígitos verificadores podem ser X ou 0 (zero) para agencia, conta e nosso numero, mas nunca pode ser X ou 0 (zero) para a linha digitável, justamente por ser totalmente numérica. Quando passamos os dados para a função, fica assim: Agencia = sempre 4 digitos Conta = até 8 dígitos Nosso número = de 1 a 17 digitos A unica variável que passa 17 digitos é a da linha digitada, justamente por ter 43 caracteres Entao vamos definir ai embaixo o seguinte... se (strlen($num) == 43) { não deixar dar digito X ou 0 } */ if (strlen($num) == "43") { //então estamos checando a linha digitável if ($digito == "0" or $digito == "X" or $digito > 9) { $digito = 1; } } return $digito; } elseif ($r == 1){ $resto = $soma % 11; return $resto; } } /* Montagem da linha digitável - Função tirada do PHPBoleto Não mudei nada */ function monta_linha_digitavel($linha) { // Posição Conteúdo // 1 a 3 Número do banco // 4 Código da Moeda - 9 para Real // 5 Digito verificador do Código de Barras // 6 a 19 Valor (12 inteiros e 2 decimais) // 20 a 44 Campo Livre definido por cada banco // 1. Campo - composto pelo código do banco, código da moéda, as cinco primeiras posições // do campo livre e DV (modulo10) deste campo $p1 = substr($linha, 0, 4); $p2 = substr($linha,19, 5); //19 $p3 = modulo_10("$p1$p2"); $p4 = "$p1$p2$p3"; $p5 = substr($p4, 0, 5); $p6 = substr($p4, 5); $campo1 = "$p5.$p6"; // echo "src=imagens/b.png width= height= border=0><img
src=imagens/p.png width= height= border=0>
" .$linha. "
". $p1 . "
" .$p2. "
" .$p3. "
" .$p4 . "
" .$p5 . "
" .$p6 . "
" ; // 2. Campo - composto pelas posiçoes 6 a 15 do campo livre // e livre e DV (modulo10) deste campo $p1 = substr($linha, 24, 10); $p2 = modulo_10($p1); $p3 = "$p1$p2"; $p4 = substr($p3, 0, 5); $p5 = substr($p3, 5); $campo2 = "$p4.$p5"; // 3. Campo composto pelas posicoes 16 a 25 do campo livre // e livre e DV (modulo10) deste campo $p1 = substr($linha, 34, 10); $p2 = modulo_10($p1); $p3 = "$p1$p2"; $p4 = substr($p3, 0, 5); $p5 = substr($p3, 5); $campo3 = "$p4.$p5"; // 4. Campo - digito verificador do codigo de barras $campo4 = substr($linha, 4, 1); // 5. Campo composto pelo valor nominal pelo valor nominal do documento, sem // indicacao de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se // tratar de valor zerado, a representacao deve ser 000 (tres zeros). $campo5 = substr($linha, 5, 14); return "$campo1 $campo2 $campo3 $campo4 $campo5"; } function geraCodigoBanco($numero) { $parte1 = substr($numero, 0, 3); $parte2 = modulo_11($parte1); return $parte1 . "-" . $parte2; } ?>
The text was updated successfully, but these errors were encountered: