forceFill(['status' => SuggestionRunStatus::Processing])->save(); try { $groups = $this->aggregator->groupsFor($run->user); $run->transactions_considered = array_sum(array_column($groups, 'count')); if ($groups === []) { return $this->finishEmpty($run); } $categories = $this->aggregator->categoryOptions($run->user); $raw = $this->generator->generate($groups, $categories); $validated = $this->consolidator->consolidate( $this->guard->validate($run->user, $raw, $categories), ); if ($validated === []) { return $this->finishEmpty($run); } foreach ($validated as $suggestion) { $run->suggestions()->create($suggestion); } $run->forceFill([ 'status' => SuggestionRunStatus::Completed, 'suggestions_count' => count($validated), ])->save(); } catch (Throwable $exception) { report($exception); $run->forceFill([ 'status' => SuggestionRunStatus::Failed, 'error' => Str::limit($exception->getMessage(), 500), ])->save(); } return $run; } private function finishEmpty(SuggestionRun $run): SuggestionRun { $run->forceFill([ 'status' => SuggestionRunStatus::Empty, 'suggestions_count' => 0, ])->save(); return $run; } }