ERP ECHO — SaaS Ready Data Architecture

خطة قاعدة البيانات المعتمدة بعد المراجعة (بدون تقسيط داخلي + بدون استبدال)

RTL SaaS-Ready Controlled Cleanup

الملخص التنفيذي

Executive Summary
القرار الأساسي
نكمل على القاعدة الحالية مع “تنضيف معماري”
بدون حذف جداول، لكن تعطيل القديم منطقيًا
أهم خطر سابقًا
تعدد مصادر الحقيقة
كمية/ربح/مرتجع من أكتر من مكان

المبادئ الأساسية (ثوابت)

Core Principles
تغييرات الإدارة: إلغاء التقسيط الداخلي + إلغاء الاستبدال + الاكتفاء بالمرتجعات فقط.

الهيكل النهائي المعتمد (SaaS Core)

Approved Structure
1

الشركات (SaaS Core)

كل عميل SaaS = شركة مستقلة. لازم company_id يتضاف لكل الجداول التشغيلية.

companies
idnamestatuscreated_at
قاعدة: ممنوع خلط بيانات شركتين في نفس السجلات — company_id إلزامي.
2

المستخدمين والصلاحيات

التحكم في الصلاحيات يبقى في الكود، والجداول تكون بسيطة وآمنة.

users
idcompany_idusernamepassword_hashrolestatuscreated_at
user_warehouses
iduser_idwarehouse_idcreated_at
مهم جدًا: ممنوع MD5 — لازم password_hash / password_verify.
3

المخازن والمخزون

مصدر الحقيقة للكمية والتكلفة: warehouse_stock فقط.

warehouses
idcompany_idnamecodecode_prefixis_activecreated_at
warehouse_stock ✅ (Single Source)
warehouse_idproduct_idqtyavg_costupdated_at
stock_movements (Audit Only)
idproduct_idwarehouse_idqtytype(in/out)reasoninvoice_idcreated_at
قرار: تجاهل products.qty و products.cost_price بالكامل في التشغيل.
4

المنتجات والفئات

المنتج لا يحمل كمية. الأسعار متعددة (retail/wholesale/offer) + SKU/Barcode.

products
idcompany_idnamecategory_idsub_category_iddefault_warehouse_id skubarcoderetail_pricewholesale_priceoffer_priceis_active
product_categories / product_subcategories
company_idnamecode_prefixis_deleted
توصية توحيد الأكواد: SKU = <WH>-<CAT>-####   |   BARCODE = ECHO-YYYYMMDD-####
5

المبيعات والمرتجعات

المحور الأساسي: invoices + invoice_items. المرتجع هو invoice_type=return فقط.

invoices ✅ (Core)
idcompany_idwarehouse_idinvoice_noinvoice_type(sale/return)related_invoice_id totalspayment_statuscreated_at
invoice_items
invoice_idproduct_idwarehouse_idqtypricecost(snapshot)total
قرار نهائي: لا Exchange — لا exchange_items — لا زر “استبدال”.
6

المدفوعات (بدون تقسيط داخلي)

invoice_payments هو مصدر التحصيل. التقسيط شركات فقط (ValU / Aman / …) كـ payment_method.

invoice_payments ✅
idinvoice_idpayment_methodamountstatusref_nopaid_atnote
قواعد: 1) لا installment_schedule
2) لا سداد مبكر / فوائد داخل النظام
3) شركات التقسيط تُسجل كوسيلة دفع واحدة على الفاتورة
7

المحاسبة (Ledger)

ledger واحد فقط. الرصيد لا يُخزن، بل يُحسب.

accounts
idcompany_idnametypeparent_idlevel
journal_entries + journal_items ✅
journal_entries: id, company_id, entry_date, source_type, source_id journal_items: journal_entry_id, account_id, debit, credit
قاعدة ذهبية: أي حركة فلوس لازم تتحول لقيد مزدوج في journal_items.
8

التقارير (Views Only)

لا تقارير مباشرة من الجداول التشغيلية — كل التقارير تعتمد على Views.

الـ View الغرض ملاحظات
v_profit_lines حساب الربح (بيع - مرتجع - تكلفة) Signed totals + Signed COGS
v_stock_ledger دفتر حركة المخزون من stock_movements + أسماء
v_sales_summary ملخص مبيعات حسب فترة/مخزن/دفع يحترم invoice_type
قرار: الربح لا يعتمد على invoices.profit كمصدر — View واحدة فقط.
9

الإعدادات والتدقيق

إعدادات الشركة والترويسات والسياسات + سجلات تدقيق إلزامية في SaaS.

settings
company_idinvoice_prefixinvoice_digitstaxreturn_daysbranding
audit_logs ✅
company_iduser_idactionentity_typeentity_idold_datanew_datacreated_at
10

Legacy (موقوف استخدامه)

الجداول دي تفضل موجودة مؤقتًا لأغراض أرشفة فقط — بدون Inserts/Updates أو تقارير.

installment_schedule
exchange_items
return_invoices
return_items
sales_returns
sales_return_items
products.qty (مهجور)
products.cost_price (مهجور)
قاعدة تنفيذ: Disable by logic — not by delete (في المرحلة الأولى).

خارطة التنفيذ (Roadmap بلا توقف)

Implementation
  1. المرحلة 1: تثبيت مصدر الحقيقة
    كمية/تكلفة: warehouse_stock — مرتجع: invoices — تحصيل: invoice_payments
  2. المرحلة 2: تعطيل منطق التقسيط الداخلي والاستبدال
    إزالة UI + منع أي Inserts للجداول القديمة
  3. المرحلة 3: تحويل التقارير إلى Views فقط
    Profit / Stock Ledger / Sales Summary
  4. المرحلة 4: SaaS Switch
    إضافة company_id لكل الجداول التشغيلية + عزل البيانات
الهدف: ERP منضبط، تقارير صحيحة، جاهز للتوسع وSaaS بدون مشاكل أرقام.