ISS-2026-9357 · تحليل ثالث — تصميم البروسيس

مواد العملاء: مصدران لنفس الصنف

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

التغيير: الملكية صفة الاستلام لا الصنف مالي: [FIN] حالة: تحليل — لا كود بعد ٢٩ يوليو ٢٠٢٦ · moonui2

١ اللي فهمته من كلامك

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

الحكم في سطر واحد

البروسيس سليمة وقابلة للتنفيذ بأقل تعديل ممكن — بند ٤ بالتحديد مالوش أي أثر محاسبي في نظامك الحالي أصلًا (مؤكَّد بالكود). لكن بند ٣ + بند ٤ مع بعض بيخلقوا مشكلة واحدة حقيقية في تكلفة الصنف — وهي نفس المشكلة اللي قلت قبل كده إنها مستحيلة، ورجعت بسبب المعلومة الجديدة دي. تحت الحل، ومقاسه صغير.

٢ ⚠️ وده بيلغي توصيتي السابقة — أقولها بصراحة

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

الملكية صفة الاستلام، لا صفة الصنف. علامة على الصنف كانت هتكذب في نص الحالات: لو علّمناه «أمانة» هتصفّر تكلفة الخامة اللي إنت دفعت فيها فلوس؛ ولو ما علّمناهوش، مواد العميل هتتقيَّم عليك. العلامة مكانها الصح على المستند اللي بيدخّل الكمية.

٣ 🔴 الخطر الحقيقي: متوسط التكلفة بيتلوّث

في نظامك، التكلفة المتوسطة محفوظة على صف واحد لكل (صنف + متغيّر + مخزن)، وبتُحسب هكذا حرفيًا:

average_cost = total_value / quantity // StockService::increaseStock unique(product_id, product_variant_id, warehouse_id) // inventory_stock_balances

مفيش «مالك» في الصف ده. فلو نفس الصنف دخل مرة بشراء ومرة أمانة بصفر، الاتنين بيندمجوا في متوسط واحد:

الحركةالكميةسعر الوحدةالقيمةالرصيد بعدهاالمتوسط بعدها
شراء (إنت دفعت)١٠٠ كجم٥٠٥٠٠٠١٠٠50.000
أمانة من العميل١٠٠ كجم٠٠٢٠٠25.000 ← تلوّث
صرف ١٠٠ كجم على أمر إنتاج−١٠٠25.000٢٥٠٠١٠٠25.000

والنتيجة غلط في الاتجاهين في نفس الوقت

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

وليه قلت قبل كده إنه «مستحيل»؟

لأني كنت فاهم إن مادة العميل مصدرها واحد (منه هو)، فما بتشاركش صنفًا مع بضاعتك. لحظة ما قلت «ساعات أشتري الخامة للعميل على نفس الصنف»، المسارين بقوا على صنف واحد ⇒ التلوّث رجع. المعلومة بتاعتك هي اللي كشفته، وقبل أي كود.

٤ ✅ خبر جيد مؤكَّد بالكود: إيصال الأمانة مالوش أثر محاسبي

خوفك المنطقي إن «إيصال استلام بصفر» يعمل قيدًا غريبًا. فحصت المسار:

⇒ بند ٤ بتاعك مضمون محاسبيًا من غير أي كود. المشكلة الوحيدة الباقية هي المتوسط (القسم ٣) — لأن الكمية بتدخل بصفر فبتسحب المتوسط، مش لأنها بتعمل قيد.

٥ البروسيس المقترحة — خطوة بخطوة

١

تعريف المادة مرة واحدة لكل عميل

صنف باسم المادة + عميل التصنيع (اختياري) + كود مبني على العميل (ORG-00001) + الوحدة + التصنيف. مرة واحدة — وكل المسارات بعدها بتستخدم نفس الصنف، زي ما طلبت.

٢أ

المسار الأول: إنت تشتري للعميل

أمر شراء ← فاتورة شراء ← إيصال استلام (مرجعه فاتورة الشراء).

  • التكلفة حقيقية · القيد يتعمل · الملكية ليك.
  • يدخل مخزنك العادي.
  • مفيش أي تغيير — ده النظام القائم زي ما هو.
PO → Bill → Receipt(ref=purchase_bill) → cost ✔ GL ✔ owner = you
٢ب

المسار الثاني: العميل يبعتها أمانة

إيصال استلام مباشر، مرجعه العميل، بقيمة ٠.

  • التكلفة ٠ · بلا أي قيد · الملكية للعميل.
  • يدخل مخزن أمانة العملاء ← ودي النقطة الحاسمة (القسم ٦).
  • نوع مرجع جديد: «أمانة عميل» + خانة العميل.
Receipt(ref=customer_consignment, value=0) → cost 0 GL none owner = customer
٣

التركيبة (BOM) من مواد العميل

منتج العميل ⇒ قائمة المكوّنات تبدأ مفلترة على مواد نفس العميل + موادك اللي بلا عميل. الفلترة على الصنف مش على المخزن — فالصنف الواحد بيبان مرة واحدة سواء رصيده مشترى أو أمانة.

٤

الصرف على أمر الإنتاج — من أنهي رصيد؟

هنا القرار التشغيلي الوحيد اللي بيحتاج انتباه: نفس الصنف عنده رصيدان (مخزنك + مخزن الأمانة).

ودي أهم فايدة في التصميم: السؤال «الخامة دي كانت بتاعته ولا بتاعتي؟» بقى ليه إجابة من مستند، لا من ذاكرة حد.

٥

التسوية والتقارير

٦ الفصل بين الرصيدين — ٣ طرق، وواحدة منهم بصفر كود

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

⭐ التوصية: مخزن أمانة للعملاء

الفصل مش محتاج فيتشر جديد — هو موجود في السكيما: صف الرصيد فريد على (صنف + متغيّر + مخزن)، والمتوسط بيتحسب على الصف ده. فمخزن منفصل معناه متوسط تكلفة منفصل تمامًا بلا سطر كود واحد في حسابات التكلفة.

المخزنالصنفالرصيدالمتوسطالقيمة
مخزنكORG-00001١٠٠50.000٥٠٠٠ — في الميزانية
أمانة العملاءORG-00001١٠٠0.000٠ — مستبعدة

نفس الصنف · رصيدان · متوسطان صحيحان · وصرف كل واحد بتكلفته الحقيقية. والسؤال الوحيد اللي بيبقى: «أصرف من أنهي مخزن؟» — وده سؤال أمين مخزن عادي، مش مسألة محاسبية خفية.

وسؤال هيتسأل: مخزن واحد لكل العملاء ولا مخزن لكل عميل؟

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

٧ ما لا يجب أن يحدث — حدود لازم تتقفل

الحالةالخطرالقفل
سعر شراء مكتوب على مادة أمانة أخطرهم. سلسلة الرجوع لتكلفة الوحدة آخر حلقة فيها سعر الشراء المسجَّل على الصنف — فأي صفر «فاضي» بيتحوّل لسعر في صمت. أي حركة على مخزن الأمانة تُجبَر على تكلفة ٠ عند الحد نفسه، ولا تعتمد على سلسلة الرجوع.
تحويل بين مخزنك ومخزن الأمانة نقل ملكية بلا مستند: كمية تخرج من عندك وتدخل ملك العميل (أو العكس) بلا أثر بيع أو استلام. يُمنع — ولو محتاج، يبقى مستند بيع/استلام صريح.
بيع مادة أمانة تبيع حاجة مش ملكك بتكلفة ٠ ⇒ ربح ١٠٠٪ وهمي في التقارير. منع البيع من مخزن الأمانة (أو تحذير قوي).
جرد يزوّد كمية في مخزن الأمانة تسوية جرد بتكلفة تقديرية بتحطّ قيمة في مخزن المفروض قيمته ٠. تسويات مخزن الأمانة بتكلفة ٠ إلزامًا.
تقييم المخزون بيجمع الاتنين ميزانيتك تزيد ببضاعة مش ملكك. استبعاد مخازن is_consignment من القيمة، مع إظهار سطرها بالكمية. [FIN]

٨ معاينة الواجهة المتوقّعة

إيصال استلام أمانة من عميل

إيصال استلام جديد
نوع المرجعأمانة عميل ▾ جديد — جنب «شراء» و«مرتجع» و«افتتاحي»
العميل *ORGANIX ▾
المخزنأمانة العملاء ▾ افتراضي تلقائي لنوع المرجع ده
#الصنفالكميةالوحدةالتكلفةالتشغيلةالصلاحية
١ORG-00001 — Co-Enzyme Q10100كجم 0.000 مقفولB-22912027-04
قائمة الأصناف مفلترة على مواد ORGANIX · التكلفة مقفولة على ٠ · مفيش قيد يومية · و«التشغيلة والصلاحية» مطلوبين زي أي خامة دوائية.

إذن صرف على أمر إنتاج لعميل

إذن صرف — أمر إنتاج PRD-00041 (ORGANIX)
المخزنأمانة العملاء ▾ افتراضي لأن الأمر لعميل — قابل للتغيير
الصنفالمطلوبمتاح — أمانةمتاح — مخزنكالمنصرفالتكلفة
Co-Enzyme Q10120100601000.000
Co-Enzyme Q10 (نقص ٢٠)0602050.000 ← عليك
خامة العميل خلصت عند ١٠٠، فالـ٢٠ الباقية اتصرفت من بضاعتك — والتكلفة بانت عليك فورًا بدل ما تختفي في متوسط مخلوط.

تقييم المخزون

تقييم المخزون — يوليو ٢٠٢٦
المخزنالكميةالقيمةفي الميزانية؟
المخزن الرئيسي1,240,000842,300.000
أمانة العملاء612,0000.000✘ مستبعد
الإجمالي المحاسبي842,300.000

٩ خطة التنفيذ

WPالنطاقالطبقةمالي
WP1كود العميل على سجل الشريك + عميل التصنيع (اختياري) على المنتج + توليد الكود بسابقة العميلBE (سكيما)
WP2نوع مرجع «أمانة عميل» على إيصال الاستلام + خانة العميل + تكلفة ٠ مفروضة عند الحد + افتراضي مخزن الأمانةBE[FIN]
WP3حدود الأمان: منع التحويل بين المخزنين · منع البيع من الأمانة · تسويات الجرد بتكلفة ٠BE[FIN]
WP4تقييم المخزون: استبعاد مخازن is_consignment من القيمة مع إظهار سطرها بالكميةBE + FE[FIN]
WP5الاستيراد: عمود «عميل التل» يُربط بعميل حقيقي + الكود يتولّد بسابقتهBE
WP6واجهة الأصناف: حقل العميل + العمود + الفلتر + معاينة الكودFE
WP7التركيبة: فلترة المكوّنات على عميل المنتج + تنبيه المكوّن الغريبBE + FE
WP8إذن الصرف: افتراضي مخزن الأمانة لأمر عميل + عرض «متاح أمانة / متاح مخزنك»BE + FE
WP9تقرير «أرصدة العملاء»: استلمت / صرفت / الباقي لكل عميلBE + FE

الترتيب اللي يخلّيك ترفع الملف بأسرع وقت

WP1 + WP5 ⇒ ترفع الـ٤٧٨ مادة بأكواد مبنية على العميل ومربوطة بسجل العميل. بعدها WP2 يفتح مسار الأمانة بأمان، وWP4 يحمي الميزانية. والباقي (٦–٩) تحسينات تشغيلية بتزيد الراحة مش بتفتح مخاطر. وقبل WP2 خلّي مواد الأمانة على مخزن منفصل من يومها الأول — ده الشيء الوحيد اللي لو اتأخّر، بيلوّث تكلفة يصعب تصحيحها بأثر رجعي.

١٠ قرارات مطلوبة

١. الفصل بين رصيد الأمانة ورصيدك
٢. مخزن الأمانة: واحد ولا لكل عميل؟
٣. لو خامة العميل خلصت وسط أمر الإنتاج
٤. الخامة اللي تشتريها للعميل — تتحاسب عليه؟

الخلاصة

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