تشخيص شامل · المرحلة ١ — بلا كود

نقاط البيع (POS) — إيه اللي مكسور، وليه، وخطة الإصلاح

أربع مسارات تتبّع متوازية (الباك-إند · الواجهة وظيفيًا · الاختبارات والانحدارات · التصميم والتجربة). ٣٤ نتيجة، أهم أربعتهم مؤكَّدين من مصدرين مستقلّين، واتنين اتحسموا بقراءة قاعدة بيانات بيئتك. الخلاصة: العيوب مش ٣٤ مشكلة منفصلة — هي ست عائلات لكل واحدة سبب واحد.

الخطورة: حرجة — تسريب نقدية مالي: [FIN] الشاشات: الـPOS كامل + المرتجعات + الورديات ١ أغسطس ٢٠٢٦ · moonui2 · hazemdev2 الحالة: تشخيص — مستنّي موافقتك

١ الأعراض

بلاغك كان: «حصلت تعديلات كتيرة وبقى في مشاكل في تقريبًا أغلب النقاط اللي فيها، زي الدفع». التشخيص حوّل ده لأعراض محدّدة وقابلة للاختبار:

المكانالمتوقَّعالواقع
نافذة الدفع الكاملةتدفع كاش + شبكة بمبلغ ومرجعبترجع خطأ ٤٢٢ دايمًا — ما تقدرش تكمّل بيعة منها إطلاقًا
مفاتيح FF10 كاش · F11 شبكة · F1 دفعميتة طول ما التركيز على خانة الباركود — وده وضع الراحة المصمَّم
خصم / كوبونالفاتورة تطلع بالمخصومالشاشة تاخد ٩٠ والفاتورة تتعمل ١٠٠ ⇒ مديونية وهمية دائمة
الضريبةتتحصّل وتتسجّلتتحصّل من الزبون وما تتسجّلش على الفاتورة ولا في حساب الضريبة
الباقييتسجّل باقي ويتعرضالمدفوع كله بيتسجّل نقدية ⇒ الخزينة أكبر من الدرج، والباقي يختفي من الشاشة بعد التأكيد
إقفال الورديةمتوقّع مقابل فعليوردية فيها شبكة مستحيل تتقفل · والمتوقّع بيحسب مدفوعات كاشير تاني · والفرق دايمًا صفر
التعليق (F4) والمرتجعيشتغلوابيفشلوا في صمت تام — لا رسالة ولا تغيير
الأوفلاينيزامن بأمانممكن يكرّر البيعة، وممكن يحجز الكاش للأبد لو الوردية اتقفلت
المخزون (على بيئتك)يتخصم عند البيعالبضاعة تخرج والمخزون ما يتخصمش والتكلفة ما تتسجّلش لحد ما أمين مخزن يعتمد

ملاحظة صدق عن الإعادة

الـPOS مضبوط على شركة «بلاك سيركل» (حسابات الاستلام والعميل والمخزن كلها متظبّطة) لكن فيه ورديتين وصفر عملية بيع فعلية — فمافيش صف بيانات غلط أقدر أوريهولك. التشخيص كله تتبّع كود بأدلة (مسار + سطر)، وأربع نتائج منه اتأكّدت من مسارين مستقلّين (السيرفر والواجهة وصلوا لنفس النتيجة كل واحد لوحده)، واتنين اتحسموا بقراءة إعدادات قاعدة بياناتك فعلًا. اللي محتاج إعادة حيّة معلَّم صراحةً في الجدول.

٢ خط التتبّع — من الشاشة للقيد

الشاشة (Angular · signals، مفيش NgRx)
  features/pos/pos-layout.component.ts        ← الحلقة والاختصارات والأوفلاين
    ├─ pos-header (باركود)  ├─ invoice-table (السلة)  ├─ numpad
    └─ payment-dialog  ├─ session-close-dialog  ├─ return-dialog  ├─ coupon-dialog
        │
        ├─ pos-cart.service.ts  → toInvoicePayload()      ← هنا بتتبني الحمولة
        └─ pos.service.ts       → POST /api/pos/sales
                                        │
Modules/POS/app/Http/Requests/StorePOSSaleRequest.php   ← ⚠️ البوابة الصامتة
   validated() بيرمي أي مفتاح مش مذكور في القواعد — من غير أي خطأ
                                        │
Modules/POS/app/Http/Controllers/POSSaleController.php::store()   [DB::transaction]
   ├─ يبني فاتورة مبيعات بحالة Approved (بيختم الاعتماد بنفسه)
   ├─ Modules\Sales\Actions\PostSalesInvoice   ← الإيراد/الضريبة/التكلفة/المخزون
   └─ لكل دفعة: resolveReceivingAccount() ثم SalesPayment::create() + PostSalesPayment
                                        │
                                  قيود اليومية

🔴 أخطر نقطتين في الخط ده

  1. validated() بوابة صامتة. أي حقل الواجهة بتبعته ومش مذكور في قواعد الطلب بيتشال بهدوء — مفيش خطأ، مفيش لوج. الفاتورة بتتعمل بدونه وكأن الكاشير ما دخلوش.
  2. الـPOS بيدخل من تحت طبقة الحماية. شاشة المبيعات العادية بتعدّي على StoreSalesInvoiceRequest وSalesPaymentController — وفيهم حراس موجودين وشغّالين. الـPOS بينادي الـActions والموديل مباشرة ⇒ بيورث المحاسبة، وما بيورثش الحراسة.

٣ السبب الجذري — ٦ عائلات، مش ٣٤ مشكلة

عائلة أ — عدم تطابق أسماء الحقول
٨
عائلة ب — تخطّي طبقة الحراسة
٤
عائلة ج — الدرج مش دفتر
٦
عائلة د — حلقة الاستخدام
٩
عائلة هـ — الاختبارات عمياء
٣
عائلة و — عيوب مفردة
٤

عائلة أ — الواجهة والسيرفر بيتكلّموا بأسماء مختلفة [FIN] P0

ثمن حالات، نفس الآلية: الواجهة بتبعت مفتاح، السيرفر مش عارفه، validated() بيرميه في صمت.

الواجهة بتبعتالسيرفر بيقبلالنتيجةالتأكيد
session_idpos_session_id (required)نافذة الدفع الكاملة ميتة — ٤٢٢ دايمًامسارين ✔✔
tax_rate + tax_amounttax_rate_id فقطالضريبة تتحصّل ولا تتسجّل [FIN]مسارين ✔✔
discount_amount (رأس)— مفيش —الخصم يتشال ⇒ مديونية وهمية [FIN]مسارين ✔✔
variant_idproduct_variant_idاللون/المقاس يتشال من كل بيعة والمخزون يتخصم من الأبمسارين ✔✔
bank_transferin:cash,card,credit,check٤٢٢ والبيعة كلها تفشلمسارين ✔✔
credit_card (إقفال الوردية)cardوردية فيها شبكة مستحيل تتقفل، ومتوقّع الشبكة = صفرمسارين ✔✔
name · qty (تعليق)product_name · quantity · line_totalالتعليق بيفشل — وبلا معالج خطأ فبيفشل في صمتالواجهة ✔
return_qty (مرتجع)quantity + date مطلوبالمرتجع بيفشل في صمت برضهالواجهة ✔

عائلة ب — الـPOS بيتخطّى حراس موجودين وشغّالين [FIN] P0

الحارسموجود فين وشغّالالـPOS
منع الدفع الزائدSalesPaymentController.php:116-120 · :184-189
(٤٢٢ لو الدفع > المستحق)
بينادي SalesPayment::create() مباشرة ⇒ الزيادة بتتسجّل نقدية
أرضية أقل سعر بيعStoreSalesInvoiceRequest.php:102-125
(allow_below_min_price = مقفول عندك)
قاعدة عارية numeric,min:0 ⇒ بيع بأي سعر
دورة الاعتمادsales.approval_workflowبيختم Approved على نفسه
منع السالب في المخزونApproveIssue.php:66-131decreaseStock() مباشرة — بلا أي فحص توفّر

والخبر الحلو: الحراس دول مكتوبة ومختبَرة ومطبَّقة في المبيعات — فالإصلاح نسخ شكل موجود، مش تصميم من الصفر.

عائلة ج — الدرج مش دفتر [FIN] P0

النتيجة المركّبة: أي يوم فيه مرتجع واحد أو زيادة واحدة = فرق خزينة مضمون، وما فيش مكان في النظام بيشرح الفرق.

عائلة هـ — ليه ده كله عاش سنة من غير ما حد يشوفه P1

ده أهم اكتشاف في المراجعة كلها، لأنه بيفسّر كل اللي فوق:

وطرفة مقلقة: ملف اختبار الـPOS هو المكان الوحيد في المشروع كله اللي بينفّذ PostSalesPayment بنجاح — يعني الأكشن اللي بيحرّك النقدية للأستاذ العام له ملف اختبار واحد، وهو الملف اللي مش بيغيّر المبلغ أبدًا.

عائلة و — عيوب مفردة

العيبالأثرالخطورة
الأوردرات المعلّقة بلا فحص شركة — العرض والاسترجاع والحذفأي مستخدم يقرا سلة شركة تانية بالكامل (العميل والأصناف والأسعار). كل شاشات الـPOS التانية بتفحص — دي الوحيدة اللي فاتتP0 أمان
الأوفلاين بلا مفتاح تفرّد — ومهلة بعد نجاح التسجيل بتتعامل كأنها فشلبيعة مكرّرة وخصم مخزون مرتين · وبيعة آخر الوردية مستحيل ترحّل بعد الإقفال ⇒ كاش محبوس · والعنصر الفاشل بيفضل للأبد بلا شاشةP0
الكوبون باطل في يوم بدايته — مقارنة تاريخ بنصالكوبون يشتغل بكرة (مؤكَّد بالتشغيل الفعلي)P2
receipt_number بلا تفرّد — والبحث بياخد الأولإيصالان بنفس الرقم ⇒ الاستعلام يرجّع الغلطP2
ورديتان على جهاز واحد — فحص-ثم-كتابة بلا قفل ولا مفتاح فريدسباق نادر بيفتح ورديتينP3

٤ ليه حصلت — الآلية بالاسم

١) الـPOS اتبنى كـ«اختصار» حوالين شاشة المبيعات

ورث الـActions (الترحيل والمحاسبة) وما ورثش الـFormRequest (الحراسة والتحقّق). كل عيوب عائلة ب سببها القرار المعماري ده. مش انحدار — فجوة أصلية من يوم ما الموديول اتكتب.

٢) validated() بيفشل في صمت — والصمت هو المشكلة

لو Laravel كان بيرمي خطأ على أي مفتاح غير معروف، الثمن حالات في عائلة أ كانت هتظهر في أول يوم. بدل كده، الفاتورة بتتعمل «بنجاح» وناقصة ضريبة أو خصم. ده مش عيب في Laravel — ده غياب اختبار عقد بين الطرفين.

٣) الاختبارات ماشية في ممر فاضي

منتج خدمة + إعدادات غير مزروعة = المسار الحقيقي مش بيتنفّذ. السويت خضرا، والكود اللي بتحميه ما اتنفّذش ولا مرة. وده اللي خلّى «التعديلات الكتيرة» تعدّي: كل تعديل كان بيعدّي على سويت بتقول «تمام» وهي عمياء.

٤) الإعداد اللي اتغيّر تحت رجل الـPOS [FIN]

شركتك مضبوطة على cogs_recognition_point = delivery — ميزة اتعملت لمسار المبيعات (تسليم جزئي). في الوضع ده، ترحيل الفاتورة بيأجّل خصم المخزون والتكلفة لحد اعتماد إذن الصرف — وده صحيح تمامًا لمندوب توصيل وغلط تمامًا لكاونتر الزبون بياخد البضاعة منه فورًا. الـPOS ما اتظبطش أبدًا على الوضع ده. ده انحدار بالإعداد لا بالكود: ما اتغيّرش سطر في الـPOS، اتغيّر العالم حواليه.

٥ كل الأبعاد

البُعدالنتيجة
البياناتمفيش صفوف فاسدة تتصلّح — صفر بيعة POS على بيئتك. لو النظام اشتغل على نسخة عميل، الفواتير المتأثرة هتبان بـis_pos = 1 مع tax_amount = 0 ودفعات أكبر من الإجمالي. ما اتنفّذش أي استعلام على نسخة عميل.
مسار الكودكل نداءات PostSalesInvoice وPostSalesPayment اتفحصت: شاشة المبيعات بتعدّي على الحراس، الـPOS لأ. الـPOS هو المتخطّي الوحيد.
الإعداداتمؤكَّد من قاعدة بياناتك: cogs_recognition_point=delivery · auto_create_stock_issue=1 · auto_approve=0 · allow_below_min_price=0 · sales.cash_account_id غير موجود أصلًا (فالاحتياطي الموثَّق كود ميت). حسابات الـPOS الثلاثة مضبوطة، فمفيش انهيار ٥٠٠ عندك.
الصلاحياتكل شاشات الـPOS متبوّبة صح؛ الاستثناء الوحيد: الأوردرات المعلّقة بلا فحص شركة. وبيع الـPOS متبوّب على sales.invoices.create مش صلاحية POS مستقلة. ومفاتيح F بتتخطّى إخفاء الأزرار ⇒ ٤٠٣ بدل زرار مخفي.
الفلوس [FIN]الضريبة · الخصم · الزيادة · المرتجع · التكلفة · حد أقل سعر · حد الائتمان (غير مطبَّق في المبيعات ولا الـPOS). كل واحد فيهم يقدر يغيّر رقم في الأستاذ العام.
الترجمة والاتجاهنظيفة — ١٩٦ مفتاح في اللغتين، صفر ناقص. الاستثناءات: «عميل نقدي» متحطّة بالإيد · الإيصال وتقرير الإقفال عربي إجباري حتى في الإنجليزي · محاذاة الجدول ثابتة يمين · نسخة وهمية v2.4.0.
الحالات الحدّيةدفع صفر يعمل قيد صفر/صفر · طريقة credit ما بتتطابقش مع أي حاجة عند الإقفال · الكمية العشرية مستحيلة في الـPOS (بيقطع الكسر) رغم إن السيرفر بيقبلها · إدخال ٠ في الكمية بيحذف السطر بلا تأكيد.
الأشقّاء الكامنونالأهم: فحص ملكية المتغيّر (ValidatesLineVariantOwnership) متطبَّق على ~٣٠ FormRequest عبر المبيعات والمشتريات والمخزون — وStorePOSSaleRequest هو المستند الوحيد المتبقّي بالفحص العاري. المسح اللي قفل ده في كل مكان (تذكرتَي المتغيّرات) فات الـPOS. وكذلك: قبول معرّفات من شركة تانية بقواعد exists عارية موجود في المبيعات كمان (فجوة على مستوى الموديولات).

٦ التصميم والتجربة — الشاشة هي المنتج

الحكم: هيكل كويس، وحلقة مكسورة

اللحظات التلاتة اللي بتعرّف أي POS مكسورة: تدفع من الكيبورد · تاخد كاش وترجّع باقي · تمسح للزبون اللي بعده.

أفضل حالة لبيعة كاش بالظبط النهارده: امسح ← دوس في مكان فاضي ← F10 ← Enter ← اقفل نافذة الطباعةدوس على خانة الباركود. تلاتة من الست خطوات دي عيوب صافية.

العيبالتكلفة على الكاشير
مفاتيح F ميتة في وضع الراحة — الحارس بيخرج على أي حقل إدخال، والتصميم مثبّت التركيز على الباركودضغطة زيادة كل بيعة + وعد مكتوب على الزرار «(F10)» مش بيتنفّذ
الباقي بيختفي وقت ما محتاجه — بيتحسب، وبعد التأكيد الرسالة بتقول رقم الفاتورة بسالكاشير بيعدّ الفكّة والشاشة فاضية — أرخص إصلاح وأعلى عائد
مفيش فئات نقدية، والخانة متعبّية بالمبلغ بالظبطالزبون يدّي ٢٠٠ على ١٤٥ ⇒ امسح واكتب
التركيز ما بيرجعش للباركود + الطباعة بتفتح نافذة بتخطف التركيزأول مسحة للزبون الجاي بتضيع
باركود مش معروف = صمتلا صوت ولا رسالة ولا وميض
«إقفال الوردية» جنب «ادفع» بخط ٩ بكسلإجراء مرة في اليوم ملزوق في منطقة الفلوس، وكلهم تحت حد اللمس
الإجمالي في القطر المعاكس لزرار الدفع (٢٨ بكسل أسفل لوحة الفاتورة)نقلة عين طويلة كل بيعة
الشاشة برّه نظام الثيم — ألوان وخط بالإيد، والوضع الليلي كود ميت (كلاس غلط)إعدادات الخط والكثافة والوضع الليلي مالهاش أي أثر في الـPOS
أدوات تطوير ظاهرة للكاشير — زرار «محاكاة عدم الاتصال» ورقم فاتورة عشوائي ونسخة وهميةالرقم المعروض مش رقم الفاتورة الحقيقي وثابت طول الوردية

الشاشة المقترحة (RTL)

┌──────────────────────────────────────────────────────────────────────┐
│ 🛒 كاشير ١  │▮ امسح الباركود…                    🔍│ ●متصل  حازم ⏻ │
└──────────────────────────────────────────────────────────────────────┘
        ↑ الباركود ياخد أعرض مساحة، وحلقة تركيز دايمة   ↑ إقفال الوردية اتنقل هنا
┌──────────────────────────────────┬───────────────────────────────────┐
│ الفاتورة  [عميل: نقدي ▾] [تعليق]│  ┌─────────────────────────────┐  │
│ ─────────────────────────────────│  │        الإجمالي              │  │
│ ١  حليب المراعي   [−] ٢ [+]  ٢٤ │  │      ١٤٥.٥٠ ر.س             │  │ ٤٨-٥٦px
│ ٢  خبز بلدي       [−] ١ [+]   ٥ │  └─────────────────────────────┘  │
│ ▒٣▒ شاي ليبتون ✱  [−] ٣ [+]  ٥٤ │  ┌─────────────────────────────┐  │
│      ✱ آخر سطر بيومض أخضر        │  │    💵 دفع نقدي      (F10)   │  │ ٧٢px
│ ─────────────────────────────────│  └─────────────────────────────┘  │
│ فرعي ١٤٥.٥٠ · خصم ٠ · ضريبة ٠   │  [💳 شبكة F12]  [مختلط F1]       │
└──────────────────────────────────┴───────────────────────────────────┘

أهم قرارين: الإجمالي انتقل جنب زرار الدفع — تقرا الرقم وتضغط تحته، منطقة نظر واحدة تقفل البيعة. و«دفع نقدي» بقى أكبر عنصر في الشاشة لأنه ~٨٠٪ من العمليات — الحجم هو التراتب.

خطوة الدفع المقترحة

┌───────────── دفع نقدي ──────────── ✕ ┐
│        الإجمالي   ١٤٥.٥٠ ر.س         │
│   المدفوع من العميل                   │
│  ┌─────────────────────────────────┐  │ ٥٦px · بيتحدّد كله عند التركيز
│  │            ٢٠٠.٠٠               │  │   فالكتابة بتستبدل
│  └─────────────────────────────────┘  │
│  [المبلغ بالضبط][٥٠][١٠٠][٢٠٠][٥٠٠] │ ٦٤px فئات
│  ▓▓▓  الباقي   ٥٤.٥٠ ر.س  ▓▓▓       │ ظاهر دايمًا — أحمر لو ناقص
│  ┌─────────────────────────────────┐  │
│  │     ✓ تأكيد وطباعة  (Enter)     │  │ ٦٤px
│  └─────────────────────────────────┘  │
└───────────────────────────────────────┘
        ↓ بعد التأكيد تتحوّل لـ ↓
┌───────────────────────────────────────┐
│      ✓ تم البيع  #INV-000123          │
│          الباقي للعميل                │
│           ٥٤.٥٠ ر.س                   │ ٧٢px — يتقري من برّه الكاونتر
│   (يقفل تلقائيًا عند أول مسحة جديدة)  │
└───────────────────────────────────────┘

واللي كويس فعلًا — ما نلمسوش

٧ الحلول المقترحة

(أ) ترقيع موضعي

نصلّح الثمن أسماء حقول والحراس، ونسيب المعمار زي ما هو.

+ أسرع حاجة توقف النزيف.
ما بتمنعش الحالة التاسعة — أول حقل جديد يتضاف هيتشال في صمت زي إخوانه.

(ب) ترقيع + اختبار عقد + تشديد البوابة ⭐ التوصية

نفس إصلاحات (أ)، وزيادة عليها: اختبار واحد بيقارن الحمولة اللي الواجهة بتبنيها بقواعد السيرفر ويفشل على أي مفتاح مرفوض، والطلب يرفض المفاتيح المجهولة صراحةً بدل ما يرميها.

+ بيقفل العائلة مش الحالات. تكلفته الزيادة يوم واحد.
محتاج قرار: نرفض المفتاح المجهول ولا نسجّله ونكمّل.

(ج) إعادة بناء الـPOS فوق مسار المبيعات الكامل

الـPOS ينادي نفس الـFormRequest بتاع المبيعات ⇒ يورث كل الحراس تلقائيًا وللأبد. + الأنضف معماريًا. أسابيع، وبيمسّ مسار مالي شغّال — مش دلوقتي؛ بس (ب) بيخلّيه ممكن بعدين.

٨ خطة الإصلاح

WPالنطاقالطبقةيثبته اختباروسم
WP0اختبار تثبيت أولًا: منتج متتبَّع للمخزون + زرع الإعدادات في اختبارات الـPOS ⇒ يفضح إن مسار المخزون/التكلفة ما كانش بيتنفّذ، ويمنع الرجوعBE testsفشل-ثم-نجاحP0
WP1الثمن أسماء حقول: رقم الوردية · الضريبة (معرّف شريحة) · خصم الرأس · المتغيّر · التحويل البنكي · تسمية الشبكة عند الإقفال · التعليق · المرتجعBE + FEاختبار عقد لكل حمولةP0 [FIN]
WP2الحراس المتخطَّاة: منع الدفع الزائد (نسخ شكل المبيعات) · أرضية أقل سعر · فحص ملكية المتغيّر · فحص الشركة على المعرّفاتBEلكل حارسP0 [FIN]
WP3ثغرة الأوردرات المعلّقة: فحص شركة على العرض/الاسترجاع/الحذفBEعزل شركاتP0 أمان
WP4الـPOS في وضع التسليم: بيعة الكاونتر تخصم المخزون وتسجّل التكلفة فورًا بغضّ النظر عن cogs_recognition_point (بإعداد صريح للـPOS)BEالوضعينP0 [FIN]
WP5حلقة الكاشير (اليوم الواحد): مفاتيح F تعدّي الحارس · التركيز يرجع للباركود + طباعة بإطار داخلي · لوحة الباقي بعد البيع + صوت ونتيجة المسح · فئات نقدية + عرض الباقي/النقص دايمًاFEبناء + تجربةP1
WP6مسار مرتجع POS حقيقي: نقطة نهاية + ربط بالوردية (عمود جديد) + خصم من متوقّع الكاش + ظهور في التقاريرBE + FE · مايجريشنالوردية والتقاريرP1 [FIN]
WP7إقفال الوردية: يستخدم ملخّص السيرفر الجاهز · إدخال الفعلي فاضي (جرد أعمى) · يسمح بإقفال بلا سطر كاشFE + BEإقفال بشبكةP1 [FIN]
WP8أمان الأوفلاين: مفتاح تفرّد يوصل السيرفر · المهلة تتعامل كـ«غير مؤكَّد» لا «فشل» · شاشة لإدارة الطابور الفاشلBE + FEإعادة إرسال مكرّرةP1 [FIN]
WP9حوكمة السعر في الواجهة: قراءة allow_price_override وallow_discount وrequire_customer وأرضية أقل سعرFEP1
WP10التصميم الهيكلي: الإجمالي جنب الدفع · إعادة تصميم نافذة الدفع · دمج الثيم والوضع الليلي · إصلاح لوحة الأرقام · حالات مصمَّمة (أوفلاين/صلاحية/تحميل)FEP2
WP11النظافة: شيل أدوات التطوير ورقم الفاتورة الوهمي · الإيصال (تاريخ، طريقة دفع مترجمة، ثنائي اللغة، رقم ضريبي و QR) · تاريخ الكوبون · تفرّد رقم الإيصال · قفل الورديتينBE + FEالكوبون والتفرّدP3

الترتيب المقترح

WP0 قبل أي حاجة — من غيره كل إصلاح بعده بيتراجع على سويت عمياء. بعدها WP1→WP4 (يوقفوا تسريب الفلوس والثغرة الأمنية)، وبعدها WP5 لوحده لأنه اليوم الواحد اللي هتحسّ بيه أكتر حاجة على الكاونتر، وبعدين الباقي بالترتيب.

٩ قرارات محتاجة منك

١. الضريبة في الـPOS
٢. الدفع الزائد (الباقي)
٣. الـPOS في وضع «التكلفة عند التسليم»
٤. عجز/زيادة الخزينة عند الإقفال
٥. المفاتيح المجهولة في الحمولة

خلاصة

الـPOS مش محتاج إعادة بناء. محاسبته ذرّية، وحساب سطوره مطابق للسيرفر، وترجمته كاملة، وفكرته سليمة. اللي مكسور الوصلات: ثمن حقل بتتشال في صمت، وأربع حراس بيتخطّاهم، ودرج مش مربوط بدفتر، وحلقة استخدام فيها تلات ضغطات ضايعة. وأخطر من ده كله إن الاختبارات كانت بتحرس ممر فاضي — وعشان كده WP0 قبل أي إصلاح: لازم الاختبار يشوف المسار الحقيقي الأول، وبعدين نصلّح.