Estou tentando gerar um relatório de gastos de cada solicitante, categorizado por programas a qual esse solicitante teve gasto positivo, baseado na soma de todas as notas, de todas as solicitações daquele programa.
O que acontece? Em alguns casos, o solicitante só aparece em algum programa, embora tenha vários. Por exemplo:
João gastou 10 reais no Programa A e 20 reais no Programa B.
Neste caso, ele aparece com 30 reais no Programa A, que é o que surge na primeira soliciação encontrada.
Preciso ajustar isso para que o agrupamento aconteça representando a realidade.
A aplicação está sendo feita com base no laravel 11, então defini os modelos para uso do eloquent.
Um solicitante pode ter várias solicitações, e cada uma delas pertence a um certo programa. Aqui vai um resumo das relações:
O model Solicitante tem as relações definidas:
public function solicitacao() {
return $this->hasMany(Solicitacao::class);
}
public function nota() {
return $this->hasMany(Nota::class);
}
public function programas() {
return $this->belongsToMany(Programa::class, 'solicitacoes');
}
O modelo Programa, por sua vez tem a seguinte:
public function solicitantes() {
return $this->belongsToMany(Solicitante::class, 'solicitacoes');
}
E o modelo Solicitacao, tem as seguintes relacoes relevantes:
public function solicitante() {
return $this->belongsTo(Solicitante::class);
}
public function nota() {
return $this->hasMany(Nota::class);
}
public function soma_notas() {
return $this->nota()->sum('valor');
}
Usei o seguinte approach para resolver o problema:
// ...consulta anterior referente a solicitantes, com base em filtro aplicado por inputs
$solicitantes = $query->get();
$solicitantes_por_programa = $solicitantes->filter(function($solicitante) {
return $solicitante->soma_notas() > 0;
})->groupBy(function($solicitante) {
return $solicitante->solicitacao->first()->programa->nome;
});