From ced1b44b7bb2d5ba96e850e7ff6dfc1a13f9c31b Mon Sep 17 00:00:00 2001 From: wallace Date: Thu, 27 Apr 2017 17:59:00 -0300 Subject: [PATCH 1/7] =?UTF-8?q?Adicionado=20suporte=20a=20interface=20no?= =?UTF-8?q?=20Header=20do=20Arquivo...=20e=20adicionado=20o=20c=C3=B3digo?= =?UTF-8?q?=20do=20retorno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cnab/Retorno/Cnab240/Arquivo.php | 23 +++++++++++++++++++++- src/Cnab/Retorno/Cnab240/HeaderArquivo.php | 15 +++++++++++++- src/Cnab/Retorno/Cnab400/Arquivo.php | 11 +++++++++++ src/Cnab/Retorno/Cnab400/Header.php | 14 ++++++++++++- src/Cnab/Retorno/IArquivo.php | 7 +++++++ src/Cnab/Retorno/IHeaderArquivo.php | 14 +++++++++++++ 6 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/Cnab/Retorno/IHeaderArquivo.php diff --git a/src/Cnab/Retorno/Cnab240/Arquivo.php b/src/Cnab/Retorno/Cnab240/Arquivo.php index 9e21283..b690be0 100755 --- a/src/Cnab/Retorno/Cnab240/Arquivo.php +++ b/src/Cnab/Retorno/Cnab240/Arquivo.php @@ -2,13 +2,14 @@ namespace Cnab\Retorno\Cnab240; +use Cnab\Retorno\IHeaderArquivo; use Cnab\Retorno\Linha; class Arquivo implements \Cnab\Retorno\IArquivo { private $content; - public $header = false; + public $header = null; public $lotes = array(); public $linhas = array(); public $trailer = false; @@ -115,6 +116,16 @@ public function getConta() return $this->header->getConta(); } + /** + * Retorna o Header do arquivo re retorno + * + * @return IHeaderArquivo + */ + public function getHeader() + { + return $this->header; + } + /** * Retorna o digito de auto conferencia da conta. * @@ -135,6 +146,16 @@ public function getCodigoBanco() return $this->header->codigo_banco; } + /** + * Retorna o Código da Remessa ou Retorno + * + * @return string + */ + public function getCodigoRemessaRetorno() + { + return $this->header->codigo_remessa_retorno; + } + /** * Retorna a data de geração do arquivo. * diff --git a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php index 06fc697..4112b84 100755 --- a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php +++ b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php @@ -2,7 +2,9 @@ namespace Cnab\Retorno\Cnab240; -class HeaderArquivo extends \Cnab\Format\Linha +use Cnab\Retorno\IHeaderArquivo; + +class HeaderArquivo extends \Cnab\Format\Linha implements IHeaderArquivo { public function __construct(\Cnab\Retorno\IArquivo $arquivo) { @@ -36,4 +38,15 @@ public function getCodigoConvenio() return; } } + + public function getCodigoRetorno() + { + if ($this->existField('codigo_remessa_retorno')) { + return $this->codigo_remessa_retorno; + } else { + return; + } + } + + } diff --git a/src/Cnab/Retorno/Cnab400/Arquivo.php b/src/Cnab/Retorno/Cnab400/Arquivo.php index 515eae5..7313480 100755 --- a/src/Cnab/Retorno/Cnab400/Arquivo.php +++ b/src/Cnab/Retorno/Cnab400/Arquivo.php @@ -2,6 +2,7 @@ namespace Cnab\Retorno\Cnab400; +use Cnab\Retorno\IHeaderArquivo; use Cnab\Retorno\Linha; class Arquivo implements \Cnab\Retorno\IArquivo @@ -77,6 +78,16 @@ public function listDetalhes() return $this->detalhes; } + /** + * Retorna o Header do arquivo re retorno + * + * @return IHeaderArquivo + */ + public function getHeader() + { + return $this->header; + } + /** * Retorna o numero da conta. * diff --git a/src/Cnab/Retorno/Cnab400/Header.php b/src/Cnab/Retorno/Cnab400/Header.php index 783225c..c3ee513 100755 --- a/src/Cnab/Retorno/Cnab400/Header.php +++ b/src/Cnab/Retorno/Cnab400/Header.php @@ -2,7 +2,9 @@ namespace Cnab\Retorno\Cnab400; -class Header extends \Cnab\Format\Linha +use \Cnab\Retorno\IHeaderArquivo; + +class Header extends \Cnab\Format\Linha implements IHeaderArquivo { private $_codigo_banco = null; @@ -41,4 +43,14 @@ public function getCodigoCedente() return $this->codigo_cedente; } } + + public function getCodigoRetorno() + { + if ($this->existField('codigo_de_retorno')) { + return $this->codigo_de_retorno; + } else { + return; + } + } + } diff --git a/src/Cnab/Retorno/IArquivo.php b/src/Cnab/Retorno/IArquivo.php index 9fb6de9..0bd77cd 100755 --- a/src/Cnab/Retorno/IArquivo.php +++ b/src/Cnab/Retorno/IArquivo.php @@ -46,4 +46,11 @@ public function getDataGeracao(); * @return \DateTime */ public function getDataCredito(); + + /** + * Retorna o Header do arquivo re retorno + * + * @return IHeaderArquivo + */ + public function getHeader(); } diff --git a/src/Cnab/Retorno/IHeaderArquivo.php b/src/Cnab/Retorno/IHeaderArquivo.php new file mode 100644 index 0000000..56e5ac4 --- /dev/null +++ b/src/Cnab/Retorno/IHeaderArquivo.php @@ -0,0 +1,14 @@ + Date: Fri, 28 Apr 2017 09:43:55 -0300 Subject: [PATCH 2/7] =?UTF-8?q?Adicionado=20suporte=20a=20pr=C3=A9-cr?= =?UTF-8?q?=C3=ADtica=20da=20Caixa..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cnab/Factory.php | 11 +++++++++-- src/Cnab/Format/Identifier.php | 16 +++++++++++++++- src/Cnab/Retorno/Cnab240/Arquivo.php | 3 ++- src/Cnab/Retorno/Cnab240/HeaderArquivo.php | 8 ++++++++ src/Cnab/Retorno/Cnab400/Arquivo.php | 2 +- src/Cnab/Retorno/Cnab400/Header.php | 6 ++++++ src/Cnab/Retorno/IHeaderArquivo.php | 2 ++ 7 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/Cnab/Factory.php b/src/Cnab/Factory.php index c9d75ca..9c3bb94 100755 --- a/src/Cnab/Factory.php +++ b/src/Cnab/Factory.php @@ -54,7 +54,7 @@ public function createRemessa($codigo_banco, $formato = 'cnab400', $layoutVersao * * @param string $filename * - * @return \Cnab\Remessa\IArquivo + * @return \Cnab\Retorno\IArquivo */ public function createRetorno($filename) { @@ -70,7 +70,12 @@ public function createRetorno($filename) throw new \Exception('Formato do arquivo não identificado'); } - if ($format['tipo'] != 'retorno') { + if ( + $format['tipo'] != 'retorno' && + $format['tipo'] != 'remessa_processada' && + $format['tipo'] != 'remessa_processada_parcial' && + $format['tipo'] != 'remessa_rejeitada') { + throw new \Exception('Este não é um arquivo de retorno'); } @@ -84,6 +89,8 @@ public function createRetorno($filename) // por enquanto só suporta o Cnab400 + + if ($format['bytes'] == 400) { return new Retorno\Cnab400\Arquivo($format['banco'], $filename, $format['layout_versao']); } elseif ($format['bytes'] == 240) { diff --git a/src/Cnab/Format/Identifier.php b/src/Cnab/Format/Identifier.php index 6351488..a7fc687 100755 --- a/src/Cnab/Format/Identifier.php +++ b/src/Cnab/Format/Identifier.php @@ -20,10 +20,14 @@ public function identifyFile($filename) $lines = \explode("\n", $contents); + + if (\count($lines) < 2) { return; } + + $length = 0; foreach ($lines as $line) { $length = \max($length, strlen($line)); @@ -37,6 +41,8 @@ public function identifyFile($filename) return; } + + $layout_versao = null; if ($bytes == 400) { @@ -54,7 +60,9 @@ public function identifyFile($filename) $codigo_tipo = \substr($lines[0], 142, 1); $tipo = null; - // Pega a Versao do Layout da CEF + + + // Pega a Versao do Layout da CEF if (\Cnab\Banco::CEF == $codigo_banco) { $layout_versao = \substr($lines[0], 163, 3); @@ -71,6 +79,12 @@ public function identifyFile($filename) $tipo = 'remessa'; } elseif (\strtoupper($codigo_tipo) == '2') { $tipo = 'retorno'; + } elseif (\strtoupper($codigo_tipo) == '3') { + $tipo = 'remessa_processada'; + } elseif (\strtoupper($codigo_tipo) == '4') { + $tipo = 'remessa_processada_parcial'; + } elseif (\strtoupper($codigo_tipo) == '5') { + $tipo = 'remessa_rejeitada'; } } else { return; diff --git a/src/Cnab/Retorno/Cnab240/Arquivo.php b/src/Cnab/Retorno/Cnab240/Arquivo.php index b690be0..9751d2e 100755 --- a/src/Cnab/Retorno/Cnab240/Arquivo.php +++ b/src/Cnab/Retorno/Cnab240/Arquivo.php @@ -4,6 +4,7 @@ use Cnab\Retorno\IHeaderArquivo; use Cnab\Retorno\Linha; +use DateTime; class Arquivo implements \Cnab\Retorno\IArquivo { @@ -143,7 +144,7 @@ public function getContaDac() */ public function getCodigoBanco() { - return $this->header->codigo_banco; + return $this->codigo_banco; } /** diff --git a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php index 4112b84..8868cec 100755 --- a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php +++ b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php @@ -6,8 +6,12 @@ class HeaderArquivo extends \Cnab\Format\Linha implements IHeaderArquivo { + + private $_codigo_banco = null; + public function __construct(\Cnab\Retorno\IArquivo $arquivo) { + $this->_codigo_banco = $arquivo->codigo_banco; $yamlLoad = new \Cnab\Format\YamlLoad($arquivo->codigo_banco, $arquivo->layoutVersao); $yamlLoad->load($this, 'cnab240', 'header_arquivo'); } @@ -48,5 +52,9 @@ public function getCodigoRetorno() } } + public function getCodigoBanco() + { + return $this->_codigo_banco; + } } diff --git a/src/Cnab/Retorno/Cnab400/Arquivo.php b/src/Cnab/Retorno/Cnab400/Arquivo.php index 7313480..39b3bce 100755 --- a/src/Cnab/Retorno/Cnab400/Arquivo.php +++ b/src/Cnab/Retorno/Cnab400/Arquivo.php @@ -125,7 +125,7 @@ public function getContaDac() */ public function getCodigoBanco() { - return $this->header->codigo_do_banco; + return $this->codigo_banco; } /** diff --git a/src/Cnab/Retorno/Cnab400/Header.php b/src/Cnab/Retorno/Cnab400/Header.php index c3ee513..edec9da 100755 --- a/src/Cnab/Retorno/Cnab400/Header.php +++ b/src/Cnab/Retorno/Cnab400/Header.php @@ -53,4 +53,10 @@ public function getCodigoRetorno() } } + public function getCodigoBanco() + { + //return $this->_codigo_banco; + return $this->codigo_do_banco; + } + } diff --git a/src/Cnab/Retorno/IHeaderArquivo.php b/src/Cnab/Retorno/IHeaderArquivo.php index 56e5ac4..cdb4d21 100644 --- a/src/Cnab/Retorno/IHeaderArquivo.php +++ b/src/Cnab/Retorno/IHeaderArquivo.php @@ -11,4 +11,6 @@ public function getConta(); public function getCodigoRetorno(); + public function getCodigoBanco(); + } \ No newline at end of file From f8032d99dca2b251a41917b0d94c9f57c35a16c1 Mon Sep 17 00:00:00 2001 From: wallace Date: Fri, 28 Apr 2017 09:56:45 -0300 Subject: [PATCH 3/7] =?UTF-8?q?Adicionado=20suporte=20a=20pr=C3=A9-cr?= =?UTF-8?q?=C3=ADtica=20da=20Caixa..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cnab/Retorno/Cnab240/HeaderArquivo.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php index 8868cec..82362f4 100755 --- a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php +++ b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php @@ -7,11 +7,8 @@ class HeaderArquivo extends \Cnab\Format\Linha implements IHeaderArquivo { - private $_codigo_banco = null; - public function __construct(\Cnab\Retorno\IArquivo $arquivo) { - $this->_codigo_banco = $arquivo->codigo_banco; $yamlLoad = new \Cnab\Format\YamlLoad($arquivo->codigo_banco, $arquivo->layoutVersao); $yamlLoad->load($this, 'cnab240', 'header_arquivo'); } @@ -54,7 +51,7 @@ public function getCodigoRetorno() public function getCodigoBanco() { - return $this->_codigo_banco; + return $this->codigo_banco; } } From 1cefaa480b0b59742786c213c5767936259ffb5d Mon Sep 17 00:00:00 2001 From: wallace Date: Wed, 31 May 2017 11:26:26 -0300 Subject: [PATCH 4/7] Implementado o tipo de registro no arquivo Detalhe.php --- src/Cnab/Retorno/Cnab240/Detalhe.php | 15 +++++++++++++++ tests/Cnab/Retorno/Cnab240/ArquivoTest.php | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/Cnab/Retorno/Cnab240/Detalhe.php b/src/Cnab/Retorno/Cnab240/Detalhe.php index 0d6aafa..7e7a67d 100755 --- a/src/Cnab/Retorno/Cnab240/Detalhe.php +++ b/src/Cnab/Retorno/Cnab240/Detalhe.php @@ -66,6 +66,21 @@ public function getCodigo() return (int) $this->segmento_t->codigo_movimento; } + /** + * Código adotado pela FEBRABAN para identificar o tipo de registro: + * 0 = Header de Arquivo + * 1 = Header de Lote + * 3 = Detalhe + * 5 = Trailer de Lote + * 9 = Trailer de Arquivo + * + * @return int + */ + public function getTipoRegistro() + { + return (int) $this->segmento_t->tipo_registro; + } + /** * Retorna o valor recebido em conta. * diff --git a/tests/Cnab/Retorno/Cnab240/ArquivoTest.php b/tests/Cnab/Retorno/Cnab240/ArquivoTest.php index cd90aa5..5f3a0f5 100755 --- a/tests/Cnab/Retorno/Cnab240/ArquivoTest.php +++ b/tests/Cnab/Retorno/Cnab240/ArquivoTest.php @@ -69,6 +69,7 @@ public function testArquivoCaixaSigcbPodeSerLido() $detalhe = $arquivo->listDetalhes(); $detalhe = $detalhe[0]; + $this->assertEquals(3, $detalhe->getTipoRegistro()); $this->assertEquals(6, $detalhe->getCodigo()); $this->assertEquals(80.00, $detalhe->getValorRecebido()); $this->assertEquals(80.00, $detalhe->getValorTitulo()); @@ -81,6 +82,7 @@ public function testArquivoCaixaSigcbPodeSerLido() $this->assertEquals(null, $detalhe->getNumeroDocumento()); $this->assertEquals(null, $detalhe->getCarteira()); $this->assertEquals('0', $detalhe->getAgencia()); + $this->assertEquals(11136997, $detalhe->getNossoNumero()); $this->assertEquals(new \DateTime('2014-01-02 00:00:00'), $detalhe->getDataVencimento()); $this->assertEquals(new \DateTime('2014-01-07 00:00:00'), $detalhe->getDataCredito()); From b86f74652b88fd2213b443454ab8076951aa4ec6 Mon Sep 17 00:00:00 2001 From: wallace Date: Fri, 2 Jun 2017 14:07:47 -0300 Subject: [PATCH 5/7] Ajustado a checagem correta do tipo do cliente para o arquivo de remessa. --- src/Cnab/Remessa/Cnab240/Arquivo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cnab/Remessa/Cnab240/Arquivo.php b/src/Cnab/Remessa/Cnab240/Arquivo.php index 563685d..677dfca 100644 --- a/src/Cnab/Remessa/Cnab240/Arquivo.php +++ b/src/Cnab/Remessa/Cnab240/Arquivo.php @@ -310,7 +310,7 @@ public function insertDetalhe(array $boleto, $tipo = 'remessa') $detalhe->segmento_q->codigo_banco = $this->headerArquivo->codigo_banco; $detalhe->segmento_q->lote_servico = $this->headerLote->lote_servico; $detalhe->segmento_q->codigo_ocorrencia = $detalhe->segmento_p->codigo_ocorrencia; - if (@$boleto['sacado_cnpj']) { + if ( @$boleto['sacado_tipo'] == 'cnpj' ) { $detalhe->segmento_q->sacado_codigo_inscricao = '2'; $detalhe->segmento_q->sacado_numero_inscricao = $this->prepareText($boleto['sacado_cnpj'], '.-/'); $detalhe->segmento_q->nome = $this->prepareText($boleto['sacado_razao_social']); From f9be0e2b5d04ad5f81e3225cf44328bd9587bc0b Mon Sep 17 00:00:00 2001 From: wallace Date: Tue, 18 Jul 2017 11:32:23 -0300 Subject: [PATCH 6/7] =?UTF-8?q?Adicionado=20a=20descri=C3=A7=C3=A3o=20e=20?= =?UTF-8?q?o=20c=C3=B3digo=20da=20baixa=20ou=20liquida=C3=A7=C3=A3o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cnab/Retorno/Cnab240/Detalhe.php | 36 +++++++++++++++++++++------- src/Cnab/Retorno/IDetalhe.php | 4 ++-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/Cnab/Retorno/Cnab240/Detalhe.php b/src/Cnab/Retorno/Cnab240/Detalhe.php index 7e7a67d..d7653d3 100755 --- a/src/Cnab/Retorno/Cnab240/Detalhe.php +++ b/src/Cnab/Retorno/Cnab240/Detalhe.php @@ -388,27 +388,47 @@ public function getCodigoNome() } /** - * Retorna o código de liquidação, normalmente usado para + * Retorna o código de liquidação ou da baixa, normalmente usado para * saber onde o cliente efetuou o pagamento. * * @return string */ - public function getCodigoLiquidacao() + public function getCodigoLiquidacaoOuBaixa() { - // @TODO: Resgatar o código de liquidação - return; + return substr($this->segmento_t->identificacao_rejeicao,0,2); } /** - * Retorna a descrição do código de liquidação, normalmente usado para + * Retorna a descrição do código de liquidação ou da baixa, normalmente usado para * saber onde o cliente efetuou o pagamento. * * @return string */ - public function getDescricaoLiquidacao() + public function getDescricaoLiquidacaoOuBaixa() { - // @TODO: Resgator descrição do código de liquidação - return; + $codigo = (int) $this->getCodigoLiquidacaoOuBaixa(); + + $table = array( + 2 => 'Casa Lotérica', + 3 => 'Agências CAIXA', + 4 => 'Compensação Eletrônica', + 5 => 'Compoensação Convencional', + 6 => 'Internet Banking', + 7 => 'Correspondente Bancário', + 8 => 'Em Cartório', + 9 => 'Comandada Banco', + 10 => 'Comandada Cliente via Arquivo', + 11 => 'Comandada Cliente On-Line', + 12 => 'Decurso Prazo - Cliente', + 13 => 'Decurso Prazo - Banco', + 14 => 'Protestado' + ); + + if (array_key_exists($codigo, $table)) { + return $table[$codigo]; + } else { + return 'Desconhecido'; + } } public function dump() diff --git a/src/Cnab/Retorno/IDetalhe.php b/src/Cnab/Retorno/IDetalhe.php index 3c509e0..ca8122e 100755 --- a/src/Cnab/Retorno/IDetalhe.php +++ b/src/Cnab/Retorno/IDetalhe.php @@ -164,7 +164,7 @@ public function isBaixaRejeitada(); * * @return string */ - public function getCodigoLiquidacao(); + public function getCodigoLiquidacaoOuBaixa(); /** * Retorna a descrição do código de liquidação, normalmente usado para @@ -172,7 +172,7 @@ public function getCodigoLiquidacao(); * * @return string */ - public function getDescricaoLiquidacao(); + public function getDescricaoLiquidacaoOuBaixa(); /** * Retorna de o boleto foi pago através do Débito Direto Autorizado. From 82e053e980031b5f7cacdf9486b32f91ec287434 Mon Sep 17 00:00:00 2001 From: wallace Date: Tue, 18 Jul 2017 11:38:00 -0300 Subject: [PATCH 7/7] =?UTF-8?q?Adicionado=20a=20descri=C3=A7=C3=A3o=20e=20?= =?UTF-8?q?o=20c=C3=B3digo=20da=20baixa=20ou=20liquida=C3=A7=C3=A3o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cnab/Retorno/Cnab240/Detalhe.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Cnab/Retorno/Cnab240/Detalhe.php b/src/Cnab/Retorno/Cnab240/Detalhe.php index d7653d3..fbd6524 100755 --- a/src/Cnab/Retorno/Cnab240/Detalhe.php +++ b/src/Cnab/Retorno/Cnab240/Detalhe.php @@ -391,11 +391,11 @@ public function getCodigoNome() * Retorna o código de liquidação ou da baixa, normalmente usado para * saber onde o cliente efetuou o pagamento. * - * @return string + * @return int */ public function getCodigoLiquidacaoOuBaixa() { - return substr($this->segmento_t->identificacao_rejeicao,0,2); + return (int) substr($this->segmento_t->identificacao_rejeicao,0,2); } /**