Created
March 7, 2018 20:18
-
-
Save GuilhermeHideki/82a4fd428194b326235c659b02facffc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* @author Rafael Azenha Aquini <rafael@tchesoft.com> | |
* @author Marco Antonio Righi <marcorighi@tchesoft.com> | |
* @author Marcelo Belinato <mbelinato@gmail.com> | |
* | |
* @license GPL | |
*/ | |
// +----------------------------------------------------------------------+ | |
// | 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 vc 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: <boletophp@boletophp.com.br> | | |
// | Desenv Boleto SICREDI: Rafael Azenha Aquini <rafael@tchesoft.com> | | |
// | Marco Antonio Righi <marcorighi@tchesoft.com> | | |
// | Homologação e ajuste de algumas rotinas | | |
// | Marcelo Belinato <mbelinato@gmail.com> | | |
// +----------------------------------------------------------------------+ | |
$boletoBuilder = new BoletoSicredi(); | |
// region DADOS DINÂMICOS DO SEU CLIENTE PARA A GERAÇÃO DO BOLETO (FIXO OU VIA GET) | |
$dias_de_prazo_para_pagamento = 5; | |
$taxa_boleto = 0; | |
// Prazo de X dias OU informe data: "13/04/2006"; | |
$data_venc = $_SESSION['boleto']['data_vencimento']; | |
// Valor - REGRA: Sem pontos na milhar e tanto faz com "." ou "," ou com 1 ou 2 ou sem casa decimal | |
$valor_cobrado = str_replace(',', '.', $_SESSION['boleto']['valor']); | |
$valor_boleto = number_format($valor_cobrado + $taxa_boleto, 2, ',', ''); | |
// Ano da geração do título ex: 07 para 2007 | |
$dadosboleto['inicio_nosso_numero'] = date('y'); | |
/** Nosso número: Numero sequencial de controle (máx. 5 digitos) */ | |
$dadosboleto['nosso_numero'] = substr($_SESSION['boleto']['num_boleto'], -5); | |
$dadosboleto['numero_documento'] = $dadosboleto['nosso_numero']; | |
// Data de Vencimento do Boleto - REGRA: Formato DD/MM/AAAA | |
$dadosboleto['data_vencimento'] = $data_venc; | |
// Data de emissão do Boleto | |
$dadosboleto['data_documento'] = !empty($_SESSION['boleto']['data_impressao_boleto']) ? | |
$funcoes_ap->InverteFormatoData($_SESSION['boleto']['data_impressao_boleto']) : | |
date('d/m/Y'); | |
// Data de processamento do boleto (opcional) | |
$dadosboleto['data_processamento'] = !empty($_SESSION['boleto']['data_impressao_boleto']) ? | |
$funcoes_ap->InverteFormatoData($_SESSION['boleto']['data_impressao_boleto']) : | |
date('d/m/Y'); | |
// Valor do Boleto - REGRA: Com vírgula e sempre com duas casas depois da virgula | |
$dadosboleto['valor_boleto'] = $valor_boleto; | |
// DADOS DO SEU CLIENTE | |
$dadosboleto['sacado'] = $_SESSION['boleto']['nome_sacado']; | |
$dadosboleto['endereco1'] = $_SESSION['boleto']['endereco_sacado']; | |
$dadosboleto['endereco2'] = 'CEP.:'.$_SESSION['boleto']['cep_bairro_cid_uf_sacado']; | |
// INFORMACOES PARA O CLIENTE | |
$dadosboleto['demonstrativo1'] = ''; | |
$dadosboleto['demonstrativo2'] = ''; | |
$dadosboleto['demonstrativo3'] = ''; | |
// INSTRUÇÕES PARA O CAIXA | |
$dadosboleto['instrucoes1'] = $_SESSION['boleto']['instrucoes_boleto']; | |
$dadosboleto['instrucoes2'] = ''; | |
$dadosboleto['instrucoes3'] = ''; | |
$dadosboleto['instrucoes4'] = ''; | |
// DADOS OPCIONAIS DE ACORDO COM O BANCO OU CLIENTE | |
$dadosboleto['quantidade'] = ''; | |
$dadosboleto['valor_unitario'] = $valor_boleto; | |
/** | |
* N - remeter cobrança sem aceite do sacado (cobranças não-registradas) | |
* S - remeter cobrança apos aceite do sacado (cobranças registradas) | |
*/ | |
$dadosboleto['aceite'] = $_SESSION['boleto']['aceite_boleto']; | |
$dadosboleto['especie'] = $_SESSION['boleto']['especie_boleto']; | |
/** OS - Outros segundo manual para cedentes de cobrança SICREDI */ | |
$dadosboleto['especie_doc'] = $_SESSION['boleto']['esp_doc_boleto']; | |
// endregion | |
// ---------------------- DADOS FIXOS DE CONFIGURAÇÃO DO SEU BOLETO --------------- // | |
// DADOS DA SUA CONTA - SICREDI | |
// Num da agencia (4 digitos), sem Digito Verificador | |
$dadosboleto['agencia'] = formata_numero($_SESSION['DadosContaCorrente']['agencia'], 4, 0); | |
/** | |
* Num da conta (5 digitos), sem Digito Verificador | |
*/ | |
$dadosboleto['conta'] = formata_numero($_SESSION['DadosContaCorrente']['conta'], 5, 0); | |
// Digito Verificador do Num da conta | |
$dadosboleto['conta_dv'] = $_SESSION['DadosContaCorrente']['conta_digito']; | |
/** | |
* Dados personalizados (Sicredi) | |
*/ | |
// Código da Carteira: A (Simples) | |
$dadosboleto['carteira'] = $_SESSION['DadosContaCorrente']['carteira']; | |
$dadosboleto['uso_banco'] = 7; | |
$dadosboleto['posto'] = $boletoBuilder->getData(7)->getPosto(); | |
/** | |
* Byte de identificação do cedente do boleto utilizado para compor o nosso número. | |
* | |
* 1 - Idtf emitente: Cooperativa | |
* 2 a 9 - Idtf emitente: Cedente | |
*/ | |
if ('1' == $dadosboleto['uso_banco']) { | |
$dadosboleto['byte_idt'] = 1; | |
} else if (in_array($dadosboleto['uso_banco'], ['2', '3', '6', '8'], false)) { | |
$dadosboleto['byte_idt'] = 2; | |
} else { | |
$dadosboleto['byte_idt'] = 3; | |
} | |
// SEUS DADOS | |
$dadosboleto['identificacao'] = ''; | |
$dadosboleto['cpf_cnpj'] = ''; | |
$dadosboleto['endereco'] = ''; | |
$dadosboleto['cidade_uf'] = ''; | |
$dadosboleto['cedente'] = ''; | |
$codigobanco = $_SESSION['boleto']['num_banco']; | |
$codigo_banco_com_dv = geraCodigoBanco($codigobanco); | |
$dadosboleto['banco'] = $codigobanco; | |
$dadosboleto['moeda'] = 9; | |
$dadosboleto['fator_vencimento'] = fator_vencimento($dadosboleto['data_vencimento']); | |
//valor tem 10 digitos, sem virgula | |
$valor = formata_numero($dadosboleto['valor_boleto'], 10, 0, 'valor'); | |
//dv da conta | |
$conta_dv = formata_numero($dadosboleto['conta_dv'], 1, 0); | |
//carteira é 2 caracteres | |
$carteira = $dadosboleto['carteira']; | |
//fillers - zeros Obs: filler1 contera 1 quando houver valor expresso no campo valor | |
$filler1 = 1; | |
$filler2 = 0; | |
// Codigo referente ao tipo de cobrança: "3" - SICREDI | |
$tipo_cobranca = 1; | |
// Codigo referente ao tipo de carteira: "1" - Carteira Simples | |
$tipo_carteira = 1; | |
//nosso número (sem dv) é 8 digitos | |
$nnum = $dadosboleto['inicio_nosso_numero'] . $dadosboleto['byte_idt'] . formata_numero($dadosboleto['nosso_numero'], 5, 0); | |
$dadosboleto['nosso_numero_sem_dv'] = $nnum; | |
//calculo do DV do nosso número | |
$dv_nosso_numero = digitoVerificador_nossonumero($dadosboleto); | |
$nosso_numero_dv = $dadosboleto['nosso_numero_sem_dv'].$dv_nosso_numero; | |
$dadosboleto['nosso_numero_com_dv'] = $nosso_numero_dv; | |
//formação do campo livre | |
$campolivre = implode('', [ | |
$tipo_cobranca, | |
$tipo_carteira, | |
$nosso_numero_dv, | |
$dadosboleto['agencia'], | |
$dadosboleto['posto'], | |
$dadosboleto['conta'], | |
$filler1, | |
$filler2 | |
]); | |
$dadosboleto['campo_livre_sem_dv'] = $boletoBuilder->getCampoLivre($dadosboleto); | |
$dadosboleto['campo_livre_dv'] = $boletoBuilder->getCampoLivreDV($dadosboleto['campo_livre']); | |
$dadosboleto['campo_livre_com_dv'] = $dadosboleto['campo_livre_sem_dv'].$dadosboleto['campo_livre_dv']; | |
// 43 numeros para o calculo do digito verificador do codigo de barras | |
$dadosboleto['barra'] = implode('', [ | |
$dadosboleto['banco'], | |
$dadosboleto['moeda'], | |
$dadosboleto['fator_vencimento'], | |
$valor, | |
$dadosboleto['campo_livre_dv'] | |
]); | |
$dadosboleto['dv_barra'] = $boletoBuilder->getBarraDV($dadosboleto['barra']); | |
// Numero para o codigo de barras com 44 digitos | |
$linha = implode('', [ | |
$dadosboleto['banco'], | |
$dadosboleto['moeda'], | |
$dadosboleto['dv_barra'], | |
$dadosboleto['fator_vencimento'], | |
$valor, | |
$dadosboleto['campo_livre_dv'] | |
]); | |
// Formata strings para impressao no boleto | |
$nossonumero = implode('', [ | |
substr($nosso_numero_dv, 0, 2), | |
'/', | |
substr($nosso_numero_dv, 2, 6), | |
'-', | |
substr($nosso_numero_dv, 8, 1) | |
]); | |
$agencia_codigo = implode('.', [ | |
$dadosboleto['agencia'], | |
$dadosboleto['posto'], | |
$dadosboleto['conta'], | |
]); | |
$dadosboleto['codigo_barras'] = $linha; | |
$dadosboleto['linha_digitavel'] = monta_linha_digitavel($linha, $dadosboleto); | |
$dadosboleto['linha_digitav3l'] = '74891.11836 66149.830037 02029.601008 6 74590000039000'; | |
$dadosboleto['correto'] = $dadosboleto['linha_digitavel'] == $dadosboleto['linha_digitav3l']; | |
// $dadosboleto['linha_digitavel'] = '74891.11836 66149.830037 02029.601008 6 74590000039000' ; //monta_linha_digitavel($linha); | |
$dadosboleto['agencia_codigo'] = $agencia_codigo; | |
$dadosboleto['nosso_numero'] = $nossonumero; | |
$dadosboleto['codigo_banco_com_dv'] = $codigo_banco_com_dv; | |
die(json_encode([ | |
$dadosboleto, | |
$_SESSION['boleto'] | |
])); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 vc 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: <boletophp@boletophp.com.br> | | |
// | Desenv Boleto SICREDI: Rafael Azenha Aquini <rafael@tchesoft.com> | | |
// | Marco Antonio Righi <marcorighi@tchesoft.com> | | |
// | Homologação e ajuste de algumas rotinas. | | |
// | Marcelo Belinato <mbelinato@gmail.com> | | |
// +----------------------------------------------------------------------+ | |
class Boleto { | |
/** | |
* @param string $data | |
* | |
* @return int | |
*/ | |
static function dac10($data) | |
{ | |
$digits = ''; | |
foreach(str_split(strrev($data)) as $index => $digit) { | |
$factor = $index % 2 === 1 ? 1 : 2; | |
$digits .= $digit * $factor; | |
} | |
return array_sum(str_split($digits)) % 10; | |
} | |
static function doc11($data) | |
{ | |
} | |
} | |
class BoletoSicrediData | |
{ | |
/** @var string */ | |
private $codigo; | |
/** @var string */ | |
private $extra; | |
/** @var string */ | |
private $posto; | |
public function __construct($codigo, $posto, $extra) { | |
$this->codigo = $codigo; | |
$this->posto = $posto; | |
$this->extra = $extra; | |
} | |
/** | |
* @return string | |
*/ | |
public function getCodigo() | |
{ | |
return $this->codigo; | |
} | |
/** | |
* @param string $codigo | |
*/ | |
public function setCodigo($codigo) | |
{ | |
$this->codigo = $codigo; | |
} | |
/** | |
* @return string | |
*/ | |
public function getExtra() | |
{ | |
return $this->extra; | |
} | |
/** | |
* @param string $extra | |
*/ | |
public function setExtra($extra) | |
{ | |
$this->extra = $extra; | |
} | |
/** | |
* Posto da cooperativa de credito (dois digitos) | |
* | |
* @return string | |
*/ | |
public function getPosto() | |
{ | |
return $this->posto; | |
} | |
/** | |
* @param string $posto | |
*/ | |
public function setPosto($posto) | |
{ | |
$this->posto = $posto; | |
} | |
} | |
/** | |
* Boleto do Sicredi | |
*/ | |
class BoletoSicredi extends Boleto | |
{ | |
const BANCO = 748; | |
/** | |
* @var BoletoSicrediData[] | |
*/ | |
protected $dados; | |
public function __construct() | |
{ | |
$this->dados = [ | |
'1' => new BoletoSicrediData('11', '19', '10'), | |
'2' => new BoletoSicrediData('11', '19', '10'), | |
'3' => new BoletoSicrediData('11', '72', '10'), | |
'4' => new BoletoSicrediData('11', '04', '10'), | |
'5' => new BoletoSicrediData('31', '02', '10'), | |
'6' => new BoletoSicrediData('11', '06', '10'), | |
'7' => new BoletoSicrediData('11', '02', '10'), | |
'8' => new BoletoSicrediData('11', '50', '10'), | |
'default' => new BoletoSicrediData('31', '50', '00'), | |
]; | |
} | |
public function getData($key) | |
{ | |
if (array_key_exists($key, $this->dados)) { | |
return $this->dados[$key]; | |
} | |
return $this->dados['default']; | |
} | |
/** | |
* @param array $params | |
* | |
* @return string | |
*/ | |
public function getCampoLivre($params) | |
{ | |
$data = $this->getData($params['uso_banco']); | |
return implode('', [ | |
$data->getCodigo(), | |
$params['nosso_numero_com_dv'], | |
$params['agencia'], | |
$params['posto'], | |
$params['conta'], | |
$data->getExtra() | |
]); | |
} | |
/** | |
* @param string $numero | |
* | |
* @return string | |
*/ | |
public function getCampoLivreDV($numero) | |
{ | |
return modulo_11($numero); | |
} | |
public function getBarraDV($barra) | |
{ | |
// Add a zero check digit | |
$s = $barra . '0'; | |
$sum = 0; | |
// Find the last character | |
$i = strlen($s); | |
$odd_length = $i % 2; | |
// Iterate all digits backwards | |
while ($i-- > 0) { | |
// Add the current digit | |
$sum+=$s[$i]; | |
// If the digit is even, add it again. Adjust for digits 10+ by subtracting 9. | |
($odd_length == ($i % 2)) ? ($s[$i] > 4) ? ($sum+=($s[$i] - 9)) : ($sum+=$s[$i]) : false; | |
} | |
return (10 - ($sum % 10)) % 10; | |
die($barra); | |
// return 6; | |
$resto2 = modulo_10($barra, 9); | |
// esta rotina sofrer algumas alterações para ajustar no layout do SICREDI | |
$digito = 11 - $resto2; | |
return $digito < 1 || $digito >= 10 ? 1 : $digito; | |
} | |
} | |
/** | |
* @param array $data | |
* | |
* @return float|int | |
*/ | |
function digitoVerificador_nossonumero($data) { | |
$digito = modulo_11(implode('', [ | |
$data['agencia'], | |
$data['posto'], | |
$data['conta'], | |
$data['nosso_numero_sem_dv'] | |
])); | |
return $digito > 9 ? 0 : $digito; | |
} | |
function digitoVerificador_campolivre($numero) { | |
$resto2 = modulo_11($numero, 9, 1); | |
return $resto2 <= 1 ? 0 : 11 - $resto2; | |
} | |
// FUNÇÕES | |
// Algumas foram retiradas do Projeto PhpBoleto e modificadas para atender as particularidades de cada banco | |
function formata_numero($numero, $loop, $insert, $tipo = 'geral') { | |
if ($tipo === 'valor' || $tipo === 'geral') { | |
$numero = str_pad(str_replace(',', '', $numero), $loop, $insert, STR_PAD_LEFT); | |
} | |
if ($tipo === 'convenio') { | |
while(strlen($numero) < $loop){ | |
$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--) { | |
$texto = ''; | |
for ($i=1;$i<6;$i++) { | |
$texto .= $barcodes[$f1][$i - 1] . $barcodes[$f2][$i - 1]; | |
} | |
$barcodes[($f1 * 10) + $f2] = $texto; | |
} | |
} | |
// Desenho da barra | |
// Guarda inicial | |
?> | |
<img src=imagens/p.png width=<?= $fino ?> height=<?= $altura ?> border=0> | |
<img src=imagens/b.png width=<?= $fino ?> height=<?= $altura ?> border=0> | |
<img src=imagens/p.png width=<?= $fino ?> height=<?= $altura ?> border=0> | |
<img src=imagens/b.png width=<?= $fino ?> height=<?= $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); | |
} | |
/** | |
* @param string $num | |
* | |
* @return int | |
*/ | |
function modulo_10($num) { | |
$fator = 2; | |
// Separacao dos numeros | |
for ($i = strlen($num); $i > 0; $i--) { | |
// pega cada numero isoladamente | |
$numeros[$i] = $num[$i - 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; | |
// monta sequencia para soma dos digitos no (modulo 10) | |
$numtotal10 += $parcial10[$i]; | |
// intercala fator de multiplicacao (modulo 10) | |
$fator = $fator == 2 ? 1 : 2; | |
} | |
// 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; | |
} | |
/** | |
* Calculo do Modulo 11 para geracao do digito verificador | |
* de boletos bancarios conforme documentos obtidos | |
* da Febraban - www.febraban.org.br | |
* | |
* 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. | |
* | |
* @author Pablo Costa <pablo@users.sourceforge.net> | |
* | |
* @param string $num numérica para a qual se deseja calcular o digito verificador | |
* @param int $base valor maximo de multiplicacao [2-$base] | |
* @param int $r quando especificado um devolve somente o resto | |
* | |
* @return float|int Retorna o Digito verificador. | |
*/ | |
function modulo_11($num, $base=9, $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; | |
return $digito; | |
} | |
if ($r == 1) { | |
// esta rotina sofrer algumas alterações para ajustar no layout do SICREDI | |
$r_div = (int)($soma/11); | |
$digito = ($soma - ($r_div * 11)); | |
return $digito; | |
} | |
} | |
function monta_linha_digitavel($codigo, $data=[]) { | |
// COMPOSICAO DO CODIGO | |
// Posição | Larg | Conteúdo | |
// --------+------+--------------- | |
// 1 a 3 | 03 | Identificação do banco | |
// 4 | 01 | Código da Moeda - 9 para R$ | |
// 5 | 01 | Digito verificador geral do Código de Barras | |
// 6 a 9 | 04 | Fator de Vencimento | |
// 10 a 19 | 10 | Valor (8 inteiros e 2 decimais) | |
// 20 a 44 | 25 | Campo Livre definido por cada banco (25 caracteres) | |
$campos = []; | |
//COMPOSICAO DA LINHA DIGITAVEL | |
$campoLivre = [ | |
1 => substr($data['campo_livre_com_dv'], 0, 5), | |
2 => substr($data['campo_livre_com_dv'], 5, 10), | |
3 => substr($data['campo_livre_com_dv'], 15, 10) | |
]; | |
// die($campoLivre[3]); | |
/** | |
* 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 | |
*/ | |
$codBanco = $data['banco']; | |
$codMoeda = $data['moeda']; | |
$campos[1] = implode('', [ | |
$codBanco, | |
$codMoeda, | |
substr($campoLivre[1], 0, 1), | |
'.', | |
substr($campoLivre[1], 1), | |
modulo_10($codBanco . $codMoeda . $campoLivre[1]) | |
]); | |
// die($campoLivre[2]); | |
/** | |
* 2. Campo - composto pelas posições 6 a 15 do campo livre e DV (modulo10) deste campo | |
*/ | |
$campos[2] = implode('', [ | |
substr($campoLivre[2], 0, 5), | |
'.', | |
substr($campoLivre[2], 5), | |
modulo_10($campoLivre[2]) | |
]); | |
/** | |
* 3. Campo composto pelas posicoes 16 a 25 do campo livre | |
* e livre e DV (modulo10) deste campo | |
*/ | |
$campos[3] = implode('', [ | |
substr($campoLivre[3], 0, 5), | |
'.', | |
substr($campoLivre[3], 5), | |
modulo_10($campoLivre[3]) | |
]); | |
/** | |
* 4. Dígito verificador do codigo de barras | |
*/ | |
$campos[4] = Boleto::dac10($data['barra']); | |
/** | |
* 5. Campo composto pelo fator vencimento e 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). | |
*/ | |
$fatorVencimento = substr($codigo, 5, 4); | |
$valorNominal = substr($codigo, 9, 10); | |
$campos[5] = $fatorVencimento.$valorNominal; | |
return implode(' ', $campos); | |
} | |
function geraCodigoBanco($numero) { | |
$parte1 = substr($numero, 0, 3); | |
return $parte1 . '-0'; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment