سلفة الخامات بين العملاء

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

[FIN] يمسّ المخزون والقيود تصنيع لدى الغير تحليل — لسه مفيش كود اتكتب ١٩ أغسطس ٢٠٢٦

فهمي للوضع عندك — صحّحني لو غلط

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

ملاحظة: تكلفة الصفر في إذن الإضافة مسموحة فعلًا في النظام (StoreInventoryReceiptRequest بيقبل gte:0) — فالجزء ده شغال صح.

المشكلة الحقيقية فين

المشكلة مش في السلفة نفسها. المشكلة إن كالسيوم-محمد وكالسيوم-أحمد — بالنسبة للنظام — صنفين مختلفين تمامًا، زي ما يكونوا حديد وخشب.

النتيجة المباشرة: النظام لا يعرف إنهم نفس المادة. وعشان كده:
  • أمر تشغيل محمد بيطلب «كالسيوم-محمد». لو صرفت له «كالسيوم-أحمد»، الصرف مش هيطابق قائمة المواد — هيبان كأنه صرف صنف مش في التركيبة.
  • مفيش أي أثر للدَّين. النظام مش هيسجّل إن أحمد ليه ١٠٠ كيلو عندك. الرصيد بينقص وخلاص.
  • مفيش تسوية. لما كمية محمد توصل، مفيش حاجة في النظام تقول «دي كانت سلفة، ردّها لأحمد» — لازم تفتكر إنت.
  • الكتالوج بيتضخّم: كل خامة × كل عميل = كود جديد، وقوائم المواد بتبقى لكل عميل على حدة.

يعني السلفة اللي بتعملها دلوقتي شغّالة بالورقة والقلم، والنظام مش شايفها.

اللي النظام عنده بالفعل — وإنتو مش مستخدمينه

ده الجزء المهم. موديول الإنتاج فيه آلية كاملة اسمها أمانة بضاعة العميل (Consignment)، مبنية بالظبط للحالة دي، وشغّالة في الكود دلوقتي:

الحاجةموجودة فينبتعمل إيه
صنف واحد، أرصدة متعددة inventory_lot_balances.owner_partner_id «كالسيوم» يبقى كود واحد، والرصيد متقسّم حسب مالكه. صفر = الشركة، ورقم = العميل. ده بيلغي تكويد نفس الصنف مرتين.
دفتر أمانة لكل عميل ConsignmentMaterialLedger رصيد لكل (عميل + صنف + مخزن) — مستلم / مصروف / مستلَف — خارج دفاتر الشركة.
استلام خامة العميل CreateConsignmentReceipt بيدخّل الكمية فعليًا في المخزن بتكلفة مُعلَنة من العميل، من غير أي قيد محاسبي — لأنها مش بضاعتك.
السلفة نفسها RecordBorrow لما الإنتاج ياخد من خامة عميل، بيتسجّل قيد:
DR إنتاج تحت التشغيل / CR خامات مستحقة للعميل
يعني الدَّين بيبقى مسجّل كالتزام في الميزانية، مش في دماغك.
التسوية SettleBorrow بطريقتين: replenish (ترجّع نفس الخامة لما كميتك توصل) أو buy (تشتريها من العميل — بتتعمل فاتورة شراء والعميل بيبقى مورّد، والالتزام بيتقفل).
إرجاع خامة للعميل ReturnConsignmentMaterial لو فاض من خامة العميل وعايز ترجّعها.
يعني السيناريو اللي بتوصفه بالظبط:
١

عجز عند محمد

أمر تشغيل محمد محتاج ١٠٠ كيلو كالسيوم، الموجود من نصيبه ٤٠ بس.

٢

سلفة من أحمد

RecordBorrow — الإنتاج بيمشي، والنظام يسجّل التزام: «خامات مستحقة لأحمد ٦٠ كيلو».

٣

كمية محمد توصل

إذن استلام أمانة جديد باسم محمد.

٤

التسوية

SettleBorrow (replenish) — الـ٦٠ ترجع لأحمد، والالتزام يتقفل.

حالة أورجانكس — مصنعك المسجَّل كعميل

دي بالظبط الطريقة التانية للتسوية: SettleBorrow بنوع buy.

لما أورجانكس يغطّي عجز عميل تاني، اللي بيحصل محاسبيًا:

SettleBorrow (type = buy)
  → فاتورة شراء، العميل صاحب الخامة يبقى فيها "مورّد"
  → DR المخزون / CR موردون
  → الالتزام "خامات مستحقة للعميل" يتقفل

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

ملاحظة على تسجيل أورجانكس كعميل: النظام بيفرّق بين owner_partner_id = 0 (الشركة نفسها) وبين شريك حقيقي. لو أورجانكس هو مصنعك، غالبًا المفروض تكون عملياته على ملكية الشركة مش كعميل — وده بيخلّي حساباته أوضح وبيوفّر عليك دورة أمانة كاملة مالهاش لازمة. لكن ده يعتمد على إجابتك على السؤال ٣ تحت.

الطريقين — مقارنة صريحة

الوضع الحالي: كود منتج لكل عميلالبديل: صنف واحد + مالك
عدد الأكواد خامة × عميل — بيتضاعف مع كل عميل جديد كود واحد لكل خامة
قوائم المواد (BOM) لكل عميل قائمة مواد خاصة بأكواده قائمة مواد واحدة للمنتج
السلفة بين العملاء مفيش صرف صنف مش في التركيبة، بدون أثر جاهزة RecordBorrow
الدَّين للعميل ورقة وقلم التزام في الميزانية
التسوية يدوي ردّ أو شراء
كشف حساب للعميل بخاماته صعب — لازم تجمّع أكواد مباشر من دفتر الأمانة
تكلفة التحويل صفر — ده وضعك الحالي حقيقية — نقل أرصدة ودمج أكواد

ترشيحي

انقل الخامات — الخامات بس — لنموذج «صنف واحد + مالك». والسبب مش إن الطريقة التانية أنضف نظريًا، السبب إنك بتطلب حاجة (السلفة والتسوية) موجودة ومبنية ومختبَرة في النموذج التاني، ومستحيلة في النموذج الحالي من غير ما نبني آلية جديدة من الصفر.

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

مش لازم تحويل شامل مرة واحدة. ينفع نبدأ بخامة واحدة أو عميلين ونشوف الدورة كاملة (استلام أمانة ← صرف ← سلفة ← تسوية) قبل أي نقل واسع. ومنتجاتك التامة تفضل زي ما هي — الكلام ده على الخامات بس.

ثغرة لازم أتأكد منها قبل أي تنفيذ

[FIN] RecordBorrow في توثيقه مكتوب إنه مصمَّم لحالة: «أمر إنتاج مملوك للمصنع بيستهلك خامة عميل». وحالتك مختلفة شوية: أمر عميل (محمد) بيستهلك خامة عميل تاني (أحمد).

اقتصاديًا التسجيل سليم — المصنع بياخد خامة أحمد ويبقى مدين له، وبعدين يردّها. أحمد مش دائن لمحمد، وده صح.

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

ده محتاج قراءة أعمق للكود ومراجعة محاسبية قبل ما نعتمد المسار — ماعملتهاش لسه، وما ينفعش أأكد لك إنها تمام من غير ما أتحقق.

أسئلة محتاج إجابتها قبل ما أكمل

  1. الخامة اللي بتتسلف — بترجع نفسها ولا بتتشترى؟ يعني لما كمية محمد توصل، بترد لأحمد نفس الكيلوهات، ولا الأغلب إنك بتشتريها منه؟ ده بيحدد أي مسار تسوية هو الأساسي.
  2. الخامات دي متطابقة فعلًا؟ كالسيوم محمد وكالسيوم أحمد نفس المواصفة والمورّد، ولا فيه فروق (نقاء، تشغيلة، شهادة تحليل) تخلّي دمجهم في كود واحد غلط؟ لو فيه فرق حقيقي، ترشيحي كله يتغير.
  3. أورجانكس — عميل ولا هو أنت؟ لو هو مصنعك، ليه اتسجّل كعميل؟ فيه سبب (فوترة، فصل حسابات) ولا ده حل مؤقت؟
  4. الكميات دي بتتحاسب عليها؟ يعني خامة العميل ليها قيمة معلنة عندك (للتأمين أو للجرد) ولا بصفر خالص؟
  5. العجز ده بيحصل كتير؟ لو نادر، ممكن حل أبسط بكتير يكفي. لو أسبوعي، فالنموذج لازم يتغيّر.

تحليل مبدئي مبني على قراءة الكود على moonui2 — لسه مفيش أي كود اتكتب ولا اتغيّر. الخطوة الجاية تعتمد على إجاباتك فوق.