netgescon-day0/app/Services/Comunicazioni/RecapitiServizioResolver.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));
}
}