# القرارات والافتراضات

| القرار | المعالجة |
|---|---|
| Laravel وPHP | Laravel 13 مع PHP 8.3+ بحسب شرط الإصدار الرسمي. PHP CLI والويب يجب أن يستخدما إصدارًا متوافقًا. |
| الواجهة | Livewire وBlade مع Tailwind CSS. تبنى الأصول على جهاز التطوير وتُرفع مع الحزمة. |
| الاستضافة | MySQL/MariaDB، طابور Database، Scheduler/ Cron كل دقيقة، ولا يتطلب التشغيل الأساسي Docker أو Redis أو Supervisor أو Node على الإنتاج. |
| تعدد العملاء | قاعدة واحدة وجداول بيانات العملاء مرتبطة بـ`tenant_id`. تُستخرج هوية العميل من المستخدم أو الجهاز المصادق عليه. |
| الحدود | يبدأ حد الجهاز بجهاز واحد، والموظفين 5، والأقسام 3. Super Admin يستطيع تعديلها. تُفحص حدود الإضافة داخل معاملة وقفل صف العميل. |
| المرسل غير المعروف | لا تُهمل الرسائل: تحفظ مشفرة في صندوق لا يراه إلا Super Admin. اعتمادها ينشئ/يستخدم مرسلًا ويحوّل الرسائل المنتظرة إلى المحادثة. |
| SMS Forwarder | يُستخدم قالب `SMSFW_V1` مع `Sender:` ونص الرسالة كما هو للحفاظ على أسطر Unicode. Endpoint يقبل حقول `text` المتوافقة مع صيغة Slack. |
| تكرار Webhook | يفضّل `X-SMSFW-Delivery-ID` ثابتًا؛ يحسب منه مفتاح لا يكشف قيمته. إذا لم يرسله التطبيق، يستخدم النظام بصمة حمولة كاملة داخل نافذة `SMS_WEBHOOK_DEDUP_SECONDS` (120 ثانية افتراضيًا). رسالة متطابقة مستقلة خلال النافذة قد تندمج، وإعادة المحاولة بعد النافذة قد تُنشئ تكرارًا. لا يمكن التمييز يقينًا بلا معرّف مصدر ثابت. |
| الأسرار | سر الجهاز يُخزن كـHash ويظهر الرابط كاملًا مرة واحدة. Tokens وChat IDs وTOTP ونسخة الرسالة الأصلية مشفرة باستخدام مفتاح التطبيق. |
| الخصوصية | المنقح هو أساس العرض والتصدير وTelegram. يحتفظ الأصل مشفرًا، ولا يسجل التطبيق محتوى SMS في سجلات الأخطاء. |
| Regex | Regex بصيغة delimiters `~...~u` وبطول محدود. تُخفض حدود PCRE ويقيد طول النص قبل المطابقة. |
| الإحالة | إحالة مفتوحة واحدة لكل رسالة؛ ينفذ فحصها بعد قفل صف الرسالة. الأرشفة تعطل القسم بعد إغلاق الإحالات ولا تمسح التاريخ. |
| البحث | بحث SQL باستخدام `LIKE` مع Full-text index حين يدعمه MySQL/MariaDB. SQLite للاختبار يستخدم index fallback. |
| التخزين | الصوت والتصديرات والنسخ داخل مساحة خاصة. رابط تنزيل الصوت محمي بالسياسة في كل طلب. |
| الملفات | نسخ احتياطي SQL بصيغة gzip ثم تشفير Sodium secretstream. يلزم مفتاح APP_KEY وامتداد sodium، وإمكانية تنزيل النسخة للتحقق قبل الاستعادة اليدوية. |
| PDF | Dompdf بخطوط DejaVu المتاحة في الحزمة لدعم Unicode/Arabic؛ يجب فحص تشكيل الحروف بصريًا على نسخة Release الفعلية قبل النشر. |
| الاختبارات | PHPUnit مع SQLite في الذاكرة. يلزم تشغيلها أيضًا على MySQL/MariaDB في CI للتحقق من locking وFull-text وقيود المحرك. |

## حدود يجب التحقق منها قبل اعتماد الإنتاج

- يمكن لحدود Cron ووقت تشغيل PHP في الاستضافة أن تحدد حجم الأعمال الممكنة لكل دقيقة. يجب قياس تأخير الطوابير واختيار Cron/مهلة مناسبة.
- Laravel 13 يتطلب PHP 8.3+. إذا كانت الاستضافة لا توفره، لا تخفض الحد الأدنى تلقائيًا؛ يلزم قرار واعٍ باختيار نسخة Laravel مدعومة ومتوافقة ثم إعادة الاختبارات.
- نافذة dedup الافتراضية مفاضلة بين منع retries واعتبار رسالتين SMS متطابقتين مستقلتين. الأفضل توفير معرّف مصدر ثابت من SMS Forwarder إن كان يدعمه.
- قنوات WebSocket ليست مشغلة في هذا الإصدار؛ polling هو قناة التزامن المستخدمة.
- إرسال Backup عبر Telegram يرسل الملف المشفر فقط، لكن يظل حد حجم واجهة Telegram والاتصال الخارجي مرتبطًا ببيئة التشغيل.
