111 lines
3.3 KiB
PHP
111 lines
3.3 KiB
PHP
<?php
|
|
namespace App\Services\Comunicazioni;
|
|
|
|
use App\Models\Persona;
|
|
use App\Models\PersonaEmailMultipla;
|
|
use App\Models\PersonaUnitaRelazione;
|
|
use App\Models\UnitaImmobiliare;
|
|
use App\Models\UnitaRecapitoServizio;
|
|
|
|
class RecapitiServizioResolver
|
|
{
|
|
public function resolveForUnita(UnitaImmobiliare $unita, string $tipoServizio): array
|
|
{
|
|
$labels = UnitaRecapitoServizio::serviceLabels();
|
|
if (! array_key_exists($tipoServizio, $labels)) {
|
|
return [];
|
|
}
|
|
|
|
$unita->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<int, string>
|
|
*/
|
|
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));
|
|
}
|
|
}
|