From 94d877726130a0add53e2fa483223ae07febc0ee Mon Sep 17 00:00:00 2001 From: Mauro Tschiedel Date: Wed, 14 Mar 2018 11:04:54 -0300 Subject: [PATCH] =?UTF-8?q?Criado=20Retorno=20Sicoob=20padr=C3=A3o=20CNAB2?= =?UTF-8?q?40=20-=20Segmento=20T=20e=20U=20(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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. --- .../RetornoBoleto/RetornoCNAB240Sicoob.php | 186 ++++++++++++++++++ .../RetornoBoleto/RetornoFactory.php | 69 ++++--- 2 files changed, 223 insertions(+), 32 deletions(-) create mode 100644 src/ManoelCampos/RetornoBoleto/RetornoCNAB240Sicoob.php diff --git a/src/ManoelCampos/RetornoBoleto/RetornoCNAB240Sicoob.php b/src/ManoelCampos/RetornoBoleto/RetornoCNAB240Sicoob.php new file mode 100644 index 0000000..fa6cd2c --- /dev/null +++ b/src/ManoelCampos/RetornoBoleto/RetornoCNAB240Sicoob.php @@ -0,0 +1,186 @@ +Febraban 240 posições V08.4 de 01/09/2009.

+ * + * @license MIT License + * @author Mauro Tschiedel + * @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; + } +} diff --git a/src/ManoelCampos/RetornoBoleto/RetornoFactory.php b/src/ManoelCampos/RetornoBoleto/RetornoFactory.php index 6251af2..34dec12 100755 --- a/src/ManoelCampos/RetornoBoleto/RetornoFactory.php +++ b/src/ManoelCampos/RetornoBoleto/RetornoFactory.php @@ -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 MIT License * @author Manoel Campos da Silva Filho * @version 1.1 @@ -21,7 +22,7 @@ class RetornoFactory { * @propert string $header Header do arquivo de retorno */ private $header; - + /** * @propert string $fileName Nome do arquivo de retorno */ @@ -34,7 +35,7 @@ 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. */ @@ -42,14 +43,14 @@ 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 @@ -58,13 +59,13 @@ 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(); @@ -72,47 +73,51 @@ public static function getRetorno($fileName) { 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 */ @@ -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]); } -} \ No newline at end of file +}