بوّابة المرشّحين (v0.6)

للجميع

تُغلق بوّابة المرشّحين الفجوة بين "قدّمت" و"تم توظيفك". في الإصدار v0.5 كان المرشّح يرى رسالة الشكر وحسب ثم صمت طويل؛ أمّا الآن فيُنشئ حسابًا خاصًا بمساحة العمل، ويتابع طلباته من لوحة تحكم خاصة، ويختار مواعيد مقابلاته بنفسه، ويرى مراحل طلبه بصياغة ودّية.

رحلة المرشّح من البداية إلى التوظيف

  1. الاكتشاف. يصل المرشّح إلى لوحة الوظائف على /{slug}/jobs ويضغط تقديم على الدور الذي يهمّه.
  2. إنشاء الحساب — السيرة الذاتية أولًا. يُحوَّل إلى /{slug}/candidate/signup. يبدأ النموذج بخطوة رفع السيرة الذاتية (اختياريّة) كأول خطوة: يرفع المرشّح ملف PDF فـ(أ) نخزّنه ليُعاد استخدامه في خطوة التقديم، و(ب) نستخرج منه — قدر الإمكان — الاسم الأول واسم العائلة والبريد ورقم الجوال لتعبئة بقية الحقول تلقائيًا. تبقى كل الحقول المعبّأة قابلة للتعديل، ويمكنه تجاوز الرفع وإدخال البيانات يدويًا. ثم يُكمل الجنسية وكلمة المرور. نُنشئ سجلًا في Person بحالة CANDIDATE (مع ضبط cvUrl إن رُفعت سيرة ذاتية) وحسابًا في User بدور CANDIDATE ضمن نفس المعاملة، ونُفعّل emailVerifiedAt فورًا. الاستخراج محكوم بحصّة الذكاء الاصطناعي ويتراجع بصمت إلى حقول فارغة إذا تعذّرت قراءة الملف أو نفدت الحصّة.
  3. التقديم. يعود تلقائيًا إلى صفحة التقديم، حيث تُعرض بياناته للقراءة فقط فوق نموذج مختصر لرفع السيرة الذاتية وكتابة نبذة. إذا رفع سيرته الذاتية عند إنشاء الحساب فهي محفوظة مسبقًا (Person.cvUrl)، فلا يحتاج النموذج إلا إلى نبذة — دون رفع ثانٍ. الإرسال يُنشئ PipelineEntry ويُشغّل تحليل السيرة، ثم يُوجّهه إلى /{slug}/candidate/applications/[id].
  4. المتابعة. من لوحة التحكم على /{slug}/candidate يرى الطلبات المفتوحة، المقابلات القادمة، آخر تحديث على حالة طلب، واختصار لتصفّح الوظائف. صفحة تفاصيل الطلب تعرض شارة الحالة الودّية، وصف الدور، وعناصر مخصّصة بحسب المرحلة — منتقي موعد المقابلة في حال INTERVIEWING، وتنزيل خطاب العرض في حال OFFERED.
  5. التوظيف. عند نقل المرشّح إلى HIRED من قبل المسؤولين، تتولّى handoffCandidateToEmployee تحويل Person.status إلى EMPLOYEE وأيضًا User.role من CANDIDATE إلى EMPLOYEE. الجلسة التالية تنقله مباشرةً إلى /me (بوّابة الموظفين).

التقييمات: كيانان وفصول متعددة

بعد اجتياز الطلب لمرحلة الفرز، قد يُسند قسم الموارد البشرية تقييمات. مهما بلغ عدد التقييمات المُسندة، يرى المرشّح كيانين فقط على /{slug}/candidate/assessments:

  • التقييم العام — كل تقييم من نوع GENERAL مجموعًا في بطاقة واحدة.
  • التقييم التقني — كل تقييم من نوع TECHNICAL مجموعًا في بطاقة واحدة.

تتعامل كل بطاقة مع تقييماتها الفرعية بوصفها فصولًا ضمن تقييم واحد طويل. تعرض البطاقة شريط تقدّم ("اكتمل فصلان من ٣")، وقائمة فصول مرقّمة مع حالة كل فصل (لم يبدأ / جارٍ / مكتمل)، وزرّ ابدأ أو تابع واحدًا ينقل المرشّح إلى أول فصل غير مكتمل.

تجربة الأداء متواصلة: إنهاء فصل ينقل المرشّح مباشرةً إلى الفصل التالي غير المكتمل من الكيان نفسه بدلًا من العودة إلى القائمة، مع عنوان فرعي "التقييم التقني · الفصل ٢ من ٣" للتوجيه.

وبمجرّد اكتمال جميع فصول الكيان، تنكمش البطاقة إلى سجل واحد: اسم الكيان فقط (التقييم العام / التقييم التقني)، وشارة مكتمل، وسطر طمأنة قصير ("تم الإرسال — يقوم فريق التوظيف بمراجعة نتائجك."). يختفي شريط التقدّم وقائمة الفصول وزر ابدأ/تابع — إذ لم يَعُد على المرشّح ما يفعله. و"مكتمل" حالة عرض مُشتقّة وليست حقلًا مُخزّنًا، فلا يتغيّر تقييم كل تقييم على حدة ولا تقاريره.

لا يرى المرشّح أي تقرير تقييم إطلاقًا. لا درجات ولا تحليل ولا ملف PDF ولا تفصيل على مستوى الفصول يُكشف للمرشّح في أي مرحلة — لا في القائمة، ولا في شاشة الإنجاز، ولا عبر مسار التقرير (الذي يُعيد التوجيه إلى القائمة). تبقى نتائج التقييم لدى فريق التوظيف في واجهات المسؤول/المدير. وتكتفي شاشة الإنجاز بعد تقديم الفصل الأخير بتأكيد "تم استلام إجاباتك".

تظهر البطاقة فقط إذا كان لدى المرشّح تقييم واحد على الأقل من ذلك النوع؛ ومن لا تقييمات له يرى الحالة الفارغة.

قد تتضمن التقييمات الفنية صيغًا متعددة. ضمن بطاقة التقييم الفني، قد يكون الفصل بنكًا من أسئلة الاختيار المتعدد، أو دراسة حالة مكتوبة، أو مقابلة مجدولة — بحسب الصيغ التي أدرجها المسؤول عند التعيين. يُكمل المرشح كل صيغة كفصل مستقل: الاختيار المتعدد ودراسة الحالة بالخدمة الذاتية (يفتح ويُقدّم متى شاء)؛ بينما يعرض فصل المقابلة منتقيًا للمواعيد لحجز وقت مناسب. لا تُوسم بطاقة التقييم الفني بـمكتمل إلا حين تبلغ كل صيغة — بما فيها أي مراجعة معلقة لدراسة الحالة من قِبل الموارد البشرية وأي مقابلة مجدولة — حالتها النهائية.

شارات التنقّل

يعرض شريط تنقّل البوّابة شارة عدّ صغيرة على التبويبات التي تحتاج إلى انتباه، وهي نوعان:

  • التقييمات — عدّاد حيّ. يعرض عدد التقييمات غير المكتملة (ASSIGNED + IN_PROGRESS). ينخفض فقط مع إكمال المرشّح للعمل، ولا يُمحى بمجرّد فتح التبويب.
  • الطلبات والمقابلات — إشعار غير مقروء. تُمحى هذه فور فتح المرشّح للتبويب، وتظهر مجددًا فقط عند ورود نشاط أحدث — طلب جديد (الطلبات) أو مقابلة مَعروضة/مؤكَّدة حديثًا (المقابلات). تُسجَّل لحظة "الفتح" في كوكي خاص بالمتصفّح يضبطه الـ middleware، فتُمحى الشارة في نفس عملية العرض التي تخدم التبويب.

تعمل الآلية نفسها في بوّابة الموظّف (/me — عدّاد تقييمات حيّ وشارة مقابلات غير مقروءة) وبوّابة المدرّب (/trainer — شارة طلبات غير مقروءة). المساعد المشترك: lib/portal/navSeen.ts.

هوية لكل مساحة عمل (v0.6)

المرشّح الذي يتقدّم في ثلاث شركات على المنصّة يُنشئ ثلاثة حسابات منفصلة. كلّ سجل User مرتبط بمساحة عمل واحدة، والبريد نفسه يمكن أن يوجد في مساحات متعددة بكلمات مرور وأدوار مختلفة. هوية موحّدة عبر مساحات العمل مُؤجّلة إلى v0.7 ضمن قائمة المراقبة.

ما يراه المرشّح وما يراه قسم الموارد البشرية

عقد الرؤية مُنفّذ في lib/candidate/applications.ts عبر select صريح في كل استعلام. لا تُعيد واجهات المرشّح أبدًا:

  • screeningScore
  • screeningNarrative
  • cvParseStatus
  • PipelineEntry.notes
  • InterviewNote.rating / InterviewNote.text

أسماء المراحل تُترجم إلى تسميات ودّية في lib/candidate/friendly-labels.ts:

Stage الداخليةالتسمية الودّية بالعربية
APPLIEDتم استلام طلبك
SCREENEDقيد المراجعة
INTERVIEWINGفي مرحلة المقابلات
OFFEREDعرض بانتظار ردك
HIREDأهلاً بك في الفريق
REJECTEDلم يتم اختيارك هذه المرة

أمّا واجهة المسؤولين فلا تتغيّر — أسماء المراحل تظهر كما هي على لوحة Kanban.

التقديم مرّة واحدة

PipelineEntry @@unique([pipelineId, personId]) هو الضمان على مستوى قاعدة البيانات بأن لا يمكن للمرشّح أن يكون له طلبان على الدور نفسه. API التقديم يُرجع 409 مع معرّف السجل القائم، وصفحة التقديم تعرض حالة تقدّمت لهذه الوظيفة سابقاً مع رابط لتفاصيل الطلب.

ما الجديد بالنسبة لقسم الموارد البشرية

  • إشعار CANDIDATE_APPLIED لا يزال يُطلق عند كل طلب جديد.
  • الطلب الوارد من حساب مسجّل لا يختلف بصريًا عن أي طلب آخر على Kanban — لا توجد علامة "مسجّل" لأنّ التقديم المجهول لم يعد ممكنًا.
  • نقل المرشّح إلى HIRED يُحدّث User.role تلقائيًا كذلك، ضمن نفس المعاملة. لا توجد خطوة يدوية إضافية.

القيود في v0.6

  • لا توجد إشعارات بريدية للمرشّح. التحديثات تظهر في اللوحة فقط. إشعارات المسؤولين البريدية لا تتأثّر.
  • لا يستطيع المرشّح سحب طلبه. قسم الموارد البشرية هو الجهة الوحيدة التي تنقل الطلب إلى REJECTED.
  • لا توجد بحوث محفوظة ولا تنبيهات وظائف. تصفّح الوظائف قائمة ثابتة قابلة للتصفية.
  • لا يوجد تسجيل دخول عبر OAuth. فقط البريد وكلمة المرور.
  • رفع سيرة جديدة من الملف الشخصي لا يُعيد تحليلها. التحليل يحدث فقط عند التقديم.

للتفاصيل المعمارية الكاملة راجع docs/superpowers/specs/2026-05-13-v06-candidate-portal-design.md ومذكّرة القرارات …-decisions.md.

حذف حسابك

يمكن للمرشّح حذف حسابه نهائيًا من الملف الشخصي ← حذف الحساب. أكِّد العملية بإعادة إدخال كلمة المرور. يؤدي ذلك إلى إزالة حسابك وجميع بياناتك فورًا وبشكل لا رجعة فيه — طلباتك، تقييماتك، مقابلاتك، خطط تطوّرك، وملفاتك المرفوعة (السيرة الذاتية والمستندات). يُحذف تسجيل دخولك، ويُخطَر مديرو الموارد البشرية والمدراء المباشرون في مساحة العمل بأنك حذفت حسابك.