lira92 / flunt.br

Extensions of Flunt for Brazilian projects
MIT License
52 stars 10 forks source link

Suportar mais telefones #1

Closed andrebaltieri closed 6 years ago

andrebaltieri commented 6 years ago

O método IsPhone atualmente só suporta "(99)9999-9999", acrescentar os seguintes:

(99) 9999-9999 (99) 99999-9999 (99)9999-9999 (99)99999-9999 999999-9999 9999999-9999 9999999999 99999999999 99 9999 9999 99 99999 9999 55(99) 9999-9999 55(99) 99999-9999 55(99)9999-9999 55(99)99999-9999 55999999-9999 559999999-9999 559999999999 5599999999999 5599 9999 9999 5599 99999 9999 55 (99) 9999-9999 55 (99) 99999-9999 55 (99)9999-9999 55 (99)99999-9999 55 999999-9999 55 9999999-9999 55 9999999999 55 99999999999 55 99 9999 9999 55 99 99999 9999 +55 (99) 9999-9999 +55 (99) 99999-9999 +55 (99)9999-9999 +55 (99)99999-9999 +55 999999-9999 +55 9999999-9999 +55 9999999999 +55 99999999999 +55 99 9999 9999 +55 99 99999 9999

Sugestão 1: Remover espaços, parênteses e traços e validar apenas o tamanho do campo.

Sugestão 2: Receber junto a validação uma máscara: .IsPhone(phone, "+99 (99) 99999-9999", "Phone", "Telefone inválido")

lira92 commented 6 years ago

@andrebaltieri perfeito, assim que possível faço essa implementação, se quiser contribuir também sinta-se a vontade.

andrebaltieri commented 6 years ago

Sem pressa, também estou sem tempo... Uma dica, nos testes você pode fazer isto:

        [DataTestMethod]
        [DataRow(-1)]
        [DataRow(0)]
        [DataRow(1)]
        [TestMethod]
        public void ReturnFalseGivenValuesLessThan2(int value)
        {
            var result = _primeService.IsPrime(value);
            Assert.IsFalse(result, $"{value} should not be prime");
        }

Deste modo ele vai executar o teste 3x (com -1, 0 e 1).

lira92 commented 6 years ago

@andrebaltieri legal, não sabia.

lira92 commented 6 years ago

@andrebaltieri sobre as sugestões particularmente gostei mais da segunda, acho que faz mais sentido.

lira92 commented 6 years ago

@andrebaltieri eu alterei o método IsPhone para suportar mais formatos da segunda forma que você apontou, porém, como representar formatos onde tenha uma quantidade variável de números, por exemplo, o celular, para que considere tanto +55 (45) 9999-9999 quanto +55 (45) 99999-9999 válidos? Alguma sugestão? Qualquer coisa consulta essa branch

gabrieljesus commented 6 years ago

Olá @lira92, talvez essa regex ajude: ^(?:+?55)?(?:-|\ )?(?:(?[0-9]{2}?)?)(?:-|\ )?(?:[0-9]{5}|[0-9]{4})(?:-|\ )?(?:[0-9]{4})$ Com ela você pode passar inclusive com a máscara, lembrando que como é para o Brasil, eu fixei o ddi para 55.

lira92 commented 6 years ago

@gabrieljesus entendo, mas a questão é que criei o método que gera a regex para validar o telefone com base no formato passado, de um modo que fique flexível, se você passa (+99) 99 9999-9999 ele irá validar se o input passado tem exatamente esse formato, todos os espaços e caracteres. Porém, só queria uma forma de sintaxe legível, para que quem fosse utilizar pudesse passar um formato que fosse mais permissível, inicialmente a ideia seria somente para suportar números de celular que podem possuir 5 ou 4 digitos antes do "-". eu imagino algo assim:

new ValidationContract().IsPhone("(+99) 99 9999?-9999", object.phone, "Phone");

Acha que faz sentido pra você? Tem uma ideia melhor?

gabrieljesus commented 6 years ago

@lira92 saquei! Tinha entendido que você queria uma regex que abrangesse todos os casos que o @andrebaltieri havia sugerido. Para o escopo Brasil, acho que esse formato é interessante.

Pensando em uma evolução disso, poderíamos ter uma classe Phone (se é que já não existe) que tivesse métodos para pegar/setar partes do telefone e formatação, assim como temos as classes relacionadas a Date. Neste caso, o formato poderia ser algo como "(+II) LL NNNN?-NNNN" e com isso poderíamos ter um getInternationalArea(), getLocalArea() ou getFormat() e assim por diante.

var phone = new Phone(@"+99 (99) 99999-9999", @"+II (LL) NNNN?-NNNN");

ou

// Já vi gente aqui no Brasil colocar o celular assim também :/
var phone = new Phone(@"+99 (99) 999 999 999", @"+II (LL) NNN NNN NNN");

Com isso teríamos uma gama maior de validações, como por exemplo, checar se o telefone passado pertence a uma determinada região.

Seu IsPhone() poderia ficar assim:

new ValidationContract().IsPhone(object.phone, "Phone");

e ele mesmo teria condições de pegar a máscara e validar se o número bate.

Posso estar viajando, uma vez que tive contato com o Flunt a pouco tempo (menos que 1 dia hehehe), mas acho que isso deixaria mais genérico, podendo ser usando tanto para telefones fixos como celulares (e de outros países também).

lira92 commented 6 years ago

@gabrieljesus achei interessante, mas gostaria que o método continuasse simples e direto como uma chamada que pode estar encadeada, instanciar uma classe antes, me parece tornar muito complexo algo simples, mais sem dúvida se houver necessidade de validar código de área, teria que evoluir para algo mais complexo, pois a necessidade pede.

MarcosCostaDev commented 6 years ago

Pull Request #6 solucionou o problema