ثبت و مشاهده مشتری (CRM)
| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.29 |
| **آخرین بروزرسانی** | 2026-09-26 |
| **ماژول** | Customer & CRM |
| **مخاطب** | ادمین |
---
هدف
ثبت مشتری و پروفایل چندتبّی شبیه WHMCS: خلاصهٔ ۴ستونه، ویرایش، صورتحساب، تیکت، بانک مجازی، قراردادها، فعالیت، پیامها — **همتراز خلاصه مشتری نماینده**.
---
ثبت مشتری جدید
در تب **تماس** علاوه بر راههای تماس:
| گزینه | اثر |
|--------|------|
| **عدم ارسال ایمیل** | هیچ ایمیلی (سیستمی، دستی، بازیابی رمز) برای این مشتری ارسال نمیشود |
| **عدم ارسال پیامک** | هیچ پیامکی (سیستمی یا دستی) برای این مشتری ارسال نمیشود |
پس از ذخیره به **خلاصه مشتری** میروید و یک رکورد فعالیت ادمین ثبت میشود.
یکتایی مشتری (اجباری)
در سطح شرکت (`tenant`) مشتری تکراری پذیرفته نمیشود:
| نوع | چک یکتایی |
|-----|-----------|
| حقیقی | کد ملی · ایمیل · موبایل |
| حقوقی | شناسه ملی · ایمیل · موبایل |
| اتباع | شماره گذرنامه/شناسه اتباع · ایمیل · موبایل |
همین قوانین در ثبتنام پورتال، پنل ریسلر، و ویرایش پروفایل/مشتری اعمال میشود (`CustomerUniquenessGuard`).
ادغام مشتری تکراری (عملیات)
اگر از قبل دو حساب با هویت یکسان ساخته شده:
```bash
php artisan bss:merge-customers {survivor_id} {loser_id} --force --reason="توضیح"
```
حساب مقصد باقی میماند؛ سفارشها، فاکتورها، کیف پول، تیکت، لاگها و … به آن منتقل و حساب مبدأ حذف میشود.
---
تبهای رکورد مشتری
| تب | محتوا |
|----|--------|
| **خلاصه مشتری** | هاب ۴ستونه (هویت، فاکتور/بدهی، گردش، عملیات) + سرویس/افزونه با فیلتر وضعیت + تیکت/فاکتور؛ همهٔ باکسها باز/بسته میشوند |
| **صورتحسابها** | لیست فاکتورها با ستونهای تاریخ ایجاد، تاریخ پرداخت، نام کاربری/دامنه + لینک جزئیات |
| **تیکتها** | همه تیکتهای همین مشتری با لینک به جزئیات تیکت |
| **بانک مجازی** | موجودی کیف پول، تراکنشها، شارژ/برداشت دستی ادمین |
| **قراردادها** | لیست قراردادهای صادرشده — شماره، عنوان، سرویس، نام کاربری/دامنه، نوع، تاریخ ایجاد؛ مشاهده / چاپ / ویرایش / حذف (مثل نماینده) |
| **گزارش فعالیتها** | لاگ ادمین و مشتری (ورود پورتال، ویرایش، یادداشت، شارژ و …) |
| **پیامهای ارسالشده** | ایمیل و SMS از `notification_logs` |
Sub-navigation بهصورت **تب بالای صفحه** است (`SubNavigationPosition::Top`). ترتیب تبها عین نماینده است.
هاب خلاصه مشتری (۴ ستون)
بالای صفحه، چیدمان شبیه WHMCS:
| ستون | محتوا |
|------|--------|
| اطلاعات مشتری | هویت، تماس، فروشنده، زیرحسابها، **ورود بهعنوان مشتری**، **بازیابی رمز پورتال** |
| فاکتورها | شمارنده پرداختشده / نشده / معوق / لغو / پیشنویس / پیشفاکتور، مانده بانک مجازی، سقف اعتبار، **جمع بدهی** |
| گردش | شمارنده سرویس/تیکت، لینک همه تیکتها، آخرین ایمیلها |
| عملیات | فرم توکار تیکت، ایمیل، یادداشت داخلی، پیامک |
ثبت سفارش از این صفحه برای tenant نیست (فقط ریسلر / پورتال — ADR-035).
ستونهای هاب و جداول پایین با کلیک روی عنوان **باز/بسته** میشوند (پیشفرض باز).
ورود بهعنوان مشتری سشن staff را نگه میدارد و در پورتال بنر «بازگشت به پنل» نشان میدهد (ADR-050).
سرویسها و افزونهها (خلاصه مشتری)
| بخش | محتوا |
|-----|--------|
| **سرویسهای اصلی** | فقط اشتراکهای محصول اصلی؛ ستون **نام کاربری / دامنه** وسطچین (دامنه اگر پر باشد، وگرنه نام کاربری)؛ دوره با برچسب فارسی (`ماهانه` نه `monthly`)؛ فیلتر وضعیت Livewire؛ جستجو بر اساس شماره / محصول / نام کاربری یا دامنه؛ اکشن **مدیریت** با `x-bss.action` (همان نماینده؛ استایل Ops داخل Filament)؛ صفحهبندی ۱۰تایی |
| **افزونهها** | جدول جدا برای `addon_type=standalone` با همان فیلتر پویا و صفحهبندی ۱۰تایی |
| **تیکت / فاکتور** | تیکت: صفحهبندی ۱۰تایی. فاکتور: شماره، **تاریخ ایجاد**، **تاریخ پرداخت**، **نام کاربری / دامنه**، مبلغ، مانده، وضعیت |
گزینه قابل تنظیم هرگز بهعنوان سرویس مستقل در پورتال مشتری، ریسلر یا خلاصه مشتری لیست نمیشود — فقط در **جزئیات همان سرویس اصلی**.
عملیات روی خلاصه مشتری
| ویجت | رفتار |
|------|--------|
| **ویرایش مشتری** | لینک به صفحه ویرایش |
| **ورود بهعنوان مشتری** | ورود به `/portal` با کاربر پورتال (اگر فعال باشد) |
| **بازیابی رمز** | لینک بازیابی به ایمیل پورتال |
| **ثبت تیکت** | فرم توکار با **سرویس مرتبط اجباری** + موضوع / دسته / اولویت / متن؛ سلکتها یک فلش تکی دارند (نه تکرار Tailwind Forms) |
| **ارسال ایمیل** | فرم توکار موضوع + متن؛ گیرنده فقط ایمیل مشخصات مشتری (غیرقابل ویرایش) → `admin.custom_email` |
| **ارسال پیامک** | فرم توکار متن؛ شماره فقط موبایل مشخصات مشتری (غیرقابل ویرایش) → `admin.custom_sms` |
| **یادداشت داخلی** | ذخیره `customer_accounts.notes` |
تبهای بالا: خلاصه · صورتحسابها · تیکتها · بانک مجازی · قراردادها · گزارش فعالیتها · پیامهای ارسالشده.
ایمیل/SMS در `notification_logs` ثبت میشوند.
بانک مجازی
گزارش فعالیتها
جدول `customer_activity_logs`:
| actor_type | نمونه |
|------------|--------|
| `admin` | ویرایش مشتری، یادداشت، شارژ/برداشت کیف پول |
| `client` | ورود به پورتال |
| `system` | همگامسازی قیمت اشتراک با نرخ دلار (`subscription.unit_price_usd_sync`) و رویدادهای سیستمی دیگر |
از همین تب میتوان **یادداشت ادمین** ثبت کرد.
پیامهای ارسالشده
اگر Page Expired (419) دیدید: یکبار Hard Refresh / خروج و ورود مجدد؛ معمولاً بهخاطر نشست منقضی یا کش ویو با مالکیت اشتباه است.
---
جستجوی لیست مشتریان
کادر جستجوی بالای جدول CRM روی هویت، تماس، پورتال، نماینده و دامنه/یوزر سرویس کار میکند — جزئیات: [جستجوی مشتری](search-customers.md).
حذف موقت مشتری
از لیست (ردیف / دستهای) یا صفحهٔ **ویرایش**:
| شرط | رفتار |
|-----|--------|
| سرویس **فعال** یا **معلق** دارد | دکمه غیرفعال + tooltip دلیل؛ حذف مجاز نیست |
| ندارد | مودال هشدار: با حذف، سرویسها / سفارش / تیکت / صورتحساب هم به سطل میروند |
حذف اول **soft** است (سطل آشغال). حذف دائم فقط از سطل. جزئیات cascade: [trash-bin.md](trash-bin.md).
---