Em qualquer empresa de e-commerce, é essencial que os usuários possam atualizar os preços de suas lojas para se manterem competitivos e alinhados com os custos de operação. No entanto, quando se trata de lojas com milhares de produtos, é necessário uma ferramenta que permita a atualização massiva dos preços, com recursos adicionais para evitar erros prejudiciais ao negócio.
O objetivo deste desafio é desenvolver essa ferramenta, a qual, seguindo certas regras de negócio, realizará a atualização em massa dos preços dos produtos no banco de dados com base em um arquivo .CSV
enviado pelo front-end.
- O time de Compras fornecerá um arquivo
.CSV
contendo o código do produto e o novo preço; - O time Financeiro exige que o sistema impeça que o preço de venda dos produtos seja inferior ao custo;
- O time de Marketing solicita que o sistema impeça reajustes maiores ou menores do que 10% do preço atual do produto;
- Em alguns casos, produtos são vendidos em pacotes que consistem em um ou mais itens em quantidades diferentes. Quando o preço de um pacote é ajustado, é necessário que o mesmo arquivo
.CSV
contenha os ajustes dos preços dos itens, de forma que a soma dos preços dos itens resulte no preço total do pacote.
- O sistema deve permitir o carregamento do arquivo de precificação;
- Botão de Validar para verificar os dados do arquivo;
- Verificar se todos os campos necessários estão presentes e são valores numéricos válidos;
- Verificar se os códigos de produtos informados existem;
- Verificar se o arquivo segue as regras estabelecidas no cenário;
- O botão de Atualizar só estará habilitado se todos os produtos do arquivo forem validados sem nenhuma violação de regras;
- Ao clicar em Atualizar , os novos preços devem ser salvos no banco de dados e preparar a tela para o envio de um novo arquivo.
Após a validação, deve-se exibir na tela algumas informações dos produtos enviados. São elas:
Código | Nome | Preço Atual | Novo Preço | Validação |
---|
No caso de violação de uma ou mais regras de validação, é necessário exibir qual regra foi quebrada ao lado de cada produto.
O front-end foi desenvolvido com React.js
.
No back-end foi utilizado com Node.js
com Express
, MySQL
, e Docker
.
Estas instruções fornecerão a você uma cópia completa do projeto instalado e funcionando em sua máquina local para fins de desenvolvimento.
Se você usa Docker em sua máquina, aqui está um comando para criar rapidamente um contêiner de MySQL já configurado com de acordo com as variáveis de ambiente de desenvolvimento deste projeto
docker run --name mysql-dev-base -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=price_update_tool -p 3306:3306 -d mysql:8
Se você for usar outras variáveis de ambiente, na flag
MYSQL_ROOT_PASSWORD
informe a senha definida do arquivo.env
. Neste EXEMPLO foi utilizada a senha ilustrativapassword
apenas para fins de desenvolvimento e testes.
- Clone o repositório:
git clone git@github.com:marcelo-mls/price-update-tool.git
- Entre na pasta do repositório que você acabou de clonar:
cd price-update-tool
- Acesse as pastas de
frontend
ebackend
, instale as dependências e inicie o projeto:
cd frontend
npm install
npm run dev
cd ..
cd backend
npm install
npm run dev
- (opcional) Para rapidamente popular as tabelas com alguns dados, execute o comando abaixo dentro do diretório do backend:
npm run db:seed
- Acesse o link abaixo em seu navegador para testar a interface da ferramenta 127.0.0.1:5173/
O servidor irá rodar na porta 3001 e o banco de dados na porta 3306. mas isso pode ser facilmente alterado nas Váriáveis de Ambiente.
Ao fazer o clone do repositório você vai receber um .env.example
, com as informações abaixo. Basta renomear o arquivo para .env
.
API_PORT=3001
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=password
MYSQL_DATABASE=price_update_tool
MYSQL_MULTIPLE_STATEMENTS=true
É importante manter as flags
MYSQL_DATABASE
eMYSQL_MULTIPLE_STATEMENTS
com esses valores se deseja popular o banco através do comando:npm run db:seed
Você pode testar a API com softwares como Insomnia
, Postman
ou Thunder Client
- POST:
'/products'
Este endpoint recebe no corpo da requisição um
JSON
representando as dados contidos no arquivo.CSV
. Com esses dados ela busca por todos os produtos e responde a requisição com as devidas validações para cada produto ou pacote listado no arquivo.
- PATCH:
'/products'
Esta rota é responsável por atualizar no banco de dados apenas o preço dos produtos, de acordo com as informações contidas no corpo da requisição.
Desenvolvido por Marcelo Marques, © 2023.
Teste técnico referente à vaga de Desenvolvedor Full Stack Júnior na Shopper.