O projeto foi realizado como um teste para uma vaga de Dev Junior na Shopper. A proposta era construir uma ferramenta que permita atualizar os produtos de forma massiva e com recursos adicionais para evitar erros que possam prejudicar o negócio.
Regras de negócio:
- Atualização por meio de arquivo .csv com código do produto e novo preço;
- Impossibilidade de reajuste de valor para preço abaixo do custo;
- Impossibilidade de reajuste maior ou menor do que 10% do preço atual do produto;
- Alguns produtos são vendidos em pacotes, ou seja, um produto que é composto por um ou mais produtos em quantidades diferentes. Neste caso, ao reajustar o preço de um produto ou pacote, deve-se realizar também o reajuste do contexto (o preço da soma dos componentes é igual ao preço do pacote), validando as regras já citadas.
Outros requisitos:
- Sistema deve permitir o carregamento de um arquivo .csv;
- Deve possuir um botão que leva à validação;
- Ao final da validação o sistema deve exibir as informações dos produtos que foram enviados (Codigo, Nome, Preço Atual, Novo Preço), bem como a regra quebrada, caso não tenha passado em alguma validação;
- Se todas as validações tiverem sucesso, deve possibilitar um botão para atualizar os preços;
- Ao clicar em atualizar, deve retornar para tela inicial, possibilitando um carregamento de outro arquivo.
O projeto foi construído de forma separada, sendo que o front-end consome uma API. Assim o sistema roda em dois servidores, um para o front e outro para a API.
Para rodar o front-end em ambiente de desenvolvimento, se faz necessário ingressar na pasta "front-shopper" pelo terminal e executar os seguintes passos:
-
Instale as dependências necessárias (relacionadas no package.json):
npm install
-
Rode a aplicação em ambiente de desenvolvimento:
npm run dev
-
Utilize a url citada no terminal após o último comando em algum navegador (de preferência Google Chrome).
Para rodar a API em ambiente de desenvolvimento, se faz necessário ingressar na pasta "API" pelo terminal e executar os seguintes passos:
-
Instale as dependências necessárias para rodar a API (relacionadas no package.json):
npm install
-
A API utiliza o MySQL como banco de dados, então se faz necessário que você tenha-o instalado em sua máquina.
-
Com ele instalado, crie um database e preencha o arquivo ".env.example" com o host, user_db, password_db e database_name. Em seguida, retire o ".example", deixando apenas ".env" como nome do arquivo.
-
Rode a aplicação em ambiente de desenvolvimento:
npm run dev
-
O comando já irá rodar a migration e criar as tabelas e alimentá-las com os dados disponibilizados para o teste.
-
Você poderá testar a API utilizando o front-end, bastando rodar os dois ao mesmo tempo. Caso queira rodar a API sem a interface, você precisará de uma ferramenta de teste de requisições como o Insomnia, devendo seguir as orientações da documentação.
-
Caso queira apagar os dados após a utilização e começar de novo, basta apagar as tabelas pelo mysql e rodar a aplicação novamente que a migration vai criar as tabelas e alimentá-las com os dados iniciais do teste.
-
Utilize localhost:3333 e siga a documentação abaixo para utilizar a API.
File
POST /file/
- Salvar o arquivo .csv na pasta do projeto.
Products
GET /products/
Busca de todos produtos
PUT /products/
Atualização de dados de um produto
Request
Arquivo .csv com dois atributos. Exemplo:
product_code | new_price |
---|---|
16 | 20.15 |
18 | 5.29 |
23 | 9.57 |
Response
Sucesso
no body returned for response
status: 201
Erro comum
{
"mensagem": "Falha ao receber o arquivo. Verifique se o arquivo é um .csv",
"status": 400
}
Request
Com o arquivo já salvo pela requisição anterior, não é necessário enviar nenhum conteúdo.
Response
Sucesso
{
"data": {
"listProducts": [
{
"code": 16,
"name": "AZEITE PORTUGUES EXTRA VIRGEM GALLO 500ML",
"currentPrice": "20.49",
"newPrice": "25.50",
"validation": "Proibido: valor de reajuste é maior ou menor que 10% do preço atual"
},
{
"code": 22,
"name": "ENERGETICO RED BULL ENERGY DRINK SEM ACUCAR 250ML",
"currentPrice": "7.49",
"newPrice": "6.72",
"validation": "Proibido: valor é menor que o custo"
},
{
"code": 26,
"name": "ROLO DE PAPEL ALUMUNIO WYDA 30CMX7,5M",
"currentPrice": "5.79",
"newPrice": "5.24",
"validation": "OK!"
}
],
"valid": false
},
"status": 200
}
Erro comum
{
"mensagem": "Arquivo .csv não possui nenhum registro",
"status": 400
}
Request
Com o arquivo já salvo e todas as validações já realizadas com retorno de "OK!", não é necessário enviar nenhum conteúdo.
Response
Sucesso
no body returned for response
status: 200
Obrigado pela visita!