تاريخ: 2026-04-09 | الحالة: مطلوب تنفيذ Backend + Frontend
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" }
]
}
biometric_id = user_id (من جدول الـ mapping)employee_number = user_idstatus == 0 (حضور):
check_in_source = 'biometric'status == 1 (انصراف):
check_out_source = 'biometric'worked_hours, overtime_hours, late_minutesemployee_id + date + check_in time مش يتكررdevice_namebiometric_devices — أجهزة البصمة| العمود | النوع | الشرح |
|---|---|---|
| id | bigint PK | المعرف |
| name | varchar(100) | اسم الجهاز (ZK-Main-Entrance) |
| ip_address | varchar(45) | IP الجهاز |
| port | int | Port (default 4370) |
| location | varchar(255) | موقع الجهاز (المدخل الرئيسي) |
| branch_id | FK → branches | الفرع |
| is_active | boolean | فعّال/معطل |
| last_sync_at | timestamp | آخر مزامنة |
| company_id | FK | الشركة (multi-tenant) |
| created_at / updated_at | timestamps |
biometric_employee_mappings — ربط رقم البصمة بالموظف| العمود | النوع | الشرح |
|---|---|---|
| id | bigint PK | المعرف |
| employee_id | FK → employees | الموظف في HR |
| biometric_id | varchar(50) | رقم الموظف في جهاز البصمة |
| device_id | FK → biometric_devices (nullable) | الجهاز (لو مخصص لجهاز معين) |
| company_id | FK | |
| created_at / updated_at | timestamps |
Unique constraint: (biometric_id, company_id) — نفس الرقم مش يتكرر في نفس الشركة
biometric_sync_logs — سجل المزامنات| العمود | النوع | الشرح |
|---|---|---|
| id | bigint PK | |
| device_name | varchar(100) | اسم الجهاز اللي بعت |
| records_received | int | عدد السجلات المستلمة |
| check_ins | int | عدد تسجيلات الحضور |
| check_outs | int | عدد تسجيلات الانصراف |
| skipped | int | عدد المتخطاة (مكررة) |
| errors | json | تفاصيل الأخطاء |
| synced_at | timestamp | وقت المزامنة |
| company_id | FK |
attendances الحالي:| العمود الجديد | النوع | الشرح |
|---|---|---|
| check_in_source | enum('manual','web','biometric','bulk') | مصدر تسجيل الحضور |
| check_out_source | enum('manual','web','biometric','bulk') | مصدر تسجيل الانصراف |
| device_name | varchar(100) nullable | اسم جهاز البصمة |
| Method | Endpoint | الوظيفة |
|---|---|---|
| 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) |
Route: /hr/biometric-devices
Route: /hr/biometric-mappings
Route: /hr/biometric-logs
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 اللي فوق بالظبط
X-API-Key صحيحbiometric_sync_logs| # | المهمة | المسؤول | الأولوية |
|---|---|---|---|
| 1 | جداول DB + Migration (devices, mappings, sync_logs, attendance columns) | أحمد | عاجل |
| 2 | POST /attendance/biometric — الـ webhook الرئيسي | أحمد | عاجل |
| 3 | CRUD APIs لأجهزة البصمة والـ mappings | أحمد | عالي |
| 4 | شاشة أجهزة البصمة + Mappings في الفرونت | حازم | عالي |
| 5 | تحديث شاشة الحضور (عمود المصدر) | حازم | متوسط |
| 6 | شاشة سجل المزامنات | حازم | متوسط |
| 7 | ربط الفيرم وير بالـ endpoint | مشترك | عالي |
| 8 | اختبار شامل مع أجهزة حقيقية | مشترك | عالي |
التاسك موجودة على Support Platform — Task #1483
المطلوب تحديثها بالتفاصيل الكاملة من هذا المستند.