{"id":31702079,"url":"https://github.com/instruct-br/teste-backend-remoto-2020-07","last_synced_at":"2025-10-08T21:11:34.182Z","repository":{"id":56062783,"uuid":"276360395","full_name":"instruct-br/teste-backend-remoto-2020-07","owner":"instruct-br","description":"Teste técnico para a vaga remota de Backend Developer da Instruct","archived":false,"fork":false,"pushed_at":"2020-11-27T17:20:58.000Z","size":63,"stargazers_count":18,"open_issues_count":1,"forks_count":13,"subscribers_count":9,"default_branch":"master","last_synced_at":"2023-03-07T14:48:07.402Z","etag":null,"topics":["home-office","trabalho-remoto","vagas","vagas-backend","vagas-para-desenvolvedoras","vagas-para-desenvolvedores"],"latest_commit_sha":null,"homepage":"https://instruct.com.br/trabalhe-com-a-gente/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/instruct-br.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-01T11:32:48.000Z","updated_at":"2023-02-21T17:48:28.000Z","dependencies_parsed_at":"2022-08-15T12:30:44.553Z","dependency_job_id":null,"html_url":"https://github.com/instruct-br/teste-backend-remoto-2020-07","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/instruct-br/teste-backend-remoto-2020-07","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-backend-remoto-2020-07","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-backend-remoto-2020-07/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-backend-remoto-2020-07/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-backend-remoto-2020-07/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/instruct-br","download_url":"https://codeload.github.com/instruct-br/teste-backend-remoto-2020-07/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-backend-remoto-2020-07/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000716,"owners_count":26082837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["home-office","trabalho-remoto","vagas","vagas-backend","vagas-para-desenvolvedoras","vagas-para-desenvolvedores"],"created_at":"2025-10-08T21:11:27.047Z","updated_at":"2025-10-08T21:11:34.177Z","avatar_url":"https://github.com/instruct-br.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teste Técnico Backend Developer [REMOTO]\n\nNeste repositório você encontra o enunciado do teste técnico para a vaga de\n_Backend Developer [REMOTO]_ da [Instruct](https://instruct.com.br/)! Você\nprovavelmente chegou aqui através da indicação de alguma pessoa da empresa após\npassar pelas [outras etapas](https://instruct.com.br/trabalhe-com-a-gente/processo-de-selecao/)\ndo processo seletivo. Se este não for o seu caso e mesmo assim você implementar\nalguma solução para este exercício ele **não** será avaliado.\n\n\u003e Você _pode_ usar o problema descrito aqui para exercitar suas habilidades de\n\u003e desenvolvimento, mas a sua solução será avaliada por alguém da Instruct\n\u003e **apenas se** você estiver no processo seletivo da vaga de _Backend\n\u003e Developer [REMOTO]_.\n\nSe você tiver interesse em se candidatar para uma vaga da Instruct siga as\ninstruções no site: https://instruct.com.br/trabalhe-com-a-gente/\n\nNessa página você encontra as vagas abertas hoje e todos os detalhes de nosso\nprocesso seletivo. Se você não encontrou uma vaga que pareça adequada confira a\npágina novamente em um ou dois meses, ela é atualizada com certa frequência. 😉\n\n## O problema\n\nA _Corporação Colossal ™_ é uma empresa com milhares de funcionários e filiais\ndistribuídas em diversas cidades do Brasil. Funcionários da _Corporação\nColossal_, estão distribuídos nessas filiais em diversos municípios e seguem\nas respectivas agendas de feriados municipais.\n\nUma das estratégias da marca é o atendimento rápido e eficiente ao consumidor.\nHoje a empresa paga um adicional em feriados do Rio de Janeiro para que tenha\natendentes suficientes nesses dias. O atendimento está centralizado nessa\ncidade e seus funcionários absorvem toda a demanda de atendimento ao cliente do\npaís.\n\nEsse atendimento poderia ser feito de qualquer cidade, não necessariamente de\napenas uma das filiais. Um projeto da empresa com objetivo de reduzir gastos\ncom atendimento é distribuir os chamados entre as suas filiais para que algum\nfuncionário faça esse atendimento. Dessa forma pode ser possível evitar o\npagamento de adicional de feriado em feriados municipais e estaduais.\n\n## Feriados\n\nNo Brasil existem feriados nacionais, estaduais e municipais. Além disso\nalguns feriados não possuem uma data fixa, ou seja, cada ano esses feriados\ncaem em dias diferentes. Os _Feriados Móveis_ são: Carnaval, Sexta-Feira Santa,\nPáscoa e Corpus Christi. Três desses feriados são determinados a partir da data\nda Páscoa.\n\nA sexta-feira santa é um feriado nacional, mas as regras do Carnaval e Corpus\nChristi variam de acordo com o município.\n\nRegras dos feriados móveis:\n- A terça-feira de carnaval ocorre 47 dias antes do domingo de Páscoa\n- corpus christi ocorre 60 dias após o domingo de Páscoa\n- A sexta-feira santa ocorre 2 dias antes do domingo de Páscoa\n\nA Páscoa é celebrada no primeiro domingo após a primeira lua cheia que ocorre\ndepois do equinócio de Outono (março). A data em que esse dia cai em um\ndeterminado ano pode ser calculada com o [Algoritmo de Meeus](https://pt.wikipedia.org/wiki/C%C3%A1lculo_da_P%C3%A1scoa#Algoritmo_de_Meeus/Jones/Butcher).\nO pseudo-código do algoritmo é o seguinte:\n```\n a = ANO MOD 19\n b = ANO \\ 100\n c = ANO MOD 100\n d = b \\ 4\n e = b MOD 4\n f = (b + 8) \\ 25\n g = (b - f + 1) \\ 3\n h = (19 × a + b - d - g + 15) MOD 30\n i = c \\ 4\n k = c MOD 4\n L = (32 + 2 × e + 2 × i - h - k) MOD 7\n m = (a + 11 × h + 22 × L) \\ 451\n MÊS = (h + L - 7 × m + 114) \\ 31\n DIA = 1+ (h + L - 7 × m + 114) MOD 31\n```\n\nEm que `\\` é uma divisão de inteiro, ou seja, `7 \\ 3 = 2`.\n\nOs feriados nacionais com data fixa são:\n\n- 01/01 Ano Novo\n- 21/04 Tiradentes\n- 01/05 Dia do Trabalhador\n- 07/09 Independência\n- 12/10 Nossa Senhora Aparecida\n- 02/11 Finados\n- 15/11 Proclamação da República\n- 25/12 Natal\n\nO dia da Consciência Negra também é outra exceção peculiar. É um \"dia\ncomemorativo\" nacional, mas não é considerado um feriado nacional; esse dia é\ndecretado feriado municipal em milhares de cidades e é feriado estadual em\nalguns estados.\n\n## Solução\n\nPara resolver esse problema você deve desenvolver uma API que permita consultar\ne cadastrar feriados estaduais e municipais.\n\nO endpoint para consultar feriados deve seguir o seguinte formato:\n```\n/feriados/CODIGO-IBGE/ANO-MES-DIA/\n```\n\nOnde CODIGO-IBGE pode ser um número de dois dígitos, para representar um\nferiado estadual ou um número com 7 dígitos para representar um feriado\nmunicipal.\n\nO MES deve ser um mês válido, ou seja, entre 1 e 12. Mesmo cuidado deve ser\ntomado com o dia. Espere um ano com 4 números, mês com 2 números e dia também\ncom 2 números, ou seja, \"AAAA-MM-DD\".\n\nA sua API deve ser populada com os feriados nacionais. Todos os feriados\nestaduais e municipais consultados nos testes serão criados através da API.\n\nEsse endpoint deve responder os seguintes verbos: GET, PUT e DELETE.\n\nPara simplificar o problema, assuma que pode haver no máximo 1 feriado por dia\nem cada município, e que serão feitas consultas apenas em dias de semana, ou\nseja, de segunda a sexta.\n\nO comportamento esperado do GET é que ele retorne status 200 e o nome do\nferiado se existir um feriado no dia especificado.\n\nExemplo buscando o dia 20 de Novembro no estado do Rio de Janeiro:\n```\nGET /feriados/33/2020-11-20/\n{\n    \"name\": \"Consciência Negra\"\n}\n```\n\nSe não houver um feriado no dia para o estado ou município consultado a API\ndeve retornar 404.\n\nO cadastro de um feriado estadual ou municipal segue estrutura semelhante\nà consulta, mas não contém o ano, apenas o mês e dia do feriado.\n\nExemplo de cadastro do aniversário de São Paulo SP no dia 25 de Janeiro:\n```\nPUT /feriados/3550308/01-25/\n{\n    \"name\": \"Aniversário da cidade de São Paulo\"\n}\n```\n\nA API deve retornar o status 200 para indicar que a requisição foi bem\nsucedida. Opcionalmente ela pode retornar 201 se esse feriado ainda não estava\ncadastrado na base. Se já existir um feriado cadastrado neste dia para o estado\nou município especificado, o nome do feriado deve ser atualizado.\n\nDeve haver também a opção de apagar um feriado.\n\nExemplo de remoção do aniversário de São Paulo:\n```\nDELETE /feriados/3550308/01-25/\n```\n\nO endpoint deve retornar 404 se esse feriado não existir ou 204 se a requisição\nfoi aceita e o feriado removido com sucesso.\n\nUma tentativa de remover um feriado estadual num município deve retornar 403.\nUma tentativa de remover um feriado nacional em um município ou em uma unidade\nfederativa também deve retornar 403.\n\nO cadastro e remoção de feriados móveis deve ter uma assinatura diferente. No\nlugar do dia, é passado o nome do feriado após o código do ibge.\n\nExemplos:\n```\nPUT /feriados/5108402/carnaval/\nPUT /feriados/4312658/corpus-christi/\n```\nAs requisições acima marcam que a terça-feira de carnaval é feriado em Várzea\nGrande e corpus christi é feriado em Não-Me-Toque\n\nNo exemplo abaixo a terça-feira de carnaval deixa de ser considerado feriado\nem Várzea Grande:\n```\nDELETE /feriados/5108402/carnaval/\n```\n\n## Dados disponíveis\n\nNeste repositório você encontra um csv chamado `municipios-2019.csv` com o\nregistro de 5.570 municípios brasileiros em 2019 [extraído do site do\nIBGE](https://www.ibge.gov.br/explica/codigos-dos-municipios.php).\nEsse csv tem duas colunas: uma com o código do IBGE para cada município e um\ncom o nome do município.\n\nNote que os dois primeiros dígitos desse código do IBGE indica qual é o estado\ndo município. A seguir uma tabela com a relação estado/prefixo também extraída\ndo site do IBGE:\n\n|Prefixo|UF|\n|-------|--|\n|     12|AC|\n|     27|AL|\n|     16|AP|\n|     13|AM|\n|     29|BA|\n|     23|CE|\n|     53|DF|\n|     32|ES|\n|     52|GO|\n|     21|MA|\n|     51|MT|\n|     50|MS|\n|     31|MG|\n|     15|PA|\n|     25|PB|\n|     41|PR|\n|     26|PE|\n|     22|PI|\n|     33|RJ|\n|     24|RN|\n|     43|RS|\n|     11|RO|\n|     14|RR|\n|     42|SC|\n|     35|SP|\n|     28|SE|\n|     17|TO|\n\nA lista de feriados nacionais que deve ser usada foi apresentada na seção\n_Feriados_. Os feriados estaduais e municipais de interesse serão cadastrados\nna API que você desenvolver.\n\n## Avaliação\n\nNum primeiro momento nós não iremos olhar o seu código. O projeto será testado\nde forma automatizada e se ele passar nos testes você receberá um e-mail\ncomunicando que irá para a etapa da entrevista técnica.\n\nPortanto você deve codificar seu projeto em Javascript ou Python e fazer deploy\ndele usando os recursos disponibilizados no _Frees Tiers_ da [Heroku](https://www.heroku.com/).\nIsso significa que sua API deverá rodar num ambiente virtualizado com\n[512 MB de RAM](https://www.heroku.com/dynos) e um banco de dados PostgreSQL\ncom um [limite de 10.000 linhas](https://elements.heroku.com/addons/heroku-postgresql#pricing).\n\nQuando você finalizar a implementação adicione o usuário com e-mail\n`jobs@instruct.com.br` como colaborador do app publicado até o fim do prazo\nestipulado. A partir disso conseguimos o endereço em que sua API está publicada\ne seguimos com os testes automatizados.\n\nNós executaremos três conjuntos de testes na sua API:\n\n1. Testes básicos (abertos)\n2. Testes avançados (fechados)\n3. Testes extras (fechados)\n\nSe a API não passar nos testes básicos, faremos mais duas tentativas. Se\nmesmo assim ela não passar nos testes básicos nós encerramos os testes.\n\nSe a API passar nos testes básicos e não passar nos testes avançados, faremos\nmais duas tentativas. Se mesmo assim ela não passar nos testes avançados nós\nencerramos os testes.\n\nSe a API passar pelos testes avançados você já garantiu a sua participação na\npróxima etapa do processo, mesmo assim vamos executar os testes extras para\navaliar mais alguns pontos da sua solução.\n\nOs testes básicos estão disponíveis neste repositório no arquivo\n`tests-open.js` e é recomendado que você os use durante o desenvolvimento para\navaliar se a sua API está correta. Como explicado acima, você **não passará**\npara a próxima etapa se a sua solução não atender todos os testes desse\narquivo. Use as verificações presentes nele para guiar o desenvolvimento da sua\nsolução.\n\nVocê pode executar esses testes com o [k6](https://k6.io/). Para instalar o k6\nbasta [baixar o binário](https://github.com/loadimpact/k6/releases) para o seu\nsistema operacional (Windows, Linux ou Mac).\n\nE para rodar os testes abertos especificar a variável de ambiente \"API_BASE\"\ncom o endereço base da API testada.\n\nExemplo de aplicação rodando no localhost na porta 8000:\n```\nk6 run -e API_BASE='http://localhost:8000' tests-open.js\n```\n\n---\n\n**Boa sorte!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finstruct-br%2Fteste-backend-remoto-2020-07","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finstruct-br%2Fteste-backend-remoto-2020-07","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finstruct-br%2Fteste-backend-remoto-2020-07/lists"}