طبقة التنفيذ هي «الواقع»: تحوّل الخطط إلى أحداث فعلية مُسجَّلة على أرض المصنع. الفارق بين المُخطَّط والفعلي يُنتج الانحرافات (تُعالَج في ملف التكاليف). تتكوّن من أربع وثائق متسلسلة — أمر الإنتاج، ثم صرف المواد، ثم تأكيد العمليات، ثم استلام المنتج التام — وكل حدث فعلي فيها يُولِّد قيداً محاسبياً فورياً في دفتر الأستاذ العام.
Production Order — أمر الإنتاج (العقد الداخلي المُصرِّح بالإنتاج)Material Issue — صرف المواد من المخزون الخام إلى تحت التشغيلConfirmation — تأكيد ما نُفِّذ فعلياً لكل عملية (كميات، عمالة، هالك)Goods Receipt — استلام المنتج التام إلى مخزون الأصناف الجاهزةكل وثيقة لاحقة ترتبط بأمر إنتاج محدّد، وتورِث القواعد الحاكمة من ملف المبادئ: اللقطة المُجمَّدة، آلات الحالة، الربط متعدد-إلى-متعدد بين الطلب والإمداد، التكرار متعدد المستويات، التهيئة بدل الترميز، وقيد محاسبي لكل حدث فعلي.
العقد الداخلي الذي يُصرِّح بإنتاج كمية محددة من منتج محدد. الفكرة الجوهرية هي اللقطة المُجمَّدة: عند الانتقال من 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: إقفال «تحت التشغيل»؛ حساب الانحرافات النهائية؛ منع أي ترحيلات لاحقةconfirmed_quantity يُعمَّم إلى { grade → qty }.Released لا تُحجَز/تُشترى مواد العميل بل يُتحقَّق من كفاية الأمانة؛ وعند Closed يذهب الناتج لملكية العميل والتكلفة = أجر التحويل فقط.أول حركة محاسبية حقيقية: تنتقل المادة من مخزون الخام 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؛ المتاح ≥ الكمية؛ المادة ضمن لقطة الـ BOMcost_price = get_cost(material, costing_method)WIP[order] += qty × cost_priceDebit WIP / Credit Raw Materials بمقدار qty × cost_priceorder_component[material].issued += qtyفرع الأمانة: إذا كانت ملكية المادة للعميل تُصرف من مخزون أمانة منفصل لا من مخزونك، والمحاسبة تختلف (لا يوجد «دائن مخزون خام» بتكلفتك لأنها ليست أصلاً لك)؛ تُسجَّل حركة «استهلاك مادة العميل» للتتبّع فقط.
Manual؛ الصغير → Backflush؛ المُهمَل → يُعامَل كتكلفة غير مباشرة ولا يُصرَف.يسجّل ما نُفِّذ فعلياً من الأمر لكل عملية: كم أُنتِج، كم من العمالة/زمن الآلة استُهلك، وكم الهالك — وهو المصدر الحقيقي للأرقام الفعلية مقابل المعايير.
| الكيان / الحقل | الملاحظة |
|---|---|
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 (مؤشر جودة رئيسي) |
InProcess؛ العملية مفتوحةBackflush: consumed = total_input × BOM_qty وصرف تلقائيlabor_calc: Hourly → labor_hours × labor_rate أو PieceRate → produced × piece_ratemachine_cost = machine_hours × machine_rate؛ overhead = (labor_hours + machine_hours) × overhead_rateDebit WIP / Credit Labor Applied + Machine Applied + Overhead AppliedDebit Scrap Expense / Credit WIP بمقدار scrap × unit_costFinal: إقفال العملية؛ وإن لم تكن الأخيرة: تحويل العملية التالية إلى Ready (← SFC)| الخطوة | المعادلة |
|---|---|
| إجمالي القيمة البيعية | 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 |
الدرجة الأعلى سعراً تمتصّ تكلفة أكبر؛ والمصانع العادية تستخدم درجة واحدة فيؤول الأمر إلى السلوك المعياري المفرد.
الخطوة الأخيرة: يدخل المنتج التام المخزون، فيُقفَل «تحت التشغيل» ويُفتَح مخزون الأصناف الجاهزة 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)FG_Inventory[item, grade]Debit FG Inventory (standard×qty) + Debit Variance Acct (الفارق) / Credit WIP (الفعلي)Full: الأمر → CompletedClosedمثال الاستلام متعدّد الدرجات (ميلامين): أمر مكبس 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).
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 لا يُحسَب داخل التصنيع.Modules\Accounting\Actions\CreateJournalEntry — قيد واحد لكل حدث فعلي، تماماً كنمط PostLabInvoice في LIS.SequenceService، نطاق الفروع عبر DataScope، الصلاحيات تُسجَّل في PermissionDependencyRegistry ببادئة الوحدة، وكل النماذج تَرِث BaseModel/TenantAware لعزل الشركات (company_id).