Skip to content
This repository has been archived by the owner on Nov 16, 2022. It is now read-only.

Commit

Permalink
Criado Retorno Sicoob padrão CNAB240 - Segmento T e U (#6)
Browse files Browse the repository at this point in the history
* Criado Retorno Sicoob padrão CNAB240 - Segmento T e U

- Foi criado o arquivo de retorno para o Banco SICOOB padrão CNAB240, segmento T e U
- Alguns ajustes de tabulação e espaçamento foram removidos

* Ajustes Gerais

- Autor
- classe para extender
- remoção de funções já extendidas.

* Update RetornoFactory.php

O método tentaInstanciarCnab240() não pode gerar uma exceção, pois se o arquivo não estiver no formato CNAB240, ele pode estar no formato CNAB400. Assim, o método tentaInstanciarObjetoLeituraArquivoRetorno() vai primeiro chamar tentaInstanciarCnab240(). Se este retornar NULL, ele chama o tentaInstanciarCnab400(). Caso este também retorne NULL, aí sim uma exceção é lançada.
  • Loading branch information
mauroagr authored and manoelcampos committed Mar 14, 2018
1 parent e50fe76 commit 94d8777
Show file tree
Hide file tree
Showing 2 changed files with 223 additions and 32 deletions.
186 changes: 186 additions & 0 deletions src/ManoelCampos/RetornoBoleto/RetornoCNAB240Sicoob.php
@@ -0,0 +1,186 @@
<?php

namespace ManoelCampos\RetornoBoleto;

require_once("RetornoAbstract.php");

/**
* Classe para leitura_arquivos_retorno_cobranças_padrão CNAB240 para Banco Sicoob.
* Layout Padrão <a href="http://www.febraban.org.br">Febraban</a> 240 posições V08.4 de 01/09/2009.<p/>
*
* @license <a href="https://opensource.org/licenses/MIT">MIT License</a>
* @author <a href="mailto:mauroagr@gmail.com">Mauro Tschiedel</a>
* @version 1.1
*/
class RetornoCNAB240Sicoob extends RetornoCNAB240 {
protected function processarHeaderArquivo($linha) {
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); //NUMERICO //Código do Banco na Compensação
$vetor["lote"] = substr($linha, 4, 4); //num - default 0000 //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); //num - default 0 //Tipo de Registro
$vetor["cnab1"] = substr($linha, 9, 9); //BRANCOS //Uso Exclusivo FEBRABAN / CNAB
$vetor["tipo_inscricao_empresa"] = substr($linha, 18, 1); //num - 1-CPF, 2-CGC //Tipo de Inscrição da Empresa
$vetor["num_inscricao_empresa"] = substr($linha, 19, 14); //numerico //Número de Inscrição da Empresa
$vetor["cod_convenio"] = substr($linha, 33, 20); //alfanumerico //Código do Convênio no Banco
$vetor["agencia"] = substr($linha, 53, 5); //numerico //Agência Mantenedora da Conta
$vetor["dv_agencia"] = substr($linha, 58, 1); //alfanumerico //DV da Agência
$vetor["conta_corrente"] = substr($linha, 59, 12); //numerico //Número da Conta Corrente
$vetor["dv_conta"] = substr($linha, 71, 1); //alfanumerico //DV da Conta Corrent
$vetor["dv_ag_conta"] = substr($linha, 72, 1); //alfanumerico
$vetor["nome_empresa"] = substr($linha, 73, 30); //alfanumerico
$vetor["nome_banco"] = substr($linha, 103, 30); //alfanumerico
$vetor["uso_febraban_cnab2"] = substr($linha, 133, 10); //brancos //Uso Exclusivo FEBRABAN / CNAB
$vetor["cod_arq"] = substr($linha, 143, 1); //num - 1-REM E 2-RET ?? //Código do arquivo de remessa/retorno
$vetor["data_geracao_arq"] = substr($linha, 144, 8); //num - formato ddmmaaaa
$vetor["hora_geracao_arq"] = substr($linha, 152, 6); //num - formato hhmmss
$vetor["sequencia"] = substr($linha, 158, 6); //numerico //Número Sequencial do Arquivo
$vetor["versao_layout_arq"] = substr($linha, 164, 3); //num 084 //Num da Versão do Layout do Arquivo
$vetor["densidade"] = substr($linha, 167, 5); //numerico //Densidade de Gravação do Arquivo
$vetor["reservado_banco"] = substr($linha, 172, 20); //alfanumerico //Para Uso Reservado do Banco
$vetor["reservado_empresa"] = substr($linha, 192, 20); //alfanumerico //Para Uso Reservado da Empresa
$vetor["uso_febraban_cnab3"] = substr($linha, 212, 29); //brancos //Uso Exclusivo FEBRABAN / CNAB

return $vetor;
}

protected function processarHeaderLote($linha) {
//SEGMENTO J - Pagamento de Títulos de Cobrança
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação
$vetor["lote"] = substr($linha, 4, 4); //numerico //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); //num - default 1 //Tipo de Registro
$vetor["operacao"] = substr($linha, 9, 1); //alfanumerico - default C //Tipo da Operação
$vetor["servico"] = substr($linha, 10, 2); //num //Tipo do Serviço
$vetor["cnab_servico"] = substr($linha, 12, 2); //num //Forma de Lançamento
$vetor["layout_lote"] = substr($linha, 14, 3); //num - default '030' //No da Versão do Layout do Lote
$vetor["cnab1"] = substr($linha, 17, 1); //alfa - default brancos //Uso Exclusivo da FEBRABAN/CNAB
$vetor["tipo_inscricao_empresa"] = substr($linha, 18, 1); //num - 1-CPF, 2-CGC //Tipo de Inscrição da Empresa
$vetor["num_inscricao_empresa"] = substr($linha, 19, 15); //numerico //Número de Inscrição da Empresa
$vetor["cod_convenio"] = substr($linha, 34, 20); //alfanumerico //Código do Convênio no Banco

$vetor["agencia"] = substr($linha, 54, 5); //numerico //Agência Mantenedora da Conta
$vetor["dv_agencia"] = substr($linha, 59, 1); //alfanumerico //DV da Agência Mantenedora da Conta
$vetor["conta_corrente"] = substr($linha, 60, 12); //numerico
$vetor["dv_conta"] = substr($linha, 72, 1); //alfanumerico
$vetor["dv_ag_conta"] = substr($linha, 73, 1); //alfanumerico //Dígito Verificador da Ag/Conta
$vetor["nome_empresa"] = substr($linha, 74, 30); //alfanumerico
$vetor["mensagem1"] = substr($linha, 104, 40); //alfanumerico
$vetor["mensagem2"] = substr($linha, 144, 40); //alfanumerico

$vetor["numero_remessa_retorno"] = substr($linha, 184, 8); // numerico // numero do retorno
$vetor["data_remessa_retorno"] = substr($linha, 192, 8); // numerico // numero do retorno
$vetor["data_credito"] = substr($linha, 200, 8); // numerico // numero do retorno
$vetor["cnab"] = substr($linha, 208, 33); // alfa - default brancos //Uso Exclusivo da FEBRABAN/CNAB
return $vetor;
}

protected function processarDetalhe($linha)
{
$segmento = substr($linha, 14, 1);
if ($segmento == "T"){
return $this -> processarDetalheSegmentoT($linha);
}elseif ($segmento == "U") {
return $this -> processarDetalheSegmentoU($linha);
}
}

protected function processarDetalheSegmentoU($linha) {
//LIQUIDACAO_TITULOS_CARTEIRA_COBRANCA - SEGMENTO U (Pagamento de Títulos de Cobrança) REMESSA/RETORNO
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); // Num //Código no Banco da Compensação
$vetor["lote"] = substr($linha, 4, 4); // Num //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); // Num default '3' //Tipo de Registro
$vetor["num_registro_lote"] = substr($linha, 9, 5); // Num //No Sequencial do Registro no Lote
$vetor["segmento"] = substr($linha, 14, 1); // Alfa default 'J' //Código de Segmento no Reg. Detalhe
$vetor["tipo_movimento"] = substr($linha, 15, 1); // Num //Tipo de Movimento
$vetor["cod_movimento"] = substr($linha, 16, 2); // Num //Código da Instrução p/ Movimento
$vetor["acrescimos"] = substr($linha, 18, 15); // Num, 2 casas decimais //Valor da Mora + Multa
$vetor["desconto"] = substr($linha, 33, 15); // Num, 2 casas decimais //Valor do Desconto
$vetor["abatimento"] = substr($linha, 48, 15); // Num, 2 casas decimais //Valor Abatimento
$vetor["iof"] = substr($linha, 63, 15); // Num, 2 casas decimais //Valor IOF
$vetor["valor_pagamento"] = substr($linha, 78, 15); // Num, 2 casas decimais
$vetor["valor_liquido"] = substr($linha, 93, 15); // Num, 2 casas decimais
$vetor["outras_despesas"] = substr($linha, 108, 15); // Num, 2 casas decimais
$vetor["outros_creditos"] = substr($linha, 123, 15); // Num, 2 casas decimais
$vetor["data_ocorrencia"] = substr($linha, 138, 8); // Num
$vetor["data_credito"] = substr($linha, 146, 8); // Num
$vetor["codigo_ocorrencia_pag"] = substr($linha, 154, 4); // Alfa
$vetor["data_ocorrencia_pag"] = substr($linha, 158, 8); // Alfa
$vetor["valor_ocorrencia_pag"] = substr($linha, 166, 13); // Num
$vetor["compl_ocorrencia_pag"] = substr($linha, 181, 30); // Alfa
$vetor["cod_banco_correspondente"] = substr($linha, 211, 3); // Num
$vetor["num_banco_correspondente"] = substr($linha, 214, 20); // Num
$vetor["cnab"] = substr($linha, 234, 7); // Alfa - default Brancos //Uso Exclusivo FEBRABAN/CNAB
return $vetor;
}


protected function processarDetalheSegmentoT($linha) {
//LIQUIDACAO_TITULOS_CARTEIRA_COBRANCA - SEGMENTO T (Pagamento de Títulos de Cobrança) REMESSA/RETORNO
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); // Num //Código no Banco da Compensação
$vetor["lote"] = substr($linha, 4, 4); // Num //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); // Num default '3' //Tipo de Registro
$vetor["num_registro_lote"] = substr($linha, 9, 5); // Num //No Sequencial do Registro no Lote
$vetor["segmento"] = substr($linha, 14, 1); // Alfa default 'J' //Código de Segmento no Reg. Detalhe
$vetor["tipo_movimento"] = substr($linha, 15, 1); // Num //Tipo de Movimento
$vetor["cod_movimento"] = substr($linha, 16, 2); // Num //Código da Instrução p/ Movimento
$vetor["agencia"] = substr($linha, 18, 5); //numerico //Agência Mantenedora da Conta
$vetor["dv_agencia"] = substr($linha, 23, 1); //alfanumerico //DV da Agência Mantenedora da Conta
$vetor["conta_corrente"] = substr($linha, 24, 12); //numerico
$vetor["dv_conta"] = substr($linha, 36, 1); //alfanumerico
$vetor["dv_ag_conta"] = substr($linha, 37, 1); //alfanumerico //Dígito Verificador da Ag/Conta
$vetor["nosso_numero"] = substr($linha, 38, 20); // Alfa //Num. do Documento Atribuído pelo Banco
$vetor["carteira"] = substr($linha, 58, 1); // Alfa //Num. do Documento Atribuído pelo Banco
$vetor["numero_documento"] = substr($linha, 59, 15); // Alfa //Num. do Documento Atribuído pela Empresa
$vetor["data_vencimento"] = substr($linha, 74, 8); // Num //Data do Vencimento (Nominal)
$vetor["valor_titulo"] = substr($linha, 82, 15); // Num, 2 casas decimais //Valor do Título (Nominal)
$vetor["banco_recebedor"] = substr($linha, 97, 3); // Num, Banco Recebedor
$vetor["ag_cobradora"] = substr($linha, 100, 5); // Num, Agencia Cobradora
$vetor["dv_ag_cobradora"] = substr($linha, 105, 1); // Num, DV Agencia Cobradora
$vetor["referencia_sacado"] = substr($linha, 106, 25); // Alfa, Identificação do Título na Empresa
$vetor["cod_moeda"] = substr($linha, 131, 2); // Num, codigo da moeda
$vetor["tipo_inscricao_pagador"] = substr($linha, 133, 1); //num - 1-CPF, 2-CGC //Tipo de Inscrição do Pagador
$vetor["num_inscricao_pagador"] = substr($linha, 134, 15); //numerico //Número de Inscrição do Pagador
$vetor["nome_pagador"] = utf8_decode(substr($linha, 149, 40)); // alfa Nome Pagador
$vetor["numero_contrato"] = substr($linha, 189, 10); // num, Numero do contrato
$vetor["valor_tarifas"] = substr($linha, 199, 15); // num, Numero do contrato
$vetor["ocorrencias"] = substr($linha, 214, 10); // Alfa //Códigos das Ocorrências p/ Retorno
$vetor["cnab"] = substr($linha, 224, 17); // Alfa - default Brancos //Uso Exclusivo FEBRABAN/CNAB
return $vetor;
}

protected function processarTrailerLote($linha) {
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação
$vetor["lote"] = substr($linha, 4, 4); //numerico //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); //num - default 5 //Tipo de Registro
$vetor["cnab1"] = substr($linha, 9, 9); //alfa - default brancos Uso Exclusivo FEBRABAN/CNAB
$vetor["quant_regs"] = substr($linha, 18, 6); //numerico //Quantidade de Registros do Lote
$vetor["quant_regs_simples"] = substr($linha, 24, 6); //numerico //Quantidade de Registros do Lote
$vetor["valor_simples"] = substr($linha, 30, 17); //numerico, 2 casas decimais //Somatória dos Valores
$vetor["quant_regs_vinculada"] = substr($linha, 47, 6); //numerico //Quantidade de Registros do Lote
$vetor["valor_vinculada"] = substr($linha, 53, 17); //numerico, 2 casas decimais //Somatória dos Valores
$vetor["quant_regs_caucionada"] = substr($linha, 70, 6); //numerico //Quantidade de Registros do Lote
$vetor["valor_caucionada"] = substr($linha, 76, 17); //numerico, 2 casas decimais //Somatória dos Valores
$vetor["quant_regs_descontada"] = substr($linha, 93, 6); //numerico //Quantidade de Registros do Lote
$vetor["valor_descontada"] = substr($linha, 99, 17); //numerico, 2 casas decimais //Somatória dos Valores
$vetor["num_aviso_debito"] = substr($linha, 116, 8); //numerico //Número Aviso de Débito
$vetor["cnab2"] = substr($linha, 124, 117); //alfa, default brancos //Uso Exclusivo FEBRABAN/CNAB
return $vetor;
}

protected function processarTrailerArquivo($linha) {
$vetor = array();
$vetor["banco"] = substr($linha, 1, 3); //numerico //Código do Banco na Compensação
$vetor["lote"] = substr($linha, 4, 4); // num - default 9999 //Lote de Serviço
$vetor["registro"] = substr($linha, 8, 1); //num - default 9 //Tipo de Registro
$vetor["cnab1"] = substr($linha, 9, 9); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB
$vetor["quant_lotes"] = substr($linha, 18, 6); //num. //Quantidade de Lotes do Arquivo
$vetor["quant_regs"] = substr($linha, 24, 6); //num. //Quantidade de Registros do Arquivo
$vetor["quant_contas_conc"] = substr($linha, 30, 6); //num. //Qtde de Contas p/ Conc. (Lotes)
$vetor["cnab2"] = substr($linha, 36, 205); //alpha - default brancos //Uso Exclusivo FEBRABAN/CNAB

return $vetor;
}
}
69 changes: 37 additions & 32 deletions src/ManoelCampos/RetornoBoleto/RetornoFactory.php
Expand Up @@ -7,11 +7,12 @@
require_once("RetornoCNAB400Abstract.php");
require_once("RetornoCNAB400Conv7.php");
require_once("RetornoCNAB400Bradesco.php");
require_once("RetornoCNAB240Sicoob.php");

/**
* Classe que identifica o tipo de arquivo de retorno sendo carregado e
* automaticamente instancia a classe específica para leitura do mesmo.
*
*
* @license <a href="https://opensource.org/licenses/MIT">MIT License</a>
* @author <a href="http://manoelcampos.com/contact">Manoel Campos da Silva Filho</a>
* @version 1.1
Expand All @@ -21,7 +22,7 @@ class RetornoFactory {
* @propert string $header Header do arquivo de retorno
*/
private $header;

/**
* @propert string $fileName Nome do arquivo de retorno
*/
Expand All @@ -34,22 +35,22 @@ class RetornoFactory {

/**
* Construtor padrão.
*
*
* @param string $fileName Nome do arquivo de retorno a ser identificado
* para poder instancia a classe específica para leitura do mesmo.
*/
private function __construct($fileName){
if ($fileName == "") {
throw new \Exception("Informe o nome do arquivo de retorno.");
}

$this->fileName = $fileName;
}
/**

/**
* Instancia um objeto de uma das sub-classes de RetornoBase,
* com base no tipo do arquivo de retorno indicado por $fileName.
*
*
* @param string $fileName Nome do arquivo de retorno a ser identificado
* para poder instancia a classe específica para leitura do mesmo.
* @return Uma instância de uma subclasse de RetornoBase
Expand All @@ -58,61 +59,65 @@ public static function getRetorno($fileName) {
$factory = new RetornoFactory($fileName);
$factory->arq = fopen($fileName, "r");
if ($factory->arq == NULL) {
throw new \Exception("Não foi possível abrir o arquivo '$fileName'.");
throw new \Exception("Não foi possível abrir o arquivo '$fileName'.");
}

try{
$factory->header = fgets($factory->arq, 500);
if ($factory->header == NULL) {
throw new \Exception("Tipo de arquivo de retorno não identificado. Não foi possível ler o header do arquivo.");
throw new \Exception("Tipo de arquivo de retorno não identificado. Não foi possível ler o header do arquivo.");
}

return $factory->tentaInstanciarObjetoLeituraArquivoRetorno();
} finally {
fclose($factory->arq);
}
}

/**
* Tenta descobrir qual o tipo do arquivo de retorno e instancia
* um objeto da classe responsável pra ler tal arquivo.
*
*
* @return \com\manoelcampos\RetornoBoleto\RetornoCNAB240
*/
private function tentaInstanciarObjetoLeituraArquivoRetorno(){
$retorno = $this->tentaInstanciarCnab240();
if ($retorno != NULL) {
return $retorno;
}
}

$retorno = $this->tentaInstanciarCnab400($this->arq);
if ($retorno != NULL) {
return $retorno;
}
}

throw new \Exception(
"Tipo de arquivo de retorno não identificado. ".
"Total de colunas do header: " . strlen($this->header));
}

/**
* Tenta instanciar um objeto para leitura de arquivos CNAB240,
* de acordo com a versão do arquivo de retorno.
* Tenta instanciar um objeto para leitura de arquivos CNAB240,
* de acordo com a versão do arquivo de retorno.
* @return RetornoCNAB240 Uma instância de uma subclasse de @see RetornoCNAB240
* @throws \Exception
*/
private function tentaInstanciarCnab240(){
$retorno = new RetornoCNAB240($this->fileName);
if ($retorno->arquivoEstaNoFormato($this->header)) {
return $retorno;
}

return NULL;
if (!$retorno->arquivoEstaNoFormato($this->header)) {
return NULL;
}

if (strstr($this->header, "SICOOB")) {
return new RetornoCNAB240Sicoob($this->fileName);
}

return $retorno;
}

/**
* Tenta instanciar um objeto para leitura de arquivos CNAB400,
* de acordo com a versão do arquivo de retorno.
* Tenta instanciar um objeto para leitura de arquivos CNAB400,
* de acordo com a versão do arquivo de retorno.
* @return RetornoCNAB400 Uma instância de uma subclasse de @see RetornoCNAB400
* @throws \Exception
*/
Expand All @@ -121,28 +126,28 @@ private function tentaInstanciarCnab400(){
if (!$retorno->arquivoEstaNoFormato($this->header)) {
return NULL;
}

if (strstr($this->header, "BRADESCO")) {
return new RetornoCNAB400Bradesco($this->fileName);
}

//Lê o primeiro registro detalhe
$linha_detalhe = fgets($this->arq, 500);
if ($linha_detalhe == NULL) {
throw new \Exception(
"Tipo de arquivo de retorno não identificado. Não foi possível ler um registro detalhe.");
"Tipo de arquivo de retorno não identificado. Não foi possível ler um registro detalhe.");
}

$retorno = new RetornoCNAB400($this->fileName);
if($retorno->getIdDetalhe() == $linha_detalhe[0]) {
return $retorno;
}

$retorno = new RetornoCNAB400Conv7($this->fileName);
if($retorno->getIdDetalhe() == $linha_detalhe[0]) {
return $retorno;
}

throw new \Exception("Tipo de registro detalhe desconhecido: " . $linha_detalhe[0]);
}
}
}

0 comments on commit 94d8777

Please sign in to comment.