# LAIL CRM-ERP — Server Migration Project Brief
### (Prompt file for Claude Code on a cPanel/PHP+MySQL server)

هذا الملف مُعد ليكون البرومبت/المواصفة الكاملة التي تُعطى لـ **Claude Code** وهو يشتغل على سيرفر **cPanel**، لإعادة بناء نفس تطبيق LAIL CRM-ERP (حالياً ملف HTML واحد يحفظ بياناته في `localStorage` بالمتصفح) كتطبيق سيرفر حقيقي بقاعدة بيانات مركزية، مع الحفاظ على **نفس التصميم (Design)** و**نفس هيكل البيانات (Data Model)** الموجود حالياً في نسخة v57.

---

## 1. نظرة عامة / Overview

**LAIL LIGHTING DESIGN** — شركة تصميم إنارة وتوريد معدات إضاءة في دبي. التطبيق الحالي هو CRM/ERP شامل بوضعين رئيسيين للعمل (Design و Supply) بالإضافة إلى Marketing, Accounting, HR, Reports. التطبيق الحالي:

- ملف HTML واحد (~2.8MB) يحتوي كل الكود (HTML+CSS+JS) في متغير JS واحد، بدون أي backend.
- التخزين بالكامل عبر `localStorage` في المتصفح (مفتاح واحد `lail_crm_erp_db_v1` يحتوي كائن JS ضخم اسمه `DB`).
- لا يوجد تسجيل دخول / مستخدمين متعددين — كل نسخة محلية بالكامل لجهاز واحد.

**الهدف من إعادة البناء:** نقل نفس التطبيق (نفس الشاشات، نفس التصميم البصري، نفس منطق العمل) إلى تطبيق سيرفر PHP + MySQL يعمل على استضافة cPanel عادية، بحيث:

- البيانات تُخزَّن في قاعدة بيانات MySQL حقيقية بدل `localStorage` (يسمح بالوصول من أكثر من جهاز/مستخدم، وبنسخ احتياطي حقيقي).
- تصميم الواجهة (الـ CSS / الثيم الزجاجي / الألوان / الخطوط) يبقى **مطابق تماماً** لما هو موجود الآن.
- كل الشاشات والوظائف الحالية (اقتباسات التصميم والتوريد، الفواتير، المشاريع، الكتالوج، جهات الاتصال، أوامر الشراء، الشحن، الموارد البشرية، التقارير، الطباعة ثنائية اللغة) تُعاد بناؤها بنفس السلوك تماماً.

---

## 2. الستاك التقني الموصى به على cPanel

استضافات cPanel القياسية تدعم **PHP + MySQL** بشكل native (بدون الحاجة لعمليات Node.js دائمة التشغيل)، لذلك الموصى به:

- **Backend:** PHP 8.1+ (متوفر افتراضياً في أغلب لوحات cPanel) — REST API بسيط بدون framework ثقيل (أو Slim/Laravel لو الاستضافة تسمح بـ Composer)، أو حتى ملفات PHP إجرائية بسيطة إن كانت الاستضافة محدودة.
- **Database:** MySQL / MariaDB (متوفر افتراضياً في cPanel عبر phpMyAdmin).
- **Frontend:** نفس ملف الـ HTML/CSS/JS الحالي تقريباً، لكن مقسّم لملفات منطقية (`index.html`, `app.js`, `styles.css`) بدل الدمج بملف واحد، مع استبدال كل نداءات `localStorage.getItem/setItem` بنداءات `fetch()` إلى الـ API.
- **Auth:** إضافة نظام تسجيل دخول بسيط (جدول `users` + جلسات PHP session أو JWT) — غير موجود حالياً بما أن التطبيق كان محلي بالكامل، لكنه ضروري الآن لأن قاعدة البيانات ستكون مركزية ومشتركة.
- **رفع الملفات (شعار الشركة، صور المنتجات، مرفقات الموظفين):** تُخزَّن كملفات على السيرفر (مجلد `/uploads`) مع تسجيل المسار في قاعدة البيانات، بدل الـ Data URLs المخزنة حالياً داخل الـ JSON.

---

## 3. هيكل التنقل / الوحدات (Modules & Routes)

النظام الحالي يقسّم الواجهة لـ "أوضاع" (Modes) رئيسية يختارها المستخدم من شاشة البداية:

| الوضع (Mode) | الوصف |
|---|---|
| `design` | تصميم الإنارة: عروض أسعار تصميم، فواتير تصميم، متابعة مشاريع التصميم، تقرير الهدف الشهري (22,000 AED) |
| `supply` | توريد المعدات: عروض أسعار توريد، Proforma، إيصالات دفع، إشعارات تسليم، الموردين، أوامر الشراء، الشحن، كتالوج المنتجات، تقرير الهدف الشهري (65,000 AED) |
| `marketing` | مصاريف التسويق (سوشيال ميديا، معارض، حملات) |
| `accounting` | الحسابات العامة: أرباح وخسائر الشركة، الرواتب، الفواتير، الضرائب، الإيجار |
| `hr` | الموظفين، مستندات الشركة، ملفات المشاريع، التأهيل المسبق (Prequalification) |
| `reports` | قسم منفصل تماماً (لا يشارك بيانات Design/Supply مع بعض) — يعرض P&L لكل مشروع، أكثر 5 عناصر مبيعاً وربحية، أكثر الدول طلباً، أكثر أنواع المشاريع، تقرير مالي شهري |

كل وضع له عناصر تنقل جانبية خاصة به (`NAV` array)، بالإضافة لعناصر مشتركة مثل Dashboard, Activity Tracker, Calendar, Survey Inbox, Leads, Contacts, Settings.

**الشاشات الكاملة المطلوب إعادة بناؤها:**

- Dashboard (حسب الوضع الحالي: Design أو Supply)
- Activity Tracker (تتبع أنشطة المبيعات اليومية: زيارات، سوشيال ميديا، اجتماعات، متابعات، مكالمات باردة — بأهداف أسبوعية)
- Calendar / Appointments
- Survey Inbox
- Leads (خط أنابيب Leads قبل تحويلهم عملاء)
- Design Quotations (منشئ عروض تصميم)
- Design Invoices
- Design Tracker (مشاريع التصميم بمراحلها)
- Supply Quotations (منشئ عروض توريد)
- Proforma Invoices
- Payment Receipts
- Delivery Notes
- Supply Tracker (مشاريع التوريد بمراحلها)
- Suppliers
- Purchase Orders
- Shipping (شحنات مع حساب الوزن/CBM)
- Items Catalogue
- Contacts
- Marketing (مصاريف)
- Accounting (مصاريف + P&L)
- Employees, Company Documents, Project Files, Prequalification
- Settings (بيانات الشركة، الشعار، الختم، التوقيع، تسلسل الأرقام، شروط وأحكام EN/AR)
- Reports (القسم المعزول بالكامل)

---

## 4. نظام التصميم (Design System) — يجب نسخه بدقة

### الخطوط
- العناوين (`--font-display`): **Space Grotesk**
- النصوص (`--font-body`): **Plus Jakarta Sans**

### الثيم الزجاجي (الحالي، الافتراضي حالياً)
```css
:root{
  --glass-1:#eef0e8; --glass-2:#e8e2d6; --glass-3:#dee3d8;
  --bg:#eae7df; --card:rgba(255,255,255,.21); --card-2:rgba(255,255,255,.14);
  --ink:#20241d; --muted:#5c6355;
  --line:rgba(32,36,29,.11); --line-strong:rgba(32,36,29,.19); --row:rgba(32,36,29,.04);
  --shadow-sm:0 1px 3px rgba(20,24,16,.08); --shadow-md:0 26px 60px rgba(20,24,16,.16);
  --accent:#F77E0D; --accent-dark:#c9670c;
  --silver:#99A57D; --good:#99A57D; --bad:#EB4604; --warn:#EB4604;
}
body{
  background:
    radial-gradient(1100px 700px at 6% -12%, rgba(247,126,13,.22), transparent 60%),
    radial-gradient(900px 640px at 102% 0%, rgba(153,165,125,.28), transparent 55%),
    radial-gradient(1300px 900px at 50% 125%, rgba(255,255,255,.5), transparent 60%),
    linear-gradient(160deg, var(--glass-1), var(--glass-2) 50%, var(--glass-3));
  background-attachment:fixed;
}
/* كل الكروت (dashboard cards, kpi, stat tiles, صفوف القوائم, mode cards, المودالات)
   شفافة مع تمويه خلفي (glassmorphism): */
.card, .kpi, .stat-tile, .dsn-row, .mode-card, .dsn-fieldgroup, .modal{
  background: var(--card);
  backdrop-filter: blur(32px) saturate(190%);
  border: 1px solid rgba(255,255,255,.3);
  box-shadow: var(--shadow-md), inset 0 1px 0 rgba(255,255,255,.35);
}
.sidebar{
  /* الشريط الجانبي يبقى غامق دائماً (لا يأخذ الثيم الزجاجي الفاتح) */
  background: linear-gradient(180deg, rgba(16,12,11,.94), rgba(16,12,11,.88));
  backdrop-filter: blur(20px);
  border-radius: 26px; margin:14px 0 14px 14px;
}
```

**ملاحظة مهمة:** الشريط الجانبي (`.sidebar`) غامق دائماً (Charcoal داكن)، بينما منطقة المحتوى الرئيسية (`.main`) فيها الخلفية الفاتحة الزجاجية والكروت الشفافة. أي نص أبيض يجب أن يكون فقط داخل `.sidebar` — أي نص في `.main`/الكروت يجب أن يستخدم `--ink` الغامق لضمان التباين (كانت هذه مشكلة سابقة تم إصلاحها ويجب عدم تكرارها).

### الألوان الوظيفية
- `--accent` (البرتقالي `#F77E0D`) = اللون الأساسي/العلامة التجارية.
- `--good` (أخضر مائل للزيتوني `#99A57D`) = نجاح/إيجابي.
- `--bad` / `--warn` (`#EB4604`) = خطر/تحذير.
- `--wa` (`#25d366`) = واتساب (لأزرار "إرسال عبر واتساب").

---

## 5. نموذج البيانات الكامل (Data Model → جداول MySQL)

الكائن الحالي `DB` (المخزَّن كـ JSON واحد في localStorage) يحتوي هذه المجموعات. كل مجموعة تصبح جدول MySQL مستقل، بمفتاح أساسي `id` (حالياً نص عشوائي `uid()`، يمكن الإبقاء عليه كـ `VARCHAR(20)` أو التحويل لـ `AUTO_INCREMENT` + عمود `legacy_id`).

### 5.1 `settings` (صف واحد فقط — إعدادات الشركة)
```
companyName, addressLine, phone, mobile, email, website, companyProfileUrl,
bankName, accountName, accountNumber, iban, swift, trnNumber,
vatPercent (default 5), importShippingPct (default 5), importCustomsPct (default 5),
usdToAedRate (default 3.675),
designQuotePrefix/nextDesignQuoteNumber, designInvoicePrefix/nextDesignInvoiceNumber,
supplyQuotePrefix/nextSupplyQuoteNumber, deliveryPrefix/nextDeliveryNumber,
proformaPrefix/nextProformaNumber, leadPrefix/nextLeadNumber,
poPrefix/nextPoNumber, receiptPrefix/nextReceiptNumber, nextShipmentNumber,
salespeople (JSON array), lightingDesigners (JSON array),
quoteValidityDays (default 4),
logoDataUrl, stampDataUrl, signatureDataUrl → تتحول لمسارات ملفات مرفوعة على السيرفر,
stampSignOnDocs (JSON object بمفاتيح: quote/proforma/po/delivery/receipt/designQuote),
founderName, founderTitle, designDefaultCurrency (default 'AED'),
designIntroEn/Ar, designAboutEn/Ar, designDeliverablesEn/Ar,
designPaymentTermsEn/Ar, designTimelineEn/Ar (نصوص طويلة قابلة للتعديل من الإعدادات),
monthlyTargetDesign (default 22000), monthlyTargetSupply (default 65000),
termsQuote, termsDelivery, termsProforma, termsQuoteAr (نصوص شروط وأحكام طويلة EN/AR)
```

### 5.2 `contacts` (جهات الاتصال / العملاء)
```
id, name, phone, email, propertyType (نص حر: Villa/Office/Hotel...),
country, category (من قائمة CONTACT_CATEGORIES), address (يُستخدم كـ Ship-To بالمستندات),
subtype ('individual'|'business'), leadSource, projectType ('Design'|'Supply'|''),
driveUrl, surveyRequirements, consultationDate, designDeliveryDate, createdAt
```

### 5.3 `items` (كتالوج المنتجات)
```
id, name, code, description, rate (سعر البيع), cost (التكلفة), unit, vendor (اسم المورد), image
```

### 5.4 `projects` (مشاريع Design و Supply)
```
id, name, contactId (FK→contacts), type ('Design'|'Supply'), stage,
value (سعر البيع/القيمة التقديرية), cost (تكلفة البضاعة), shippingCost, amountReceived,
expenses (JSON array: [{category, description, amount}]),
startDate, eta, completedDate, refQuote, designer (لمشاريع Design فقط), notes, createdAt
```
> هذا الجدول هو أساس تقرير P&L لكل مشروع في قسم Reports: الربح = value − cost − shippingCost − مجموع expenses.

### 5.5 `design_quotes` (عروض أسعار التصميم)
```
id, number (DQ-0001...), date, contactId, projectTitle, projectType,
currency (default AED), salesperson, designer,
lines (JSON array: [{description, amount}]),
discountEnabled, discountType ('percent'|'fixed'), discountValue, discountLabel,
vatEnabled, vatPercent, notes, deliveryDays (default 7),
status ('Draft'|'Sent'|'Won'|'Lost'...), docType='Design', createdAt
```

### 5.6 `design_invoices`
(تُنشأ عادة من design_quotes — نفس بنية الأسطر مع رقم فاتورة INV- منفصل)

### 5.7 `supply_quotes` (عروض أسعار التوريد)
```
id, number (SQ-0001...), date, expiry, salesperson, contactId, projectTitle, projectType,
docType='Supply', revision (مثل 'Rev. 01'),
lines (JSON array: [{itemId, code, description, qty, rate}]),
shippingEnabled, shipping, shippingNote,
discount, vatEnabled, vatPercent, notes, status, createdAt
```

### 5.8 `proformas`
```
id, number (PI-0001...), date, dueDate, contactId, projectTitle, paymentTerms, docType,
lines (نفس بنية supply_quotes.lines), discount, vatEnabled, vatPercent, notes, status,
fromQuote (رقم عرض السعر الأصلي إن وُجد), createdAt
```

### 5.9 `deliveries` (إشعارات التسليم)
```
id, number (DN-0001...), date, contactId, projectTitle, refQuote, refProforma,
lines (JSON array: [{code, description, qtyOrdered, qtyDelivered, unit, itemId, image}]),
driver, vehicle, status, notes, createdAt
```

### 5.10 `receipts` (إيصالات الدفع)
```
id, number (RC-0001...), date, contactId, projectTitle, refNumber,
totalValue, percent (default 50), amount, method (default 'Bank Transfer'), reference, notes, createdAt
```

### 5.11 `suppliers`
```
id, name, contactPerson, phone, email, leadTimeDays (default 30),
paymentTerms, address (عنوان الاستلام), origin ('Local'|'Overseas'), originVerified, notes
```
> الموردين من خارج الإمارات (`Overseas`) تُضاف تلقائياً على تكلفتهم نسبة شحن (`importShippingPct`) + جمارك (`importCustomsPct`) عند بناء عرض سعر للعميل.

### 5.12 `purchase_orders`
```
id, poNumber (PO-0001...), date, expectedDate, supplierId (FK→suppliers),
refProject, refQuoteId (FK→supply_quotes), refQuoteNumber,
quoteSnapshot (نص لاكتشاف تغيّر عرض السعر بعد إصدار PO ضده),
lines (JSON array: [{itemId, description, qty, unitCost, image, mfgCode}]),
discount, status, notes, createdAt
```

### 5.13 `shipments`
```
id, reference (SHP-0001...), date, projectId, supplierId, mode, status, notes,
carrier, origin, destination, ratePerKg, ratePerCbm,
items (JSON array: [{description, qty, unitWeight, length, width, height, cartons}]),
createdAt
```
> الحسابات: `weight = qty × unitWeight`, `cbm = cartons × (L×W×H/1,000,000)`.

### 5.14 `leads`
```
id, leadCode (L-001...), date, leadName, contactName, phone, country,
source (من LEAD_SOURCES), requirement (من LEAD_REQUIREMENTS), interest ('Low'|'Medium'|'High'),
status (من LEAD_STATUSES), notes, createdAt
```

### 5.15 `appointments`
```
id, title, type ('consultation'|'follow-up'|'delivery'|'site-visit'|'other'),
contactId, date, time (default '10:00'), notes, createdAt
```

### 5.16 `expenses` (تسويق ومحاسبة عامة)
```
id, module ('marketing'|'accounting'), category, description, amount, date,
recurring (boolean), notes, projectId (FK→projects، اختياري لربط مصروف تسويقي بمشروع معيّن), createdAt
```

### 5.17 `employees`
```
id, name, position, department, phone, email, nationality, emiratesId, passportNumber,
visaExpiry, laborCardExpiry, joinDate, salary, status ('Active'|...), notes,
photoDataUrl → مسار ملف على السيرفر, documents (JSON array لمرفقات),
bankName, accountName, accountNumber, iban, swift,
wagePayments (JSON array لسجل صرف الرواتب), createdAt
```

### 5.18 مجموعات إضافية بسيطة (جداول أصغر)
`activity_types` (أنواع الأنشطة اليومية بأهداف أسبوعية)، `activity_log` (سجل الأنشطة المنفذة)، `company_documents`، `project_files`، `prequalification` + `prequalification_log`، `surveys`.

---

## 6. نظام الطباعة ثنائي اللغة (English / Arabic)

كل مستند (Design Quote, Supply Quote, Design Invoice) له بناء طباعة منفصل بلغتين:
- **English (LTR):** `PRINT_STYLE` + دالة `buildXPrintHtml(doc)`
- **Arabic (RTL):** `ARABIC_STYLE` + دالة `buildXArabicHtml(doc)`

**متطلبات إلزامية عند إعادة البناء:**

1. **نفس ترتيب/تخطيط الهيدر تماماً** بين النسختين الإنجليزية والعربية (لا `flex-direction: row-reverse` في الهيدر) — كان هناك خطأ سابق يعكس ترتيب الهيدر بالكامل بين اللغتين وتم إصلاحه، يجب عدم تكراره.
2. **الأرقام والهواتف داخل فقرة عربية (RTL)** يجب لفّها بـ `direction:ltr; unicode-bidi:isolate` (كلاس `.ltr-num`) لمنع انعكاس ترتيب المجموعات الرقمية (أرقام الهاتف، TRN، رقم الفاتورة).
3. **صفحة غلاف/مقدمة (Cover Page)** تُطبع قبل المستند الفعلي في الحالتين (EN/AR)، تحتوي: شعار الشركة، نوع المستند، اسم المشروع، اسم العميل، **نوع المشروع** (حقل قابل للتعديل من داخل منشئ العرض عبر زر إدراج سريع لأنواع شائعة: Villa, Apartment, Office, Retail, Facade, Compound, Medical Center, Landscape, Hotel, Restaurant, Majlis)، وبيانات التواصل + رابط بروفايل الشركة (`companyProfileUrl` من الإعدادات).
4. الطباعة تفتح في نافذة/تبويب منفصل (`window.open` + Blob URL) للحفاظ على ترميز UTF-8 العربي سليماً — عند التحويل لسيرفر حقيقي، يمكن الإبقاء على نفس آلية الطباعة من المتصفح (window.print) أو التحول لتوليد PDF من السيرفر (مثلاً عبر `dompdf` أو `mpdf` في PHP) — القرار يُترك حسب الأداء المطلوب، لكن **يجب** المحافظة على تطابق التخطيط بين EN و AR.

---

## 7. قواعد العمل المهمة (Business Rules)

- **الأهداف الشهرية:** Design = 22,000 AED، Supply = 65,000 AED (تُقارن بمجموع القيم الفعلية شهرياً في "Monthly Target Report" وفي Reports).
- **ضريبة القيمة المضافة:** نسبة افتراضية 5%، قابلة للتفعيل/الإلغاء لكل مستند.
- **تكلفة الاستيراد للموردين الخارجيين:** `importShippingPct` + `importCustomsPct` (كل منها 5% افتراضياً) تُضاف على تكلفة عناصر أي مورد `origin='Overseas'` عند احتساب عرض السعر للعميل — لكن أمر الشراء (PO) الفعلي للمورد يبقى بسعر EX Works الأساسي (لأن LAIL هي من تتكفل بالشحن والتخليص).
- **الأرباح والخسائر لكل مشروع:** `الربح = value − cost − shippingCost − مجموع project.expenses`.
- **تسلسل الأرقام:** كل نوع مستند له بادئة ورقم تسلسلي منفصل في `settings` (مثل `DQ-0001`, `SQ-0001`, `PO-0001`...) — يجب أن تكون الزيادة atomic على مستوى قاعدة البيانات (استخدام transaction عند الحجز لتفادي تكرار الرقم مع أكثر من مستخدم متزامن، وهو أمر لم يكن مطروحاً في localStorage لأنه لم يوجد فيه مستخدمين متزامنين).
- **قسم Reports معزول تماماً** عن باقي الأوضاع في التنقل — يقرأ البيانات من كل الجداول لكن لا يُدرَج ضمن Design أو Supply nav، وبياناته الخاصة بـ Design و Supply تبقى منفصلة تماماً بدون خلط (Design P&L لا يظهر ضمن Supply P&L والعكس).

---

## 8. ملاحظات الترحيل (Migration Notes)

- **الانتقال من single-user/localStorage إلى multi-user/MySQL** يستلزم إضافة: تسجيل دخول (users + password hashing)، صلاحيات بسيطة (كل الموظفين حالياً يدخلون كمستخدم واحد `Ahmad` — يمكن الإبقاء على مستخدم واحد فعلي في البداية والتوسع لاحقاً).
- **الملفات (الشعار/الختم/التوقيع/صور المنتجات/مرفقات الموظفين)** حالياً Base64 Data URLs مخزنة داخل JSON — يجب تحويلها لملفات فعلية على السيرفر (`/uploads/...`) مع الإبقاء على نفس تجربة الرفع (input type=file) في الواجهة.
- **دالة الأرقام التسلسلية القادمة (`nextXNumber`) في `settings`** يجب أن تُحدَّث ضمن نفس transaction الخاصة بإنشاء المستند لتفادي تعارض الأرقام عند تعدد المستخدمين.
- **نسخة تجريبية (Demo Data)** الحالية تُبنى من `RAW_ITEMS` و`RAW_CONTACTS` (بيانات مصنع افتراضية) — يمكن استخدامها كـ seed data أولي لقاعدة البيانات الجديدة.
- التصميم البصري (كل ملف CSS، الخطوط، الثيم الزجاجي) **ينتقل كما هو حرفياً** بدون أي تعديل — فقط طريقة جلب/حفظ البيانات هي التي تتغير من `localStorage` إلى نداءات API.

---

## 9. خارج نطاق هذا الترحيل (Non-goals)

- لا تغيير في التصميم البصري أو تجربة المستخدم الحالية.
- لا إضافة ميزات جديدة غير موجودة في v57 الحالية (هذا الملف فقط لنقل نفس النظام لسيرفر حقيقي، وليس لتطوير ميزات إضافية).
- ربط Google Drive الحقيقي غير مفعّل حالياً (تم استبداله بحقل رابط "Company Profile URL" يدوي في الإعدادات) — يبقى كذلك ما لم يُطلب غير ذلك صراحة.
