DiegoFernando Postado Março 28, 2013 Compartilhar Postado Março 28, 2013 Achei a bronca!! As variáveis da caixa são diferentes do bradesco... vou trabalhar aqui pra ver o que sai!!! abs 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Alexandre Aleixo Postado Março 28, 2013 Compartilhar Postado Março 28, 2013 Isso é fácil de resolver. No arquivo "processar.php", vá nas linhas 274, 275 e 276 e descomente as 3. Vão aparecer todas as variáveis disponíveis no arquivo. Aí é só você modificar todas as variáveis que tenham "$vlinha" nesse arquivo. Se quiser me mandar um exemplo de RET da Caixa eu vejo pra você. 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Patty Postado Março 29, 2013 Compartilhar Postado Março 29, 2013 Parabéns pelo excelente trabalho e por disponibilizar gratuitamente, rapazes!! Um trabalho que poderia muito bem ser cobrado! Realmente, vcs estão de parabéns! :) Quando tiver um tempinho, vou testar com a Caixa e posto aqui os resultados. Valeu messss!! :) 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Alexandre Aleixo Postado Março 29, 2013 Compartilhar Postado Março 29, 2013 Ele até funciona na Caixa, mas tem que fazer uns ajustes... Ele está funcionando perfeito mesmo é no Bradesco. Outros bancos eu não sei... 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
DiegoFernando Postado Março 29, 2013 Compartilhar Postado Março 29, 2013 Funcionou na CAIXA com perfeição, mas não conseguimos ler as linhas U do retorno, somente as T, isso quer dizer que se um cliente pagar menos do que o valor da fatura você não tem como saber! no meu caso isso nunca aconteceu e atende minhas necessidades. TEm esse grupo no google que ensina a usar o T e U ao mesmo tempo, quem se habilita:?? Pra usar com a caixa substitua o arquivo processar.php por esse: <?php header("Content-Type: text/html; charset=ISO-8859-1",true) ?> <?php /**Script de tratamento de arquivos de retorno padrão FEBRABAN/CNAB240 criado por Manoel Campos da Silva Filho e * Bento David Ribeiro Silva, adaptado por Alexandre Miranda Aleixo em Março de 2013 para aplicar os dados tratados * no script de gerenciamento de cobranças WHMCS. * Testado com arquivo de retorno do Banco Bradesco, carteira 06. * @copyright GPLv2 * @package LeituraArquivoRetornoAdaptadoParaWHMCS * @author Alexandre Miranda Aleixo - [email protected] * @created 28/03/2013 * @version 0.1 * APOIE O TRABALHO DE QUEM LHE DISPONIBILIZOU ESSE SCRIPT DE GRAÇA! * MANTENHA OS CRÉDITOS COMO FORMA DE AGRADECIMENTO! */ //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 */ // função de conversão da data do modelo brasileiro (ex: 25/02/2009) para o formato internacional para banco de dados (ex: 2009-02-25) function formatadata($data, $tipo = 1) { $data = str_replace('-', '/', $data); $dividir = explode("/", $data); $parte1 = $dividir[0]; $parte2 = $dividir[1]; $parte3 = $dividir[2]; $data = "$parte3-$parte2-$parte1"; if ($tipo == 1) $data = str_replace('-', '/', $data); return $data; } // fim da função de conversão da data do modelo brasileiro... //inicio do processamento do arquivo de retorno function linhaProcessada($self, $numLn, $vlinha) { if($vlinha) { if($vlinha["registro"] == $self::HEADER_ARQUIVO) { include("Config.php"); echo " <h1>Importar arquivo de retorno para o WHMCS:</h1> <br> Empresa: <b>".$vlinha['nome_empresa']."</b><br />"; echo "Banco: <b>".$vlinha['banco']." - ".$vlinha["nome_banco"]."</b><br />"; //notificação para evitar que arquivos de retorno de outros bancos sejam baixados como sendo de um banco diferente If ($banco != $vlinha['banco']) {echo"<font color=\"#FF0000\">ATENÇÃO: Número do banco neste arquivo de retorno não confere com o número configurado no Config.php desse script!</font><br /><br />"; } //fim notificação para evitar que arquivos de retorno de outros bancos sejam baixados como sendo de um banco diferente echo "Data do arquivo de retorno: <b>".$vlinha["data_geracao_arq"]."</b><br /><br />"; if (!isset($_GET['aplicar'])) {echo"As seguintes entradas serão aplicadas no WHMCS:<br /><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") { //exibindo os dados para confirmar se devem ser aplicados no API do WHMCS if (isset($_GET['aplicar'])) { include("Config.php"); //api que puxa os dados da fatura para posteriormente vermos se está paga ou não. $postfields = array(); $postfields["username"] = $username; $postfields["password"] = md5($password); $postfields["action"] = "getinvoice"; $postfields["invoiceid"] = $vlinha["n_documento"]; $postfields["responsetype"] = "json"; $query_string = ""; foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $jsondata = curl_exec($ch); if (curl_error($ch)) die("Connection Error: ".curl_errno($ch).' - '.curl_error($ch)); curl_close($ch); $dadosfatura = json_decode($jsondata); # Decode JSON String //fim api que puxa os dados da fatura para posteriormente vermos se está paga ou não. // Se fatura não está paga, executa... if ($dadosfatura->status == "Unpaid") { $postfields2["username"] = $username; $postfields2["password"] = md5($password); $postfields2["action"] = "addinvoicepayment"; #função que marca como pago a fatura $postfields2["transid"] = $banco."Dt".formatadata($vlinha['vencimento'], 2)."T".$vlinha['nosso_numero']."Seq".$vlinha['sequencial']."R$".$vlinha['valor']."Bc".$vlinha["banco_receb"]."Ag".$vlinha["ag_receb"]."-".$vlinha["dv_receb"]; $postfields2["invoiceid"] = $vlinha["n_documento"]; #número da fatura (aqui eu acho que deve se chamar do arquivo RET) $postfields2["gateway"] = $gateway; #Nome do gateway de pagamento, conforme consta no banco de dados $postfields2["amount"] = $vlinha["valor"]; // $postfields2["fees"] = ""; // $postfields2["noemail"] = "true"; $postfields2["date"] = formatadata($vlinha["vencimento"], 2); $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, $url); curl_setopt($ch2, CURLOPT_POST, 1); curl_setopt($ch2, CURLOPT_TIMEOUT, 100); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch2, CURLOPT_POSTFIELDS, $postfields2); $data = curl_exec($ch2); curl_close($ch2); $data = explode(";",$data); foreach ($data AS $temp) { $temp = explode("=",$temp); $results[$temp[0]] = $temp[1]; } //echo $results["result"]; if ($results["result"]=="success") { echo "<font color=\"#008000\">A seguinte linha foi processada com sucesso:</font><br/> Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; } else { # An error occured echo "Ocorreu o seguinte erro ao processar a linha de sequencia ".$vlinha['sequencial']." : ".$results["message"]."<br/>"; } } //Se fatura já está paga, não executa e mostra mensagem: else{echo "<font color=\"#FF0000\">A seguinte linha NÃO foi processada:</font><br/> Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; } } else { //api que puxa os dados da fatura para posteriormente vermos se está paga ou não. include("Config.php"); $postfields = array(); $postfields["username"] = $username; $postfields["password"] = md5($password); $postfields["action"] = "getinvoice"; $postfields["invoiceid"] = $vlinha["n_documento"]; $postfields["responsetype"] = "json"; $query_string = ""; foreach ($postfields AS $k=>$v) $query_string .= "$k=".urlencode($v)."&"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $jsondata = curl_exec($ch); if (curl_error($ch)) die("Connection Error: ".curl_errno($ch).' - '.curl_error($ch)); curl_close($ch); $dadosfatura = json_decode($jsondata); # Decode JSON String //fim api que puxa os dados da fatura para posteriormente vermos se está paga ou não. // Se fatura não está paga, executa... if ($dadosfatura->status == "Unpaid") { echo " Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> "; if ($dadosfatura->balance < $vlinha["valor"]) {echo " - <font color=\"#FF0000\">Atenção: Valor da fatura é menor que o valor pago! Conferir situação!</font>"; } echo "<br/>"; } else { echo " Linha: <b>".$vlinha['sequencial']."</b> - Fatura: <b>".$vlinha["n_documento"]."</b> - Vencimento: <b>".$vlinha["vencimento"]."</b>". " Valor: <b>R\$ ".number_format($vlinha["valor"], 2, '.', '')."</b> - ". " Valor no WHMCS: <b>R\$ ".number_format($dadosfatura->balance, 2, '.', '')."</b> ". "</b> - <font color=\"#FF0000\">FATURA JÁ PAGA OU CANCELADA</font><br/><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----------------------------------------------------- echo"<html> <head> <title>Importação do arquivo de retorno para o WHMCS - Por Alexandre Aleixo</title> </head> <body> "; //$fileName = "retorno_cnab240.ret"; $fileName = $_FILES['arquivo']['tmp_name']; $cnab240 = RetornoFactory::getRetorno($fileName, "linhaProcessada"); $cnab2402 = RetornoFactory::getRetorno($fileName, "linhaProcessada1"); $retorno = new RetornoBanco($cnab240); $retorno->processar(); if (!isset($_GET['aplicar'])) {echo "<br/><br/> Se os dados acima estão corretos, selecione o arquivo novamente e clique em \"Enviar dados\"<br/> <br/> Atenção: os dados acima foram tirados do arquivo: <font color=\"#FF0000\">".$_FILES['arquivo']['name']."</font><br/> (Assegure-se de selecionar abaixo o mesmo arquivo)<br/> <br/> <form action=\"processar.php?aplicar\" method=\"post\" enctype=\"multipart/form-data\"> <input name=\"arquivo\" type=\"file\"/> <input type=\"submit\" value=\"Enviar dados\"/> </form><br/>"; } //echo "<br/><br/>Descrição de todas as informações do retorno:<br/><br/>"; //$retorno2 = new RetornoBanco($cnab2402); //$retorno2->processar(); echo " <br><br> Projeto concluído por Alexandre Aleixo, com o auxílio de danielvisnet, diego123 e redirect no fórum Portal Do Host: <br><br> <a target=\"_blank\" href=\"http://portaldohost.com.br/forum/index.php?showtopic=9470&page=2#entry106980\"> http://portaldohost.com.br/forum/index.php?showtopic=9470&page=2#entry106980</a> <br><br> Respeite quem dedicou seu tempo para lhe disponibilizar esse sistema de graça! Não remova os créditos! </body> </html>"; ?> E substitua o RetornoCNAB240.php por esse: <?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, 53, 4); //Aqui eu tive que alterar porque não leu o arquivo de RET da caixa acho que quando as faturas tiverem 5 digitos deve se alterar para 53, 5 ou 52,5 @ diego123. $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; } } ?> Não nos culpe se não funcionar!! heheh o Código não é aquela beleza, mas funciona. Compare esses arquivos antes de substituir e veja o que existe em um e outro pois alterei algumas coisas. Se conseguir melhorar algo não esqueça de por aqui pois você pegou esse script de graça então nada melhor que contribuir. os dados do retorno CAIXA que o script mostra são quase os mesmos que o Cobrança Caixa mostra então me dei por satisfeito. Vale lembrar que essa adaptação pra Caixa só foi possível porque o Alexandre Aleixo explicou tudo pra mim!! hehehe... Abs... Diego Fernando. 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
DiegoFernando Postado Março 29, 2013 Compartilhar Postado Março 29, 2013 Link do grupo no google que esqueci de postar https://groups.google.com/forum/?fromgroups=#!topic/retorno-boletophp/j8UlFfy6g_M Eles conseguem ler os T e U do retorno... abs 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Alexandre Aleixo Postado Março 31, 2013 Compartilhar Postado Março 31, 2013 Pessoal, terminei agora a pouco a versão 0.2 desse script. Com a ajuda do DiegoFernando, consegui adaptar o script para se adequar à Caixa também. Testado com sucesso então no Bradesco e na Caixa! Acredito que o mesmo vá funcionar em outros bancos também... O arquivo original foi atualizado e a versão nova já está disponível no link da minha postagem anterior. Quem já tinha baixado, baixe denovo, ok? Aproveitei e fiz algumas outras alterações, como aumento da exatidão dos avisos, alteração do método de envio dos dados da visualização para a execução (antes tinha que enviar o arquivo duas vezes. Agora não precisa mais) e etc... Peço que testem bastante antes de colocar em produção... Aqui funcionou tudo belezinha, mas cada caso é um caso.... Qualquer falha, me avisem e eu corrijo.. Abraços! 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
danielvisnet Postado Março 31, 2013 Autor Compartilhar Postado Março 31, 2013 Pessoal, terminei agora a pouco a versão 0.2 desse script. Com a ajuda do DiegoFernando, consegui adaptar o script para se adequar à Caixa também. Oi Alexandre, que coisa incrível o que aconteceu neste fórum! Foi como uma sinfonia..rs Sua contribuição, do diego123 e redirect, encaixaram como uma luva meses depois. E parece que o Diego nem tinha visto seu primeiro post..heheh Fiquei impressionado, estão de parabéns!! Sobre os aquivos de retorno para teste, naquele arquivo do primeiro post tem uma pasta com os arquivos: retorno.zip -> \retorno\doc\arquivos retorno\ - Caixa : retorno_caixa240.ret - Bradesco : retorno-cb030400-bradesco.ret - Banco do Brasil: retorno_cnab240.ret / retorno_cnab400conv6.ret / retorno_cnab400conv7.ret - Não sei o banco?: IEDCBR361502201214659.ret Não sei qual é a carteira destes arquivos. No link abaixo coloquei mais 2 retornos que tenho certeza ser: - Retornos da CAIXA, carteira SIGCB, CNAB 240: http://www.faturas.net/retorno/caixa/ Que Deus o abençõe pelo espírito colaborativo! Obrigado pela contribuição e agradeço por todos que está ajudando. Um abraço!! 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
DiegoFernando Postado Março 31, 2013 Compartilhar Postado Março 31, 2013 Oi Alexandre, que coisa incrível o que aconteceu neste fórum! Foi como uma sinfonia..rs Sua contribuição, do diego123 e redirect, encaixaram como uma luva meses depois. E parece que o Diego nem tinha visto seu primeiro post..heheh Fiquei impressionado, estão de parabéns!! Sobre os aquivos de retorno para teste, naquele arquivo do primeiro post mesmo, tem uma pasta com alguns arquivos. Conforme abaixo: retorno.zip -> \retorno\doc\arquivos retorno\ - Caixa : retorno_caixa240.ret - Bradesco : retorno-cb030400-bradesco.ret - B ando do Brasil: r etorno_cnab240.ret / retorno_cnab400conv6.ret / retorno_cnab400conv7.ret - Não sei o banco?: IEDCBR361502201214659.ret Não sei qual é a carteira destes arquivos, mas no link abaixo coloquei dois retornos que tenho certeza ser: - Retornos da CAIXA, carteira SIGCB, CNAB 240: http://www.faturas.net/retorno/caixa/ Que Deus os abençõe pelo espírito colaborativo! Muito obrigado pela contribuição, agradeço por todos que está ajudando. Um abraço!! Na verdade eu tinha visto!!! mas não sabia que ele ia voltar pra fazer o código funcionar! hehehel... 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
DiegoFernando Postado Março 31, 2013 Compartilhar Postado Março 31, 2013 Aqui versão 0.2 funcionando 100% pra Caixa SIGCB CNAB240, inclusive mostrando o nome do cliente que pagou e o valor no whmcs antes e depois de dar baixa. Show de bola! Parabens Alexandre Aleixo. 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.