تصميم تنفيذي كامل للدورة الأولى التي وصفها صاحب المصنع: العميل يأتي بمنتجه وتركيبته ويطلب تسعيراً استكشافياً ← البحث والتطوير يبني قائمة مواد مبدئية ← المحاسبة تحسب تكلفة مبدئية ← يعود السعر للعميل كعرض سعر بصلاحية محددة. التصميم يسكن داخل وحدة الإنتاج الموسّعة 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.
| الكيان | الحكم | الدور في الدورة |
|---|---|---|
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) |
| # | من | الإجراء | الفاعل | الشرط الحاكم | إلى | الحدث |
|---|---|---|---|---|---|---|
| 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 لا تُستدعى في هذه الدورة أصلاً.
كلها في Modules\Production\Events وتُطلق بعد نجاح المعاملة، ومستهلكوها مستمعون داخل وحدة الإنتاج يستدعون إجراءات الوحدات الأخرى للأمام (قانون العقود — الملحق 22 §2: لا وحدة تستورد الإنتاج أبداً).
| الحدث | المُطلِق | المستهلكون |
|---|---|---|
CostEstimateRequested | CreateCostEstimate | مغذّي قائمة أعمال البحث والتطوير (طابور شاشة 3) + بث للوحة المسار |
DraftBomReady | SubmitDraftBom | مغذّي طابور شاشة التكاليف بالمحاسبة + تشغيل المحاكاة تلقائياً (إعداد اختياري للشركة) + بث للوحة |
EstimateQuoted | QuoteCostEstimate | مجدول متابعة البيع وراصد الصلاحية (يعلّم Expired عند الموعد ويمنع الفوز) + لوحة الإدارة + أرشفة PDF |
EstimateWon | MarkEstimateWon | بوابة الدورة الثانية: ترقية المنتج، بذر الربط mfg_peggings، وعرض مسار التجربة (دفعة العيّنة R-05) |
EstimateLost | MarkEstimateLost | تحليلات الربح/الخسارة وإغلاق النسب |
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 للبيع، والمشرف يشمل الكل.
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 بعد تفعيل القائمة.تهبط الدورة في المرحلة 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 يوماً، والعرض المنتهي يمنع التحويل حتى يُعاد تسعيره).