خطة للموافقةv1

صفحة «الحسابات الافتراضية» في الـ Setup — مقسّمة بالموديولات + مختارة افتراضيًا

توسعة صفحة /setup لتغطّي حسابات المعمل والتصنيع والـ HR، وكل خانة مختارة افتراضيًا بحساب تفصيلي صح زي الـ 7 الموجودين دلوقتي — من غير ما المستخدم يختار يدوي.

الهدف باختصار

دلوقتي خطوة «الحسابات الافتراضية» فيها 7 خانات ثابتة بتكتب مفاتيح accounting.default_*الباك إند مش بيقراها أصلًا عند الترحيل (مفيش تعريف ولا أي كود محاسبي بيستهلكها)، والصفحة مش بتحمّل القيم المحفوظة. الكود الحقيقي بيقرا مفاتيح بالـ namespace module.*_account_id.

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

① مبدأين حاكمين للتصميم كله

🔴 فخ رأس حساب الذمم (AR/AP-header trap) — حادثة elmadina حسابات الذمم 1103 (مدينون) و2101 (دائنون) بتبدأ تفصيلية، بس أول ما يتعمل تحتها حساب فرعي لأول شريك → بتتحوّل لرأس/تحكّمي، وأي قيد بيترحّل عليها مباشرة بيرمي خطأ والفاتورة تفضل draft/unpaid بصمت. أي حساب ذمم افتراضي لازم يكون ابن تفصيلي (مثل 110301 / 210101) — أبدًا مش الأب نفسه.
⚠️ الترحيل بيكون على الحسابات التفصيلية بس (leaves) الرؤوس (1, 11, 2, 4, 5, 52…) بترمي لو قيد اترحّل عليها. فالـ picker لازم يعرض account_type==='detail' بس، ويستبعد رؤوس الذمم.

② إزاي كل خانة تيجي «مختارة افتراضيًا» (المتطلب الأساسي)

عند فتح الصفحة، لكل خانة نحدّد القيمة بترتيب 3 مستويات — عشان متبقاش فاضية أبدًا (زي سلوك الـ 7 الحاليين):

  1. القيمة المحفوظة من الإعدادات لو موجودة وكانت حساب تفصيلي قابل للترحيل → نستخدمها.
  2. وإلا الكود الافتراضي (autoCodes) → ندوّر على الحساب التفصيلي بالكود (مثل 4101/5101/1101).
  3. وإلا فاضيأبدًا مانختارش رأس حساب. خانات الذمم تختار ابن تفصيلي تحت 1103/2101 بس.
عشان تبقى مختارة من أول تثبيت: نوسّع seedDefaultAccountSettings() إنه يملأ المفاتيح الآمنة بأكوادها + ينشئ أبناء الذمم — فالشركة الجديدة توصل لـ /setup وكل حاجة مختارة جاهزة، وفخ الـ AR يتصلّح من المصدر.

③ جدول الحسابات الافتراضية لكل موديول

🟢 leaf = الافتراضي حساب تفصيلي جاهز · 🟠 ينشأ = نعمله find-or-create تحت أب · 🔴 AR/AP = فخ رأس الذمم (لازم ابن تفصيلي)

🔬

المعمل (LIS)

10 حسابات · أولوية
المفتاحالاسمالافتراضيالنوع
lis.receivable_account_idحساب الذمم — Receivable110301 ذمم مرضى المعملAR
lis.insurance_receivable_account_idذمم التأمين — Insurance Recv.110302 ذمم شركات التأمينAR
lis.revenue_account_idالإيرادات — Revenue4102 إيرادات الخدماتleaf
lis.tax_payable_account_idالضريبة المستحقة — Tax Payable2105 ضرائب مستحقةleaf
lis.cash_account_idالنقد — Cash1101 النقدية بالصندوقleaf
lis.cogs_account_idتكلفة المباع — COGS5101 تكلفة البضاعة المباعةleaf
lis.discount_account_idالخصومات — Discount4105 خصومات المبيعاتleaf
lis.external_lab_payable_account_idذمم المختبرات الخارجية210101 تحت 2101AP
lis.external_lab_expense_account_idمصروفات المختبرات الخارجيةابن تحت 52ينشأ
lis.reagent_expense_account_idمصروفات الكواشف — Reagentابن تحت 51ينشأ
🏭

التصنيع (Production)

8 حسابات · أولوية

مفيش منها حساب في الشجرة الافتراضية — كلها find-or-create تلقائي عبر ProductionAccountResolver تحت الرؤوس 11/21/52 (الـ picker يستدعي نفس الـ resolver). الأكواد أمثلة فقط مش ثابتة.

المفتاحالاسمالأبالنوع
production.wip_account_idإنتاج تحت التشغيل — WIPتحت 11 (أصل)ينشأ
production.fg_account_idمنتجات تامة — Finished Goodsتحت 11ينشأ
production.toll_clearing_account_idتسوية التصنيع لدى الغيرتحت 11by-style
production.labor_applied_account_idالعمالة المحمّلة — Labor Appliedتحت 21 (التزام)ينشأ
production.overhead_applied_account_idالتكاليف غير المباشرة المحمّلةتحت 21ينشأ
production.customer_advance_account_idسُلف العملاء — Customer Advancesتحت 21by-style
production.scrap_account_idهالك الإنتاج — Scrapتحت 52 (مصروف)ينشأ
production.cost_variance_account_idانحراف تكلفة الإنتاج — Varianceتحت 52ينشأ
👥

الموارد البشرية / المرتبات (HR)

10 حسابات · أولوية
المفتاحالاسمالافتراضيالنوع
hrm.salary_expense_account_idمصروف الرواتب — Salary Exp.5201 الرواتب والأجورleaf
hrm.salary_payable_account_idالرواتب المستحقة — Payable2103 مصروفات مستحقةleaf
hrm.social_insurance_account_idالتأمينات الاجتماعية2105 (أو ابن تحت 21)leaf
hrm.medical_insurance_account_idالتأمين الطبي2105 (أو ابن تحت 21)leaf
hrm.eos_provision_account_idمخصص نهاية الخدمة — EOS Prov.2202 مكافأة نهاية الخدمةleaf
hrm.eos_expense_account_idمصروف نهاية الخدمة5201 (أو ابن تحت 52)leaf
hrm.overtime_expense_account_idمصروف العمل الإضافي5201leaf
hrm.leave_accrual_account_idمخصص الإجازات — Leave Accrual2103 مصروفات مستحقةleaf
hrm.income_tax_account_idضريبة الدخل المستحقةابن تحت 21ينشأ
hrm.loan_receivable_account_idسُلف الموظفين — Loan Recv.ابن تحت 11by-style
💼

Sales · Purchases · Core (الموجودة — نصحّحها)

+ Treasury/POS
المفتاحالاسمالافتراضيالنوع
sales.revenue_account_idإيرادات المبيعات4101leaf
sales.cogs_account_idتكلفة المباع5101leaf
sales.receivable_account_idذمم العملاء110301 تحت 1103AR
purchases.payable_account_idذمم الموردين210101 تحت 2101AP
sales.tax_payable_account_idالضريبة المستحقة2105leaf
accounting.default_cash_accountالصندوق1101leaf
accounting.default_bank_accountالبنك1102leaf
accounting.default_check_accountأوراق القبض/الدفع1104 / 2102leaf
pos.cash_receiving_account_idاستلام كاش POS1101leaf

إجمالي ~56 مفتاح، يظهر منها ~46 في الـ picker (نستبعد: cost-center، JSON map، enum، أكواد نصية مثل inventory.stock_account، و toggles).

④ شغل الفرونت إند (FE)

الملفات: features/setup/setup-wizard.component.{ts,html,scss} + ملف جديد default-accounts.config.ts + ترجمات SETUP.*.

⑤ شغل الباك إند (BE)

تصحيحات لازمة (correctness)

  • إصلاح 4 افتراضيات غلط: inventory.stock_account 1301→1105, inventory.cogs 4101→5101, default_revenue '41'→4101, checks_received 1103→1104.
  • إعادة توجيه sales.receivable/purchases.payable من 1103/2101 لأبناء تفصيليين (إصلاح فخ elmadina من المصدر).
  • إضافة تعريفين LIS: external_lab_expense + reagent_expense.

اختياري (موصى به)

  • توسعة seedDefaultAccountSettings() لملء كل المفاتيح الآمنة بأكوادها + إنشاء أبناء الذمم → الشركة الجديدة توصل /setup مختارة جاهزة.
  • إعادة استخدام AutoAccountService::createChildAccount + ProductionAccountResolver للحسابات اللي «تنشأ» — مش نعيد كتابتها.
  • (اختياري) param ?account_type=detail على endpoint الحسابات.

⑥ قرارات محتاجة رأيك ⚑

1) الحسابات اللي ملهاش افتراضي جاهز (~12: التصنيع، ضريبة المدخلات، مصروفات المعامل الخارجية، الكواشف، ضريبة الدخل، السُلف…)
(أ) ننشئها تلقائيًا وقت الحفظ/التثبيت (مختارة + شجرة منظّمة) · (ب) نسيبها فاضية والمستخدم يختار / تتنشئ عند أول قيد
توصية: ننشئ تلقائيًا عالية الاستخدام (WIP/FG/ضريبة مدخلات)، والباقي lazy.
2) نطاق الإصدار الأول
المعمل + التصنيع + HR (مفتوحين) + Core/Sales/Purchases (مطوية) دلوقتي، ونأجّل Treasury/POS · أو كل الـ 8 أقسام مرة واحدة
توصية: كل الـ 8 — التكلفة الإضافية بسيطة (نفس الـ config).
3) المفاتيح القديمة accounting.default_* (الميتة)
نلغيها ونستخدم المفاتيح الحقيقية بس · أو نفضل نكتبها للتوافق
توصية: نلغيها.
4) أكواد أبناء الذمم (AR/AP)
أكواد ثابتة محجوزة (110301/210101) في الشجرة الافتراضية · أو نخلّي AutoAccountService يولّد التالي
توصية: أكواد ثابتة → الاختيار الافتراضي يبقى حتمي.

⑦ ترتيب التنفيذ

  1. تصحيحات BE (الأول): الـ 4 افتراضيات + إعادة توجيه الذمم لأبناء تفصيليين + تعريفي LIS.
  2. (اختياري) توسعة seedDefaultAccountSettings() → الشركات الجديدة توصل مختارة.
  3. FE configdefault-accounts.config.ts: 8 أقسام × المفاتيح الحقيقية + isAr + autoCodes.
  4. FE تحميل + picker — جلب الـ leaves مرة، forkJoin على كل الموديولات (مع lis/production)، اختيار محفوظ←كود←فاضي + حارس الذمم.
  5. FE عرض + حفظ + ترجمةp-accordion (المعمل/التصنيع/HR مفتوحين)، إنجليزي-أولًا، حفظ بالمفاتيح الحقيقية، بناء + نشر على moonui.
📚 التوثيق الكامل في الـ Knowledge Base knowledge-base/topics/default-accounts/ — 14 ملف: INDEX.md (الجرد الكامل) + setup-extension-spec.md (هذا التفصيل) + topic لكل موديول/كومبوننت.

موافقتك على القرارات الأربعة (⑥) كفيلة إني أبدأ التنفيذ بالترتيب أعلاه — هبدأ بالمعمل/التصنيع/HR (أولوياتك).