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/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']); diff --git a/src/Cnab/Retorno/Cnab240/Arquivo.php b/src/Cnab/Retorno/Cnab240/Arquivo.php index 9e21283..9751d2e 100755 --- a/src/Cnab/Retorno/Cnab240/Arquivo.php +++ b/src/Cnab/Retorno/Cnab240/Arquivo.php @@ -2,13 +2,15 @@ namespace Cnab\Retorno\Cnab240; +use Cnab\Retorno\IHeaderArquivo; use Cnab\Retorno\Linha; +use DateTime; 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 +117,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. * @@ -132,7 +144,17 @@ public function getContaDac() */ public function getCodigoBanco() { - return $this->header->codigo_banco; + return $this->codigo_banco; + } + + /** + * Retorna o Código da Remessa ou Retorno + * + * @return string + */ + public function getCodigoRemessaRetorno() + { + return $this->header->codigo_remessa_retorno; } /** diff --git a/src/Cnab/Retorno/Cnab240/Detalhe.php b/src/Cnab/Retorno/Cnab240/Detalhe.php index 0d6aafa..fbd6524 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. * @@ -373,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 + * @return int */ - public function getCodigoLiquidacao() + public function getCodigoLiquidacaoOuBaixa() { - // @TODO: Resgatar o código de liquidação - return; + return (int) 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/Cnab240/HeaderArquivo.php b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php index 06fc697..82362f4 100755 --- a/src/Cnab/Retorno/Cnab240/HeaderArquivo.php +++ b/src/Cnab/Retorno/Cnab240/HeaderArquivo.php @@ -2,8 +2,11 @@ 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) { $yamlLoad = new \Cnab\Format\YamlLoad($arquivo->codigo_banco, $arquivo->layoutVersao); @@ -36,4 +39,19 @@ public function getCodigoConvenio() return; } } + + public function getCodigoRetorno() + { + if ($this->existField('codigo_remessa_retorno')) { + return $this->codigo_remessa_retorno; + } else { + return; + } + } + + public function getCodigoBanco() + { + return $this->codigo_banco; + } + } diff --git a/src/Cnab/Retorno/Cnab400/Arquivo.php b/src/Cnab/Retorno/Cnab400/Arquivo.php index 515eae5..39b3bce 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. * @@ -114,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 783225c..edec9da 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,20 @@ public function getCodigoCedente() return $this->codigo_cedente; } } + + public function getCodigoRetorno() + { + if ($this->existField('codigo_de_retorno')) { + return $this->codigo_de_retorno; + } else { + return; + } + } + + public function getCodigoBanco() + { + //return $this->_codigo_banco; + return $this->codigo_do_banco; + } + } 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/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. diff --git a/src/Cnab/Retorno/IHeaderArquivo.php b/src/Cnab/Retorno/IHeaderArquivo.php new file mode 100644 index 0000000..cdb4d21 --- /dev/null +++ b/src/Cnab/Retorno/IHeaderArquivo.php @@ -0,0 +1,16 @@ +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());