Ir para conteúdo
  • Cadastre-se

DiegoFernando

Membro
  • Postagens

    22
  • Registro em

  • Última visita

Informações pessoais

  • Nome
    Diego Fernando Ribeiro e Silva

Meios de contato

  1. Só pra avisar eu consegui fazer 100%automático. A rotina pra pegar o Retorno da caixa é simples, eu automatizei com o agendador de tarefas do windows (no caso da caixa não precisa user e senha). O Fling FTP varre um diretorio e ao encontrar UPa pro servidor. O mais difícil (pelo menos pra mim) foi alterar o arquivo processar.php para deixar de ler o arquivo enviado no form e passar a varrer a pasta no servidor e processar o arquivo encontrado na mesma. Consegui até depois de processar arquivar o RET num diretório para backup. Depois inclui uma função pra mandar por email as informações e coloquei o processar.php no cron. Pronto tudo automático! (o incoveniente é deixar uma máquina ligada pra isso, mas tenho um notezinho velho aqui que me serviu!)
  2. @edvan A propósito!! O link de validação de cpf não está funcionando no blog! Abs Diego
  3. Fala @AngelCosta Preciso dos arquivos e o link não funciona!!! você ainda os tem? Obrigado.
  4. Vai em OPÇÔES, configurações gerais, segurança, e adiciona o ip do servidor do seu site em Restrição de Acesso ao API. Acho que é isso! Abs
  5. Basta adicionar um novo administrador no sistema e na primeira opção Função do Administrador coloque API, preencha o resto e configure no script os dados do user novo!!! pronto!! só isso!
  6. Amigão, basta você instalar o sistema no seu site conforme as instruções e testar um arquivo de retorno pra ver se dá algum erro ou não! Começa por ai! Abs. PS: Estou usando o sistema até hoje e resolveu minha vida! hehe... Vou tentar fazer 100% automático, mas só quando não tiver nada pra fazer.. (o que é meio difícil! hehe)
  7. 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.
  8. Na verdade eu tinha visto!!! mas não sabia que ele ia voltar pra fazer o código funcionar! hehehel...
  9. 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
  10. 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 - alexandre@opticalhost.com.br * @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&atilde;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&atilde;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.
  11. Achei a bronca!! As variáveis da caixa são diferentes do bradesco... vou trabalhar aqui pra ver o que sai!!! abs
  12. Atualizei o php mas estou encontrando alguns erros no script... assim que funcionar para CEF posto aqui! abs
  13. Deu um erro Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM no arquivo processar.php linha 53 Resolvi assim: codigo antigo: if($vlinha["registro"] == $self::HEADER_ARQUIVO) codigo novo: if($vlinha["registro"] == $self.'::'.HEADER_ARQUIVO) Se fiz besteira me avisem!! kkk Acho que é porque a minha versão do php é Versão do PHP 5.2.17
  14. Caro Alexandre Aleixo Parabéns pelo trabalho! É muito fácil alguém dizer que tem o código e que vai disponibilizar e nada fazer... Essa novela se arrastava há muito tempo!!! Seu gesto é nobre e de homens nobres que conseguimos mudar uma sociedade. Infelizmente o pessoal aqui e em outros somente usam, mas pouco contribuem para melhorar algo. Agradeço imensamente pelo script e rezo pra que não tenha um que o venda por ai!!! Por isso deveríamos divulgá-lo de forma que quando alguém pesquisar no google ache esse script direto! É o mínimo que podemos fazer. Concordo com você em gênero, numero e grau quando fala de tantas coisas que já encontramos grátis por ai e ganhamos dinheiro com isso... Deus te abençoe sempre.
×
×
  • Criar Novo...

Informação Importante

Concorda com os nossos termos?