Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá!
Boa tarde!
Tenho um sistema que gera cobranças para clientes todos os meses, ao gerar a cobrança, grava-se no banco de dados um historico de cada cliente com NUMERO BOLETO, VALOR, DATA VENCIMENTO e STATUS PGTO.
Baxei um script que esta lendo normalmente o arquivo de retorno do banco do brasil, mas preciso utilizar as informações para dar baixa nos boletos e colocar a data do credito.
O arquivo informa todas essas informações, só não estou sabendo pega e jogar na variavel para utilizar no mysql, onde ira comparar o codigo_boleto(ArquivoRetorno) com o codigo_boleto(Registrado no Banco de Dados), mudar o STATUS_PAGAMENTO de 0 p/ 1 e inserir a data do credito.
echo $sql_update_financeiro = "UPDATE historico_associado SET boldatpag='$data_credito', bolpag='1' WHERE bolcod='$codigo_boleto'";
mysql_query($sql_update_financeiro);
Segue o script:
index.php tem um upload que joga para processar.php que pega informações de retornocnab240.php
processar.php
<?php
/**Exemplo de uso da classe para processamento de arquivo de retorno de cobranças em formato FEBRABAN/CNAB240,
* testado com arquivo de retorno do Banco do Brasil.
* Cateira 18 variação 19 e carteira 18 variação 27 do Banco do Brasil.
* @copyright GPLv2
* @package LeituraArquivoRetorno
* @author Manoel Campos da Silva Filho. http://manoelcampos.com/contato
* @modified 01/04/2011 por Bento David Ribeiro Silva
* @version 0.2
*/
//Adiciona a classe strategy RetornoBanco que vincula um objeto de uma sub-classe
//de RetornoBase, e assim, executa o processamento do arquivo de uma determinada
//carteira de um banco específico.
require_once("RetornoBanco.php");
require_once("RetornoFactory.php");
/**Função handler a ser associada ao evento aoProcessarLinha de um objeto da classe
* RetornoBase. A função será chamada cada vez que o evento for disparado.
*
* A coluna do tipo DETALHE em retorno CNAB240 tem 2 segmentos(duas linhas) "T" e "U"
* este exemplo lista no nome da empresa
* e alguns dados do DETALHE de cada boleto pago.
* Nota: o Segmento "U" sempre é continuação do Segmento "T" que o precedeu
* @param RetornoBase $self Objeto da classe RetornoBase que está processando o arquivo de retorno
* @param $numLn Número da linha processada.
* @param $vlinha Vetor contendo a linha processada, contendo os valores da armazenados
* nas colunas deste vetor. Nesta função o usuário pode fazer o que desejar,
* como setar um campo em uma tabela do banco de dados, para indicar
* o pagamento de um boleto de um determinado cliente.
* @see linhaProcessada1
*/
function linhaProcessada($self, $numLn, $vlinha) {
if($vlinha) {
if($vlinha["registro"] == $self::HEADER_ARQUIVO)
echo "<b>".$vlinha['nome_empresa']."</b><br />";
//O registro detalhe U são dados adicionais do registro de pagamento
//e não necessariamente precisa ser usado.
//Pode ser que o arquivo de retorno não tenha o registro detalhe separado em
//duas linhas (T e U). Assim, nestes casos, pode-se fazer apenas um
//if($vlinha["registro"] == $self::DETALHE)
else if($vlinha["registro"] == $self::DETALHE && $vlinha["segmento"] == "T") {
echo "Nosso Número: <b>".$vlinha['nosso_numero']."</b> -
Venc: <b>".$vlinha['vencimento']."</b>".
" Vlr Titulo: <b>R\$ ".number_format($vlinha['valor'], 2, ',', '')."</b> - ".
" Vlr Tarifa: <b>R\$ ".number_format($vlinha['valor_tarifa'], 2, ',', '')."</b><br/>";
}
} else echo "Tipo da linha não identificado<br/>\n";
}
/**Outro exemplo de função handler, a ser associada ao evento
* aoProcessarLinha de um objeto da classe RetornoBase.
* Neste exemplo, é utilizado um laço foreach para percorrer
* o vetor associativo $vlinha, mostrando os nomes das chaves
* e os valores obtidos da linha processada.
* @see linhaProcessada
*/
function linhaProcessada1($self, $numLn, $vlinha) {
printf("%08d) ", $numLn);
if($vlinha) {
foreach($vlinha as $nome_indice => $valor)
echo "$nome_indice: <b>$valor</b><br/>\n ";
} else echo "Tipo da linha não identificado<br/>\n";
echo "<br/>\n";
}
//--------------------------------------INÍCIO DA EXECUÇÃO DO CÓDIGO-----------------------------------------------------
//$fileName = "retorno_cnab240.ret";
$fileName = $_FILES['arquivo']['tmp_name'];
//Use uma das duas instrucões abaixo (comente uma e descomente a outra)
//$cnab240 = RetornoFactory::getRetorno($fileName, "linhaProcessada");
$cnab240 = RetornoFactory::getRetorno($fileName, "linhaProcessada1");
$retorno = new RetornoBanco($cnab240);
$retorno->processar();
?>
retornocnab240.php
<?php
require_once("RetornoBase.php");
/**Classe para leitura de arquivos de retorno de cobranças no padrão CNAB240.<br/>
* Layout Padrão Febraban 240 posições V08.4 de 01/09/2009<br/>
* http://www.febraban.org.br
* @copyright GPLv2
* @package ArquivoRetornoTitulosBancarios
* @author Manoel Campos da Silva Filho. http://manoelcampos.com/contato
* @version 0.2
* @modified 01/04/2011 por Bento David Ribeiro Silva
*/
class RetornoCNAB240 extends RetornoBase {
/**@property int HEADER_ARQUIVO Define o valor que identifica uma coluna do tipo HEADER DE ARQUIVO*/
const HEADER_ARQUIVO = 0;
/**@property int HEADER_LOTE Define o valor que identifica uma coluna do tipo HEADER DE LOTE*/
const HEADER_LOTE = 1;
/**@property int DETALHE Define o valor que identifica uma coluna do tipo DETALHE*/
const DETALHE = 3;
const DETALHE_T = "T";
const DETALHE_U = "U";
/**@property int TRAILER_LOTE Define o valor que identifica uma coluna do tipo TRAILER DEs LOTE*/
const TRAILER_LOTE = 5;
/**@property int TRAILER_ARQUIVO Define o valor que identifica uma coluna do tipo TRAILER DE ARQUIVO*/
const TRAILER_ARQUIVO = 9;
public function __construct($nomeArquivo=NULL, $aoProcessarLinhaFunctionName=""){
parent::__construct($nomeArquivo, $aoProcessarLinhaFunctionName);
}
protected function processarHeaderArquivo($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //NUMERICO //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); //num - default 0000 //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //num - default 0 //Tipo de Registro
$vlinha["cnab1"] = substr($linha, 9, 9); //BRANCOS //Uso Exclusivo FEBRABAN / CNAB
$vlinha["tipo_inscricao_empresa"] = substr($linha, 18, 1); //num - 1-CPF, 2-CGC //Tipo de Inscrição da Empresa
$vlinha["num_inscricao_empresa"] = substr($linha, 19, 14); //numerico //Número de Inscrição da Empresa
$vlinha["convenio"] = substr($linha, 33, 20); //alfanumerico //Código do Convênio no Banco
$vlinha["agencia"] = substr($linha, 53, 5); //numerico //Agência Mantenedora da Conta
$vlinha["dv_agencia"] = substr($linha, 58, 1); //alfanumerico //DV da Agência
$vlinha["conta_corrente"] = substr($linha, 59, 12); //numerico //Número da Conta Corrente
$vlinha["dv_conta"] = substr($linha, 71, 1); //alfanumerico //DV da Conta Corrent
$vlinha["dv_ag_conta"] = substr($linha, 72, 1); //alfanumerico
$vlinha["nome_empresa"] = substr($linha, 73, 30); //alfanumerico
$vlinha["nome_banco"] = substr($linha, 103, 30); //alfanumerico
$vlinha["uso_febraban_cnab2"] = substr($linha, 133, 10); //brancos //Uso Exclusivo FEBRABAN / CNAB
$vlinha["cod_arq"] = substr($linha, 143, 1); //num - 1-REM E 2-RET ?? //Código do arquivo de remessa/retorno
$vlinha["data_geracao_arq"] = substr($linha, 144, 8); //num - formato ddmmaaaa
$vlinha["hora_geracao_arq"] = substr($linha, 152, 6); //num - formato hhmmss
$vlinha["sequencia"] = substr($linha, 158, 6); //numerico //Número Sequencial do Arquivo
$vlinha["versao_layout_arq"] = substr($linha, 164, 3); //num 084 //Num da Versão do Layout do Arquivo
$vlinha["densidade"] = substr($linha, 167, 5); //numerico //Densidade de Gravação do Arquivo
$vlinha["reservado_banco"] = substr($linha, 172, 20); //alfanumerico //Para Uso Reservado do Banco
$vlinha["reservado_empresa"] = substr($linha, 192, 20); //alfanumerico //Para Uso Reservado da Empresa
$vlinha["uso_febraban_cnab3"] = substr($linha, 212, 29); //brancos //Uso Exclusivo FEBRABAN / CNAB
return $vlinha;
}
protected function processarHeaderLote($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro
$vlinha["operacao"] = substr($linha, 9, 1); //Tipo de Operação
$vlinha["servico"] = substr($linha, 10, 2); //Tipo de Serviço
$vlinha["servico_CNAB"] = substr($linha, 12, 2); //Uso Exclusivo FEBRABAN/CNAB
$vlinha["layout_lote"] = substr($linha, 14, 3); //Nº da Versão do Layout do Lote
$vlinha["CNAB"] = substr($linha, 17, 1); //Uso Exclusivo FEBRABAN/CNAB
$vlinha["inscricao_tipo"] = substr($linha, 18, 1); //Tipo de Inscrição da Empresa
$vlinha["inscricao_numero"] = substr($linha, 19, 15); //Nº de Inscrição da Empresa
$vlinha["convenio"] = substr($linha, 34, 20); //Código do Convênio no Banco
$vlinha["agencia"] = substr($linha, 54, 5); //Agência Mantenedora da Conta
$vlinha["dv_agencia"] = substr($linha, 59, 1); //Dígito Verificador da Conta
$vlinha["conta"] = substr($linha, 60, 12); //Número da Conta Corrente
$vlinha["dv_conta"] = substr($linha, 72, 1); //Dígito Verificador da Conta
$vlinha["dv"] = substr($linha, 73, 1); //Dígito Verificador da Ag/Conta
$vlinha["nome_empresa"] = substr($linha, 74, 30); //Nome da Empresa
$vlinha["informacao1"] = substr($linha, 104, 40); //Mensagem 1
$vlinha["informacao2"] = substr($linha, 144, 40); //Mensagem 2
$vlinha["n_retorno"] = substr($linha, 184, 8); //Número Remessa/Retorno
$vlinha["data_retorno"] = $this->formataData(substr($linha, 192, 8)); //Data de Gravação Remessa/Retorno
$vlinha["data_credito"] = $this->formataData(substr($linha, 200, 8)); //Data do Crédito
$vlinha["CNAB2"] = substr($linha, 208, 33); //Uso Exclusivo FEBRABAN/CNAB
return $vlinha;
}
protected function processarDetalheT($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro
$vlinha["sequencial"] = substr($linha, 9, 5); //Número Sequencial Registro no Lote
$vlinha["segmento"] = substr($linha, 14, 1); //Código Segmento do Registro Detalhe
$vlinha["servico_CNAB"] = substr($linha, 15, 1); //Uso Exclusivo FEBRABAN/CNAB
$vlinha["cod_mov"] = substr($linha, 16, 2); //Código de Movimento Retorno
$vlinha["agencia"] = substr($linha, 15, 5); //Agência Mantenedora da Conta
$vlinha["dv_agencia"] = substr($linha, 23, 1); //Dígito Verificador da Agência
$vlinha["conta"] = substr($linha, 24, 12); //Número da Conta Corrente
$vlinha["dv_conta"] = substr($linha, 36, 1); //Dígito Verificador da Conta
$vlinha["dv"] = substr($linha, 37, 1); //Dígito Verificador da Ag/Conta
$vlinha["nosso_numero"] = substr($linha, 38, 20); //Identificação do Título
$vlinha["carteira"] = substr($linha, 58, 1); //Código da Carteira
$vlinha["n_documento"] = substr($linha, 59, 15); //Número do Documento de Cobrança
$vlinha["vencimento"] = $this->formataData(substr($linha, 74, 8)); //Data do Vencimento do Título
$vlinha["valor"] = $this->formataNumero(substr($linha, 82, 15)); //Valor Nominal do Título
$vlinha["banco_receb"] = substr($linha, 97, 3); //Número do Banco
$vlinha["ag_receb"] = substr($linha, 100, 5); //Agência Cobradora/Recebedora
$vlinha["dv_receb"] = substr($linha, 105, 1); //Dígito Verificador da Agência
$vlinha["uso_empresa"] = substr($linha, 106, 25); //Identificação do Título na Empresa
$vlinha["moeda"] = substr($linha, 131, 2); //Código da Moeda
$vlinha["sacado_tipo"] = substr($linha, 133, 1); //Tipo de Inscrição
$vlinha["sacado_numero"] = substr($linha, 134, 15); //Número de Inscrição
$vlinha["sacado_nome"] = substr($linha, 149, 40); //Nome
$vlinha["n_contrato"] = substr($linha, 189, 10); //Nº do Contr. da Operação de Crédito
$vlinha["valor_tarifa"] = $this->formataNumero(substr($linha, 199, 15)); //Valor da Tarifa / Custas
$vlinha["motivo_ocorrencia"] = substr($linha, 214, 10); //Identificação para Rejeições, Tarifas, Custas, Liquidação e Baixas
$vlinha["CNAB"] = substr($linha, 224, 17); //Uso Exclusivo FEBRABAN/CNAB
return $vlinha;
}
protected function processarDetalheU($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //Tipo de Registro
$vlinha["sequencial"] = substr($linha, 9, 5); //Nº Sequencial do Registro no Lote
$vlinha["segmento"] = substr($linha, 14, 1); //Cód. Segmento do Registro Detalhe
$vlinha["servico_CNAB"] = substr($linha, 15, 1); //Uso Exclusivo FEBRABAN/CNAB
$vlinha["cod_mov"] = substr($linha, 16, 2); //Código de Movimento Retorno
$vlinha["acrescimos"] = $this->formataNumero(substr($linha, 18, 15)); //Juros / Multa / Encargos
$vlinha["valor_desconto"] = $this->formataNumero(substr($linha, 33, 15)); //Valor do Desconto Concedido
$vlinha["valor_abatimento"] = $this->formataNumero(substr($linha, 48, 15)); //Valor do Abat. Concedido/Cancel.
$vlinha["IOF"] = $this->formataNumero(substr($linha, 63, 15)); //Valor do IOF Recolhido
$vlinha["valor_pago"] = $this->formataNumero(substr($linha, 78, 15)); //Valor Pago pelo Sacado
$vlinha["valor_liquido"] = $this->formataNumero(substr($linha, 93, 15)); //Valor Líquido a ser Creditado
$vlinha["despesas"] = $this->formataNumero(substr($linha, 108, 15)); //Valor de Outras Despesas
$vlinha["creditos"] = $this->formataNumero(substr($linha, 123, 15)); //Valor de Outros Créditos
$vlinha["data_ocorrencia"] = $this->formataData(substr($linha, 138, 8)); //Data da Ocorrência
$vlinha["data_credito"] = $this->formataData(substr($linha, 146, 8)); //Data da Efetivação do Crédito
$vlinha["cod_ocorrencia_sac"] = substr($linha, 154, 4); //Código da Ocorrência
$vlinha["data_ocorrencia_sac"] = $this->formataData(substr($linha, 158, 8)); //Data da Ocorrência
$vlinha["valor_ocorrencia_sac"] = $this->formataNumero(substr($linha, 166, 15)); //Valor da Ocorrência
$vlinha["compl_ocorrencia_sac"] = substr($linha, 181, 30); //Complem. da Ocorrência
$vlinha["cod_bco_corr"] = substr($linha, 211, 3); //Cód. Banco Correspondente Compens.
$vlinha["n_bco_corr"] = substr($linha, 214, 20); //Nosso Nº Banco Correspondente
$vlinha["CNAB"] = substr($linha, 234, 7); //Uso Exclusivo FEBRABAN/CNAB
return $vlinha;
}
protected function processarTrailerLote($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); //numerico //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //num - default 5 //Tipo de Registro
$vlinha["cnab1"] = substr($linha, 9, 9); //alfa - default brancos Uso Exclusivo FEBRABAN/CNAB
$vlinha["quant_regs"] = substr($linha, 18, 6); //numerico //Quantidade de Registros do Lote
$vlinha["valor"] = substr($linha, 24, 16); //numerico, 2 casas decimais //Somatória dos Valores
$vlinha["quant_moedas"] = substr($linha, 42, 13); //numerico, 5 casas decimais //Somatória de Quantidade de Moedas
$vlinha["num_aviso_debito"] = substr($linha, 60, 6); //numerico //Número Aviso de Débito
$vlinha["cnab2"] = substr($linha, 66, 165); //alfa, default brancos //Uso Exclusivo FEBRABAN/CNAB
$vlinha["ocorrencias"] = substr($linha, 231, 10); //alfa //Códigos das Ocorrências para Retorno
return $vlinha;
}
protected function processarTrailerArquivo($linha) {
$vlinha = array();
$vlinha["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação
$vlinha["lote"] = substr($linha, 4, 4); // num - default 9999 //Lote de Serviço
$vlinha["registro"] = substr($linha, 8, 1); //num - default 9 //Tipo de Registro
$vlinha["cnab1"] = substr($linha, 9, 9); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB
$vlinha["quant_lotes"] = substr($linha, 18, 6); //num. //Quantidade de Lotes do Arquivo
$vlinha["quant_regs"] = substr($linha, 24, 6); //num. //Quantidade de Registros do Arquivo
$vlinha["quant_contas_conc"] = substr($linha, 30, 6); //num. //Qtde de Contas p/ Conc. (Lotes)
$vlinha["cnab2"] = substr($linha, 36,205); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB
return $vlinha;
}
/**Processa uma linha do arquivo de retorno.
* @param int $numLn Número da linha a ser processada
* @param string $linha String contendo a linha a ser processada
* @return array Retorna um vetor associativo contendo os valores da linha processada.*/
public function processarLinha($numLn, $linha) {
//é adicionado um espaço vazio no início_linha para que
//possamos trabalhar com índices iniciando em 1, no lugar de zero,
//e assim, ter os valores de posição dos campos exatamente
//como no manual CNAB240
$linha = " $linha";
$tipoLn = substr($linha, 8, 1);
//echo "$tipoLn<br/>";
if(strcmp($tipoLn,RetornoCNAB240::HEADER_ARQUIVO)==0)
$vlinha = $this->processarHeaderArquivo($linha);
else if(strcmp($tipoLn, RetornoCNAB240::HEADER_LOTE)==0)
$vlinha = $this->processarHeaderLote($linha);
else if(strcmp($tipoLn, RetornoCNAB240::DETALHE)==0) {
$tipoDetalhe = substr($linha, 14, 1);
if(strcmp($tipoDetalhe, static::DETALHE_T)==0)
$vlinha = $this->processarDetalheT($linha);
else if(strcmp($tipoDetalhe, static::DETALHE_U)==0)
$vlinha = $this->processarDetalheU($linha);
}
else if(strcmp($tipoLn, RetornoCNAB240::TRAILER_LOTE)==0)
$vlinha = $this->processarTrailerLote($linha);
else if(strcmp($tipoLn,RetornoCNAB240::TRAILER_ARQUIVO)==0)
$vlinha = $this->processarTrailerArquivo($linha);
else $vlinha = NULL;
return $vlinha;
}
}
?>
Me ajudem porfavor
Carregando comentários...