ثبت و مشاهده مشتری (CRM)

← بازگشت به راهنما

ثبت و مشاهده مشتری (CRM)



| فیلد | مقدار |
|------|--------|
| **نسخه** | 1.29 |
| **آخرین بروزرسانی** | 2026-09-26 |
| **ماژول** | Customer & CRM |
| **مخاطب** | ادمین |

---

هدف



ثبت مشتری و پروفایل چندتبّی شبیه WHMCS: خلاصهٔ ۴ستونه، ویرایش، صورتحساب، تیکت، بانک مجازی، قراردادها، فعالیت، پیام‌ها — **هم‌تراز خلاصه مشتری نماینده**.

---

ثبت مشتری جدید



  • منوی **CRM → مشتریان → مشتری جدید**

  • تب‌های فرم: **اطلاعات هویتی** · **تماس** · **حساب** · **پورتال**


  • در تب **تماس** علاوه بر راه‌های تماس:

    | گزینه | اثر |
    |--------|------|
    | **عدم ارسال ایمیل** | هیچ ایمیلی (سیستمی، دستی، بازیابی رمز) برای این مشتری ارسال نمی‌شود |
    | **عدم ارسال پیامک** | هیچ پیامکی (سیستمی یا دستی) برای این مشتری ارسال نمی‌شود |

    پس از ذخیره به **خلاصه مشتری** می‌روید و یک رکورد فعالیت ادمین ثبت می‌شود.

    یکتایی مشتری (اجباری)



    در سطح شرکت (`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` ثبت می‌شوند.

    بانک مجازی



  • موجودی از `wallets` (همان کیف پول / بانک مجازی پورتال)

  • دکمه‌های **شارژ دستی** و **برداشت دستی**

  • درخواست‌های شارژ در انتظار در زیرعنوان دیده می‌شود


  • گزارش فعالیت‌ها



    جدول `customer_activity_logs`:

    | actor_type | نمونه |
    |------------|--------|
    | `admin` | ویرایش مشتری، یادداشت، شارژ/برداشت کیف پول |
    | `client` | ورود به پورتال |
    | `system` | همگام‌سازی قیمت اشتراک با نرخ دلار (`subscription.unit_price_usd_sync`) و رویدادهای سیستمی دیگر |

    از همین تب می‌توان **یادداشت ادمین** ثبت کرد.

    پیام‌های ارسال‌شده



  • منبع: `notification_logs` (ایمیل / SMS)

  • دکمه **نمایش**: مودال متن ساده (بدون رندر HTML خام در Livewire)

  • صفحه از `ManageRelatedRecords` جدا شده تا payload سنگین باعث Page Expired نشود

  • گیرنده با `@` رندر می‌شود تا تداخل Alpine با ایمیل پیش نیاید


  • اگر Page Expired (419) دیدید: یک‌بار Hard Refresh / خروج و ورود مجدد؛ معمولاً به‌خاطر نشست منقضی یا کش ویو با مالکیت اشتباه است.

    ---

    جستجوی لیست مشتریان



    کادر جستجوی بالای جدول CRM روی هویت، تماس، پورتال، نماینده و دامنه/یوزر سرویس کار می‌کند — جزئیات: [جستجوی مشتری](search-customers.md).

    حذف موقت مشتری



    از لیست (ردیف / دسته‌ای) یا صفحهٔ **ویرایش**:

    | شرط | رفتار |
    |-----|--------|
    | سرویس **فعال** یا **معلق** دارد | دکمه غیرفعال + tooltip دلیل؛ حذف مجاز نیست |
    | ندارد | مودال هشدار: با حذف، سرویس‌ها / سفارش / تیکت / صورتحساب هم به سطل می‌روند |

    حذف اول **soft** است (سطل آشغال). حذف دائم فقط از سطل. جزئیات cascade: [trash-bin.md](trash-bin.md).

    ---

    مرتبط



  • [جستجوی مشتری](search-customers.md)

  • [ثبت سفارش](create-order.md)

  • [تیکت پشتیبانی](support-tickets.md)

  • [اعلان‌ها](notifications.md)