public function findPhonetically($clientName)
{
$clientNameMeta = metaphone($clientName);
$map = [];
$max = SIMILAR_MIN_THRESHOLD;
$clientId = 0;
$clients = Client::scope()->get(['id', 'name', 'public_id']);
foreach ($clients as $client) {
$map[$client->id] = $client;
if (!$client->name) {
continue;
}
$similar = similar_text($clientNameMeta, metaphone($client->name), $percent);
if ($percent > $max) {
$clientId = $client->id;
$max = $percent;
}
}
$contacts = Contact::scope()->get(['client_id', 'first_name', 'last_name', 'public_id']);
foreach ($contacts as $contact) {
if (!$contact->getFullName() || !isset($map[$contact->client_id])) {
continue;
}
$similar = similar_text($clientNameMeta, metaphone($contact->getFullName()), $percent);
if ($percent > $max) {
$clientId = $contact->client_id;
$max = $percent;
}
}
return $clientId && isset($map[$clientId]) ? $map[$clientId] : null;
}