الصنف واحد ومسجَّل باسم العميل — لكن الخامة توصل بطريقتين: إنت تشتريها للعميل، أو العميل يبعتها أمانة بقيمة صفر. هذا المستند يصمّم البروسيس بحيث الاتنين يشتغلوا بلا ما يكسروا النظام القائم — ويكشف الحاجة الواحدة اللي هتفسد الأرقام لو مشينا بلا تصميم.
البروسيس سليمة وقابلة للتنفيذ بأقل تعديل ممكن — بند ٤ بالتحديد مالوش أي أثر محاسبي في نظامك الحالي أصلًا (مؤكَّد بالكود). لكن بند ٣ + بند ٤ مع بعض بيخلقوا مشكلة واحدة حقيقية في تكلفة الصنف — وهي نفس المشكلة اللي قلت قبل كده إنها مستحيلة، ورجعت بسبب المعلومة الجديدة دي. تحت الحل، ومقاسه صغير.
في تحليل امبارح رشّحت «علامة أمانة على الصنف». بمعلومة إنك ساعات تشتري الخامة بنفسك، التوصية دي بقت غلط: نفس الصنف هيوصل مرة مشترى بتكلفة حقيقية ومرة أمانة بصفر.
⇒ الملكية صفة الاستلام، لا صفة الصنف. علامة على الصنف كانت هتكذب في نص الحالات: لو علّمناه «أمانة» هتصفّر تكلفة الخامة اللي إنت دفعت فيها فلوس؛ ولو ما علّمناهوش، مواد العميل هتتقيَّم عليك. العلامة مكانها الصح على المستند اللي بيدخّل الكمية.
في نظامك، التكلفة المتوسطة محفوظة على صف واحد لكل (صنف + متغيّر + مخزن)، وبتُحسب هكذا حرفيًا:
مفيش «مالك» في الصف ده. فلو نفس الصنف دخل مرة بشراء ومرة أمانة بصفر، الاتنين بيندمجوا في متوسط واحد:
| الحركة | الكمية | سعر الوحدة | القيمة | الرصيد بعدها | المتوسط بعدها |
|---|---|---|---|---|---|
| شراء (إنت دفعت) | ١٠٠ كجم | ٥٠ | ٥٠٠٠ | ١٠٠ | 50.000 |
| أمانة من العميل | ١٠٠ كجم | ٠ | ٠ | ٢٠٠ | 25.000 ← تلوّث |
| صرف ١٠٠ كجم على أمر إنتاج | −١٠٠ | 25.000 | ٢٥٠٠ | ١٠٠ | 25.000 |
ومفيش رسالة خطأ ولا شاشة حمرا. الرقم يبان معقولًا — وده أخطر أنواع الغلط، وهو نفس النوع اللي التذاكر الأربعة اللي فاتت كانت بتصطاده.
لأني كنت فاهم إن مادة العميل مصدرها واحد (منه هو)، فما بتشاركش صنفًا مع بضاعتك. لحظة ما قلت «ساعات أشتري الخامة للعميل على نفس الصنف»، المسارين بقوا على صنف واحد ⇒ التلوّث رجع. المعلومة بتاعتك هي اللي كشفته، وقبل أي كود.
خوفك المنطقي إن «إيصال استلام بصفر» يعمل قيدًا غريبًا. فحصت المسار:
total_value += 0 ⇒ قيمة المخزون ما بتزيدش.⇒ بند ٤ بتاعك مضمون محاسبيًا من غير أي كود. المشكلة الوحيدة الباقية هي المتوسط (القسم ٣) — لأن الكمية بتدخل بصفر فبتسحب المتوسط، مش لأنها بتعمل قيد.
صنف باسم المادة + عميل التصنيع (اختياري) + كود مبني على العميل (ORG-00001) + الوحدة + التصنيف.
مرة واحدة — وكل المسارات بعدها بتستخدم نفس الصنف، زي ما طلبت.
أمر شراء ← فاتورة شراء ← إيصال استلام (مرجعه فاتورة الشراء).
إيصال استلام مباشر، مرجعه العميل، بقيمة ٠.
منتج العميل ⇒ قائمة المكوّنات تبدأ مفلترة على مواد نفس العميل + موادك اللي بلا عميل. الفلترة على الصنف مش على المخزن — فالصنف الواحد بيبان مرة واحدة سواء رصيده مشترى أو أمانة.
هنا القرار التشغيلي الوحيد اللي بيحتاج انتباه: نفس الصنف عنده رصيدان (مخزنك + مخزن الأمانة).
ودي أهم فايدة في التصميم: السؤال «الخامة دي كانت بتاعته ولا بتاعتي؟» بقى ليه إجابة من مستند، لا من ذاكرة حد.
| الطريقة | إزاي | التكلفة | الحكم |
|---|---|---|---|
| (أ) مخزن أمانة للعملاء ⭐ | مخزن واحد اسمه «أمانة العملاء» وعليه علامة is_consignment الموجودة أصلًا. مواد الأمانة تدخله، وبضاعتك تدخل مخزنك. |
صفر تعديل في حساب التكلفة | مفتاح الأرصدة بيشمل المخزن أصلًا ⇒ الفصل يحصل لوحده. والعلامة دي النظام بيقراها فعلًا في تقارير الأرصدة واللوطات. |
| (ب) صنفان لكل مادة | صنف «مشترى» وصنف «أمانة» لكل مادة عميل. | صفر كود كمان | بيخالف كلامك («الشراء على نفس الصنف»)، وبيضاعف الأصناف، والتركيبة تبقى محتاجة الاتنين. |
| (ج) بُعد المالك على الأرصدة | إضافة owner_partner_id لجدول الأرصدة الرئيسي ومتوسط تكلفة لكل مالك. |
الأغلى | الأصح هندسيًا، لكنه بيمسّ مفتاح الجدول الأساسي وكل قارئ ليه (أرصدة · تقييم · كارت صنف · تقارير). مخالف لطلبك «ما تكسرش النظام القائم». |
الفصل مش محتاج فيتشر جديد — هو موجود في السكيما: صف الرصيد فريد على (صنف + متغيّر + مخزن)، والمتوسط بيتحسب على الصف ده. فمخزن منفصل معناه متوسط تكلفة منفصل تمامًا بلا سطر كود واحد في حسابات التكلفة.
| المخزن | الصنف | الرصيد | المتوسط | القيمة |
|---|---|---|---|---|
| مخزنك | ORG-00001 | ١٠٠ | 50.000 | ٥٠٠٠ — في الميزانية |
| أمانة العملاء | ORG-00001 | ١٠٠ | 0.000 | ٠ — مستبعدة |
نفس الصنف · رصيدان · متوسطان صحيحان · وصرف كل واحد بتكلفته الحقيقية. والسؤال الوحيد اللي بيبقى: «أصرف من أنهي مخزن؟» — وده سؤال أمين مخزن عادي، مش مسألة محاسبية خفية.
مخزن واحد يكفي — لأن الصنف نفسه بيقول تبع مين (كوده وحقل العميل عليه). مخزن لكل عميل = ١١١ مخزن وصلاحيات وجرد لكل واحد، بلا أي معلومة إضافية. لو التفتيش بيطلب فصلًا ماديًا لعميل معيّن، نعمل مخزنه هو بس.
| الحالة | الخطر | القفل |
|---|---|---|
| سعر شراء مكتوب على مادة أمانة | أخطرهم. سلسلة الرجوع لتكلفة الوحدة آخر حلقة فيها سعر الشراء المسجَّل على الصنف — فأي صفر «فاضي» بيتحوّل لسعر في صمت. | أي حركة على مخزن الأمانة تُجبَر على تكلفة ٠ عند الحد نفسه، ولا تعتمد على سلسلة الرجوع. |
| تحويل بين مخزنك ومخزن الأمانة | نقل ملكية بلا مستند: كمية تخرج من عندك وتدخل ملك العميل (أو العكس) بلا أثر بيع أو استلام. | يُمنع — ولو محتاج، يبقى مستند بيع/استلام صريح. |
| بيع مادة أمانة | تبيع حاجة مش ملكك بتكلفة ٠ ⇒ ربح ١٠٠٪ وهمي في التقارير. | منع البيع من مخزن الأمانة (أو تحذير قوي). |
| جرد يزوّد كمية في مخزن الأمانة | تسوية جرد بتكلفة تقديرية بتحطّ قيمة في مخزن المفروض قيمته ٠. | تسويات مخزن الأمانة بتكلفة ٠ إلزامًا. |
| تقييم المخزون بيجمع الاتنين | ميزانيتك تزيد ببضاعة مش ملكك. | استبعاد مخازن is_consignment من القيمة، مع إظهار سطرها بالكمية. [FIN] |
| # | الصنف | الكمية | الوحدة | التكلفة | التشغيلة | الصلاحية |
|---|---|---|---|---|---|---|
| ١ | ORG-00001 — Co-Enzyme Q10 | 100 | كجم | 0.000 مقفول | B-2291 | 2027-04 |
| الصنف | المطلوب | متاح — أمانة | متاح — مخزنك | المنصرف | التكلفة |
|---|---|---|---|---|---|
| Co-Enzyme Q10 | 120 | 100 | 60 | 100 | 0.000 |
| Co-Enzyme Q10 (نقص ٢٠) | — | 0 | 60 | 20 | 50.000 ← عليك |
| المخزن | الكمية | القيمة | في الميزانية؟ |
|---|---|---|---|
| المخزن الرئيسي | 1,240,000 | 842,300.000 | ✔ |
| أمانة العملاء | 612,000 | 0.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 خلّي مواد الأمانة على مخزن منفصل من يومها الأول — ده الشيء الوحيد اللي لو اتأخّر، بيلوّث تكلفة يصعب تصحيحها بأثر رجعي.
بروسيسك سليمة، ونظامك أقرب لها مما تتوقّع: إيصال بقيمة ٠ مالوش أثر محاسبي أصلًا، وعلامة مخزن الأمانة موجودة والتقارير بتقراها. الحاجة الوحيدة اللي كانت هتكسر الأرقام — خلط متوسط التكلفة — بتتقفل بمخزن منفصل، بلا سطر كود واحد في حسابات التكلفة. واللي بيحتاج شغل هو الحدود: تكلفة ٠ مفروضة، منع التحويل، واستبعاد الأمانة من التقييم. ودي حدود، مش إعادة بناء.