التحليل الشامل لإضافة موديول التصنيع إلى Moon ERP
الخريطة، الفجوات، التكاملات، وخطة البناء
دراسة تنفيذية كاملة لبناء موديول التصنيع داخل Moon ERP وفق مواصفة التحليل المُعدّة مسبقاً (manufacturing_spec بأجزائها السبعة): أين يُبنى كل كيان، وما الذي يُعاد استخدامه من الموديولات القائمة، وما الناقص في الـ ERP وفي المواصفة نفسها، وكيف يتفاعل التصنيع مع كل موديول موجود، ومراحل البناء بمخرجات قابلة للتشغيل. خضعت النتائج لمراجعة عدائية مستقلة وصُحّحت ملاحظاتها قبل الإصدار.
mfg_ جديدالملخص التنفيذي (Executive Summary)
الإجابات المباشرة على سؤالي الإدارة: كيف نبنيه مع الـ ERP؟ وما الناقص؟ — التفاصيل الكاملة في الأقسام الجانبية.
القرار الأول: أين يُبنى؟ — توسعة Modules/Production القائم، لا موديول جديد
الـ ERP يحتوي بالفعل موديول إنتاج مبدئياً (7 جداول: مراكز إنتاج، BOM بمكوناته وعملياته، أوامر إنتاج بموادها وعملياتها) — والفحص أثبت أن جداوله هي نفسها كيانات المواصفة في صورتها الأولية، وأن لديه واجهة Angular كاملة و19 صلاحية مسجّلة وترقيم مستندات جاهز، بينما لا توجد عليه أي بيانات إنتاج ولا يشير إليه أي موديول آخر. لذا القرار: التوسعة في المكان — الجداول السبعة تُمدّد لتطابق المواصفة، وكل الكيانات الجديدة (24 جدولاً: المسارات، العُدد والقوالب، التخطيط MPS/MRP/CRP، التأكيدات، التكلفة المعيارية والانحرافات السبعة، صالة الإنتاج) تُنشأ ببادئة mfg_، وبادئة الصلاحيات تبقى production.*. إنشاء Modules/Manufacturing منفصل كان سيعني ازدواج الصلاحيات والترقيم والواجهة ثم مشروع إهلاك للقديم — هدر صافٍ.
القرار الثاني: ماذا يُعاد استخدامه؟ — التصنيع «عميل» لتسعة موديولات
- المخزون: الصرف والاستلام حصراً عبر مستندات
ApproveIssue/ApproveReceiptالقائمة (لا لمس مباشر للأرصدة)، والتسعير FIFO/متوسط منStockService— مخازن أمانة بعلم consignment لمواد العميل (التصنيع بالأجر Toll). - الحسابات: كل قيود دورة التكلفة (تحت التشغيل ← انحرافات ← تسوية) حصراً عبر
CreateJournalEntry— ومراكز التكلفة وسجل الأصول الثابتة موجودان فعلاً (للقوالب يُضاف فقط إهلاك بالاستخدام). - المشتريات: مخرجات MRP تتحول طلبات شراء داخل دورة الاعتماد القائمة. المبيعات: أوامر البيع مصدر الطلب للـ MPS مع ربط Pegging. الموارد البشرية: العمالة والورديات وتكلفة التأكيدات. الجودة QMS: الفحص أثناء التشغيل وعدم المطابقة على الهالك — بلا جداول جودة مكررة. الصيانة CMMS: مراكز العمل والقوالب أصول قابلة للصيانة بعدادات اللقطات. النواة: دليل الأصناف ووحدات القياس والموافقات والمرفقات.
- قاعدة الاتجاه الواحد: التصنيع يستورد من الجميع للأمام، ولا يقرأ أي موديول جداول
mfg_أبداً (حتى تغذية رواتب القطعة تُدفع إلى جدول تملكه HRM) — نفس وصفة LIS المجرّبة.
سؤالك: ما الناقص؟ — في الاتجاهين
ناقص في Moon ERP (يُبنى ضمن المراحل): حجوزات المواد reserve/release (العمود موجود بلا منطق)، إجراء CreatePurchaseRequest من MRP، تتبع اللوط/الباتش والجينيالوجيا في حركة المخزون، تقويم تشغيل وورديات لمراكز العمل، إهلاك بالاستخدام UnitsOfProduction للقوالب، ربط مراكز العمل بمراكز التكلفة، نمط واجهة لمس لصالة الإنتاج. وناقص في المواصفة نفسها (نقد خبير للتحليل المُسلَّم): آلية تحويل وحدات القياس بين مستويات الـ BOM، تتبع اللوط من الخام للمنتج، التعاقد الخارجي لعمليةٍ ضمن المسار (وليس فقط Toll)، أوامر إعادة التشغيل والتصرف في المعيب، تفاصيل المنتجات المشتركة/الثانوية وطريقة توزيعها، تقويم التخطيط، إدارة أوامر التغيير الهندسي ECO، ومصدر التنبؤ بالطلب — كلها موثقة بدرجات الخطورة والعلاج المقترح في قسم الفجوات.
خطة البناء — 7 مراحل بأول منفعة مبكرة
- المرحلة 0 (S): تثبيت الأساس — إصلاح الـ FKs الدفاعية، مساهم الصلاحيات، إعدادات الحسابات
production.*. - المرحلة 1 (L) ⭐ أول زيادة قابلة للاستخدام: بيانات أساسية v2 + أوامر إنتاج حقيقية ترحّل مخزوناً وقيوداً (صرف خام ← تحت التشغيل ← استلام تام).
- المرحلة 2 (L): المسارات والعُدد/القوالب وتأكيدات العمليات وتكلفة التحويل.
- المرحلة 3 (M): محرك التكلفة المعيارية والانحرافات السبعة والتسوية الشهرية.
- المرحلة 4 (L): التخطيط — MRP وPegging وطلبات الشراء الآلية وCRP وMPS مبسّط.
- المرحلة 5 (M): صالة الإنتاج — طرفيات اللمس والتقدم الآلي ولوحة لحظية.
- المرحلة 6 (L): التصنيع بالأجر، جينيالوجيا الباتشات، التعميق مع الجيران.
الجودة والمنهجية
11 وكيل فحص على Opus 4.8 (7 قرأوا أجزاء المواصفة بلا فقد + 4 خرّطوا كود الـ ERP الفعلي بالملف والسطر)، ثم 4 محللي قرار أنتجوا الخريطة والفجوات والعقود وخارطة الطريق، ثم مراجعة عدائية مستقلة طاردت التناقضات فرصدت 5 مخالفات (أهمها: وثيقة عقود كُتبت بهوية موديول خاطئة، وتجاوزان لقناة المستندات) — وأُصلحت جميعها في الملفات قبل إصدار هذا التقرير، وصحّحت المراجعة أيضاً ادعاءً خاطئاً بغياب سجل الأصول الثابتة (موجود ومتحقق منه). الملحق الفني manufacturing-erp-analysis.md مُعدّ ليُغذّى مباشرة إلى Claude Code عند بدء التنفيذ.
تحديث (11 يونيو): متطلبات عميل حقيقي — مصنع أدوية تصنيع للغير
بعد إصدار التقرير عُقد لقاء مع عميل محتمل (مصنع أدوية يصنّع للغير بالأوردر) ووصف دورته التشغيلية: دورة تكلفة استكشافية (مواصفات ← BOM مسودة من البحث والتطوير ← تكلفة مبدئية) ودورة إنتاج بالأوردر ببوابات (تجربة معملية ← اتفاق ← عربون ← حجز خامات ← تصنيع)، مع خامات يورّدها العميل وتظل ملكه، وشاشة لكل مرحلة. أُجري تدقيق تغطية كامل وصُمّمت الدورتان وعُدّلت خارطة الطريق — راجع ملحق متطلبات العميل وحتى قسم تعديلات الخطة، وقد خضع الملحق نفسه لمراجعة عدائية ثانية رصدت 24 ملاحظة وأُصلحت جميعها قبل هذا الإصدار.
خريطة البناء: المواصفة على Moon ERP كياناً بكيان (Spec → Moon ERP Mapping)
هذا القسم هو القرار الهندسي الحاسم: لكل كيان من كيانات النموذج الموحّد في المواصفة (27 كياناً في الملف 06) حُسم أحد ثلاثة خيارات — جدول جديد بادئته mfg_ داخل الوحدة، أو إعادة استخدام موديل قائم في Moon ERP بالاسم، أو توسعة جدول قائم في وحدة الإنتاج الحالية. النتيجة: لا نبني ما هو مبني، ولا نرمم ما يجب بناؤه من جديد.
القرار الأول والحاسم: توسعة Modules/Production في مكانها — لا وحدة جديدة
بعد تدقيق كامل للوحدة الحالية (التقرير 10)، القرار هو EXTEND in place وليس إنشاء Modules/Manufacturing موازية. الأسباب:
- مخاطرة ترحيل شبه معدومة: لا بيانات إنتاجية (البذّار فارغ)، لا مفاتيح أجنبية واردة من أي وحدة أخرى، لا اختبارات ستنكسر.
- سقالة مدفوعة الثمن مسبقاً: 19 صلاحية مسجلة في
RolePermissionSeeder، وواجهة Angular كاملة (features/production) بتطابق تام مع الـ API، وترقيم مستندات جاهز عبرSequenceService('production','order'). - الجداول السبعة الحالية هي نفسها كيانات المواصفة: مراكز العمل وقوائم المواد وأوامر الإنتاج موجودة بهيكل صحيح وتحتاج أعمدة إضافية فقط.
- وحدة موازية تعني ازدواجاً: ازدواج فضاء الصلاحيات
production.*والتسلسلات والواجهة، ثم مشروع إهلاك للوحدة القديمة بلا أي عائد.
قاعدة التسمية: الجداول السبعة القديمة تحتفظ بأسمائها، وكل جدول جديد يأخذ البادئة mfg_ وفق وصفة الوحدات السريرية الموثقة. بادئة الصلاحيات تبقى production.* وتُسجَّل كمساهم في Core PermissionDependencyRegistry تماماً كما تسجل وحدة المختبرات lis.
مسار ترحيل الجداول السبعة الحالية
| الجدول الحالي | المسار |
|---|---|
production_centers | توسعة → يصبح Work_Center الكامل (ربط مركز تكلفة، طاقة فعلية، تقويم، معدلات تكلفة، labor_calc) |
bill_of_materials | توسعة → BOM_Header بإصدارات وتواريخ سريان ودورة حياة (تفعيل BomStatus المعلن وغير المستخدم) |
bom_components | توسعة → BOM_Line (نوع ومستوى الصرف، ربط بعملية التشغيل، بدائل عبر mfg_bom_substitutes) |
bom_operations | إهلاك وترحيل: مسار التشغيل يصبح كياناً مستقلاً مُصدَّراً (mfg_routing_headers/operations)؛ تُنسخ الصفوف إلى مسار افتراضي نشط لكل منتج، ثم يُجمَّد الجدول ويُحذف بعد دورة إصدار |
production_orders | توسعة → Production_Order_Header بآلة حالات موسعة وحقول التجميد والتصنيع بالأجرة |
production_order_materials | توسعة → Order_Component (هو ذاته مخزن اللقطة المجمدة للمكونات) |
production_order_operations | توسعة → Order_Operation (سطح طابق المصنع الحي: حالة العملية، المؤكِّد، الكميات) |
جدول القرارات الكامل — كياناً بكيان
| كيان المواصفة | القرار | الجدول/الموديل في Moon | ملاحظات |
|---|---|---|---|
| البيانات الرئيسية (Master Data) | |||
| Item (الصنف) | REUSE | Core Product / ProductVariant + product_units | الصنف لا تملكه وحدة التصنيع أبداً. تحويلات وحدات القياس — فجوة في المواصفة — محلولة أصلاً بـ unit_groups/units/product_units. حقول التصنيع للصنف تذهب لجدول الامتداد (الصف 10) وليس لتضخيم products |
| BOM_Header | EXTEND | bill_of_materials | إضافة bom_type {Production, Engineering, Phantom}، حالة {Draft, Active, Inactive, Obsolete}، تواريخ سريان، مُعتمِد. قاعدة: نسخة نشطة واحدة لكل منتج في نافذة السريان |
| BOM_Line | EXTEND | bom_components | إضافة issue_type/issue_level/operation_seq؛ نسبة الهالك موجودة (waste_percentage)؛ البدائل في جدول ابن جديد mfg_bom_substitutes؛ التعدد المستوى بالتفجير التكراري خدمياً دون تغيير مخطط |
| Routing_Header | NEW | mfg_routing_headers | مسار تشغيل مستقل مُصدَّر بنوع {Production, Repair, Inspection} ونطاق حجم دفعة وتواريخ سريان — يحل محل ربط العمليات المباشر بقائمة المواد |
| Routing_Operation | NEW | mfg_routing_operations | أرقام عمليات بمضاعفات 10، cavity_count افتراضي 1 (مبدأ العمومية)، أزمنة تجهيز/تشغيل/انتظار/نقل، علم الفحص، مهارة مطلوبة |
| Work_Center | EXTEND | production_centers | الإضافة الأهم: cost_center_id إلى Accounting cost_centers (واجهة الإنتاج مع المحاسبة — مفقودة اليوم)؛ طاقة فعلية = يومية × مضاعِف × كفاءة × استغلال؛ labor_calc {Hourly, PieceRate}؛ عمود cost_driver {LaborHours, MachineHours, DirectMaterialCost, UnitsProduced} — مقام معدل تحميل الأعباء يسكن هنا لكل مركز عمل؛ عمود budgeted_monthly_volume كأساس حجم الموازنة لانحراف FOVV؛ ربط تقويم عمل. أعمدة المعدلات والطاقة والمُسبّب تُجدول في المرحلة 2 والتقويم في المرحلة 4 (المرحلة 1 تضيف cost_center_id فقط) |
| Tool / Mold (العُدّة/القالب) | NEW | mfg_tools | كيان جديد كلياً (غير موجود اليوم): دورات عمر، عداد دورات، حالة {Available, Mounted, Maintenance, Retired}؛ ربط cmms_assets للصيانة الوقائية بالعداد، وربط fixed_asset_id بسجل الأصول الثابتة في المحاسبة (موجود ومتحقق منه: جدول fixed_assets وخدمة FixedAssetService وقيود إهلاك DepreciationEntry) — المطلوب الجديد فقط: طريقة إهلاك بالاستخدام UnitsOfProduction (الطرق الحالية: قسط ثابت/متناقص/مُعجَّل) وتوليد قيد الإهلاك من قراءات العداد |
| التخطيط (Planning) — طبقة جديدة بالكامل | |||
| MPS_Header | NEW | mfg_mps_headers | خطة رئيسية بفترات {Day, Week, Month} وأسوار تجميد؛ نطاق الفرع عبر Core DataScope |
| MPS_Line | NEW | mfg_mps_lines | الطلب المؤكد يُسحب من Sales sales_orders عبر Action؛ التنبؤ — فجوة بالمواصفة — يُدخل يدوياً/استيراداً في الإصدار الأول |
| Item_MRP_Settings | NEW | mfg_item_mrp_settings | جدول امتداد 1:1 فوق products (نمط AccBpExt): نوع الشراء/التصنيع، ملكية المادة، طريقة التكلفة، قاعدة تحجيم الدفعات، مخزون أمان، زمن توريد |
| MRP_Planned_Order | NEW | mfg_mrp_runs / mfg_mrp_planned_orders / mfg_mrp_exceptions | مخرجات عابرة تُعاد كل تشغيلة؛ التثبيت: أمر إنتاج مخطط → production_orders، وأمر شراء مخطط → Purchases purchase_requests عبر Action جديد يُستخلص CreatePurchaseRequest (التحويل لأمر شراء موجود أصلاً)؛ كل أمر مخطط يحمل source_demand_id الذي يعتمد عليه جدول الربط Pegging |
| CRP_Load | NEW | mfg_crp_loads | حمل مقابل طاقة لكل مورد {Machine, Tool, Labor}؛ يتطلب تقويم عمل جديد mfg_work_calendars (فجوة مواصفة) مع إعادة استخدام ورديات HRM |
| التنفيذ (Execution) | |||
| Production_Order_Header | EXTEND | production_orders | توسعة آلة الحالات إلى Planned → Released → InProcess → Completed → Closed؛ إضافة نوع الأمر والإنتاج وملكية المادة وحساب WIP وأختام لقطة التجميد؛ أعمدة المستودعات الميتة تعمل أخيراً |
| Order_Component | EXTEND | production_order_materials | هو مخزن اللقطة المجمدة للمكونات عند الإطلاق؛ إضافة كمية محجوزة وملكية ونوع/مستوى صرف مجمّدين |
| Order_Operation | EXTEND | production_order_operations | حالة العملية تتحول لتعداد OperationStatus {Waiting, Ready, InProgress, Completed}؛ هذا هو السطح الحي لطابق المصنع (التقدم الآلي بحدث OperationCompleted) |
| Material_Issue_Header | NEW + REUSE | mfg_material_issues → Inventory ApproveIssue | مستند تصنيعي يحمل ما ينقص المخزون (نوع/مستوى الصرف، العملية)؛ عند الترحيل ينشئ InventoryIssue ويرحّل قيد WIP/مواد خام عبر CreateJournalEntry حصراً؛ الحجز عند الإطلاق يستهلك هنا (واجهة حجز جديدة فوق عمود reserved_quantity القائم) |
| Material_Issue_Line | NEW | mfg_material_issue_lines | فرع التصنيع بالأجرة: ownership=Customer يصرف من مخازن أمانة (علم is_consignment على warehouses) بحركة تتبع فقط دون تقييم |
| Confirmation_Header | NEW | mfg_confirmations | تأكيد العمليات: قيود عمالة/ماكينة/أعباء محمَّلة؛ العامل يُحل عبر employees.user_id؛ معدل الأجر من مركز العمل في الإصدار الأول (HRM لا يخزن معدل ساعة/قطعة — فجوة موثقة)؛ كميات أجر القطعة تُغذَّى للرواتب عبر Action بملكية HRM (RecordPieceworkEntry) يكتب جدولاً تملكه HRM — لا تقرأ الرواتب أي جدول mfg_* |
| Confirmation_Yield | NEW | mfg_confirmation_yields | الغلة توزيع لا رقم: درجات A/B/C بتخصيص تكلفة بالقيمة البيعية (NRV)، وينهار تلقائياً لدرجة واحدة في المصانع العادية (مبدأ العمومية) |
| Confirmation_Detail | NEW | mfg_confirmation_details | هالك وإعادة تشغيل وأزمنة فعلية وأكواد أسباب — يغذي محرك الانحرافات وOEE المستقبلي وتحويل الهالك لعدم مطابقة في QMS |
| Goods_Receipt_Header | NEW + REUSE | mfg_goods_receipts → Inventory ApproveReceipt | نفس نمط استلام المشتريات المعتمد (PurchaseGrnController::approve)؛ قيد تام الصنع + انحراف / WIP؛ فرع الأجرة: الإيراد أجر تشغيل فقط |
| Goods_Receipt_Line | NEW + REUSE QMS | mfg_goods_receipt_lines + QMS qms_inspections | سطر لكل درجة؛ حالة الجودة {Released, OnHold, Rejected} تُحسم من نتيجة فحص QMS — وحدة التصنيع لا تبني أي جداول جودة (جدولا خطط الفحص والفحوص يحملان production_order_id جاهزاً، أما عدم المطابقة فترتبط عبر inspection_id فقط؛ يُضاف قيد المفتاح وعمود operation_no)؛ حتى وصول بوابات QMS في المرحلة 6 تكون الحالة الافتراضية للاستلام «مفرج عنه» (قرار D-21) |
| التكاليف (Costing) | |||
| Standard_Cost | NEW | mfg_standard_costs | تكلفة معيارية مفككة (مواد/عمالة/أعباء) لكل صنف؛ التقييم الفعلي Average/FIFO يُعاد استخدامه من inventory_cost_layers + StockService |
| Cost_Center | REUSE | Accounting CostCenter (cost_centers) | حسم غموض الملكية في المواصفة: المحاسبة هي سجل الحقيقة. موجود هرمياً مع بُعد cost_center_id على سطور القيود وتقارير تصفية جاهزة؛ توسعة صغيرة: عمود type {Production, Service, Auxiliary} وعمود manager_id (كلاهما غائب — متحقق منه)؛ موازنة الأعباء الثابتة لكل مركز تكلفة موجودة أصلاً في المحاسبة (budgets + budget_lines ببُعد مركز التكلفة ومبالغ شهرية m1–m12) وتغذي انحراف FOVV — الناقص الوحيد حجم الإنتاج الموازني (عمود على مركز العمل في الإصدار الأول)؛ توزيع الخدمات بإعادة استخدام CostAllocationService (طريقة Direct متاحة، والباقي مؤجل) |
| Variance_Record | NEW | mfg_variance_records | الانحرافات السبعة بنطاقات التسامح (<2% عادي، 2–5% مراقبة، >5% تحقيق) وتوجيه للمالك؛ تُحسب عند إقفال الأمر وبوظيفة شهرية قبل إقفال الفترة المالية (CreateJournalEntry يرفض الفترات المقفلة)؛ مدخلات FOVV: موازنة الإنفاق من budget_lines القائمة وحجم الموازنة من مركز العمل، وبغياب موازنة معتمدة للفترة يُعلَن ستة انحرافات فقط (قرار D-22)؛ حسابات WIP والمحمَّل والانحرافات تُبذر عبر AutoAccountService ومفاتيح SettingsService |
| الربط العرضي وطابق المصنع | |||
| Pegging | NEW | mfg_peggings | ربط متعدد-لمتعدد بين sales_orders وproduction_orders؛ جانب المبيعات لا يُمس؛ سياسة التخصيص (فجوة مواصفة) = أقدمية أمر البيع في الإصدار الأول |
| Delivery_Schedule | NEW | mfg_delivery_schedules | تجزئة التسليم؛ مع توسعة صغرى وحيدة في المبيعات: عمود promised_date على sales_orders لإرجاع وعد التسليم المحسوب (CTP) — غير موجود اليوم |
| طبقة طابق المصنع SFC | REUSE | production_order_operations + mfg_confirmations | لا جداول جديدة — المواصفة نفسها تنص أن 80% من المنطق قائم في التنفيذ؛ المطلوب: شاشة محطة لمسية (تُستنسخ من نمط pos-layout)، تقدم آلي بالأحداث، ولوحة مشرف حية لكشف الاختناقات |
الوصفة المنزلية: التعدادات وآلات الحالات والأحداث
- التعدادات (PHP Enums): 20+ تعداداً في
Modules/Production/app/Enumsتغطي تعدادات المواصفة الأحد عشر كلها (production_type, material_ownership, procurement_type, costing_method, labor_calc, issue_type, issue_level, resource_type, lot_sizing_rule, order_status, operation_status) إضافة لتعدادات دورات حياة BOM/Routing/Tool والمستندات. - آلات الحالات: الأمر Planned→Released→InProcess→Completed→Closed (+إلغاء من أول حالتين)؛ العملية Waiting→Ready→InProgress→Completed؛ العُدّة Available→Mounted→Maintenance→Retired (الدورات تُحتسب فقط في Mounted)؛ المستندات الثلاثة Draft→Posted→Reversed.
- الأحداث والمستمعون:
ProductionOrderReleased, MaterialIssued, OperationCompleted, ConfirmationPosted, GoodsReceiptPosted, ProductionOrderClosed— كل ترحيل دفتري عبر مستمع يستدعيModules\Accounting\Actions\CreateJournalEntryحصراً، بوسمsource_type='production_order'وبُعد مركز التكلفة على كل سطر. - Actions للتقاطعات:
ReleaseProductionOrder, PostMaterialIssue, PostConfirmation, PostGoodsReceipt, CloseProductionOrder, RunMps/RunMrp/RunCrp, ComputeStandardCost, FirmPlannedOrders, PromiseDate. - القواسم الموروثة مجاناً:
BaseModel/TenantAware(company_id)،DataScopeلنطاق الفروع،SequenceServiceلترقيم كل مستند، وإضافة حالةProductionلتعدادApprovalModuleفي Core.
لمسات صغيرة محسوبة خارج الوحدة
- المخزون: واجهة حجز/تحرير فوق عمود
reserved_quantityالقائم وغير المستخدم + أنواع حركةproduction_issue/production_receipt+ إضافة حالةProductionOrderلتعدادي أنواع المرجعيةReceiptReferenceType/IssueReferenceType(كلاهما تعداد منضبط اليوم) + علم مخازن الأمانة. - المحاسبة: عمودا نوع ومدير مركز التكلفة + بذر حسابات WIP والمحمَّل والانحرافات + طريقة إهلاك بالاستخدام
UnitsOfProductionلقيود إهلاك العُدد (سجل الأصول الثابتة والموازنات موجودان ويُعاد استخدامهما كما هما). - المشتريات: استخلاص
CreatePurchaseRequestكـ Action قابل للنداء من MRP. - المبيعات: عمود
promised_dateفقط (اسم قانوني وحيد — قرار D-16). - QMS وCMMS: قيد مفتاح
production_order_idوعمودoperation_noفي QMS؛ مغذّي قراءات عداد الدورات في CMMS + مدخل قراءة فقطGetDowntimeWindowsلخصم الأعطال من طاقة CRP بلا قراءة جداول مباشرة. - الموارد البشرية: Action جديد بملكية HRM
RecordPieceworkEntry+ جدول ترحيلي تملكه HRM لأجر القطعة (المرحلة 6)؛ حقول معدل الأجر مؤجلة — الإصدار الأول يعتمد معدلات مركز العمل.
واجهة Angular — توسعة features/production
تبقى المجموعة على المسار production بنفس حارسي moduleGuard/permissionGuard، وتضاف مجلدات: routings, tools, planning/{mps,mrp,crp}, execution/{issues,confirmations,receipts}, shop-floor (محطة لمسية مستنسخة من نمط pos-layout مع لوحة مشرف حية) وcosting للانحرافات وتحليل باريتو — بإعادة استخدام مكونات data-table/form-dialog/print المشتركة ومفاتيح ترجمة إنجليزية أولاً.
تحليل الفجوات: الناقص في الـ ERP وفي التحليل نفسه (Gap Analysis (Both Directions))
إجابة مباشرة على سؤال الإدارة «إيه اللي ناقص؟» في اتجاهين: الاتجاه (A) ما ينقص نظام Moon ERP اليوم لاستضافة وحدة التصنيع كما تحددها الوثيقة، والاتجاه (B) ما أغفلته وثيقة التحليل نفسها ويجب استدراكه كتابةً قبل بدء التنفيذ. كل فجوة مصنّفة بدرجة الخطورة (حرجة / مهمة / تحسينية) مع العلاج المقترح وحجم الجهد (S = أيام، M = حتى ٣ أسابيع، L = أكثر من ٣ أسابيع) — تنبيه: هذا مقياس للفجوات المفردة ويختلف عن مقياس المراحل في خارطة الطريق (S ≈ أسبوع، M ≈ 2–4 أسابيع، L ≈ 4–8 أسابيع)، فلا تُسقطوا أحدهما على الآخر عند التقدير. الخلاصة: القضبان المالية والمخزنية موجودة ومجرّبة، لكن أسلاك الربط بينها وبين الإنتاج غائبة بالكامل؛ والوثيقة ممتازة في القلب لكنها صامتة عند الحواف التشغيلية.
المنهجية: وما الذي فحصناه واستبعدناه لأنه موجود فعلاً
قبل إعلان أي فجوة تحققنا منها في الكود الفعلي. عدة مرشّحين ثبت أنهم ليسوا فجوات لأن البنية موجودة ومجرّبة، وهذا بحد ذاته خبر إيجابي للإدارة:
- محرك تحويل وحدات القياس موجود وقوي:
unit_groupsوunitsبمعامل تحويل دقيق، وتحويلات لكل منتج فيproduct_units— لا حاجة لبناء جديد، فقط سياسة استخدام (انظر B1). - مراكز التكلفة على القيود موجودة: جدول
cost_centersهرمي، والبعد التحليليjournal_entry_lines.cost_center_idمفعّل في التقارير، مع خدمة توزيعCostAllocationServiceجاهزة. - قضبان الحوكمة موروثة مجاناً: ترقيم المستندات
SequenceService، عزل الشركاتBaseModel/TenantAware، نطاق الفروعDataScope، سجل الصلاحياتPermissionDependencyRegistry، والمرفقات والتدقيق — كلها مثبتة بوحدة المختبرات. - طبقة الجودة لا تُبنى من جديد: وحدة QMS القائمة تغطيها — جدولا
qms_inspection_plansوqms_inspectionsيحملان أصلاً عمودproduction_order_idبانتظار وحدة التصنيع، أما عدم المطابقةqms_non_conformancesفترتبط عبرinspection_idفقط. - موازنات مراكز التكلفة موجودة (تدقيق كود): جدولا
budgetsوbudget_linesفي المحاسبة يحملان موازنة شهرية m1–m12 لكل حساب ومركز تكلفة — تُعاد كما هي لتغذية انحراف FOVV؛ الناقص الوحيد حجم الإنتاج الموازني (A25). - سجل الأصول الثابتة موجود (تدقيق كود):
fixed_assetsمع فئات وقيود إهلاك وخدمة كاملة — يبقى فقط إضافة طريقة إهلاك بالاستخدام لإهلاك القوالب (A26). - وعود التسليم ATP/CTP ليست فجوة في الوثيقة: الملف الثاني يحددها بالكامل؛ الفجوة في جانب Moon فقط (حقل استقبال التاريخ الموعود في المبيعات — A14).
الاتجاه A — ما ينقص Moon ERP: الفجوات الحرجة الاثنتا عشرة
القاسم المشترك في الفجوات الحرجة: وحدة الإنتاج الحالية هيكل عظمي نظيف لكنه معزول مالياً ومخزنياً — لا يرحّل قيداً واحداً ولا يحرّك صنفاً واحداً.
| # | الفجوة | ماذا ينقص ولماذا يهم | العلاج المقترح | الحجم |
|---|---|---|---|---|
| A1 | حرجة لا ترحيل محاسبي من الإنتاج إطلاقاً | لا يوجد أي استدعاء لـCreateJournalEntry في وحدة الإنتاج؛ سلسلة قيود الإنتاج تحت التشغيل (صرف خامات / أجور وأعباء / استلام تام / تسوية انحرافات) غير موجودة. النتيجة: الإنتاج غير مرئي مالياً والدفاتر خاطئة عند أي إقفال شهري. | أربعة Actions ترحيلية تستدعي Modules\Accounting\Actions\CreateJournalEntry بنمط PostLabInvoice المجرّب — بلا أي تعديل على وحدة المحاسبة. | L |
| A2 | حرجة الإنتاج لا يحرّك المخزون | دوال الصرف والإنتاج تعدّل أعمدة كميات داخلية فقط؛ أعمدة المخازن source/target_warehouse_id ميتة. أرصدة المخزون تصبح خاطئة من أول أمر تشغيل. | ربط الصرف بـApproveIssue والاستلام بـApproveReceipt بنفس نمط استلام المشتريات GRN القائم. | M |
| A3 | حرجة طبقة التخطيط غائبة كلياً (MPS / MRP / CRP) | لا جداول ولا محرك تخطيط ولا جدول ربط طلب-توريد (Pegging). بدونها تتحول الوحدة إلى إدخال أوامر يدوي بلا شراء تلقائي ولا فحص طاقة ولا وعود تسليم. | بناء طبقة التخطيط طبقاً للملف الثاني فوق مصادر البيانات القائمة (المبيعات، الأرصدة، أوامر الشراء). | L |
| A4 | حرجة تتبع الدفعات (Lot/Batch) ليس كياناً أولياً | المسلسل Serial مكتمل، لكن رقم الدفعة نص حر على بنود المستندات فقط؛ لا أرصدة على مستوى الدفعة ولا شجرة نسب (أي خامة دخلت أي منتج) ولا صرف FEFO. يستحيل الاستدعاء Recall والتتبع. | جدول دفعات رئيسي + أرصدة بالدفعة + جدول نسب يُكتب عند الصرف والاستلام + StockService واعٍ بالدفعات. | L |
| A5 | حرجة منطق حجز المخزون غير موجود | العمود reserved_quantity موجود لكن لا كود يكتبه؛ أمران يمكنهما وعد نفس المخزون. الوثيقة تشترط الحجز عند اعتماد الأمر والاستهلاك عند الصرف. | إضافة StockService::reserve()/release() — الخطّاف جاهز والمطلوب منطق فقط. | S |
| A6 | حرجة بطاقة الصنف بلا حقول تصنيعية | لا تصنيف خام/تحت تشغيل/تام، لا procurement_type (تصنيع/شراء)، لا material_ownership (ملك/عميل)، ولا تكلفة معيارية مفصّلة — وكل تفرعات الوثيقة تعتمد عليها. | جدول امتداد mfg_item_mrp_settings (الاسم القانوني في الخريطة) + جدول mfg_standard_costs فوق بطاقة الصنف المشتركة. | M |
| A7 | حرجة لا تكلفة معيارية ولا محرك انحرافات | التقييم الحالي FIFO ومتوسط مرجّح فقط؛ الانحرافات السبعة (سعر وكمية المواد، الأجور، الأعباء…) — أثمن مخرجات الوحدة بنص الوثيقة — غير مدعومة. | محرك انحرافات يعمل عند إقفال الأمر وشهرياً قبل CloseFiscalPeriod، مع تأسيس الحسابات عبر AutoAccountService ومفاتيح إعدادات production.*_account_id (فضاء الإعدادات الوحيد للوحدة طبقاً لقرار التوسعة D-01). | L |
| A8 | حرجة لا تقويم تشغيلي/ورديات لمراكز العمل | مراكز الإنتاج تحمل طاقة بالساعة فقط بلا تقويم أو ورديات أو عطلات؛ كل حسابات الطاقة CRP/CTP بدونه أرقام وهمية. | جداول mfg_work_calendars + mfg_calendar_shifts (الاسمان القانونيان في الخريطة) واشتقاق الطاقة الفعلية لكل فترة. | M |
| A9 | حرجة إصدارات BOM ومسار التشغيل واللقطة المجمّدة | الإصدار نص حر بلا تواريخ سريان، لا كيان Routing مستقل، ولا لقطة مجمّدة عند الاعتماد — فتعديل بيانات أساسية لاحق يغيّر أوامر معتمدة ويهدم سلامة التكاليف والتدقيق. | جداول mfg_routing_headers/_operations مُصدّرة، ونسخ لقطة عند الانتقال Planned→Released، ومواءمة آلة حالات الأمر مع الوثيقة. | M–L |
| A10 | حرجة كيان العُدّة/الإسطمبة وعدّادات الأشواط | لا كيان Tool في الإنتاج، ووحدة الصيانة CMMS تدعم صيانة بالعداد لكن بلا جدول قراءات يراكم الأشواط. في مصانع القولبة الإسطمبة هي القيد الحاكم، وإهلاكها بالاستخدام لا بالزمن. | جدول mfg_tools مرتبط بـcmms_assets + جدول قراءات cmms_asset_meters يتغذى من تأكيدات التشغيل. | M |
| A23 | حرجة مُسبّب تكلفة الأعباء بلا موضع تخزين | المواصفة تجعل cost_driver (ساعات عمالة/ساعات آلة/تكلفة مواد/وحدات منتجة) مقام معدل تحميل الأعباء، ولا يوجد أي عمود أو جدول يخزّن أي مُسبّب يخص مركز العمل — فقيد الأعباء عند التأكيد (المُسبّب × المعدل) غير قابل للحساب كما هو منصوص. | عمود cost_driver على production_centers (لكل مركز عمل)، يُجدول مع توسعة مراكز العمل في المرحلة 2. | S |
| A24 | حرجة أعمدة طاقة ومعدلات مراكز العمل غائبة وغير مجدولة | production_centers ينقصه نحو 14 عموداً تتطلبها الخريطة (طاقة يومية، مضاعِف، كفاءة، استغلال، معدلات تجهيز/عمالة/آلة، labor_calc، تقويم…) — المرحلة 2 ترحّل التكاليف من معدلاته والمرحلة 4 تحسب الطاقة الفعلية منها، ولم تكن مجدولة في أي مرحلة. | جدولة صريحة: أعمدة المعدلات والطاقة والمُسبّب في المرحلة 2، وعمود التقويم في المرحلة 4 (المرحلة 1 تضيف cost_center_id فقط). | M |
الاتجاه A — الفجوات المهمة والتحسينية
| # | الخطورة | الفجوة | العلاج المقترح | الحجم |
|---|---|---|---|---|
| A11 | مهمة | لا يوجد Action برمجي لإنشاء طلبات الشراء — MRP لا يستطيع توليد الاحتياجات آلياً | استخلاص Purchases\Actions\CreatePurchaseRequest ثم المسار القائم طلب ← أمر شراء | S |
| A12 | مهمة | محرك الموافقات لا يغطي الإنتاج — ApprovalModule يعرف المبيعات والمشتريات فقط | إضافة حالة Production للمحرك القائم | S |
| A13 | مهمة | لا معدل أجر/قطعة مخزّن في الموارد البشرية (الراتب الأساسي فقط، والساعة تُشتق وقت المرتبات) | معدل الأجر على مركز العمل (نهج الوثيقة) مع إمكانية تجاوز لكل موظف؛ كميات القطعة تعود للمرتبات | S |
| A14 | مهمة | المبيعات بلا حقل لاستقبال تاريخ التسليم الموعود من التخطيط | إضافة الحقل وAction يكتبه عائداً من CTP | S |
| A15 | مهمة | لا وعاء ملكية لخامات العميل (تشغيل للغير) — الوثيقة تشترط مخزوناً محفوظاً غير مُقيَّم وغير قابل للشراء | مخازن أمانات بعلم is_consignment غير مُقيَّمة وغير قابلة للشراء (نهج الخريطة — D-15)؛ بُعد الملكية الكامل مؤجل | M |
| A16 | مهمة | وحدة الإنتاج بلا أحداث نطاق ولا Actions ولا اختبار واحد — مخالفة لوصفة البيت المعمارية | عمود أحداث (OrderReleased، OperationCompleted…) + مستمعين + تغطية اختبارات | M |
| A17 | مهمة | لا شاشة صالة إنتاج لمسية ولا قناة بث لحظي للواجهة | استنساخ نمط شاشة نقاط البيع pos-layout + قناة بث للطابور الجاهز ولوحة المشرف | M |
| A18 | مهمة | مراكز التكلفة بلا تصنيف (إنتاجي/خدمي/مساعد) ولا ربط مركز عمل ← مركز تكلفة | عمود type + مفتاح ربط على production_centers | S |
| A25 | مهمة | مدخل حجم الموازنة لانحراف FOVV غائب — موازنة الإنفاق موجودة فعلاً (budgets/budget_lines بمبالغ شهرية لكل مركز تكلفة) لكن لا موضع لحجم الإنتاج الموازني | إعادة استخدام budget_lines + عمود budgeted_monthly_volume على مركز العمل؛ بلا موازنة معتمدة يُعلَن 6 انحرافات فقط (D-22) | S |
| A26 | مهمة | طريقة الإهلاك بالاستخدام غائبة في المحاسبة — سجل الأصول الثابتة نفسه موجود ومتحقق منه، والطرق الحالية قسط ثابت/متناقص/مُعجَّل فقط | حالة UnitsOfProduction في تعداد طرق الإهلاك + توليد قيد الإهلاك من قراءات عداد الأشواط (شرط مسبق للمرحلة 2) | M |
| A27 | مهمة | تعدادا أنواع المرجعية في المخزون (ReceiptReferenceType/IssueReferenceType) منضبطان ولا يعرفان الإنتاج — المرجعية production_order تتطلب توسعتهما | إضافة حالة ProductionOrder للتعدادين مع أنواع الحركة (A19) | S |
| A19 | تحسينية | أنواع حركات مخزنية خاصة بالإنتاج غير معرّفة | إعادة استخدام صرف/استلام بمرجع production_order في النسخة الأولى | S |
| A20 | تحسينية | لا نموذج مواقع/أرفف تحت المخزن لمناطق التجهيز | تمثيل المواقع كمخازن فرعية في النسخة الأولى | M |
| A21 | تحسينية | طباعة باركود الدفعات وبطاقات تتبع الأوامر | قوالب جديدة فوق خدمة الطباعة القائمة | S |
| A22 | تحسينية | توزيع تكاليف الأقسام الخدمية بطريقة مباشرة فقط (لا تنازلي/تبادلي) | الاكتفاء بالمباشر في النسخة الأولى | M |
الاتجاه B — ما أغفلته الوثيقة نفسها: نقد خبير قبل التنفيذ
الوثيقة محكمة في القلب (تخطيط، تنفيذ، تكاليف) لكنها صامتة عند الحواف التشغيلية التي يصطدم بها أي مصنع حقيقي في الشهر الأول. كل بند أدناه يجب حسمه كملحق مكتوب قبل بدء خطوات البناء، وإلا عاد كإعادة عمل مكلفة في طبقتي التنفيذ والتكاليف.
| # | الخطورة | ما أغفلته الوثيقة ولماذا يهم | العلاج المقترح | الحجم |
|---|---|---|---|---|
| B1 | حرجة | سياسة تحويل وحدات القياس غير منصوصة (كجم بودرة ← عدد أطباق): الوثيقة تفترض أن النظام المضيف يتكفل بها دون تحديد نقاط التطبيق أو التقريب | ملحق سياسة من صفحة واحدة يربط محرك units/product_units القائم بكل نقطة لمس (تفجير BOM، صرف، تكلفة) | S |
| B2 | حرجة | تتبع نسب الدفعات (أي خامة دخلت أي منتج) غائب كقاعدة عابرة رغم أن الدرجات والتشغيل للغير يستلزمانه | إضافة قاعدة تتبع + جدول نسب لنموذج البيانات (مقترن بـ A4) | M |
| B3 | حرجة | العمليات المُسنَدة للخارج غير ممثلة: الوثيقة تغطي تشغيل خامات العميل لدينا فقط، ولا تغطي إرسال عمليتنا للخارج (طلاء، طباعة…) — وهو شائع جداً | نوع عملية Subcontract + ربط بأمر شراء خدمة + وعاء «تحت تشغيل لدى مورد» | M |
| B4 | حرجة | كيان التقويم التشغيلي/الورديات غير معرّف رغم أن كل حسابات الطاقة والوعود تعتمد عليه (مؤجل مع الجدولة المتقدمة خطأً) | تخصيص كيان التقويم الآن وعدم انتظار مرحلة APS (مقترن بـ A8) | M |
| B5 | مهمة | تدفق إعادة التشغيل Rework اسم في تعداد فقط: لا آلية لتوليد أمر إعادة ولا تكلفته ولا عودته للمسار | ملحق تدفق إعادة التشغيل وتكلفته (تالف طبيعي/غير طبيعي) | M |
| B6 | مهمة | لا تمييز بين المنتجات المشتركة والمنتجات الثانوية، ولا تهيئة لطريقة توزيع التكلفة (قيمة سوقية / وحدات / نسبة ثابتة) | هيكل مخرجات على BOM + تعداد طرق توزيع قابلة للتهيئة | M |
| B7 | مهمة | دلالات العكس Reversal لمستندات الصرف/التأكيد/الاستلام مذكورة كحالة بلا خوارزمية (ماذا يُرَدّ للمخزون؟ ماذا يُعكَس محاسبياً؟) | تعريف خوارزمية عكس لكل مستند وشروطها المسبقة | S |
| B8 | مهمة | سلوك الصرف الآلي Backflush عند نقص الرصيد غير محدد (منع التأكيد؟ سالب؟ جزئي؟) | سياسة مربوطة بعلم allow_negative_stock لكل مخزن | S |
| B9 | مهمة | لا نسبة سماح للإنتاج الزائد/الناقص ولا قاعدة إقفال تلقائي ولا معالجة WIP بين الاستلامات الجزئية | نسبة سماح قابلة للتهيئة + قاعدة إقفال موثقة | S |
| B10 | مهمة | سياسة توزيع جدول الربط Pegging عند العجز وإعادة الربط عند إعادة التخطيط غير معرّفتين | قاعدة أولوية + قاعدة إعادة ربط عند كل دورة MRP | S |
| B11 | مهمة | غموض تعدد المخازن/المصانع: MPS يحمل مصنعاً لكن MRP يصفّي رصيداً واحداً بلا بُعد مخزن | قرار تصفية لكل مخزن متوائم مع نموذج الفروع والمخازن في Moon | M |
| B12 | مهمة | لا مصدر للتنبؤ بالطلب: MPS يستهلك توقعات لا أحد ينتجها، وMoon بلا وحدة تنبؤ | شاشة إدخال/استيراد توقعات يدوية في النسخة الأولى | M |
| B13 | مهمة | إدارة التغيير الهندسي ECO مُسمّاة كشرط حوكمة لكن بلا كيان أو تدفق (مرحلة مستقبلية) | الإصدارات + موافقات ApprovalModule::Production كبديل خفيف مؤقت | M |
| B14 | مهمة | مرتجع الخامات من الصالة للمخزن (فائض الصرف) غير ممثل — مستند قياسي في أي نظام تنفيذ | مستند مرتجع إنتاج (عكس صرف بقيد دائن على WIP) | S |
| B15 | مهمة | طبقة الصالة بلا أعطال ولا إيقاف/استئناف ولا إنذار Andon، وOEE مذكور بلا معادلة | حالة Paused + سجل توقفات بسيط الآن؛ OEE مرحلة لاحقة | M |
| B16 | مهمة | مصير الانحرافات عند الإقفال (مصروف أم توزيع على المخزون؟) وإجراء مراجعة التكلفة المعيارية وإعادة تقييم الرصيد غير محددين | سياسة «مصروف على قائمة الدخل» للنسخة الأولى + إجراء إعادة تقييم موثق | S |
| B17 | مهمة | ملكية مراكز التكلفة غامضة: الوثيقة تدرجها ككيان تصنيعي بينما المحاسبة في Moon تملكها فعلاً | قرار صريح: المحاسبة هي مصدر الحقيقة والتصنيع يرتبط فقط | S |
| B18 | مهمة | فوترة أجر التشغيل للغير ونقطة الفاتورة الإلكترونية متجاهلتان رغم أنهما التزام تنظيمي | فاتورة خدمة عبر المبيعات تمر بوحدة EInvoicing القائمة | S |
| B19 | تحسينية | أساس عملة التكلفة غير محدد رغم تعدد العملات في النظام | إعلان التكاليف المعيارية بالعملة الأساسية فقط | S |
| B20 | تحسينية | لا إجراء جرد فعلي للإنتاج تحت التشغيل نهاية الفترة | إجراء جرد WIP دوري لاحقاً | M |
| B21 | تحسينية | تسلسل المنتج التام غير مطروح رغم جاهزية product_serials | تسلسل اختياري للتام عند الاستلام | S |
| B22 | تحسينية | خطط المعاينة بالعينات AQL غير محددة (الجودة مؤجلة كلياً للوثيقة وQMS يغطي الوجهة) | امتداد QMS لاحق | S |
| B23 | تحسينية | لا متطلبات تعريب/RTL إطلاقاً في الوثيقة | فرض عرف Moon (name_ar ومفاتيح ترجمة) على كل الكيانات الـ26 | S |
| B24 | تحسينية | لا حزمة تقارير سوى باريتو الانحرافات (لا أعمار WIP ولا كشف تكلفة أمر ولا تحميل طاقة ولا تحليل تالف) | قائمة تقارير معتمدة للنسخة الأولى | M |
| B25 | تحسينية | دلالات BOM الوهمي Phantom وبنية الأصناف البديلة مُسمّاة بلا تعريف | ملحق يحدد التفجير العابر وأولوية/نسب البدائل | S |
جدول المخاطر الموحّد (الفجوات الحرجة والمهمة)
ترتيب تنفيذي مقترح: الفجوات الحرجة في الاتجاه A هي مسار البناء نفسه، أما فجوات الاتجاه B الحرجة والمهمة فيجب حسمها كملاحق مكتوبة قبل بدء خطوات البناء الاثنتي عشرة — كلفة حسمها اليوم صفحات، وكلفة تجاهلها إعادة بناء طبقتي التنفيذ والتكاليف.
| الفجوة | الاتجاه | الخطورة | العلاج | الحجم |
|---|---|---|---|---|
| الترحيل المحاسبي من الإنتاج (A1) | A | حرجة | Actions فوق CreateJournalEntry بنمط LIS | L |
| تحريك المخزون من الإنتاج (A2) | A | حرجة | ربط ApproveIssue/ApproveReceipt بنمط GRN | M |
| طبقة التخطيط MPS/MRP/CRP (A3) | A | حرجة | بناء كامل طبقاً للملف الثاني | L |
| الدفعات والنسب والتتبع (A4+B2) | A+B | حرجة | دفعات أولية + شجرة نسب + FEFO | L |
| منطق الحجز (A5) | A | حرجة | reserve()/release() — الخطّاف جاهز | S |
| حقول الصنف التصنيعية (A6) | A | حرجة | جداول امتداد فوق بطاقة الصنف | M |
| التكلفة المعيارية والانحرافات السبعة (A7) | A | حرجة | محرك انحرافات قبل إقفال الفترة | L |
| التقويم التشغيلي والورديات (A8+B4) | A+B | حرجة | كيان تقويم الآن دون انتظار APS | M |
| الإصدارات واللقطة المجمّدة (A9) | A | حرجة | Routing مُصدَّر + لقطة عند الاعتماد | M–L |
| العُدد والإسطمبات وعدّادات الأشواط (A10) | A | حرجة | mfg_tools + قراءات عدادات في CMMS | M |
| موضع مُسبّب تكلفة الأعباء (A23) | A | حرجة | عمود cost_driver على مركز العمل (المرحلة 2) | S |
| أعمدة طاقة ومعدلات مراكز العمل (A24) | A | حرجة | جدولة التوسعة: المعدلات بالمرحلة 2 والتقويم بالمرحلة 4 | M |
| سياسة تحويل الوحدات (B1) | B | حرجة | ملحق سياسة فوق المحرك القائم | S |
| الإسناد الخارجي للعمليات (B3) | B | حرجة | نوع عملية + أمر شراء خدمة + WIP لدى مورد | M |
| طلبات شراء آلية من MRP (A11) | A | مهمة | استخلاص CreatePurchaseRequest | S |
| موافقات الإنتاج (A12+B13) | A+B | مهمة | توسيع ApprovalModule كبديل ECO مؤقت | S–M |
| مصدر معدل الأجور (A13) | A | مهمة | المعدل على مركز العمل + تجاوز اختياري | S |
| إرجاع الموعد للمبيعات (A14) | A | مهمة | حقل + Action كتابة عائدة | S |
| وعاء أمانات العميل (A15) | A | مهمة | بُعد ملكية / مخازن أمانات صفرية القيمة | M |
| الأحداث والاختبارات في الوحدة (A16) | A | مهمة | عمود أحداث + مستمعون + تغطية | M |
| شاشة الصالة والبث اللحظي (A17) | A | مهمة | استنساخ pos-layout + قناة بث | M |
| تصنيف مراكز التكلفة وملكيتها (A18+B17) | A+B | مهمة | عمود نوع + قرار: المحاسبة هي المصدر | S |
| إعادة التشغيل Rework (B5) | B | مهمة | ملحق تدفق وتكلفة إعادة التشغيل | M |
| مشترك/ثانوي وطرق التوزيع (B6) | B | مهمة | هيكل مخرجات + تعداد طرق | M |
| دلالات العكس (B7) | B | مهمة | خوارزمية عكس لكل مستند | S |
| عجز الصرف الآلي (B8) | B | مهمة | سياسة مربوطة بعلم المخزن | S |
| سماحيات الزيادة/النقص والإقفال (B9) | B | مهمة | نسب سماح قابلة للتهيئة | S |
| سياسة جدول الربط Pegging (B10) | B | مهمة | قاعدة أولوية + إعادة ربط | S |
| تصفية متعددة المخازن (B11) | B | مهمة | قرار تصفية لكل مخزن | M |
| مصدر التنبؤ بالطلب (B12) | B | مهمة | إدخال/استيراد يدوي أولاً | M |
| مرتجع الصالة للمخزن (B14) | B | مهمة | مستند مرتجع إنتاج | S |
| الأعطال والإيقاف وOEE (B15) | B | مهمة | حالة إيقاف + سجل توقفات الآن | M |
| مصير الانحرافات ومراجعة المعياري (B16) | B | مهمة | سياسة مصروف + إجراء إعادة تقييم | S |
| فوترة أجر التشغيل والفاتورة الإلكترونية (B18) | B | مهمة | فاتورة خدمة عبر EInvoicing | S |
| حجم الموازنة لانحراف FOVV (A25) | A | مهمة | إعادة استخدام budget_lines + عمود حجم موازني؛ وإلا 6 انحرافات | S |
| إهلاك بالاستخدام للقوالب (A26) | A | مهمة | حالة UnitsOfProduction + قيد إهلاك من العداد | M |
| تعدادا مرجعية المخزون (A27) | A | مهمة | حالة ProductionOrder على التعدادين | S |
الخلاصة للإدارة: لا توجد فجوة واحدة تستدعي تعديلاً جوهرياً في وحدات المحاسبة أو المخزون أو المشتريات — القضبان موجودة ومجرّبة، والعمل الحرج كله «أسلاك ربط» تُبنى داخل وحدة التصنيع نفسها. أما الوثيقة فتُعتمد كما هي بشرط إلحاق الملاحق القصيرة التي تحسم الحواف التشغيلية (الإسناد الخارجي، إعادة التشغيل، المرتجعات، العكوس، التقويم، التتبع، السماحيات) قبل اليوم الأول من التنفيذ — وقد جُدولت كتابتها الآن في مسار ملاحق المرحلة 0 بخارطة الطريق (المالك: مهندس المنتج + خبير المصنع، مدة أسبوع، بوابة إلزامية قبل خروج المرحلة 1).
عقود التكامل: كيف يتفاعل التصنيع مع كل موديول (Integration Contracts)
يحدّد هذا القسم العقود الملزمة بين وحدة التصنيع وكل وحدة قائمة في النظام، باتباع الوصفة المُجرَّبة في وحدة المختبرات: الاستدعاءات الأمامية عبر Actions، والتفاعلات الخلفية عبر الأحداث (Events). الخلاصة الإدارية: التصنيع يعتمد على ثماني وحدات قائمة ولا تعتمد عليه أي وحدة؛ نقاط البيع والمتجر الإلكتروني والفوترة الإلكترونية بلا أي ارتباط مباشر — يصلهم أثر التصنيع عبر المخزون والمبيعات فقط. المطلوب بناؤه عند الجيران محدود: سبعة مداخل خدمية رقيقة فقط، والباقي قضبان جاهزة ومُجرَّبة. هوية الوحدة الملزمة لكل عقد أدناه (القرار D-01): طبقة التصنيع تعيش داخل Modules/Production الموسَّعة — بادئة الصلاحيات production.*، مفتاح الترقيم production (موصول أصلاً)، وفضاء الإعدادات production.*، ومراكز العمل هي production_centers الموسَّعة لا جدولاً جديداً.
القاعدتان الحاكمتان
- للأمام = استدعاء متزامن: عندما يحتاج التصنيع شيئاً من وحدة أخرى يستدعي
Actionمعتمداً لديها داخل نفس المعاملة — لا اتصال HTTP ولا كتابة مباشرة في جداول الغير. - للخلف = حدث نطاقي: لا تستورد أي وحدة قائمة كود التصنيع إطلاقاً؛ كل ردود الفعل تُنفَّذ كمستمعين داخل وحدة التصنيع نفسها يستدعون
Actionsالوحدات المستهدفة، فيبقى اتجاه الاعتماد دائماً خارجاً من التصنيع.
مصفوفة التفاعل مع كل موديول
| الموديول | ماذا يأخذ منه التصنيع | ماذا يعطيه | الآلية |
|---|---|---|---|
| النواة (Core) | دليل الأصناف products، وحدات القياس والتحويلات product_units، الترقيم SequenceService، الإعدادات، نطاق الفروع، المرفقات، الموافقات | جدول امتداد إعدادات الصنف التصنيعية mfg_item_mrp_settings، تسجيل مساهم صلاحيات على البادئة القائمة production، إضافة حالة ApprovalModule::Production | قراءة + خدمات للأمام، وتسجيل عند الإقلاع |
| المخزون (Inventory) | StockService للتسعير قراءةً فقط (getIssueCost/getProductCost)، وإجراءا ApproveIssue وApproveReceipt هما قناة تغيير الأرصدة الوحيدة — لا استدعاء مباشر لزيادة أو إنقاص رصيد بلا مستند، أرصدة التوفر، المستودعات | حجوزات المواد عند الإصدار (بناء جديد reserve/release)، صرف خام ← تحت التشغيل، استلام تام بتكلفة مُجمَّعة، مخازن أمانة بعلم is_consignment لمواد العميل (Toll — قرار D-15) | Actions للأمام + مرجعية reference_type='production_order' + إضافة حالة ProductionOrder لتعدادي أنواع المرجعية |
| المشتريات (Purchases) | أوامر الشراء المفتوحة كعرض زمني لاحتساب صافي الاحتياج (MRP) | طلبات شراء آلية من تخطيط الاحتياجات تدخل دورة الاعتماد والتحويل القائمة | Action جديد رقيق CreatePurchaseRequest يُستدعى للأمام |
| المبيعات (Sales) | أوامر البيع المؤكدة = مصدر الطلب لخطة الإنتاج الرئيسية، ومحفّز أوامر التصنيع حسب الطلب | تاريخ تسليم موعود محسوب بالطاقة (CTP) يُكتب رجوعاً في عمود promised_date (الاسم القانوني الوحيد — D-16)، وربط الطلب بالعرض عبر جدول mfg_peggings المملوك للتصنيع | FK على جانب التصنيع فقط + Action جديد SetPromisedDate |
| الحسابات (Accounting) | قناة القيد الوحيدة CreateJournalEntry، مراكز التكلفة وبُعد السطر، توزيع الخدمات CostAllocationService، زرع الحسابات، إغلاق الفترات | خمس عائلات قيود لكل أمر إنتاج + قيد امتصاص الأعباء الشهري، كل قيد موسوم بـsource_type='production_order' ومركز التكلفة | Action للأمام حصراً؛ التسوية قبل CloseFiscalPeriod |
| الموارد البشرية (HRM) | سلسلة هوية المشغّل employees.user_id، الورديات والحضور؛ معدل الأجر في الإصدار الأول من مركز العمل labor_cost_rate (قرار D-06)، وحقول معدلات HRM مؤجلة كتجاوز اختياري لاحق | كميات أجر القطعة المؤكدة لكل موظف لتغذية الرواتب، وساعات العمل الفعلية | مستمع داخل التصنيع يستدعي Action جديداً بملكية HRM (RecordPieceworkEntry) يكتب جدولاً تملكه HRM (hrm_piecework_entries) تقرؤه الرواتب — لا تقرأ HRM أي جدول mfg_* إطلاقاً |
| الجودة (QMS) | نتائج الفحص التي تحكم تقدّم العملية وحالة جودة الاستلام (مفرج/معلّق/مرفوض) | طلبات فحص أثناء التشغيل للعمليات الموسومة inspection_required، وبلاغات عدم مطابقة عند تجاوز عتبة الخردة | Actions جديدة CreateInspection/CreateNonConformance؛ الجداول جاهزة بعمود production_order_id |
| الصيانة (CMMS) | سجل أصول الماكينات والقوالب cmms_assets، جداول الصيانة الوقائية بالعداد، ساعات التوقف لخصمها من الطاقة المتاحة | عدادات أشواط القوالب التراكمية بعد كل تأكيد، وإطلاق أمر صيانة وقائية عند بلوغ العتبة | FK على جانب التصنيع + Actions جديدة RecordMeterReading/CreateWorkOrder وجدول عدادات جديد + مدخل قراءة فقط GetDowntimeWindows يستهلكه CRP بدل أي قراءة مباشرة لجداول الصيانة |
| نقاط البيع والمتجر (POS/WebStore) | — | توفر المنتج التام بشكل غير مباشر فقط: الاستلام يرفع رصيد المخزون الذي يقرآنه أصلاً | صفر ارتباط مباشر — المخزون هو الوسيط |
| الفوترة الإلكترونية (EInvoicing) | — | لا شيء مباشر؛ فاتورة أجر التشغيل لحساب الغير (Toll) تصدر كفاتورة مبيعات عادية وتمر عبر القناة القائمة | صفر ارتباط مباشر — المبيعات هي الوسيط |
عقود الأحداث المسماة
| الحدث | المُصدِر | المستهلكون | أهم حقول الحمولة |
|---|---|---|---|
ProductionOrderReleased | إصدار أمر الإنتاج (مع تجميد نسخة BOM والمسار) | حجز المواد، تجهيز خطط الفحص، إدراج أول عملية في طابور المحطة | order_id, product_id, quantity, production_type, material_ownership, bom_snapshot_id, routing_snapshot_id |
MaterialIssued | ترحيل صرف المواد بعد ApproveIssue والقيد | مُجمِّع تكلفة تحت التشغيل، فك الحجز، تحديث النواقص ولوحة المتابعة | issue_id, order_id, operation_no, lines[product, qty, unit_cost, batch_no, ownership], journal_entry_id |
ConfirmationPosted | ترحيل تأكيد العملية (يرحّل أجور وأعباء مُحمَّلة) — الاسم القانوني الموحّد (قرار D-17) | التقدّم الآلي للعملية التالية (حدث OperationCompleted)، مراكمة أشواط القالب، تغذية أجر القطعة عبر RecordPieceworkEntry، تقييم الخردة لبلاغ عدم مطابقة | order_id, operation_no, work_center_id, tool_id, employee_id, yield[grade, qty], scrap_quantity, labor_hours, reason_code |
GoodsReceiptPosted | ترحيل استلام التام بعد ApproveReceipt والقيد | إيفاء الربط مع أوامر البيع، تحديث التوفر والوعود، متابعة بوابة الجودة المعلّقة | gr_id, order_id, lines[item, grade_code, qty, unit_cost, quality_status, batch_no], journal_entry_id |
ProductionOrderClosed | إقفال الأمر عبر CloseProductionOrder (احتساب الانحرافات السبعة وتصفير WIP) — الاسم القانوني الموحّد (قرار D-17) | توجيه الانحرافات للمسؤولين حسب النوع وحدود التفاوت، قائمة مراجعة المعايير، تقرير باريتو | order_id, variances[type, amount, percent, band, owner_role], journal_entry_id |
MoldShotCountReached | مُراكِم أشواط الأدوات عند بلوغ عتبة العداد | إطلاق أمر صيانة وقائية في CMMS وتحويل حالة القالب إلى صيانة (يُستبعد من الطاقة) | tool_id, cmms_asset_id, cycles_used, life_cycles, threshold |
MrpRunCompleted | تشغيل تخطيط الاحتياجات | إنشاء طلبات الشراء المخططة، إنشاء أوامر الإنتاج المخططة، رسائل الاستثناءات | mrp_run_id, planned_purchase_count, planned_order_count, exceptions[] |
المداخل المسماة التي يستدعيها التصنيع
| المدخل | الموديول | الحالة | الاستخدام |
|---|---|---|---|
CreateJournalEntry | الحسابات | جاهز ومُجرَّب | كل قيود دورة التكلفة الخمسة وقيد الامتصاص الشهري |
ApproveIssue / ApproveReceipt / StockService::getIssueCost | المخزون | جاهز | الصرف والاستلام والتسعير بطريقتي FIFO/المتوسط |
StockService::reserve/release | المخزون | بناء جديد | حجز المواد عند الإصدار وفكّه عند الصرف (العمود موجود بلا منطق) |
CreatePurchaseRequest | المشتريات | بناء جديد | تحويل مخرجات MRP إلى طلبات شراء داخل الدورة القائمة |
SetPromisedDate | المبيعات | بناء جديد | كتابة تاريخ التسليم الموعود المحسوب بالطاقة رجوعاً في promised_date |
CreateInspection / CreateNonConformance | الجودة | بناء جديد | بوابات الفحص أثناء التشغيل وعند الاستلام وبلاغات الخردة |
RecordMeterReading / CreateWorkOrder | الصيانة | بناء جديد | عدادات أشواط القوالب وأوامر الصيانة الوقائية |
GetDowntimeWindows | الصيانة | بناء جديد | مدخل قراءة فقط يخصم نوافذ الأعطال من طاقة CRP بلا قراءة جداول مباشرة |
RecordPieceworkEntry | الموارد البشرية | بناء جديد | تغذية أجر القطعة في جدول تملكه HRM تقرؤه الرواتب |
GetLaborRate | الموارد البشرية | مؤجل بعد الإصدار الأول | تجاوز اختياري لمعدل الموظف لاحقاً — الإصدار الأول يعتمد معدل مركز العمل (D-06) |
CostAllocationService / SequenceService / SettingsService | الحسابات / النواة | جاهز | توزيع مراكز الخدمة، الترقيم المستندي، ربط الحسابات بالإعدادات |
خريطة الترحيل المحاسبي لدورة التكلفة
- صرف المواد: مدين
WIP/ دائنمخزون الخام— بالكمية × تكلفة الصرف الفعلية — نوعproduction_material_issue. - الأجور المباشرة عند التأكيد: مدين
WIP/ دائنأجور مُحمَّلة— بالساعات × المعدل أو الكمية × أجر القطعة — نوعproduction_labor. - الأعباء الصناعية عند التأكيد: مدين
WIP/ دائنأعباء مُحمَّلة— بمُسبّب التكلفة × معدل التحميل (كلاهما على مركز العمل: عمودcost_driverالجديد ×overhead_rateالقائم) — نوعproduction_overhead؛ ومفاتيح الحسابات كلها في فضاءproduction.*الواحد الذي تبذره المرحلة 0 نفسها. - الخردة غير الطبيعية: مدين
مصروف خردة/ دائنWIP— نوعproduction_scrap. - استلام التام بالمعياري مع توزيع القيمة على الدرجات (A/B/C): مدين
مخزون التام/ دائنWIP— نوعproduction_receipt. - التسوية عند الإقفال: الرصيد المتبقي في
WIPيُحلَّل إلى الانحرافات السبعة (سعر واستخدام المواد ← المشتريات/الإنتاج، معدل وكفاءة العمالة ← الإنتاج، إنفاق وكفاءة الأعباء ← الإدارة، حجم الأعباء الثابتة ← المبيعات/الإدارة) ضمن حدود تفاوت: أقل من 2% طبيعي، 2–5% مراقبة، أكثر من 5% تحقيق — نوعproduction_variance. - نهاية الشهر: مطابقة الأعباء المُحمَّلة مع الفعلية بعد توزيع مراكز الخدمة، وترحيل الفرق لقائمة الدخل قبل إغلاق الفترة المالية.
في أوامر التشغيل لحساب الغير (Toll) لا يُقيَّد أي عنصر مواد — مواد العميل أمانة بلا قيمة دفترية، وWIP يحمل تكلفة التحويل فقط، والإيراد فاتورة أجر تشغيل عبر المبيعات تمر للفوترة الإلكترونية كالمعتاد.
قانون الاعتماد
- التصنيع يستورد للأمام ثماني وحدات؛ ولا تستورد أي وحدة التصنيع أبداً — كل ردود الفعل مستمعون داخل التصنيع يستدعون مداخل الوحدات الأخرى.
- مفاتيح الربط الخارجية تعيش على جانب التصنيع فقط:
mfg_peggings.sales_order_id،mfg_tools.cmms_asset_id/fixed_asset_id،production_centers.cost_center_id؛ ولا تقرأ أي وحدة أجنبية جدولmfg_*(تغذية الرواتب تُدفع إلى جدول تملكه HRM). - الأستاذ العام حصراً عبر
CreateJournalEntry، والمخزون حصراً عبرStockServiceوإجراءاته، والترقيم حصراً عبرSequenceService. - الأحداث تُطلق بعد نجاح المعاملة، والمستمعون قابلون لإعادة التنفيذ دون تكرار أثر.
خارطة الطريق: مراحل البناء بمخرجات قابلة للتشغيل (Build Roadmap)
خطة تنفيذ من ست مراحل تُوفّق بين ترتيب البناء الذي نصّت عليه المواصفة (12 خطوة في ملف التكامل) وبين الواقع الفعلي لـMoon ERP: موديول Modules/Production القائم بجداوله السبعة، وقضبان التكامل الجاهزة في المخزون والمحاسبة. كل مرحلة تنتهي بمُخرَج تشغيلي ملموس يستفيد منه المصنع فوراً — وليس مجرد طبقة تقنية مؤجّلة القيمة.
لماذا نخالف ترتيب المواصفة في ثلاث نقاط؟
المواصفة تضع «التكاملات» في الخطوة الأخيرة (12) وتبني التخطيط (MPS/MRP/CRP) قبل التنفيذ. قرارنا المدروس عكس ذلك في ثلاث نقاط، التزاماً بقاعدة المواصفة نفسها «كل حدث فعلي يُرحّل قيداً محاسبياً لحظياً» وبوصفة Moon ERP المجرَّبة:
- قلب 1 التكاملات تُنسَج داخل كل مرحلة منذ اليوم الأول (قيود عبر
Modules\Accounting\Actions\CreateJournalEntryوحركات مخزون عبرApproveIssue/ApproveReceipt) — لأن أكبر فجوة في الموديول الحالي هي بالضبط غياب الترحيل للمخزون والمحاسبة. - قلب 2 التنفيذ الفعلي (أوامر تشغيل بصرف واستلام حقيقيين) يسبق التخطيط: المصنع يستطيع العمل بأوامر يدوية مربحة دون MRP، لكن MRP لا يعمل أبداً دون أرصدة مخزون موثوقة وقوائم مكونات صحيحة.
- قلب 3 تأجيل MPS الكامل (استهلاك التنبؤات والأسوار الزمنية) لعدم وجود مصدر تنبؤات في النظام؛ نبدأ MRP من أوامر البيع المؤكدة
sales_ordersونقاط إعادة الطلب.
وقرار الاتجاه المعتمد: التوسعة في المكان — نمدّ موديول Modules/Production القائم ولا نعيد بناءه؛ لا توجد بيانات إنتاجية ولا مفاتيح خارجية واردة، والواجهة الأمامية وخريطة الـ19 صلاحية جاهزتان. التقدير: S ≈ أسبوع مطوّر، M ≈ 2–4 أسابيع، L ≈ 4–8 أسابيع — وهذا مقياس للمراحل ويختلف عن مقياس الفجوات المفردة في قسم الفجوات (S = أيام / M ≤ 3 أسابيع / L > 3 أسابيع)؛ لا يُسقط أحدهما على الآخر عند وضع الميزانية.
المراحل ومخرجاتها التشغيلية
| المرحلة | النطاق الأساسي | الموديولات المتأثرة | ماذا يستطيع المصنع فعله بعدها؟ | الحجم |
|---|---|---|---|---|
| 0 — التأسيس والتصليب | توحيد الهجرات الدفاعية الثلاث، إنشاء طبقات Actions/Events/Listeners الغائبة، تسجيل مساهم الصلاحيات production في PermissionDependencyRegistry، إضافة حالة Production إلى ApprovalModule، تفعيل BomStatus المعلَّق، بذر مفاتيح إعدادات فضاء production.* الوحيد (نفس الفضاء الذي تقرؤه إجراءات الترحيل لاحقاً)، وهيكلة اختبارات Pest — إضافةً إلى مسار ملاحق المواصفة: كتابة ملاحق الفجوات B1–B25 كلها (المالك: مهندس المنتج + خبير المصنع، مدة أسبوع بالتوازي، بوابة إلزامية قبل خروج المرحلة 1). |
Production, Core | لا مخرج تشغيلي — إزالة الدين الهندسي وتجهيز الأساس لكل ما بعده. | S |
| 1 — بيانات أساسية v2 + تنفيذ حقيقي ⭐ | BOM متعدد المستويات بإصدارات وتواريخ سريان وبدائل في جدول ابن mfg_bom_substitutes (لا JSON — قرار D-18)، آلة حالات الأمر Planned→Released→InProcess→Completed→Closed مع التجميد (Frozen Snapshot) عند الإطلاق، حجز المخزون، صرف مواد فعلي (خصم مخزون + قيد WIP) واستلام منتج تام بتكلفة فعلية مجمّعة (إضافة مخزون + قيد) عبر مستندي التصنيع mfg_material_issues/mfg_goods_receipts فوق قضبان المخزون (قرار نهائي D-19 — لا استخدام مباشر لمستندات المخزون)؛ حالة جودة الاستلام افتراضياً «مفرج عنه» حتى بوابات المرحلة 6 (D-21). إن انزلق الجدول يُقسَّم إلى 1أ (بيانات أساسية) و1ب (قضبان الترحيل). |
Production, Inventory, Accounting, Core | أول تشغيل حقيقي: أوامر إنتاج يدوية كاملة الدورة بمخزون صحيح وقيود محاسبية لحظية — يتوقف الموديول عن «الكذب» على المحاسبة. | L |
| 2 — التوجيه والقوالب والتأكيدات | كيانات mfg_routing_headers/operations المُصدَّرة (cavity_count، أزمنة الدورة)، توسعة production_centers بأعمدة الطاقة والمعدلات والمُسبّب (طاقة يومية، مضاعِف، كفاءة، استغلال، معدلات تجهيز/عمالة/آلة، labor_calc، cost_driver — كانت غير مجدولة في أي مرحلة)، سجل القوالب mfg_tools بعمر الدورات مربوطاً بأصول CMMS وبسجل الأصول الثابتة القائم، تأكيدات العمليات بتوزيع الدرجات A/B/C وتخصيص التكلفة بالقيمة (NRV)، الصرف الآلي (Backflush)، وأجر بالساعة أو بالقطعة من معدل مركز العمل (D-06). |
Production, Accounting, HRM, CMMS | تسجيل تشغيل على مستوى العملية بأزمنة فعلية، تكلفة تحويل حقيقية (عمالة + آلة + أوفرهيد داخل WIP)، إنتاج متعدد الدرجات بتكلفة عادلة، وتتبّع عمر القوالب بتنبيهات صيانة. | L |
| 3 — محرك التكاليف والانحرافات | تكلفة معيارية لكل صنف mfg_standard_costs، طريقة تكلفة لكل صنف (Standard/Actual/Average/FIFO) على جدول الامتداد mfg_item_mrp_settings الذي يُنشأ هنا (قرار D-20 — لا تضخيم لجدول products ولا هجرة Enum عليه)، الانحرافات السبعة (MPV…FOVV) بنطاقات تسامح وتوجيه للمسؤول — مدخلا FOVV: موازنة الإنفاق من budget_lines القائمة + عمود حجم موازني جديد على مركز العمل، وبغيابهما تُعلن 6 انحرافات (D-22) — تسوية الأوفرهيد شهرياً قبل إقفال الفترة، وتوزيع مراكز الخدمة عبر CostAllocationService. |
Production, Accounting, Core | الإدارة تحصل على أثمن مخرجات المواصفة: تفكيك انحراف كل أمر مغلق إلى أسبابه السبعة مع تحديد المسؤول وتقرير Pareto. | M |
| 4 — التخطيط: MRP وCRP والربط بالمشتريات والمبيعات | إعدادات تخطيط لكل صنف، تشغيل MRP متعدد المستويات (تفجير BOM، قواعد تحجيم الدفعات، فرع التصنيع لحساب الغير)، رسائل استثناءات، جدول الربط mfg_peggings بأوامر البيع، توليد طلبات شراء عبر CreatePurchaseRequest، فحص الطاقة CRP بتقويم عمل وورديات جديد (mfg_work_calendars + ربط calendar_id على مراكز العمل، وخصم الأعطال عبر مدخل القراءة GetDowntimeWindows)، وMPS مبسّط. |
Production, Purchases, Sales, Inventory | المخطِّط يشغّل MRP من الطلب الفعلي والمخزون فيحصل على أوامر إنتاج مقترحة وطلبات شراء تلقائية، ويرى تحميل الطاقة الزائد قبل الإطلاق، وكل أمر إنتاج مربوط بأوامر البيع التي يخدمها. | L |
| 5 — شاشات الورش والمتابعة اللحظية | طرفية لمسية لكل مركز عمل (على نمط pos-layout) بزرّي [Start]/[Done]، التقدّم الآلي للعملية التالية عبر حدث OperationCompleted، إدخال الكمية/الدرجات/الهالك، ولوحة مشرف حيّة لاكتشاف الاختناقات. |
Production, HRM, الواجهة الأمامية | أرضية مصنع بلا ورق: التكلفة تصبح لحظية بدل إدخال آخر اليوم، والمشرف يرى الاختناق الحالي مباشرة، وتتراكم الأزمنة الفعلية تمهيداً لـOEE. | M |
| 6 — التصنيع لحساب الغير والتتبع العميق | مخازن أمانة بعلم is_consignment لمواد العميل (تُمسَك ولا تُقيَّم ولا تُشترى — قرار D-15، وبُعد الملكية الكامل مؤجل)، فوترة أجر تشغيل فقط، تشغيلات/دُفعات كاملة الصلاحية في المخزون مع شجرة نسب (Genealogy) من خامة إلى منتج، بوابات فحص QMS على مستوى العملية، خصم أعطال CMMS من طاقة CRP، وتغذية أجر القطعة إلى الرواتب عبر Action بملكية HRM يكتب جدولاً تملكه HRM (لا تقرأ الرواتب أي جدول تصنيعي). |
Production, Inventory, Sales, QMS, CMMS, HRM, Accounting | قبول أعمال تشغيل لحساب الغير بدفاتر نظيفة، وتتبّع أي دفعة منتج تام رجوعاً إلى دفعات الخامات (جاهزية الاستدعاء)، وربط الجودة والصيانة والرواتب بالإنتاج. | L |
مراحل مستقبلية محجوزة الواجهات وخارج هذه الخطة: الجدولة التفصيلية APS، حساب OEE، أوامر التغيير الهندسي PLM/ECO، والتقاط بيانات الآلات (IoT).
إصلاحات الفجوات المسبقة لكل مرحلة (من الاتجاه المعتمد)
- قبل المرحلة 1: بناء حجز المخزون
StockService::reserve()/release()على عمودreserved_quantityاليتيم، وأنواع حركة إنتاجية فيMovementTypeمع إضافة حالةProductionOrderلتعدادي أنواع المرجعية (صرف واستلام)، وتأسيس حساباتWIP/FGومفاتيح إعداداتproduction.*_account_idعبرAutoAccountService(نفس الفضاء المبذور في المرحلة 0)، وربطproduction_centersبمراكز التكلفة. - قبل المرحلة 2: مصدر أجر العامل هو معدل مركز العمل
labor_cost_rate(قرار D-06 — حقول HRM مؤجلة كتجاوز اختياري بعد الإصدار الأول، بلا تعديل مخطط في HRM)، وجدول قراءات عداداتcmms_asset_metersلتراكم دورات القوالب، وإضافة طريقة الإهلاك بالاستخدامUnitsOfProductionفي المحاسبة (سجل الأصول الثابتة موجود ومتحقق منه). - قبل المرحلة 3: عمود
typeعلىcost_centers(إنتاجي/خدمي/مساعد)، وتأسيس حسابات الانحرافات السبعة، ومدخلا FOVV: إعادة استخدام موازناتbudget_linesالقائمة + عمود حجم موازني على مركز العمل (لا هجرة Enum علىproducts— طريقة التكلفة تسكن جدول الامتداد D-20). - قبل المرحلة 4: استخراج
Purchases\Actions\CreatePurchaseRequest(إنشاء طلبات الشراء اليوم حبيس الـController)، وعمودpromised_dateعلىsales_ordersبالاسم القانوني الوحيد (D-16) مع Action الكتابةSetPromisedDate، وبناء كيان تقويم العمل والورديات (فجوة لم تحلّها المواصفة أصلاً). - قبل المرحلة 6: ترقية الدفعات إلى كيان أول الدرجة في المخزون (اليوم
batch_numberنص حر)، وإضافةoperation_noومفاتيح خارجية حقيقية لجداولQMS.
استراتيجية ترحيل البيانات والتأسيس (الجداول السبعة القائمة)
- الإبقاء على الجداول السبعة دون إعادة تسمية: لا بيانات إنتاجية ولا مفاتيح خارجية واردة — مخاطر الترحيل شبه معدومة؛ الجداول الجديدة فقط تأخذ بادئة
mfg_. - إيقاف النمط الدفاعي: هجرة تحقق واحدة تثبّت الشكل النهائي للجداول السبعة، وكل تغيير لاحق إضافي (
ALTER) — لا تكرار لنمطforce_create. - هجرة تحويل الحالات:
draft→planned،confirmed→released،in_progress→in_processمع تحديث Angular في الإصدار نفسه. - تحويل
bom_operationsإلى توجيه مُصدَّر في المرحلة 2 (توليدmfg_routing_headerلكل BOM له عمليات)، ثم إيقاف الجدول القديم بعد إصدار انتقالي. - التأسيس (Seeders): بذر مفاتيح الإعدادات والحسابات المحاسبية والصلاحيات لكل مرحلة، وحزمة بيانات تجريبية «مصنع الميلامين» (خامة مسحوق، قالب 1 و4 تجاويف، درجات A/B/C) تُستخدم للعرض ولاختبارات الذهب معاً.
استراتيجية الاختبار (بوابة خروج لكل مرحلة)
اختبارات Pest وفق نمط النظام مع حد أدنى 80% تغطية قبل اعتماد أي مرحلة: المرحلة 1 تُثبت توازن كل قيد محاسبي وخصم المخزون وثبات اللقطة المجمّدة بعد الإطلاق؛ المرحلة 2 اختبارات وحدات خالصة لرياضيات التجاويف وتخصيص NRV؛ المرحلة 3 اختبار خاصية أن مجموع الانحرافات السبعة يساوي متبقي WIP حتى القرش؛ المرحلة 4 ملفات ذهبية لسيناريو الميلامين (6000 طبق، عبء 148% يُحل بقالب 4 تجاويف إلى 33 ساعة)؛ المرحلتان 5 و6 اختبارات تزامن الطرفيات وتتبّع النسب وعدم تقييم مخزون الأمانة.
قرارات مطلوبة من الإدارة
| القرار المطلوب | الخيارات | التوصية |
|---|---|---|
| هوية الموديول | موديول Manufacturing جديد / توسعة Production القائم | التوسعة في المكان — لا بيانات ولا مراجع واردة، والواجهة والصلاحيات جاهزة |
| آلة حالات أمر الإنتاج | إبقاء الحالات الخمس الحالية / اعتماد آلة المواصفة (مع Closed وCancelled) | اعتماد آلة المواصفة مع هجرة تحويل |
| مالك مراكز التكلفة | الإنتاج / المحاسبة | المحاسبة (cost_centers) مع إضافة عمود type؛ مراكز العمل تشير إليها |
| طريقة التكلفة في الإطلاق الأول | معيارية من اليوم الأول / فعلية (FIFO/متوسط) أولاً ثم معيارية في المرحلة 3 | فعلية أولاً — القضبان جاهزة، والمعيارية تحتاج محرك الانحرافات |
| أنواع حركة المخزون الإنتاجية | قيم جديدة في MovementType / الاكتفاء بمرجعية reference_type | قيم جديدة (تقارير أنظف) بموافقة مالك المخزون |
| مصدر أجر العامل | حقول على employees / معدل مركز العمل / خدمة HR | معدل مركز العمل (labor_cost_rate) في الإصدار الأول؛ حقول HRM ومدخل GetLaborRate مؤجلان بعد الإصدار الأول كتجاوز اختياري (مطابق للخريطة) |
| توقيت التصنيع لحساب الغير | المرحلة 6 / تقديمه مبكراً | المرحلة 6، ويُقدَّم مكان المرحلة 4 فور توقيع عميل تشغيل فعلي |
| سياسة عجز الصرف الآلي (Backflush) | منع التأكيد / السماح بالسالب / صرف جزئي | المنع افتراضياً مع احترام allow_negative_stock لكل مخزن |
| طرق توزيع مراكز الخدمة | مباشر فقط / بناء Step-Down وReciprocal | المباشر أولاً (موجود عبر CostAllocationService) |
| إعادة تقييم المخزون عند تفعيل المعيارية | إعادة تقييم بقيد / الجديد فقط | إعادة تقييم بقيد، بتوقيع المحاسب القانوني |
| مصدر التنبؤات لـMPS | شاشة إدخال يدوي / استيراد / تأجيل MPS كلياً | إدخال يدوي + استهلاك أوامر البيع المؤكدة (MPS مبسّط) |
| إعادة تاريخ الوعد إلى المبيعات | كتابة آلية لتاريخ CTP / حقل استرشادي | حقل استرشادي أولاً ثم الأتمتة — العمود promised_date بالاسم القانوني الوحيد (D-16) |
| نقل البيانات اللحظي لشاشات الورش | Polling دوري / WebSockets عبر Laravel Reverb | Polling أولاً، وReverb إذا أضرّ التأخير بالتشغيل |
| نطاق الدفعات في المخزون | بُعد دفعات كامل على الأرصدة والطبقات / جدول نسب فقط | البُعد الكامل خلف مفتاح تفعيل لكل شركة (أكبر تغيير عابر للموديولات في الخطة) |
| نموذج أمانة مواد العميل (D-15) | علم is_consignment على المخازن / بُعد ملكية على الأرصدة والحركات | مخازن أمانة بالعلم في الإصدار الأول (نهج الخريطة)، والبُعد الكامل مؤجل |
| اسم عمود وعد التسليم (D-16) | promised_date / promised_delivery_date / production_promised_date | sales_orders.promised_date — اسم واحد في كل الوثائق، وAction باسم SetPromisedDate |
| الأسماء القانونية للأحداث والإجراءات (D-17) | تسميات الخريطة / تنويعات العقود وخارطة الطريق | اعتماد تسميات الخريطة: ProductionOrderReleased, MaterialIssued, OperationCompleted, ConfirmationPosted, GoodsReceiptPosted, ProductionOrderClosed, MrpRunCompleted؛ وإجراء الإقفال CloseProductionOrder |
| بنية بدائل BOM (D-18) | جدول ابن mfg_bom_substitutes / حقل JSON | الجدول الابن بأولوية ونسبة (نهج الخريطة) |
| ملكية مستندي الصرف والاستلام (D-19) | جداول تصنيعية فوق قضبان المخزون / استخدام مستندات المخزون مباشرة | الجداول التصنيعية نهائياً — مستندات المخزون بلا موضع لحقول نوع/مستوى الصرف والعملية والدرجة |
| موطن طريقة التكلفة لكل صنف (D-20) | جدول الامتداد mfg_item_mrp_settings / Enum على products | جدول الامتداد، ويُنشأ في المرحلة 3 (لا تضخيم لبطاقة الصنف؛ أعمدة التخطيط تُملأ بالمرحلة 4) |
| حالة جودة الاستلام قبل بوابات QMS (D-21) | مفرج عنه تلقائياً / معلّق افتراضياً | مفرج عنه تلقائياً في المراحل 1–5، وتُحسم من نتيجة الفحص اعتباراً من المرحلة 6 |
| سياسة انحراف حجم الأعباء الثابتة FOVV (D-22) | حسابه من موازنات budget_lines القائمة + حجم موازني جديد / تقليص النطاق | يُحسب عند وجود موازنة معتمدة (إعادة استخدام الموازنات القائمة + عمود حجم على مركز العمل)؛ وإلا تُعلن 6 انحرافات للفترة |
الخلاصة التنفيذية للمسار
ست مراحل بأحجام S, L, L, M, L, M, L: المصنع يعمل فعلياً (مخزون وقيود حقيقية على أوامر يدوية) بنهاية المرحلة 1، وكل مرحلة لاحقة تضيف قدرة مكتملة بذاتها — تكلفة التحويل، ثم الانحرافات السبعة، ثم MRP/CRP، ثم شاشات الورش اللحظية، ثم التشغيل لحساب الغير والتتبع — دون أي إعادة عمل، لأن التكامل مع المخزون والمحاسبة مبنيّ من الأساس داخل كل مرحلة لا مؤجَّلاً إلى الخطوة الأخيرة كما اقترحت المواصفة.
موديول الإنتاج الحالي في Moon ERP (Existing Production Module)
يوجد بالفعل موديول Modules\Production داخل النظام، لكنه نواة مبدئية صغيرة (Minimum Viable Module) تغطي تعريف مراكز الإنتاج وقوائم المكونات وأوامر التشغيل بدورة حياة أساسية وحسابات تكلفة دفترية فقط — دون أي ترحيل فعلي للمخزون أو القيود المحاسبية، ودون أحداث (Events) أو خدمات تكامل مع باقي الموديولات.
نظرة عامة على النضج والاستخدام
الموديول قائم على نفس بنية باقي الموديولات (BaseModel مع company_id، فصل الفروع، وترقيم المستندات عبر SequenceService)، وله واجهة Angular كاملة وصلاحيات مُسجَّلة في Core. لكنه غير مُفعَّل فعلياً في الإنتاج: لا يوجد بيانات أولية (Seeder فارغ)، ولا اختبارات، ولا أي موديول آخر يشير إليه.
الجداول الموجودة فعلياً
| الجدول (Table) | الغرض | أعمدة لافتة |
|---|---|---|
production_centers | مراكز الإنتاج (آلة/عمالة/مختلط) | type, capacity_per_hour, cost_per_hour, overhead_rate, account_id |
bill_of_materials | قائمة المكونات للمنتج | version, quantity, is_default, standard_cost |
bom_components | مكونات قائمة الـBOM | quantity, waste_percentage, cost_per_unit |
bom_operations | عمليات الـBOM (التوجيه المبدئي) | production_center_id, sequence, setup_time_minutes, run_time_minutes |
production_orders | أوامر التشغيل | order_number, status, planned/produced/scrap_quantity, تكاليف مخططة/فعلية |
production_order_materials | مواد أمر التشغيل والمستهلك منها | planned_quantity, consumed_quantity, actual_cost |
production_order_operations | عمليات أمر التشغيل | planned/actual_setup_time, planned/actual_run_time, status |
ملاحظة: ترحيل الجداول مكتوب بأسلوب دفاعي عبر ثلاث هجرات (2026_03_31_000001_create_production_tables ثم ...000002_ensure... ثم ...000003_force_create...) كلها بشرط if (! Schema::hasTable(...))، وهو ما يدل على مشاكل سابقة في تطبيق الهجرات (استنتاج).
دورة حياة أمر التشغيل المُطبَّقة
draft— إنشاء الأمر وترقيمه عبرSequenceService('production','order')، وتعبئة المواد/العمليات تلقائياً من الـBOM إن وُجد.confirmed— عبرconfirm(يُسمح فقط منdraft).in_progress— عبرstart؛ يسجّلactual_start_date.- أثناء التشغيل:
consume(تسجيل استهلاك المواد) وrecord-output(تسجيل الكمية المنتجة والهالك). completed— عبرcomplete؛ يحسب التكاليف الفعلية من المواد والعمليات.cancelled— عبرcancel(منdraftأوconfirmedفقط).
ما الذي يرحّله فعلياً للمخزون والمحاسبة؟
- لا يوجد أي ترحيل للمخزون:
consumeوrecord-outputيحدّثان أعمدة الكمية داخل جداول الإنتاج فقط ولا يُنشئان أي حركة مخزون (StockMovement) ولا يخصمان/يضيفان رصيداً فيInventory. - لا يوجد أي قيد محاسبي: لا استدعاء لـ
Modules\Accounting\Actions\CreateJournalEntry؛ التكلفة تُحسب وتُعرض دفترياً فقط (حقولactual_material_cost/actual_labor_costوتقريرcosting). - عمود
account_idفيproduction_centersمعرّف لكنه غير مستخدم في أي ترحيل (استنتاج).
التكامل والصلاحيات
- الصلاحيات الـ19 مُسجَّلة فعلاً في
Modules\Core\database\seeders\RolePermissionSeeder.php(الأسطر 709–727) ومُطبَّقة كـMiddleware في الـControllers، ومتطابقة تماماً مع حُرّاس Angular. - واجهة Angular كاملة تحت
src/app/features/production(centers, boms, orders, reports) مع خدمات وموديلات فيcore/servicesوcore/modelsوعناصر تنقّل فيnav-items.config.ts. - غياب أي
Events/Listeners/Actions/Services؛EventServiceProviderفارغ، ولا يوجد مجلدActionsللتكامل العابر للموديولات حسب «وصفة» النظام. - لا يشير أي موديول آخر إلى جداول أو نماذج الإنتاج (لا مفاتيح خارجية واردة من خارج الموديول).
تغطية مفاهيم المواصفة (Spec Coverage)
| مفهوم المواصفة | الحالة | ملاحظة |
|---|---|---|
| BOM Versions | جزئي | عمود version نصّي فقط، بلا منطق إصدارات/تفعيل/تأريخ. |
| Routing / Operations | جزئي | bom_operations + production_order_operations بتسلسل وأزمنة، بلا توجيه متقدم. |
| Work Centers | موجود | production_centers بأنواع وطاقة وتكلفة/ساعة. |
| Tools / Molds | غير موجود | لا جداول للعدد/القوالب. |
| MRP / التخطيط | غير موجود | لا تخطيط احتياجات مواد ولا اقتراح أوامر شراء/تشغيل. |
| Confirmations / Shop Floor | جزئي | consume وrecord-output فقط، بلا محطات/تأكيدات تفصيلية. |
| Costing | جزئي | حساب مخطط/فعلي وانحراف دفترياً، بلا ترحيل محاسبي فعلي. |
| Stock Posting | غير موجود | لا ترحيل صرف مواد ولا استلام منتج تام في المخزون. |
التوصية
الموديول الحالي نواة هيكلية نظيفة ومتوافقة مع «وصفة» النظام لكنها سطحية وظيفياً وغير مستخدمة في الإنتاج (لا بيانات، لا اختبارات، لا مراجع خارجية). التوصية: التوسعة في مكانه (Extend in place) بالبناء فوق الجداول والصلاحيات والواجهة القائمة — لا إعادة بناء كاملة — مع إضافة الطبقات الناقصة (ترحيل المخزون، القيود المحاسبية عبر CreateJournalEntry، الأحداث/المستمعين، طبقة الإصدارات، MRP، والعدد/القوالب). مخاطر الترحيل شبه معدومة لعدم وجود بيانات أو ارتباطات قائمة (استنتاج).
المخزون والمشتريات: شريان التصنيع (Inventory & Purchases)
وحدتا Modules\Inventory وModules\Purchases هما الجاران الأكثر التصاقاً بوحدة التصنيع المقترحة: منهما تُحجَز المواد، وإليهما تُصرَف للإنتاج، ومنهما تُستلَم المنتجات النهائية، وعبرهما يُطلِق نظام تخطيط الاحتياجات (MRP) طلبات الشراء. هذا القسم يوثّق ما هو جاهز للاستخدام كما هو، وما ينقص ويجب بناؤه، مع تحديد نقاط الربط البرمجية بدقّة.
سيِّد الأصناف ووحدات القياس (Item Master & UoM)
سيِّد المنتجات مملوك لوحدة Modules\Core ومشترَك بين كل الوحدات؛ المخزون والمشتريات يشيران إليه بمفتاح خارجي فقط. البنية الأساسية لوحدات القياس والتحويلات قوية وجاهزة لإعادة الاستخدام في قوائم المكوّنات (BOM) ومسارات التصنيع.
- جدول المنتجات
productsيحوي حقول إعادة الطلب جاهزة:min_stock_levelوmax_stock_levelوreorder_point، إضافةً إلىtrack_inventoryووحدة الأساسbase_unit_id. - المتغيّرات مدعومة عبر
product_variantsوعلَمhas_variants. - وحدات القياس هرمية:
unit_groupsثمunitsبمعامل تحويلconversion_factor، مع تحويلات على مستوى المنتج فيproduct_units. - فجوة تصنيف الأصناف ناقص:
ProductTypeلا يحوي سوىProductوService— لا يوجد تمييز مادة خام / تحت التشغيل (WIP) / منتج نهائي، ولاprocurement_type(تصنيع مقابل شراء)، ولاmaterial_ownership(ملكيتنا مقابل أمانة العميل). استنتاج
التتبّع بالدُفعة والتسلسل (Batch / Lot / Serial)
التتبّع بالرقم التسلسلي (Serial) مكتمل ومُدار بجدول product_serials مع دورة حياة مُلزَمة عند الاستلام والصرف. أمّا التتبّع بالدُفعة (Batch/Lot) فهو ناقص جوهرياً: لا يوجد جدول رئيسي للدُفعات ولا أرصدة على مستوى الدُفعة؛ batch_number وexpiry_date مجرّد حقول نصّية على بنود الاستلام/الصرف. أرصدة المخزون وطبقات التكلفة مفهرسة بـ(منتج/متغيّر/مستودع) فقط دون الدُفعة.
فجوة التصنيع يحتاج نَسَب الدُفعات (أي دُفعات المواد الخام دخلت في أي دُفعة منتج نهائي) والصرف وفق الأقرب انتهاءً (FEFO) — وهذا غير ممكن في النموذج الحالي ويتطلّب جدول أرصدة دُفعات وخدمة مخزون واعية بالدُفعة. استنتاج
خدمة المخزون المركزية (StockService)
كل حركات المخزون تمرّ عبر Modules\Inventory\Services\StockService. تدعم الخدمة طريقتَي تقييم: الوارد أولاً صادر أولاً (FIFO) عبر طبقات التكلفة، والمتوسّط المرجّح (WAC) عبر الرصيد. الطريقة تُضبَط على مستوى الشركة بإعداد inventory.valuation_method (الافتراضي weighted_avg).
increaseStock()يزيد الكمية ويُحدِّث المتوسّط ويُنشئ دائماً طبقة تكلفةinventory_cost_layersوحركة فيinventory_movements.decreaseStock()يستهلك أقدم الطبقات في وضع FIFO أو يستخدم متوسّط التكلفة في وضع WAC.getIssueCost()يحسب تكلفة الصرف للمعاينة دون استهلاك، وgetProductCost()يُرجِع التكلفة الجارية.- فجوة الحجز غير مُفعَّل برمجياً: عمود
reserved_quantityموجود وكذلك خاصيةavailable_quantity(الكمية المتاحة = الكمية − المحجوزة)، لكن لا توجد أي دالّة تكتب قيمة الحجز. على التصنيع بناء منطق الحجز والإفراج بنفسه. استنتاج - فجوة أنواع الحركات في
MovementTypeلا تشمل حركات إنتاجية (صرف إنتاج / استلام إنتاج / هالك / إعادة تشغيل). - فجوة لا يوجد تكلفة معيارية (Standard Cost) ولا حسابات انحرافات؛ حقل
cost_methodعلى المنتج لا تقرؤه الخدمة.
تدفّق الاستلام والشراء (GRN & Receipt Flow)
النمط المرجعي الذي يجب أن يحاكيه التصنيع لاستلام المنتجات النهائية موجود في PurchaseGrnController::approve(): يُنشئ مستند استلام InventoryReceipt بحالة مسوّدة ثم يستدعي ApproveReceipt::execute() الذي يزيد المخزون فعلياً ويُنشئ طبقة التكلفة. أوضاع الاستلام (purchases.grn_mode): مباشر، أو باستلام، أو باستلام مع فحص جودة.
- توليد رقم المستند عبر
SequenceService::generateNext($company,'inventory','receipt'). - إنشاء
InventoryReceiptبحالةDraftوبنوده مع تمريرbatch_numberوexpiry_dateوserial_numbers. - استدعاء
app(ApproveReceipt::class)->execute($receipt, $userId)لزيادة المخزون. - تحديث كميات الاستلام على أمر الشراء وإعادة احتساب حالته.
طلب الشراء ← أمر الشراء (مدخل MRP)
سيُنشئ تخطيط الاحتياجات (MRP) طلبات شراء آلياً. الطلب موجود في purchase_requests (مع needed_by وpriority وcost_center_id وconverted_to_order_id)، ويتحوّل إلى أمر شراء عبر مسار convertFromRequest الذي يَسِم الطلب بحالة Converted. حدود إعادة الطلب مخزّنة على المنتج، لكن وحدة التنبيهات ReorderAlertController تنبيهية فقط ولا تُنشئ طلبات شراء آلياً.
فجوة إنشاء طلب الشراء يقع اليوم داخل المتحكّم فقط؛ يُنصَح باستخراج إجراء Purchases\Actions\CreatePurchaseRequest ليستدعيه MRP داخلياً دون المرور عبر واجهة HTTP. استنتاج
الترحيل المحاسبي وتكلفة البضاعة المباعة (GL & COGS)
نقطة جوهرية: وحدة المخزون لا تُرحِّل أي قيود محاسبية — حركة المخزون منفصلة عن الترحيل المحاسبي. الوحدة المستهلِكة هي من تكتب القيد دائماً عبر البوّابة الوحيدة Modules\Accounting\Actions\CreateJournalEntry:
- المشتريات:
PostPurchaseBillيُرحِّل مدين المخزون / دائن الموردين. - المبيعات:
PostSalesInvoice::handleCogsAndStockيحسب التكلفة عبرStockServiceثم يُرحِّل مدين تكلفة البضاعة المباعة / دائن المخزون ويستدعيdecreaseStockوينشئInventoryIssue. - الأثر على التصنيع: عليه أن يكتب بنفسه قيود تحت التشغيل (WIP) والتكاليف المُحمَّلة والانحرافات محاكياً نفس الوصفة.
الاستدعاءات البرمجية الدقيقة لوحدة التصنيع
| الغرض | الاستدعاء / الجدول | الحالة |
|---|---|---|
| حجز المواد عند إطلاق أمر الإنتاج | زيادة inventory_stock_balances.reserved_quantity (عبر إجراء جديد ReserveOrderComponents) | يُبنى |
| صرف المواد للإنتاج (خام ← تحت التشغيل) | ApproveIssue::execute($issue) ← StockService::decreaseStock + قيد مدين WIP/دائن المخزون عبر CreateJournalEntry | جاهز جزئياً |
| استلام المنتج النهائي (تحت التشغيل ← نهائي) | InventoryReceipt (Draft) ← ApproveReceipt::execute($receipt) + قيد مدين المخزون النهائي/دائن WIP | جاهز |
| إطلاق طلبات الشراء من MRP | إنشاء PurchaseRequest + بنوده، ثم convertFromRequest ← PurchaseOrder | جاهز جزئياً |
| تكلفة الصرف للمعاينة | StockService::getIssueCost() / getProductCost() | جاهز |
| مواقع الورشة وتحت التشغيل | تمثيلها كسجلّات warehouses (لا يوجد نموذج مواقع/أرفف فرعية) | يُبنى |
ملخّص الفجوات الجوهرية للمجلس
- لا يوجد سيِّد دُفعات ولا أرصدة على مستوى الدُفعة (التسلسل فقط مكتمل).
- منطق الحجز غائب رغم وجود عمود
reserved_quantity. - لا تصنيف أصناف تصنيعي (خام/تحت التشغيل/نهائي) ولا ملكية أمانة (Consignment).
- لا تكلفة معيارية ولا انحرافات؛ لا أنواع حركات إنتاجية.
- المخزون لا يُرحِّل محاسبياً — التصنيع يكتب قيوده بنفسه عبر
CreateJournalEntry. - لا إجراء برمجي لإنشاء طلب الشراء؛ إعادة الطلب تنبيهية فقط؛ لا نموذج مواقع فرعية.
الحسابات والنواة: القيود ومراكز التكلفة والقضبان (Accounting & Core Rails)
يوضّح هذا القسم البنية المالية القائمة بالفعل في النظام والتي ستعتمد عليها وحدة التصنيع لترحيل تكاليف الإنتاج: قيود اليومية، الدليل المحاسبي، مراكز التكلفة، إغلاق الفترات، والعملات. الخلاصة الإدارية: القضبان المالية جاهزة ومُجرَّبة فعلياً في وحدة المختبرات، ومراكز التكلفة موجودة ولا تحتاج بناءً جديداً؛ المطلوب هو منطق التكاليف نفسه داخل وحدة التصنيع.
القناة الوحيدة المعتمدة للترحيل المحاسبي
أي ترحيل إلى دفتر الأستاذ العام يمر حصراً عبر إجراء واحد معتمد هو Modules\Accounting\Actions\CreateJournalEntry بدالة execute(array $data, array $lines). هذه القناة تضمن التوازن، ومنع الترحيل على الحسابات الرئيسية (الإجمالية)، والتحقق من وجود فترة مالية مفتوحة، وتحويل العملات تلقائياً. وحدة المختبرات Modules\LIS\Actions\PostLabInvoice تستخدم هذه القناة فعلياً لترحيل تكلفة المبيعات موزّعةً على مراكز التكلفة — وهو نفس الأسلوب الذي ستتبعه وحدة التصنيع بحذافيره.
- كل سطر قيد يحمل بُعد
cost_center_id— وهو البُعد التحليلي الذي يلتقط تكلفة كل مركز إنتاجي (ضغط، تجميع، تشطيب). - كل قيد يحمل
source_typeوsource_idلربطه بالمستند المصدر (سيكونproduction_orderهنا). - الترحيل التلقائي مُفعّل افتراضياً عبر إعداد
accounting.auto_post_entries؛ وأي فشل يُبقي القيد كمسودة آمنة دون إيقاف العملية التشغيلية. - ربط الحسابات يتم بالإعدادات لا بالكود الصلب، عبر
SettingsServiceمع سلاسل احتياطية.
مراكز التكلفة موجودة بالفعل
خلافاً لما قد يُفترض، مراكز التكلفة كيان قائم وكامل في وحدة الحسابات عبر جدول cost_centers ونموذج Modules\Accounting\Models\CostCenter بهيكل هرمي (أب/أبناء). كما أن توزيع تكاليف مراكز الخدمة على مراكز الإنتاج مبني فعلاً عبر CostAllocationService وAllocationRule. وتقارير الأستاذ العام GeneralLedgerService تدعم الترشيح حسب مركز التكلفة. لذلك مراكز التكلفة ليست بناءً جديداً — الناقص فقط هو تصنيف نوع المركز (إنتاجي/خدمي/مساعد) وبعض طرق التوزيع المتقدمة.
كيف تُرحَّل دورة الإنتاج تحت التشغيل ← الانحرافات ← التسوية
- صرف المواد للأمر: مدين
WIP (إنتاج تحت التشغيل)/ دائنمخزون المواد الخام— بنوعproduction_material_issue. - العمالة المباشرة: مدين
WIP/ دائنأجور مُحمَّلة— بنوعproduction_labor. - الأعباء الصناعية غير المباشرة: مدين
WIP/ دائنأعباء مُحمَّلة (MOH Applied)— بنوعproduction_overhead(معدل التحميل موجود فيproduction_centers.overhead_rate). - استلام المنتج التام بالتكلفة المعيارية: مدين
مخزون التام/ دائنWIP— بنوعproduction_receipt. - التسوية: الرصيد المتبقي في
WIP= إجمالي الانحراف؛ يُحلَّل إلى الانحرافات السبعة (سعر/استخدام المواد، معدل/كفاءة العمالة، إنفاق/كفاءة الأعباء، حجم الأعباء الثابتة) ويُرحَّل لحسابات الانحراف في قائمة الدخل مع تصفير الأمر — بنوعproduction_variance.
كل ما سبق يُرحَّل عبر CreateJournalEntry دون أي تعديل على مخطط الحسابات؛ حسابات الإنتاج تحت التشغيل والانحرافات هي حسابات تفصيلية تُهيّأ ببيانات أولية، ومركز التكلفة هو البُعد القائم على السطر. استنتاج: تسلسل القيود
القضبان المتوفّرة من النواة (Core)
| القدرة | الملف / المصدر | الحالة للتصنيع |
|---|---|---|
| قيد اليومية الموحّد | Modules/Accounting/app/Actions/CreateJournalEntry.php | جاهز — يُستخدم كما هو |
| مراكز التكلفة + بُعد السطر | cost_centers، journal_entry_lines.cost_center_id | جاهز — ليس بناءً جديداً |
| توزيع الخدمة ← الإنتاج | CostAllocationService، AllocationRule | جاهز للطريقة المباشرة |
| الدليل المحاسبي | accounts، AccountClassification، AutoAccountService | جاهز — تُزرع حسابات WIP/الانحراف كحسابات تفصيلية |
| إغلاق الفترات | Modules/Accounting/app/Actions/CloseFiscalPeriod.php | جاهز — التسوية قبل الإغلاق |
| الترقيم المستندي | Modules/Core/app/Services/SequenceService.php | جاهز لأرقام أوامر الإنتاج |
| الإعدادات المُعرّفة | Modules/Core/app/Services/SettingsService.php | جاهز — تُضاف مفاتيح manufacturing.* |
| الصلاحيات والتبعيات | Modules/Core/app/Support/PermissionDependencyRegistry.php | جاهز — تُسجَّل بادئة manufacturing |
| نطاق الفروع | Modules/Core/app/Support/DataScope.php | جاهز — أوامر الإنتاج تحمل branch_id |
| التدقيق والمرفقات | BaseModel + Auditable، Attachment | جاهز بالوراثة |
الفجوات التي تتطلّب بناءً جديداً
- لا يوجد أي ترحيل محاسبي من وحدة
Productionحالياً (صفر استدعاءات لـCreateJournalEntry)، كما أن وحدة المخزون لا تُرحِّل للأستاذ — وهذه أكبر فجوة وتُبنى بالكامل داخل وحدة التصنيع. فجوة كبرى - جدول مراكز التكلفة بلا عمود
type(إنتاجي/خدمي/مساعد) المطلوب في المواصفة. استنتاج - نموذج المنتج
Productsيحويcost_methodكنص حر فقط، دون مُعدّد طرق التكلفة (Standard/Actual/Average/FIFO) ودون التكلفة المعيارية المُفصّلة. فجوة - مُعدّد
ApprovalModuleيقتصر على المبيعات والمشتريات؛ يلزم إضافة حالةProduction. فجوة - لا توجد مفاتيح إعدادات ولا حسابات مزروعة لـWIP والأعباء المُحمَّلة والانحرافات؛ تُضاف عبر
SettingDefinitionوAutoAccountService. استنتاج - محرّك الانحرافات السبعة (مع حدود التفاوت وتقرير باريتو وتوجيه المسؤولية) منطق خالص جديد داخل وحدة التصنيع.
الجيران: المبيعات والموارد والجودة والصيانة والواجهة (Sales, HRM, QMS, CMMS & Frontend)
موديول التصنيع ليس جزيرة منعزلة؛ فهو يستهلك الطلب من المبيعات، ويأخذ معدلات الأجور من الموارد البشرية لتسعير تأكيدات العمالة، ويربط فحوص الجودة وتقارير عدم المطابقة بموديول الجودة القائم بدلاً من بناء جداول جودة داخلية، ويعامل مراكز العمل والقوالب كأصول قابلة للصيانة في موديول الصيانة. أما الواجهة الأمامية فتتبع نمطاً موحَّداً من المسارات الكسولة وحُرّاس الصلاحيات ومكوّنات الجداول والحوارات والطباعة المشتركة، مع شاشة طرفية لمسية لأرضية المصنع.
1. المبيعات: مصدر الطلب لخطة الإنتاج الرئيسية (Sales → MPS Demand)
يقرأ التصنيع الطلبات المؤكَّدة من جدول sales_orders وبنوده sales_order_items لتغذية خطة الإنتاج الرئيسية (MPS) عبر حقل confirmed_orders_qty، ولربط أوامر التشغيل بالطلب عبر جدول الربط Pegging (علاقة كثير-لكثير بين الطلب والإنتاج). جدول sales_orders يملك بالفعل expected_delivery_date وdelivery_status وstatus، وبند الطلب يتتبّع delivered_quantity وinvoiced_quantity.
- المنتج المطلوب يُعرَّف عبر
product_idوproduct_variant_idفيsales_order_items— وهو نفس مرجعproductsالذي يبني عليه التصنيع قائمة المكوّنات (BOM). - تحويل عرض السعر إلى طلب مُتتبَّع عبر
sales_quotations.sales_order_idوsales_orders.quotation_id. - الفرع وسلسلة الشركة جاهزان (
company_id,branch_id) لفصل النطاق (DataScope).
فجوة لا يوجد في sales_orders أي حقل «وعد التسليم المتاح» (ATP/CTP) ولا حقل رجوعي يحمل التاريخ المُتعهَّد به من التصنيع؛ الوعد بالتسليم القائم يدوي (expected_delivery_date) دون ربط بقدرة الإنتاج (استنتاج). يلزم خطّاف (Action) من التصنيع يكتب التاريخ المُتعهَّد ويُحدِّث delivery_status عند الربط (Pegging).
2. الموارد البشرية: العمالة وتسعير التأكيدات (HRM → Labor Costing)
تأكيدات العمليات (Confirmation) تُسجِّل ساعات/كميات العامل، ويجب تسعيرها من بيانات الموارد البشرية. جدول employees يربط الموظف بالمستخدم عبر user_id (سلسلة employees.user_id → users.id)، ويملك basic_salary فقط. الورديات في shifts (start_time, end_time, working_hours, is_night_shift) والحضور في attendances (worked_hours, overtime_hours).
فجوة جوهرية لا يوجد حقل «أجر بالساعة» (hourly_rate) ولا «أجر بالقطعة» (piece_rate) على مستوى الموظف؛ الأجر بالساعة مُشتَقّ حسابياً داخل PayrollService من basic_salary / salaryDays / hoursPerDay فقط. وبما أن مواصفات التصنيع تتطلب وضعين (labor_calc ∈ {Hourly, PieceRate})، يلزم مصدر معدّل صريح للتأكيدات، إما حقل جديد أو خدمة معدّلات في الموارد البشرية (استنتاج).
3. الجودة: الفحص أثناء التشغيل وعدم المطابقة على الهالك (QMS Replaces Spec-Internal Quality)
تنصّ المواصفة صراحةً (ملف 06 §6.5) على أن «إدارة الجودة» مرحلة لاحقة تتعلّق بتأكيدات الإنتاج (الدرجات/أكواد الأسباب وبوابات الفحص على العمليات) — وموديول الجودة القائم يغطّيها بالفعل، فلا حاجة لبناء جداول جودة داخل التصنيع. الأهم: جداول qms_inspection_plans وqms_inspections تحمل بالفعل عمود production_order_id، أي أنها صُمِّمت أصلاً للربط بأوامر التشغيل.
| حاجة المواصفة (Spec need) | المتوفّر في الجودة (QMS has) | الربط |
|---|---|---|
بوابة فحص على العملية (inspection_required على Routing_Operation) | qms_inspection_plans + qms_inspection_criteria | type='in_process' مع production_order_id |
| تسجيل نتيجة الفحص أثناء التأكيد | qms_inspections (quantity_inspected/accepted/rejected, result) + qms_inspection_results | عمود production_order_id موجود |
| تقرير عدم مطابقة على الهالك (NCR) | qms_non_conformances (ncr_number, type, severity, root_cause) | عبر inspection_id ومن ثم production_order_id |
| إجراء تصحيحي/وقائي على تكرار العيوب | qms_capa_actions (capa_number, type, effectiveness_check) | عبر non_conformance_id |
- أكواد أسباب الهالك (
reason_codeفي تأكيد التصنيع) تُغذّي تحليل باريتو، وتُترجَم إلىqms_non_conformancesعند تجاوز عتبة. - بوابة الجودة على الاستلام (Goods_Receipt
quality_status ∈ {Released, OnHold, Rejected}) تُحسَم عبر نتيجةqms_inspections.result.
فجوة لا يوجد عمود مفتاح أجنبي رسمي على qms_inspections.production_order_id (مجرّد unsignedBigInteger دون constrained) لأن جداول التصنيع لم تُنشأ بعد؛ كما تنقص رابطة operation_no لتثبيت الفحص على عملية بعينها (استنتاج).
4. الصيانة: مراكز العمل والقوالب كأصول (CMMS → Work Centers & Molds)
تنصّ المواصفة (§6.5) على أن الصيانة (PM) «تُقلِّل قدرة مركز العمل أثناء نوافذ التوقّف». موديول الصيانة يوفّر cmms_assets (مع specifications JSON وparent_asset_id) ليمثّل الآلة/القالب كأصل، وcmms_pm_schedules للصيانة الدورية، وcmms_work_orders لأوامر الصيانة بحقل downtime_hours وfailure_code ونوع WorkOrderType ∈ {Preventive, Corrective}.
- القالب/المول (Tool في المواصفة) يُسجَّل كـ
cmms_assetsفئة قوالب؛ مركز العمل (Work_Center) أصل آلة. - توقّف الإنتاج ↔ أمر صيانة:
cmms_work_orders.downtime_hours+actual_start/endيخصمان القدرة المتاحة من CRP. - تشغيل الصيانة بعدّاد عتبة:
cmms_pm_schedules.meter_field+meter_thresholdيدعمان «صيانة كل N ضربة» للقوالب.
فجوة لا يوجد جدول قراءات عدّاد (مثل cmms_asset_meters) يجمع عدد ضربات القالب التراكمي (cycles_used في المواصفة) ليُطلِق صيانة العتبة؛ الحقل meter_field نصّي فقط دون مصدر بيانات تراكمي. كما أن cmms_work_order_labor يربط بـuser_id لا بـemployee_id (استنتاج).
5. الواجهة الأمامية: تنظيم الموديول والحُرّاس والشاشة الطرفية (Frontend Conventions)
الواجهة Angular مستقلّة المكوّنات (Standalone) بمسارات كسولة. كل موديول مجموعة مسارات تحت حارس الموديول moduleGuard (يمنع تجاوز تعطيل الموديول)، وكل مسار فرعي تحت permissionGuard مع data.permissions ببادئة الموديول (مثل ['manufacturing.']). المكوّنات تُحمَّل عبر loadComponent الكسول.
| العنصر (FE element) | الملف/النمط | الاستخدام للتصنيع |
|---|---|---|
| مجموعة مسارات الموديول | app.routes.ts (canActivate: [moduleGuard]) | مسار manufacturing بأطفال لكل شاشة |
| حارس الصلاحيات | core/guards/auth.guard.ts (permissionGuard) | data: { permissions: ['manufacturing.bom'] } |
| جدول البيانات المشترك | shared/components/data-table/data-table.component.ts | قوائم أوامر التشغيل/BOM/التأكيدات |
| حوار النموذج المشترك | shared/components/form-dialog/form-dialog.component.ts | إنشاء/تعديل BOM، إصدار أمر تشغيل |
| تنقّل الموديول | shared/components/module-nav/module-nav.component.ts | شريط جانبي لورشة التصنيع |
| الطباعة | shared/print/print.service.ts + print-templates.ts | أمر تشغيل، إذن صرف مواد، استلام تام |
| تخطيط طرفية لمسية | features/pos/pos-layout/ (مرجع نمط) | شاشة أرضية المصنع لمسية لكل مركز عمل |
- ورشة التصنيع: تخطيط (
manufacturing-layout) + لوحة + بيانات أساسية (BOM/Routing/Work Center/Tool). - شاشات التخطيط (MPS/MRP/CRP) والتنفيذ (أمر تشغيل، صرف مواد، تأكيد، استلام).
- شاشة طرفية لمسية لأرضية المصنع: أهداف لمس كبيرة، أزرار
[Start]/[Done]، طابور الأوامر الجاهزة، إدخال كمية/درجة/هالك — على نمطpos-layout. - لوحة إشراف حيّة (Real-time Dashboard) تعرض موضع كل أمر وكشف الاختناقات.
المعمارية والمبادئ الحاكمة (Architecture & Principles)
هذا الملف هو الدستور الحاكم لوحدة التصنيع بأكملها؛ كل ملفات المواصفات الأخرى (٠١ إلى ٠٦) ترث قواعده. المطلب الجوهري: بناء وحدة تصنيع عامة (Generic) تصلح لأي مصنع، تُركَّب فوق نظام ERP قائم لديه بالفعل المالية والمخزون والمشتريات والمبيعات والموارد البشرية. مصنع أدوات الميلامين يُستخدم فقط كمثال اختبار إجهاد لإثبات العمومية — وليس نموذجاً يُبرمَج بشكل ثابت.
النطاق ودورة حياة الإنتاج
تغطي الوحدة دورة الإنتاج الكاملة: البيانات الأساسية ← التخطيط ← التنفيذ ← التكاليف، إضافة إلى طبقة التحكم بأرضية المصنع Shop Floor Control (SFC) للتتبع اللحظي. ما يلي خارج النطاق ويتم التكامل معه لا إعادة بنائه: دفتر الأستاذ العام، نواة المخزون والمستودعات، نواة المشتريات، أوامر المبيعات، الموارد البشرية والرواتب.
الطبقات المعمارية الأربع
تتدفق البيانات من الأعلى للأسفل، مع حلقة مغلقة: انحرافات التكاليف وتعارضات السعة في CRP تعود لتصحيح التخطيط.
| الطبقة | ملف المواصفة | السؤال الجوهري |
|---|---|---|
| البيانات الأساسية (Master Data) | 01_master_data.md | ما المنتج وكيف يُصنع؟ |
| التخطيط (Planning) | 02_planning.md | هل نستطيع صنعه؟ أي مواد؟ أي جدول زمني؟ |
| التنفيذ (Execution) | 03_execution.md | ماذا حدث فعلياً على أرضية المصنع؟ |
| التكاليف (Costing) | 04_costing.md | كم كلّف؟ وأين المشكلات؟ |
| التحكم بأرضية المصنع (SFC) | 05_shop_floor_control.md | أين كل أمر إنتاج الآن (لحظياً)؟ |
| التكاملات ونموذج البيانات | 06_integrations_and_data_model.md | كيف يتصل بالنظام + نموذج البيانات الكامل |
المطلب الجوهري: العمومية (The Genericity Mandate)
القاعدة الأهم على الإطلاق: لا تُبرمِج سلوك مصنع واحد بشكل ثابت أبداً. كل سلوك خاص بمصنع يجب أن يُعبَّر عنه بصيغة إعداد (حقل/تعداد) + منطق تفرّع، لا كمسار برمجي منفصل. القاعدة الذهبية للمطوّر: حين تجد سلوكاً "يفعله هذا المصنع وحده"، لا تفرّع الكود حسب المصنع — أضف حقل إعداد قيمته الافتراضية هي السلوك الشائع، وفرّع بناءً عليه.
| واقع خاص بالمصنع (الميلامين) | الآلية العامة في النظام |
|---|---|
| إنتاج حسب الطلب وللمخزون والتصنيع لدى الغير معاً | تعداد production_type + تفرّع |
| العميل يورّد المادة الخام (toll) | تعداد material_ownership {Own, Customer} |
| دورة كبس واحدة تنتج عدة قطع (قالب متعدد التجاويف) | حقل cavity_count على الأداة/العملية |
| دورة واحدة تنتج درجات A/B/C بأسعار مختلفة | منتجات مشتركة: الإنتاجية توزيع لا قيمة مفردة |
| عامل المكبس يُدفع بالقطعة، الباقون براتب ثابت | تعداد labor_calc {Hourly, PieceRate} |
| العامل يسحب البودرة لوردية كاملة | تعداد issue_level {PerOrder, PerShift, PerOperation} |
| القالب (لا الماكينة) هو قيد السعة | تجريد Resource بـ resource_type {Machine, Tool, Labor} |
| الطلاء يُرش بكميات ضئيلة | المادة تُعامَل كمستهلك أعباء (Overhead)، لا كبند في الـ BOM |
| القوالب المركّبة فقط هي التي تتآكل | الإهلاك بالاستخدام (عدد الدورات)، لا بالزمن التقويمي |
القواعد التصميمية الشاملة (Cross-Cutting Rules)
تنطبق هذه القواعد على كل كيان وعملية في الوحدة:
- اللقطات المجمّدة (Frozen Snapshots): عند
Releaseأمر الإنتاج يُؤخذ نسخة مجمّدة من الـ BOM والـ Routing النشطين؛ أي تغيير لاحق في البيانات الأساسية لا يؤثر على الأوامر المُصدَرة — حمايةً للتكلفة التاريخية ومسار التدقيق. - الحالة كآلة حالات (State Machine): كل كيان معاملاتي (أمر، صرف، تأكيد، استلام) له حالة صريحة بانتقالات وشروط مسبقة وآثار جانبية محددة — لا تغييرات حالة عشوائية.
- علاقة كثير-لكثير بين الطلب والإمداد: أمر مبيعات قد ينقسم لعدة أوامر إنتاج، وأمر إنتاج قد يخدم عدة أوامر مبيعات؛ جدول
Peggingيسجّل الروابط. - التعدد المستوياتي في كل شيء: الـ BOM والأوامر والتكاليف تدعم تعشيشاً غير محدود (منتج تام ← تجميعة فرعية ← مكوّن ← مادة خام) عبر التكرار (recursion).
- الإعداد بدلاً من الكود: كل نقطة تباين هي حقل لا مسار برمجي.
- كل حدث فعلي يُولّد قيداً محاسبياً: صرف المواد والتأكيد واستلام البضاعة كلٌ يُنتج قيد GL؛ التكلفة منسوجة داخل التنفيذ لا خطوة دفعية لاحقة.
- تجريد الموارد: السعة تُستهلك عبر كائنات
Resourceبأنواع مختلفة؛ السعة الفعلية للعملية مقيّدة بـالحد الأدنى المتاح عبر كل الموارد المطلوبة.
آلتا الحالة المسمّاتان (State Machines)
حالة أمر الإنتاج order_status:
Planned— مُخطَّطReleased— مُصدَر (تؤخذ هنا اللقطة المجمّدة)InProcess— قيد التنفيذCompleted— مكتملClosed— مُغلق
حالة العملية operation_status:
Waiting— منتظرReady— جاهزInProgress— قيد التشغيلCompleted— مكتمل
التعدادات الحاكمة (Key Enumerations)
| التعداد | القيم |
|---|---|
production_type | MakeToStock, MakeToOrder, AssembleToOrder, TollManufacturing |
material_ownership | Own, Customer |
procurement_type | Buy, Make |
costing_method | Standard, Actual, Average, FIFO |
labor_calc | Hourly, PieceRate |
issue_type | Manual, Backflush, AutoIssue |
issue_level | PerOrder, PerShift, PerOperation |
resource_type | Machine, Tool, Labor |
lot_sizing_rule | Exact, Fixed, MinMax, EOQ, PeriodOrder |
order_status | Planned, Released, InProcess, Completed, Closed |
operation_status | Waiting, Ready, InProgress, Completed |
حالة البناء المرجعية (Build Status)
| المكوّن | الحالة في التحليل | ملاحظة للمطوّر |
|---|---|---|
| البيانات الأساسية (BOM, Routing, WC) | محدد بالكامل | أضف الأداة/القالب كمورد من الدرجة الأولى |
| التخطيط (MPS, MRP, CRP) | محدد بالكامل | جدولة APS التفصيلية فجوة معروفة (ملف ٠٢) |
| التنفيذ (PO, Issue, Confirm, GR) | محدد بالكامل | يشمل الدرجات والدفع بالقطعة وصرف الوردية |
| التكاليف (طرق، عناصر، مراكز، انحرافات) | محدد بالكامل | تخصيص المنتجات المشتركة مُدرَج |
| التحكم بأرضية المصنع (SFC) | محدد منطقياً | طبقة الواجهات/الطرفيات تُبنى (ملف ٠٥) |
| الجودة، إدارة القوالب، الصيانة، OEE | مُعرَّف لا محدد | مراحل مستقبلية — الواجهات مُشار إليها |
ماذا يعني هذا لـ Moon ERP
- تكامل لا إعادة بناء: GL عبر
Modules\Accounting\Actions\CreateJournalEntryفقط، والمخزون عبر وحدةInventory، والمشتريات/المبيعات/الموارد البشرية عبر وحداتها القائمة — مطابق لمبدأ "خارج النطاق" في المواصفة. - وحدة
Productionالحالية تملك بالفعلBillOfMaterialsوBomComponent/OperationوProductionOrderوProductionCenter— أساس يُبنى عليه، لكنه يحتاج توسعة لتعدد التجاويف والمنتجات المشتركة وتجريد الموارد. - التعدادات الـ ١١ تُنفَّذ كـ
Enumsداخل الوحدة وفق وصفة Moon ("enums per state machine")؛ وآلتا الحالةorder_status/operation_statusتُنفَّذان كآلات حالة بأحداث ومستمعين. - "كل حدث فعلي يُولّد قيداً" يتطابق تماماً مع نمط Moon المُثبت (
PostLabInvoice → CreateJournalEntry): صرف/تأكيد/استلام كل منها يستدعي قيداً مزامناً. - اللقطات المجمّدة وترقيم المستندات تتكئان على
SequenceService، وBaseModel/TenantAwareيضمنانcompany_idونطاق الفرع عبرDataScope— مطابق لوصفة الوحدات السريرية. - خرائط الصلاحيات تُسجَّل في
Core PermissionDependencyRegistryببادئةmfg، تماماً كما تفعل LIS. - المطلب الجوهري (الإعداد بدلاً من الكود) يحمي Moon من تفرّع الكود لكل عميل مصنع: كل سلوك خاص يصبح حقل إعداد بقيمة افتراضية شائعة.
البيانات الأساسية: BOM والمسارات ومراكز العمل والإسطمبات (Master Data)
طبقة الأساس في وحدة التصنيع. تعرّف «ما هو المنتج وكيف يُصنع»: قائمة المكونات (BOM)، ومسار التصنيع (Routing)، وموارد الإنتاج (Work Center وTool/Mold). تُنشأ مرة واحدة وتُعدَّل فقط عبر أوامر تغيير هندسي محكومة (ECO). القاعدة الحاكمة: «إن كانت البيانات الأساسية خاطئة، فكل ما يليها خاطئ» — ولهذا تُلتقط نسخة مجمّدة (Frozen Snapshot) منها عند إطلاق أمر الإنتاج.
الغرض والمبدأ الحاكم
تلتزم هذه الطبقة بـ«تفويض العمومية» (Genericity Mandate): لا يُكتب أي سلوك خاص بمصنع واحد كمسار برمجي مستقل، بل يُعبَّر عنه بحقل/قيمة تعداد (config) ينحاز افتراضيًا للسلوك الشائع ثم يتفرّع منه. مصنع الميلامين مذكور كحالة اختبار إجهاد فقط — وليس قالبًا يُبرمَج عليه.
- نسخة مجمّدة: عند إطلاق أمر الإنتاج تُلتقط نسخة من الـ
BOMوالـRoutingالنشطين؛ أي تعديل لاحق لا يمسّ الأوامر المُطلَقة (حماية التكلفة التاريخية والتدقيق). - الحالة كآلة حالات: كل كيان له
statusبانتقالات وشروط وآثار محددة، لا تغييرات عشوائية. - تعدّد المستويات: الـ
BOMيدعم التداخل اللانهائي (منتج نهائي ← تجميعة فرعية ← مكوّن ← خام) عبر التكرار (recursion). - تجريد الموارد: الطاقة تُستهلك بكائنات
Resourceمن نوع{ Machine, Tool, Labor }؛ طاقة العملية محكومة بـأدنى مورد متاح.
الكيان: قائمة المكوّنات (BOM — Bill of Materials)
هوية تصنيع المنتج: ما المكوّنات وكمياتها لإنتاج وحدة واحدة. يجب أن يدعم التداخل متعدد المستويات. يتكوّن من رأس (BOM_Header) وأسطر (BOM_Line).
رأس القائمة (BOM_Header)
| الحقل | الوصف / القاعدة |
|---|---|
bom_id | المفتاح الأساسي |
parent_item_id | مفتاح خارجي ← الصنف (المنتج الأب) |
bom_type | تعداد { Production, Engineering, Phantom } |
version | تُحفظ عدة إصدارات للتاريخ |
base_quantity | عادة 1 — الوحدة التي تُعرَّف القائمة لكل واحدة منها |
uom | وحدة قياس الأب |
status | تعداد { Draft, Active, Inactive, Obsolete } |
effective_from / effective_to | نافذة الصلاحية |
created_by / approved_by | تدقيق الإنشاء والاعتماد |
سطر القائمة (BOM_Line)
| الحقل | الوصف / القاعدة |
|---|---|
bom_id | مفتاح خارجي ← رأس القائمة |
line_no | ترتيب السطر |
component_id | مفتاح خارجي ← الصنف (المكوّن) |
quantity | لكل base_quantity واحدة من الأب |
uom | وحدة قياس السطر |
scrap_percentage | الهدر المتوقع؛ يضرب الـMRP الكمية في (1 + scrap%) |
issue_type | تعداد { Manual, Backflush, AutoIssue } |
issue_level | تعداد { PerOrder, PerShift, PerOperation } |
operation_seq | أي عملية مسار تستهلك السطر — الرابط بين BOM والـRouting |
substitute_items | بدائل عند عدم توفّر الأساسي |
- الكمية الأساسية افتراضها 1 (لكل قطعة)؛ التعبئة المشتركة (مثل كرتونة لكل طقم) تُعالَج على مستوى التجميعة الأب لا على كل قطعة.
- متعدد المستويات: قد يكون مكوّن السطر نفسه ذا
BOM(تجميعة فرعية / نصف مصنّع)، والـMRPيفكّكه تكراريًا. - المستهلكات الزهيدة (تكلفة مهملة يصعب قياسها لكل وحدة) لا تُدرَج كسطر، بل تُعامَل كتكلفة غير مباشرة (
overhead) عبر علم أو حذف. - القيمة
Phantomفيbom_typeتمثّل تجميعة عابرة يُفكَّك من خلالها دون تخزينها — مذكورة دون تفصيل سلوكها هنا.
الكيان: المسار (Routing)
مسار التصنيع: تسلسل العمليات ومن ينفّذ كلًا منها وكم تستغرق — يتيح الجدولة وحساب الزمن. يتكوّن من رأس (Routing_Header) وعمليات (Routing_Operation).
رأس المسار (Routing_Header)
| الحقل | الوصف / القاعدة |
|---|---|
routing_id | المفتاح الأساسي |
item_id | مفتاح خارجي ← الصنف |
routing_type | تعداد { Production, Repair, Inspection } |
version | مُؤصَّل بالإصدار |
lot_size_from / lot_size_to | قد يكون للمنتج مسارات مختلفة حسب حجم الدفعة |
status | تعداد { Draft, Active, Inactive } |
effective_from / effective_to | نافذة الصلاحية |
total_lead_time | محسوب آليًا |
عملية المسار (Routing_Operation)
| الحقل | الوصف / القاعدة |
|---|---|
operation_no | تسلسل 10، 20، 30 — مضاعفات 10 للسماح بالإدراج (15، 25) دون إعادة ترقيم |
description | وصف العملية |
work_center_id | مفتاح خارجي ← مركز العمل |
tool_id | مفتاح خارجي ← الأداة (قابل لـ null) — الإسطمبة/القالب المطلوب |
setup_time | زمن إعداد ثابت مستقل عن حجم الدفعة |
run_time_per_unit | زمن التشغيل لكل وحدة |
cavity_count | وحدات لكل دورة — الافتراضي 1؛ أكبر من 1 لتعدد التجاويف |
cycle_time | زمن الدورة/الكبسة الواحدة — يُستخدم مع cavity_count |
queue_time | انتظار قبل البدء — يُضاف لزمن التوريد لا للتكلفة |
move_time | نقل للعملية التالية — زمن توريد لا تكلفة |
inspection_required | منطقي (هل تتطلب فحصًا) |
critical_operation | منطقي — لا يمكن تخطّيها |
required_skill_code | المهارة المطلوبة |
- المعادلة المحورية للقولبة/تعدد المخرجات:
time_per_piece = cycle_time / cavity_count؛ والافتراضيcavity_count = 1يعيدها للسلوك العادي للتصنيع المنفصل. queue_timeوmove_timeيؤثران في زمن التوريد لكن غالبًا لا يُحسبان في التكلفة.- قد تتطلب العملية أداة بالإضافة لمركز العمل — ويجب توفّر الاثنين معًا للتشغيل (تقاطع موارد).
الكيان: مركز العمل (Work Center)
حيث يحدث العمل. هو الواجهة بين الإنتاج والمحاسبة — كل التكاليف تتدفّق من خلاله.
| الحقل | الوصف / القاعدة |
|---|---|
wc_id | المفتاح الأساسي |
description | وصف |
category | تعداد { Machine, Labor, SetupGroup } |
plant_location | الموقع داخل المصنع |
cost_center_id | مفتاح خارجي ← مركز التكلفة |
capacity_unit | تعداد { Hours, Pieces, Kg } |
daily_capacity | الطاقة اليومية لوحدة واحدة |
capacity_multiplier | عدد الآلات/العمال المتطابقين في المركز (تجميع طاقة) |
efficiency_percent | معامل الكفاءة |
utilization_percent | معامل الاستغلال |
calendar_id | الورديات والعطلات |
setup_cost_rate / labor_cost_rate / machine_cost_rate / overhead_rate | معدلات التكلفة (إعداد/عمالة/آلة/غير مباشر) |
labor_calc | تعداد { Hourly, PieceRate } |
bottleneck_flag | منطقي — اختناق |
معادلة الطاقة الفعّالة: effective_capacity = daily_capacity × capacity_multiplier × efficiency% × utilization% — ويستخدم الـCRP الطاقة الفعّالة لا الإجمالية.
- قاعدة الفصل: ما يحدّد مركز عمل منفصل هو نوع العملية وتكلفتها لا عدد الآلات. آلات متطابقة بعمل وتكلفة متطابقة = مركز واحد بمضاعِف؛ عمل أو تكلفة مختلفة = مراكز منفصلة.
الكيان: الأداة / الإسطمبة (Tool / Mold)
في صناعات القولبة الإسطمبة هي قيد الطاقة لا الآلة. مُعمَّمة كـResource من نوع Tool. مصنع بلا قوالب ببساطة لا يملك موارد أدوات — فينهار التجريد بسلاسة.
| الحقل | الوصف / القاعدة |
|---|---|
tool_id | المفتاح الأساسي |
description | وصف |
product_id | المنتج الذي تصنعه — أو عدة منتجات |
cavity_count | قطع لكل دورة |
setup_time | التركيب/الفك — غالبًا كبير |
status | تعداد { Available, Mounted, Maintenance, Retired } |
life_cycles | الدورات المتوقعة قبل الاستبدال (إهلاك بالاستخدام) |
cycles_used | عدّاد جارٍ |
purchase_cost | للإهلاك لكل دورة |
- بدء التوفّر للموارد المتعددة:
available_start = MAX(earliest free time across all required resources). - الإهلاك بالاستخدام: تتآكل الأداة بالدورات لا بالتقويم؛ والمركّبة/العاملة فقط تتآكل.
depreciation_per_piece = purchase_cost / life_cycles / cavity_count.
نقطة عامة: نمط حساب العمالة (labor_calc)
يحدّد حقل labor_calc على مركز العمل (أو الصنف) طريقة حساب تكلفة العمالة المباشرة:
Hourly:cost = labor_hours × labor_ratePieceRate:cost = quantity × piece_rate(وقد يتغيّر معدل القطعة حسب المنتج/المقاس)
الأثر: تحت PieceRate يتحمّل العامل البطيء تكلفته (يكسب أقل) لا المصنع — فلا يوجد «انحراف كفاءة عمالة» تقليدي، وينتقل الانحراف إلى الآلة/التكلفة غير المباشرة. يجب أن يدعم النظام كلا النمطين.
آلات الحالات (State Machines)
حالة قائمة المكوّنات BOM_Header.status:
- Draft
- Active
- Inactive
- Obsolete
حالة المسار Routing_Header.status:
- Draft
- Active
- Inactive
حالة الأداة Tool.status (والمركّبة فقط تتآكل):
- Available
- Mounted
- Maintenance
- Retired
نقاط التهيئة والتعدادات (Config Points)
| الحقل | الموضع | القيم / الافتراضي |
|---|---|---|
bom_type | BOM_Header | Production / Engineering / Phantom |
scrap_percentage | BOM_Line | مضاعِف الـMRP (1+scrap%) |
issue_type | BOM_Line | Manual / Backflush / AutoIssue |
issue_level | BOM_Line | PerOrder / PerShift / PerOperation |
routing_type | Routing_Header | Production / Repair / Inspection |
cavity_count | Operation و Tool | عدد التجاويف؛ الافتراضي 1 |
capacity_multiplier | Work Center | تجميع الطاقة؛ الافتراضي 1 |
labor_calc | Work Center / item | Hourly / PieceRate |
resource_type | Resource | Machine / Tool / Labor |
| علم المستهلك الزهيد | BOM line / item | الحذف ← تكلفة غير مباشرة |
ماذا يعني هذا لـ Moon ERP
- وحدة
Productionالحالية هيكل رفيع: جداولbill_of_materialsوbom_componentsوbom_operationsوproduction_centersتغطّي جزءًا فقط؛ المواصفة تتجاوزها بكثير وتتطلّب توسعة أو إعادة بناء وفق «وصفة الوحدات السريرية» (جداول مسبوقة،enumsلكل آلة حالات، أحداث ومستمعون،Actionsللاستدعاء عبر الوحدات). - غياب في الـ
BOMالحالي: الإصدارات والصلاحية (effective_from/to،approved_by)، وbom_type، وissue_type/issue_level، وoperation_seqالرابط بين المكوّن والعملية، والبدائل، والتداخل متعدد المستويات (recursion). - غياب في الـ
Routing: لا يوجد كيان مسار مستقل بإصدار وصلاحية ونوع، ولا حقولcavity_count/cycle_time/queue_time/move_time/critical_operation/required_skill_code— وهي مفصلية للقولبة والجدولة. - غياب كيان الأداة/الإسطمبة تمامًا، وهو القيد الحقيقي للطاقة في صناعات القولبة، مع دورة حياته وإهلاكه بالاستخدام (
life_cycles/cycles_used). مرشّح للتمثيل عبرresource_typeأو ربطه بوحدةCMMSللأصول والصيانة. production_centersالحالي مبسّط (capacity_per_hour/cost_per_hour) ويفتقدcapacity_multiplier، الكفاءة/الاستغلال، التقويم، فصل معدلات الإعداد/العمالة/الآلة، وlabor_calc، وbottleneck_flag— كلها مطلوبة للطاقة الفعّالة والتكلفة.- الاعتماديات تُلبَّى من Core/المحاسبة: الأصناف والوحدات (
Product/Unit)، مراكز التكلفة (Accounting)، الترقيم (SequenceService)، الاعتمادات (ApprovalWorkflowService— يحتاج توسعة تعداد لـECO)، والتقويم/المهارات منHRM؛ وكلها تتكامل عبرActionsلا إعادة بناء. - «النسخة المجمّدة» عند إطلاق أمر الإنتاج تتطلّب التقاط الـ
BOM+Routingالنشطَين كلقطة — نمط جديد على وحدةProductionالحالية يجب إدخاله.
التخطيط: MPS وMRP وCRP (Planning (MPS/MRP/CRP))
طبقة التخطيط هي «عقل» وحدة التصنيع: تترجم الطلب المتوقّع والفعلي إلى خطة إنتاج ملموسة وقابلة للتنفيذ. تتكوّن من ثلاثة مكوّنات متسلسلة مع حلقة تغذية راجعة مغلقة هي MPS → MRP → CRP، وترث جميع القواعد العامة من ملف المبادئ 00 (اللقطات المجمّدة، آلات الحالة، علاقة الطلب↔التوريد متعدّدة لمتعدّد، التعشيق متعدّد المستويات، التهيئة بدل البرمجة الصلبة، تجريد الموارد).
المخرجات الثلاثة للتخطيط
تنتج طبقة التخطيط ثلاث مخرجات فقط؛ يُنصح بالاحتفاظ بها كنموذج ذهني. المدخلات هي: طلب العميل، البيانات الرئيسية (شجرة المكوّنات BOM والمسار Routing ومراكز العمل)، المخزون الحالي، إعدادات الصنف، وملكية المادة.
| # | المخرَج | السؤال الذي يجيب عنه | المنتِج |
|---|---|---|---|
| 1 | قبول الطلب وتاريخ التسليم | هل نقبل الطلب؟ ومتى نسلّم؟ | MPS + CTP |
| 2 | جدول المواد | ماذا نشتري/نصنع، وكم، ومتى | MRP |
| 3 | خطة الإنتاج التفصيلية | متى تبدأ كل مرحلة | MRP draft + CRP confirm |
المكوّن الأول: جدول الإنتاج الرئيسي (MPS)
يقرّر ماذا نُنتج وكم ومتى. في وضع الصنع حسب الطلب يتحوّل دوره من «متنبّئ» إلى «مترجِم للطلبات + فاحص قبول وطاقة». يتفرّع سلوكه حسب نوع الإنتاج production_type:
| نوع الإنتاج | السلوك |
|---|---|
MakeToStock | الطلب = استهلاك التوقّع بالطلبات الفعلية؛ اقتراح إنتاج عند نزول الرصيد المتاح PAB تحت مخزون الأمان. |
MakeToOrder | تجاهل التوقّع؛ الإنتاج المخطّط = الطلبات المؤكّدة؛ مخزون الأمان = 0؛ تشغيل فحص CTP. |
AssembleToOrder | المكوّنات تُدار كـMakeToStock والتجميع النهائي كـMakeToOrder. |
TollManufacturing | تخطيط الطاقة فقط (المادة ملك العميل — انظر MRP). |
المعادلة الأساسية: الرصيد المتاح المتوقَّع (PAB)
المعادلة الجوهرية لكل فترة زمنية t:
PAB[t] = PAB[t-1] + scheduled_production[t] - demand[t]- قيمة
demand[t]تُحسب وفق قواعد استهلاك التوقّع وحواجز الزمن أدناه.
استهلاك التوقّع (Forecast Consumption)
الطلبات الفعلية تستهلك التوقّع ولا تُضاف إليه — لمنع الحساب المزدوج:
consumed = MIN(actual_orders[t], forecast[t])remaining_forecast = forecast[t] - consumedtotal_demand[t] = actual_orders[t] + remaining_forecast- إذا تجاوزت الطلبات الفعلية التوقّع:
total_demand[t] = actual_orders[t]
الإعدادات: forecast_consumption_method ∈ {None, Backward, Forward, Both} وconsumption_window.
حواجز الزمن (Time Fences)
تُحدَّد المنطقة بحسب بُعد الفترة عن اليوم، لمنع «عصبية النظام»: الخطة قريبة المدى مستقرّة وبعيدة المدى مرنة.
| الشرط (المسافة من اليوم) | المنطقة | قاعدة الطلب |
|---|---|---|
distance ≤ DTF (Demand Time Fence) | FROZEN | الطلبات الفعلية فقط (تجاهل التوقّع). |
distance ≤ PTF (Planning Time Fence) | SLUSHY | مزج MAX/استهلاك؛ التغييرات تحتاج موافقة. |
| غير ذلك | LIQUID | الطلب = التوقّع (لا طلبات بعد). |
القدرة على الوعد (CTP — Capable to Promise)
جوهر الصنع حسب الطلب: وعد تسليم مبني على الطاقة لا على المخزون. يحسب الحِمل على كل مركز عمل عبر مسار الصنف، ويعتمد عنق الزجاجة (أعلى موعد ممكن) كموعد وعد:
- لكل عملية في المسار: إن كان مركز العمل من نوع مكبس
cycles = Q / cavity_countثمload += cycles × cycle_time + setup_time، وإلاload += Q × run_time + setup_time. - لكل مركز عمل مطلوب: إيجاد أبكر فتحة
earliest[wc] = find_earliest_slot(wc, load[wc]). - الموعد الموعود =
MAX(earliest[wc])(عنق الزجاجة يقرّر). - الإرجاع: «في الموعد» إن كان
promised ≤ D، وإلا أبكر موعد ممكن.
تقسيم الطلبات وتجميعها (Many-to-Many)
- طلب كبير ← عدّة جداول تسليم (مثلاً شهرية).
- عدّة طلبات متشابهة ← أمر إنتاج واحد (لتقليل التجهيز وتبديل القوالب).
- تُسجَّل الروابط في جدول التعشيق
Pegging: { production_order_id, sales_order_id, allocated_quantity }(يُعرَّف في الملف 06).
نموذج بيانات MPS وحساب ATP
| الكيان | الحقول الرئيسية |
|---|---|
MPS_Header | id, plan_name, plant_id, time_bucket∈{Day,Week,Month}, start_date, end_date, frozen_fence, slushy_fence, status |
MPS_Line | product_id, period_date, forecast_qty, confirmed_orders_qty, planned_production, projected_balance, safety_stock_target, available_to_promise |
المتاح للوعد ATP له ثلاثة أنماط (إعداد): Discrete (الإنتاج ناقص الطلبات حتى الإنتاج التالي)، Cumulative (مجاميع تراكمية)، وLook-ahead (الأكثر أمانًا).
المكوّن الثاني: تخطيط احتياجات المواد (MRP)
يحوّل أوامر الإنتاج إلى احتياجات مواد: ماذا نشتري/نصنع، وكم، ومتى. هو عملية وليس جدولاً، وينتج «أوامر مخطّطة» مؤقّتة. إعدادات الصنف:
| الحقل | القيم/المعنى |
|---|---|
mrp_type | Planned | ReorderPoint | NoPlanning |
procurement_type | Buy | Make |
material_ownership | Own | Customer |
lot_sizing_rule | Exact | Fixed | MinMax | EOQ | PeriodOrder |
| كميّات | lot_size, min_lot, max_lot, safety_stock, lead_time_days, reorder_point |
خوارزمية MRP وتفجير شجرة المكوّنات
تُعالَج الأصناف مستوى بمستوى من الأعلى (التام = 0) إلى الأعمق (الخام):
Gross[t]= طلب MPS (للتام) + الطلب المعتمد من الآباء (للمكوّن).Available[t] = on_hand + open_POs[t] + open_WOs[t] - reserved[t].Net[t] = MAX(0, Gross[t] - Available[t] + safety_stock).Order_Qty = apply_lot_sizing(Net[t], lot_rule).Release_Date = Required_Date - lead_time.- إن كان
procurement_type == Make: تفجير الـBOM لتوليد طلب معتمد للمكوّنات والتعشيق الأعمق تكراريًا.
تفجير الـBOM يطبّق الهدر لكل سطر: required = Q × line.quantity × (1 + line.scrap_pct)، ويتكرّر للمكوّنات من نوع Make.
قواعد تحجيم الدفعة (Lot Sizing)
| القاعدة | الناتج |
|---|---|
Exact | الصافي كما هو net |
Fixed | round_up(net, lot_size) |
MinMax | clamp(net, min, max) |
EOQ | كمية الطلب الاقتصادي |
PeriodOrder | مجموع الصافي عبر عدّة فترات ← تجميع لتقليل التجهيز/تبديل القوالب |
الأصناف كثيفة العُدد تستخدم PeriodOrder/Fixed لتجميع الطلب وتقليل تركيب القوالب.
فرع التصنيع لدى الغير (Toll) ومخرجات MRP
- عند توليد شراء لمكوّن مملوك للعميل
material_ownership == Customer: لا يُصدَر أمر شراء، بل يُتحقَّق من كفاية الكمية المورَّدة من العميل، وعند النقص يُطلق تنبيه. - المخرجات: أوامر شراء مخطّطة ← وحدة المشتريات؛ أوامر إنتاج مخطّطة ← طبقة التنفيذ؛ رسائل استثناء («سيتأخّر»، «أعِد الجدولة للداخل/الخارج»، «ألغِ»).
المكوّن الثالث: تخطيط احتياجات الطاقة (CRP)
يفترض MRP طاقة لانهائية؛ يحقن CRP الواقع للتحقّق من توفّر طاقة مراكز العمل والعُدد والعمالة في الوقت المطلوب. في مصانع العُدد يكون CRP أهمّ من MRP (المواد سهلة؛ جدولة عدّة قوالب على عدّة مكابس هي المشكلة الحقيقية).
- حساب الحِمل لكل أمر مخطّط وعملية (نفس صيغة المكبس/غير المكبس في CTP).
- توزيع الأحمال على الفترات.
- تجميع لكل مورد:
Total_Load[resource, period] = Σ loads. - المقارنة:
Util = Total_Load / effective_capacity × 100. - حلّ التحميل الزائد: إعادة جدولة / عمل إضافي / وردية إضافية / تأجيل أمر / استخدام قالب متعدّد التجاويف.
الاستغلال Util | الحالة |
|---|---|
| > 100% | OVERLOAD |
| 70%–100% | OK |
| < 70% | UNDERLOAD |
تقاطع الموارد: earliest_start = MAX(machine_free_time, tool_free_time, labor_free_time) — القيد المُلزِم هو المورد الأقل توفّرًا، والقالب مورد متنقّل يُتتبَّع عبر المكابس (resource_type ∈ {Machine, Tool, Labor}). يدعم النظام نمطين: RCCP (قطع خشن على MPS للموارد الحرجة، يستخدمه CTP لقبول الطلب) وCRP (تفصيلي على MRP لكل الموارد).
مثال الميلامين: مركز المكبس بطاقة 90 ساعة في الأسبوع 3، طلب 6000 طبق بقالب أحادي التجويف ودورة 80 ثانية = 133 ساعة، فالاستغلال 148% (تحميل زائد)؛ والحلّ المطروح استخدام قالب رباعي التجاويف = 33 ساعة فقط — ما يربط قرار جدولة (CRP) باختيار بيانات رئيسية (أيّ قالب).
الفجوة المعروفة: الجدولة التفصيلية (APS) والحلقة المغلقة
- CRP يكتشف التحميل الزائد لكنه لا يرتّب العمليات ساعة بساعة على آلات بعينها؛ مكوّن APS مستقبلي يتولّى التسلسل الزمني (Gantt) وتقليل عمليات تبديل القوالب واحترام التسخين وأنماط الورديات.
- واجهة APS: تستهلك الأوامر المخطّطة + المسار + تقاويم الموارد، وتُصدر جدولاً مرحليًا زمنيًا يُنفّذه SFC (الملف 05).
- الحلقة المغلقة: تعارض CRP يُغذّي MPS لتعديل
promised_dateوإعادة التشغيل؛ وانحرافات التكلفة (الملف 04) تُحدّث المعايير والتخطيط المستقبلي.
ماذا يعني هذا لـ Moon ERP
- وحدة
Productionالحالية تملكBillOfMaterialsوBomComponentوBomOperationوProductionOrderوProductionCenter(يحويcapacity_per_hour)، لكن لا توجد طبقة تخطيط (لا MPS ولا MRP ولا CRP) — هذه الطبقة بناء جديد بالكامل وفق نفس وصفة الوحدات. - كيانات جديدة مطلوبة بجداول مُسبَّقة:
mfg_mps_headersوmfg_mps_linesوmfg_item_mrp_settings(امتداد علىCore\Productعلى نمطAccBpExt) وmfg_planned_ordersوmfg_peggingوmfg_crp_loads. - التعدادات تُمثَّل كـ enums لكل آلة حالة:
production_typeوmrp_typeوlot_sizing_ruleوresource_typeومنطقة الزمنFROZEN/SLUSHY/LIQUIDوحالة الاستغلالOVERLOAD/OK/UNDERLOAD. - المدخلات تأتي عبر Actions من وحدات قائمة: الطلب من
Modules\Sales\SalesOrder، المتاح منModules\Inventory\StockBalance، التوريد المفتوح منModules\Purchases\PurchaseOrderوProductionOrder؛ ومخرجات الشراء المخطّط تُحوَّل إلىPurchaseRequestمع تخطّي مكوّنات العميل. - تنقص ERP اليوم: مصدر تنبؤ بالطلب (لا يوجد)، وتقويم/ورديات الموارد اللازم لـ
find_earliest_slotوeffective_capacity، وجدول تعشيق Pegging، وخدمة تحويل وحدات القياس. يجب توفيرها قبل تشغيل MPS/CRP بدقّة. - ترقيم المستندات عبر
SequenceService، وحصر الفروع عبرDataScope، وخريطة الصلاحيات تُسجَّل فيCore PermissionDependencyRegistryببادئةmfg؛ وأيّ ترحيل تكلفة لاحق يمرّ حصرًا عبرModules\Accounting\Actions\CreateJournalEntry.
التنفيذ: أوامر الإنتاج والصرف والتأكيد والاستلام (Execution)
طبقة التنفيذ هي «الواقع»: تحوّل الخطط إلى أحداث فعلية مُسجَّلة على أرض المصنع. الفارق بين المُخطَّط والفعلي يُنتج الانحرافات (تُعالَج في ملف التكاليف). تتكوّن من أربع وثائق متسلسلة — أمر الإنتاج، ثم صرف المواد، ثم تأكيد العمليات، ثم استلام المنتج التام — وكل حدث فعلي فيها يُولِّد قيداً محاسبياً فورياً في دفتر الأستاذ العام.
التسلسل العام للطبقة
Production Order— أمر الإنتاج (العقد الداخلي المُصرِّح بالإنتاج)Material Issue— صرف المواد من المخزون الخام إلى تحت التشغيلConfirmation— تأكيد ما نُفِّذ فعلياً لكل عملية (كميات، عمالة، هالك)Goods Receipt— استلام المنتج التام إلى مخزون الأصناف الجاهزة
كل وثيقة لاحقة ترتبط بأمر إنتاج محدّد، وتورِث القواعد الحاكمة من ملف المبادئ: اللقطة المُجمَّدة، آلات الحالة، الربط متعدد-إلى-متعدد بين الطلب والإمداد، التكرار متعدد المستويات، التهيئة بدل الترميز، وقيد محاسبي لكل حدث فعلي.
3.1 أمر الإنتاج (Production Order)
العقد الداخلي الذي يُصرِّح بإنتاج كمية محددة من منتج محدد. الفكرة الجوهرية هي اللقطة المُجمَّدة: عند الانتقال من Planned إلى Released يأخذ الأمر نسخة مُجمَّدة من شجرة المكوّنات BOM ومسار التشغيل Routing النشطين؛ أي تعديل لاحق على البيانات الرئيسية لا يؤثر على هذا الأمر — حمايةً للتكلفة التاريخية ومسار التدقيق.
حقول رأس الأمر Production_Order_Header
| الحقل | النوع / القيم | الملاحظة |
|---|---|---|
order_no | مفتاح أساسي | رقم الوثيقة |
order_type | Standard, Rework, Repair | نوع الأمر |
product_id, quantity | مرجع + رقم | المنتج والكمية المطلوبة |
production_type | MakeToStock, MakeToOrder, TollManufacturing | يقود منطق التفرّع (يضيف ملف 00 أيضاً AssembleToOrder) |
material_ownership | Own, Customer | «Customer» = تصنيع لدى الغير / بضاعة أمانة |
start_date, finish_date | تاريخ | التواريخ المخطَّطة |
status | Planned, Released, InProcess, Completed, Closed | آلة الحالة أدناه |
bom_snapshot_id, routing_snapshot_id | مرجع | مرجعا اللقطة المُجمَّدة |
tool_id | مرجع | القالب / الإسطمبة المُخصَّصة |
source_orders[] | قائمة | الربط Pegging — أوامر البيع التي يخدمها هذا الأمر |
wip_account | مرجع محاسبي | حساب «تحت التشغيل» الذي يُرحَّل إليه |
بنود المكوّنات Order_Component (نسخة مُجمَّدة من سطور الـ BOM)
| الحقل | الملاحظة |
|---|---|
component_id | المادة / المكوّن |
required_quantity | الكمية المطلوبة = bom_qty × order_qty × (1 + scrap%) |
issued_quantity | إجمالي المصروف حتى الآن |
reserved_quantity | المحجوز عند الإطلاق |
operation_seq | العملية التي تستهلك المكوّن |
بنود العمليات Order_Operation (نسخة مُجمَّدة من مسار التشغيل)
| الحقل | الملاحظة |
|---|---|
operation_no, work_center_id, tool_id | تعريف العملية ومركز العمل والأداة |
planned_setup_time, planned_run_time | المعايير المخطَّطة |
actual_setup_time, actual_run_time | الأزمنة الفعلية |
status | Waiting, Ready, InProgress, Completed — تستهلكها مراقبة أرض المصنع SFC |
actual_start_time, actual_end_time | طوابع زمنية |
confirmed_quantity, scrap_quantity | الكميات الفعلية لكل عملية |
آلة الحالة لأمر الإنتاج (الانتقالات وآثارها)
Planned → Released: أخذ لقطة الـ BOM والـ Routing؛ حجز المواد؛ حجز الأداة والطاقةReleased → InProcess: بدء أول صرف أو تأكيد؛ يبدأ تتبّع الزمنInProcess → Completed: اكتمال كل العمليات؛ الكمية المؤكّدة ≈ كمية الأمرCompleted → Closed: إقفال «تحت التشغيل»؛ حساب الانحرافات النهائية؛ منع أي ترحيلات لاحقة
- شبكة الأوامر: ترتبط الأوامر أباً بابن؛ أمر تجميع المنتج يولّد أوامر إنتاج القطع التي تولّد أوامر أنصاف مُصنَّعة، وكلٌّ يعرف أصله وفروعه — وتُتتبَّع التأخيرات بالسير عبر الشبكة.
- الكمية المؤكّدة قد تكون توزيعاً على درجات الجودة وليست رقماً مفرداً (راجع 3.3) — أي
confirmed_quantityيُعمَّم إلى{ grade → qty }. - فرع التصنيع لدى الغير (Toll): عند
Releasedلا تُحجَز/تُشترى مواد العميل بل يُتحقَّق من كفاية الأمانة؛ وعندClosedيذهب الناتج لملكية العميل والتكلفة = أجر التحويل فقط.
3.2 صرف المواد (Material Issue)
أول حركة محاسبية حقيقية: تنتقل المادة من مخزون الخام RM إلى «تحت التشغيل» WIP. لكل وثيقة صرف نوع وتوقيت ومستوى تفصيل.
حقول الصرف Material_Issue_Header و Material_Issue_Line
| الحقل | النوع / القيم | الملاحظة |
|---|---|---|
issue_no, issue_date | مفتاح + تاريخ | — |
issue_type | Manual, Backflush, AutoIssue | يختلف التوقيت |
issue_level | PerOrder, PerShift, PerOperation | درجة تفصيل الصرف |
order_no, operation_no, issuer_id, warehouse_from | مراجع | الأمر/العملية/الصارف/المخزن المصدر |
status | Draft, Posted, Reversed | حالة الوثيقة |
material_code, quantity | صنف + كمية | بند الصرف |
batch_no/lot_no, bin_location | قيم | تتبّع اللوط والموقع |
cost_price, total_cost | تكلفة | حسب costing_method (FIFO/LIFO/Standard/Average) |
ownership | Own, Customer | تتبّع بضاعة الأمانة |
أنواع الصرف (يختلف التوقيت)
| النوع | السلوك |
|---|---|
Manual | العامل يصرف صراحةً عند الحاجة بالكمية الفعلية — الأدق والأبطأ |
Backflush | صرف تلقائي عند التأكيد؛ الكمية = المُنتَج × الـ BOM؛ الفارق → انحراف |
AutoIssue | كل المواد تُصرف دفعة واحدة عند الإطلاق — يناسب الأوامر الصغيرة |
خوارزمية الصرف والقيد المحاسبي
- التحقق: الأمر
Released/InProcess؛ المتاح ≥ الكمية؛ المادة ضمن لقطة الـ BOM - جلب التكلفة
cost_price = get_cost(material, costing_method) - إنقاص المتاح والمحجوز؛ زيادة
WIP[order] += qty × cost_price - الترحيل:
Debit WIP / Credit Raw Materialsبمقدارqty × cost_price - تحديث
order_component[material].issued += qty
فرع الأمانة: إذا كانت ملكية المادة للعميل تُصرف من مخزون أمانة منفصل لا من مخزونك، والمحاسبة تختلف (لا يوجد «دائن مخزون خام» بتكلفتك لأنها ليست أصلاً لك)؛ تُسجَّل حركة «استهلاك مادة العميل» للتتبّع فقط.
- مستوى الصرف يُعمِّم الصرف على مستوى الوردية: يسحب العامل مواد وردية كاملة مقدّماً، وتُجرى التسوية في نهاية الوردية لإظهار انحراف الاستهلاك.
- كل سطر BOM يختار نوعه ومستواه: الثقيل/الغالي →
Manual؛ الصغير →Backflush؛ المُهمَل → يُعامَل كتكلفة غير مباشرة ولا يُصرَف. - حالة اختبار الميلامين: يسحب العامل 16 كجم بودرة وينتج 300 طبق؛ النظري = 300 × 0.15 × 1.03؛ وانحراف الاستهلاك = المصروف − (المُنتَج × الـ BOM) يُظهر هدر البودرة دون تتبّع لكل قطعة.
3.3 التأكيد (Confirmation)
يسجّل ما نُفِّذ فعلياً من الأمر لكل عملية: كم أُنتِج، كم من العمالة/زمن الآلة استُهلك، وكم الهالك — وهو المصدر الحقيقي للأرقام الفعلية مقابل المعايير.
كيانات التأكيد
| الكيان / الحقل | الملاحظة |
|---|---|
Confirmation_Header | confirmation_no, order_no, operation_no, confirmation_type {Partial,Final,Reversal}, operator_id, work_center_id, shift, timestamp |
Confirmation_Yield (مُعمَّم — توزيع لا رقم مفرد) | grade_code (A/B/C... أو درجة واحدة للمصانع العادية)، quantity، unit_sale_price (لتوزيع تكلفة المنتجات المشتركة) |
Confirmation_Detail | scrap_quantity, rework_quantity, setup_time_actual, run_time_actual, labor_hours, machine_hours, reason_code (سبب الهالك/التأخير لتحليل باريتو) |
القاعدة الجوهرية للمردود
| المؤشر | المعادلة |
|---|---|
| متطابقة المدخلات | Σ(grade quantities) + scrap = total_input |
نسبة المردود yield% | Σgrades / input |
نسبة المرور من أول مرة first_pass% | grade_A / input (مؤشر جودة رئيسي) |
خوارزمية التأكيد (مع الـ Backflush والقيود)
- التحقق: الأمر
InProcess؛ العملية مفتوحة - إن كانت العملية بها مواد
Backflush:consumed = total_input × BOM_qtyوصرف تلقائي - تكلفة العمالة حسب
labor_calc:Hourly → labor_hours × labor_rateأوPieceRate → produced × piece_rate machine_cost = machine_hours × machine_rate؛overhead = (labor_hours + machine_hours) × overhead_rate- الترحيل:
Debit WIP / Credit Labor Applied + Machine Applied + Overhead Applied - الهالك:
Debit Scrap Expense / Credit WIPبمقدارscrap × unit_cost - إن كان
Final: إقفال العملية؛ وإن لم تكن الأخيرة: تحويل العملية التالية إلىReady(← SFC)
توزيع تكلفة المنتجات المشتركة (طريقة صافي القيمة البيعية NRV)
| الخطوة | المعادلة |
|---|---|
| إجمالي القيمة البيعية | total_sale_value = Σ(grade.qty × grade.price) |
| التكلفة المخصَّصة للدرجة | grade.allocated_cost = total_cost × (grade.qty × grade.price) / total_sale_value |
| تكلفة الوحدة للدرجة | grade.unit_cost = grade.allocated_cost / grade.qty |
الدرجة الأعلى سعراً تمتصّ تكلفة أكبر؛ والمصانع العادية تستخدم درجة واحدة فيؤول الأمر إلى السلوك المعياري المفرد.
3.4 استلام المنتج التام (Goods Receipt)
الخطوة الأخيرة: يدخل المنتج التام المخزون، فيُقفَل «تحت التشغيل» ويُفتَح مخزون الأصناف الجاهزة FG، محوِّلاً التكلفة المتراكمة إلى تكلفة منتج جاهز للبيع.
كيانات الاستلام
| الكيان / الحقل | الملاحظة |
|---|---|
Goods_Receipt_Header | gr_no, gr_date, order_no, receipt_type {Full,Partial}, warehouse_to, receiver_id, status {Draft,Posted,Reversed} |
Goods_Receipt_Line (سطر لكل درجة) | item_id, received_quantity, grade_code, batch_no/lot_no, bin_location, cost_per_unit (= allocated WIP / qty), quality_status {Released,OnHold,Rejected} |
خوارزمية الاستلام (التكلفة المعيارية)
Total_WIP = Σ(material + labor + machine + overhead)- متعدّد الدرجات: تقسيم إلى سطور، لكلٍّ تكلفته المخصَّصة (راجع 3.3)؛ زيادة
FG_Inventory[item, grade] - الترحيل:
Debit FG Inventory (standard×qty) + Debit Variance Acct (الفارق) / Credit WIP (الفعلي) - إن
Full: الأمر →Completed - إن مرتبطاً بأوامر بيع: توزيع الكميات على العملاء؛ ثم حساب الانحرافات النهائية والأمر →
Closed
مثال الاستلام متعدّد الدرجات (ميلامين): أمر مكبس 100 طبق → 3 سطور + هالك: A: 70 @ 11.77، B: 18 @ 7.06، C: 7 @ 3.53، هالك 5؛ القيد: Debit FG-A 824 / FG-B 127 / FG-C 25 / Scrap 24 ; Credit WIP 1000.
فرع التصنيع لدى الغير: الناتج يذهب لملكية العميل لا لمخزونك؛ الإيراد = أجر التحويل فقط (Debit Customer / Credit Toll-service revenue)؛ ويُقفَل «تحت تشغيل التحويل» (عمالة+آلة+غير مباشر، بلا مواد).
بوابة الانحراف النهائي: عند الإقفال تُحسَب وتُحلَّل الانحرافات (سعر/استخدام/عمالة/غير مباشر) وهي مدخل طبقة التكاليف (ملف 04).
القيود المحاسبية التي تولّدها هذه الطبقة
ماذا يعني هذا لـ Moon ERP
- وحدة
Productionالحالية لديهاProductionOrderبحالاتDraft, Confirmed, InProgress, Completed, Cancelledفقط — تختلف جذرياً عن آلة المواصفة (Planned→Released→InProcess→Completed→Closed) ولا تتضمن «اللقطة المُجمَّدة» ولا وثائق الصرف/التأكيد/الاستلام؛ يلزم توسيعها أو إعادة بناؤها وفق الوصفة المعتمدة. - لا توجد كيانات
Material IssueوConfirmationوGoods Receiptفي الوحدة اليوم — تُبنى كجداول مُسبَّقة (prefixed) بآلات حالة وأحداث نطاق (Domain Events) ومُستمعين، على وصفة LIS المثبتة. - الصرف والاستلام يُسنَدان إلى وحدة
Inventoryالقائمة:InventoryIssue(بهreference_type/reference_idمناسب لربط الصرف بأمر الإنتاج) وInventoryReceiptوInventoryCostLayerوStockServiceالذي يوفّر تكلفة FIFO — أي أنget_cost()يُطلَب من Inventory لا يُحسَب داخل التصنيع. - كل القيود (WIP، خام، عمالة/آلة/غير مباشر مُحمَّل، هالك، أصناف جاهزة، انحراف، إيراد Toll) تُرحَّل حصراً عبر
Modules\Accounting\Actions\CreateJournalEntry— قيد واحد لكل حدث فعلي، تماماً كنمطPostLabInvoiceفي LIS. - تعميمات المواصفة (المردود توزيع درجات، العمالة بالقطعة، توزيع التكلفة عبر الدرجات) تُترجَم إلى حقول/تعدادات قابلة للتهيئة، احتراماً لمبدأ «التهيئة بدل الترميز» — وتنطبق على معظم المصانع بدرجة واحدة دون تعقيد.
- أرقام الوثائق عبر
SequenceService، نطاق الفروع عبرDataScope، الصلاحيات تُسجَّل فيPermissionDependencyRegistryببادئة الوحدة، وكل النماذج تَرِثBaseModel/TenantAwareلعزل الشركات (company_id).
التكاليف: العناصر والمراكز والانحرافات السبعة (Costing)
طبقة "المال" التي تترجم كل عمليات التصنيع إلى أرقام مالية وتكشف المشكلات قبل تفاقمها. تتكوّن من أربعة مكوّنات: طريقة التكلفة، عناصر التكلفة، مراكز التكلفة، وتحليل الانحرافات. وأثمن مخرجاتها هو Variance Analysis الذي يحوّل الفروق المالية إلى مشكلات محدّدة لها مالك مسؤول. تَرِث هذه الطبقة كل القواعد العامة من ملف المبادئ: كل حدث فعلي يُولّد قيداً محاسبياً، والتهيئة تسبق الكود (لا تخصيص مبرمَج لمصنع بعينه).
1. طريقة التكلفة (Costing Method)
قرار استراتيجي حول كيفية تقييم المخزون والإنتاج، يُحدَّد مرة واحدة ويصعب تغييره، وهو قابل للتهيئة لكل صنف على حدة عبر الحقل Item.costing_method. النظام مُلزَم بدعم طرق مختلطة: معيارية للمنتجات النهائية (لإتاحة الانحرافات وتقييم مخزون مستقر)، ومتوسط متحرك للمواد الخام متقلبة الأسعار.
| الطريقة (Enum) | الفلسفة | تناسب |
|---|---|---|
Standard | تكلفة معيارية مُسبقة؛ الفرق بين الفعلي والمعياري = انحراف | الإنتاج الكمّي المستقر |
Actual | تكلفة فعلية تُحسب لكل أمر إنتاج | ورش الأوامر الخاصة |
Average | متوسط تكلفة متحرّك | الأسعار المتقلبة |
FIFO | صرف أقدم دفعة أولاً | منتجات لها صلاحية |
المعادلات الأساسية:
Average: new_avg = (existing_qty×old_cost + new_qty×new_cost) / total_qtyFIFO: issue at oldest batch prices, in order
كيان بناء التكلفة المعيارية Standard_Cost يحمل: std_material_cost، std_labor_cost، std_overhead_cost، std_total_cost، last_updated، update_frequency. مثال الميلامين: المسحوق (سعر متقلب) → Average، والأطباق → Standard
2. عناصر التكلفة (Cost Elements)
إجمالي تكلفة المنتج = ثلاثة عناصر، لكل منها مصدره وحسابه: Total Cost = Direct Material + Direct Labor + Manufacturing Overhead.
| العنصر | المعادلة / المصدر | القيد المحاسبي (GL Post) |
|---|---|---|
| مواد مباشرة (Direct Material) | Σ(BOM_qty × material_price) — من قائمة المواد + سعر المادة حسب طريقة التكلفة | Debit WIP / Credit Raw Materials |
| عمالة مباشرة (Direct Labor) | حسب labor_calc: ساعي labor_hours×labor_rate أو قطعة quantity×piece_rate | Debit WIP / Credit Labor Applied |
| أعباء صناعية (Manufacturing Overhead) | overhead_rate = total_annual_overhead / total_annual_cost_driver | Debit WIP / Credit MOH Applied (عند التأكيد) |
قاعدة حاسمة لتصنيف العمالة: العمالة المباشرة هي فقط من يتغيّر أجرها مع حجم الإنتاج. الموظف ذو الراتب الثابت (ولو كان على خط الإنتاج) يُحسب ضمن الأعباء. الاختبار: هل يتغيّر الأجر مع الإنتاج؟ نعم → مباشرة، لا → أعباء.
محرّك الأعباء cost_driver ∈ { LaborHours, MachineHours, DirectMaterialCost, UnitsProduced }. أنواع الأعباء: متغيّرة (كهرباء، مستهلكات)، ثابتة (إيجار، إهلاك، رواتب)، شبه متغيّرة (صيانة). في نهاية الشهر: مقارنة الأعباء المُحمّلة بالفعلية → فرق زائد/ناقص التحميل → قائمة الأرباح والخسائر.
- المستهلكات الضئيلة (طلاء مرشوش، شريط لاصق) تُجمّع في وعاء الأعباء لا كبنود في قائمة المواد.
- إهلاك بالاستخدام للقوالب/العُدد (بعدد الدورات لا بالتقويم) — فقط العُدّة العاملة تتآكل، ويُوزّع الإهلاك لكل قطعة حسب قالبها فتتحمّل المنتجات الكبيرة/الثمينة نصيباً أكبر.
3. مراكز التكلفة (Cost Center)
وحدة محاسبية تُراكم تكاليف جزء من المصنع، فتُمكّن من قول "تكلفة الكبس X وتكلفة التجميع Y". الكيان Cost_Center يحمل: cc_id، type، parent_cc، manager_id، budget_amount، actual_amount، status.
| طريقة التوزيع (Allocation) | الآلية: خدمي ← إنتاجي |
|---|---|
Direct | المراكز الخدمية تُوزَّع على الإنتاجية فقط |
Step-Down | الخدمي على بقية الخدمية + الإنتاجية بالتتابع |
Reciprocal | كل الخدمية تتبادل التوزيع فيما بينها + على الإنتاجية |
نوع المركز type ∈ { Production, Service, Auxiliary }. قاعدة عامة: تُوزَّع التكاليف الخدمية بالسبب لا بالتساوي؛ صيانة المكابس تُحمَّل أساساً على مركز الكبس لا توزَّع بالتساوي. مثال الميلامين: صيانة 8000 بطريقة Direct → CC-PRESS 90%=7200، CC-FINISH 10%=800، CC-ASSEMBLY 0%
4. تحليل الانحرافات: الانحرافات السبعة (Variance Analysis)
المخرج الأهم. Variance = actual − standard. الإجمالي وحده عديم الفائدة؛ القيمة في التفكيك، إذ يشير كل نوع إلى مشكلة محددة ومالك مسؤول.
| # | الانحراف | المعادلة | المالك |
|---|---|---|---|
| 1 | سعر المواد MPV | (actual_price − std_price) × actual_qty | المشتريات |
| 2 | استخدام المواد MUV | (actual_qty − std_qty) × std_price | الإنتاج (هدر) |
| 3 | معدّل العمالة LRV | (actual_rate − std_rate) × actual_hours | لا ينطبق على القطعة |
| 4 | كفاءة العمالة LEV | (actual_hours − std_hours) × std_rate | الإنتاج |
| 5 | إنفاق الأعباء المتغيرة VOSV | actual_var_OH − (actual_hours × std_VOH_rate) | الإدارة |
| 6 | كفاءة الأعباء المتغيرة VOEV | (actual_hours − std_hours) × std_VOH_rate | — |
| 7 | حجم الأعباء الثابتة FOVV | (actual_production − budgeted) × std_fixed_OH/unit | المبيعات/الإدارة |
- تحت نظام
PieceRateلا ينطبقLRV/LEVالتقليديان (العامل البطيء يضر نفسه)؛ ينتقل الانحراف إلى الآلة/الأعباء. FOVVحرج عندما تكون التكاليف الثابتة كبيرة: انخفاض الإنتاج يوزّع الثابت على وحدات أقل → تكلفة وحدة أعلى. هذا يقود رؤية "شغّل بكامل الطاقة".
حدود التسامح (Tolerance): <2% طبيعي بلا تحقيق، 2–5% مراقبة، >5% يتطلّب تحقيقاً. المنطق الشهري: لكل أمر مُقفَل تُحسب الانحرافات السبعة، وكل انحراف يتجاوز الحد يُصنَّف ويُوجَّه لمالكه، ثم يُولَّد تقرير Pareto بأكبر الأسباب.
- شهرياً، لكل أمر إنتاج مُقفَل
(Closed) - احسب الانحرافات السبعة
- لكل انحراف يتجاوز حدّ التسامح: صنّفه (مواد/عمالة/أعباء) ووجّهه للمالك
- ولّد تقرير Pareto (أكبر الأسباب أولاً) — يُغذّي تصحيح التخطيط (حلقة مغلقة)
المنتجات المشتركة (Joint-products): التكلفة تتبع القيمة لا تُقسَّم بالتساوي. grade.cost = total_cost × (grade.qty × grade.price) / total_sale_value — فتمتص الدرجة A (الأغلى) أكبر تكلفة للوحدة.
محاسبة الإنتاج تحت التشغيل والإقفال الدوري (WIP & Settlement)
التكلفة منسوجة داخل التنفيذ لا مرحلة دفعية لاحقة: صرف المواد، تأكيد العمالة، وتحميل الأعباء عند التأكيد، كلٌّ يُولّد قيداً مديناً لحساب WIP؛ واستلام المنتج التام يُقفل WIP إلى المنتجات التامة. في نهاية الفترة تُسوّى فروق تحميل الأعباء إلى قائمة الأرباح والخسائر وتُحسب الانحرافات السبعة لكل أمر مُقفَل.
ماذا يعني هذا لـ Moon ERP
- القيود المحاسبية كلها تمر حصراً عبر
Modules\Accounting\Actions\CreateJournalEntry: حساباتWIP،Raw Materials،Labor Applied،MOH Applied،Finished Goods، وحسابات الانحرافات وزائد/ناقص التحميل. - مركز التكلفة موجود فعلاً:
Modules\Accounting\Models\CostCenter— يلزم التأكد من حمله للحقولtype/parent_cc/budget/actual/statusومن إمكانية وسم سطور القيدJournalEntryLineبمركز التكلفة. - تقييم المخزون متعدد الطرق لكل صنف يعتمد على
Modules\Inventory\Models\InventoryCostLayer(يدعم Average/FIFO طبقياً) مع إضافة Standard/Actual واختيار الطريقة لكل صنف. - الإقفال الدوري يستند إلى
FiscalYear/FiscalPeriodوحدثيPeriodClosed/FiscalYearClosedلتشغيل تسوية الأعباء وحساب الانحرافات شهرياً. - الإهلاك بالاستخدام للقوالب يتطلب عدّاد دورات على سجل العُدّة/القالب (غير موجود حالياً في وحدة Production) — فجوة يجب سدّها.
- سجل التكلفة المعيارية
Standard_Costوبيانات الموازنة وحجم الإنتاج المُخطَّط لكل مركز مطلوبة لحسابFOVVوانحرافات المركز.
رقابة صالة الإنتاج اللحظية (Shop Floor Control)
طبقة تتبّع لحظية تجيب على سؤال واحد: «أين يقف كل أمر إنتاج الآن؟». توفّر شاشة طرفية لكل قسم (مركز عمل) يُغلق عبرها العامل المرحلة الحالية، فينتقل الأمر تلقائياً إلى المرحلة التالية، مع لوحة متابعة حيّة للمشرف. هي طبقة فوق محرّك التنفيذ القائم، لا إعادة بناء له.
الموقع داخل المعمارية
تقع رقابة الصالة بين التخطيط والتنفيذ وتربطهما لحظياً: تقرأ مسار التصنيع Routing (التسلسل المعرّف مسبقاً كبيانات أساسية ثابتة) لتعرف «ما العملية التالية»، وتكتب التأكيد Confirmation (الإنجاز الفعلي) عبر محرّك التنفيذ القائم. تنبيه جوهري: رقابة الصالة ليست هي المسار Routing — المسار هو التسلسل المعرّف الثابت، أما رقابة الصالة فهي التنفيذ اللحظي لذلك التسلسل.
- الطبقة الجديدة المطلوب بناؤها = الواجهة اللحظية + الانتقال الآلي بين الطرفيات + لوحة المتابعة الحيّة.
- نحو 80٪ من المنطق موجود مسبقاً: المسار معرّف، وحالة العملية
Order_Operationقائمة، ومحرّك التأكيد جاهز. - هذه وظيفة بمستوى نظام تنفيذ التصنيع
MES.
الآلية الجوهرية
كل قسم يقابله شاشة طرفية لمركز عمل؛ وإغلاق العامل للمرحلة هو تأكيد عملية؛ وانتقال الأمر للمرحلة التالية هو تقدّم آلي في خطوة المسار؛ ورؤية الجميع للحالة لحظياً هي المتابعة الحيّة لصالة الإنتاج.
الكيان المحوري — حالة العملية اللحظية (Order_Operation)
هذا الكيان قائم مسبقاً على جدول Order_Operation (المعرّف في طبقة التنفيذ)؛ ودور رقابة الصالة هو تفعيل تتبّعه اللحظي فقط، لا إنشاء جدول جديد.
| الحقل | الوصف |
|---|---|
order_no | أمر الإنتاج الذي تتبع له العملية |
operation_no | رقم الخطوة داخل المسار (مثال: 10، 20، 30) |
work_center_id | مركز العمل / القسم المنفّذ |
tool_id | الأداة / القالب المرتبط بالعملية |
status | الحالة ضمن { Waiting, Ready, InProgress, Completed } |
actual_start_time | يُختم عند ضغط زر [Start] |
actual_end_time | يُختم عند ضغط زر [Done] |
confirmed_by | العامل الذي أغلق العملية |
quantity_completed | الكمية المسجّلة عند التأكيد |
آلة الحالة للعملية (operation_status)
| الحالة | الدلالة |
|---|---|
| Waiting | العملية السابقة لم تكتمل بعد؛ العملية غير قابلة للتنفيذ على طرفيتها |
| Ready | اكتملت السابقة؛ تظهر العملية في طابور الطرفية ويمكن بدؤها |
| InProgress | ضغط العامل [Start] وتم ختم actual_start_time |
| Completed | ضغط العامل [Done]؛ ختم actual_end_time وتسجيل التأكيد |
منطق التقدّم الآلي عند الضغط على «Done»
- تعيين
operation[N].status = Completedوختمend_time = now. - تسجيل التأكيد (الكمية + توزيع الدرجات + الهالك) عبر استدعاء محرّك التنفيذ القائم.
- استدعاء
routing.get_next(N)لقراءة المسار وتحديد العملية التالية. - إن وُجدت عملية تالية: تعيين
operation[next].status = Readyوإشعار مركز عملها فتظهر على طرفيته. - إن لم توجد (آخر عملية): تعيين
order.status = Completedفيصبح الأمر جاهزاً لاستلام البضاعةGR.
العلاقة الجسرية: routing.get_next(N) يجيب «ما التالي؟» (من المسار)، وحالة العملية تسجّل «أين نقف» (لحظياً).
مثال تطبيقي — مسار: كبس ← إزالة زوائد ← صنفرة ← تدريج
- طرفية الكبس: يصل
WO-001؛ يضغط العامل [Start] فتصير العمليةInProgress. - يضغط [Done] فتُسجّل الكمية وتصير العملية
Completed. - يقرأ النظام المسار فيجد التالية «إزالة الزوائد»، فيجعلها
Readyويُشعر طرفيتها. - يظهر
WO-001تلقائياً على طرفية إزالة الزوائد — وهذا هو «التقدّم». - تستمر السلسلة حتى التدريج (آخر عملية) فيصبح الأمر
Completedوجاهزاً للاستلام.
الطرفية لكل قسم (Terminal UI)
- طابور الأوامر الواردة بحالة
Ready، مرتّبة حسب الأولوية/الجدول الزمني. - للأمر النشط: زرّا
[Start]/[Done]فقط. - عند Done: طلب الكمية، وتوزيع الدرجات، والهالك مع
reason_code. - تعرض: رقم الأمر، المنتج، الكمية المستهدفة، وهذه العملية فقط.
- فرض التسلسل: لا تظهر عملية إلا بعد اكتمال سابقتها.
- مصمّمة لبيئة الصالة: أزرار لمس كبيرة، أدنى حدّ من الكتابة، واحتمال العمل دون اتصال مع المزامنة لاحقاً.
لوحة المتابعة الحيّة للمشرف (Real-time Dashboard)
لوحة حيّة تُظهر لكل أمر عمليته الحالية ونسبة إنجازها، مثل: WO-001: Sanding (Op 30) — 60%، WO-002: Pressing — just started، WO-003: Waiting for press (mold busy). ومنها كشف الاختناق اللحظي: تكدّس أوامر بحالة Waiting قبل مورد معيّن يكشف أنه القيد الحالي — ترتبط بتخطيط السعة CRP لكنها لحظية لا تقديرية.
الآثار التشغيلية الخمسة
| # | الأثر |
|---|---|
| 1 | رؤية لحظية: تعرف الإدارة موقع كل أمر بلا سؤال العمّال. |
| 2 | تغذية تلقائية للتأكيد: كل Done يُنشئ تأكيداً فورياً (كمية + وقت) فتصير بيانات التكلفة حيّة ودقيقة بلا إدخال يدوي آخر اليوم. |
| 3 | كشف اختناق لحظي: تكدّس Waiting قبل مورد يفضح القيد الحالي. |
| 4 | أزمنة تشغيل فعلية: البدء/الانتهاء لكل عملية يغذّي OEE وضبط أزمنة المسار وانحرافات الزمن (الفعلي مقابل المخطّط). |
| 5 | فرض التسلسل: لا تظهر عملية قبل اكتمال سابقتها ⇐ سلامة الجودة والعملية. |
نطاق البناء والتكاملات الاختيارية
- المطلوب بناؤه فعلياً: الواجهة اللحظية + الانتقال الآلي بين الطرفيات + اللوحة الحيّة — لا إعادة بناء التنفيذ.
- تكاملات اختيارية لنظام MES أكمل (مذكورة لا مواصَفة): التقاط بيانات الآلة
IoT، حسابOEE، مسح الباركود/RFID. - تنبيه:
OEEمذكور مرّتين دون أي معادلة أو تعريف — يُعدّ مرحلة مستقبلية؛ هذا الجزء يلتقط الأزمنة الفعلية فقط لتمكين حسابه لاحقاً.
ماذا يعني هذا لـ Moon ERP
- لا جدول جديد للكيان المحوري — يُعاد استخدام
Order_Operationمن طبقة التنفيذ، وتُضاف عليه آلة الحالة الرباعية كـenumوفق وصفة الوحدات السريرية. - التقدّم الآلي يُنفَّذ بنمط الأحداث والمستمعين: حدث عند
Done← مستمع يسجّل التأكيد ويستدعيrouting.get_nextويُشعر مركز العمل التالي. - أي ترحيل محاسبي ناتج عن التأكيد يمرّ حصراً عبر
Modules\Accounting\Actions\CreateJournalEntry— لا كتابة مباشرة في دفتر الأستاذ. - صلاحيات
mfg.{resource}.{action}(مثلmfg.terminal.confirm) تُسجَّل فيPermissionDependencyRegistryبـ Core، ونطاق الفروع عبرDataScope، والترقيم عبرSequenceService. - طرفية الصالة تُبنى في واجهة Angular بمفاتيح ترجمة إنجليزية أولاً؛ والإشعار اللحظي يحتاج قناة بثّ (websockets/إشعارات Core) لدفع الأوامر الجاهزة على الطرفية التالية.
- لوحة الاختناق تستهلك
CRPكمرجع للسعة المخطّطة وتقابلها بالواقع — يتطلب جاهزية طبقتي التخطيط والتنفيذ أولاً (الطبقة 11 في ترتيب البناء).
التكاملات ونموذج البيانات الموحد وترتيب البناء (Integrations & Data Model)
يحدد هذا الجزء من المواصفة كيف يتصل تطبيق التصنيع بالوحدات القائمة في النظام (المبيعات، المشتريات، المخزون، دفتر الأستاذ العام، الموارد البشرية) دون إعادة بنائها، ويجمع كل كيانات الوحدة في نموذج علائقي واحد، ويفرض ترتيب بناء مُلزماً تعتمد كل خطوة فيه على ما قبلها. القاعدة الحاكمة من الملف 00: «العمومية» — كل سلوك خاص بمصنع معين يُعبَّر عنه كحقل/قائمة قيم (enum) مع تفريع منطقي، لا كمسار شيفرة منفصل.
1. خريطة التكامل — «التصنيع ليس جزيرة»
تنص المواصفة صراحةً على أن وحدة التصنيع تتكامل مع وحدات موجودة بالفعل في النظام المضيف ويجب عدم إعادة بنائها. الوحدات الخارجة عن النطاق (تُدمج ولا تُبنى): دفتر الأستاذ العام، نواة المخزون/المستودعات، نواة المشتريات، طلبات المبيعات، الموارد البشرية/الرواتب.
| الوحدة الخارجية | الاتجاه | ما الذي ينتقل |
|---|---|---|
المبيعات Sales | ← إلى التصنيع | طلبات العملاء تُطلق إنتاجاً حسب الطلب (MTO) أو تصنيعاً لدى الغير (Toll)؛ تُعاد تواريخ الوعد للمبيعات |
المشتريات Procurement | → من التصنيع | تخطيط الاحتياجات (MRP) يُصدر أوامر شراء مخططة؛ الاستلامات تُحدّث التوفر |
المخزون Inventory | ↔ ثنائي الاتجاه | حجوزات المواد، حركات المادة الخام ← تحت التشغيل ← المنتج التام، التتبع بالدفعة/اللوط، مخزون الأمانة (مملوك للعميل) |
دفتر الأستاذ العام General Ledger | → من التصنيع | كل صرف/تأكيد/استلام يُرحّل قيوداً محاسبية (تحت التشغيل، العمالة/الآلة/الأعباء المحمّلة، الانحرافات) |
الموارد البشرية HR | → إلى التصنيع | معدلات أجور العمالة؛ كميات العمل بالقطعة تغذّي الرواتب عكسياً |
2. قواعد التكامل الجوهرية
- الأمانة / التصنيع لدى الغير (Consignment / Toll): المادة المملوكة للعميل تُحفظ في دلو مخزون منفصل بقيمة
ownership = Customer، ولا تُقيَّم أبداً كأصل خاص بالمصنع، ولا تُطلق أبداً عملية شراء. - القيود المحاسبية فورية: منسوجة داخل أحداث التنفيذ لحظياً، وليست دفعة ليلية مجمّعة.
- الحجوزات في المخزون: تُنشأ عند إطلاق الأمر (Release) وتُستهلك عند صرف المواد (Material Issue).
3. نموذج البيانات الموحد — البيانات الأساسية (Master Data)
| الكيان | المفتاح / العلاقات | أهم الحقول والقواعد |
|---|---|---|
Item مرجعي من النظام المضيف | item_id PK | name, uom, procurement_type, material_ownership, costing_method, lead_time_days, safety_stock — يُشار إليه ولا يُملك داخل التصنيع |
BOM_Header | bom_id PK، parent_item_id FK→Item | bom_type, version, base_quantity, uom, status, effective_from, effective_to, created_by, approved_by |
BOM_Line | FK→BOM_Header (1—*)، component_id FK→Item | line_no, quantity, uom, scrap_percentage, issue_type, issue_level, operation_seq, substitute_items |
Routing_Header | routing_id PK، item_id FK→Item | routing_type, version, lot_size_from, lot_size_to, status, effective_from, effective_to, total_lead_time |
Routing_Operation | FK→Routing_Header (1—*)، FK→Work_Center، FK→Tool | operation_no, description, setup_time, run_time_per_unit, cavity_count, cycle_time, queue_time, move_time, inspection_required, critical_operation, required_skill_code |
Work_Center | wc_id PK، cost_center_id FK→Cost_Center | category, plant_location, capacity_unit, daily_capacity, capacity_multiplier, efficiency_percent, utilization_percent, calendar_id, setup_cost_rate, labor_cost_rate, machine_cost_rate, overhead_rate, labor_calc, bottleneck_flag |
Tool مورد resource_type=Tool | tool_id PK، product_id FK→Item | description, cavity_count, setup_time, status, life_cycles, cycles_used, purchase_cost — الإهلاك بالاستخدام (الدورات) لا بالزمن |
4. نموذج البيانات الموحد — التخطيط (Planning)
| الكيان | المفتاح / العلاقات | أهم الحقول |
|---|---|---|
MPS_Header | id PK | plan_name, plant_id, time_bucket, start_date, end_date, frozen_fence, slushy_fence, status |
MPS_Line | FK→MPS_Header، product_id FK→Item | period_date, forecast_qty, confirmed_orders_qty, planned_production, projected_balance, safety_stock_target, available_to_promise |
Item_MRP_Settings | item_id FK→Item | mrp_type, procurement_type, material_ownership, lot_sizing_rule, lot_size, min_lot, max_lot, safety_stock, lead_time_days, reorder_point |
MRP_Planned_Order عابر — يُعاد توليده كل تشغيلة | item_id FK→Item | order_type, quantity, required_date, release_date, source_demand_id, mrp_run_id |
CRP_Load مُخرَج | resource_id | resource_type, period, required_load, available_capacity, utilization_pct, status |
5. نموذج البيانات الموحد — التنفيذ (Execution)
| الكيان | المفتاح / العلاقات | أهم الحقول والقواعد |
|---|---|---|
Production_Order_Header | order_no PK، FK→Item، FK→Tool | order_type, quantity, production_type, material_ownership, start_date, finish_date, status, bom_snapshot_id, routing_snapshot_id, wip_account — لقطة مجمّدة للـBOM والمسار عند الإطلاق |
Order_Component | FK→PO_Header، FK→Item | required_quantity, issued_quantity, reserved_quantity, operation_seq |
Order_Operation | FK→PO_Header، FK→Work_Center، FK→Tool | operation_no, planned_setup_time, planned_run_time, actual_setup_time, actual_run_time, status, actual_start_time, actual_end_time, confirmed_by, confirmed_quantity, scrap_quantity — الحالة تُدار من طبقة SFC |
Material_Issue_Header | issue_no PK، FK→PO_Header | issue_date, issue_type, issue_level, operation_no, issuer_id, warehouse_from, status |
Material_Issue_Line | FK→MI_Header، material_code FK→Item | quantity, batch_no, cost_price, total_cost, bin_location, ownership |
Confirmation_Header | confirmation_no PK، FK→PO_Header | operation_no, confirmation_type, operator_id, work_center_id, shift, timestamp |
Confirmation_Yield العائد توزيع لا قيمة مفردة | FK→Conf_Header | grade_code, quantity, unit_sale_price — منتجات مشتركة بدرجات A/B/C بأسعار مختلفة |
Confirmation_Detail | FK→Conf_Header | scrap_quantity, rework_quantity, setup_time_actual, run_time_actual, labor_hours, machine_hours, reason_code |
Goods_Receipt_Header | gr_no PK، FK→PO_Header | gr_date, receipt_type, warehouse_to, receiver_id, status |
Goods_Receipt_Line سطر لكل درجة | FK→GR_Header، FK→Item | received_quantity, grade_code, batch_no, bin_location, cost_per_unit, quality_status |
6. نموذج البيانات الموحد — التكلفة والكيانات العابرة (Costing & Cross-cutting)
| الكيان | المفتاح / العلاقات | أهم الحقول |
|---|---|---|
Standard_Cost | item_id FK→Item | std_material_cost, std_labor_cost, std_overhead_cost, std_total_cost, last_updated, update_frequency |
Cost_Center | cc_id PK، parent_cc FK→Cost_Center (هرمي) | type, manager_id, budget_amount, actual_amount, status |
Variance_Record | FK→PO_Header | variance_type, amount, percentage, classification, owner, investigation_flag |
Pegging طلب↔توريد متعدد لمتعدد | FK→PO_Header، FK→SalesOrder | allocated_quantity — يربط طلب مبيعات بعدة أوامر إنتاج والعكس |
Delivery_Schedule تجزئة الطلب | schedule_id PK، FK→SalesOrder، FK→PO_Header | quantity, scheduled_date, status, linked_production_order |
7. ملخص العلاقات والتعدديات الرئيسية
Item 1—* BOM_Header 1—* BOM_Line *—1 Item(مكوّن) — متعدد المستويات تكراريItem 1—* Routing_Header 1—* Routing_Operation *—1 Work_Center، وRouting_Operation *—1 ToolWork_Center *—1 Cost_CenterSales_Order *—* Production_Order(عبرPegging)، وSales_Order 1—* Delivery_ScheduleProduction_Order 1—*من:Order_Component / Order_Operation،Material_Issue،Confirmation(←Yieldبالدرجات)،Goods_Receipt(سطر لكل درجة)،Variance_Record
8. قوائم القيم الحاكمة (Enums — file 00 §0.5)
| القائمة | القيم |
|---|---|
production_type | MakeToStock, MakeToOrder, AssembleToOrder, TollManufacturing |
material_ownership | Own, Customer |
procurement_type | Buy, Make |
costing_method | Standard, Actual, Average, FIFO |
labor_calc | Hourly, PieceRate |
issue_type | Manual, Backflush, AutoIssue |
issue_level | PerOrder, PerShift, PerOperation |
resource_type | Machine, Tool, Labor |
lot_sizing_rule | Exact, Fixed, MinMax, EOQ, PeriodOrder |
order_status | Planned, Released, InProcess, Completed, Closed |
operation_status | Waiting, Ready, InProgress, Completed |
9. ترتيب البناء المُلزَم — كل خطوة تعتمد على سابقتها
- البيانات الأساسية + CRUD (BOM تكراري، Routing، Work_Center، Tool)
- إعدادات MRP للصنف
Item_MRP_Settings+ التكلفة المعياريةStandard_Cost - خطة الإنتاج الرئيسية MPS (استهلاك التنبؤ، أسوار الزمن، CTP)
- تخطيط الاحتياجات MRP (التفجير التكراري، تحجيم الدفعات، فرع التصنيع لدى الغير)
- تخطيط الطاقة CRP (تقاطع الموارد، كشف التحميل الزائد)
- أمر الإنتاج (اللقطة المجمّدة، آلة الحالة، شبكة الأوامر)
- صرف المواد (3 أنواع، 3 مستويات، الأمانة)
- التأكيد (توزيع الدرجات، الأجر بالقطعة، القيود)
- استلام البضاعة (متعدد الدرجات، بوابة الانحراف، فرع التصنيع لدى الغير)
- التكلفة (الطرق، العناصر، مراكز التكلفة، 7 انحرافات)
- مراقبة أرضية المصنع SFC (حالة العمليات لحظياً، واجهة الطرفيات، التقدم التلقائي، لوحة المعلومات)
- التكاملات (المبيعات، المشتريات، المخزون، دفتر الأستاذ، الموارد البشرية)
10. المراحل المستقبلية المُحددة (غير مفصّلة)
| المكوّن | واجهة الاتصال بالبناء الحالي |
|---|---|
الجدولة التفصيلية APS | يستهلك الأوامر المخططة + تقاويم الموارد ← جدول زمني مرحلي لـ SFC |
إدارة الجودة QMS | يربط درجات/أسباب التأكيد؛ بوابات فحص على العمليات |
| إدارة العدد/القوالب | يوسّع كيان Tool: دورة الحياة، الصيانة، تتبع الدورات، تنبيهات الاستبدال |
الصيانة الوقائية PM | يخفّض طاقة Work_Center أثناء نوافذ التوقف |
الكفاءة الكلية OEE | يستهلك أزمنة Order_Operation الفعلية والهالك |
إدارة دورة حياة المنتج PLM / ECO | يحكم أوامر تغيير BOM/Routing (يُضفي رسمية على مفهوم اللقطة) |
ماذا يعني هذا لـ Moon ERP
- تملك Moon ERP بالفعل وحدة
Productionلكنها رفيعة جداً (3 ترحيلات / 7 نماذج:BillOfMaterials, BomComponent/Operation, ProductionOrder, ProductionCenter) ولا تغطي MPS/MRP/CRP ولا التكلفة ولا التأكيد متعدد الدرجات ولا SFC — هذه المواصفة تتطلب توسعتها جذرياً وفق «وصفة الوحدات» (جداول مُسبَّقة، enums لكل آلة حالة، أحداث + مستمعون، Actions للنداءات عبر الوحدات). - التكامل المحاسبي يُنفَّذ عبر
Modules\Accounting\Actions\CreateJournalEntryفقط (نمط النداء المتزامن المُعتمَد كما فيPostLabInvoice)، ويجب أن يكون فورياً عند كل صرف/تأكيد/استلام كما تفرض المواصفة. - الطلب↔التوريد عبر
PeggingوDelivery_Scheduleيربط مباشرةً بكيانSalesOrderفي وحدة Sales القائمة؛ والأوامر المخططة من MRP تُغذّي وحدة Purchases (PurchaseRequest/PurchaseOrder). - حجوزات وحركات المادة الخام←تحت التشغيل←التام والدفعات/المواقع تُسند إلى وحدة
Inventoryالقائمة (InventoryMovement, StockBalance, InventoryCostLayer) مع الحاجة لدلو ملكية منفصل لمخزون الأمانةownership=Customer. - تُسجَّل خرائط الصلاحيات في
Core PermissionDependencyRegistryبادئةmfg، ويُطبَّق نطاق الفرع عبرCore DataScope، وترقيم المستندات عبرSequenceService، والكيانات ترثBaseModel/TenantAware (company_id). - معدلات أجور العمالة والأجر بالقطعة (
labor_calc) تتبادل مع وحدةHRM(الرواتب/بنود الراتب)؛ ومراكز التكلفةCost_Centerتتقاطع مع مراكز التكلفة في وحدة Accounting. - المراحل المستقبلية تنسجم مع وحدات Moon القائمة:
QMSللجودة،CMMSللصيانة الوقائية وإدارة العدد/القوالب — ما يقلّل البناء الجديد لو رُبطت الواجهات منذ الآن.
ملحق: متطلبات عميل مصنع الأدوية كما وردت (Pharma Client Requirements)
هذا ملحق للتحليل المنشور يُفرّغ مقابلة مالك مصنع أدوية يعمل تصنيعاً للغير بالأوردر (Toll / Make-to-Order) إلى مواصفة متطلبات مرقّمة وقابلة للاختبار. الملحق يضيف واجهة العميل في بداية دورة الحياة — التسعير الاستكشافي، قائمة التركيب المبدئية، الباتش التجريبي، بوابة الدفعة المقدمة، وشاشات المراحل — وهي أمور لم يغطّها التحليل الأصلي. الملحق لا يُعيد فتح القرارات المُعتمدة سابقاً (مواد العميل والأمانة D-15، الحجز A5، آلة حالات الأمر، عائلات القيود في القسم 22)، بل يركّب المتطلبات الجديدة فوق تلك القضبان الجاهزة. كل ما يلي يعيش داخل Modules/Production الموسَّعة ببادئة mfg_* للجداول الجديدة وبادئة الصلاحيات production.*.
ترجمة كلام العميل إلى المصطلح القياسي ثم إلى ركيزة النظام
| كلام العميل | المصطلح القياسي للتصنيع للغير | الركيزة في Moon ERP (هذا الملحق) |
|---|---|---|
| دورة التكلفة الاستكشافية / تسعير مبدئي | تسعير عرض الأسعار (RFQ / quotation costing) | جدولان جديدان mfg_cost_estimates + mfg_cost_estimate_versions (التسمية القانونية من الملحق 34 — سُحبت الأسماء المؤقتة mfg_quotations/mfg_quotation_costings)؛ مستند العرض للعميل يُعاد استخدام SalesQuotation (D-29) |
| التركيبة، وR&D تعمل قائمة تركيب مبدئية | قائمة تركيب مبدئية/هندسية (Draft / Engineering BOM) | bill_of_materials بنوع bom_type=Engineering وحالة status=Draft (امتداد مُعتمد في خريطة 20) |
| عينة / باتش تجريبي للعميل | باتش تجريبي/نموذجي (Pilot / Sample batch) | جدول جديد mfg_trial_batches + أمر إنتاج حقيقي بوسم order_type=Trial |
| دفعة تحت حساب | بوابة دفعة العميل المقدمة (Customer advance gate) | جدول جديد mfg_customer_advances بمفتاح ملف الأمر case_id (الملحق 35) + شرط مانع للإصدار وللشراء بالنيابة معاً؛ القبض عبر سند القبض ReceiptVoucher/ApproveReceiptVoucher (التعديل المعتمد LA-1/D-33) |
| العميل يورّد خامته وتظل ملكه | مواد العميل / الإصدار الحر (أمانة، ملكية العميل) (Free-issue / consignment) | material_ownership=Customer + warehouses.is_consignment (قرار D-15 المُعتمد) |
| حجز الخامات لهذا الأوردر | حجز مواد مربوط بالأمر (Order-pegged reservation) | StockService::reserve()/release() (الفجوة A5) |
| واجهات لكل مرحلة إنتاجية تنقل الأوردر | شاشات بوابات المراحل (Stage-gate workspaces) | جدول جديد mfg_order_stage_gates بمفتاح ملف الأمر case_id يقود آلة مراحل الملف (الملحق 35) من الشاشات — وتفسير «مرحلة إنتاجية» (مراحل تجارية أم مراحل تصنيع فيزيائية) مُسجَّل سؤالاً مفتوحاً OQ-9 |
| كل المستندات مربوطة بأوردر العميل | نَسَب المستندات المربوط بالأمر (Order-pegged lineage) | mfg_peggings + وسم sales_order_id على كل مستند تصنيعي |
الدورة الأولى — التكلفة الاستكشافية (تسعير عرض الأسعار)
دورة لا تُحدث أي أثر مخزني أو محاسبي؛ مخرجها عرض سعر مؤقت يبدأ دورة الإنتاج إذا قَبِله العميل.
| الرقم | المتطلب | الجهة الفاعلة | المُحفّز | المخرجات | القاعدة الحاكمة |
|---|---|---|---|---|---|
| R-01 | استقبال طلب التسعير من العميل | المبيعات / الواجهة الأمامية | العميل يقدّم منتجاً بتركيبته ويطلب سعراً | mfg_cost_estimates بحالة Draft ومرقّم عبر SequenceService بمفتاح 'cost_estimate' | طلب التسعير ليس أمر بيع ولا يُحدث مخزوناً ولا قيداً؛ هو رأس نَسَب مربوط بأمر العميل |
| R-02 | R&D تبني قائمة تركيب مبدئية | قسم البحث والتطوير | إسناد الطلب إلى R&D (توجيه عمل لا حالة — آلة الملحق 34 الرشيقة) | قائمة تركيب bom_type=Engineering وstatus=Draft مرتبطة بالتقدير | القائمة المبدئية لا تُسحب إلى أمر إنتاج؛ فقط القائمة Active/Production قابلة للإصدار — مع استثناء واحد معتمد (D-32): أوامر Trial خلف الإعداد production.trial_allow_draft_bom؛ الأوامر العادية أبداً |
| R-03 | الحسابات تحتسب التكلفة المبدئية | الحسابات / مهندس التكلفة | جاهزية القائمة المبدئية (DraftBomReady ← الحالة Estimated عند الحساب) | mfg_cost_estimate_versions: خامات + عمالة + أعباء ← تكلفة الوحدة ← هامش ← سعر معروض + valid_until | يُعاد استخدام محرك التجميع نفسه (ComputeStandardCost) لكن على القائمة المبدئية وينتج تقديراً لا تكلفة معيارية؛ بلا قيد محاسبي |
| R-04 | إعادة التكلفة/العرض المبدئي للعميل | المبيعات | اعتماد التكلفة (Quoted) | مستند عرض سعر مؤرّخ الصلاحية يُرسل للعميل | العرض يحمل نافذة صلاحية صريحة؛ بعد انتهائها يلزم إعادة تسعير قبل التحويل لأمر |
تسلسل الدورة الأولى
- العميل يقدّم المنتج + التركيبة + الكمية المستهدفة ← المبيعات تفتح
mfg_cost_estimatesبحالةDraft. R-01 - الإسناد إلى R&D ← بناء قائمة تركيب مبدئية
Engineering/Draft. R-02 - الإسناد إلى الحسابات ← تفجير القائمة وتطبيق معدلات مركز العمل و
cost_driver← نسخة فيmfg_cost_estimate_versions(الحالةEstimated). R-03 - اعتماد التكلفة (
Quoted) ← المبيعات تعيد التكلفة المبدئية للعميل كمستند مؤرّخ الصلاحية. R-04 - نهاية الدورة الأولى — بلا مخزون ولا قيد ولا التزام؛ المخرج عرض مُسعّر يُمهّد للدورة الثانية إن قُبِل.
الدورة الثانية — الإنتاج (تصنيع حسب الطلب): المرحلة (أ) التجربة
| الرقم | المتطلب | الجهة الفاعلة | المُحفّز | المخرجات | القاعدة الحاكمة |
|---|---|---|---|---|---|
| R-05 | طلب باتش تجريبي/عينة | المبيعات ← R&D | العميل يطلب عينة للتقييم | mfg_trial_batches + أمر إنتاج بوسم order_type=Trial مربوط بالطلب | التجربة عملية حقيقية بتكلفة حقيقية تستهلك مواداً وتراكم تحت تشغيل وتُرحّل القيود كاملة؛ تنفّذها R&D وتُميَّز فقط بـTrial ليُفصل تقريرها وتُستبعد من المعايرة حتى تُعتمد |
| R-06 | تنفيذ وتكليف التجربة | R&D / خط التجربة | إصدار أمر التجربة | تأكيدات وتكلفة وعائد/خردة التجربة؛ actual_unit_cost وresult | تتبع التجربة نفس قضبان الإصدار→الصرف→التأكيد→الاستلام→الإقفال (بلا منطق ترحيل جديد). من يتحمل تكلفة التجربة وماذا يحدث عند فشلها غير محدَّدين — انظر OQ-1/OQ-3 |
| R-07 | تقييم العميل للتجربة | العميل (تُسجِّله المبيعات) | تسليم العينة للعميل بمستند تسليم العينة (R-20) — مخرَج التجربة يقيم في دلو التقييم لا في مخزون التام القابل للبيع | result = Passed | Failed | تسجيل القرار مشروط بوجود مستند التسليم (sample_delivery_doc_id)؛ الفشل يمنع إنشاء الأمر الرسمي حتى تنجح تجربة جديدة أو يتخلى العميل؛ إعادة التجربة ترجع إلى R-05 |
الدورة الثانية — المرحلة (ب): أمر رسمي ← تثبيت ← تخطيط ← دفعة ← حجز ← تصنيع ← استلام
| الرقم | المتطلب | الجهة الفاعلة | المُحفّز | المخرجات | القاعدة الحاكمة |
|---|---|---|---|---|---|
| R-08 | التحويل إلى أمر عميل رسمي | المبيعات | موافقة العميل (بعد العرض و/أو نجاح التجربة) | أمر بيع مؤكد SalesOrder؛ الطلب Converted | كل المستندات من هنا تُربط بأمر العميل؛ الأمر الرسمي هو مرتكز الطلب لخطة الإنتاج والربط |
| R-09 | R&D تثبّت قائمة التركيب | البحث والتطوير | إنشاء الأمر الرسمي | ترقية القائمة إلى bom_type=Production وstatus=Active (نسخة نشطة واحدة لكل نافذة سريان) | القائمة النشطة فقط مؤهلة لتجميد لقطة الإصدار؛ الترقية انتقال حالة محكوم لا تعديل في المكان |
| R-10 | التخطيط يحدد الاحتياجات والجاهزية | التخطيط | تثبيت القائمة | قائمة الاحتياج (إجمالي←صافي)، النواقص، حكم الجاهزية، ومسوّدات طلبات شراء تُجهَّز ولا تُرفع | يجب فصل المواد المشتراة بمعرفة المصنع عن مواد العميل المورَّدة (إصدار حر، ملك العميل، في مخزن الأمانة — تُستلم بمستند R-19)؛ مواد العميل لا تُشترى ولا تُقيَّم. طلبات الشراء بالنيابة لا تُرفع إلا بعد بوابة الدفعة (R-11) — فهي علة الدفعة عند العميل (قاعدة U-6) |
| R-11 | بوابة الدفعة المقدمة | الحسابات (تسجّل) — البوابة في ReleaseProductionOrder | جاهزية التخطيط + الحاجة لشراء مواد بالنيابة | mfg_customer_advances بمفتاح الملف (Received) عبر سند قبض reference_type='mfg_order_case' وسطره دائن لحساب الدفعات — قيد السند نفسه (مدين نقدية / دائن دفعات العملاء — التزام) هو الترحيل الوحيد (LA-1/D-33؛ يُسحب تصميم CreateJournalEntry المباشر السابق) | البوابة تمنع الإصدار والشراء بالنيابة معاً (لا حجز ولا رفع طلبات شراء موسومة ولا تصنيع) حتى تُستوفى (مُستلمة أو مُعفاة بصلاحية)؛ تُسوَّى الدفعة لاحقاً على الفاتورة النهائية (production_advance_settlement). النسبة غير محددة — OQ-2/D-25 |
| R-12 | حجز المواد لهذا الأمر (أثر جانبي للإصدار R-13) | النظام (داخل ReleaseProductionOrder — وفق الصف 13 المعتمد: الحجز لا يسبق الإصدار أبداً) | تنفيذ ReleaseProductionOrder (الذي تسبقه بوابة الدفعة R-11) | كتابة reserved_quantity لكل مكوّن عبر StockService::reserve() وحجز الأداة | الحجز مربوط بالأمر فلا يَعِد أمران بنفس الرصيد؛ مكوّنات العميل تُحجز من مخزن الأمانة والمكوّنات المملوكة من المخزون الذاتي |
| R-13 | إنشاء أمر التصنيع (الإصدار) | التخطيط / مدير الإنتاج | استيفاء بوابة الدفعة (R-11) والوضع المالي سليم | الأمر Planned → Released؛ تجميد لقطة القائمة والمسار + تنفيذ الحجز كأثر جانبي (R-12)؛ حدث ProductionOrderReleased | الإصدار هو النقطة الوحيدة التي تجمّد اللقطة وتُطلق الحجز وتجهيز الفحص ذرّياً (يُصحَّح الترتيب الدائري السابق بين R-12 وR-13)؛ بوابة الدفعة تسبق هذا الانتقال |
| R-14 | صرف المواد | أمين المخزن | إصدار الأمر | mfg_material_issues ← ApproveIssue ← مدين تحت التشغيل / دائن خام (المملوكة)؛ مواد العميل حركة تتبّع فقط | تفرّع الملكية لكل سطر؛ مواد العميل لا تُدين خاماً ذاتياً ولا تُحمّل تكلفة مادة على WIP (تكلفة تحويل فقط)؛ يُستهلك الحجز هنا |
| R-15 | التصنيع (تأكيدات العمليات) | المشغّلون / الخط | الأمر تحت التشغيل | mfg_confirmations + قيود أجور وأعباء محمّلة؛ تقدّم آلي للعملية التالية | إعادة استخدام محرك التأكيد والتقدّم الآلي للمحطات دون تغيير |
| R-16 | الإنهاء والاستلام في مخزن التام | أمين المخزن / النظام | تأكيد العملية الأخيرة | mfg_goods_receipts ← ApproveReceipt ← مدين تام / دائن WIP (المملوك) أو فرع التشغيل: تام بملكية العميل + إخلاء خامة النيابة (production_toll_material_cogs، R-21) + الفاتورة النهائية | في أمر التشغيل يكون التام ملك العميل؛ الفاتورة النهائية — تُنشأ للأمام عبر الإجراء الرفيع الجديد Sales\CreateServiceInvoice (سدّ U-4؛ لا نداء متحكم ولا كتابة مباشرة) — تحمل أجر التحويل + سطر تمرير الخامة المشتراة بالنيابة (R-21) وتُسوَّى عليها الدفعة (production_advance_settlement)؛ وتمر للفوترة الإلكترونية |
المتطلبات العابرة للمراحل
- R-17 شاشات بوابات المراحل: واجهة Angular لكل مرحلة تعرض بيانات تلك المرحلة فقط وزر/أزرار التقدّم للمرحلة التالية، مدعومة بجدول
mfg_order_stage_gatesبمفتاح الملف (من حرّك الملف ومتى ومن أين إلى أين). كل انتقال محكوم بصلاحيةproduction.*. المراحل التجارية (Quotation,Trial,Awaiting-Advance…) تعيش على آلةmfg_order_cases(الملحق 35) — آلة حالات أمر الإنتاج المعتمدة (Planned → Released → InProcess → Completed → Closed) لا تتسع ولا تُمسّ. الشاشات لا تتجاوز أي آلة حالات — الزر يستدعي نفس الـActionالذي تعرضه الواجهة البرمجية. تفسير «مرحلة إنتاجية» مُسجَّل OQ-9. - R-18 نَسَب المستندات المربوط بالأمر: كل تقدير وتجربة ودفعة وأمر إنتاج وصرف وتأكيد واستلام يحمل مفاتيح الربط؛ ويجب أن يعيد عرض النَسَب بناء السلسلة: طلب تسعير ← قائمة مبدئية ← عرض ← تجربة ← أمر رسمي ← قائمة مثبّتة ← خطة ← دفعة ← حجز ← أمر تصنيع ← صرف ← تأكيدات ← استلام ← فاتورة تشغيل.
- R-19 استلام/إرجاع خامة العميل (مستند إدخال الأمانة — سدّ U-2): خامة العميل الحرة تدخل مخزن الأمانة عبر مستند استلام مخزني حقيقي يعتمده
ApproveReceiptبفرع تتبّعي بلا تقييم وبلا قيد (ملك العميل في عُهدة)، بمرجع الملف وتسجيل اللوطات في الأنساب؛ والمتبقي غير المستخدم يعود عند الإقفال بمستند الصرف المرآتي + تسوية ختامية (المستلَم − المصروف − خردة الأمانة D-30 = المرتجع). لا رصيد مخزني يُمسّ خارج مستندات الاعتماد أبداً. - R-20 تسليم عينة التجربة للعميل (سدّ U-3): مخرَج التجربة يُستلم في دلو تقييم (مخزن-كحالة، غير قابل للبيع)، والتسليم للعميل مستند تسليم عينة (صرف تتبّعي من دلو التقييم) يُختم على
mfg_trial_batches— وتسجيل قرار العميل (R-07) مشروط بوجوده. - R-21 فوترة الخامة المشتراة بالنيابة (تمرير — سدّ U-1): الخامة المشتراة لحساب العميل ملك المصنع حتى الفوترة (مخزون ذاتي محجوز للملف وأوامر شراؤها موسومة «تُفوتر على العميل»)؛ عند استلام التام في فرع التشغيل تُخلى حصتها من WIP بقيد
production_toll_material_cogs، وتحمل الفاتورة النهائية سطر تمرير الخامة بالتكلفة (+ نسبة مناولة تعاقدية) بجوار أجر التحويل — فتتسوّى الدفعة (نسبة من تكلفة الخامة، D-25) على فاتورة تحتوي الخامة التي موّلتها: حساب النقدية يُقفل.
تسلسل الدورة الثانية الكامل
- طلب التجربة: العميل يطلب عينة ←
mfg_trial_batches+ أمرorder_type=Trialتنفّذه R&D مربوطاً بالتقدير/الملف. R-05 - تشغيل التجربة: إصدار→صرف→تأكيد→استلام→إقفال حقيقي؛ التقاط تكلفة/عائد/خردة التجربة؛ المخرَج إلى دلو التقييم ثم تسليمه بمستند العينة. R-06 R-20
- تقييم التجربة: قرار العميل (مستند التسليم شرط) ←
PassedأوFailed؛ الفشل ← إعادة تجربة أو تخلٍّ. R-07 - الأمر الرسمي: عند الموافقة تنشئ المبيعات أمر العميل المؤكد؛ كل ما بعده يُربط به. R-08
- تثبيت القائمة: R&D ترقّي المبدئية إلى
Production/Active. R-09 - التخطيط والجاهزية: احتساب الاحتياجات (إجمالي←صافي)، فصل المشترى بالنيابة عن مواد العميل، مسوّدات طلبات شراء تُجهَّز ولا تُرفع. R-10
- بوابة الدفعة: لأن المصنع يشتري الخام بالنيابة، يجب أن يدفع العميل دفعة مقدمة ←
Receivedعبر سند القبض (LA-1)؛ الإصدار والشراء بالنيابة محجوبان حتى الاستيفاء — وطلبات الشراء تُرفع الآن فقط. R-11 - إدخال خامة العميل (إن وُجدت): تُستلم في مخزن الأمانة بمستند الاستلام التتبّعي. R-19
- إنشاء أمر التصنيع (الإصدار): تجميد اللقطة وتنفيذ الحجز كأثر جانبي (مخزون ذاتي و/أو أمانة + الأداة) وإطلاق
ProductionOrderReleased. R-13 R-12 - صرف المواد: إدانة WIP للمملوكة؛ مواد العميل حركة تتبّع فقط. R-14
- التصنيع: تأكيدات العمليات وقيود الأجور/الأعباء والتقدّم الآلي. R-15
- الإنهاء والاستلام في مخزن التام: مدين تام / دائن WIP (المملوك) أو فرع التشغيل (تام بملكية العميل + فاتورة نهائية = أجر تحويل + سطر تمرير الخامة R-21 تُسوَّى عليها الدفعة)؛ إرجاع/تسوية خامة العميل غير المستخدمة (R-19)؛ الأمر يكتمل ويُقفل. R-16
- شاشات المراحل (R-17) تنقل الأمر بين كل خطوة، والنَسَب (R-18) يبقيه مربوطاً بأمر العميل طوال الوقت.
الأشياء الجديدة/المعدّلة التي يُدخلها هذا الملحق
| الكائن | الحكم | ملاحظات |
|---|---|---|
mfg_cost_estimates | جديد | رأس التقدير/طلب التسعير (الاسم القانوني من الملحق 34): العميل، المنتج المرشَّح، الكمية، draft_bom_id، sales_quotation_id (إعادة استخدام)، حالة رشيقة {Draft, Estimated, Quoted, Won, Lost}، وsales_order_id عند الفوز |
mfg_cost_estimate_versions | جديد | تقدير مُؤرشَف بالإصدارات غير قابل للتعديل: خامات/عمالة/أعباء، تكلفة الوحدة، الهامش، السعر المعروض، valid_until، أساس التسعير |
mfg_order_cases | جديد (الملحق 35) | مظلّة الدورة الثانية التجارية: آلة 14 مرحلة، حقول الدفعة، مخزن الأمانة، القائمة المعتمدة؛ ملف واحد ↔ N أوامر إنتاج — وآلة حالات أمر الإنتاج لا تُمسّ |
mfg_trial_batches | جديد | case_id، cost_estimate_id، production_order_id (أمر Trial)، الكمية، التكلفة الفعلية، النتيجة {Pending, Passed, Failed}، ومستند تسليم العينة (R-20). أُبقي كياناً مستقلاً (خلافاً لميل الدليل 32 لعلمٍ على الأمر) لأن الملف يمتد عبر N أوامر إعادة تجربة لكلٍّ حكمه وتسليمه |
mfg_customer_advances | جديد | case_id (دفعة واحدة للتعاقد — الملحق 35)، المبلغ، النسبة، الحالة {Due, Received, Waived}، receipt_voucher_id، journal_entry_id (قيد السند — LA-1)، applied_invoice_id |
mfg_order_stage_gates | جديد | جدول التدقيق والانتقال خلف الشاشات بمفتاح الملف (الملحق 35): الملف، من مرحلة، إلى مرحلة، الفاعل، لقطة البوابة، التوقيت |
| مستندا إدخال/إرجاع الأمانة + مستند تسليم العينة | امتداد/جديد رفيع | فرع تتبّعي لمستندي ApproveReceipt/ApproveIssue لخامة العميل (R-19) + مستند صرف تتبّعي من دلو التقييم للعينة (R-20) — لا مساس مباشراً بالأرصدة أبداً |
bill_of_materials.bom_type/status | امتداد مُعتمد | Engineering+Draft = القائمة المبدئية الاستكشافية؛ Production+Active = المثبّتة (لا عمود جديد) |
production_orders.order_type | امتداد | إضافة Trial للتعداد ليصبح التشغيل التجريبي أمراً مستقلاً منفصل التقرير |
ReleaseProductionOrder | امتداد | إضافة شرط بوابة الدفعة المقدمة قبل اللقطة والحجز — ونفس البوابة تحجب رفع طلبات الشراء بالنيابة |
| حساب وأنواع القيود | امتداد محاسبي | production_customer_advance (قيد السند — LA-1/D-33)، production_advance_settlement (التسوية عند الفوترة — اسم واحد قانوني)، production_advance_refund (D-35)، عائلة سياسة التجربة production_trial_absorb/_defer/_apply/_writeoff (D-23)، وproduction_toll_material_cogs (R-21)؛ + مفتاح إعداد production.customer_advance_account_id يُزرع عبر AutoAccountService |
ما لم يحدده العميل — أسئلة مفتوحة تتطلب اعتماداً قبل البناء
| الرقم | السؤال المفتوح | لماذا يهم | الافتراض المقترح (بانتظار المجلس) |
|---|---|---|---|
| OQ-1 | من يدفع تكلفة الباتش التجريبي؟ العميل أم يتحملها المصنع؟ | يحدد هل تُفوتر التجربة للعميل أم تُرحّل كمصروف بحث وتطوير داخلي — يؤثر على قيد R-06 | سياسة لكل ملف trial_cost_policy ∈ {Bill, Absorb, CreditOnWin} بعائلة قيودها (الملحق 35 §1.1) — اعتُمدت D-23 وسُحب الاقتراح الثنائي السابق |
| OQ-2 | نسبة الدفعة المقدمة؟ ثابتة، لكل عميل، لكل أمر، أم على أساس تكلفة الخامات؟ | تحدد مبلغ بوابة R-11 وسياسة الائتمان | إعداد production.default_advance_percent مع تجاوز لكل أمر؛ الإصدار الأول = نسبة من تكلفة المواد المشتراة بالنيابة |
| OQ-3 | ماذا لو فشلت التجربة؟ إعادة (من يدفع؟)، إعادة تفاوض، أم تخلٍّ؟ | يؤثر على حلقة R-07 وملكية التكلفة وإغلاق النَسَب | إعادة التجربة مسموحة؛ ملكية التكلفة تتبع قرار OQ-1؛ تجارب فاشلة متكررة ← وسم تلقائي للمراجعة |
| OQ-4 | ملكية خردة مواد العميل المورَّدة (الإصدار الحر) — تُعاد، تُفوتر، أم تُشطب على العميل؟ | خردة الأمانة ملك العميل ولا يجوز تقييمها كمصروف خردة ذاتي | تتبّع خردة الأمانة منفصلة (بلا قيد خردة ذاتي)، تسوية/إعادة للعميل حسب العقد، تظهر في تقرير حركة أمانة |
| OQ-5 | فترة صلاحية سعر العرض (valid_until) | العروض المنتهية يجب إعادة تسعيرها قبل التحويل (R-04←R-08) | إعداد production.quote_validity_days (افتراضي 30)؛ العرض المنتهي يحجب التحويل حتى إعادة التسعير |
| OQ-6 | سياسة استرداد/مصادرة الدفعة عند إلغاء العميل بعد استلامها | معالجة التزام حساب دفعات العملاء | حسب العقد؛ الافتراضي = تُطبَّق على التكلفة المتكبَّدة والباقي قابل للرد |
| OQ-7 | هل شاشات المراحل حصرية بالدور (كل مرحلة لقسم) أم يمكن لمستخدم تغطية مراحل؟ | يحدد دقة الصلاحيات في R-17 | شريحة صلاحية لكل مرحلة تحت production.*؛ دور المشرف يغطي كل المراحل |
| OQ-8 | علاقة كمية التجربة الدنيا/المستهدفة بكمية الأمر الكامل | تسوية تكلفة التجربة على الأمر الكامل | كمية التجربة مستقلة؛ تكلفة الأمر الكامل يُعاد تقديرها من فعليات التجربة |
| OQ-9 | ما معنى «واجهات لكل مرحلة إنتاجية»؟ مراحل الملف التجارية (R&D/تخطيط/دفعة/حجز — قراءة الملحق 35) أم مراحل التصنيع الفيزيائية (خلط/تحبيب/كبس/تعبئة — مرجَّحة دوائياً)؟ | يحدد هل تكفي ورش الملف (المرحلتان 2–2.5) لإيفاء R-17 أم تلزم إضافةً ورش لكل عملية مسار (المرحلة 5) | يُسأل العميل عند بوابة المرحلة 0؛ الافتراض: ورش الملف 2–2.5، وإن تأكدت قراءة مراحل التصنيع فورش العمليات مع المرحلة 5 + شاشة مراقبة قراءة-فقط مبكرة في 2.5 |
تعديلات خطة الطريق (على القسم 23)
- المرحلة 0 (مسار الملاحق): اعتماد الأسئلة المفتوحة عبر السجل المرجعي الوحيد في الملحق 36 رابعاً (D-23..D-36 + OQ-9) — لا بالترقيم الموضعي القديم «OQ-1..OQ-8 = D-23..D-30» (سُحب؛ مثلاً OQ-1/OQ-3←D-23، OQ-2←D-25، OQ-4←D-30، OQ-5←D-34، OQ-6←D-35، OQ-7←D-28، OQ-8←D-36). بوابة صلبة: لا بناء لواجهة العميل دون هذه القرارات.
- مرحلة جديدة 2.5 — «واجهة العميل» (M) بعد المرحلة 1 (التنفيذ الحقيقي) والمرحلة 2 — لأن معدلات العمالة/الماكينات و
cost_driverالتي يسعّر بها التقدير تصل في المرحلة 2 — وقبل المرحلة 4 (التخطيط):mfg_cost_estimates+ النسخ، دورة حياة القائمة المبدئية،mfg_trial_batchesمع دلو التقييم ومستند العينة (تركب قضبان أوامر المرحلة 1 بوسمTrial)، وشاشات الدورة الأولى والملف. نواة الملف وبوابة الدفعة (mfg_customer_advances+ شرط الإصدار) وجدول البوابات تصل أصلاً في المرحلة 2 — انظر الملحق 36 ثالثاً (الذي أعاد تسمية الموضع المؤقت «1.5»). - لا تغيير على مراحل الأمانة/التشغيل والحجز والتأكيد والانحرافات — هذا الملحق يستهلكها.
ملحق: تدقيق التغطية — ما المغطى وما الجديد (Coverage Audit vs Published Analysis)
هذا القسم ملحقٌ للتحليل المنشور (التقارير 00–24)، يقيس مقابلته بمتطلبات عميل فعلي: مصنع أدوية يعمل تصنيعاً للغير بالأوردر (toll / contract manufacturing). اشتُقّت من مقابلة صاحب المصنع تسعة متطلبات IR-1..IR-9 (أُعيد ترقيمها من R-01..R-09 بعد المراجعة لإنهاء التصادم مع مخطط الملحق 30 المرجعي R-01..R-21)، ودُقّق كلٌّ منها مقابل خريطة البناء (20) وتحليل الفجوات (21) وعقود التكامل (22) وخطة المراحل (23) والمواصفة (00–06). الخلاصة: قلب التصنيع المرتبط بالأوردر والتصنيع بمواد العميل مغطّى بالكامل، لكن القمع التجاري والهندسي قبل الأوردر (التسعير الاستكشافي، دفعة التجربة، بوابة الدفعة المقدمة، وواجهات المراحل) خارج نطاق المواصفة ويحتاج بنوداً جديدة.
المتطلبات المشتقّة من المقابلة
تصف المقابلة دورتين ومطلباً واجهيّاً شاملاً:
- الدورة 1 — التكلفة الاستكشافية: العميل يحضر منتجاً بتركيبته ويطلب تسعيراً استكشافياً ← طلب ←
R&Dيضع قائمة مواد مبدئية (Draft BOM) ← المحاسبة تحسب تكلفة مبدئية ← تُعاد للعميل كعرض سعر. (IR-1, IR-2, IR-3) - الدورة 2 — الإنتاج بالأوردر: كل المستندات مربوطة بأوردر العميل (
IR-4)؛ مرحلة تجربة بدفعة عيّنة حقيقية التكلفة يصنعهاR&D(IR-5)؛ عند الموافقة ← أوردر رسمي ←R&Dيعتمد قائمة المواد والتخطيط يحدد الكميات والجاهزية (IR-6) ← دفعة تحت حساب إلزامية قبل الحجز لأن المصنع يشتري الخامات نيابةً عن العميل (IR-7) ← قد يورّد العميل خامات تبقى ملكه (IR-8) ← حجز ← أمر تصنيع ← صرف ← تصنيع ← استلام للمخزن. - واجهات المراحل (
IR-9): شاشات مخصّصة لكل مرحلة إنتاجية يُنقل الأوردر منها من مرحلة لأخرى — أوسع من طرفيات عامل طابق المصنع.
جدول الأحكام — متطلبٌ متطلبٌ مقابل التحليل المنشور
| # | المتطلب (العميل) | الحكم | أين يُغطّى / ما الناقص |
|---|---|---|---|
IR-1 | طلب تسعير استكشافي (RFQ) ككيان استقبال أول | ❌ غير مغطى | لا كيان RFQ/طلب تسعير في أي مكان. المواصفة (00–06) تبدأ من طلب بيع مؤكَّد فقط (md/02 سطور 19/89/282) ولا تذكر تسعيراً مسبقاً؛ و21-gaps لا تُدرج فجوة تسعير/عرض سعر. دورة ما قبل البيع بأكملها خارج النطاق المنشور. |
IR-2 | R&D يضع قائمة مواد مبدئية قبل أي أوردر | 🟡 جزئياً | دورة حياة القائمة موجودة: BomStatus {Draft, Active, Inactive, Obsolete} (20 صف 2؛ 01 سطر 255؛ تُفعَّل في المرحلة 0/1). الناقص: (أ) R&D كفاعل/مالك لحالة Draft (الصلاحيات مسطّحة production.* بلا فصل R&D)؛ (ب) قائمة مواد لمنتج عميل محتمل غير مُسجَّل — قائمة Moon تتطلب product_id؛ (ج) سير العمل من الطلب إلى القائمة. |
IR-3 | المحاسبة تحسب تكلفة مبدئية ← عرض سعر للعميل | 🟡 جزئياً | محرك التكلفة موجود: ComputeStandardCost / RollUpStandardCost + mfg_standard_costs (20 صفوف 23–25؛ 23 المرحلة 3؛ 04 §4.1–4.2). الناقص: تشغيل اللفّ على قائمة Draft قبل وجود منتج/أوردر وحفظه كعرض سعر (لا كيان عرض سعر)؛ مناولة «المحاسبة تراجع ثم تُعيد السعر»؛ وتعارض توقيتي — اللفّ مجدول في المرحلة 3 بينما تسعير الدورة 1 مطلوب قبل المرحلة 1. |
IR-4 | كل مستندات الدورة 2 مربوطة بأوردر العميل (تتبّع كامل) | ✅ مغطى بالكامل | mfg_peggings (production_order_id, sales_order_id, sales_order_item_id, allocated_quantity) يربط كل أمر إنتاج بطلب البيع (20 صف 26؛ 22 §1 صف Sales و§2 الأحداث؛ source_demand_id يحمله عبر MRP). production_type=MakeToOrder يقود الفرع المرتبط بالأوردر؛ شبكة الأوامر أب/ابن تمشي طقم→قطعة→نصف مصنّع. |
IR-5 | مرحلة تجربة/عيّنة حقيقية التكلفة يصنعها R&D ويقيّمها العميل | ❌ غير مغطى | order_type ∈ {Standard, Rework, Repair} فقط (03 سطر 24/291؛ 20 صف 13). لا نوع أمر Trial/Sample/Pilot، ولا تدفّق «اصنع للتقييم ← بوابة موافقة ← حوِّل لأمر إنتاج». التجربة عملية حقيقية بتكلفة حقيقية ← تحتاج مسار الصرف/التأكيد/الاستلام (موجود) لكن مُبوَّباً كتجربة بنتيجة تقييم تُرقّي الأمر أو توقفه — وهذا جديد كلياً. أقرب بند منشور B5/B13 وليس دورة التجربة. |
IR-6 | بعد الموافقة ← أوردر رسمي ← اعتماد القائمة ← التخطيط يحدد الكميات والجاهزية | 🟡 جزئياً | اعتماد القائمة (Draft→Active) مغطّى (20 صف 2)؛ كميات وجاهزية التخطيط مغطّاة بـ MRP/CRP (20 صفوف 11–12؛ 23 المرحلة 4). الناقص: أوركسترا العملية بين الأقسام «موافقة ← مناولة R&D ← مناولة التخطيط» كسير عمل مُتتبَّع بملكية قسم لكل مرحلة (يرتبط بـ IR-9). المحرّكات موجودة؛ خط المناولة المرحلي بملكية الأقسام غير موجود. |
IR-7 | بوابة دفعة مقدمة قبل الحجز/الشراء (المصنع يشتري الخامات نيابةً عن العميل) | ❌ غير مغطى | لا بوابة مالية بين التخطيط والحجز. ReleaseProductionOrder المنشور يحجز دون شرط (22 §2؛ 23 المرحلة 1 «أثر الإطلاق: احجز المخزون»؛ 03 سطر 63). المواصفة بلا أي مفهوم دفعة مقدمة. مطلوب: (أ) مستند دفعة/عربون (Sales/Accounting)؛ (ب) شرط قبل الإطلاق يفحص كفاية الدفعة؛ (ج) دلالات «شراء الخامات نيابةً عن العميل» (شراء يُعاد تحميله على العميل). B18 يخص فوترة مخرجات الأجرة وليس عربوناً مسبقاً. |
IR-8 | خامات العميل تبقى ملكه وتُمزج مع خامات المصنع | ✅ مغطى بالكامل | production_type=TollManufacturing + material_ownership {Own, Customer} على الأمر والمكوّن وسطر الصرف (03 سطور 27/107/128؛ 20 صفوف 13/17). الأمانة = مخازن warehouses.is_consignment — مُحتفظ بها، لا تُقيَّم، لا تُشترى (قرار D-15؛ 21 A15؛ 22 §1 Inventory). صرف الأجرة حركة تتبّع فقط بلا قيد خامة. مزج ملكية العميل والمصنع في أمر واحد هو عين نموذج ownership لكل سطر. (ملاحظة: مجدول في المرحلة 6 — إن كان هذا عميل الإطلاق فيُسحب للأمام، قرار D-07.) |
IR-9 | شاشات مخصّصة لكل مرحلة لنقل الأوردر بينها | 🟡 جزئياً | طرفيات عامل طابق المصنع مغطّاة (طرفية لمسية لكل مركز عمل، طابور Ready، Start/Done، لوحة مشرف — 20 §5؛ 23 المرحلة 5؛ 05). الناقص: طاولات عمل مرحلية للمكتب الخلفي لرحلة الأوردر كاملة — شاشة R&D، التخطيط، بوابة الدفعة المالية، الحجز/الصرف، التجربة — كلٌّ يملك مرحلته ويوفّر زر «انقل للمرحلة التالية» بمناولة محكومة بالدور. الواجهة المنشورة منظّمة حسب الوحدة الوظيفية لا كخط مراحل متمحور حول الأوردر. |
السبب الجذري للفجوات
التحليل المنشور خريطةٌ تنفيذية للمواصفة، والمواصفة نفسها تبدأ من أوردر عميل مؤكَّد وتنتهي باستلام تام الصنع وحساب تكلفته — تنمذج المصنع ودفاتره ببراعة. لكن سير العميل يضيف قمعاً تجارياً وهندسياً قبل الأوردر لم تتصوّره المواصفة:
- قمع التسعير قبل البيع (IR-1→IR-3): طلب ← تركيبة R&D مبدئية ← سعر استكشافي ← عرض. لا تسعير ولا وضع تكلفة استكشافي ولا فاعل R&D في المواصفة — الطلب مؤكَّد سلفاً حين يبدأ نموذجها. أكبر نقطة عمياء، وهي تجارية لا تصنيعية.
- دورة دفعة التجربة (IR-5): تشغيل إنتاجي حقيقي لكنه مؤقّت نتيجته قرار عميل، لا مخزون تام. تعداد
order_typeبلا حالة تجربة. - شراء مشروط بالدفعة (IR-7): قاعدة ضبط نقدي لأعمال الأجرة (لا تشترِ خامة قبل دفع العميل) عند نقطة الإطلاق. المواصفة تحجز دون شرط.
- سير عمل مرحلي بالأقسام + واجهاته (IR-6 جزئياً، IR-9): العميل يفكّر بالأقسام والمراحل؛ الخطة المنشورة تفكّر بالمحرّكات والوحدات. المحرّكات موجودة وطبقة الأوركسترا وشاشاتها غير موجودة.
كل ما هو أسفل الأوردر الرسمي المؤكَّد (دورة حياة القائمة، MRP/CRP، الحجز، الصرف، التأكيد، الاستلام، التكلفة، أمانة الأجرة، الربط) مغطّى بالفعل — IR-4 وIR-8 إصابتان مباشرتان، وIR-2/IR-3/IR-6 تُعيد استخدام محرّكات قائمة ينقصها غراء سير العمل.
بنود العمل الجديدة (إضافة لخطة 23) — C-01..C-08
| المعرّف | البند | يغطّي | الحجم | المرحلة المستهدفة |
|---|---|---|---|---|
C-01 | كيان طلب تسعير/تكلفة استكشافية mfg_costing_requests (+سطور): العميل، وصف/تركيبة المنتج المُحضَر، حالة {Requested, BomDrafted, Priced, Quoted, Won, Lost}، ربط بالقائمة المبدئية (C-02) والعرض (C-03)؛ ترقيم عبر SequenceService. | IR-1 | M | مرحلة 2.5 جديدة (ما قبل البيع — أُعيدت تسميتها من «1.5» لأنها تحتاج معدلات المرحلة 2) |
C-02 | قائمة مواد Draft لمنتج عميل محتمل: إمّا product_id قابل للإفراغ مع اسم منتج مؤقت، أو منتج بحالة lifecycle=Prospect؛ + ملكية R&D بصلاحيات production.rnd.bom.{draft,finalize}. | IR-2, IR-6 | M | مرحلة 1 (القائمة v2) + مرحلة 0 (الصلاحيات) |
C-03 | وضع تكلفة استكشافي + مستند عرض سعر: تشغيل RollUpStandardCost على قائمة Draft بأسعار تقديرية، حفظه في mfg_cost_estimates، وإصدار عرض سعر (إعادة استخدام عرض سعر Sales إن وُجد وإلا mfg_quotes) مع خطوة مراجعة محاسبية؛ سحب جزء من لفّ التكلفة من المرحلة 3 للأمام. | IR-3 | M | سحب جزء من المرحلة 3 إلى 2.5 (بعد وصول معدلات العمالة/الأعباء في المرحلة 2) |
C-04 | نموذج فاعل/قسم R&D: تسجيله كدور/قسم بشريحة صلاحيات خاصة ومالكاً لمرحلتي القائمة المبدئية والتجربة؛ توسعة مساهم production في PermissionDependencyRegistry؛ تمييز ملكية R&D/التخطيط/المالية/الطابق لتوجيه المراحل (يغذّي C-08). | IR-2, IR-5, IR-6 | S | مرحلة 0 (طبقة الصلاحيات) |
C-05 | نوع أمر تجربة/عيّنة: إضافة Trial (أو علم is_trial)؛ يشغّل مسار الصرف→التأكيد→الاستلام+القيد الحقيقي لكن مُعلَّماً تجربة، مخرجه لمستودع تقييم (غير قابل للبيع)، وعند التقييم إمّا يُرقَّى لأمر إنتاج رسمي أو يُغلق خاسراً؛ أحداث TrialBatchProduced, TrialApproved/Rejected. | IR-5 | M | جديدة بين المرحلتين 1 و2 |
C-06 | بوابة الدفعة المقدمة: مستند دفعة (إعادة استخدام دفعة مقدمة Sales/Accounting إن وُجدت — يُتحقَّق، وإلا mfg_order_deposits) بنسبة مطلوبة ومبلغ مستلم وحالة؛ + شرط في ReleaseProductionOrder يمنع الحجز/الشراء حتى المستلم ≥ المطلوب؛ ووسم أوامر الشراء المُثارة من MRP كقابلة لإعادة التحميل على العميل على ألّا تُرفع طلبات الشراء بالنيابة إلا بعد استيفاء البوابة — فهي تحكم الشراء كما تحكم الإصدار (علة الدفعة عند العميل؛ التخطيط يجهّز مسوّدات فقط). | IR-7 | M | مرحلة 1 (شرط الإطلاق) + مرحلة 4 (وسم الشراء) |
C-07 | سحب الأجرة/الأمانة للأمام (قرار D-07): نقل warehouses.is_consignment وملكية المادة لكل سطر وفرع قيد الأجرة من المرحلة 6 ← 1/2. مُصمَّم بالكامل (IR-8) — تغيير جدولة لا تصميم. | IR-8 (توقيت) | — | إعادة جدولة المرحلة 6 للأمام |
C-08 | خط مراحل الأوردر + شاشات طاولات العمل المرحلية: نموذج حالة سير عمل واحد للأوردر (Request→DraftBom→Quoted→Trial→Agreed→BomFinal→Planned→DepositGate→Reserved→InProduction→Received) بمالك مرحلة لكل خطوة، وشاشات مكتب خلفي لكل مرحلة (R&D، التخطيط، بوابة المالية، الحجز/الصرف، مراجعة التجربة) بزر «انتقل للتالي» بمناولة محكومة بالدور، ولوحة خط متمحورة حول الأوردر. منفصلة عن طرفيات الطابق. تنبيه تفسيري (OQ-9): هذا يقرأ «مرحلة إنتاجية» كمراحل الملف التجارية؛ إن قصد العميل مراحل التصنيع الفيزيائية (خلط/تحبيب/كبس/تعبئة) فالجواب ورش لكل عملية مسار — يُحسم عند بوابة المرحلة 0. | IR-6, IR-9 | L | لوحة MVP في المرحلة 2 + الورش الحرجة في 2.5؛ الإكمال في 5 (الملحق 36 ثالثاً) |
جداول جديدة من هذا الملحق: mfg_costing_requests (+سطور)، mfg_cost_estimates، واختيارياً mfg_quotes (يُفضَّل إعادة استخدام عرض سعر Sales)، واختيارياً mfg_order_deposits (يُفضَّل إعادة استخدام دفعة مقدمة محاسبية/بيعية). صافٍ 2–4 جداول mfg_* جديدة فوق الـ24 المنشورة، رهن التحقق من إمكانية إعادة الاستخدام.
قرارات مطلوبة من الإدارة (تمتدّ من D-01..D-22)
الترقيم المرجعي = الملحق 36 رابعاً (D-23..D-36 + OQ-9). هذا الجدول اقترح القرارات؛ السجل المرجعي يحمل الأرقام والتوصيات النهائية ويتقدّم على أي تباين أدناه (مثلاً توصية D-24 هنا تجاوزها اعتماد order_type=Trial).
| # | القرار | التوصية |
|---|---|---|
D-31 (كان «D-23» مؤقتاً هنا) | نطاق دورة التسعير قبل البيع | بناء C-01..C-03 — هو مدخل هذا العميل؛ بدونه الدورة 1 بلا خدمة |
D-24 | نمذجة دفعة التجربة | علم is_trial + حالة فرعية على أمر الإنتاج (يعيد استخدام مسار المرحلة 1 كاملاً، الأخف) |
D-25 | إنفاذ بوابة الدفعة | منع صارم بعتبة قابلة للضبط لكل أمر/عميل؛ إعادة استخدام الدفعة المقدمة في Moon إن وُجدت |
D-26 | قائمة Draft لمنتج محتمل | حالة Product.lifecycle=Prospect (تحافظ على تكامل المفتاح وتُرقّى نظيفاً عند الفوز) |
D-27 | توقيت الأجرة/الأمانة لهذا العميل | سحب للأمام (هذا مصنع أجرة — مُشغِّل D-07 اشتعل) |
D-28 | نطاق واجهة خط المراحل | لوحة خط MVP مبكراً؛ طاولات العمل الكاملة في المرحلة 5 |
D-29 | ملكية مستند العرض/الدفعة | إعادة استخدام Sales/Accounting حيثما وُجدا (يُتحقَّق في moon-erp-be)؛ mfg_* كحلٍّ احتياطي فقط |
الخلاصة
التحليل المنشور يغطّي بالكامل قلب التصنيع المرتبط بالأوردر والأجرة/الأمانة الذي يحتاجه هذا العميل (IR-4, IR-8) — الربط الشامل بالأوردر ومناولة مواد العميل إصابتان مباشرتان، يكفيهما سحب الأجرة/الأمانة للأمام زمنياً (C-07/D-27). ومحرّكات الهندسة والتخطيط لـ IR-2/IR-3/IR-6 موجودة (دورة حياة القائمة، لفّ التكلفة المعيارية، MRP/CRP) لكن ينقصها غراء سير العمل وفاعل R&D ووضع التكلفة الاستكشافي ومستند العرض. القدرات الثلاث الجديدة فعلاً كلها خارج عالم المواصفة: دورة التسعير الاستكشافي/RFQ (IR-1 ❌)، ودورة دفعة التجربة (IR-5 ❌)، وبوابة الدفعة المقدمة قبل الحجز (IR-7 ❌) — مع واجهات أوركسترا المراحل (IR-9 🟡). تصير بنوداً C-01..C-08 وقراراتٍ في السجل المرجعي الوحيد (الملحق 36 رابعاً — D-23..D-36 + OQ-9) مُلحقةً بخطة 23. لا شيء منها يبطل المعمار المنشور؛ كلّها إضافية وتعيد استخدام السكك القائمة.
ملحق: ما يقدمه Moon ERP جاهزاً لهذه الدورة (ERP Evidence for the Client Cycle)
هذا الملحق يربط دورة العميل الفعلية (مصنع أدوية يصنّع للغير بالأوردر — «تصنيع للغير») بما هو مبنيٌّ فعلاً في Moon ERP. لكل لبنة تحتاجها الدورتان — دورة التكلفة الاستكشافية ودورة الإنتاج بالأوردر — حُسم أحد ثلاثة أحكام: موجود يُعاد استخدامه كما هو، أو جزئي بنية أساسية حاضرة تحتاج توصيلاً أو توسعة، أو مفقود بناء جديد. كل حكم مسنود بملف وسطر في الشيفرة.
الدورتان كما وصفهما صاحب المصنع
- الدورة الأولى — التكلفة الاستكشافية: العميل يأتي بمنتج وتركيبته ويطلب تسعيراً استكشافياً ← قسم البحث والتطوير يصنع قائمة مواد مبدئية (
Draft BOM) ← المحاسبة تحسب التكلفة المبدئية ← يعود السعر المبدئي للعميل كعرض سعر. - الدورة الثانية — الإنتاج بالأوردر: كل المستندات معلّقة على أوردر العميل. (أ) تجربة: ينتج البحث والتطوير دفعة عيّنة حقيقية بتكلفة حقيقية. (ب) عند الموافقة ← أوردر رسمي ← تثبيت قائمة المواد ← التخطيط يحدد الكميات ويتحقق من الجاهزية ← العميل يدفع دفعة تحت حساب (لأن المصنع يشتري الخامات بالنيابة عنه) وقد يورّد العميل خاماته التي تبقى ملكه ← إن صحّت الماليات ← حجز المواد ← أمر التصنيع ← الصرف ← التصنيع ← الإنهاء ← الاستلام في مخزن التام.
- طلب إضافي: العميل يريد واجهة لكل مرحلة إنتاجية لتحريك الأوردر من مرحلة لأخرى من تلك الواجهات.
الخلاصة التنفيذية: لبنات الدورة مقابل الموجود في النظام
| اللبنة المطلوبة | الحكم | أين تقع / ما الناقص |
|---|---|---|
| عرض سعر وتحويله إلى أوردر (سعر الدورة 1 + الأوردر الرسمي للدورة 2) | موجود | Modules/Sales دورة كاملة Draft→Sent→Accepted→Converted مع إجراء convertFromQuotation |
| دفعة العميل تحت الحساب بمعالجة محاسبية صحيحة (التزام مقدم لا تحصيل ذمم) | جزئي | سند القبض ReceiptVoucher وحساب 2104 إيرادات مقدمة موجودان، لكن بلا ربط بأوردر، وSalesPayment مقيّد بالفاتورة |
| خامات العميل المملوكة له (أمانة/عهدة لدى المصنع) | مفقود | لا نوع Consignment في المخازن ولا حقل ملكية على الرصيد |
| سير عمل البحث والتطوير ودفعة التجربة | جزئي | BomStatus::Draft جاهز للقائمة المبدئية؛ وحدة CMMS صيانة أصول لا بحث وتطوير؛ لا كيان لدفعة التجربة |
| سير موافقات لبوابات المراحل (اعتماد القائمة، بوابة الدفعة، إطلاق الأوردر) | جزئي | محرك موافقات عام في Modules/Core لكن المسجَّل فيه Sales وPurchases فقط — لا Production |
| خط CRM لاستقبال طلبات التسعير (RFQ) | مفقود | Modules/CRM دعم وتذاكر (Tickets/SLA) لا خط فرص بيعية |
| بدائية حجز المواد | جزئي | عمود StockBalance.reserved_quantity ودالة available موجودان لكن لا كود يكتب فيهما |
| انتقالات مراحل الإنتاج (أساس واجهات المراحل) | جزئي | ProductionOrderController فيه confirm/start/complete/consume؛ لا مراحل عميل/تجربة/دفعة/حجز |
1) عروض الأسعار وتحويلها إلى أوردر — موجود وجاهز
العمود الفقري للدورة 1 (عرض السعر) وللأوردر الرسمي في الدورة 2 مبنيٌّ بالكامل في Modules/Sales.
- النموذج:
SalesQuotation.phpبرأس وبنود وإجماليات وتاريخ صلاحية، وحقل ربط عكسيsales_order_id(سطر 56). - دورة الحياة:
Draft → Sent → Accepted/Rejected/Expired → Converted/Cancelledمعduplicateلإعادة التسعير (المتحكمSalesQuotationController). - التحويل:
SalesOrderController::convertFromQuotation()(سطر 368) مشروط بحالةAccepted، ينسخ الرأس والبنود ويعلّم العرضConverted؛ المسارPOST quotations/{quotation}/convert-to-order.
قيد التطبيق على الدورة: سعر الدورة 1 هو SalesQuotation مسعّر من قائمة المواد المبدئية؛ والأوردر الرسمي للدورة 2 هو ناتج convertFromQuotation. كل مستندات الدورة 2 يجب أن تتعلّق بمعرّف هذا الأوردر، أي أن أوامر الإنتاج الجديدة (mfg_*) تحتاج مفتاحاً أجنبياً sales_order_id.
2) دفعة العميل تحت الحساب ومعالجتها المحاسبية — جزئي (البنية حاضرة، غير موصولة)
هذه أدقّ نقطة مالياً: الدفعة تحت الحساب التزام مقدم على المصنع وليست تحصيلاً لذمة مدينة. تسجيلها كدفعة بيع عادية يشوّه الذمم والإيراد معاً.
- الحساب الصحيح موجود في الشجرة:
DefaultChartOfAccountsSeederسطر 44 ←2104 إيرادات مقدمة(التزامات/دائن)، ومقابله1106 مصروفات مدفوعة مقدماً. - سند قبض عام:
ReceiptVoucher.phpبهpartner_idوحساب استلام وربط متعدد الأشكالreference_type/reference_idوبنود لكل منهاaccount_idخاص. - ترحيله محايد للحساب:
ApproveReceiptVoucher::buildJournalLines()(سطر 76) يجعل النقدية/البنك مديناً والحساب الموجود على البند دائناً — فيمكن قيد الدفعة من ح/ النقدية إلى ح/ 2104 إيرادات مقدمة بلا تعديل كود، بمجرد تحديد حساب البند.
الناقص: لا ربط بأوردر ولا دلالة «دفعة مطلوبة قبل الإطلاق» ولا بوابة «هل اكتملت الدفعة؟». وSalesPayment أداة خاطئة هنا لأنه مقيّد بـinvoice_id وPostSalesPayment مثبّت على «من ح/ النقدية إلى ح/ الذمم المدينة» مقابل فاتورة (أسطر 30–56) — لا مسار للالتزام المقدم. كما لا توجد سابقة مالية في LIS (كلمة advance هناك تعني تقدّم حالة لا دفعة).
التعديل المقترح: خطوة دفعة على مسار الأوردر تُصدر ReceiptVoucher بـreference_type=sales_order وبند دائن لحساب دفعات عملاء تحت الحساب (يصلح 2104 أو حساب فرعي جديد 2105). والبوابة المالية = مجموع سندات الدفعة المعتمدة ≥ الدفعة المطلوبة. عند الفوترة النهائية تُخصم الدفعة (من ح/ الإيرادات المقدمة إلى ح/ الذمم أو الإيراد).
3) خامات العميل المملوكة له (التصنيع بالأمانة) — مفقود
قال صاحب المصنع صراحةً إن العميل قد يورّد خاماته وتبقى ملكه. لا يعرف Moon ERP اليوم مفهوم ملكية المخزون إطلاقاً.
Warehouse.phpلا يحمل أي حقل مالك؛ حقوله:type, account_id, allow_negative_stock.WarehouseType=Main, Sub, Transit, Damaged, Returns— لا نوعConsignment/مملوك للعميل.- بحث
consign/owned_by/ownershipفي وحدة المخزون = صفر نتيجة؛ الرصيد والحركات بلا مالك.
الأثر: خامات العميل ستُقيَّم وتُرحَّل لمخزون الشركة (تضخيم الأصول) وقد تُصرف لأوامر أخرى — والمصنع حائزٌ لها بالأمانة لا بالملكية.
خياران للتعديل: (1) علم المخزن — وفق القرار المعتمد سلفاً D-15 هو العلم warehouses.is_consignment لا نوع تعداد WarehouseType::Consignment جديد — مع owner_partner_id على المخازن، يكون تقييمها خارج الدفاتر (لا قيد أصل)، والصرف منها لا يولّد سطر تكلفة مواد. (تصحيح: الصياغة الأصلية اقترحت قيمة تعداد جديدة متجاهلةً اعتماد D-15 لصيغة العلم — الملحقان 33 و36 يتبعان D-15.) (2) إضافة owner_partner_id على stock_balances والحركات (فارغ = ملك الشركة) مع تصفية الرصيد والتقييم حسب المالك. كلاهما بناء جديد.
4) سير البحث والتطوير ودفعة التجربة — جزئي
- قائمة المواد المبدئية حالة قائمة:
BomStatus=Active, Inactive, Draft— قائمة R&D الاستكشافية هيBillOfMaterialsفي حالةDraft. - دفعة حقيقية بتكلفة حقيقية =
ProductionOrderذاته (يحمل تكاليف مواد/عمالة/أعباء مخططة وفعلية).
الناقص: لا مفهوم «دفعة تجربة» (ProductionOrder بلا حقل kind/is_trial ولا ربط customer_id/sales_order_id). ووحدة CMMS صيانة أصول (CmmsAsset, CmmsWorkOrder, CmmsPmSchedule) لا تصلح للبحث والتطوير رغم اسم «أمر عمل». لا كيان مشاريع/مهام لاستقبال طلب R&D قبل وجود قائمة مواد.
التعديل: نمذجة التجربة كـProductionOrder بـkind=trial وsales_order_id لترث كل بنية التكلفة والمخزون وتبقى معلّقة على أوردر العميل.
5) سير الموافقات لبوابات المراحل — جزئي (محرك موجود، الإنتاج غير مسجّل)
يوجد محرك موافقات عام في Core يصلح تماماً للبوابات التي يريدها العميل (اعتماد القائمة، تأكيد الدفعة، إطلاق الأوردر، قبول التجربة).
ApprovalWorkflow.phpوApprovalLog.phpومتحكماتهما وحالاتApprovalLogStatus.- لكن النطاق محدود:
ApprovalModule=Sales, Purchasesفقط؛ وApprovalDocumentTypeيغطي عروض/أوامر/فواتير البيع والشراء — لا أنواع إنتاج (قائمة مواد، أمر إنتاج، دفعة تجربة).
التعديل: إضافة ApprovalModule::Production وأنواع مستندات (bom, production_order, trial_batch) لإعادة استخدام المحرك بدل بناء منطق موافقات خاص.
6) خط CRM لاستقبال طلبات التسعير — مفقود (شكل CRM غير مناسب)
Modules/CRM وحدة دعم وتذاكر لا خط مبيعات: نماذجها CrmTicket, CrmTicketComment, CrmSlaPolicy, CrmCustomerInteraction, CrmCustomerTag — لا Lead/Opportunity/Pipeline/Stage.
الأثر: لا خط فرص يستضيف استقبال «العميل يأتي بمنتج → طلب تسعير». والحل العملي: (1) إعادة استخدام SalesQuotation كسجل RFQ (حالة Draft = طلب مفتوح) — الأرخص، فيصير الطلب الاستكشافي والعرض سجلاً واحداً تحمل حالاته القمع. (2) أو تسجيل الاستفسار في CrmCustomerInteraction ثم توليد عرض. خط CRM كامل غير مطلوب لتلبية العميل.
7) انتقالات مراحل الإنتاج وطلب «واجهة لكل مرحلة» — جزئي
ProductionOrderControllerيتيحconfirm/start/complete/consume(الصرف)/recordOutput/cancelكلٌّ محمي بصلاحية — هذا هيكل واجهات المراحل.ProductionOrderStatus=Draft, Confirmed, InProgress, Completed, Cancelledمع حُرّاس انتقال — آلة حالات صغيرة.- بدائية الحجز خاملة:
StockBalanceبهreserved_quantityودالةavailable = quantity - reserved_quantityلكن لا كود يكتب الحجز — خطوة «احجز المواد للأوردر» لها عمود تستقر فيه دون إجراء حجز بعد.
الناقص لمسار العميل: لا customer_id/sales_order_id على أمر الإنتاج، ولا مرحلة تجربة ولا بوابة دفعة مكتملة ولا مرحلة حجز ولا فحص جاهزية/تخطيط — الآلة الحالية تقفز Draft→Confirmed→InProgress.
التعديل: آلة مراحل تجارية موازية (لا توسعة ProductionOrderStatus — حُسمت كمظلّة mfg_order_cases في الملحق 35) لسلسلة العميل مثل: Requested → TrialInProgress → TrialAccepted → AwaitingDeposit → Released(+Reserved) → InProgress → Completed → ReceivedToFG، وتوصيل إجراء حجز يزيد reserved_quantity. تصحيح ترتيبي: وفق الصف 13 المعتمد في الخريطة، الحجز أثر جانبي لإجراء الإصدار — فمرحلة «محجوز» يدخلها الإصدار ولا تسبقه أبداً (السلسلة الأصلية هنا وضعت الحجز قبل الإصدار وكان ذلك ترتيباً دائرياً مخالفاً للتصميم المعتمد). كل مرحلة تقابل واجهة بنسبة 1:1.
جديد مقابل معاد استخدامه (لملحق خارطة الطريق)
- يُعاد استخدامه: دورة
SalesQuotationوconvertFromQuotation؛ محرك ترحيلReceiptVoucher؛ حساب2104؛BomStatus::Draft؛ محركApprovalWorkflow؛ بنية تكلفةProductionOrder؛ عمودreserved_quantity. - يُوسَّع: إضافة
sales_order_id + customer_id + kindلأمر الإنتاج؛ApprovalModule::Production؛ افتراض دفعةReceiptVoucherدائنة لالتزام مقدم ومربوطة بالأوردر؛ توصيل إجراء الحجز؛ توسعة آلة حالات الإنتاج. - يُبنى جديداً: ملكية المخزون للعميل (علم
is_consignmentالمعتمد D-15 +owner_partner_idبتقييم خارج الدفاتر)؛ كيان/علم دفعة التجربة؛ استقبال RFQ (المُوصى به: إعادة استخدام عرض السعر بحالةDraftلا خط CRM جديد).
ملحق: خصوصية صناعة الدواء — ما لم يقله العميل (Pharma CMO Domain Considerations)
العميل (مصنع أدوية يعمل تصنيعاً للغير بالأوردر) وصف دورته التجارية: طلب → قائمة مواد مبدئية من البحث والتطوير → تسعير من الحسابات → دفعة تجريبية → دفعة تحت حساب → حجز → أمر تصنيع → صرف → تصنيع → استلام في مخزن التام. لكن أي مصنع دواء منظَّم (CMO) يحتاج أشياء إضافية لم يذكرها لأنها بديهية عنده لكنها مُلزِمة قانونياً وتدقيقياً (GMP). هذا الملحق يسرد فقط البنود عالية اليقين، كلٌّ موسوم اختياري أو لاحق مع المرحلة المقترحة، ومع تمييز ما هو مُدرَج بالفعل في تحليل الثغرات المنشور عمّا هو جديد فعلاً — حتى لا تُفاجأ الإدارة لاحقاً.
المبدأ الحاكم: الدواء لا يضيف محرّكات كثيرة — بل يرفع الخطورة ويقلب الافتراضات
المواصفة manufacturing_spec مصمَّمة عامّة لكل الصناعات (مثالها أطباق الميلامين)، وتؤجّل طبقة الجودة صراحةً، ولا تنصّ على قاعدة تتبُّع للتشغيلات. أرقام التشغيلة batch_no/lot_no فيها مجرد نصّ حر، وحالة الجودة مجرد قائمة quality_status ∈ {Released, OnHold, Rejected}. هذا مقبول لمصنع عام، لكنه غير كافٍ لمصنع دواء: بنود يعتبرها التحليل المنشور قابلة للتأجيل تصبح هنا متطلبات تنظيمية إلزامية. أبرز مثال: حالة جودة التام تُضبط افتراضياً على Released (القرار D-21) — وهذا غير مقبول دوائياً؛ يجب حجز التام للفحص قبل أن يصبح مخزوناً قابلاً للبيع.
الجدول المرجعي: البنود الثمانية وحالتها مقابل التحليل المنشور
| # | البند | الحالة في التحليل المنشور | الحُكم | الخطورة دوائياً | الوسم + المرحلة |
|---|---|---|---|---|---|
| P1 | سجل تصنيع التشغيلة (BMR) + ترقيم التشغيلات | جزئياً: الترقيم ووثائق الأحداث موجودة؛ السجل المُجمَّع غير موجود | جديد (التجميع جديد) | CRITICAL | لاحق Phase 2→6 |
| P2 | حجز التام للفحص قبل تحويله لمخزون قابل للبيع (QC Release Hold) | مُدرَج: حقل quality_status + ربط QMS موجود؛ الافتراض Released (D-21) | مُدرَج — قلب الافتراض | CRITICAL | لاحق Phase 6 (تهيئة مبكرة للعميل) |
| P3 | تتبُّع التشغيلة + الصلاحية إلزامياً + صرف الأقرب انتهاءً أولاً (FEFO) | مُدرَج: ثغرة A4 + B2؛ المرحلة 6، القرار D-14 | مُدرَج — أصبح حرجاً | CRITICAL | لاحق Phase 6 (مرشّح للتقديم) |
| P4 | مواصفة الفنّ المطبعي/التغليف لكل عميل (Artwork/Packaging) | غير موجود في md/20/md/21 | جديد | IMPORTANT | اختياري Phase 6+ |
| P5 | العيّنات المحفوظة/المرجعية (Retained Samples) | غير موجود | جديد | IMPORTANT | لاحق Phase 6 |
| P6 | التنظيف/التحويل بين منتجات على خطّ مشترك (Cleaning/Changeover) | جزئياً: setup_time موجود؛ التوقّف غير معرَّف (B15)؛ أثر الطاقة جديد | جديد (خطوة التنظيف) / أثر طاقة | IMPORTANT | لاحق Phase 2 (تكلفة)/Phase 4 (طاقة) |
| P7 | ربط ملف التسجيل الدوائي (Regulatory Dossier) | غير موجود | جديد | IMPORTANT | اختياري Phase 6+ |
| P8 | مطابقة العائد كبوابة إلزامية (Yield Reconciliation Gate) | جزئياً: yield% محسوب؛ المطابقة كبوابة إلزامية جديدة | جديد (البوابة) | IMPORTANT | لاحق Phase 2 (التقاط)/Phase 6 (بوابة) |
P1 — سجل تصنيع التشغيلة وترقيمها (BMR & Batch Numbering) — لاحق، حرج
كل تشغيلة مُصنَّعة يجب أن تحمل سجلاً واحداً قابلاً للتدقيق يربط الأمر المُفرَج عنه بـ: لقطة قائمة المواد/المسار المجمَّدة، كل عمليات الصرف (بأرقام تشغيلات المواد الخام المستهلَكة)، الفحوصات البينية، المُشغِّل والمعدّة، الانحرافات، العائد، وتوقيع الإفراج. أرقام التشغيلات يجب أن تكون متسلسلة منضبطة بلا فجوات ومستقلّة عن رقم الأمر.
- المكوّنات موجودة بالفعل: اللقطة المجمَّدة في
production_order_materials/_operations، ووثائقmfg_material_issues/mfg_confirmations/mfg_goods_receipts، والترقيم عبرSequenceService. - الجديد فقط: طبقة تجميع/طباعة السجل فوق هذه الصفوف + مفتاح تسلسل مخصّص للتشغيلة
SequenceService::generateNext(company,'production','batch')— لا محرّك معاملات جديد (نظير ثغرة بطاقات المسارA21). - المرحلة: التقاط ربط
batch_noفي Phase 1/2 (رخيص وإضافي)؛ طباعة/تجميع السجل بالانحرافات والتواقيع في Phase 6 مع بوابات الجودة وأنساب التشغيلات.
P2 — حجز التام للفحص قبل التحويل (QC Release Hold) — لاحق، حرج
هذا أهم انحراف دوائي عن الخطة العامة: التام لا يصير مخزوناً قابلاً للبيع عند الاستلام، بل يدخل حالة حجز/حجر صحي للفحص ولا يُفرَج عنه إلا بقرار جودة/شخص مؤهَّل.
- مُدرَج بالفعل: سطر التام يحمل
quality_status ∈ {Released, OnHold, Rejected}(الجدول mapping صف 22)، وجداول QMS تحملproduction_order_id، والبوابات مجدولة في Phase 6. - المشكلة: القرار
D-21يجعل الافتراضReleasedحتى Phase 6 — وهذا غير مطابق دوائياً. - العلاج (بلا مخطّط جديد): قلب الافتراض إلى
OnHoldلشركات الدواء عبر تهيئةproduction.gr_default_quality_status، وتوجيه التام المحجوز إلى مخزن حجر (نمط المخزن-كحالة، نظير علمis_consignment) أو منع توفّره للبيع حتىqms_inspections.result = Released. مُستهلِك «متابعة بوابة استلام التام» موجود أصلاً على حدثGoodsReceiptPosted. - المرحلة: منطق البوابة Phase 6؛ قلب الافتراض + مخزن الحجر قابل للتسليم كبند تهيئة صغير في Phase 1 لهذا العميل.
P3 — تتبُّع التشغيلة والصلاحية و FEFO (Lot/Expiry/FEFO/Genealogy) — لاحق، حرج
رقم التشغيلة وتاريخ الصلاحية إلزاميان لا نصّ حرّ؛ الصرف بنظام الأقرب انتهاءً أولاً؛ والنسب الكامل (أي تشغيلات مواد خام دخلت أي تشغيلة تام) شرط قانوني للاستدعاء؛ والصلاحية تمنع صرف/بيع المنتهي.
- مُدرَج بالفعل كثغرة حرجة: هذه هي ثغرة
A4(«التشغيلة/اللوط ليست من الدرجة الأولى…batch_number/expiry_dateنصّ حرّ… لا FEFO») + الثغرة المواصفيةB2(«غياب التتبُّع كقاعدة») + القرارD-14، المجدولة في Phase 6. - إعادة التصنيف دوائياً:
A4حرجة أصلاً؛ الدواء يجعلها غير قابلة للتأجيل لهذا العميل — خطّ دواء لا يمكن أن يبدأ قانونياً بدون تشغيلة+صلاحية+FEFO+نسب. هذا أقوى مرشّح للتقديم من Phase 6 ليُسلَّم في نفس إصدار تشغيل العميل.
P4 — مواصفة الفنّ المطبعي والتغليف لكل عميل (Artwork/Packaging Spec) — اختياري/لاحق، مهم
في التصنيع للغير يكون الفنّ المطبعي والتغليف خاصّاً بالعميل والسوق ومضبوط الإصدار؛ واستخدام نسخة خاطئة/قديمة خطأ من فئة الاستدعاء. مواد التغليف نفسها مكوّنات قائمة مواد مضبوطة بأرقام تشغيلات.
- جديد: لا ذكر للفنّ المطبعي أو ضبط مواصفة التغليف في
md/20ولاmd/21؛ المواصفة تنمذج التغليف كمكوّن عادي فقط. - العلاج: سيّد إصدارات فنّ/ملصق مفتاحه (العميل، المنتج، السوق) بإصدار معتمد سارٍ (إعادة استخدام
Attachment+ نمط ترقيم إصدارات قائمة الموادA9)؛ يشير سطر تغليف قائمة المواد إلى الإصدار المعتمد. خفيف، يركب مع تعميق التصنيع للغير في Phase 6.
P5 — العيّنات المحفوظة/المرجعية (Retained Samples) — لاحق، مهم
تُلزِم GMP بحفظ عيّنات مرجعية من كل تشغيلة لمدة صلاحية المنتج + هامش، مُسجَّلة وقابلة للاسترجاع.
- جديد: غير موجود في أي وثيقة منشورة.
- العلاج: سجل عيّنات محفوظة مرتبط بـ
batch_no(يعتمد على P1/P3)، واختيارياً حجز كمّية صغيرة من التام عند الاستلام في مخزن «عيّنات محفوظة» (نمط المخزن-كحالة). يُجدوَل مع عمل الجودة/التشغيلات في Phase 6.
P6 — التنظيف/التحويل بين المنتجات على خطّ مشترك (Cleaning/Changeover) — لاحق، مهم
على المعدّات المشتركة يكون التنظيف/التحويل المُعتمَد بين منتجين إلزامياً (منع التلوّث المتبادل)، ويستهلك طاقة فعلية وتكلفة فعلية، ويحجز بدء المنتج التالي.
- جزئي/جديد:
setup_timeموجود (صف 5) ويمكن أن يستوعب زمن التحويل، لكن التنظيف كخطوة منفصلة معتمَدة ومُكلَّفة غير منمذج؛ وتصنيف التوقّف الأوسع ثغرة مواصفية مفتوحة (B15). أثر طاقته على CRP جديد فعلاً. - العلاج: نمذجة التحويل/التنظيف كنوع عملية مسار أو إعداد معتمد على التسلسل على مركز العمل؛ إدخال مدّته في الطاقة الفعّالة لـCRP (عمل التقويم/الطاقة
A8/B4في Phase 4) وتكلفته في تكلفة التحويل (Phase 2). للإصدار الأول يكفي تقريبه بـsetup_cost_rate+setup_time.
P7 — ربط ملف التسجيل الدوائي (Regulatory Dossier Linkage) — اختياري/لاحق، مهم
كل منتج مُصنَّع مرتبط بـملف تسجيل/إذن تسويق (مثل تسجيل هيئة الدواء). يجب أن تطابق قائمة المواد/المسار المعتمدة الملف المسجَّل، وأن يُرفَع علَم عند تصنيع منتج غير مسجَّل أو منتهي التسجيل.
- جديد: لا مفهوم تسجيل/ملف في التحليل المنشور.
- العلاج: سيّد تسجيل خفيف (المنتج، السوق، رقم التسجيل، تواريخ السريان، إصدار قائمة المواد المعتمد) مع فحص عند الإفراج عن الأمر. يعيد استخدام ترقيم إصدارات قائمة المواد (
A9) +Attachment. اختياري للإصدار الأول؛ علَم استشاري كافٍ للبدء.
P8 — مطابقة العائد كبوابة إلزامية للإفراج (Yield Reconciliation Gate) — لاحق، مهم
تُلزِم GMP بـميزان مواد/مطابقة عائد لكل تشغيلة — يجب أن تتطابق المدخلات مع (المخرجات + الهالك + العيّنات) ضمن حدود معتمدة، وأن يُفسَّر ويُعتمَد العائد خارج الحدود قبل الإفراج.
- جزئي: المواصفة تحسب
yield% = Σgrades / input، وجداولmfg_confirmation_yields/_detailsتلتقط كمّيات الدرجات/الهالك (صفّا 19–20). الجديد هو المطابقة كبوابة صلبة (نطاقات حدود + تفسير إلزامي + منع الإفراج عند التجاوز) نظير نطاقات تفاوت الانحرافات في التكاليف لكن مطبَّقة على ميزان المواد لإفراج التشغيلة. - العلاج: إعادة استخدام نمط نطاقات التفاوت (طبيعي/تحقيق) على حساب العائد؛ العائد خارج الحدود يرفع انحرافاً ويمنع إفراج الجودة (يرتبط بـP2). الالتقاط من Phase 2؛ بوابة منع الإفراج مع الجودة في Phase 6.
خلاصة المراجعة المتقاطعة: مُدرَج مقابل جديد
| الفئة | البنود | المرجع |
|---|---|---|
| مُدرَج بالفعل (الدواء يعيد ترتيب الأولوية فقط) | P2 حجز الإفراج · P3 التشغيلة/الصلاحية/FEFO/النسب | mapping صف 22 + D-21 / ثغرة A4+B2+D-14 |
| مُغطّى جزئياً | P1 الترقيم+وثائق الأحداث · P6 setup_time · P8 yield% | صفوف 14–15،5،19–20؛ B15 |
| جديد فعلاً (بلا موطن) | P1 تجميع/طباعة BMR · P4 الفنّ/التغليف · P5 العيّنات المحفوظة · P6 التنظيف كخطوة + أثر الطاقة · P7 ملف التسجيل · P8 بوابة مطابقة العائد | لا مرجع منشور |
التوصية النهائية للإدارة
الدواء لا يضيف محرّكاً كبيراً للخطة المنشورة؛ بل يرفع الخطورة ويغيّر الافتراضات لضبط الإفراج (P2) وتتبُّع التشغيلة/الصلاحية (P3 = ثغرة A4/B2 المُدرَجة، وقد صارت غير قابلة للتفاوض للتشغيل)، ويضيف حزمة صغيرة من مصنوعات GMP (سجل التشغيلة، العيّنات المحفوظة، إصدارات الفنّ/التغليف، ربط الملف، بوابة مطابقة العائد). نوصي بـتقديم ثغرة A4 (التشغيلة+الصلاحية+FEFO+النسب) لتُسلَّم مع أول إصدار تشغيلي لهذا العميل، وقلب افتراض حالة جودة التام إلى OnHold لشركة الدواء فوراً.
ملحق: تصميم دورة التكلفة الاستكشافية (Exploratory Costing Cycle Design)
تصميم تنفيذي كامل للدورة الأولى التي وصفها صاحب المصنع: العميل يأتي بمنتجه وتركيبته ويطلب تسعيراً استكشافياً ← البحث والتطوير يبني قائمة مواد مبدئية ← المحاسبة تحسب تكلفة مبدئية ← يعود السعر للعميل كعرض سعر بصلاحية محددة. التصميم يسكن داخل وحدة الإنتاج الموسّعة Modules/Production وفق القرارات المنشورة: جداول جديدة ببادئة mfg_*، صلاحيات production.*، إعادة الاستخدام أولاً، والقاعدة الذهبية هنا: الدورة الأولى لا تنشئ أي قيد محاسبي ولا أي حركة مخزون إطلاقاً — محرك التكلفة يعمل في وضع المحاكاة فقط.
توحيد التسمية (يحسم ما ورد في الملاحق السابقة)
الملحق 30 اقترح mfg_quotations + mfg_quotation_costings، والملحق 31 اقترح mfg_costing_requests + mfg_cost_estimates. هذا الملف يثبّت التسمية النهائية: رأس التقدير هو mfg_cost_estimates (طلب التسعير + حالة المسار التجاري في كيان واحد) وإصدارات الحساب المتعاقبة في mfg_cost_estimate_versions (سجل غير قابل للتعديل — كل إعادة حساب صفٌّ جديد). أما عرض السعر الموجَّه للعميل فليس جدولاً جديداً: هو SalesQuotation الموجود فعلاً في Modules/Sales بدورة حياته الكاملة وتحويله إلى أوردر (دليل الملحق 32 §1)، ويُربط بالتقدير عبر sales_quotation_id. هذه التسمية صادق عليها الملحق 36 (ورقة الدلتا الموحَّدة) — لا وجود لـmfg_quotations في أي وثيقة معتمدة؛ وإجمالي الملاحق الموحَّد +6 جداول (24 ← 30): هذا الزوج + mfg_order_cases وmfg_trial_batches وmfg_customer_advances وmfg_order_stage_gates.
1) الكيانات: ماذا نبني وماذا نعيد استخدامه
| الكيان | الحكم | الدور في الدورة |
|---|---|---|
mfg_cost_estimates | جديد | رأس التقدير: العميل (customer_id ← BusinessPartner في Core)، المنتج المرشَّح (prospect_product_id)، مرفق التركيبة (Attachment)، الكمية المستهدفة، رابط القائمة المبدئية draft_bom_id، رابط عرض السعر والأوردر، الحالة {Draft, Estimated, Quoted, Won, Lost}، صلاحية السعر valid_until. ترقيم عبر SequenceService('production','cost_estimate') |
mfg_cost_estimate_versions | جديد | نتائج الحساب المتعاقبة (لا تُعدَّل أبداً): لقطة تفجير القائمة، مصدر سعر الخامة لكل بند {CurrentCost, LastPurchase, Manual}، تكلفة مواد + عمالة + غير مباشرة ← تكلفة الوحدة ← نسبة الربح ← السعر المقترح، مع مَن حسب ومَن اعتمد ومتى |
bill_of_materials | توسعة مُقرّة | القائمة المبدئية للبحث والتطوير = bom_type=Engineering + status=Draft وفق دورة الحياة المُقرّة سلفاً (الخريطة 20 سطر 2). قاعدة صارمة: قائمة Draft لا تُجمَّد في أمر إنتاج — باستثناء واحد معتمد خارج هذه الدورة (القرار D-32): أوامر order_type=Trial خلف الإعداد production.trial_allow_draft_bom (الملحقان 35 و36)؛ داخل الدورة الأولى نفسها لا تجميد إطلاقاً |
products.lifecycle | توسعة | إضافة حالة Prospect (القرار D-26): منتج العميل يُسجَّل كمنتج «مرشَّح» يحفظ سلامة مفتاح القائمة، ويُرقّى إلى Active عند الفوز فقط — ولا يظهر في البيع أو المخزون أو التخطيط قبل ذلك |
ComputeStandardCost | توسعة | نفس محرك تجميع التكلفة المعياري (الخريطة 20 سطر 23: تفجير القائمة × معدلات مراكز العمل × cost_driver) يُضاف له وضع محاكاة mode=Simulation: يكتب في mfg_cost_estimate_versions بدلاً من mfg_standard_costs، ولا يستدعي CreateJournalEntry إطلاقاً |
SalesQuotation + convertFromQuotation | إعادة استخدام | عرض السعر للعميل ودورته Draft→Sent→Accepted→Converted والتحويل لأوردر — موجودان كما هما (الملحق 32 §1) |
ApprovalWorkflow في Core | توسعة | إضافة ApprovalModule::Production ونوع مستند cost_estimate لبوابة اعتماد المحاسبة قبل إرسال العرض (الملحق 32 §5) |
mfg_peggings | توسعة | إضافة cost_estimate_id لسلسلة الربط حتى يُعاد بناء النسب الكامل: طلب ← قائمة ← إصدارات ← عرض ← أوردر ← ما بعده (المتطلب R-18) |
2) آلة الحالات مع الفاعلين (البيع، البحث والتطوير، المحاسبة)
| # | من | الإجراء | الفاعل | الشرط الحاكم | إلى | الحدث |
|---|---|---|---|---|---|---|
| 1 | — | CreateCostEstimate | البيع | عميل صحيح + مرفق التركيبة؛ يُنشأ المنتج المرشَّح Prospect تلقائياً | Draft | CostEstimateRequested |
| 2 | Draft | SubmitDraftBom | البحث والتطوير | القائمة Engineering+Draft وأبوها المنتج المرشَّح؛ يثبَّت draft_bom_id (حالة فرعية: «القائمة جاهزة») | Draft | DraftBomReady |
| 3 | Draft | SimulateCostEstimate | المحاسبة | القائمة مرفقة + لكل بند سعرٌ قابل للحل (سعر حالي / آخر شراء / يدوي للخامات غير المخزّنة بعد)؛ لا قيد ولا مخزون | Estimated | — داخلي |
| 4 | Estimated | RecostEstimate | المحاسبة | إعادة الحساب = إصدار جديد غير قابل للتعديل؛ التاريخ كله محفوظ | Estimated | — |
| 5 | Estimated | QuoteCostEstimate | البيع (بعد اعتماد المحاسبة) | الإصدار الحالي معتمَد؛ تحديد نسبة الربح والسعر وvalid_until؛ إنشاء وإرسال SalesQuotation وطباعة PDF؛ العرض يصبح للقراءة فقط | Quoted | EstimateQuoted |
| 6 | Quoted | RecostEstimate | المحاسبة/البيع | إلزامي عند انتهاء الصلاحية (Expired) أو عند إعادة التفاوض — يعود لخطوة 4 ثم يُعاد العرض | Estimated | — |
| 7 | Quoted | MarkEstimateWon | البيع (بقبول العميل) | عرض السعر المرتبط Accepted والتاريخ داخل الصلاحية — العرض المنتهي يمنع الفوز حتى يُعاد التسعير (السؤال المفتوح OQ-5) | Won | EstimateWon |
| 8 | Quoted | MarkEstimateLost | البيع | سبب الخسارة إلزامي؛ المنتج المرشَّح يبقى Prospect مؤرشفاً | Lost | EstimateLost |
قواعد عابرة لكل الانتقالات: كل انتقال محكوم بصلاحية production.estimates.*؛ القائمة المبدئية تظل غير مؤهلة لأي أمر إنتاج طوال الدورة؛ ولا أثر مالي أو مخزني في أي خطوة — قناة القيود الوحيدة في النظام CreateJournalEntry لا تُستدعى في هذه الدورة أصلاً.
3) الأحداث ومن يستهلكها
كلها في Modules\Production\Events وتُطلق بعد نجاح المعاملة، ومستهلكوها مستمعون داخل وحدة الإنتاج يستدعون إجراءات الوحدات الأخرى للأمام (قانون العقود — الملحق 22 §2: لا وحدة تستورد الإنتاج أبداً).
| الحدث | المُطلِق | المستهلكون |
|---|---|---|
CostEstimateRequested | CreateCostEstimate | مغذّي قائمة أعمال البحث والتطوير (طابور شاشة 3) + بث للوحة المسار |
DraftBomReady | SubmitDraftBom | مغذّي طابور شاشة التكاليف بالمحاسبة + تشغيل المحاكاة تلقائياً (إعداد اختياري للشركة) + بث للوحة |
EstimateQuoted | QuoteCostEstimate | مجدول متابعة البيع وراصد الصلاحية (يعلّم Expired عند الموعد ويمنع الفوز) + لوحة الإدارة + أرشفة PDF |
EstimateWon | MarkEstimateWon | بوابة الدورة الثانية: ترقية المنتج، بذر الربط mfg_peggings، وعرض مسار التجربة (دفعة العيّنة R-05) |
EstimateLost | MarkEstimateLost | تحليلات الربح/الخسارة وإغلاق النسب |
4) شاشات المراحل (نمط واجهة-لكل-مرحلة الذي طلبه العميل — R-17)
- لوحة مسار التقديرات (البيع + الإدارة): كانبان
Draft / Estimated / Quoted / Won / Lostمع شارة انتهاء الصلاحية — المدخل لكل الشاشات. - شاشة استقبال طلب التسعير (البيع): اختيار العميل، وصف المنتج، رفع التركيبة، الكمية المستهدفة ← زر
CreateCostEstimate. - ورشة القائمة المبدئية (البحث والتطوير): طابور الطلبات الواردة، إنشاء المنتج المرشَّح، تأليف قائمة
Engineering/Draftببنود قد تكون بأسعار يدوية لخامات غير مخزّنة ← زرSubmitDraftBom. - ورشة التكاليف (المحاسبة): طابور القوائم الجاهزة، تشغيل المحاكاة، تحليل مواد/عمالة/غير مباشرة لكل إصدار، تاريخ الإصدارات، الاعتماد، وإعادة الحساب.
- شاشة عرض السعر (البيع): نسبة الربح، السعر، الصلاحية، توليد وإرسال
SalesQuotationوPDF، وزرّا فوز/خسارة (الفوز معطَّل عند انتهاء الصلاحية). - شاشة نسب التقدير (قراءة للجميع): خط زمني كامل من الطلب حتى النتيجة ثم مستندات الدورة الثانية بعد الفوز، عبر
mfg_peggings.
كل شاشة تعرض بيانات مرحلتها وأزرار انتقالها فقط، والزر يستدعي نفس الإجراء الذي تكشفه الواجهة البرمجية — الشاشات لا تتجاوز آلة الحالات أبداً. شرائح الصلاحيات: production.estimates.create للبيع، production.estimates.rnd.draft_bom للبحث والتطوير، production.estimates.cost وapprove_costing للمحاسبة، quote وconvert للبيع، والمشرف يشمل الكل.
5) مسار التحويل: تقدير فائز ← مدخل دورة الإنتاج
- قبول العميل يمر عبر منطق التحويل الموجود مُستدعىً حصراً عبر الإجراء الأمامي
Modules\Sales\Actions\ConvertQuotationToOrder(استخلاص الملحق 36 رقم 19 من المتحكمconvertFromQuotation— نفس وصفةCreatePurchaseRequest؛ الإنتاج لا يستدعي متحكم وحدة أخرى أبداً، قانون العقود §0.1):SalesQuotation = Accepted← أوردر بيع رسمي يُختم على التقدير — هذا الأوردر هو مرساة الدورة الثانية الذي تتعلق به كل المستندات اللاحقة. - ترقية المنتج المرشَّح
Prospect ← Activeفيصبح مؤهلاً للمخزون والتخطيط والبيع. - القائمة المبدئية لا تُرقَّى تلقائياً: تُسلَّم للدورة الثانية وهي
Draft، ويثبّتها البحث والتطوير (Engineering/Draft ← Production/Active، نسخة نشطة واحدة لكل نافذة سريان) بعد نتيجة دفعة التجربة لأن دروس التجربة تدخل في التركيبة النهائية — وإن تخطى العميل التجربة جاز الترقية فوراً. - بذر صف
mfg_peggingsيربط التقدير بالأوردر فيكتمل النسب من طلب التسعير حتى استلام التام. - التفرع: (أ) تجربة —
mfg_trial_batches+ أمر إنتاجorder_type=Trialينفذه البحث والتطوير على قضبان التنفيذ الحقيقية بتكلفة وقيود حقيقية (أول قيد محاسبي في حياة هذا العميل يقع هنا، في الدورة الثانية لا الأولى)؛ أو (ب) مباشرة — تثبيت القائمة ← التخطيط ← بوابة الدفعة تحت الحساب ← الحجز ← الإطلاق. - استمرارية التكلفة: الإصدار الفائز من
mfg_cost_estimate_versionsهو خط الأساس الذي تُقارن به تكلفة التجربة الفعلية، ومرشَّح لبذر أول تكلفة معيارية فيmfg_standard_costsبعد تفعيل القائمة.
6) موضعها في خارطة الطريق وقرارات التوقيع
تهبط الدورة في المرحلة 2.5 «واجهة العميل» (الملحق 36 ثالثاً — الموضع الذي سمّاه الملحق 30 §6 مؤقتاً «1.5»): بعد المرحلة 1 (دورة حياة القائمة) وبعد المرحلة 2 — لأن معدلات العمالة/الماكينات وcost_driver التي يسعّر بها التقدير تصل في المرحلة 2 لا المرحلة 1 (تصحيح للادعاء السابق بأن المرحلة 1 تكفي) — ومستقلة عن محرك التخطيط. وضع المحاكاة هو سحبٌ مبكر لرياضيات تجميع التكلفة من المرحلة 3 بنسخة تقديرية فقط (البند C-03) دون الحاجة لمحرك الانحرافات. القرارات المطلوب توقيعها قبل البناء (من السجل المرجعي — الملحق 36 رابعاً): D-31 بناء القمع التجاري (كان يُستشهد به سابقاً برقم «D-23» المؤقت)، D-26 حالة المنتج المرشَّح، D-29 إعادة استخدام عرض سعر البيع (الدليل مثبت)، وD-34/OQ-5 مدة صلاحية العرض (الافتراضي 30 يوماً، والعرض المنتهي يمنع التحويل حتى يُعاد تسعيره).
ملحق: تصميم دورة الإنتاج بالأوردر بالبوابات (Gated MTO Production Cycle Design)
هذا هو التصميم التنفيذي الكامل للدورة الثانية لدى العميل (التصنيع حسب الطلب للغير): حالة عميل واحدة تمشي عبر أربع عشرة محطة محكومة ببوابات — من أمر البيع، إلى التجربة المُكلّفة فعلياً، إلى تثبيت قائمة التركيب، إلى فحص التخطيط، إلى بوابة الدفعة المقدمة المانعة، إلى الحجز والتصنيع وفحص الجودة والاستلام في مخزن التام وحتى التسليم وتسوية الدفعة على الفاتورة النهائية. التصميم متّسق بالكامل مع الخرائط والعقود المنشورة (الأقسام 20–23 والملاحق 30–33): يعيش داخل Modules/Production الموسَّعة، جداوله بادئتها mfg_*، صلاحياته production.*، والترحيل حصرياً عبر CreateJournalEntry والمخزون حصرياً عبر مستندات الاعتماد — ولا يُعيد فتح أي قرار مُعتمد إلا بتعديلين مُصادق عليهما صراحةً بصفّي قرار في السجل المرجعي (الملحق 36 رابعاً): D-32 (استثناء تجميد القائمة المبدئية لأوامر التجربة — تعديل على صف 2 من الخريطة) وLA-1/D-33 (قبض الدفعة يركب سند القبض — تعديل على قانون الترحيل §5.4). تسمية الدورة الأولى تتبع الزوج القانوني من الملحق 34: mfg_cost_estimates/mfg_cost_estimate_versions (سُحبت أسماء mfg_quotations المؤقتة).
mfg_order_casesقرار النمذجة: كيان مظلّة رفيع mfg_order_cases وليس أعمدة على أمر الإنتاج
كان الخياران: إضافة أعمدة القضية والدفعة على production_orders، أو كيان مظلّة رفيع يعلو أوامر الإنتاج. التوصية الحاسمة: كيان المظلّة — للأسباب التالية:
- قضية واحدة ↔ عدة أوامر إنتاج: القضية تملك أمر (أو أوامر) التجربة
order_type=Trialمع حلقات إعادة التجربة، والأمر الرئيسي، وربما دفعات مجزّأة — صفّ أمر واحد لا يتسع لدورة حياة تمتد على أوامر متعددة. - سبع من أربع عشرة محطة تحدث ولا يوجد أمر إنتاج مُصدَر أصلاً (أمر البيع، طلب التجربة، اعتماد التجربة، تثبيت القائمة، فحص التخطيط، بوابة الدفعة، والإلغاء المبكر) — الأعمدة لن تجد صفاً تسكنه.
- آلتا حالات بعمود فقري واحد: آلة أمر الإنتاج المالية/التنفيذية (
Planned → Released → InProcess → Completed → Closed) تبقى كما اعتُمدت في المرحلة الأولى دون أي توسيع؛ آلة القضية طبقة تنسيق تجارية فوقها. - الدفعة المقدمة على مستوى القضية لا الأمر: دفعة واحدة تغطي الارتباط كله (تجربة + أمر رئيسي)، فترتبط
mfg_customer_advancesبالقضية طبيعياً. - لوحة المراحل تعمل على القضايا: بطاقات الكانبان قضايا، وطرفيات الصالة تبقى على مستوى العملية داخل محطة واحدة.
الامتداد على production_orders يقتصر على: case_id (يقبل الفراغ — أوامر التخزين العادية بلا قضية)، إضافة Trial إلى تعداد order_type، وعمود sales_order_id مباشر (مع بقاء mfg_peggings المرجع الكمي للتخطيط). لا أعمدة دفعة على الأوامر إطلاقاً. ويُعاد ربط جدول التدقيق mfg_order_stage_gates بمفتاح case_id (تعديل على الملحق 30)؛ فيصبح صافي الجداول الجديدة في الملاحق ستة والإجمالي الكلي ثلاثين (mfg_cost_estimates، mfg_cost_estimate_versions، mfg_trial_batches، mfg_customer_advances، mfg_order_stage_gates، mfg_order_cases) — صادق عليه الملحق 36. قاعدة الفصل عن محرك الاعتماد (Core ApprovalWorkflow): جدول البوابات سجل تدقيق لكل حركة؛ التوقيعات البشرية (تثبيت القائمة، حكم التجربة، الإعفاء من الدفعة، إفراج الجودة) تركب محرك الاعتماد القائم كشرط مسبق للانتقال — لا آليتي اعتماد متوازيتين.
آلة الحالات بالبوابات: كل انتقال = شرط + صلاحية + Action + حدث
كل انتقال يستدعي Action واحداً محكوماً بصلاحية: يتحقق من البوابة، يغيّر المحطة، يسجّل سطراً في mfg_order_stage_gates (من، متى، من أين إلى أين، ولقطة تقييم البوابة)، ثم يطلق الحدث بعد إتمام المعاملة. الإلغاء متاح من أي محطة قبل دخول التصنيع مع فك الحجوزات ومعالجة الدفعة (ردّ أو مصادرة حسب السياسة).
| الانتقال | البوابة (الشرط المانع) | الجهة والصلاحية | الـAction ← الحدث |
|---|---|---|---|
— ← SalesOrder | وجود أمر بيع مؤكد (عبر الإجراء الأمامي Sales\ConvertQuotationToOrder — استخلاص الملحق 36 رقم 19 من المتحكم) | المبيعات · production.case.open | OpenProductionCase ← ProductionCaseOpened |
SalesOrder ← TrialRequested | تسجيل كمية التجربة وسياسة تكلفتها trial_cost_policy | المبيعات · production.case.trial_request | RequestCaseTrial ← CaseTrialRequested |
مسار تخطّي التجربة ← BomFinalized | منتج مكرر له قائمة Active + تنازل مكتوب من العميل | المشرف · production.case.trial_skip | SkipCaseTrial ← CaseTrialSkipped |
TrialRequested ← TrialInProduction | وجود قائمة تركيب؛ استثناء محكوم — مُصادق عليه قراراً D-32 (تعديل صريح على صف 2 من الخريطة): أوامر Trial فقط يجوز لها تجميد قائمة Engineering/Draft (إعداد production.trial_allow_draft_bom) — الأوامر العادية أبداً | R&D · production.case.trial_create | CreateTrialOrder: أمر إنتاج حقيقي بوسم order_type=Trial بكمية صغيرة، يمر بقضبان الإصدار→الصرف→التأكيد→الاستلام→الإقفال كاملة بتكلفة حقيقية، ومخرَجه يُستلم في دلو التقييم (مخزن-كحالة غير قابل للبيع) ← TrialOrderCreated |
TrialInProduction ← TrialApproved | إقفال أمر التجربة + وجود مستند تسليم العينة (صرف تتبّعي من دلو التقييم يُختم على mfg_trial_batches — سدّ فجوة U-3: العينة لا تصل العميل بلا مستند) + توقيع اعتماد العميل (مرفق إلزامي) + result=Passed؛ الفشل يعيد إلى طلب التجربة أو الإلغاء | المبيعات · production.case.trial_decide | RecordTrialDecision ← CaseTrialDecided |
TrialApproved ← BomFinalized | ترقية القائمة إلى Production/Active — نسخة نشطة واحدة لكل نافذة سريان، وتُختم active_bom_id على القضية | R&D · production.case.bom_finalize | PromoteCaseBom ← CaseBomFinalized |
BomFinalized ← PlanningChecked | تشغيل MRP لأمر واحد: تفجير القائمة × الكمية، إجمالي←صافي، فصل المواد المملوكة عن مواد العميل، نواقص المملوكة ← مسوّدات طلبات شراء تُجهَّز ولا تُرفع (الدفعة هي ما يموّل هذا الشراء — تُرفع عند بوابة الدفعة)، وحفظ حكم الجاهزية | التخطيط · production.case.plan | RunCasePlanning ← CasePlanningChecked |
PlanningChecked ← DepositGate | آلي: احتساب المطلوب = نسبة الدفعة × الوعاء (OwnMaterialCost أو OrderValue)؛ إن لم يلزم شراء بالنيابة ← NotRequired وتمرّ تلقائياً | النظام | انتقال آلي |
DepositGate ← MaterialsReserved | بوابة مانعة صلبة: مجموع سندات القبض المعتمدة المخصصة للقضية (reference_type='mfg_order_case') ≥ المطلوب (قيد السند نفسه هو ترحيل الدفعة — LA-1/D-33)، أو إعفاء بصلاحية مرتفعة؛ وعند استيفائها تُرفع الآن مسوّدات طلبات الشراء بالنيابة الموسومة «تُحمَّل على العميل» — الشراء بالنيابة لا يسبق الدفعة أبداً (قاعدة العميل السببية U-6؛ تصحيح لموضعها السابق عند فحص التخطيط)؛ ثم يعمل ReleaseProductionOrder — وقد أُضيفت البوابة شرطاً مسبقاً فيه — فيجمّد اللقطة ويحجز كأثره الجانبي المعتمد عبر StockService::reserve() مربوطاً بالأمر: المملوك من المخزون الذاتي ومواد العميل من مخزن الأمانة | الحسابات تسجّل · production.case.deposit_record / الإعفاء .deposit_waive / الإصدار .release | AllocateCaseAdvance ← CaseDepositSatisfied ثم ReleaseProductionOrder ← ProductionOrderReleased + CaseMaterialsReserved |
MaterialsReserved ← InProduction | آلي عند أول حدث MaterialIssued؛ مواد العميل تُستلم مسبقاً في مخزن الأمانة بمستند استلام مخزني حقيقي (ReceiveCustomerMaterial ← فرع تتبّعي بلا تقييم في ApproveReceipt — مستند الإدخال الذي سدّ فجوة U-2؛ لا مساس مباشراً بالأرصدة أبداً): حركة تتبّع فقط، لا تدخل تكلفتنا إطلاقاً، لكن أرقام لوطاتها تُكتب في نَسَب الباتش؛ والمتبقي غير المستخدم يعود عند الإقفال بمستند الصرف المرآتي (ReturnCustomerMaterial) + تسوية: المستلَم − المصروف − خردة الأمانة = المرتجع | المخازن تصرف والخط ينفّذ | القضبان القائمة: صرف ← تأكيد ← استلام |
InProduction ← QcRelease | آلي عند GoodsReceiptPosted بكامل الكمية؛ سطور الاستلام تهبط quality_status=OnHold (القلب الدوائي للافتراضي — الملحق 33) فيقبع التام في الحجر غير قابل للبيع | النظام | مستمع ← CaseAwaitingQc |
QcRelease ← InFgWarehouse | كل فحوصات qms_inspections للاستلام = Released؛ المرفوض يدخل حلقة عدم مطابقة | الجودة · production.case.qc_release | ReleaseCaseQc ← CaseQcReleased |
InFgWarehouse ← Delivered | إذن تسليم مؤكد + فاتورة نهائية تُنشأ للأمام عبر الإجراء الرفيع الجديد Sales\CreateServiceInvoice (سدّ فجوة U-4 — لا نداء متحكم ولا كتابة مباشرة في جداول المبيعات): فرع التشغيل = سطر أجر التحويل + سطر تمرير الخامة المشتراة بالنيابة بالتكلفة (+ نسبة مناولة تعاقدية) — سدّ فجوة U-1 والتام ملك العميل + تسوية الدفعة المقدمة عليها | المبيعات/الحسابات · production.case.deliver | InvoiceAndSettleCase ← CaseDelivered |
Delivered ← Closed | إقفال الأمر الرئيسي (ترحيل الانحرافات السبعة وتصفير WIP) واكتمال التسوية | النظام/الحسابات | آلي ← CaseClosed |
سياسة تكلفة التجربة (قابلة للضبط — تحسم OQ-1 وOQ-3)
- فوترة (Bill): تُفوتر التجربة بالتكلفة + هامش متفق كفاتورة خدمة مبيعات عند قرار العميل — نجح أو فشل.
- استيعاب (Absorb): عند إقفال أمر التجربة: مدين مصروف بحث وتطوير / دائن تحت التشغيل (
production_trial_absorb). - رصيد عند الفوز (Credit-on-win): تُرحَّل التكلفة إلى أصل مؤجل (
production_trial_defer)؛ عند الفوز تُطبَّق كخصم على الفاتورة النهائية، وعند الخسارة تُشطب لمصروف البحث والتطوير. - الافتراضي من إعداد
production.trial_cost_policyمع تجاوز لكل قضية؛ وأوامرTrialتُستبعد من معايرة التكلفة المعيارية وتُقرَّر منفصلة.
المعالجة المحاسبية: من التزام الدفعة إلى تسويتها
القبض النقدي يركب ReceiptVoucher القائم (ترحيله محايد الحساب) — وهذا هو تعديل القانون المعتمد LA-1/D-33 على §5.4: قيد السند نفسه هو ترحيل الدفعة الوحيد (ترحيل واحد، لا نداء موازياً لـCreateJournalEntry) — والباقي عبر CreateJournalEntry حصراً؛ الحسابات تُحل من مفاتيح إعدادات production.* وتُزرع كحسابات تفصيلية — ومنها حساب جديد 2105 «دفعات عملاء تحت الحساب» تحت الإيرادات المقدمة.
| الحدث | entry_type | مدين | دائن |
|---|---|---|---|
| استلام الدفعة المقدمة | production_customer_advance | النقدية/البنك | دفعات العملاء تحت الحساب (التزام 2105) |
| التجربة — فوترة | فاتورة مبيعات خدمية عادية | العملاء | إيراد خدمة التجارب |
| التجربة — استيعاب / تأجيل | production_trial_absorb / production_trial_defer | مصروف بحث وتطوير / تكلفة تجارب مؤجلة | تحت التشغيل |
| التجربة المؤجلة — فوز / خسارة | production_trial_apply / production_trial_writeoff | تكلفة الأمر / مصروف بحث وتطوير | تكلفة التجارب المؤجلة |
| دورة التصنيع نفسها | — | عائلات القيود الخمس المنشورة كما هي دون أي تغيير (صرف، أجور، أعباء، خردة، استلام التام + الانحرافات) | |
| مواد العميل (الإصدار الحر) | — | لا قيد إطلاقاً — حركة أمانة تتبّعية فقط، واللوطات تُسجَّل في النَسَب | |
| إخلاء خامة النيابة عند استلام التام (تشغيل — U-1) | production_toll_material_cogs | تكلفة خامات toll (مُعاد تحميلها) | تحت التشغيل |
الفاتورة النهائية (تشغيل — عبر CreateServiceInvoice) | فاتورة مبيعات ← الفوترة الإلكترونية | العملاء | إيراد أجر التحويل + إيراد تمرير الخامة بالنيابة (بالتكلفة + مناولة) — الفاتورة تحتوي الخامة التي موّلتها الدفعة فيُقفل حساب النقدية |
| تسوية الدفعة على الفاتورة | production_advance_settlement (الاسم القانوني الوحيد — سُحب البديل production_advance_application) | دفعات العملاء تحت الحساب | العملاء |
| ردّ الدفعة عند الإلغاء | production_advance_refund | دفعات العملاء تحت الحساب | النقدية/البنك |
شاشات المراحل: لوحة كانبان + ورشة عمل لكل محطة
لوحة واحدة مركزها القضية (production/cases/board): الأعمدة هي المحطات والبطاقات هي القضايا، والسحب معطّل عمداً — الحركة لا تتم إلا من زر المرحلة الذي يستدعي نفس الـAction الذي تعرضه الواجهة البرمجية، فلا تجاوز لآلة الحالات أبداً، وكل نقلة مسجّلة في mfg_order_stage_gates. ولكل محطة ورشة عمل مخصصة تعرض طابورها وقائمة تحقق حية لبوابتها وزر التقدّم الوحيد:
| الشاشة | القسم المالك | الطابور | الإجراء الرئيسي |
|---|---|---|---|
intake — مكتب القضايا | المبيعات | أوامر بيع مؤكدة بلا قضية | فتح قضية · طلب تجربة · تخطّي التجربة |
trial-bench — منضدة التجارب | R&D | طلبات التجارب + متابعة التجارب الجارية | إنشاء أمر التجربة |
trial-review — مراجعة التجربة | المبيعات | تجارب بانتظار قرار العميل | تسجيل تسليم العينة (مستند الصرف من دلو التقييم — شرط أول) · تسجيل القرار + مرفق التوقيع |
bom-bench — منضدة القوائم | R&D | قضايا معتمدة التجربة | ترقية القائمة إلى Active |
planning-bench — منضدة التخطيط | التخطيط | قضايا مثبّتة القائمة | تشغيل تخطيط القضية وفصل المملوك عن مواد العميل وتجهيز مسوّدات طلبات الشراء (تُرفع بعد بوابة الدفعة) |
deposit-desk — مكتب الدفعات | الحسابات | قضايا على بوابة الدفعة (المطلوب/المستلم/المتبقي) | تخصيص سند قبض · إعفاء (صلاحية مرتفعة) |
reserve-desk — مكتب الحجز | المخازن + التخطيط | قضايا مستوفاة الدفعة | استلام مواد العميل في الأمانة (بمستند ReceiveCustomerMaterial التتبّعي — لا زرّاً بلا قضيب) · إصدار الأمر (تجميد اللقطة + الحجز كأثر جانبي) · إرجاع المتبقي عند الإقفال (ReturnCustomerMaterial + التسوية) |
production-monitor — مرقاب التصنيع | الإنتاج | قضايا تحت التشغيل بتقدّم العمليات | متابعة فقط — التقدّم آلي بالأحداث |
qc-desk — مكتب الجودة | الجودة | استلامات محتجزة OnHold ونتائج الفحص | إفراج / رفض (عدم مطابقة) |
delivery-desk — مكتب التسليم | المبيعات/الحسابات | قضايا في مخزن التام | إذن تسليم + فاتورة نهائية عبر CreateServiceInvoice (أجر التحويل + سطور تمرير الخامة) + تسوية الدفعة |
علاقتها بطرفيات صالة الإنتاج: الطرفيات (المرحلة الخامسة من الخارطة) تبقى على مستوى العملية داخل محطة InProduction وحدها — المشغّل يبدأ وينهي العمليات ويرسل التأكيدات، ولا يحرّك القضية أبداً؛ القضية تتقدم تلقائياً من الأحداث التي تطلقها تلك التأكيدات نفسها. طبقتان لكل منهما آلة حالاتها، تربطهما الأحداث.
تنبيه تفسيري (السؤال المفتوح OQ-9 — يُحسم عند بوابة المرحلة 0): هذا القسم كله يقرأ «واجهات لكل مرحلة إنتاجية» على أنها مراحل الملف التجارية. إن قصد العميل مراحل التصنيع الفيزيائية (خلط/تحبيب/كبس/تعبئة — قراءة مرجَّحة دوائياً) فالجواب ورش لكل عملية مسار فوق عمليات التوجيه: تخدمها طرفيات المرحلة 5 مع شاشة مراقبة قراءة-فقط لكل عملية يمكن شحنها مبكراً في 2.5. والجدولة (قرار D-28 المعدَّل): لوحة المسار MVP في المرحلة 2، الورش الحرجة للبوابات في 2.5، والإكمال والصقل في 5.
الأحداث والصلاحيات
- اثنا عشر حدثاً جديداً في
Modules\Production\Events(منProductionCaseOpenedحتىCaseClosedوCaseCancelled) + حدثا الأمانةCaseConsignmentReceived/CaseConsignmentReturnedتُطلق بعد إتمام المعاملة بمستمعين معصومين من التكرار — وخمسة أحداث قائمة يُعاد استخدامها (ProductionOrderReleased،MaterialIssued،ConfirmationPosted،GoodsReceiptPosted،ProductionOrderClosed) تقود التقدّم الآلي للقضية. هذا القاموس — مع أحداث التقدير الخمسة في الملحق 34 — هو قاموس الأحداث القانوني الوحيد (صادق عليه الملحق 36). قانون الاتجاه محفوظ: لا وحدة خارجية تستورد الإنتاج. - شريحة صلاحيات لكل محطة تحت المساهم
productionالقائم: المبيعات (فتح/تجربة/قرار/تسليم)، R&D (إنشاء التجربة/تثبيت القائمة)، التخطيط (الفحص والإصدار)، الحسابات (تسجيل الدفعة، والإعفاءproduction.case.deposit_waiveبصلاحية مرتفعة)، المخازن (استلام الأمانة والصرف)، الجودة (الإفراج)، والمشرف يعبر الكل (الافتراضي المقترح لـOQ-7). فضاءproduction.case.*هذا — معproduction.estimates.*للدورة الأولى — هو التصنيف القانوني الوحيد للصلاحيات (صادق عليه الملحق 36). - مفاتيح إعدادات جديدة:
production.default_advance_percent،production.advance_basis،production.trial_cost_policy،production.trial_allow_draft_bom،production.customer_advance_account_id،production.gr_default_quality_status(للدواء:OnHold).
التسلسل الكامل للقضية
- أمر بيع مؤكد ← فتح قضية
mfg_order_casesمرقمة عبرSequenceService. - طلب تجربة بسياسة تكلفة محددة ← أمر إنتاج حقيقي
order_type=Trialتنفّذه R&D بتكلفة كاملة. - اعتماد العميل للتجربة بتوقيع موثّق (أو إعادة التجربة / الإلغاء).
- R&D تثبّت القائمة
Production/Activeوتُختم على القضية. - التخطيط يفجّر القائمة ويفصل المملوك عن مواد العميل ويجهّز مسوّدات طلبات الشراء بالنيابة (لا تُرفع بعد).
- بوابة الدفعة المانعة: لا حجز ولا شراء ولا تصنيع قبل تخصيص سندات القبض الكافية (أو إعفاء موثَّق) — قيد السند: مدين النقدية / دائن التزام دفعات العملاء (LA-1)؛ وعند الاستيفاء تُرفع طلبات الشراء بالنيابة الآن فقط.
- الإصدار يجمّد اللقطة ويحجز المواد كأثره الجانبي مربوطةً بالأمر؛ مواد العميل تكون قد دخلت الأمانة بمستند الاستلام التتبّعي (U-2) بلا أي تكلفة علينا مع تتبّع لوطاتها في النَسَب.
- التصنيع على القضبان القائمة (صرف ← تأكيدات ← استلام) وطرفيات الصالة تعمل داخل هذه المحطة فقط.
- الاستلام محتجزاً
OnHold← إفراج الجودة ← مخزن التام. - إذن التسليم + الفاتورة النهائية عبر
CreateServiceInvoice(أجر التحويل + سطر تمرير الخامة بالنيابة في التشغيل) + تسوية الدفعة المقدمة على الفاتورة + إرجاع/تسوية خامة العميل المتبقية ← إقفال القضية بعد ترحيل الانحرافات.
موضع الملحق في الخارطة
يهبط هذا التصميم وفق جدولة الملحق 36 ثالثاً (التي تتقدّم على موضع «1.5» المؤقت في الملحق 30 — والصحيح بعد المرحلة 2 لأن معدلات العمالة/الأعباء وcost_driver تصل فيها): نواة الملف وبوابة الدفعة وجدول البوابات ولوحة المسار في المرحلة 2، والتقديرات والتجارب والورش الحرجة في المرحلة 2.5 «واجهة العميل» — وفحص التخطيط هنا تفجير محلي لأمر واحد يسبق MRP الكامل ويطيع نفس بوابة الدفعة. التعديلات على الوثائق المنشورة: إضافة Trial وcase_id وsales_order_id لخريطة 20 (الصف 13) + استثناء D-32 على الصف 2، إضافة شرط بوابة الدفعة على ReleaseProductionOrder (ويحجب رفع طلبات الشراء بالنيابة أيضاً) وتعديل LA-1/D-33 على §5.4 وأنواع القيود الجديدة وإجراءات CreateServiceInvoice/ReceiveCustomerMaterial/ReturnCustomerMaterial للقسم 22، وإعادة ربط mfg_order_stage_gates بالقضية في الملحق 30 — والأسئلة المفتوحة أصبحت إعدادات قابلة للضبط بانتظار تصديق المجلس عبر السجل المرجعي (الملحق 36 رابعاً: D-23..D-36 + OQ-9).
ملحق: تعديلات الخريطة والعقود وخارطة الطريق (Plan Amendments)
هذه هي ورقة التعديلات الموحَّدة التي تفرضها متطلبات عميل مصنع الأدوية (التصنيع للغير بالأوردر — الملاحق 30 إلى 33) على وثائق القرار الثلاث المنشورة: الخريطة النهائية (20)، عقود التكامل (22)، وخارطة الطريق (23). كل ما يلي إضافي، مع استثناءين مُعتمَدين صراحةً فقط (لكلٍّ منهما صف قرار خاص — لا تعديل صامت): LA-1 / D-33 (قبض الدفعة المقدمة يركب قضيب سند القبض — تعديل على القسم 5.4 من الوثيقة 22) وD-32 (أوامر التجربة يجوز لها تجميد قائمة مبدئية Draft — تعديل على صف 2 من الوثيقة 20). كل ما عدا ذلك من القرارات المعتمدة (D-01 إلى D-22) وعائلات القيود وآلة حالات أمر الإنتاج وقانون الاعتمادية يبقى دون مساس. نموذج الكيانات والتسمية الموحَّد (يُنهي تشعّب الملاحق 34/35/36): تُعتمد تسمية الملحق 34 لدورة التسعير (mfg_cost_estimates + mfg_cost_estimate_versions — وتُسحب الأسماء المؤقتة mfg_quotations/mfg_quotation_costings)، ويُعتمد كيان الملحق 35 المظلّي mfg_order_cases — الآلة التجارية تعيش على الملف، وليس كحالات تمهيدية فوق آلة أمر الإنتاج.
أولاً — تعديلات الخريطة (على الوثيقة 20)
إجمالي الجداول الجديدة يرتفع من 24 إلى 30 جدول mfg_* (+6: التقديرات، نسخ التقديرات، ملفات الأوامر، التجارب، الدفعات، بوابات المراحل). كل بند: ما هو، هل هو جديد أم تعديل على موجود، أين يعيش، ولماذا.
| البند | جديد / تعديل على | الجدول | الملاحظة |
|---|---|---|---|
| رأس التقدير الاستكشافي / استقبال طلب التسعير | جديد | mfg_cost_estimates | رأس نَسَب دورة التسعير (الاسم القانوني من الملحق 34 — يسحب mfg_quotations): العميل، المنتج المرشَّح (lifecycle=Prospect، قرار D-26)، التركيبة كمرفقات، draft_bom_id، sales_quotation_id (إعادة استخدام مستند عرض السعر القائم في المبيعات SalesQuotation — دورة كاملة مُتحقَّق منها بالدليل 32، قرار D-29)، وsales_order_id عند الفوز. حالات رشيقة {Draft, Estimated, Quoted, Won, Lost} فقط — حالات القمع التجاري (إرسال/قبول/رفض/انتهاء/تحويل) تعيش على SalesQuotation وحده ولا تُكرَّر (يُجنّبنا آلتي حالات متزامنتين). مفتاح التسلسل 'cost_estimate' |
| نسخ التقدير الاستكشافي | جديد | mfg_cost_estimate_versions | نسخ تقدير غير قابلة للتعديل (إعادة الحساب = نسخة جديدة): خامات + عمالة + أعباء ← تكلفة وحدة ← هامش ← سعر معروض + valid_until + أساس التسعير. يشغّل نواة RollUpStandardCost بنمط محاكاة فقط على القائمة المبدئية — بلا قيد محاسبي وبلا مخزون. يسحب mfg_quotation_costings |
| ملف أمر العميل (المظلّة) | جديد | mfg_order_cases | قرار الكيان للدورة الثانية (من الملحق 35 — يُعتمد هنا): ملف واحد لكل تعاقد، مرساة sales_order_id، نَسَب الدورة الأولى cost_estimate_id، آلة تجارية من 14 مرحلة (من أمر البيع حتى الإغلاق)، سياسة تكلفة التجربة، حقول الدفعة، مخزن الأمانة، القائمة المعتمدة، حكم التخطيط. السبب: ملف واحد ↔ N أوامر إنتاج (تجارب متكررة + أمر رئيسي)؛ 7 من 14 مرحلة تسبق وجود أي أمر إنتاج؛ الدفعة على مستوى الملف. آلة حالات أمر الإنتاج المعتمدة لا تتسع — لا حالات تمهيدية على production_orders.status |
| الباتش التجريبي | جديد | mfg_trial_batches | case_id، cost_estimate_id، production_order_id، كمية التجربة، actual_unit_cost (مصدر تصحيح السعر النهائي)، result ∈ {Pending, Passed, Failed}، ومستند تسليم العينة sample_delivery_doc_id + sample_delivered_at. الفشل يمنع تحويل الأمر الرسمي. أُبقي كياناً مستقلاً عمداً (خلافاً لتوصية الدليل 32 بعلمٍ على الأمر فقط): الملف الواحد يمتد عبر N أوامر إعادة تجربة، لكلٍّ حكم عميل وتوقيع وتسليم عينة خاص لا يصح أن يحمله أمر الإنتاج (حامل التكلفة) |
| نوع أمر التجربة + استثناء D-32 | تعديل على | production_orders | توسيع صف 13 في الخريطة: order_type ∈ {Standard, Rework, Repair, Trial} (قرار D-24 — قيمة لا علم). أمر التجربة يركب قضبان الإصدار←الصرف←التأكيد←الاستلام والقيود كاملة دون أي منطق جديد؛ يُفصل تقريرياً ويُستبعد من معايرة التكلفة المعيارية. استثناء D-32 (تعديل صريح على صف 2): أوامر Trial وحدها يجوز لها تجميد قائمة Engineering/Draft خلف الإعداد production.trial_allow_draft_bom؛ الأوامر العادية أبداً — بدونه تستحيل التجربة قبل اعتماد القائمة |
| ربط أمر الإنتاج بأمر البيع والملف | تعديل على | production_orders | عمودا sales_order_id وcase_id (الدليل 32: لا يوجد أي ربط اليوم؛ وفق مخطط الملحق 35) — مرساة الطلب المباشرة، تُكمّل mfg_peggings ولا تلغيه. لا أعمدة دفعة ولا حالات تجارية على الأمر |
| الدفعة المقدمة (دفعة تحت حساب) | جديد | mfg_customer_advances | مفتاحها case_id (دفعة واحدة تغطي التعاقد كله — تجربة + رئيسي؛ وفق الملحق 35، ويُنهي تشعّب المرساة الثلاثي): amount، percent، الأساس، status ∈ {Due, Received, Waived}، receipt_voucher_id، journal_entry_id (قيد السند نفسه)، applied_invoice_id — بيانات بوابة الإصدار. التنازل Waived بصلاحية production.case.deposit_waive ومُسجَّل |
| حساب دفعات العملاء | تعديل على | دليل الحسابات + الإعدادات | حساب تفصيلي «دفعات عملاء تحت الحساب» ابن 2104 Unearned Revenue (يُزرع عبر AutoAccountService) + مفتاح production.customer_advance_account_id. لا يُستخدم SalesPayment إطلاقاً (مربوط بالفاتورة — أداة خاطئة للدفعة المقدمة) |
| سند قبض الدفعة + تعديل القانون LA-1 | إعادة استخدام + D-33 | receipt_vouchers | ReceiptVoucher وترحيله محايد للحساب (السطر يحدد الدائن — مُتحقَّق). يُربط reference_type='mfg_order_case' وسطره يُرحّل دائناً لحساب الدفعات. LA-1 (تعديل صريح على القسم 5.4 من الوثيقة 22): قيد السند نفسه هو ترحيل الدفعة الوحيد — ترحيل واحد، ولا نداء موازياً لـCreateJournalEntry (يُسحب الازدواج السابق)؛ كل ترحيل إنتاجي آخر يبقى حصرياً عبر CreateJournalEntry. صفر تغيير مخطط في المحاسبة |
| بوابات المراحل | جديد | mfg_order_stage_gates | سجل الانتقالات خلف شاشات المراحل، مفتاحه case_id (وفق الملحق 35): من/إلى، مَن، متى، لقطة البوابة. مسار المراحل هو آلة mfg_order_cases نفسها؛ الشاشات تستدعي نفس الإجراءات التي تعرضها الواجهة البرمجية ولا تتجاوز أي آلة حالات. قاعدة الفصل عن محرك الاعتماد: هذا الجدول سجل تدقيق لكل حركة؛ التوقيعات البشرية (اعتماد القائمة، حكم التجربة، التنازل عن الدفعة، إفراج الجودة) تركب محرك ApprovalWorkflow القائم كشرط مسبق للانتقال — لا ازدواج |
| مخازن الأمانة (مواد العميل) | تعديل على | warehouses | is_consignment (قرار D-15 المعتمد) + owner_partner_id (الدليل 32: لا مفهوم ملكية في المخزون اليوم). لا تُقيَّم ولا تُشترى. تُسحب من المرحلة 6 إلى المرحلتين 1/2 (D-27) |
| استلام/إرجاع خامة العميل (مستند الإدخال) | تعديل (مستندات) | مستندات استلام/صرف المخزون | سدّ فجوة U-2: خامة العميل الحرة تدخل مخزن الأمانة عبر مستند استلام مخزني حقيقي يعتمده ApproveReceipt بفرع تتبّعي بلا تقييم وبلا قيد لمخازن الأمانة (الملكية للعميل في عُهدة)، مرجعه الملف؛ والمتبقي غير المستخدم يعود عند الإقفال بمستند الصرف المرآتي + تسوية ختامية (المستلَم − المصروف − خردة الأمانة = المرتجع). لا رصيد مخزني يُمسّ خارج مستندات الاعتماد أبداً. يستدعيهما الإنتاج للأمام عبر ReceiveCustomerMaterial / ReturnCustomerMaterial |
| تفعيل الحجز | تعديل (منطق) | inventory_stock_balances | StockService::reserve()/release() يبقى بنداً في المرحلة 1 كما نُشر (الفجوة A5). الجديد: (أ) بوابة الدفعة تسبق الإصدار — والحجز يبقى أثراً جانبياً لإجراء ReleaseProductionOrder كما اعتُمد (صف 13): مرحلة «محجوز» يدخلها الإصدار ولا تسبقه أبداً؛ (ب) فرع جديد: مكوّنات العميل تُحجز من رصيد الأمانة |
| سلسلة النَسَب | تعديل على | mfg_peggings | إضافة cost_estimate_id وcase_id ليُعاد بناء النَسَب كاملاً: طلب تسعير ← قائمة مبدئية ← عرض ← تجربة ← ملف ← أمر ← مستندات |
| بوابات الاعتماد | تعديل على | Core enums | ApprovalModule::Production (مقرر في المرحلة 0) + أنواع مستندات جديدة: bom، production_order، trial_batch، customer_advance — إعادة استخدام محرك الاعتماد القائم للتوقيعات البشرية وفق قاعدة الفصل أعلاه |
| حالة جودة الاستلام (الدواء) | تعديل على | الإعدادات | إعداد لكل شركة production.gr_default_quality_status: لمصنع الدواء يُقلب الافتراضي Released ← OnHold + مخزن حجر صحي. D-21 يبقى الافتراضي العام؛ هذا هو التجاوز المتوافق (الملحق 33 — P2) |
| رقم التشغيلة + منتج مرشَّح + الصلاحيات | تعديل على | production_orders / products / الصلاحيات | batch_no يُختم عند الإصدار بمفتاح تسلسل 'batch' (P1)؛ حالة lifecycle=Prospect على المنتج تحفظ سلامة مفتاح القائمة المبدئية (D-26)؛ تصنيف واحد للصلاحيات (يُنهي تشعّب الفضاءات الثلاثة): الدورة الأولى production.estimates.* (الملحق 34 §5، ومنها production.estimates.rnd.draft_bom) والدورة الثانية production.case.* (الملحق 35 §5، والتنازل = production.case.deposit_waive) — زارع المرحلة 0 يُكتب من الملفين حرفياً |
ثانياً — تعديلات العقود (على الوثيقة 22)
كل الإضافات تحترم القاعدتين الحاكمتين وقانون الاعتمادية (بتعديله الوحيد المعتمد LA-1): إجراءات للأمام، أحداث للخلف، ولا موديول يقرأ جدول mfg_* أبداً. المبيعات تستقبل السعر دفعاً عبر إجراء؛ المحاسبة تستقبل سنداً ولا تعرف بوجود جدول الدفعات؛ فحوص الجودة تُنشأ دفعاً وتقرأ التصنيع نتيجتها قراءةً فقط. قاموس أحداث واحد (يُنهي تشعّب القواميس الثلاثة): أحداث الدورة الأولى الخمسة من الملحق 34 (CostEstimateRequested, DraftBomReady, EstimateQuoted, EstimateWon, EstimateLost) + أحداث الملف من الملحق 35 (ProductionCaseOpened … CaseCancelled + حدثا الأمانة) — ولا حدث StageAdvanced عام: كل إجراء انتقال يكتب سطر التدقيق بنفسه وأحداث Case* هي إخطارات التقدّم.
| الحدث (من القاموس الموحَّد) | المُصدِر (الإجراء) | المستهلكون (مستمعون داخل التصنيع ← إجراء أمامي) |
|---|---|---|
EstimateQuoted | QuoteCostEstimate (بعد اعتماد نسخة المحاكاة) | دفع السعر والصلاحية إلى عرض المبيعات عبر إجراء جديد Sales\UpsertQuotationPricing — المبيعات لا تقرأ mfg_cost_estimate_versions أبداً |
CaseTrialDecided | RecordTrialDecision (تسجيل حكم العميل — بوابته وجود مستند تسليم العينة، U-3) | بوابة النَسَب: Passed تفتح التحويل لأمر رسمي؛ Failed تمنعه (إعادة تجربة أو إغلاق)؛ ترحيل سياسة تكلفة التجربة (D-23)؛ إخطار المبيعات وR&D |
CaseDepositSatisfied | AllocateCaseAdvance / WaiveCaseDeposit (بعد ApproveReceiptVoucher: مدين نقدية / دائن دفعات عملاء — LA-1) | إعادة تقييم بوابة الإصدار (المُحصَّل ≥ المطلوب)؛ الآن فقط تُرفع طلبات شراء خامات العميل (CreatePurchaseRequest موسومة «تُفوتر على العميل») — لا طلب شراء بالنيابة قبل هذا الحدث أبداً (قاعدة U-6)؛ إخطار التخطيط |
CaseConsignmentReceived / CaseConsignmentReturned | ReceiveCustomerMaterial / ReturnCustomerMaterial (مستندا الأمانة) | رصيد الأمانة وتقرير التسوية؛ تسجيل اللوطات في الأنساب؛ بوابة التسوية عند إقفال الملف |
CaseQcReleased | ReleaseCaseQc (يقرأ qms_inspections.result قراءةً فقط) | نقل البضاعة من الحجر الصحي إلى مخزن الجاهز عبر المستندات المعتمدة حصراً: تحويل تتبّعي مزدوج (صرف معتمد من الحجر + استلام معتمد في الجاهز) — مُسجَّل كإضافة عقدية؛ لا «قضيب تحويل» غير معتمد؛ تحرير التسليم المربوط؛ تذكير بتسوية الدفعة |
| نقطة الدخول (إجراء أمامي) | الموديول | الحالة | الاستخدام |
|---|---|---|---|
Accounting\ApproveReceiptVoucher | المحاسبة | موجود | قبض الدفعة: مدين نقدية/بنك / دائن دفعات عملاء — المُستدعي يحدد حساب السطر وreference_type='mfg_order_case'. قيد السند هو ترحيل الدفعة الوحيد (LA-1/D-33) — لا قيد ثانٍ |
Accounting\CreateJournalEntry | المحاسبة | موجود | قيد تسوية الدفعة عند الفوترة: production_advance_settlement (مدين دفعات عملاء / دائن المدينون — اسم واحد قانوني؛ سُحب الاسم البديل production_advance_application) + عائلة قيود سياسة التجربة (D-23) وقيد production_toll_material_cogs |
Sales\UpsertQuotationPricing | المبيعات | جديد (رفيع) | دفع سعر التقدير وvalid_until إلى SalesQuotation — صوناً لقانون «لا قراءة لجداول mfg_» |
Sales\ConvertQuotationToOrder | المبيعات | جديد (استخلاص) | استخلاص convertFromQuotation من المتحكم (نفس وصفة CreatePurchaseRequest) لتحويلٍ برمجي يختم النَسَب — والملحق 34 §6 صار يستدعي هذا الإجراء لا المتحكم |
Sales\CreateServiceInvoice | المبيعات | جديد (استخلاص) | سدّ فجوة U-4 — قضيب إنشاء الفاتورة المتوافق: الإنتاج يُطلق فاتورة الملف النهائية للأمام: سطر أجر التشغيل + سطور تمرير الخامات (U-1) + سطر التجربة إن كانت تُفوتر — تتدفق للفوترة الإلكترونية (B18). لا نداء متحكم ولا كتابة مباشرة في جداول المبيعات |
Production\ReceiveCustomerMaterial / ReturnCustomerMaterial | الإنتاج ← المخزون | جديد | مستندا إدخال/إرجاع خامة العميل الحرة لمخزن الأمانة — فرع تتبّعي لمستندي الاستلام/الصرف المعتمدين (سدّ U-2) |
QMS\CreateInspection | الجودة | مُقرَّر سلفاً | تغيير توقيت فقط: يُستدعى أيضاً عند الاستلام لفحص الإفراج النهائي للدواء؛ إعداد القلب الافتراضي يصل في المرحلة 1 |
شرط بوابة الدفعة في ReleaseProductionOrder | الإنتاج (داخلي) | تعديل | منع Planned ← Released حتى يكون المُحصَّل ≥ المطلوب أو الحالة Waived بصلاحية — قبل التجميد والحجز. ونفس البوابة تحكم الشراء بالنيابة: لا تُرفع طلبات الشراء الموسومة إلا بعد CaseDepositSatisfied. ليس نداءً عابراً للموديولات: البوابة تقرأ جداول التصنيع نفسها |
إضافة على خريطة القيود (القسم 4 من الوثيقة 22): قيد استلام الدفعة production_customer_advance (يرحّله محرك السند مرة واحدة — LA-1)، قيد التسوية production_advance_settlement عند الفوترة، قيد الاسترداد production_advance_refund (D-35)، عائلة قيود سياسة التجربة الأربعة production_trial_absorb/_defer/_apply/_writeoff وحسابا «تكلفة تجارب مؤجلة» و«مصروف R&D» (وفق الملحق 35 §3 — وتُسحب عبارة «لا عائلة قيود جديدة» السابقة لأنها كانت خاطئة)، وقيد إخلاء خامة العميل المشتراة بالنيابة عند الاستلام production_toll_material_cogs (مدين تكلفة خامات toll / دائن الإنتاج التحت تشغيل). سدّ فجوة U-1: الخامة المشتراة بالنيابة ملك المصنع حتى الفوترة (مخزون ذاتي محجوز للملف، وأوامر شراؤها موسومة)، والفاتورة النهائية تحمل سطر تمرير الخامة بالتكلفة (+ نسبة مناولة تعاقدية) بجوار أجر التشغيل — فتتسوّى الدفعة (المحسوبة كنسبة من تكلفة الخامة الذاتية، D-25) على فاتورة تحتوي الخامة التي موّلتها: حساب النقدية يُقفل. أثناء التشغيل يرحّل أمر التجربة العائلات الخمس المعتادة دون تغيير.
ثالثاً — إعادة جدولة خارطة الطريق (على الوثيقة 23)
التسلسل المعدَّل: 0 ← 1 ← 2 ← 2.5 ← 3 ← 4 ← 5 ← 6 بأحجام (S · L · L · M · M · L · M · M–L).
| المرحلة | كانت | تصبح | سبب النقل |
|---|---|---|---|
| 0 — التصليب | S | S (نطاق +) | تُضاف المصادقة على السجل المرجعي D-23..D-36 + السؤال OQ-9 داخل مسار ملاحق المواصفة نفسه (نفس الأسبوع ونفس البوابة الصلبة) + دور R&D وفضاءا الصلاحيات (production.estimates.* / production.case.*) + أنواع مستندات الاعتماد + lifecycle=Prospect. قرارات وصلاحيات فقط — لا بناء |
| 1 — البيانات الأساسية + التنفيذ الحقيقي | L | L (الحافة العليا) | يُضاف: قيمة order_type=Trial + حارس استثناء D-32؛ عمودا sales_order_id/case_id؛ الأمانة مسحوبة من المرحلة 6 (is_consignment + owner_partner_id + فرع الصرف التتبّعي + مستندا استلام/إرجاع خامة العميل) — مصنع toll لا يشغّل أمراً واحداً حقيقياً بدونها؛ قلب افتراضي الجودة OnHold للدواء؛ ختم batch_no. ضبط المخاطرة: تقسيم 1أ/1ب المنشور يبقى سارياً، وشريحة الأمانة تنزلق إلى 1ب فقط — لا تعود للمرحلة 6 أبداً |
| 2 — المسارات والتأكيدات وتكلفة التحويل | L | L (نطاق +) | بوابة الدفعة تتقدّم إلى هنا (لم يكن لها موعد أصلاً): mfg_order_cases ونواة آلة الملف + mfg_customer_advances (بمفتاح الملف) + الحساب والمفتاح + ربط سند القبض وفق LA-1 + شرط الإصدار + نقل رفع طلبات الشراء خلف البوابة + حدث CaseDepositSatisfied؛ وفرع حجز رصيد الأمانة (نواة الحجز نفسها تبقى مرحلة 1 دون تغيير)؛ + mfg_order_stage_gates (بمفتاح الملف) ولوحة المسار MVP (قرار D-28). البوابة تحتاج قضبان الإصدار من المرحلة 1 — هذا أبكر موضع صحيح |
| 2.5 — الواجهة التجارية (جديدة) | — | M | mfg_cost_estimates + mfg_cost_estimate_versions + محرك التقدير بنمط المحاكاة فقط (يسحب نواة RollUpStandardCost مبكراً من المرحلة 3 — بلا معايير ولا انحرافات ولا قيود) + mfg_trial_batches وتدفق التقييم مع دلو التقييم ومستند تسليم العينة + إجراءات المبيعات الثلاثة + ورش المراحل الحرجة للبوابات تُسلَّم هنا لا في المرحلة 5 (تعديل D-28): ورشة التجربة ومراجعتها، ورشة القائمة، ورشة التخطيط، مكتب الدفعة، مكتب الحجز + شاشات الدورة الأولى — المرحلة 5 تُكمل وتصقل فقط. لماذا بعد المرحلة 2 لا قبلها: تسعير العمالة والأعباء يحتاج معدلات مراكز العمل وcost_driver اللذين يصلان في المرحلة 2 — وقبل التخطيط لأنها لا تحتاج MRP |
| 3 — محرك التكاليف | M | M (أخف قليلاً) | النطاق كما هو (معايير، 7 انحرافات، تسوية)؛ نواة التجميع تصل جاهزة من 2.5 فتُنتَج هنا صناعياً فقط. يُضاف: استبعاد أوامر Trial من معايرة التكلفة حتى نجاح التجربة + تفعيل قيود سياسة التجربة (D-23) |
| 4 — التخطيط | L | L | كما هي تقريباً. يُضاف: وسم أوامر شراء خامات العميل «تُفوتر على العميل» ولا تُرفع إلا بعد CaseDepositSatisfied (قاعدة U-6 — والتخطيط المحلي للملف في المرحلة 2 يطيع نفس البوابة)، وشاشة الجاهزية تنضم لمسار المراحل كورشة التخطيط. فرع toll (لا أمر شراء لمواد العميل) كان في النطاق أصلاً |
| 5 — أرضية المصنع | M | M | المحرك كما هو. يُضاف: إكمال وصقل ورش المراحل التي بدأت في 2.5 + شاشات مراقبة لكل عملية. شاشات المشغّلين كما هي. اعتماد على OQ-9: إن قصد العميل بـ«واجهات لكل مرحلة إنتاجية» مراحل التصنيع الفيزيائية (خلط/تحبيب/كبس/تعبئة) فالجواب هنا: ورش لكل عملية مسار فوق عمليات التوجيه |
| 6 — الخطافات العميقة | L | M–L (تنكمش) | قلب toll/الأمانة خرج منها إلى المرحلتين 1–2. يبقى: التشغيلة أول-درجة + الأنساب + FEFO (الفجوة A4/قرار D-14 — مرشَّح سحب لإصدار إطلاق الدواء، الملحق 33)، بوابات الجودة الكاملة، تغذية أجر القطعة، تجميع سجل التشغيلة BMR، العينات المحتجزة، بوابة موازنة العائد |
ما يبقى دون تغيير: القرارات D-01..D-22 كلها سارية؛ هوية الموديول (توسيع Modules/Production ببادئة mfg_*)؛ آلة حالات أمر الإنتاج وهجرتها دون أي مساس فعلاً — المراحل التجارية تعيش على mfg_order_cases؛ عائلات القيود الخمس وامتصاص نهاية الشهر؛ قانون الاعتمادية عدا التعديل الوحيد المعتمد LA-1/D-33؛ تصاميم محركات MRP/CRP/الانحرافات؛ شاشات أرضية المصنع؛ وانضباط البوابة الصلبة للمرحلة 0.
رابعاً — السجل المرجعي الوحيد للقرارات (D-23..D-36 + OQ-9)
ترقيم واحد يُنهي تصادم المخططات الثلاثة: هذا الجدول هو سجل القرارات المرجعي؛ الملحقان 30 §6 و31 §4 يشيران إليه (قرار «نطاق دورة ما قبل البيع» الذي كان «D-23» في الملحق 31 صار D-31 هنا)؛ ترقيم المتطلبات: R-01..R-21 = مخطط الملحق 30 حصراً، ومتطلبات الملحق 31 المشتقة أُعيد ترقيمها IR-1..IR-9.
| الرقم | القرار / الخطر | التوصية |
|---|---|---|
| D-23 | سياسة تكلفة التجربة — مَن يدفع ثمن الباتش التجريبي وإعادته عند الفشل؟ (OQ-1/OQ-3) | إعداد لكل ملف: trial_cost_policy ∈ {Bill, Absorb, CreditOnWin} (وفق الملحق 35 §1.1 — يُسحب الاقتراح الثنائي السابق {Customer, Absorbed}) بعائلة قيوده في البند ثانياً؛ تكلفة الفاشلة تتبع نفس السياسة؛ تكرار الفشل N مرات يرفع علامة مراجعة |
| D-24 | نمذجة التجربة | اعتماد order_type=Trial كقيمة أولى-درجة (يحسم تردد الملحق 31 بين القيمة والعلم) |
| D-25 | نسبة الدفعة المقدمة (OQ-2) | إعداد production.default_advance_percent + تجاوز لكل ملف؛ أساس النسخة الأولى = نسبة من تكلفة الخامات المشتراة لحساب العميل (وتحملها الفاتورة الآن كسطر تمرير — U-1)؛ منع صلب عند الإصدار وعند رفع طلبات الشراء معاً؛ التنازل بصلاحية production.case.deposit_waive فقط ومُسجَّل |
| D-26 | قائمة مبدئية لمنتج لم يُسجَّل بعد | Product.lifecycle=Prospect — تحفظ سلامة المفتاح وتترقّى نظيفاً عند الفوز |
| D-27 | توقيت toll/الأمانة | السحب المبكر مُعتمَد — شرط D-07 تحقق: عميل الإطلاق مصنع تصنيع للغير |
| D-28 | نطاق شاشات المراحل (يضم تفصيل صلاحيات OQ-7) | لوحة مسار MVP في المرحلة 2؛ الورش الحرجة للبوابات في 2.5؛ الإكمال والصقل في 5؛ شرائح صلاحية لكل مرحلة والمشرف يمتد فوق الكل |
| D-29 | ملكية مستندي العرض والدفعة | إعادة الاستخدام مُتحقَّقة: SalesQuotation للمستند التجاري وReceiptVoucher للنقدية؛ جداول mfg_* تحمل بيانات التقدير والملف والبوابة فقط |
| D-30 | ملكية خردة مواد العميل (OQ-4) | لا قيد خردة ذاتي أبداً — ملك العميل في عُهدة: حركة تتبّع منفصلة، تسوية/إرجاع/فوترة حسب العقد، وتدخل في تسوية إقفال الملف (M-12) |
| D-31 | نطاق دورة التسعير ما قبل البيع (كان «D-23» مؤقتاً في الملحق 31) | يُبنى كاملاً (تصميم الملحق 34) — هو مدخل هذا العميل؛ بدونه الدورة الأولى غير مخدومة |
| D-32 | استثناء تجميد القائمة المبدئية للتجربة (تعديل صريح على صف 2 من الوثيقة 20) | يُعتمد الاستثناء الضيق: أوامر Trial وحدها خلف الإعداد production.trial_allow_draft_bom؛ الأوامر العادية أبداً — بدونه تدفق التجربة المعتمد نفسه مستحيل |
| D-33 | قضيب ترحيل الدفعة — تعديل القانون LA-1 (على القسم 5.4 من الوثيقة 22) | يُعتمد قضيب السند: قبض الدفعة عبر ApproveReceiptVoucher وقيد السند نفسه هو الترحيل الوحيد (لا ازدواج)؛ كل ترحيل إنتاجي آخر يبقى حصرياً عبر CreateJournalEntry |
| D-34 | سياسة صلاحية العرض (OQ-5) | production.quote_validity_days (افتراضي 30)؛ العرض المنتهي يمنع الفوز/التحويل حتى إعادة التسعير |
| D-35 | استرداد/مصادرة الدفعة عند الإلغاء (OQ-6) | تعاقدياً؛ الافتراضي = تُطبَّق على التكلفة المتكبَّدة والباقي قابل للرد (production_advance_refund) |
| D-36 | علاقة كمية التجربة بالكمية الكاملة والتصحيح (OQ-8) | كمية التجربة مستقلة؛ تصحيح إلزامي من actual_unit_cost قبل التحويل |
| OQ-9 | ما معنى «واجهات لكل مرحلة إنتاجية»؟ مراحل الملف التجارية (قراءة الملحق 35) أم مراحل التصنيع الفيزيائية (خلط/تحبيب/كبس/تعبئة — مرجَّحة دوائياً)؟ | يُسأل العميل عند بوابة المرحلة 0. القراءتان مخدومتان: ورش الملف في 2–2.5؛ وإن تأكدت قراءة مراحل التصنيع فورش لكل عملية مسار مع المرحلة 5 + شاشة مراقبة قراءة-فقط مبكرة في 2.5 |
| خطر | انزلاق المرحلة 1 بعد سحب الأمانة إليها | تقسيم 1أ/1ب المنشور يبقى خطة التراجع المتفق عليها؛ شريحة الأمانة تنزلق إلى 1ب فقط |
| خطر | انحراف التقدير عن الفعلي (تسعير على قائمة مبدئية وأسعار تقديرية) | تصحيح إلزامي من actual_unit_cost للتجربة قبل التحويل (D-36)؛ إنفاذ valid_until (D-34) |
| خطر | محاسبة الدفعة المقدمة (التزام لا إيراد ولا سداد مدينين) | اعتماد المحاسب على حساب الدفعات وقيد التسوية وسطور تمرير الخامة (U-1) قبل خروج المرحلة 2؛ الاسترداد وفق D-35 |
| خطر | ضغط تجاوز بوابة الدفعة لأسباب تجارية | Waived هو المسار الوحيد — بصلاحية، مُسجَّل، ومُتقرَّر عنه؛ لا مسار تجاوز صامت في الكود (وبوابة طلبات الشراء تطيع نفس التنازل) |
الخلاصة
- الخريطة: +6 جداول
mfg_*(الإجمالي 24 ← 30) بتسمية الملحقين 34/35 القانونية (تقديرات + ملفات — لاmfg_quotationsموازية) + تعديلات على جداول وإعدادات قائمة — كلها فوق القضبان المعتمدة - العقود: قاموس أحداث واحد (5 للتقدير + 14 للملف)، ثلاثة إجراءات مبيعات رفيعة (
UpsertQuotationPricing،ConvertQuotationToOrder،CreateServiceInvoice)، وتصميم المستندات الأربعة الناقصة: إدخال/إرجاع خامة العميل، تسليم عينة التجربة، تحويل إفراج الحجر الصحي، وفوترة تمرير الخامة المشتراة بالنيابة — مع تعديلين معتمدين فقط (D-32، LA-1/D-33) - خارطة الطريق: مرحلة جديدة 2.5 «الواجهة التجارية» (M) بورشها الحرجة، الأمانة ومستنداها يُسحبان من 6 إلى 1/2، بوابة الدفعة تحصل على موعدها في 2 وتحكم الشراء بالنيابة لا الإصدار فقط، والسجل المرجعي D-23..D-36 + OQ-9 يدخل بوابة المرحلة 0 — دون نقض أي قرار منشور آخر