Este repositório representa um desafio técnico backend inspirado em um fluxo operacional da EloVerde.
O sistema possui coletas de resíduos agendadas para pontos geradores. Antes que uma coleta siga para execução, a API deve verificar se ela está apta do ponto de vista operacional.
O foco do desafio é implementar a checagem de pré-execução de coletas, avaliando estado, documentação obrigatória e outros impeditivos relevantes.
Seu objetivo é completar a funcionalidade de pre-execution-check.
Para cada coleta recebida na entrada, a API deve determinar:
- se a coleta pode ser executada
- quais bloqueios foram encontrados
- qual ação sugerida faz mais sentido
- em que ordem os resultados devem ser retornados
Este repositório já entrega uma base inicial funcional para que você foque na resolução do problema de negócio. O objetivo deste desafio não é avaliar sua capacidade de configurar um projeto do zero, mas sim como você interpreta requisitos, organiza a implementação, trabalha com testes e toma decisões técnicas em cima de um domínio já parcialmente estruturado.
- Estrutura Laravel básica já configurada.
- Migrations e models mínimos já criados.
- Seed com cenários já preparados.
- Endpoint principal já roteado.
- Request e Resource já criados.
- Testes automatizados iniciais já escritos.
- Implementação principal incompleta.
Em outras palavras: a base do projeto já está montada, mas a parte mais importante da regra de negócio continua em aberto para ser construída.
- Implementar a regra principal de
pre-execution-check. - Fazer os testes existentes passarem.
- Manter o código organizado, legível e com responsabilidades bem separadas.
- Usar a base já existente como ponto de partida, sem reinventar a arquitetura do projeto.
- Complementar a cobertura de testes se identificar uma lacuna relevante.
Você não precisa reinventar a arquitetura do projeto. O objetivo é evoluir a base existente com uma implementação clara, correta e fácil de manter.
Durante a entrevista, queremos que você desenvolva o raciocínio junto com a gente, explicando suas decisões técnicas ao longo do processo.
O projeto será disponibilizado com antecedência para que você possa se familiarizar com o contexto, preparar o ambiente e chegar com tudo pronto para começar a codar.
O uso de IA na resolução do código está liberado, não tem nenhum problema e é inclusive incentivado. Queremos ver como você utiliza IA no dia a dia e como ela se integra ao seu fluxo de trabalho.
Não é obrigatório concluir todo o desafio durante a entrevista. O principal objetivo é entender como você programa no cotidiano, como estrutura demandas e como organiza seu processo de desenvolvimento.
A verificação de pré-execução deve simular uma análise operacional antes que uma coleta seja enviada para execução. O objetivo é impedir que uma coleta siga adiante quando houver inconsistências importantes de estado, documentação ou duplicidade.
- A coleta só pode ser considerada apta para execução quando estiver no estado
programming. - Se a coleta estiver em qualquer estado diferente de
programming, ela deve ser retornada como bloqueada com o bloqueioinvalid_state. - Se faltar qualquer documento obrigatório do ponto gerador, a coleta deve ser bloqueada com o bloqueio
missing_required_documents. - Se um documento obrigatório existir, mas estiver vencido, a coleta deve ser bloqueada com o bloqueio
expired_required_documents. - Se um documento obrigatório existir, mas estiver com status inválido, a coleta deve ser bloqueada com o bloqueio
invalid_required_documents. - Se existir outra coleta no mesmo dia, para o mesmo ponto gerador e com o mesmo conjunto de resíduos, a API deve sinalizar duplicidade com o bloqueio
duplicate_collect_for_same_day. - A ordem dos resíduos não deve alterar a comparação de duplicidade.
- A própria coleta analisada nunca deve ser considerada duplicada de si mesma.
- Quando houver mais de uma duplicidade possível, a API pode retornar a coleta relacionada mais antiga.
- Coletas urgentes devem aparecer primeiro no retorno.
- Dentro do mesmo nível de urgência, coletas bloqueadas devem aparecer antes das aptas.
- Persistindo empate, a ordenação deve considerar
scheduled_toem ordem crescente. - O retorno precisa explicar os bloqueios encontrados.
- A API deve indicar uma ação sugerida coerente com o problema encontrado.
- A análise deve ser feita individualmente por coleta, mesmo quando a entrada tiver múltiplos IDs.
Uma mesma coleta pode apresentar mais de um problema ao mesmo tempo. Nesses casos, a API deve retornar todos os bloqueios identificados para aquela coleta, em vez de interromper a análise no primeiro erro encontrado.
execute: quando a coleta não possuir bloqueiosreview_documents: quando os bloqueios forem apenas documentaisfix_state: quando o problema for apenas estado inválidoreview_or_merge: quando houver duplicidademanual_review: quando houver múltiplos bloqueios de naturezas diferentes
POST /api/collect-tasks/pre-execution-check
{
"collect_task_ids": [1, 2, 9]
}{
"data": [
{
"collect_task_id": 1,
"can_execute": true,
"priority": "normal",
"blockers": [],
"suggested_action": "execute",
"related_collect_task_id": null
},
{
"collect_task_id": 2,
"can_execute": false,
"priority": "normal",
"blockers": [
"missing_required_documents"
],
"suggested_action": "review_documents",
"related_collect_task_id": null
},
{
"collect_task_id": 9,
"can_execute": false,
"priority": "high",
"blockers": [
"invalid_required_documents"
],
"suggested_action": "review_documents",
"related_collect_task_id": null
}
]
}Antes de começar, certifique-se de ter instalado:
- PHP 8.3+
- Composer
- SQLite 3
composer install
cp .env.example .env
php artisan key:generate
touch database/database.sqliteO projeto foi pensado para rodar localmente com SQLite, sem dependências externas.
O .env.example já está preparado para isso. Depois de copiar o arquivo, garanta que os valores principais estejam assim:
APP_NAME="Interview Backend Eloverde"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
DB_CONNECTION=sqlite
DB_DATABASE=database/database.sqlitephp artisan migrate:fresh --seedEsse comando deve:
- criar as tabelas do desafio
- executar o
InterviewChallengeSeeder - deixar o banco pronto com os cenários usados pelos testes e pela exploração manual da API
php artisan serveDepois disso, a API ficará disponível em:
http://localhost:8000
Para executar toda a suíte:
php artisan testPara rodar apenas os testes do desafio:
php artisan test tests/Feature/CollectTask/PreExecutionCheckEndpointTest.php
php artisan test tests/Unit/Waste/CollectTask/PreExecutionCheckActionTest.php- Instale as dependências.
- Copie o
.env. - Gere a chave da aplicação.
- Crie o arquivo SQLite.
- Rode
php artisan migrate:fresh --seed. - Rode
php artisan test. - Comece a implementação principal.
O projeto já contém testes automatizados que cobrem parte importante do comportamento esperado. Eles foram incluídos para orientar a implementação inicial e reduzir ambiguidades no entendimento do contrato da API.
Ao mesmo tempo, nem todas as regras do desafio estão completamente cobertas pelos testes existentes. Parte da proposta é justamente identificar lacunas relevantes de cobertura e decidir se faz sentido complementar essa cobertura durante a solução.
tests/Feature/CollectTask/PreExecutionCheckEndpointTest.phptests/Unit/Waste/CollectTask/PreExecutionCheckActionTest.php
Os testes iniciais já cobrem:
- coleta apta para execução quando estiver em
programminge sem pendências documentais - bloqueio por estado inválido
- bloqueio por documento obrigatório ausente
- bloqueio por documento obrigatório vencido
- bloqueio por documento obrigatório com status inválido
- retorno de múltiplos bloqueios para a mesma coleta
- ordenação priorizando coletas urgentes e bloqueadas
- ação sugerida coerente com o tipo de problema encontrado
Existe uma regra de negócio importante intencionalmente deixada sem cobertura inicial:
- detecção de duplicidade de coleta no mesmo dia, para o mesmo ponto gerador e com o mesmo conjunto de resíduos
- escolha da coleta relacionada mais antiga quando houver duplicidade
Além de fazer os testes existentes passarem, espera-se que você identifique essa lacuna e adicione pelo menos um teste automatizado que ajude a proteger essa regra.
Durante a avaliação, será observado:
- clareza de modelagem
- separação de responsabilidades
- qualidade dos testes
- cuidado com edge cases
- legibilidade do código
- capacidade de comunicar decisões técnicas
- uso de IA no fluxo de desenvolvimento
Os itens abaixo não são obrigatórios, mas podem enriquecer a solução:
- melhorar as mensagens de bloqueio
- adicionar enum para estados e bloqueios
- refinar a estratégia de comparação de resíduos duplicados
- adicionar testes extras relevantes