Documentação
Explicações sobre como o teste foi feito e como certas decisões foram tomadas
Sobre o Banco de Dados
O Banco de dados foi criado com duas tabelas, uma chamada clientes e a outra chamada titulos. A tabela titulos recebe uma chave estrangeira id_cliente vinda da primeira tabela, para que a relação One-To_Many aconteça (um cliente pode ter vários títulos atrelados a ele).
Sobre os dados armazenados, algumas decisões foram tomadas:
- A especificação pedia que o campo "CPF/CNPJ" fosse do tipo
integere o MySQL possui esse tipo de campo, mas isso pode gerar problemas, se um documento começar com 0, então eu armazenei o CPF ou CNPJ com o tipovarcharcom tamanho 18 e salvo apenas números. - A especificação também pedia que o 'valor' fosse do tipo
float, que também existe no MySQL, mas segundo a própria documentação do MySQL, armazenar valores nesse formato gera problemas com arredondamento, e ninguém quer que o seu dinheiro seja arredondado para baixo, portanto eu decidi usar o tipodecimal (8,2), padrão bem conhecido para armazenamento de valores. - Datas sendo armazenadas no MySQL são sempre no formato americano, que o mundo inteiro usa diferente, e os nossos cliente não precisam ser forçados a conhecer, mas por integridade de dados e para poder usar as funções nativas do MySQL de tratamento e processamento de datas, eu decidi armazenar as datas nos tipos
DATE, TIMESTAMPquando fosse necessário e usei os métodos de entrada e saída para processar a forma como o cliente enxerga as datas, ou seja: O usuário vê e escreve as datas em Português, mas elas são armazenadas no padrão internacional.
Sobre o BackEnd
O PHP foi feito sem framework, conforme solicitado, mas foi escolhido um formato de organização de código que fosse fácil de manutenção e que apresentasse boas práticas do mercado. Esse teste apresenta um protótipo de API, onde todas as requisições feitas ao BackEnd são respondidas com um código HTTP e um JSON.
A comunicação com o Banco de Dados foi feita usando PDO, com todas as implementações de segurança necessárias, e cada endpoint da API tem uma classe própria (Clientes, Títulos e Dashboard), com os seus métodos. As classes, na concepção adotada, funcionam como Models, tratando apenas da comunicação com o Banco e fazendo processamento de dados.
Para cada "chamada" da API, foi criado um arquivo que funciona como um Controller, que recebe as requisições, chama o método necessário, processa regras de negócio e devolve uma resposta sempre padronizada.
Sobre o FrontEnd
Como foi sugerido usar Bootstrap, foi escolhido um tema de Dashboard gratuito na Internet (os créditos foram mantidos) e como a camada de FrontEnd está completamente abstraída do BackEnd, tomei a decisão de não usar PHP no front: Todas as páginas são escritas apenas com HTML, CSS e JavaScript, usando apenas o Jquery (que veio no Bootstrap), mostrando que toda a inteligência e regras de negócio do Sistema podem ser acessadas apenas consumindo uma API. Admito que as soluções do frontend não são as mais elegantes, porém são todas funcionais e abstraídas de qualquer camada de negócio ou inteligência.