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 integer e 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 tipo varchar com 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 tipo decimal (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, TIMESTAMP quando 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.