loadMissing([ 'unitaRecapitiServizio.persona', 'relazioniPersoneAttive.persona.emailMultiple', ]); $resolved = []; foreach ($unita->unitaRecapitiServizio as $row) { if (! $row->attivo || $row->tipo_servizio !== $tipoServizio) { continue; } $resolved[$this->normalizeEmailKey($row->email)] = [ 'email' => mb_strtolower(trim((string) $row->email)), 'source' => 'override_unita', 'label' => $row->etichetta ?: $labels[$tipoServizio], 'persona' => $row->persona?->nome_completo, ]; } if ($resolved !== []) { return array_values($resolved); } foreach ($unita->relazioniPersoneAttive as $relazione) { if (! $this->relationAllowsService($relazione, $tipoServizio)) { continue; } $persona = $relazione->persona; if (! $persona instanceof Persona) { continue; } foreach ($this->emailsForPersona($persona) as $email) { $key = $this->normalizeEmailKey($email); if ($key === '') { continue; } $resolved[$key] = [ 'email' => $key, 'source' => 'persona', 'label' => $labels[$tipoServizio], 'persona' => $persona->nome_completo, ]; } } return array_values($resolved); } private function relationAllowsService(PersonaUnitaRelazione $relazione, string $tipoServizio): bool { return match ($tipoServizio) { 'convocazioni' => (bool) $relazione->riceve_convocazioni, 'solleciti', 'contabilita', 'comunicazioni', 'ticket', 'amministrazione', 'anagrafe' => (bool) $relazione->riceve_comunicazioni, default => false, }; } /** * @return array */ private function emailsForPersona(Persona $persona): array { $emails = []; $primary = mb_strtolower(trim((string) $persona->email_principale)); if ($primary !== '') { $emails[] = $primary; } foreach ($persona->emailMultiple as $row) { if (! $row instanceof PersonaEmailMultipla || ! $row->attiva) { continue; } $email = mb_strtolower(trim((string) $row->email)); if ($email !== '') { $emails[] = $email; } } return array_values(array_unique($emails)); } private function normalizeEmailKey(?string $email): string { return mb_strtolower(trim((string) $email)); } }