# گزارش بازبینی و بازسازی داشبورد ERP — نسخه ۲
(ERP Dashboard Audit & Rebuild Report — v2, aligned with folad_fixed_xampp_v16 + 28july.sql)

## ناسازگاری‌های نسخه قبلی که برطرف شد

| # | مشکل | راه‌حل در v2 |
|---|------|--------------|
| 1 | نسخه v16 پلتفرم احراز هویت اجباری دارد (session + CSRF) ولی داشبورد قبلی بدون لاگین به API وصل می‌شد → خطای 401 | صفحه ورود کامل با `action=status/login/logout`، نگهداری CSRF و ارسال هدر `X-CSRF-Token` در همه نوشتن‌ها |
| 2 | فرمت API عوض شده: GET ردیف‌های decode شده برمی‌گرداند و POST خودِ رکورد را می‌گیرد (نه `{id,data_json}`) | لایه API داشبورد دقیقاً مطابق helper های v16 بازنویسی شد |
| 3 | نام فیلدها اشتباه بود (`unit`, `desc`, `city`) | مطابق دیتای واقعی: `unitPrice`, `description`, `location`, `settlement`, `commitment` + همه فیلدهای حمل (راننده، بارنامه، پلاک، مبدأ/مقصد، کرایه استعلامی/قطعی، باسکول، تناژ بارگیری) |
| 4 | وضعیت‌های ساختگی | وضعیت‌های واقعی پلتفرم: «در انتظار»، «در انتظار تسویه»، «تحویل داده شده»، «اعلام بار» + استخراج خودکار مراحل تایم‌لاین از همین فیلدها |
| 5 | ارزش قرارداد اشتباه محاسبه می‌شد | قیمت واحد بر حسب تومان/کیلوگرم است (تطبیق با market_prices) → ارزش = تناژ × ۱۰۰۰ × قیمت واحد؛ قراردادهای دلاری جدا نمایش داده می‌شوند |
| 6 | ماژول‌های موجود در پلتفرم دیده نمی‌شدند | اضافه شد: قراردادهای فروش (۱۰ رکورد شامل صادراتی دلاری)، اعلام بار (۲۷ رکورد)، نرخ دلار (۴۸ رکورد + نرخ منتخب ⭐)، نرخ حمل (۱۱۵ مسیر)، قیمت بازار (۲۲۹ رکورد)، کارمندان (۱۸ نفر در انتخاب مسئول مرحله) |
| 7 | دسترسی نقش‌محور نبود | مطابق سرور: admin/manager/user + آرایه access؛ مشاهده نیازمند `loading` یا `overview`، ویرایش تایم‌لاین نیازمند `loading` (کاربران فقط-مشاهده بنر قفل می‌بینند) |
| 8 | جدول‌های جدید در allowlist نبودند | `api.php` نسخه v16 در سه نقطه patch شد: allowlist، نگاشت ماژول (→loading)، و لیست خواندن overview |
| 9 | تاریخ میلادی قراردادهای صادراتی (2026/6/8) در محاسبه تأخیر خطا می‌داد | تشخیص خودکار جلالی/میلادی در تابع سن قرارداد |

## منطق استخراج خودکار تایم‌لاین (از دیتای واقعی)
- وجود قرارداد → ۶ مرحله اول (درخواست تا امضا) = تکمیل
- وضعیت «در انتظار» → پیش‌پرداخت در جریان؛ اگر بیش از ۱۴ روز از تاریخ قرارداد گذشته باشد → 🔴 تأخیر
- `driverName` → آماده بار تکمیل / بارگیری در جریان؛ `loaded` یا `loadQty` → بارگیری تکمیل
- «تحویل داده شده» یا آرشیو → تحویل تکمیل
- «در انتظار تسویه» → تسویه در جریان؛ بیش از ۳۰ روز → 🔴 تأخیر
- آرشیو (`archivedAt`) → تسویه و بستن قرارداد تکمیل
- هر مرحله با کلیک قابل ویرایش دستی است (وضعیت/مهلت/مسئول/یادداشت) و در جدول `purchase_timeline` ذخیره می‌شود؛ حالت «خودکار» آن را دوباره به داده پلتفرم برمی‌گرداند.

## اعتبارسنجی انجام‌شده روی دیتابیس واقعی (28july.sql)
- هر ۶۰ قرارداد خرید + ۱۰ فروش بدون خطا محاسبه شدند (۰ خطا، پیشرفت همیشه ۰–۱۰۰٪)
- توزیع وضعیت: ۲۲ «در انتظار تسویه»، ۳۸ «در تأخیر» (تسویه/پرداخت بیش از آستانه — قابل تنظیم در ثابت‌های DELAY_WAIT_DAYS و DELAY_SETTLE_DAYS)
- ارزش کل خرید: ~۳٬۹۲۰ میلیارد تومان
- ویرایش دستی مرحله + ذخیره/بازخوانی تست شد
- خروجی HTML: تگ‌ها متوازن، escape ورودی‌ها فعال (XSS-safe)

## نصب
1. `erp_dashboard.html` را کنار `folad_v15.6.html` در پوشه `folad_fixed_xampp` قرار دهید.
2. `api.php` این بسته را جایگزین نسخه فعلی کنید (فقط ۳ خط اضافه شده؛ هیچ رفتاری تغییر نکرده).
3. `migrate_erp_tables.sql` را در phpMyAdmin اجرا کنید.
4. با همان حساب‌های پلتفرم وارد شوید: `http://localhost/folad_fixed_xampp/erp_dashboard.html`

---
# بازبینی دور دوم — نسخه ۳

## ناسازگاری‌ها و کمبودهای اضافیِ کشف‌شده و رفع‌شده

| # | مشکل | راه‌حل در v3 |
|---|------|--------------|
| 10 | پلتفرم v16 کاملاً آفلاین است (فونت‌ها و xlsx در پوشه vendor) ولی داشبورد فونت را از Google CDN می‌گرفت → روی سرور بدون اینترنت فونت درست نمایش داده نمی‌شد | هر ۷ وزن فونت وزیرمتن از `vendor/vazirmatn` بارگذاری می‌شود؛ هیچ وابستگی اینترنتی باقی نمانده |
| 11 | ماژول «گزارش‌ها و هوش تجاری» (بند ۷ سند نیازمندی‌ها) وجود نداشت | صفحه BI با نمودارهای SVG کاملاً آفلاین: دونات توزیع وضعیت، ۱۰ تأمین‌کننده برتر، تناژ به تفکیک محصول، روند ۳۰ نرخ آخر دلار |
| 12 | تحلیل و مقایسه تأمین‌کنندگان (مرحله ۳ گردش کار خرید) نبود | جدول تحلیل تأمین‌کننده: تعداد قرارداد، تناژ، ارزش، تعداد تأخیر و سطح ریسک هر تأمین‌کننده |
| 13 | «سطح ریسک» و «اولویت» از شاخص‌های هوشمند (بند ۶) پیاده نشده بود | ریسک هر قرارداد از ترکیب تأخیر و ارزش (>۱۰۰ میلیارد تومان) محاسبه و در کارت، جزئیات و اکسل نمایش داده می‌شود |
| 14 | خروجی اکسل نبود (پلتفرم اصلی دارد) | دکمه «خروجی اکسل» روی تابلوی وضعیت با همان `vendor/xlsx` پلتفرم؛ اگر فایل vendor نبود، CSV با BOM فارسی‌ساز |
| 15 | جدول `warehouse` پلتفرم در داشبورد دیده نمی‌شد | تب «انبار» اضافه شد (اکنون خالی است؛ با اولین رکورد پلتفرم پر می‌شود) |

## اعتبارسنجی دور دوم (روی 28july.sql)
- ساختار HTML: ۱۲۲/۱۲۲ div و ۸/۸ section متوازن؛ صفر وابستگی CDN
- نمودارها با ۶۰ قرارداد واقعی + ۴۸ نرخ دلار واقعی رندر شدند (دونات/میله‌ای/خطی)
- سطوح ریسک روی داده واقعی: ۲ قرارداد «بالا»، مابقی متوسط/پایین
- خروجی اکسل: ۱۲ ستون شامل ریسک و پیشرفت، تست ساخت شیت انجام شد

---
# بازبینی دور سوم — نسخه ۴ (بر اساس سرور زنده)

بررسی نشان داد سرور زنده، پلتفرم کامل v15.6/v16 را روی ریشه cPanel اجرا می‌کند و ماژول‌هایی دارد که هنوز در لایه ERP دیده نمی‌شدند.

| # | یافته | راه‌حل در v4 |
|---|------|--------------|
| 16 | ماژول «اعلان قیمت» پلتفرم (۵۷ اعلان شامل اعلان‌های دلار) در ERP نبود | تب «تأمین و اعلان قیمت»: ۱۵ اعلان آخر با نوع، تغییر ▲▼ و زمان فارسی |
| 17 | قیمت‌های SCM/تأمین (۱۸۴ رکورد) نمایش داده نمی‌شد | جدول آخرین قیمت‌های تأمین (محصول/سایز/کارخانه/تغییر) در همان تب |
| 18 | ماژول «اهداف» پلتفرم در ERP نبود | تب «اهداف» با کارت پیشرفت هدف؛ حالت خالی راهنما (جدول اکنون خالی است) |
| 19 | مسیر یکپارچه به پلتفرم اصلی وجود نداشت | دکمه «ورود به فولاد پلتفرم ↗» در سایدبار (همان پوشه، همان نشست) |
| 20 | استقرار روی cPanel مستند نبود؛ سرور از سندباکس قابل تست مستقیم نیست | فایل DEPLOYMENT_CHECKLIST.md با مراحل دقیق cPanel + چک‌لیست تست دود ۷ موردی و نکته کوکی HTTPS |

## اعتبارسنجی دور سوم
- ساختار: ۱۴۱/۱۴۱ div، ۱۰/۱۰ section، تطابق ۱۴=۱۴ در بارگذاری موازی جدول‌ها
- رندر با داده واقعی: ۱۵ اعلان قیمت (شامل اعلان دلار)، ۱۵ قیمت SCM، حالت خالی اهداف
- همه قابلیت‌های v2/v3 حفظ شد (لاگین/CSRF/RBAC، تایم‌لاین، BI، اکسل، آفلاین)

---
# دور چهارم — نسخه ۵: بازیابی دسترسی + اتوماسیون اسناد

## ۱) بازیابی دسترسی مدیرعامل
دو روش (یکی کافی است):
- **restore_admin.sql** → اجرا در phpMyAdmin (هش bcrypt از قبل محاسبه شده)
- **restore_admin.php** → آپلود کنار api.php، باز کردن `/restore_admin.php?key=FaraRestore2026` و سپس **حذف فوری فایل**

| | |
|---|---|
| نام کاربری | `sarfrazian` |
| رمز عبور | `Sarfraz@Fara2026!CEO` |
| نقش | admin — دسترسی کامل به همه ماژول‌ها، مدیریت کاربران، گزارش‌ها و تنظیمات |

⚠️ پس از اولین ورود، رمز را از «پنل مدیریت کاربران» پلتفرم تغییر دهید.

## ۲) ماژول جدید: اسناد بازرگانی (documents.html)
- **۸ نوع سند**: Proforma Invoice، Commercial Invoice، Packing List، Purchase Order، Sales Order، Quotation، Delivery Note، Certificate of Origin — هرکدام با فیلدها و ستون‌های مخصوص خود (HS Code، وزن خالص/ناخالص، Incoterm، راننده/بارنامه، کشور مبدأ و …)
- **چندشرکتی**: انتخاب شرکت از یک لیست → سربرگ، لوگو، رنگ سازمانی، نشانی، بانک، شناسه مالیاتی، امضاکننده، مهر و پاورقی **به‌طور خودکار** درج می‌شود
- **صادراتی (سند کاملاً انگلیسی، LTR):** Farafoulad Bartar Co. · HST · Sarfraz Steel — ارز USD/EUR/AED
- **داخلی (سند کاملاً فارسی، RTL):** شرکت فرافولاد برتر پارسیان توس · هاشمی — تومان/ریال — و افزودن شرکت جدید با یک دکمه (معماری مقیاس‌پذیر)
- **قالب‌های مرکزی**: شروط استاندارد هر نوع سند (نسخه EN و FA) در یک‌جا نگهداری می‌شود؛ هر تغییر بلافاصله روی همه اسناد جدید اعمال می‌شود
- **شماره‌گذاری خودکار**: `FB-PI-2026-0001` (پیشوند شرکت + نوع + سال + شمارنده) — شمارنده‌ها در erp_settings
- **مبلغ به حروف** به انگلیسی و فارسی، جمع خودکار، تخفیف/مالیات/کرایه
- پیش‌نمایش زنده A4 + چاپ/PDF با CSS چاپ، آرشیو اسناد ذخیره‌شده با جستجو/بازکردن/حذف
- RBAC: صدور نیازمند دسترسی، مدیریت شرکت‌ها و قالب‌ها فقط admin — یعنی مناسب حساب مدیرعامل

## ۳) تغییرات زیرساخت
- api.php: جدول‌های `companies` و `documents` در هر ۳ نقطه (نگاشت ماژول، allowlist، فهرست overview)
- migrate_erp_tables.sql: ساخت دو جدول جدید؛ شرکت‌های پیش‌فرض در اولین ورودِ ادمین به‌صورت خودکار seed می‌شوند

## اعتبارسنجی دور چهارم
- هش bcrypt با password_verify راستی‌آزمایی شد (round-trip ✓)
- ۸ نوع سند × شروط EN/FA کامل؛ ۵ شرکت seed (۳ صادراتی EN + ۲ داخلی FA)
- تبدیل عدد به حروف: EN تا میلیارد و FA تست شد؛ شماره‌گذاری متوالی FB-PI-2026-0001/0002 ✓
- ساختار HTML: ۱۰۴/۱۰۴ div متوازن

---
# دور پنجم — نسخه ۶: CRM، بکاپ خودکار، همگام‌سازی محلی

## ماژول CRM و ارتباطات (crm.html)
- **مخاطبین**: مشتری/تأمین‌کننده، داخلی/بین‌المللی، برچسب‌گذاری و بخش‌بندی، کارشناس مسئول، جستجو و فیلتر
- **واتساپ‌محور**: دکمه گفتگو (wa.me) با قالب‌های پیام مرکزی دو‌زبانه ({name} خودکار — فارسی برای داخلی، انگلیسی برای بین‌المللی)، ثبت مکالمه در تاریخچه با یک کلیک، دفتر گروه‌های واتساپ (مشتری/تأمین‌کننده/تیم داخلی) با لینک ورود
- **تاریخچه کامل ارتباطات**: تایم‌لاین مکالمه/تماس/جلسه/یادداشت/وظیفه برای هر مخاطب
- **پیگیری و وظایف**: سررسید، هشدار سررسید گذشته، تیک انجام شد
- **پایپ‌لاین فروش**: ۶ مرحله (جدید → مذاکره → پیشنهاد → چانه‌زنی → برد/باخت) با ارزش، ارز، مسئول و پیگیری بعدی
- **اتصال به ERP**: پروفایل هر مخاطب قراردادهای خرید/فروش (تطبیق خودکار نام)، اسناد صادرشده (PI/فاکتور) و فرصت‌های او را نشان می‌دهد — تست واقعی: مخاطب «Azim» → قراردادهای S/405/00600 و S/405/00602

## زیرساخت (بخش ۲–۴ درخواست) — سند کامل: ARCHITECTURE.md
- بکاپ خودکار نسخه‌دار با SHA-256 روی هر تغییر + verify_backups.php + نگهداری/چرخش ۶۰ نسخه
- endpoint های sync_pull/sync_push با کلید مشترک (قبل از گیت نشست؛ کلید اشتباه → 403)
- sync_agent.php برای سرور محلی: دوطرفه، last-write-wins، tombstone حذف‌ها، پنجره همپوشانی، fallback بدون curl
- ۳ باگ واقعی در تست یکپارچه پیدا و رفع شد: (۱) جایگاه sync قبل از احراز نشست، (۲) clamp بازه TIMESTAMP، (۳) از‌قلم‌افتادن تغییرات هم‌ثانیه
- جدول‌های جدید: crm_contacts، crm_deals، crm_activities، sync_deletions (در migrate و allowlist)

---
# دور ششم — نسخه ۷: قابلیت‌های سازمانی (Enterprise)

## پیاده‌سازی‌شده در این نسخه
1. **🔍 جستجوی سراسری هوشمند (Ctrl+K)** — یک کادر مثل گوگل روی همه ماژول‌ها: قرارداد خرید/فروش، اعلام بار، انبار، مخاطبین CRM، فرصت‌ها، اسناد، کارکنان؛ کلیک روی نتیجه مستقیم به همان رکورد می‌رود (قرارداد → کارت جزئیات باز می‌شود)
2. **🔔 مرکز اعلان‌ها** — زنگ با شمارنده در نوار بالا: قراردادهای پرریسک، پیگیری‌های سررسیدگذشته CRM، اسناد در انتظار تأیید — کلیک = پرش به محل
3. **🛡️ لاگ کامل حسابرسی (Audit Log)** — هر ورود/ذخیره/حذف با کاربر، زمان، جدول، شناسه و IP ثبت می‌شود؛ **append-only حتی برای ادمین** (POST/DELETE مستقیم → 403)؛ نمای مخصوص ادمین در داشبورد با جستجو؛ خواندن برای غیرادمین 403؛ در sync و بکاپ هم منتقل می‌شود
4. **📨 گردش تأیید اسناد** — پیش‌نویس → ارسال برای تأیید → تأیید مدیر (نقش manager/admin) با ثبت تأییدکننده/زمان، نشان وضعیت در آرشیو و مهر «APPROVED / تأییدشده» روی نسخه چاپی؛ سند منتظر تأیید به اعلان‌های مدیر می‌رود
5. **📱 PWA — نصب روی موبایل** — manifest + آیکون + service worker (کش آفلاین پوسته و فونت‌ها؛ api.php همیشه از شبکه)؛ هر سه ماژول قابل نصب روی iOS/Android با آیکون اختصاصی

## تست زنده (MySQL واقعی)
- audit: ورود + ذخیره + حذف هر سه ثبت شدند با کاربر/IP ✓
- RBAC: نقش user → خواندن audit_log = 403 ✓ · admin → POST/DELETE audit_log = 403 (append-only) ✓ · نوشتن عادی جدول‌های دیگر سالم ✓ (باگ واقعی: گارد POST اول در بلاک اشتباه بود — پیدا و منتقل شد)
- approval: سند pending ذخیره/بازخوانی ✓ و در buildNotifs ظاهر می‌شود
- PWA: manifest/icon/sw هر سه 200 ✓
- ساختار HTML: dashboard ۱۶۰/۱۶۰ · documents ۱۰۵/۱۰۵ · crm ۱۱۷/۱۱۷ div متوازن ✓

## سند جدید: ENTERPRISE_ROADMAP.md
نگاشت صادقانه هر ۱۸ بند سند نیازمندی‌ها به: ✅ انجام‌شده / 🔨 قابل ساخت روی هاست فعلی / 🏗️ نیازمند VPS / 🔮 افق (شامل توضیح شفاف محدودیت WhatsApp Business API در ایران و مسیر عملی آن)
