T Toutadminالتوثيق

إصداران، منتج واحد

يوجد Toutadmin في نسختين: إحداهما تعمل على Node.js والأخرى على PHP. ليسا منتجين، ولا نسخة مخفَّفة وأخرى كاملة. هما المساحات نفسها وعددها 51، والمخطط نفسه بـ 142 جدولًا، واللغات نفسها وعددها 16، والشاشات نفسها. هذه الصفحة تقول ما يفصل بينهما حقًا — وهو قليل.

لماذا اثنان#

منتج المؤسسات يجب أن يُثبَّت حيث تكون المؤسسة أصلًا. بعضها يملك خادمًا وsystemd ومسؤول نظام؛ وبعضها يملك استضافة مشتركة بأربعة يوروهات شهريًا ووصولًا عبر FTP. إصدار Node يخاطب الأولى، وإصدار PHP يخاطب الثانية. ورفض الثانية كان سيعني رفض نصف الشركات التي تحتاج أداة إدارة أكثر من غيرها.

ما هو متطابق تمامًا#

العنصرNodePHP
مساحات العمل5151
جداول قاعدة البيانات142142
الأعمدة13111311
لغات الواجهة1616
مفاتيح الترجمة27652792
الوحدات الاختيارية77
أحداث خطافات الويب88
موارد واجهة البرمجة99

ولأن المخطط واحد، تنتقل قاعدة البيانات من إصدار إلى آخر بلا أي تحويل: أوقف أحدهما، وانسخ app.sqlite ومجلدات الملفات، وشغّل الآخر. وكلمات المرور تبقى صالحة، إذ يقرأ الإصداران صيغة البصمة نفسها. هذا أنزه اختبار للتكافؤ، وقد نجح.

ما يختلف#

شكل بضعة عناوين#

531 مسارًا في جانب Node، و513 في جانب PHP. والفارق ليس نقصًا: هي الوظائف نفسها مكتوبة بصورة أكثر إيجازًا.

  • واجهة البرمجة. يعلن Node موارده التسعة واحدًا واحدًا (/api/v1/collaborateurs و/api/v1/services…)؛ أما PHP فيقدّمها تحت مسار واحد ذي وسيط. التسعة كلها تستجيب، والجذر يعلنها جميعًا، واختبار يستدعيها واحدًا واحدًا ليثبت ذلك.
  • التثبيت. يرشدك Node في خمس خطوات، ويتّسع PHP لصفحة واحدة وإرسال واحد. والمعلومات المطلوبة هي الخمس نفسها: اللغة، والمتطلبات، والشركة، وأيام الإجازة السنوية، وحساب الإدارة.
  • الصلاحيات العرضية. لدى Node مسار لكل صلاحية، ولدى PHP مسار واحد ذو وسيط هو /admin/droits/{flag}.

هذه الفروق الشكلية الثمانية والعشرون لا تُقال عن ظهر قلب: ملف tests/test_parity.php يختبرها كلها، واحدًا تلو الآخر.

المسح الدوري#

يحمل Node مجدوِله الخاص: الخادم يعمل على الدوام ويوقظ نفسه. أما PHP فلا يحيا إلا أثناء طلب: العمليات الثماني نفسها تمرّ عبر tools/cron.php، الذي يستدعيه مجدول الاستضافة. الشفرة نفسها، والأثر نفسه، ومُطلِق مختلف.

التواريخ#

يكتب Node تواريخه بواسطة Intl المدمج في V8. ويفعل PHP الشيء نفسه متى توفّر امتداد intl — محرك ICU نفسه، والنتائج نفسها حرفًا بحرف. وعند غيابه تأتي أسماء الأيام والأشهر من قواميس الترجمة: يبقى التاريخ صحيحًا ومترجَمًا، وقد يختلف ترتيب عناصره في بضع لغات.

ما لا يختلف وقد تظنه مختلفًا#

الموضوعفي الإصدارين
رموز QR (التحقق بخطوتين)مُرمِّز مكتوب يدويًا في جانب PHP، جرى التحقق منه بايتًا ببايت مقابل المكتبة المستعملة في جانب Node، على ست عشرة طولًا نصيًا.
أرشيفات النسخ الاحتياطيملف tar.gz مكتوب بلا أي اعتمادية في الجانبين، بالمحتوى نفسه والبصمات SHA-256 نفسها.
صندوق البريد المحاسبي IMAPعميل IMAP مكتوب داخل المنتج في الجانبين.
PDF وCSV والاستيرادمكتوبة داخل المنتج، والملفات الناتجة هي ذاتها.
سجل التدقيقتسلسل البصمات نفسه: سطر واحد معدَّل يقطع السلسلة، في الجانبين.
سياسة أمان HTTPالترويسات نفسها، وسياسة المحتوى نفسها برقم لمرة واحدة، والغياب نفسه لأي JavaScript لا غنى عنه.

أيّهما تختار#

حالتكالإصدار
استضافة مشتركة، ووصول FTP، وبلا سطر أوامرPHP — هذه هي الحالة المقصودة بالضبط
خادم تملكه، وsystemd، ومسؤول نظامNode
تُحسن إدارة أحدهما سلفًاذاك. التكافؤ يجعل الاختيار قابلًا للرجوع.
مستخدمون كثر في الوقت نفسهNode — سيرورة دائمة، وقاعدة البيانات مفتوحة سلفًا
إن ترددتPHP — قطع أقل للصيانة، والانتقال إلى Node يبقى نسخ ملفات

كيف يُحفظ التكافؤ#

ليس نيةً بل تحققًا. مع كل تعديل تجري أربع مقارنات:

  1. المسارات — تُستخرج من الجانبين وتُقارن؛ وكل فارق يجب أن يكون اختلافًا موثَّقًا.
  2. الدوال — الأسماء التي تصدّرها كل وحدة، تُقارن وحدةً وحدة.
  3. المخطط — الجداول والأعمدة تُقرأ من القاعدتين وتُقارن.
  4. الشاشات — يُشغَّل الإصداران جنبًا إلى جنب ويتصفّحهما متصفح حقيقي صفحةً صفحة، مع مقارنة رمز الاستجابة والبنية.

وجدت هذه المرات الأربع عيوبًا حقيقية — منها اثنان يمسّان كلا الإصدارين. وهذا ما يجعلها مفيدة: تكافؤ لا تقيسه هو تكافؤ فقدته دون أن تدري.

يُضاف إلى ذلك مجموعات الاختبار: 802 حالة في جانب Node، و572 في جانب PHP، أي 1374 في المجموع.

توثيق Toutadmin — بُني في 2026-09-13. موقع مستقل، منفصل عن البرنامج.