ISS-2026-9357 · تحليل ثانٍ (بعد إعادة تفكير المالك)

مواد عملاء التصنيع: الكود، الملكية، والتركيبة

المادة الخام تُسجَّل مرة لكل عميل — والكود يُبنى على العميل، والعميل يبقى حقلًا على المنتج، والتركيبة (BOM) تتكوّن من مواد نفس العميل، ومواد العميل لا تُحسب في مخزون الشركة. هذا المستند يقيس الأربعة على الكود الفعلي وعلى ملف «المواد الخام» نفسه.

الملف: ٤٧٨ سطر · ١١١ عميل الحالة: تحليل — لا كود بعد مالي: [FIN] التاريخ: ٢٩ يوليو ٢٠٢٦ البيئة: moonui2 · hazemdev2

١ القرار الجديد — بصياغتي، صحّحني لو فهمت غلط

  1. مادة لكل عميل — التكرار مقصود. لو عندك كالسيوم لعميلين (أورجانكس و GT4)، يبقى صنفين. وده يلغي توصيتي السابقة بالدمج — مأخوذ ومسجَّل.
  2. الكود يُبنى على العميل — يعني كود الصنف نفسه يقول تبع مين.
  3. العميل حقل على المنتج (اختياري) عشان نعرف الصنف بتاع مين.
  4. التركيبة تتكوّن من مواد نفس العميل — لما تعمل BOM لمنتج عميل، مكوّناته من مواده هو.
  5. مواد العميل أمانة ⇒ لا تُحسب في مخزون الشركة — قيمتها ليست قيمتك.
  6. ويكون منفصلًا عن نظام الأمانة الموجود أصلًا.
  7. واقتراحك: «القيمة تبقى صفر في الشراء علشان ما يتقيّمش — وده حل بردو، وممكن يتعمل مانوال.»

الحكم المختصر

البنود ١ و٢ و٣ و٤ قابلة للتنفيذ ونظيفة — والملف نفسه يدعمها. البند ٥ فيه مفاجأة لازم تعرفها: مواد العميل محسوبة في مخزونك اليوم فعلًا — جدول الأرصدة الرئيسي ما فيه عمود مالك من أصله. واقتراحك بـ«القيمة صفر» يعمل فعلًا — وبيعمل تحديدًا لأنك اخترت مادة لكل عميل — بس فيه فخ واحد لازم يتقفل وإلا النظام يستبدل الصفر برقم من نفسه في صمت.

٢ الملف مرة تانية — الأرقام اللي تحكم التصميم

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

سطور
٤٧٨
عملاء (عمود تصنيف المخزن)
١١١
عملاء لاحقتهم في الاسم غير ثابتة
١٨
سطور بلا أي لاحقة عميل
٣٤

أ) لاحقة الاسم غير صالحة كمصدر للكود

الأسماء بتنتهي بلاحقة العميل (- 2H / -ACT / -Mila Cure)، لكن:

العميلاللواحق المستخدمة فعلًا في ملفك
ORGANIXORG ×42 · Organix ×6 · org ×6 · organix ×1 · Organx ×1 · Cysteine ×1
Medical ShinaMedical shina ×5 · Medical Shine ×2 · Medical Shina ×1 · MES ×1
Familafamila ×9 · FAM ×1
PraxoPraxo ×8 · PRA ×4
Pro care PharmaPROCARE ×3 · PROCAER ×1
AliganzaAliganza ×4 · aliganza ×1 · ALI ×1

و١٨ عميلًا على هذا النمط. لاحظ سطر ORGANIX الأخير: لاحقته Cysteine — وهي اسم مادة، لا اسم عميل.
الخبر الجيد: ما فيه لاحقة واحدة مشتركة بين عميلين (صفر تضارب) — فاللاحقة، حيث توجد، غير غامضة. لكن ٣٤ سطرًا بلا لاحقة، و١٨ عميلًا بأكثر من هجاء ⇒ الاسم يوصف ولا يُعتمد عليه.

ب) ولا الكود ينفع يُشتق تلقائيًا من اسم العميل

جرّبت أشتق كودًا من ٣ حروف لكل عميل من العمود الإنجليزي:

كود العميل لازم يتحدَّد قصدًا، مرة واحدة، لـ١١١ عميل. ودي مهمة بيانات لمرة واحدة: نجهّزها لك مقترحة، وأنت تراجع وتعدّل — أرخص بكثير من كود يخمّن ويطلع MEP لتلات عملاء.

٣ الوضع الحالي في الكود — بالأدلة

السؤالالموجود اليومالمكان
فيه ربط بين المنتج والعميل؟ ولا واحد. أعمدة products فيها brand_id وmanufacturer_id وproduct_category_id — ومفيش أي partner_id. Modules/Core/…/create_products_table
الكود بيتولّد إزاي؟ SequenceService::generateNext(company,'core','product') بسابقة PRD و٥ خانات. والتسلسلات فريدة على (شركة، موديول، كيان) ومعاها per_branchومفيش أي بُعد للعميل. ProductService::generateCode · sequences
الأرصدة فيها مالك؟ لأ. inventory_stock_balances = (منتج، متغيّر، مخزن) + quantity + average_cost + total_value. مفيش عمود مالك — ودي الجدول اللي التقييم والأرصدة بيقروا منه. create_inventory_stock_balances_table
أمّال بُعد المالك موجود فين؟ في inventory_lot_balances بس (owner_partner_id، و0 = الشركة). وبيتكتب فقط لما المنادي يبعت allocate_lots — وده بيحصل للأصناف المتتبَّعة بتشغيلات فقط. StockService:245 · InventoryLotBalance:21
وفلتر المالك في التقارير؟ موجود في تقرير اللوطات — واختياري: بلا فلتر بيعرض الكل مع بعض. InventoryReportController:1270
نظام الأمانة القائم إيه؟ عقود تصنيع لدى الغير mfg_toll_contracts + دفتر مواد أمانة consignment_material_ledgers مفهرس بـ(عميل + صنف + مخزن) بأرصدة مستلَم/منصرف/مستلَف/مسوّى + declared_unit_cost، وis_consignment على المخزن. Modules/Production · Modules/Inventory
التركيبة فيها عميل؟ لأ. bom_components فيها supply_source — ومفيش فلتر عميل على اختيار المكوّن. BomComponent · bom_v2_master_data

🔴 النتيجة اللي لازم تعرفها قبل أي قرار

لما تستلم مادة عميل النهارده، بتتحسب في كمية مخزونك وقيمته زي أي مادة بتاعتك — لأن جدول الأرصدة الرئيسي ما فيه فكرة «مالك» أصلًا. البُعد الموجود (owner_partner_id) يقعد في جدول التشغيلات، بيتكتب للأصناف المتتبَّعة بتشغيلات فقط، وفلتره في التقرير اختياري.

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

٤ تصميم الكود — ثلاث طرق ومقترح

الهدف: كود يقول تبع مين ويفضل فريد داخل الشركة (قيد قاعدة البيانات: unique(company_id, code)).

الطريقةالشكلالمزاياالعيوب
(أ) سابقة العميل + عدّاد للعميل مقترح ORG-00001
ORG-00002
GT4-00001
الترقيم يبدأ من ١ لكل عميل، فالكود يقرأ «تاسع مادة لأورجانكس». أوضح كود ممكن للمخزن. محتاج عدّادًا لكل عميل — التسلسلات اليوم فريدة على (شركة، موديول، كيان) فبنستخدم الكيان product:ORG. تمديد نظيف بلا تغيير سكيما.
(ب) سابقة العميل + العدّاد العام ORG-00007
GT4-00008
أقل شغل — عدّاد واحد كما هو، والسابقة بتتحقن. الأرقام «بتنقّط»: أول مادة لعميل جديد ممكن تبقى ZEN-00413، وده بيبان غلطًا لأمين المخزن.
(ج) سابقة العميل + رمز المادة ORG-CALC
GT4-CALC
أقوى قراءة: نفس المادة عند عميلين تبان فورًا بنفس المقطع. يتطلّب قاموس رموز للمواد — ٤٠٧ مادة، والملف ما فيهوش. مشروع بيانات مستقل. يتأجّل، والطريقة (أ) لا تمنعه لاحقًا.

الشكل النهائي المقترح — على بيانات ملفك الحقيقية

العميلسطورهكود العميلأكواد الأصناف
ORGANIX٨٥ORGORG-00001 … ORG-00085
Veexia٤٧VEEVEE-00001 … VEE-00047
Stemya٢٤STESTE-00001 … STE-00024
ACTIO PHARMA١٤ACTACT-00001 … ACT-00014
2H Pharma٤2H2H-00001 … 2H-00004
ميلاكيور (عربي فقط)١؟ محتاج قرارك…-00001

كود العميل يُخزَّن على العميل نفسه (سجل الشريك التجاري)، مش على المنتج — فلو تعدّل مرة واحدة، الأصناف الجديدة كلها تمشي عليه، والقديمة ما تتغيّرش (الكود هوية تُطبع وتُلصق، ولا تُعاد كتابتها بأثر رجعي).

⚠️ سؤال لازم يُحسم قبل الرفع

عندك ١١١ عميلًا، منهم ٢١ بالعربي فقط و٦ يتضاربون على أي اشتقاق تلقائي — وفيهم حالتان تبدوان نفس العميل مكتوبًا مرتين (aL nhar / Al Nahar، وDiamond Labs مرة بالإنجليزي ومرة بالعربي). الأكواد لازم تُراجَع بعينك مرة واحدة. نجهّزها لك في جدول ونستنّى موافقتك — ٢٠ دقيقة مراجعة توفّر إعادة ترميز ٤٧٨ صنف.

٥ العميل على المنتج

مفيش ربط اليوم إطلاقًا. المقترح: حقل «عميل التصنيع» على المنتج، يشاور على الشريك التجاري (نفس السجل اللي عليه عقود التصنيع والفواتير) — مش نص حر، عشان التقارير تتجمّع والتركيبة تعرف تفلتر.

البندالقرار المقترحليه
إلزامي ولا اختياري؟اختياري (زي ما قلت «أوبشن»)موادك بتاعتك مالهاش عميل. والإلزام هيكسر كل صنف قائم.
يشاور على إيه؟الشريك التجاري (عميل)هو نفس الكيان اللي عقود التصنيع ودفتر الأمانة بيستخدموه ⇒ التقارير تتلاقى.
يتغيّر بعد ما يبقى فيه أرصدة؟لأ — يُقفل بعد أول حركةتغيير مالك مادة عندها رصيد معناه نقل ملكية بلا مستند. لو محتاج، يبقى صنف جديد.
يظهر فين؟شاشة الأصناف (عمود + فلتر) · الاستيراد · التركيبة · تقارير المخزونبلا الفلتر، ١١١ عميل × مواد = قوائم غير قابلة للاستخدام.
الاستيراد؟عمود «عميل التل» الموجود في ملفك يتربط بالعميل الحقيقي بالاسممحرّك الاستيراد بقى بيقرا العمود ده فعلًا؛ باقي إنه يربطه بسجل عميل بدل نص.

٦ التركيبة (BOM) — «تتكوّن من مواد نفس العميل»

النهارده اختيار مكوّن التركيبة بيعرض كل الأصناف. مع ٤٧٨ مادة موزّعة على ١١١ عميل، ده مش بس مزعج — هو باب لخطأ مكلّف: تضيف مادة أورجانكس في تركيبة منتج لعميل تاني، فتصرف من مخزون العميل الغلط.

المقترح — تدرّج بثلاث درجات

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

product(customer=ORG) → BOM → components filtered to customer=ORG ∪ customer=NULL → issue guard

٧ الأمانة والتقييم — أهم قسم [FIN]

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

(أ) اقتراحك — القيمة صفر في الشراء، ومانوال

الحكم: يعمل فعلًا — ومنطقي. تستلم مادة العميل بتكلفة ٠، فالكمية تتسجّل والقيمة ما تزيدش. الميزانية سليمة، ومفيش سطر كود.

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

وكمان: الصرف على أمر الإنتاج هيحمّل مادة بتكلفة ٠ — وده صحيح في التصنيع لدى الغير: أنت بتحاسب على أتعاب التصنيع لا على خامة مش ملكك.

🔴 لكن فيه فخ واحد يبطّل الحل بالكامل — وموجود في الكود

تكلفة الوحدة في النظام فيها سلسلة رجوع لما تكون صفرًا: بيجرّب تكلفة سطر الفاتورة الأصلية، بعدها التكلفة المتوسطة/FIFO الحالية، وفي الآخر سعر الشراء المسجَّل على الصنف نفسه.

يعني: لو حد كتب سعر شراء على مادة العميل (أو الاستيراد جاب عمود سعر)، فأي مسار بيلاقي التكلفة صفرًا هيستبدلها بسعر الصنف في صمت — ومادة العميل تُقيَّم من ورا ظهرك.

القفل: purchase_price = 0 إلزاميًا على مواد العميل، وواجهة تمنع كتابته. وده سطر واحد من الحماية — لكن من غيره «القيمة صفر» ما تكونش مضمونة.

⚠️ وحدّان تانيان لازم تعرفهم قبل ما تختار «مانوال»

(ب) علامة «أمانة» على المنتج ⭐ توصيتي

علامة على الصنف: «مادة عميل — لا تُحسب في مخزون الشركة». بتُحدَّد وقت إضافة الصنف زي ما طلبت بالظبط، وبعدها كل استلام لها:

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

(ج) استخدام نظام الأمانة القائم

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

ولذلك قرارك بالفصل مفهوم — وأنا مؤيّده عمليًا، مع ملاحظة صريحة في القسم اللي بعده.

ملاحظتي على «يبقى منفصل عن نظام الأمانة الموجود»

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

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

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

شاشة الصنف — «عميل التصنيع» + «أمانة» + معاينة الكود

إضافة صنف جديد ← بيانات أساسية
الاسم *Calcium Carbonate
عميل التصنيعORGANIX ▾ اختياري — سيبه فاضي لموادك
الكودORG-00086 يتولّد تلقائيًا من كود العميل — للعرض فقط
مادة أمانة (عميل)مفعّل لا تُحسب في مخزون الشركة · القيمة ٠ · بلا قيد محاسبي
سعر الشراء0.000 — مقفول مقفول لأن الصنف أمانة (وده اللي يقفل فخ سلسلة الرجوع)
الوحدة الأساسية *جرام ▾
تتبّعتشغيلة + صلاحية ▾

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

شاشة الأصناف — عمود وفلتر بالعميل

الأصناف  |  العميل: ORGANIX ▾ القسم: خام ▾
الكودالاسمعميل التصنيعأمانةالوحدةالرصيدالقيمة
ORG-00001Co-Enzyme Q10ORGANIXجرام12,0000.000
ORG-00002Zinc BisglycinateORGANIXجرام8,5000.000
2H-00001Co-Enzyme Q102H Pharmaجرام3,0000.000
PRD-00114Aerosil 200جرام40,0006,800.000
نفس المادة (Co-Enzyme Q10) عند عميلين = صفّان بكودين — وده المقصود، مش تكرارًا بالغلط. والصنف الأخير بتاعك: بلا عميل، بلا أمانة، وله قيمة.

التركيبة — المكوّنات مفلترة على عميل المنتج

تركيبة: Vitamin C 1000mg — ORGANIX
إضافة مكوّنمواد ORGANIX + موادك ▾ ١٤ خيار بدل ٤٧٨
#المكوّنالعميلالكميةالوحدة
١Ascorbic AcidORGANIX1000مج
٢Magnesium StearateORGANIX5مج
٣H.G.CAP White/WhiteORGANIX1كبسول
٤Aerosil 200 — (بتاعتك)2مج
السطر ٤ مادة بتاعتك في تركيبة عميل: مسموح (بتحمّل تكلفتها عليك) — بتنبيه بس، مش منع.

تقييم المخزون — الاستبعاد يبان بوضوح

تقييم المخزون — يوليو ٢٠٢٦
البندالكميةالقيمة
مخزون الشركة1,240,000842,300.000
مواد العملاء (أمانة) — مستبعدة612,000مستبعدة
إجمالي الميزانية842,300.000
الكمية بتفضل ظاهرة (أمين المخزن محتاجها) والقيمة مستبعدة (المحاسب محتاج كده) — والسطر مذكور مش محذوف، عشان محدش يسأل «فين البضاعة اللي شفتها في المخزن؟».

٩ خطة التنفيذ

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

وطريق سريع لو مستعجل الرفع

WP1 + WP2 + WP4 لوحدهم يخلّوك ترفع الملف بأكواد صح ومربوطة بالعملاء — وتشتري الوقت بحل «القيمة صفر» اليدوي بتاعك مؤقتًا، بشرط واحد إلزامي: purchase_price = 0 على مواد العملاء عشان سلسلة الرجوع ما تقيّمهاش من ورا ظهرك. بعدها WP3 يحوّل الانتباه اليدوي لضمان من النظام.

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

١. شكل الكود
٢. أكواد العملاء الـ١١١ (٢١ بالعربي · ٦ تضاربات)
٣. الأمانة — استبعاد بضمان ولا بانتباه؟
٤. الكمية — تظهر مع مخزونك ولا منفصلة؟
٥. مادة بتاعتك في تركيبة عميل

وقفة صريحة على واحدة من اختياراتك

البند اللي محتاج نظرة تانية هو «مانوال». الباقي كله متماسك: مادة لكل عميل + كود بالعميل + علامة على الصنف تصميم واحد بيقوّي نفسه. لكن الاعتماد على إن كل واحد يفتكر يكتب ٠ في كل استلام مش قابل للاستمرار على ٤٧٨ مادة و١١١ عميل — وأول مرة يُنسى، القيمة بتخش ميزانيتك بهدوء ومحدش بيلاحظ. الفرق بين (أ) و(ب) مش شغل كتير — هو الفرق بين ضمان وانتباه.