You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
1.9 KiB

<?php
namespace App\Services\Survey;
use App\Models\User;
class SurveyIdentity
{
public const REGISTRATION_FIELDS = ['mobile', 'name', 'sex', 'birthday', 'email', 'company_name', 'company_position'];
public const DISPLAY_FIELDS = ['name', 'no', 'mobile', 'company_name', 'company_position'];
public static function complete(?User $user): bool
{
if (!$user) return false;
foreach (self::REGISTRATION_FIELDS as $field) {
if (!is_scalar($user->$field) || trim((string) $user->$field) === '') return false;
}
return preg_match('/^1\d{10}$/', (string) $user->mobile)
&& filter_var(trim($user->email), FILTER_VALIDATE_EMAIL)
&& User::hasCompleteBirthday((string) $user->birthday);
}
public static function respondent(?User $user, $data, $snapshot): array
{
$result = [];
foreach (self::DISPLAY_FIELDS as $field) $result[$field] = $user->$field ?? null;
$map = SurveySchema::answerMap($data);
$snapshot = SurveySchema::arrayValue($snapshot);
$questions = SurveySchema::arrayValue($snapshot['questions'] ?? array_values($map));
$keyed = ($snapshot['version'] ?? 0) >= 2;
foreach ($questions as $q) {
$q['config'] = SurveySchema::arrayValue($q['config'] ?? []);
$field = $q['config']['user_field'] ?? null;
if (!in_array($field, self::DISPLAY_FIELDS, true)) continue;
if (is_scalar($result[$field]) && trim((string) $result[$field]) !== '') continue;
$answer = $map[(string) ($q['id'] ?? '')] ?? [];
if (!empty($answer['hidden']) || !SurveySchema::visible($q, $questions, $map, $keyed)) continue;
$value = $answer['value'] ?? null;
if (is_scalar($value) && trim((string) $value) !== '') $result[$field] = trim((string) $value);
}
return $result;
}
}