التقدّم
خلص
شغّال دلوقتي
٨٨٪ — خلص
الباقي
الشغل كله اتكتب واتحفظ. فاضل إصلاح واحد أخير — وهو اللي شغّال دلوقتي.
١. إيه اللي كنا بنعمله أصلًا؟
طلبت إن نظام الاعتماد يشتغل على كل المستندات، ونضيف له مستندات المخازن.
ولما فتحنا الكود، لقينا حاجة مقلقة:
«التسوية المخزنية» — المستند اللي بيعدّل كميات المخزون — كان بيمسح مخزون:
- بلا أي قيد محاسبي
- بلا أي توقيع تاني
- بصلاحية واحدة بس
يعني موظف واحد لوحده يقدر يمسح مخزون من النظام، ومحدش يراجعه، ومفيش أثر في الحسابات. دي أشهر قناة سرقة مخزون في أي نظام ERP.
٢. اللي خلص ✅
دلوقتي ٥ مستندات بيمرّوا على اعتماد قبل ما يأثّروا على المخزون أو الحسابات:
| المستند | كان بيعمل إيه من غير رقابة | |
| تسوية مخزنية | بتمسح مخزون — بلا قيد وبلا توقيع تاني | اتأمّن |
| صرف مخزني | بيقلّل المخزون + بيعمل قيد تكلفة المبيعات | اتأمّن |
| استلام مخزني | بيزوّد المخزون ويدخّل تكلفته الدفاتر | اتأمّن |
| إذن استلام (GRN) | بيحرّك مخزون + بيعمل قيد محاسبي | اتأمّن |
| إذن تسليم | بيخصم مخزون للعميل | اتأمّن |
الضمانة الأساسية: المستند وهو «بانتظار الاعتماد» ⟵ صفر حركة مخزون · صفر قيد محاسبي.
ولو مفيش دورة اعتماد معرّفة عندك ⟵ كل حاجة زي ما هي بالظبط. اللي شغّال دلوقتي مش هيتكسر.
وكمان اتصلّحت حاجة بتلخبط
زرار «اعتماد» في المخازن ماكانش اعتماد أصلًا — هو نفسه زرار التنفيذ (بيحرّك المخزون).
فبقى اسمه اللي هو فعلًا: «استلام» / «صرف» / «ترحيل». و✅ الأخضر بقى للاعتماد الإداري بس.
من غير كده، أمين المخزن كان هيشوف زرارين أخضر جنب بعض بمعنيين معكوسين — ويدوس الغلط.
٣. وفي الطريق — لقينا إن نظام الاعتماد اللي عندك كان بيتلفّ عليه
الحاجات دي مكانتش في طلبك. كانت موجودة وشغّالة على المبيعات والمشتريات من قبل ما نبدأ.
١. الرفض ماكانش بيعمل حاجة.
المدير يرفض مستند → النظام يسجّل «مرفوض» → المستخدم يدوس «تأكيد» تاني → المستند يعدّي عادي.
يعني الرفض كان مجرد كلام.
٢. الدورة بينلفّ عليها من الـAPI.
حد معاه صلاحية الاعتماد يقدر يعتمد المسودة على طول — من غير ما يعدّي على المستويات أصلًا.
الشاشة كانت بتخفي الزرار، بس الباب الخلفي كان مفتوح.
٣. صندوق الاعتمادات كان بيقفل المستندات.
تعتمد آخر مستوى من الصندوق → المستند يفضل محبوس «بانتظار الاعتماد» للأبد.
وده المسار الأساسي اللي المعتمِد بيستخدمه.
٤. 🔴 البوابة كانت بتتشترى بقرش.
العتبة (مثلًا: أي تسوية فوق ٥٠٠ جنيه لازم اعتماد) كانت بتتحسب من السعر اللي المستخدم بيكتبه بإيده.
فلو كتب: ٥٠٠٠ وحدة × ٠.٠١ جنيه = ٥٠ جنيه ⟵ تحت العتبة ⟵ عدّت من غير أي اعتماد.
يعني قناة السرقة اللي عملنا ده كله عشانها — كانت هتفضل مفتوحة من باب تاني.
٥. التوقيع التاني ماكانش بيساوي حاجة.
عشان تدّي حد حق «يعتمد» صرف مخزون، كنت مضطر تديله حق «يصرفه» بنفسه.
يعني المعتمِد ممكن يخوّل ويرحّل لوحده — ومفيش فصل صلاحيات أصلًا.
٤. اللي بيحصل دلوقتي بالظبط
آخر إصلاح. بيقفل حاجتين — إحنا اللي عملناهم وإحنا بنصلّح حاجات تانية.
🔒 المشكلة الأولى: النظام ممكن يتجمّد
بالبلدي: تخيّل بابين، وكل واحد محتاج يعدّي من الاتنين.
واحد ماسك الباب الأول ومستني التاني. والتاني ماسك الباب التاني ومستني الأول.
⟵ الاتنين واقفين للأبد.
ده بالظبط اللي بيحصل لو موظفين اعتمدوا مستندين في نفس اللحظة — قاعدة البيانات بتتجمّد وواحدة من العمليتين بتتلغي في نص الشغل.
وإحنا اللي عملناها. إصلاح قبل كده ضاف «قفل» على المستند لحمايته — والقفل ده هو اللي قفل الدايرة.
السبب الحقيقي: في عمود في قاعدة البيانات ناقصه فهرس (index). فبدل ما النظام يقفل صف واحد، كان بيقفل الجدول كله.
⚡ المشكلة التانية: المخزون يتمسح مرتين
بالبلدي: واحد بيرحّل المستند، وفي نفس اللحظة واحد تاني بيرفضه.
الترحيل بيتم (المخزون بيتحرك) ✓ — وبعدين الرفض بيكتب فوقه ويرجّع المستند «مسودة».
⟵ المستند بيبان كإنه لسه ما اتعملش ⟵ حد يرحّله تاني ⟵ المخزون يتمسح مرتين.
اللي الوكيل بيعمله دلوقتي
١بيضيف الفهرس الناقص ⟵ القفل بيبقى على صف واحد بدل الجدول كله ⟵ الجمود بيتكسر
٢بيخلّي زرار الرفض يقفل المستند الأول ⟵ مايقدرش يكتب فوق ترحيل حصل ⟵ السباق بيتقفل
٣بيكتب السبب في الكود نفسه ⟵ عشان اللي يشتغل بعدنا ما يكسرهاش وهو مش واخد باله
٤بيشغّل الاختبارات ⟵ يتأكد إن مفيش حاجة اتكسرت
٥. طيب الاختبارات دي بتعمل إيه؟ وليه بتاخد وقت؟
الاختبارات هي الدليل الوحيد إن الكلام اللي بقوله صح.
من غيرها، أنا بقول لك «تمام» وأنا مش عارف.
ودي حاجات لو غلطت فيها، مش هتكتشفها غير بعد ما مخزون يتمسح أو قيد يتعمل غلط.
أهم اختبارين — دول اللي بيثبتوا الشغل كله
✓ الاختبار الأول
«مستند بانتظار الاعتماد ⟵
صفر حركة مخزون · صفر قيد محاسبي»
ده اللي بيثبت إن الرقابة شغّالة فعلًا.
✓ الاختبار التاني
«مفيش دورة اعتماد ⟵
مفيش أي تغيير خالص»
ده اللي بيحمي اللي شغّالين دلوقتي من إن شغلنا يكسر عليهم.
الأرقام دلوقتي
| اختبارات نجحت | ١٦٣٧ |
| اختبارات فاشلة | ٢٦ — وكلهم أعطال قديمة موجودة قبلنا (اتطابقوا واحد واحد) |
| أعطال جديدة من شغلنا | صفر |
ليه بتاخد وقت؟
الاختبارات عندك بطيئة جدًا — السويت الواحدة ٤٥–٦٠ دقيقة.
السبب: كل ملف اختبار بيعيد بناء قاعدة بيانات كاملة من الصفر.
(في حل بيخلّيها ٣ أضعاف أسرع — بس هو نفسه بيطلّع إنذارات كاذبة، فمش أمين كدليل نهائي.)
٦. ليه كل ده مهم؟
المراجعة رجّعت الشغل ٣ مرات. وكل مرة كانت لاقية حاجة إحنا عملناها.
لو كنت وقفت عند «الاختبارات خضرا والشغل شكله تمام»، كنت سلّمتلك نظام:
- بيمسح المخزون مرتين لو حد ضغط رفض على مستند مُرحَّل
- وبيتجمّد لو اتنين عملوا اعتماد في نفس اللحظة
- وبوابة الرقابة فيه بتتشترى بقرش
الاختبارات الخضرا مش دليل على إن الشغل صح — هي دليل على إن اللي اختبرته شغّال.
والحاجات دي كلها كانت بتعدّي من الاختبارات.
٧. فاضل إيه؟
| الخطوة | الوقت |
| الوكيل يخلّص الإصلاح + الاختبارات | شغّال دلوقتي ٣٠–٩٠ دقيقة |
| أتأكد بنفسي إن مفيش حاجة اتكسرت | ١٠ دقايق |
بناء ونشر على /app | ٥ دقايق |
وبعدها خلاص. مفيش مراحل تانية.
⚠️ حاجة واحدة لازم تعملها قبل ما تجرّب:
أي دور تحطه معتمِد لازم يكون معاه صلاحية «سجلات الاعتماد ← تصرّف».
المالك والمدير معاهم ✓ — بس المحاسب ومدير الموارد البشرية ومدير المعمل مش معاهم.
(مربع واحد في شاشة الصلاحيات الجديدة.)
٨. حاجات لسه مفتوحة — بصراحة
دي حاجات ما اتعملتش، ومش هدّعي عكس كده:
الأهم: التقييم لسه بيثق في سعر المستخدم.
الرقابة اتأمّنت (حد لازم يوقّع) ✓ — بس لو التسوية اتوقّع عليها، هتترحّل بـ٥٠ جنيه في الدفاتر بدل قيمتها الحقيقية.
يعني: مفيش سرقة صامتة تاني — بس الرقم في الميزانية غلط.
ده باگ قديم في التقييم مش في الرقابة. مستني كلمتك تحب أضيفه؟
حاجات تانية مسجّلة (أقل أهمية):
- ٣ مسارات بتعمل استلام وبتتخطّى دورة الاعتماد (وضّحتها في ملاحظات الإصدار عشان الوعد يبقى دقيق)
- الـ٨ مستندات القديمة (فواتير، أوامر...) لسه بتدمج «التخويل» و«الترحيل» في زرار واحد — الـ٥ الجداد بس هم اللي بالشكل الصح
- الجرد والتحويل والرصيد الافتتاحي — مؤجّلين بقرار، مش نسيان (مشروح ليه في التحليل)
آخر تحديث: أثناء تنفيذ الإصلاح الأخير