Uma corretora de ações está desenvolvendo um sistema para permitir que pequenos investidores possam tomar decisões melhores sobre seu portfólio. Uma das funcionalidades importantes é a de verificar o desempenho de uma ação em cinco cenários:
- Preço atual;
- Preço histórico;
- Preço atual em comparação a outras ações;
- Projeção de ganhos com compra em data específica.
Para isso, a equipe de software da empresa optou por desenvolver duas aplicações: um serviço de backend especializado nesses requisitos (que permitirá que essas funcionalidades sejam reutilizadas em outros produtos da empresa) e um dashboard configurável que dará visibilidade aos dados. Sua missão para este teste é implementar ambas as partes.
O serviço deverá ser implementado via HTTP, e o formato de serialização das requisições e respostas será JSON. O backend deverá ser implementado em node.js, seja com http puro, seja com framework de sua escolha. O frontend será uma single-page application (SPA), e poderá ser implementado com a solução de sua escolha: Angular, Angular 2/4, Vue.js, React, você decide. Forneça, em conjunto, uma configuração de build com Webpack, rollup, browserify ou outra solução de sua escolha, e um comando único para subir sua aplicação.
Sua solução deverá ter testes automatizados, tanto no frontend quanto no backend.
Para obter dados de ações, você poderá usar o Alpha Vantage (https://www.alphavantage.co). Caso queira utilizar bibliotecas prontas para isso — sinta-se livre para utilizá-las.
O tratamento de erros não será explicitado nos endpoints. O candidato ou candidata poderá inferir casos que poderão gerar erros ou duplicidades nos dados, e tratá-los de acordo. A ausência de tratamento não desqualifica a proposta; a presença, no entanto, contará pontos a favor.
A ideia é implementar algo simples, sem preocupações com dividendos, taxas administrativas ou outras incumbências que afetariam o montante total. Em sendo assim, pressuponha que a compradora investiu seu dinheiro numa determinada quantidade de ações de uma empresa em alguma data no passado, e que deseja saber quanto teria ganhado ou perdido caso o fizesse.
- Crie um fork deste repositório;
- Implemente sua solução, fazendo commits da maneira que faria em um projeto profissional;
- Substitua este README com um específico para sua aplicação, indicando como rodá-la, e como executar os testes (fique à vontade para inserir mais detalhes técnicos, caso deseje);
- Abra um pull request para este repositório.
O importante nesta parte do desafio é que saibamos como você lida com os componentes que formam as técnicas contemporâneas de desenvolvimento client-side, no que tange processamento de assets, transpilers, separação de responsabilidades, minificação, armazenamento local, etc. Por isso, estética não é primordial.
As funcionalidades esperadas são:
- Incluir ações no portifólio;
- Ver situação atual das ações (último preço e data e hora da atualização);
- Ver histórico de preços de uma ação, podendo delimitar datas de início e fim;
- Fazer projeção de ganhos de uma ação, determinando o número de ações compradas e a data de compra no passado.
Se você não tiver ideia de como organizar essas funcionalidades, não há problema nenhum em se inspirar no Yahoo Finance, ou fazer uma arquitetura master-detail simples.
Entrada:
stock_name- parâmetro passado na URI indicando o nome da ação (PETR4.SA, VALE5.SA)
Retorno:
{
"name": string,
"lastPrice": number,
"pricedAt": string // data e hora no formato ISO 8601, UTC
}Exemplo de uso:
$ curl -H "Accept: application/json" http://coolfinancialservice.com/stock/PETR4.SA/quote
{ "name": "PETR4.SA", "lastPrice": 25.11, "pricedAt": "2017-06-23T14:15:16Z" }
/stocks/:stock_name/history?from=<string>&to=<string> - Retorna preço histórico da ação num intervalo inclusivo
Entrada:
stock_name- parâmetro passado na URI indicando o nome da ação (PETR4.SA, VALE5.SA)from- string com data em formato ISO 8601to- string com data em format ISO 8601
{
"name": string,
"prices": [<pricing>, <pricing>, ...]
}O schema de pricing segue abaixo:
{
"opening": number,
"low": number,
"high": number,
"closing": number,
"pricedAt": string // data no formato ISO 8601, UTC
}Exemplo de uso:
$ curl -H "Accept: application/json" http://coolfinancialservice.com/stock/PETR4.SA/history?from=2017-04-04&to=2017-04-05
{ "name": "PETR4.SA", "prices": [{ "opening": 14.67, "low": 14.57, "high": 14.89, "closing": 14.85, "pricedAt": "2017-04-04" }, { "opening": 15.05, "low": 14.50, "high": 15.16, "closing": 14.57, "pricedAt": "2017-04-05" }
Entrada:
stock_name- parâmetro passado na URI indicando o nome da ação (PETR4.SA, VALE5.SA)- Payload JSON com uma lista de ações:
{
"stocks": [<string>, <string>, ...]
}Retorno:
{
"lastPrices": [<lastPrice>, <lastPrice>...]
}lastPrice tem o seguinte schema:
{
"name": string,
"lastPrice": number,
"pricedAt": string // data e hora no formato ISO 8601, UTC
}Exemplo de uso:
$ curl -H "Accept: application/json" -H "Content-Type: application/json" -d '{ "stocks": ["TIMP3.SA", "VIVT4.SA"] }' http://coolfinancialservice.com/stock/OIBR4.SA/compare
{ "lastPrices": [{ "name": "OIBR4.SA", "lastPrice": 3.41, "pricedAt": "2017-05-18T14:15:16Z" }, { "name": "TIMP3.SA", "lastPrice": 9.93, "pricedAt": "2017-05-18T14:15:16Z" }, { "name": "VIVT4.SA", "lastPrice": 45.92 }]}
/stocks/:stock_name/gains?purchasedAmount=<number>&purchasedAt=<string> - Projeta ganhos com compra em uma data específica
Entrada:
stock_name- parâmetro passado na URI indicando o nome da ação (PETR4.SA, VALE5.SA)purchasedAmount-numbercom o número de açõespurchasedAt-stringcom data de compra em formato ISO 8601
Retorno:
{
"name": string,
"purchasedAmount": number,
"purchasedAt": string, // data em formato ISO 8601,
"priceAtDate": number, // preço na data de compra
"lastPrice": number, // preço mais recente
"capitalGains": number // ganhos ou perdas com a ação, em reais
}Exemplo de uso:
$ curl -H "Accept: application/json" http://coolfinancialservice.com/stock/USIM5.SA?purchasedAmount=100&purchasedAt=2016-05-31
{ "name": "USIM5.SA", "purchasedAmount": 100, "purchasedAt": "2016-05-31", "priceAtDate": 3.97, "lastPrice": 4.33, "capitalGains": 36.0 }