Commit 462e2218 authored by Mahmoud Aglan's avatar Mahmoud Aglan

Add friendly Arabic error messages for retroactive wizard failures

- Pre-check national_id before insert (shows member name if exists)
- Translate common DB errors: duplicate national_id, phone, foreign key,
  data too long — all shown in Arabic with actionable guidance
- Raw PDO errors no longer shown to users
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 6d40c839
...@@ -84,6 +84,13 @@ final class RetroactiveMembershipService ...@@ -84,6 +84,13 @@ final class RetroactiveMembershipService
return ['success' => false, 'error' => 'تاريخ الميلاد مطلوب — أدخل الرقم القومي (14 رقم) أو تاريخ الميلاد يدوياً']; return ['success' => false, 'error' => 'تاريخ الميلاد مطلوب — أدخل الرقم القومي (14 رقم) أو تاريخ الميلاد يدوياً'];
} }
if ($nationalId) {
$existing = $db->selectOne("SELECT id, full_name_ar FROM members WHERE national_id = ?", [$nationalId]);
if ($existing) {
return ['success' => false, 'error' => 'الرقم القومي ' . $nationalId . ' مسجل بالفعل للعضو: ' . $existing['full_name_ar'] . ' (رقم ' . $existing['id'] . ')'];
}
}
$memberData = [ $memberData = [
'full_name_ar' => $data['full_name_ar'], 'full_name_ar' => $data['full_name_ar'],
'full_name_en' => self::emptyToNull($data['full_name_en'] ?? null), 'full_name_en' => self::emptyToNull($data['full_name_en'] ?? null),
...@@ -412,8 +419,31 @@ final class RetroactiveMembershipService ...@@ -412,8 +419,31 @@ final class RetroactiveMembershipService
} catch (\Throwable $e) { } catch (\Throwable $e) {
$db->rollBack(); $db->rollBack();
Logger::error("Retroactive member creation failed: " . $e->getMessage(), ['trace' => $e->getTraceAsString()]); Logger::error("Retroactive member creation failed: " . $e->getMessage(), ['trace' => $e->getTraceAsString()]);
return ['success' => false, 'error' => $e->getMessage()]; $userMessage = self::translateDbError($e->getMessage());
return ['success' => false, 'error' => $userMessage];
}
}
private static function translateDbError(string $message): string
{
if (str_contains($message, 'uq_members_national_id') || str_contains($message, 'Duplicate entry') && str_contains($message, 'national_id')) {
preg_match("/Duplicate entry '([^']+)'/", $message, $m);
$nid = $m[1] ?? '';
return "الرقم القومي {$nid} مسجل بالفعل لعضو آخر — تأكد من الرقم أو ابحث عن العضو الموجود";
}
if (str_contains($message, 'Duplicate entry') && str_contains($message, 'phone_mobile')) {
return 'رقم الهاتف مسجل بالفعل لعضو آخر';
}
if (str_contains($message, 'Duplicate entry')) {
return 'بيانات مكررة — يوجد سجل بنفس البيانات بالفعل';
}
if (str_contains($message, 'foreign key constraint')) {
return 'خطأ في الربط — تأكد أن جميع البيانات المرجعية صحيحة (الفرع، المؤهل، إلخ)';
}
if (str_contains($message, 'Data too long')) {
return 'أحد الحقول يتجاوز الطول المسموح — تأكد من البيانات المدخلة';
} }
return 'خطأ في حفظ البيانات: ' . mb_substr($message, 0, 200);
} }
private static function emptyToNull(?string $value): ?string private static function emptyToNull(?string $value): ?string
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment