diff --git a/src/Util.php b/src/Util.php index 619c078f..0373e51b 100644 --- a/src/Util.php +++ b/src/Util.php @@ -1147,16 +1147,18 @@ public static function whichOne($a, ...$parms) */ public static function validarCpf($cpf) { - $c = sprintf('%011s', self::onlyNumbers($cpf)); + $c = self::onlyNumbers($cpf); if (mb_strlen($c) != 11 || preg_match("/^{$c[0]}{11}$/", $c)) { return false; } for ($s = 10, $n = 0, $i = 0; $s >= 2; $n += $c[$i++] * $s--); if ($c[9] != ((($n %= 11) < 2) ? 0 : 11 - $n)) { + return false; } for ($s = 11, $n = 0, $i = 0; $s >= 2; $n += $c[$i++] * $s--); if ($c[10] != ((($n %= 11) < 2) ? 0 : 11 - $n)) { + return false; } @@ -1169,20 +1171,19 @@ public static function validarCpf($cpf) */ public static function validarCnpj($cnpj) { - $c = sprintf('%014s', self::onlyNumbers($cnpj)); + $c = self::onlyNumbers($cnpj); $b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; - if ($c < 1) { - return false; - } - if (mb_strlen($c) != 14) { + if (mb_strlen($c) != 14 || preg_match("/^{$c[0]}{14}$/", $c)) { return false; } for ($i = 0, $n = 0; $i < 12; $n += $c[$i] * $b[++$i]); if ($c[12] != ((($n %= 11) < 2) ? 0 : 11 - $n)) { + return false; } for ($i = 0, $n = 0; $i <= 12; $n += $c[$i] * $b[$i++]); if ($c[13] != ((($n %= 11) < 2) ? 0 : 11 - $n)) { + return false; } @@ -1317,22 +1318,27 @@ public static function tipoChavePix($chave) $parametro = trim($chave); if (filter_var($parametro, FILTER_VALIDATE_EMAIL)) { + return AbstractBoleto::TIPO_CHAVEPIX_EMAIL; } if (Util::validarCnpj($parametro)) { + return AbstractBoleto::TIPO_CHAVEPIX_CNPJ; } if (Util::validarCpf($parametro)) { + return AbstractBoleto::TIPO_CHAVEPIX_CPF; } // Verificar se é um telefone - if (preg_match('/^(\+\d{2})?\(?\d{2}\)?[-.\s]?(\d\s?)?\d{4}[-.\s]?\d{4}$/', $parametro)) { + if (preg_match('/^(\+\d{2}\s?)?[-.\s]?\(?\d{2}\)?[-.\s]?(\d\s?)?\d{4}[-.\s]?\d{4}$/', $parametro)) { + return AbstractBoleto::TIPO_CHAVEPIX_CELULAR; } + $parametro = Util::onlyAlphanumber($parametro); // Verificar se é um UUID if (preg_match('/^[a-fA-F0-9]{32}$/', $parametro) && (ctype_xdigit($parametro))) { return AbstractBoleto::TIPO_CHAVEPIX_ALEATORIA; diff --git a/tests/UtilTest.php b/tests/UtilTest.php index bf06cd35..dbbec025 100644 --- a/tests/UtilTest.php +++ b/tests/UtilTest.php @@ -2,8 +2,11 @@ namespace Eduardokum\LaravelBoleto\Tests; +use Eduardokum\LaravelBoleto\Boleto\AbstractBoleto; +use Eduardokum\LaravelBoleto\Pessoa; use Exception; use Eduardokum\LaravelBoleto\Util; +use Illuminate\Support\Arr; class UtilTest extends TestCase { @@ -171,4 +174,78 @@ public function testFuncaoFormatarLinhaDigitavelErro() $this->expectException(Exception::class); Util::formatLinhaDigitavel('7569111110010123123000000016001019536000001000010'); } + + public function testFuncaoGerarPixCopiaECola() + { + $pixCopiaECola = Util::gerarPixCopiaECola('teste@teste.com', 100.00, 'id-transacao', new Pessoa(['nome' => 'NOME_DA_PESSOA', 'cidade' => 'CIDADE'])); + $this->assertEquals('00020101021226370014br.gov.bcb.pix0115teste@teste.com52040000530398654031005802BR5914NOME_DA_PESSOA6006CIDADE62160512id-transacao6304DA67', $pixCopiaECola); + } + + public function testFuncaoDecodePixCopiaECola() + { + $pixDecoded = Util::decodePixCopiaECola('00020101021226370014br.gov.bcb.pix0115teste@teste.com52040000530398654031005802BR5914NOME_DA_PESSOA6006CIDADE62160512id-transacao6304DA67'); + + $this->assertEquals('teste@teste.com', Arr::get($pixDecoded, '26.01')); + $this->assertEquals('id-transacao', Arr::get($pixDecoded, '62.05')); + $this->assertEquals(100, Arr::get($pixDecoded, '54')); + $this->assertEquals('NOME_DA_PESSOA', Arr::get($pixDecoded, '59')); + $this->assertEquals('CIDADE', Arr::get($pixDecoded, '60')); + } + + public function testFuncaoTipoChavePix() + { + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_EMAIL, Util::tipoChavePix('teste@teste.com')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_EMAIL, Util::tipoChavePix('teste@teste.com.br')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_EMAIL, Util::tipoChavePix('teste@teste.com.br')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CNPJ, Util::tipoChavePix('00.000.000/0001-91')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CPF, Util::tipoChavePix('000.000.001-91')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99)9999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 9999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 9999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 9999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99)99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 99999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('(99) 99999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('9999999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('99 99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('99 99999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('99 99999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('9999999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('9999999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('9999999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('99999999999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+5599999999999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+559999999999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55-99-99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55.99.99999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 9999999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 99999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 9999999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 99999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 9999999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55-99-9999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55.99.9999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 9999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 999999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 9999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 999999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 99 99999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 9999999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 99999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 99999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 99999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 999999999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 9999-9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 9999.9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 9999 9999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_CELULAR, Util::tipoChavePix('+55 (99) 99999999')); + $this->assertEquals(AbstractBoleto::TIPO_CHAVEPIX_ALEATORIA, Util::tipoChavePix('b527c9ac-9cb9-4fe1-a526-2f700fcf8ed7')); + + $this->assertNull(Util::tipoChavePix('b527c9ac-9cb9-4fe1-a526-2f700fcf8ed7-1234')); + $this->assertNull(Util::tipoChavePix('00.000.000/0001-00')); + $this->assertNull(Util::tipoChavePix('000.000.001-00')); + $this->assertNull(Util::tipoChavePix('texto-qualquer')); + } }