Este projeto foi desenvolvido para a etapa de teste técnico do processo seletivo da Vidya Code.
A seguir estão listados os requisitos do projeto:
- Criação de Banco de dados Relacional
- Tela para cadastro de clientes
- Tela para cadastro de produtos
- Tela para cadastro de vínculo entre produtos e clientes com data de validade
- Bloquear exclusão de produtos vinculados a um cliente
- Procedimento para atualizar as datas de validade de vínculo dos produtos de um determinado cliente
A seguir estão listados os requisitos bônus do projeto:
- O campo de CNPJ na tela de cadastro de clientes deve servir de gatilho para uma consulta via api dos dados da empresa
- O campo de CEP na tela de cadastro de clientes deve servir de gatilho para uma consulta via api ao endereço da empresa
- Criar a modelagem de banco de dados com base nas tabelas criadas
- Crie um README no github bem documentado contendo todos os objetos, modelagem, prints da tela de todo trabalho desenvolvido.
- Realizar a validação dos campos no formulário de cadastro de produtos.
- Utilize o Composer para gerenciar as dependências
- Utilize Migrations para as tabelas criadas
- Deixe seu código mais legível utilizando Padrões de Projeto
- Utilize um container em docker para subir seu servidor PHP e seu banco de dados de sua preferência.
O projeto foi desenvolvido de maneira que pode ser inicializado tanto localmente, quanto com o uso do docker compose
O projeto foi configurado para rodar dentro de containers, portanto, certifique-se que:
- Caso possua uma instância do Mysql rodando na sua máquina (Porta 3306) pare ela, pois o container do mysql irá utilizar a porta 3306
- O Docker instalado
- O Docker compose instalado
- que as portas 3000 (server) e 5173 (frontend) estão livres
Para começar, faça o clone do repositório para a sua máquina
via ssh:
git clone git@github.com:ArthurVianna96/PS_VidyaCode.git
via https:
git clone https://github.com/ArthurVianna96/PS_VidyaCode.git
Uma vez clonado o repositório agora vamos iniciar o projeto.
Dentro da raiz do projeto, rode a rede de containers para Docker Compose < 1.29.2
docker-compose up -d
Para Docker compose >= 1.29.2 Agora roda as migrations do banco de dados
docker compose up
ATENÇÃO: os próximos passos só serão necessários na primeira vez que o projeto for inicializado
entre no container do server
docker -exec -it server sh
e rode as migrations do banco de dados
vendor/bin/phinx migrate
Esta tela consiste de um formulário para cadastro de um cliente no sistema. Os campos CNPJ e CEP possuem uma conexão com duas api's, publica cnpj e via cep respectivamente, para coleta de dados sobre o cliente a ser cadastrado.
Esta tela consiste de um formulário para cadastro de produtos no sistema.
Esta tela consiste de um formulário para cadastro de produtos no sistema. Para este formulário, é necessário ter previamente cadastrado pelo menos um cliente e um produto no sistema, visto que é necessário selecionar um de cada campo no formulário bem como a data de validade do vínculo.
Esta tela é a tela de entrada do sistema. Aqui é possível visualizar todos os registros no sistema, basta escolher o tipo de consulta que deseja fazer. Os tipos de consulta disponíveis são:
- Cliente
- Produto
- Compras (vínculo de Produto e Cliente)
Selecionando a consulta por clientes uma tabela contendo todos os clientes cadastrados e suas respectivas informações irá aparecer.
Além de poder visualizar as informações dos clientes, algumas ações são possíveis, sendo elas:
- Editar um cliente (primeiro botão na seção de Ações):
- Atualizar a data de validade de todos as compras (vínculos daquele cliente)( segundo botão na seção de Ações)
- Deletar um cliente (último botão na seção de ações):
- Basta clicar no icone para deletar o cliente
- Clientes já vinculados a uma compra (vínculo) não poderão ser deletados, será necessário apagar todos os seus vínculos antes
Selecionando a consulta por produtos uma tabela contendo todos os produtos cadastrados e suas respectivas informações irá aparecer.
Além de poder visualizar as informações dos produtos, algumas ações são possíveis, sendo elas:
- Editar um produto (primeiro botão na seção de Ações):
- Deletar um produto (último botão na seção de ações):
- Basta clicar no icone para deletar o produto
- Produtos já vinculados a uma compra (vínculo) não poderão ser deletados, será necessário apagar todos os seus vínculos antes
Selecionando a consulta por compras uma tabela contendo todos as compras cadastrados e suas respectivas informações irá aparecer.
Além de poder visualizar as informações das compras, algumas ações são possíveis, sendo elas:
- Editar uma compra (primeiro botão na seção de Ações):
- Deletar um compra (último botão na seção de ações):
- Basta clicar no icone para deletar a compra
Para o projeto foi desenvolvida uma API Restful que possui as seguintes funcionalidades:
Retorna um JSON contendo todos os clientes
-
Endpoint
/client
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
[ { "id": 1, "company": "VIDYA CODE LTDA", "fictional_name": "VIDYA CODE", "register_number": "20.060.683/0001-80", "zip_code": "53417-350", "address": "Rua José Maria", "number": "107", "district": "Artur Lundgren I", "city": "Paulista", "state": "PE", "email": "vidyacode@vidyacode.com", "phone": "(61) 99626-8850" } ]
- Status: 200
Retorna um JSON contendo um cliente.
-
Endpoint
/client/:id
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
{ "id": 1, "company": "VIDYA CODE LTDA", "fictional_name": "VIDYA CODE", "register_number": "20.060.683/0001-80", "zip_code": "53417-350", "address": "Rua José Maria", "number": "107", "district": "Artur Lundgren I", "city": "Paulista", "state": "PE", "email": "vidyacode@vidyacode.com", "phone": "(61) 99626-8850" }
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum cliente encontrado" }
- Status: 404 NOT FOUND
Cadastra um cliente no banco de dados. Retorna um JSON contendo as informações do cliente cadastrado.
-
Endpoint
/client
-
Méthodo:
POST
-
Body:
{ "company": "VIDYA CODE LTDA", "fictional_name": "VIDYA CODE", "register_number": "20.060.683/0001-80", "zip_code": "53417-350", "address": "Rua José Maria", "number": "107", "district": "Artur Lundgren I", "city": "Paulista", "state": "PE", "email": "vidyacode@vidyacode.com", "phone": "(61) 99626-8850" }
-
Sucesso:
- Status: 201
Conteúdo:
{ "company": "VIDYA CODE LTDA", "fictional_name": "VIDYA CODE", "register_number": "20.060.683/0001-80", "zip_code": "53417-350", "address": "Rua José Maria", "number": "107", "district": "Artur Lundgren I", "city": "Paulista", "state": "PE", "email": "vidyacode@vidyacode.com", "phone": "(61) 99626-8850" }
- Status: 201
-
Erro:
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 500 SERVER ERROR
Edite um cliente no banco de dados. Retorna um JSON contendo as informações do cliente editado.
-
Endpoint
/client/:id
-
Méthodo:
PUT
-
Body:
{ "company": "VIDYA CODE LTDA", "fictional_name": "VIDYA CODE", "register_number": "20.060.683/0001-80", "zip_code": "53417-350", "address": "Rua José Maria", "number": "107", "district": "Artur Lundgren I", "city": "Paulista", "state": "PE", "email": "vidyacode@vidyacode.com", "phone": "(61) 99626-8850" }
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum cliente encontrado" }
OU
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Deleta um cliente do banco de dados.
-
Endpoint
/client/:id
-
Méthodo:
DELETE
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum cliente encontrado" }
OU
-
Status: 409 CONFLICT
Conteúdo:{ "message": "O cliente está vinculado a uma compra e por isso não pode ser excluído" }
OU
-
Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Retorna um JSON contendo todos os produtos
-
Endpoint
/product
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
[ { "id": 1, "name": "OUTHACK", "description": "Software da empresa OUTHACK", "version": "1.0.1" }, { "id": 2, "name": "Revit", "description": "Software de modelagem BIM", "version": "1.0.2" }, { "id": 3, "name": "AutoCAD", "description": "Software para desenho 2D e 3D", "version": "8.2.1" } ]
- Status: 200
Retorna um JSON contendo um produto.
-
Endpoint
/product/:id
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
{ "id": 1, "name": "OUTHACK", "description": "Software da empresa OUTHACK", "version": "1.0.1" }
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum produto encontrado" }
- Status: 404 NOT FOUND
Cadastra um produto no banco de dados. Retorna um JSON contendo as informações do produto cadastrado.
-
Endpoint
/product
-
Méthodo:
POST
-
Body:
{ "name": "OUTHACK", "description": "Software da empresa OUTHACK", "version": "1.0.1" }
-
Sucesso:
- Status: 201
Conteúdo:
{ "name": "OUTHACK", "description": "Software da empresa OUTHACK", "version": "1.0.1" }
- Status: 201
-
Erro:
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 500 SERVER ERROR
Edite um produto no banco de dados. Retorna um JSON contendo as informações do produto editado.
-
Endpoint
/product/:id
-
Méthodo:
PUT
-
Body:
{ "name": "OUTHACK", "description": "Software da empresa OUTHACK", "version": "1.0.1" }
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum produto encontrado" }
OU
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Deleta um produto do banco de dados.
-
Endpoint
/product/:id
-
Méthodo:
DELETE
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum produto encontrado" }
OU
-
Status: 409 CONFLICT
Conteúdo:{ "message": "O produto está vinculado a uma compra e por isso não pode ser excluído" }
OU
-
Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Retorna um JSON contendo todos as compras
-
Endpoint
/purchase
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
[ { "id": 1, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "OUTHACK", "product_id": 1, "expirationDate": "2023-02-17 00:00:00" }, { "id": 2, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "AutoCAD", "product_id": 3, "expirationDate": "2023-02-09 00:00:00" } ]
- Status: 200
Retorna um JSON contendo um compra.
-
Endpoint
/purchase/:id
-
Méthodo:
GET
-
Sucesso:
- Status: 200
Conteúdo:
{ "id": 1, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "OUTHACK", "product_id": 1, "expirationDate": "2023-02-17 00:00:00" }
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum vínculo encontrado" }
- Status: 404 NOT FOUND
Cadastra uma compra no banco de dados. Retorna um JSON contendo as informações da compra cadastrada.
-
Endpoint
/purchase
-
Méthodo:
POST
-
Body:
{ "productId": 1, "clientId": 2, "expirationDate": "2023-01-28" }
-
Sucesso:
- Status: 201
Conteúdo:
{ "productId": 2, "clientId": 2, "expirationDate": "2023-01-28" }
- Status: 201
-
Erro:
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 500 SERVER ERROR
Edite uma compra no banco de dados. Retorna um JSON contendo as informações da compra editada.
-
Endpoint
/purchase/:id
-
Méthodo:
PUT
-
Body:
{ "productId": 1, "clientId": 2, "expirationDate": "2023-01-28" }
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum produto encontrado" }
OU
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Deleta uma compra do banco de dados.
-
Endpoint
/purchase/:id
-
Méthodo:
DELETE
-
Sucesso:
- Status: 200
Conteúdo:
null
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Nenhum produto encontrado" }
OU
- Status: 500 SERVER ERROR
Conteúdo:{ "message": <mensagem de erro> }
- Status: 404 NOT FOUND
Atualiza todas as compras (vínculos) de um cliente em daysToAdd
dias. Retorna um JSON contendo todos os vínculos do cliente.
-
Endpoint
/expiration
-
Méthodo:
POST
-
Body:
{ "clientId": 1, "daysToAdd": 30 }
-
Sucesso:
- Status: 200
Conteúdo:
[ { "id": 1, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "OUTHACK", "product_id": 1, "expirationDate": "2023-03-19 00:00:00" }, { "id": 5, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "OUTHACK", "product_id": 1, "expirationDate": "2023-02-27 00:00:00" }, { "id": 2, "client_id": 1, "client": "VIDYA CODE LTDA", "product": "AutoCAD", "product_id": 3, "expirationDate": "2023-03-11 00:00:00" } ]
- Status: 200
-
Erro:
- Status: 404 NOT FOUND
Conteúdo:{ "message": "Client does not have any products registered" }
- Status: 404 NOT FOUND