Ir para conteúdo
  • Cadastre-se

Boletos Bancários Com Retorno Automático Whmcs - Padrão Cnab 240 E Cnab 400


danielvisnet

Posts Recomendados

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ê. 

Link para o comentário
Compartilhar em outros sites

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!! :)

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

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!!

Link para o comentário
Compartilhar em outros sites

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...

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Infelizmente, seu conteúdo contém termos que não são permitimos. Edite seu conteúdo para remover as palavras destacadas abaixo.
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Concorda com os nossos termos?