ملاحظة: تكلفة الصفر في إذن الإضافة مسموحة فعلًا في النظام
(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 |
| الدَّين للعميل | ورقة وقلم | التزام في الميزانية |
| التسوية | يدوي | ردّ أو شراء |
| كشف حساب للعميل بخاماته | صعب — لازم تجمّع أكواد | مباشر من دفتر الأمانة |
| تكلفة التحويل | صفر — ده وضعك الحالي | حقيقية — نقل أرصدة ودمج أكواد |
انقل الخامات — الخامات بس — لنموذج «صنف واحد + مالك». والسبب مش إن الطريقة التانية أنضف نظريًا، السبب إنك بتطلب حاجة (السلفة والتسوية) موجودة ومبنية ومختبَرة في النموذج التاني، ومستحيلة في النموذج الحالي من غير ما نبني آلية جديدة من الصفر.
وأهم من ده: النموذج الحالي مش بس مش داعم للسلفة — هو كمان بيخفي المخاطرة. دلوقتي لو حد أخد من خامة أحمد ونسي يردّها، مفيش أي حاجة في النظام هتقول لك. في النموذج التاني، الالتزام بيفضل مفتوح في ميزانيتك لحد ما يتقفل.
RecordBorrow في توثيقه مكتوب إنه مصمَّم لحالة:
«أمر إنتاج مملوك للمصنع بيستهلك خامة عميل». وحالتك مختلفة شوية:
أمر عميل (محمد) بيستهلك خامة عميل تاني (أحمد).
اقتصاديًا التسجيل سليم — المصنع بياخد خامة أحمد ويبقى مدين له، وبعدين يردّها. أحمد مش دائن لمحمد، وده صح.
بس فيه سؤال محاسبي حقيقي: القيد بيحمّل إنتاج تحت التشغيل بتكلفة الخامة. وأمر محمد أمر تصنيع لدى الغير، المفروض ميحملش تكلفة خامات أصلًا لأن محمد بيوفّرها. فالسلفة ممكن تخلي تكلفة أمر محمد تبان أعلى من الحقيقة لحد ما التسوية تحصل.
ده محتاج قراءة أعمق للكود ومراجعة محاسبية قبل ما نعتمد المسار — ماعملتهاش لسه، وما ينفعش أأكد لك إنها تمام من غير ما أتحقق.
تحليل مبدئي مبني على قراءة الكود على moonui2 — لسه مفيش أي كود اتكتب ولا اتغيّر. الخطوة الجاية تعتمد على إجاباتك فوق.