Fala, galera!!!
Gostaríamos de agradecer sua presença no CM Dev Academy - Java. Abaixo vamos explicar os detalhes do desafio proposto.
O principal objetivo do desafio é analisarmos como entende, modela, resolve o problema e testa, de maneira clara e objetiva, adotando boas práticas de programação. Seja criativo!! Seja ousado!!!!
Enviar uma aplicação funcionando é o ideal, mas mesmo que não esteja 100 % envie o código para que possamos analisar até onde você chegou.
O problema que vamos apresentar não tem uma lógica complexa, mas implemente seu código pensando em um sistema extensível e de alta concorrência no uso, é muito importante que você aplique SOLID em tudo que fizer.
Seja criativo!
-
Nossa stack de desenvolvimento é Java, então nossa sugestão é que você utilize Spring.
-
Teste seu código, crie Unit tests e/ou Integration tests.
-
A aplicação deve ser self contained, use um database em memória, por exemplo o H2.
O desafio proposto é de construir uma API que terá dois endpoints:
Sua aplicação deve expor em http://localhost:{porta}/api/v1/pedidos
uma API RESTful. (GET, POST, PUT, DELETE)
O conteúdo de um Pedido de Venda possui o seguinte payload:
{
"pedido":"123456",
"nomeCliente":"JOSE FRANCISCO",
"endereco":"Rua A, 500",
"telefone":"8532795578",
"valorTotalProdutos":13.50,
"taxa":2.50,
"valorTotal":16.00,
"itens":
[{
"descricao": "Refri",
"precoUnitario": 5.5,
"quantidade": 1
},
{
"descricao": "Coxinha",
"precoUnitario": 3.00,
"quantidade": 1
},
{
"descricao": "Batatinha",
"precoUnitario": 5.00,
"quantidade": 1
}]
}
O conteúdo desse Pedido de Venda e seus Itens deverão ser persistidos em banco de dados. Fique à vontade para criar as validações que você considerar necessárias.
O pedido de venda poderá ter os seguintes status:
- PENDENTE
- PREPARANDO
- PRONTO
- EM_ROTA
- ENTREGUE
- CANCELADO
Todo novo pedido de venda terá que ter o status inicial PENDENTE. A cada novo pedido deverá ser feito o cálculo do valor total dos produtos e do valor total (valor total dos produtos+ taxa de entrega).
O endpoint não deve permitir:
- pedido de venda sem produtos
- produtos sem quantidade
- produtos sem valor
- produtos sem nome
- alterar o status
Sua aplicação deve receber um POST em http://localhost:{porta}/api/v1/pedidos/{id}/status
com o seguinte payload, onde {id} contido no path será o código do pedido e body o status que o pedido irá receber:
{
"status": "PREPARANDO"
}
A função desse endpoint é alterar o status do pedido de venda a medida em que ele for passando pelo seu ciclo de vida
O endpoint não deve permitir:
- alterar o status para CANCELADO caso o status atual seja EM_ROTA, ENTREGUE ou CANCELADO
- alterar o status para EM_ROTA caso o status atual não seja PRONTO
- alterar o status para ENTREGUE caso o status atual não seja EM_ROTA
Para cada ação de sucesso de alteração do status a API deve de retornar a seguinte resposta:
HTTP 200 OK
Em caso de alguma regra de negócio não antendida, API deve de retornar a seguinte resposta:
HTTP 422 - Unprocessable Entity
{
"mesagem": "status não pode ser alterado...."
}
Uma tentativa de mudança de status deverá passar por todas essas regras descritas e a API deverá retornar todos os status gerados, observe que as validações são compartilhadas entre as regras, reutilize código.
Observe que:
-
O valor total do pedido é composto pela somatória do valor calculado de cada item (precoUnitario * quantidade).
-
A quantidade total de itens do pedido é composta pela somatória da quantidade de cada item.
Crie um arquivo chamado stepbystep.md
com tudo o que é preciso para executar sua aplicação.
Para enviar seu código, você pode:
- Enviar a URL do seu repositório para a pessoa responsável pelo seu processo seletivo dentro do CM Dev Academy Java.