إدارة الأطباء - Profiles, Schedules, Leaves & Certifications
Doctors Module يوفر نظام شامل لإدارة الأطباء والموظفين الطبيين:
الجدول الرئيسي لبيانات الأطباء
| Field | Type | Description | Required |
|---|---|---|---|
user_id |
integer | ربط مع جدول المستخدمين | ✅ |
license_number |
string | رقم الترخيص الطبي (unique) | ✅ |
specialization_id |
integer | التخصص الطبي | ✅ |
department_id |
integer | القسم التابع له | ✅ |
consultation_fee |
decimal | رسوم الكشف | ❌ |
experience_years |
integer | سنوات الخبرة | ❌ |
bio |
text | نبذة تعريفية عن الطبيب | ❌ |
verified |
boolean | حالة التحقق من الطبيب | ❌ |
accepts_new_patients |
boolean | يقبل مرضى جدد | ❌ |
user() → User (belongsTo)specialization() → Specialization (belongsTo)department() → Department (belongsTo)schedules() → DoctorSchedule (hasMany)leaves() → DoctorLeave (hasMany)educations() → DoctorEducation (hasMany)certifications() → DoctorCertification (hasMany)جدول أوقات عمل الأطباء الأسبوعي
| Field | Type | Description | Required |
|---|---|---|---|
doctor_id |
integer | معرف الطبيب | ✅ |
day_of_week |
integer | يوم الأسبوع (0=Sunday, 6=Saturday) | ✅ |
start_time |
time | وقت البدء (HH:MM:SS) | ❌ |
end_time |
time | وقت الانتهاء (HH:MM:SS) | ❌ |
is_off |
boolean | يوم إجازة أسبوعية | ❌ |
طلبات الإجازات للأطباء مع نظام الموافقات
| Field | Type | Description | Required |
|---|---|---|---|
doctor_id |
integer | معرف الطبيب | ✅ |
leave_type_id |
integer | نوع الإجازة (annual, sick, emergency) | ✅ |
start_date |
date | تاريخ البدء | ✅ |
end_date |
date | تاريخ الانتهاء | ✅ |
reason |
text | سبب الإجازة | ❌ |
status_id |
integer | الحالة (pending, approved, rejected, cancelled) | ✅ |
is_half_day |
boolean | إجازة نصف يوم | ❌ |
rejection_reason |
text | سبب الرفض (إن وجد) | ❌ |
cancellation_reason |
text | سبب الإلغاء (إن وجد) | ❌ |
جميع endpoints تتطلب Authentication عبر Bearer Token و middleware: auth:sanctum
| Parameter | Type | Description | Example |
|---|---|---|---|
q |
string | بحث في الاسم | q=أحمد |
department_id |
integer | فلترة حسب القسم | department_id=5 |
specialization_id |
integer | فلترة حسب التخصص | specialization_id=3 |
verified |
boolean | الأطباء المعتمدون فقط | verified=1 |
min_rating |
float | الحد الأدنى للتقييم | min_rating=4.0 |
accepts_new_patients |
boolean | يقبل مرضى جدد | accepts_new_patients=1 |
per_page |
integer | عدد النتائج في الصفحة | per_page=20 |
{
"status": true,
"data": [
{
"id": 1,
"user_id": 10,
"license_number": "MED-12345",
"specialization_id": 3,
"specialization": {
"id": 3,
"name": "Cardiology"
},
"department_id": 5,
"department": {
"id": 5,
"name": "Emergency Department"
},
"consultation_fee": 150.00,
"experience_years": 8,
"bio": "متخصص في أمراض القلب",
"verified": true,
"accepts_new_patients": true,
"average_rating": 4.5,
"created_at": "2024-01-15T10:00:00.000000Z"
}
],
"meta": {
"current_page": 1,
"per_page": 15,
"total": 50
}
}
curl -X GET "https://api.hms.com/api/doctors?department_id=5&verified=1" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json"
id - معرف الطبيب (integer, required){
"status": true,
"data": {
"id": 1,
"user": {
"id": 10,
"name": "د. أحمد محمد",
"email": "doctor@example.com"
},
"license_number": "MED-12345",
"specialization": {
"id": 3,
"name": "Cardiology"
},
"department": {
"id": 5,
"name": "Emergency Department"
},
"consultation_fee": 150.00,
"experience_years": 8,
"bio": "متخصص في أمراض القلب مع خبرة 8 سنوات",
"verified": true,
"accepts_new_patients": true,
"average_rating": 4.5,
"total_reviews": 120,
"schedules": [...],
"educations": [...],
"certifications": [...]
}
}
{
"user_id": 10,
"license_number": "MED-12345",
"specialization_id": 3,
"department_id": 5,
"consultation_fee": 150.00,
"experience_years": 8,
"bio": "متخصص في أمراض القلب",
"verified": false,
"accepts_new_patients": true
}
user_id - required, integer, exists in users table, uniquelicense_number - required, string, unique, max:50specialization_id - required, integer, exists in specializationsdepartment_id - required, integer, exists in departmentsconsultation_fee - nullable, numeric, min:0experience_years - nullable, integer, min:0, max:70bio - nullable, string, max:1000verified - nullable, booleanaccepts_new_patients - nullable, boolean{
"status": true,
"message": "Doctor created successfully",
"data": {
"id": 1,
"user_id": 10,
"license_number": "MED-12345",
...
}
}
{
"status": false,
"message": "Validation failed",
"errors": {
"license_number": ["The license number has already been taken."]
}
}
id - معرف الطبيب (integer, required){
"consultation_fee": 200.00,
"experience_years": 9,
"bio": "متخصص في أمراض القلب - تحديث",
"accepts_new_patients": false
}
{
"status": true,
"message": "Doctor updated successfully",
"data": {...}
}
id - معرف الطبيب (integer, required){
"status": true,
"message": "Doctor deleted successfully"
}
{
"status": true,
"data": [
{
"id": 1,
"name": "د. أحمد محمد",
"specialization": "Cardiology"
},
{
"id": 2,
"name": "د. فاطمة علي",
"specialization": "Pediatrics"
}
]
}
departmentId - معرف القسم (integer, required){
"status": true,
"data": [
{
"id": 1,
"name": "د. أحمد محمد",
"department_id": 5,
"department_name": "Emergency Department"
}
]
}
specializationId - معرف التخصص (integer, required){
"status": true,
"data": [
{
"id": 1,
"name": "د. أحمد محمد",
"specialization_id": 3,
"specialization_name": "Cardiology",
"consultation_fee": 150.00
}
]
}
يعرض الأطباء المتاحين للعمل في الوقت الحالي بناءً على جداولهم وإجازاتهم
{
"status": true,
"data": [
{
"id": 1,
"name": "د. أحمد محمد",
"specialization": "Cardiology",
"current_schedule": {
"start_time": "09:00:00",
"end_time": "17:00:00"
}
}
],
"meta": {
"current_time": "2024-03-15T14:30:00Z"
}
}
يعرض الأطباء المتاحين في قسم الطوارئ
{
"status": true,
"data": [
{
"id": 2,
"name": "د. فاطمة علي",
"specialization": "Emergency Medicine",
"department": "Emergency Department",
"available_until": "22:00:00"
}
]
}
يعرض الأطباء الذين لديهم تقييم 4.5 أو أعلى
| Parameter | Type | Description | Default |
|---|---|---|---|
min_rating |
float | الحد الأدنى للتقييم | 4.5 |
limit |
integer | عدد النتائج | 10 |
{
"status": true,
"data": [
{
"id": 1,
"name": "د. أحمد محمد",
"specialization": "Cardiology",
"average_rating": 4.8,
"total_reviews": 150
}
]
}
| Parameter | Type | Description |
|---|---|---|
doctor_id |
integer | فلترة حسب الطبيب |
day_of_week |
integer | فلترة حسب اليوم (0-6) |
{
"status": true,
"data": [
{
"id": 1,
"doctor_id": 1,
"day_of_week": 1,
"day_name": "Monday",
"start_time": "09:00:00",
"end_time": "17:00:00",
"is_off": false
}
]
}
{
"doctor_id": 1,
"day_of_week": 1,
"start_time": "09:00:00",
"end_time": "17:00:00",
"is_off": false
}
doctor_id - required, integer, exists in doctorsday_of_week - required, integer, between:0,6start_time - required_if:is_off,false, time format (HH:MM:SS)end_time - required_if:is_off,false, time format, after:start_timeis_off - nullable, boolean{
"status": true,
"message": "Schedule created successfully",
"data": {...}
}
doctor - معرف الطبيب (integer, required){
"status": true,
"data": [
{
"day_of_week": 0,
"day_name": "Sunday",
"start_time": "09:00:00",
"end_time": "17:00:00",
"is_off": false
},
{
"day_of_week": 5,
"day_name": "Friday",
"is_off": true
}
]
}
{
"status": true,
"data": [
{
"day_of_week": 0,
"day_name": "Sunday",
"start_time": "09:00:00",
"end_time": "17:00:00"
}
]
}
{
"status": true,
"data": [
{
"day_of_week": 5,
"day_name": "Friday"
},
{
"day_of_week": 6,
"day_name": "Saturday"
}
]
}
يسمح بتحديث جميع أيام الأسبوع دفعة واحدة
{
"schedules": [
{
"day_of_week": 0,
"start_time": "09:00:00",
"end_time": "17:00:00",
"is_off": false
},
{
"day_of_week": 1,
"start_time": "09:00:00",
"end_time": "17:00:00",
"is_off": false
},
{
"day_of_week": 5,
"is_off": true
}
]
}
{
"status": true,
"message": "Schedules updated successfully",
"data": {
"created": 5,
"updated": 2
}
}
doctor - معرف الطبيب (integer, required)dayOfWeek - رقم اليوم (0=Sunday, 6=Saturday){
"status": true,
"message": "Day off set successfully"
}
| Parameter | Type | Description |
|---|---|---|
doctor_id |
integer | فلترة حسب الطبيب |
status_id |
integer | فلترة حسب الحالة |
leave_type_id |
integer | فلترة حسب نوع الإجازة |
start_date |
date | من تاريخ |
end_date |
date | إلى تاريخ |
{
"status": true,
"data": [
{
"id": 1,
"doctor_id": 1,
"doctor_name": "د. أحمد محمد",
"leave_type": "Annual Leave",
"start_date": "2024-03-01",
"end_date": "2024-03-05",
"status": "approved",
"reason": "عطلة سنوية",
"is_half_day": false
}
]
}
يعرض جميع طلبات الإجازات التي تحتاج إلى موافقة
{
"status": true,
"data": [
{
"id": 2,
"doctor_id": 3,
"doctor_name": "د. فاطمة علي",
"leave_type": "Sick Leave",
"start_date": "2024-03-10",
"end_date": "2024-03-12",
"status": "pending",
"requested_at": "2024-03-05T10:00:00Z"
}
]
}
يعرض الإجازات المعتمدة والجارية في الوقت الحالي
{
"status": true,
"data": [
{
"id": 1,
"doctor_id": 1,
"doctor_name": "د. أحمد محمد",
"leave_type": "Annual Leave",
"start_date": "2024-03-01",
"end_date": "2024-03-05",
"days_remaining": 2
}
],
"meta": {
"current_date": "2024-03-03"
}
}
يعرض الإجازات المعتمدة التي ستبدأ في المستقبل
{
"status": true,
"data": [
{
"id": 3,
"doctor_id": 2,
"doctor_name": "د. محمد خالد",
"leave_type": "Annual Leave",
"start_date": "2024-04-01",
"end_date": "2024-04-10",
"days_until_start": 25
}
]
}
doctor - معرف الطبيب (integer, required){
"status": true,
"data": [
{
"id": 1,
"leave_type": "Annual Leave",
"start_date": "2024-03-01",
"end_date": "2024-03-05",
"status": "approved",
"total_days": 5
}
]
}
{
"doctor_id": 1,
"leave_type_id": 2,
"start_date": "2024-03-01",
"end_date": "2024-03-05",
"reason": "عطلة سنوية",
"is_half_day": false
}
doctor_id - required, integer, exists in doctorsleave_type_id - required, integer, exists in leave_typesstart_date - required, date, after_or_equal:todayend_date - required, date, after_or_equal:start_datereason - nullable, string, max:500is_half_day - nullable, boolean{
"status": true,
"message": "Leave request submitted successfully",
"data": {
"id": 1,
"status": "pending",
"total_days": 5
}
}
{
"status": false,
"message": "Leave dates overlap with existing approved leave",
"errors": {
"start_date": ["Conflicting leave exists"]
}
}
leave - معرف الإجازة (integer, required){
"action": "approve",
"rejection_reason": "optional - required if action is reject"
}
action - required, in:approve,rejectrejection_reason - required_if:action,reject, string, max:500{
"status": true,
"message": "Leave approved successfully",
"data": {
"id": 1,
"status": "approved"
}
}
leave - معرف الإجازة (integer, required){
"cancellation_reason": "سبب الإلغاء"
}
{
"status": true,
"message": "Leave cancelled successfully"
}
// عرض مواعيد طبيب معين
$doctor = Doctor::find(1);
$appointments = $doctor->appointments;
// إنشاء موعد مع طبيب
$appointment = Appointment::create([
'doctor_id' => $doctor->id,
'patient_id' => $patientId,
'scheduled_at' => '2024-03-15 10:00:00',
]);
// ربط طبيب مع مريض
$doctor->patients()->attach($patientId);
// عرض جميع مرضى الطبيب
$patients = $doctor->patients;
// ربط طبيب بقسم معين
$doctor->department_id = $departmentId;
$doctor->save();
// عرض أطباء قسم معين
$department = Department::find(1);
$doctors = $department->doctors;
// التحقق من توفر طبيب في وقت محدد
use Modules\Doctors\Services\DoctorAvailabilityService;
$service = app(DoctorAvailabilityService::class);
$isAvailable = $service->isAvailable($doctorId, '2024-03-15 10:00:00');
// الحصول على أوقات العمل المتاحة
$availableSlots = $service->getAvailableSlots($doctorId, '2024-03-15');
// إضافة طبيب جديد
$doctor = Doctor::create([
'user_id' => $userId,
'license_number' => 'MED-12345',
'specialization_id' => 3,
'department_id' => 5,
'consultation_fee' => 150.00,
'experience_years' => 8,
'verified' => false, // يحتاج تحقق
'accepts_new_patients' => true,
]);
// إضافة جدول أسبوعي
$schedules = [
['day_of_week' => 0, 'start_time' => '09:00', 'end_time' => '17:00'], // Sunday
['day_of_week' => 1, 'start_time' => '09:00', 'end_time' => '17:00'], // Monday
['day_of_week' => 2, 'start_time' => '09:00', 'end_time' => '17:00'], // Tuesday
['day_of_week' => 3, 'start_time' => '09:00', 'end_time' => '17:00'], // Wednesday
['day_of_week' => 4, 'start_time' => '09:00', 'end_time' => '13:00'], // Thursday (half day)
['day_of_week' => 5, 'is_off' => true], // Friday off
['day_of_week' => 6, 'is_off' => true], // Saturday off
];
foreach ($schedules as $schedule) {
$schedule['doctor_id'] = $doctor->id;
DoctorSchedule::create($schedule);
}