خطة ربط أجهزة البصمة — Moon ERP HR

تاريخ: 2026-04-09 | الحالة: مطلوب تنفيذ Backend + Frontend

1. المخطط العام (Flow)

أجهزة البصمة
ZKTeco × N
برنامج الفيرم وير
(يسحب من الأجهزة)
→ POST /api/hr/attendance/biometric → Moon ERP Backend
(يسجل الحضور)
HR Attendance
(الفرونت إند)

2. الـ API المطلوبة من الباك إند Backend — أحمد

2.1 Endpoint رئيسي: استقبال بيانات البصمة

POST /api/hr/attendance/biometric

Headers:
  X-API-Key: {مفتاح أمان يتحدد في .env}
  Content-Type: application/json

Body:
{
  "device": {
    "name": "ZK-Main-Entrance",    // اسم الجهاز
    "ip": "192.168.1.50",          // IP الجهاز (اختياري)
    "port": 4370                   // Port (اختياري)
  },
  "records": [
    {
      "user_id": "1",              // رقم الموظف في جهاز البصمة (string)
      "user_name": "Ahmed Mohamed", // اسم الموظف (اختياري — للمرجع)
      "timestamp": "2026-04-09 08:05:00",  // التاريخ والوقت
      "status": 0,                 // 0 = حضور، 1 = انصراف
      "punch": 0                   // نفس status (بعض الأجهزة)
    }
  ]
}

Response:
{
  "success": true,
  "processed": 5,
  "check_ins": 3,
  "check_outs": 2,
  "skipped": 0,
  "errors": [
    { "user_id": "999", "error": "Employee not found" }
  ]
}

2.2 المنطق المطلوب (Business Logic)

لكل record في الـ request:

  1. ابحث عن الموظف بـ biometric_id = user_id (من جدول الـ mapping)
    لو مش لاقيه → جرب بـ employee_number = user_id
    لو مش لاقيه → سجل في errors وكمّل
  2. لو status == 0 (حضور):
    • لو مفيش attendance record للموظف في التاريخ ده → أعمل check-in جديد
    • لو فيه record وعنده check_in بالفعل → skip (مكرر)
    • سجل check_in_source = 'biometric'
  3. لو status == 1 (انصراف):
    • لو فيه attendance record مفتوح (check_in موجود، check_out فاضي) → أعمل check-out
    • لو مفيش record مفتوح → skip
    • سجل check_out_source = 'biometric'
    • احسب worked_hours, overtime_hours, late_minutes
  4. Duplicate detection: نفس employee_id + date + check_in time مش يتكرر
  5. سجل اسم الجهاز في ملاحظات أو حقل device_name

2.3 جداول قاعدة البيانات المطلوبة

جدول 1: biometric_devices — أجهزة البصمة

العمودالنوعالشرح
idbigint PKالمعرف
namevarchar(100)اسم الجهاز (ZK-Main-Entrance)
ip_addressvarchar(45)IP الجهاز
portintPort (default 4370)
locationvarchar(255)موقع الجهاز (المدخل الرئيسي)
branch_idFK → branchesالفرع
is_activebooleanفعّال/معطل
last_sync_attimestampآخر مزامنة
company_idFKالشركة (multi-tenant)
created_at / updated_attimestamps

جدول 2: biometric_employee_mappings — ربط رقم البصمة بالموظف

العمودالنوعالشرح
idbigint PKالمعرف
employee_idFK → employeesالموظف في HR
biometric_idvarchar(50)رقم الموظف في جهاز البصمة
device_idFK → biometric_devices (nullable)الجهاز (لو مخصص لجهاز معين)
company_idFK
created_at / updated_attimestamps

Unique constraint: (biometric_id, company_id) — نفس الرقم مش يتكرر في نفس الشركة

جدول 3: biometric_sync_logs — سجل المزامنات

العمودالنوعالشرح
idbigint PK
device_namevarchar(100)اسم الجهاز اللي بعت
records_receivedintعدد السجلات المستلمة
check_insintعدد تسجيلات الحضور
check_outsintعدد تسجيلات الانصراف
skippedintعدد المتخطاة (مكررة)
errorsjsonتفاصيل الأخطاء
synced_attimestampوقت المزامنة
company_idFK

تعديل جدول attendances الحالي:

العمود الجديدالنوعالشرح
check_in_sourceenum('manual','web','biometric','bulk')مصدر تسجيل الحضور
check_out_sourceenum('manual','web','biometric','bulk')مصدر تسجيل الانصراف
device_namevarchar(100) nullableاسم جهاز البصمة

2.4 APIs إضافية مطلوبة

MethodEndpointالوظيفة
GET/api/hr/biometric-devicesقائمة أجهزة البصمة
POST/api/hr/biometric-devicesتسجيل جهاز جديد
PUT/api/hr/biometric-devices/{id}تعديل جهاز
DELETE/api/hr/biometric-devices/{id}حذف جهاز
GET/api/hr/biometric-mappingsقائمة ربط الموظفين بأرقام البصمة
POST/api/hr/biometric-mappingsربط موظف برقم بصمة
PUT/api/hr/biometric-mappings/{id}تعديل الربط
DELETE/api/hr/biometric-mappings/{id}حذف الربط
POST/api/hr/biometric-mappings/bulkربط مجموعة موظفين دفعة واحدة
GET/api/hr/biometric-sync-logsسجل المزامنات
POST/api/hr/attendance/biometricاستقبال بيانات البصمة (الـ webhook)

3. الفرونت إند Frontend

3.1 شاشة إدارة أجهزة البصمة

Route: /hr/biometric-devices

3.2 شاشة ربط الموظفين بأرقام البصمة

Route: /hr/biometric-mappings

3.3 تحسين شاشة الحضور

3.4 شاشة سجل المزامنات

Route: /hr/biometric-logs


4. إعدادات الفيرم وير

اللي هيتحط في الفيرم وير:

Push URL: https://moon-erp.elbaset.com/api/hr/attendance/biometric
API Key:  {المفتاح اللي أحمد هيحدده في .env}
Method:   POST
Headers:  X-API-Key: {key}, Content-Type: application/json
Format:   نفس الـ format اللي فوق بالظبط

5. الأمان


6. خطة التنفيذ

#المهمةالمسؤولالأولوية
1جداول DB + Migration (devices, mappings, sync_logs, attendance columns)أحمدعاجل
2POST /attendance/biometric — الـ webhook الرئيسيأحمدعاجل
3CRUD APIs لأجهزة البصمة والـ mappingsأحمدعالي
4شاشة أجهزة البصمة + Mappings في الفرونتحازمعالي
5تحديث شاشة الحضور (عمود المصدر)حازممتوسط
6شاشة سجل المزامناتحازممتوسط
7ربط الفيرم وير بالـ endpointمشتركعالي
8اختبار شامل مع أجهزة حقيقيةمشتركعالي

7. Task #1483 — التاسك اللي اتبعتت لأحمد

التاسك موجودة على Support Platform — Task #1483

المطلوب تحديثها بالتفاصيل الكاملة من هذا المستند.