128 lines
3.1 KiB
PHP
128 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\User;
|
|
|
|
/**
|
|
* Profile Completion Service
|
|
*
|
|
* Handles user profile completion calculations and analytics.
|
|
*
|
|
* @author David Valera Melendez <david@valera-melendez.de>
|
|
* @since February 2025
|
|
*/
|
|
class ProfileCompletionService
|
|
{
|
|
/**
|
|
* Required fields for profile completion
|
|
*/
|
|
private const REQUIRED_FIELDS = [
|
|
'first_name' => 10,
|
|
'last_name' => 10,
|
|
'email' => 15,
|
|
'phone' => 10,
|
|
'bio' => 20,
|
|
'website' => 10,
|
|
'linkedin' => 15,
|
|
'github' => 10,
|
|
];
|
|
|
|
/**
|
|
* Calculate profile completion percentage
|
|
*/
|
|
public function calculateCompletion(User $user): int
|
|
{
|
|
$totalWeight = array_sum(self::REQUIRED_FIELDS);
|
|
$completedWeight = 0;
|
|
|
|
foreach (self::REQUIRED_FIELDS as $field => $weight) {
|
|
if (!empty($user->$field)) {
|
|
$completedWeight += $weight;
|
|
}
|
|
}
|
|
|
|
return (int) (($completedWeight / $totalWeight) * 100);
|
|
}
|
|
|
|
/**
|
|
* Get missing profile fields
|
|
*/
|
|
public function getMissingFields(User $user): array
|
|
{
|
|
$missing = [];
|
|
|
|
foreach (self::REQUIRED_FIELDS as $field => $weight) {
|
|
if (empty($user->$field)) {
|
|
$missing[] = [
|
|
'field' => $field,
|
|
'label' => $this->getFieldLabel($field),
|
|
'weight' => $weight,
|
|
];
|
|
}
|
|
}
|
|
|
|
return $missing;
|
|
}
|
|
|
|
/**
|
|
* Get user-friendly field labels
|
|
*/
|
|
private function getFieldLabel(string $field): string
|
|
{
|
|
$labels = [
|
|
'first_name' => 'First Name',
|
|
'last_name' => 'Last Name',
|
|
'email' => 'Email Address',
|
|
'phone' => 'Phone Number',
|
|
'bio' => 'Professional Bio',
|
|
'website' => 'Website',
|
|
'linkedin' => 'LinkedIn Profile',
|
|
'github' => 'GitHub Profile',
|
|
];
|
|
|
|
return $labels[$field] ?? ucfirst(str_replace('_', ' ', $field));
|
|
}
|
|
|
|
/**
|
|
* Check if profile is considered complete
|
|
*/
|
|
public function isProfileComplete(User $user): bool
|
|
{
|
|
return $this->calculateCompletion($user) >= 80;
|
|
}
|
|
|
|
/**
|
|
* Get profile completion statistics
|
|
*/
|
|
public function getCompletionStats(User $user): array
|
|
{
|
|
$completion = $this->calculateCompletion($user);
|
|
$missingFields = $this->getMissingFields($user);
|
|
|
|
return [
|
|
'completion_percentage' => $completion,
|
|
'is_complete' => $this->isProfileComplete($user),
|
|
'missing_fields' => $missingFields,
|
|
'missing_count' => count($missingFields),
|
|
'status' => $this->getCompletionStatus($completion),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get completion status message
|
|
*/
|
|
private function getCompletionStatus(int $completion): string
|
|
{
|
|
if ($completion >= 90) {
|
|
return 'excellent';
|
|
} elseif ($completion >= 70) {
|
|
return 'good';
|
|
} elseif ($completion >= 50) {
|
|
return 'fair';
|
|
} else {
|
|
return 'incomplete';
|
|
}
|
|
}
|
|
}
|