Teren-app/app/Services/Contact/PhoneSelector.php
2025-10-26 12:57:09 +01:00

54 lines
1.5 KiB
PHP

<?php
namespace App\Services\Contact;
use App\Enums\PersonPhoneType;
use App\Models\Person\Person;
use App\Models\Person\PersonPhone;
class PhoneSelector
{
/**
* Select the best phone for a person following priority rules.
* Priority:
* 1) validated mobile
* 2) validated (any type)
* 3) mobile (any validation)
* 4) first active phone
*
* Returns an array shape: ['phone' => ?PersonPhone, 'reason' => ?string]
*/
public function selectForPerson(Person $person): array
{
// Load active phones only (Person relation already filters active=1)
$phones = $person->phones;
if ($phones->isEmpty()) {
return ['phone' => null, 'reason' => 'no_active_phones'];
}
// 1) validated mobile
$phone = $phones->first(function (PersonPhone $p) {
return ($p->validated === true) && ($p->phone_type === PersonPhoneType::Mobile);
});
if ($phone) {
return ['phone' => $phone, 'reason' => null];
}
// 2) validated (any type)
$phone = $phones->first(fn (PersonPhone $p) => $p->validated === true);
if ($phone) {
return ['phone' => $phone, 'reason' => null];
}
// 3) mobile (any validation)
$phone = $phones->first(fn (PersonPhone $p) => $p->phone_type === PersonPhoneType::Mobile);
if ($phone) {
return ['phone' => $phone, 'reason' => null];
}
// 4) first active
return ['phone' => $phones->first(), 'reason' => null];
}
}