المادة الخام تُسجَّل مرة لكل عميل — والكود يُبنى على العميل، والعميل يبقى حقلًا على المنتج، والتركيبة (BOM) تتكوّن من مواد نفس العميل، ومواد العميل لا تُحسب في مخزون الشركة. هذا المستند يقيس الأربعة على الكود الفعلي وعلى ملف «المواد الخام» نفسه.
البنود ١ و٢ و٣ و٤ قابلة للتنفيذ ونظيفة — والملف نفسه يدعمها. البند ٥ فيه مفاجأة لازم تعرفها: مواد العميل محسوبة في مخزونك اليوم فعلًا — جدول الأرصدة الرئيسي ما فيه عمود مالك من أصله. واقتراحك بـ«القيمة صفر» يعمل فعلًا — وبيعمل تحديدًا لأنك اخترت مادة لكل عميل — بس فيه فخ واحد لازم يتقفل وإلا النظام يستبدل الصفر برقم من نفسه في صمت.
قرأت الملف مرة تانية بسؤال مختلف: هل ينفع نبني الكود من الاسم؟ الإجابة لأ، والسبب أرقام.
الأسماء بتنتهي بلاحقة العميل (- 2H / -ACT / -Mila Cure)، لكن:
| العميل | اللواحق المستخدمة فعلًا في ملفك |
|---|---|
| ORGANIX | ORG ×42 · Organix ×6 · org ×6 · organix ×1 · Organx ×1 · Cysteine ×1 |
| Medical Shina | Medical shina ×5 · Medical Shine ×2 · Medical Shina ×1 · MES ×1 |
| Famila | famila ×9 · FAM ×1 |
| Praxo | Praxo ×8 · PRA ×4 |
| Pro care Pharma | PROCARE ×3 · PROCAER ×1 |
| Aliganza | Aliganza ×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 | ٨٥ | ORG | ORG-00001 … ORG-00085 |
| Veexia | ٤٧ | VEE | VEE-00001 … VEE-00047 |
| Stemya | ٢٤ | STE | STE-00001 … STE-00024 |
| ACTIO PHARMA | ١٤ | ACT | ACT-00001 … ACT-00014 |
| 2H Pharma | ٤ | 2H | 2H-00001 … 2H-00004 |
| ميلاكيور (عربي فقط) | ١ | ؟ محتاج قرارك | …-00001 |
كود العميل يُخزَّن على العميل نفسه (سجل الشريك التجاري)، مش على المنتج — فلو تعدّل مرة واحدة، الأصناف الجديدة كلها تمشي عليه، والقديمة ما تتغيّرش (الكود هوية تُطبع وتُلصق، ولا تُعاد كتابتها بأثر رجعي).
عندك ١١١ عميلًا، منهم ٢١ بالعربي فقط و٦ يتضاربون على أي اشتقاق تلقائي — وفيهم حالتان تبدوان نفس العميل مكتوبًا مرتين (aL nhar / Al Nahar، وDiamond Labs مرة بالإنجليزي ومرة بالعربي). الأكواد لازم تُراجَع بعينك مرة واحدة. نجهّزها لك في جدول ونستنّى موافقتك — ٢٠ دقيقة مراجعة توفّر إعادة ترميز ٤٧٨ صنف.
مفيش ربط اليوم إطلاقًا. المقترح: حقل «عميل التصنيع» على المنتج، يشاور على الشريك التجاري (نفس السجل اللي عليه عقود التصنيع والفواتير) — مش نص حر، عشان التقارير تتجمّع والتركيبة تعرف تفلتر.
| البند | القرار المقترح | ليه |
|---|---|---|
| إلزامي ولا اختياري؟ | اختياري (زي ما قلت «أوبشن») | موادك بتاعتك مالهاش عميل. والإلزام هيكسر كل صنف قائم. |
| يشاور على إيه؟ | الشريك التجاري (عميل) | هو نفس الكيان اللي عقود التصنيع ودفتر الأمانة بيستخدموه ⇒ التقارير تتلاقى. |
| يتغيّر بعد ما يبقى فيه أرصدة؟ | لأ — يُقفل بعد أول حركة | تغيير مالك مادة عندها رصيد معناه نقل ملكية بلا مستند. لو محتاج، يبقى صنف جديد. |
| يظهر فين؟ | شاشة الأصناف (عمود + فلتر) · الاستيراد · التركيبة · تقارير المخزون | بلا الفلتر، ١١١ عميل × مواد = قوائم غير قابلة للاستخدام. |
| الاستيراد؟ | عمود «عميل التل» الموجود في ملفك يتربط بالعميل الحقيقي بالاسم | محرّك الاستيراد بقى بيقرا العمود ده فعلًا؛ باقي إنه يربطه بسجل عميل بدل نص. |
النهارده اختيار مكوّن التركيبة بيعرض كل الأصناف. مع ٤٧٨ مادة موزّعة على ١١١ عميل، ده مش بس مزعج — هو باب لخطأ مكلّف: تضيف مادة أورجانكس في تركيبة منتج لعميل تاني، فتصرف من مخزون العميل الغلط.
product(customer=ORG) → BOM → components filtered to customer=ORG ∪ customer=NULL → issue guard
طلبك: مادة العميل ما تتحسبش في مخزوني. وموقفنا: جدول الأرصدة ما فيهوش مالك. تحت التلات طرق، واحدة منهم اقتراحك.
الحكم: يعمل فعلًا — ومنطقي. تستلم مادة العميل بتكلفة ٠، فالكمية تتسجّل والقيمة ما تزيدش. الميزانية سليمة، ومفيش سطر كود.
وبيعمل تحديدًا بسبب قرارك الأول. الخطر المعروف في «التكلفة صفر» إنه يلوّث المتوسط المرجّح: لو نفس الصنف فيه رصيد بتاعك بتكلفة، استلام بصفر بيسحب متوسط التكلفة تحت ويفسد تكلفة مبيعاتك. لكن عندك مادة العميل صنف منفصل تمامًا ⇒ ما بتشاركش صنفًا مع بضاعتك أبدًا، فالتلويث مستحيل من أصله. اختيارك الأول خلّى اختيارك التاني آمنًا.
وكمان: الصرف على أمر الإنتاج هيحمّل مادة بتكلفة ٠ — وده صحيح في التصنيع لدى الغير: أنت بتحاسب على أتعاب التصنيع لا على خامة مش ملكك.
تكلفة الوحدة في النظام فيها سلسلة رجوع لما تكون صفرًا: بيجرّب تكلفة سطر الفاتورة الأصلية، بعدها التكلفة المتوسطة/FIFO الحالية، وفي الآخر سعر الشراء المسجَّل على الصنف نفسه.
يعني: لو حد كتب سعر شراء على مادة العميل (أو الاستيراد جاب عمود سعر)، فأي مسار بيلاقي التكلفة صفرًا هيستبدلها بسعر الصنف في صمت — ومادة العميل تُقيَّم من ورا ظهرك.
القفل: purchase_price = 0 إلزاميًا على مواد العميل، وواجهة تمنع كتابته. وده سطر واحد من الحماية —
لكن من غيره «القيمة صفر» ما تكونش مضمونة.
علامة على الصنف: «مادة عميل — لا تُحسب في مخزون الشركة». بتُحدَّد وقت إضافة الصنف زي ما طلبت بالظبط، وبعدها كل استلام لها:
وأنسب حاجة فيها: لأن الصنف عند عميل واحد (قرارك الأول)، العلامة على الصنف كافية ودقيقة — مش محتاجة تتبع مالك لكل حركة على حدة. تصميمك جعل أبسط حل هو الحل الصحيح.
دفتر مواد الأمانة موجود ومفهرس بـ(عميل + صنف + مخزن). نظريًا هو المكان «الصح». عمليًا: بُعد المالك مكتوب في جدول التشغيلات فقط، وللأصناف المتتبَّعة بتشغيلات فقط، والدخول ليه من مسار عقد تصنيع لدى الغير كامل — يعني تشغيل الفيتشر ده يفرض عليك عقودًا لكل عميل قبل ما تستلم كيلو واحد.
ولذلك قرارك بالفصل مفهوم — وأنا مؤيّده عمليًا، مع ملاحظة صريحة في القسم اللي بعده.
موافق على الفصل في مسار التشغيل: ما ينفعش نفرض عقد تصنيع عشان تستلم خامة. لكن خلّي بالك من نتيجة واحدة: هيبقى في النظام تعريفان لـ«بضاعة عميل» — علامتك الجديدة على الصنف، ودفتر الأمانة القديم.
لو عميل استلم بالطريقتين، «كام كيلو عند العميل ده؟» هيبقى ليها إجابتان. الحل الرخيص: العلامة الجديدة تبقى مصدر الحقيقة الوحيد للاستبعاد، والدفتر القديم يفضل لعقود التصنيع بس — وتقرير واحد بس يجمع الاتنين للعرض. سطر تصميم واحد النهارده يمنع تعارض أرقام بعد سنة.
لاحظ: لمّا «عميل التصنيع» يبقى فاضي، خانة الأمانة تختفي وسعر الشراء يفتح — الشاشة زي ما هي بالظبط لأي صنف عادي.
| الكود | الاسم | عميل التصنيع | أمانة | الوحدة | الرصيد | القيمة |
|---|---|---|---|---|---|---|
| ORG-00001 | Co-Enzyme Q10 | ORGANIX | ✔ | جرام | 12,000 | 0.000 |
| ORG-00002 | Zinc Bisglycinate | ORGANIX | ✔ | جرام | 8,500 | 0.000 |
| 2H-00001 | Co-Enzyme Q10 | 2H Pharma | ✔ | جرام | 3,000 | 0.000 |
| PRD-00114 | Aerosil 200 | — | — | جرام | 40,000 | 6,800.000 |
| # | المكوّن | العميل | الكمية | الوحدة |
|---|---|---|---|---|
| ١ | Ascorbic Acid | ORGANIX | 1000 | مج |
| ٢ | Magnesium Stearate | ORGANIX | 5 | مج |
| ٣ | H.G.CAP White/White | ORGANIX | 1 | كبسول |
| ٤ | Aerosil 200 ⚠ | — (بتاعتك) | 2 | مج |
| البند | الكمية | القيمة |
|---|---|---|
| مخزون الشركة | 1,240,000 | 842,300.000 |
| مواد العملاء (أمانة) — مستبعدة | 612,000 | مستبعدة |
| إجمالي الميزانية | — | 842,300.000 |
| WP | النطاق | الطبقة | يعتمد على | مالي |
|---|---|---|---|---|
| WP1 | كود العميل على سجل الشريك + جدول الأكواد المقترحة لـ١١١ عميل للمراجعة | BE + بيانات | — | — |
| WP2 | عميل التصنيع على المنتج + توليد الكود بسابقة العميل وعدّاد له + إقفال التعديل بعد أول حركة | BE (سكيما) | WP1 | — |
| WP3 | علامة الأمانة: قيمة ٠ إجبارية · بلا قيد مخزون · استبعاد من التقييم · قفل سعر الشراء | BE (سكيما) | WP2 | [FIN] |
| WP4 | الاستيراد: عمود «عميل التل» يُربط بعميل حقيقي، وعلامة الأمانة تُشتق منه | BE | WP2, WP3 | — |
| WP5 | واجهة الأصناف: الحقل + العلامة + معاينة الكود + العمود + الفلتر | FE | WP2, WP3 | — |
| WP6 | التركيبة: فلترة المكوّنات بالعميل + تنبيه المكوّن الغريب | BE + FE | WP2 | — |
| WP7 | تقرير «مواد العملاء — كميات فقط» + سطر الاستبعاد في التقييم | BE + FE | WP3 | [FIN] |
| WP8 | حماية الصرف: تحذير/منع صرف مادة عميل على أمر إنتاج لعميل تاني | BE | WP2 | — |
WP1 + WP2 + WP4 لوحدهم يخلّوك ترفع الملف بأكواد صح ومربوطة بالعملاء — وتشتري الوقت بحل «القيمة صفر»
اليدوي بتاعك مؤقتًا، بشرط واحد إلزامي: purchase_price = 0 على مواد العملاء عشان سلسلة الرجوع
ما تقيّمهاش من ورا ظهرك. بعدها WP3 يحوّل الانتباه اليدوي لضمان من النظام.
ORG-00001 — سابقة العميل + عدّاد يبدأ من ١ لكل عميل ⭐ توصيتيORG-00413 — سابقة العميل + العدّاد العام (أرقام بتنقّط)ORG-CALC — سابقة العميل + رمز المادة (يتطلّب قاموس ٤٠٧ مادة أولًا)MEP لتلات عملاء و٢١ عميل بلا كودالبند اللي محتاج نظرة تانية هو «مانوال». الباقي كله متماسك: مادة لكل عميل + كود بالعميل + علامة على الصنف تصميم واحد بيقوّي نفسه. لكن الاعتماد على إن كل واحد يفتكر يكتب ٠ في كل استلام مش قابل للاستمرار على ٤٧٨ مادة و١١١ عميل — وأول مرة يُنسى، القيمة بتخش ميزانيتك بهدوء ومحدش بيلاحظ. الفرق بين (أ) و(ب) مش شغل كتير — هو الفرق بين ضمان وانتباه.