البنية التحتية للنظام - System Infrastructure & Shared Components
Core Module هو حجر الأساس للنظام. يوفر البنية التحتية المشتركة بين جميع الـ Modules الأخرى.
نظام موحد لإدارة حالات الكيانات في النظام
name - اسم الحالة (مثال: "Draft")slug - معرف فريد (مثال: "draft")model_type - نوع الـ Model (مثال: "invoice", "appointment")color - لون الحالة في الواجهة (مثال: "green", "red")icon - أيقونة الحالةis_default - حالة افتراضية؟is_final - حالة نهائية؟ (لا يمكن التعديل بعدها)// Invoice Statuses
'draft', 'pending', 'approved', 'paid', 'cancelled'
// Appointment Statuses
'scheduled', 'confirmed', 'completed', 'cancelled', 'no_show'
// Admission Statuses
'admitted', 'in_treatment', 'discharged'
نظام تصنيف هرمي للبيانات (Categories, Tags, Types)
name - اسم التصنيفslug - معرف فريدparent_id - التصنيف الأب (للهيكل الهرمي)type - نوع التصنيف (category, tag, type)description - وصف التصنيفMedical Services (Parent)
├── Cardiology
│ ├── ECG
│ └── Echocardiography
├── Radiology
│ ├── X-Ray
│ └── MRI
└── Laboratory
├── Blood Tests
└── Urine Tests
إدارة الضرائب والرسوم
name - اسم الضريبة (مثال: "VAT")rate - النسبة (مثال: 15.00 للـ VAT)type - النوع (percentage, fixed)is_active - نشطة؟Tax::create([
'name' => 'VAT',
'rate' => 15.00,
'type' => 'percentage',
'is_active' => true
]);
توليد أرقام تلقائية للفواتير والمستندات
key - مفتاح التسلسل (مثال: "invoice")prefix - البادئة (مثال: "INV-")suffix - اللاحقة (اختياري)current_value - القيمة الحاليةpadding - عدد الأصفار (مثال: 4 → 0001)INV-2025-0001
INV-2025-0002
APT-20251206-0042
PAT-2025-00123
تخزين الأحداث للتكامل بين Modules (Outbox Pattern)
event_type - نوع الحدثpayload - البيانات (JSON)processed - تمت معالجته؟processed_at - وقت المعالجةإعدادات النظام المركزية
key - مفتاح الإعدادvalue - القيمةtype - نوع البيانات (string, boolean, json)group - المجموعة (general, email, sms)Authentication Required: جميع الـ endpoints تتطلب Bearer Token
Query Parameters:
per_page: integer // عدد النتائج (default: 15)
page: integer // رقم الصفحة
model_type: string // فلترة حسب نوع Model (invoice, appointment)
is_default: boolean // الحالات الافتراضية فقط
is_final: boolean // الحالات النهائية فقط
Response Example:
{
"status": true,
"data": [
{
"id": 1,
"name": "Draft",
"slug": "draft",
"model_type": "invoice",
"color": "gray",
"icon": "fa-file",
"is_default": true,
"is_final": false
}
],
"meta": {
"current_page": 1,
"total": 25
}
}
الوصف: يرجع الحالات مجمعة حسب نوع الـ Model (مفيد للـ dropdowns)
Response Example:
{
"status": true,
"data": {
"invoice": [
{"id": 1, "name": "Draft", "slug": "draft"},
{"id": 2, "name": "Pending", "slug": "pending"},
{"id": 3, "name": "Paid", "slug": "paid"}
],
"appointment": [
{"id": 10, "name": "Scheduled", "slug": "scheduled"},
{"id": 11, "name": "Confirmed", "slug": "confirmed"}
]
}
}
Response Example:
{
"status": true,
"data": [
"invoice",
"appointment",
"admission",
"prescription",
"lab_test"
]
}
Query Parameters:
context: string (required) // نوع الـ Model (invoice, appointment)
مثال:
GET /api/core/statuses/by-context?context=invoice
Request Body:
{
"name": "Approved",
"slug": "approved",
"model_type": "invoice",
"color": "green",
"icon": "fa-check-circle",
"order": 3,
"is_default": false,
"is_final": false,
"is_active": true
}
Query Parameters:
type: string // نوع التصنيف (category, tag, type)
parent_id: integer // التصنيفات الأبناء لـ parent معين
search: string // بحث في الاسم
Request Body:
{
"name": "Cardiology",
"slug": "cardiology",
"type": "category",
"parent_id": 1,
"description": "Heart and cardiovascular services"
}
Request Body:
{
"name": "VAT",
"rate": 15.00,
"type": "percentage",
"is_active": true
}
Request Body:
{
"key": "invoice",
"prefix": "INV-",
"padding": 4,
"current_value": 0
}
الوصف: يقوم بزيادة الرقم الحالي وإرجاع الرقم الكامل المنسق
Response Example:
{
"status": true,
"data": {
"number": "INV-0001",
"current_value": 1
}
}
use Modules\Core\Services\StatusService;
$statusService = app(StatusService::class);
// الحصول على حالة معينة
$draftStatus = $statusService->getBySlug('draft', 'invoice');
// تعيين حالة للفاتورة
$invoice->status_id = $draftStatus->id;
$invoice->save();
use Modules\Core\Services\CodeSequenceService;
$sequenceService = app(CodeSequenceService::class);
// توليد رقم فاتورة جديد
$invoiceNumber = $sequenceService->getNext('invoice');
// Result: "INV-2025-0001"
// توليد رقم موعد
$appointmentNumber = $sequenceService->getNext('appointment');
// Result: "APT-20251206-0042"
// الحصول على تصنيف محدد
$category = Taxonomy::where('slug', 'cardiology')->first();
// الحصول على التصنيفات الأبناء
$subCategories = $category->children;