# اشتراک در پنل کارشناسان اشتراک کل تیکت و پیام‌های تکی در همان صف `/staff/?tab=shared` قرار دارند. هر تیکت یک ردیف دارد، حتی اگر چند پیام آن اشتراک گذاشته شده باشد. دکمه و قالب صندوق مستقل حذف شده‌اند؛ `/staff/shares/` و لینک قدیمی پیام به مسیر یکپارچه هدایت می‌شوند. ## مرز دسترسی `TicketPolicy.can_view` و مجوزهای سازمانی مشاهده کل مکاتبات تغییر نکرده‌اند. `MessageShare` مستقل از `TicketAccessGrant` است. دریافت‌کننده پیام، عنوان اصلی تیکت، شماره، وضعیت، اولویت، دسته، مالک، تاریخ‌ها، نام و شماره مشتری، استان و شهر و ستون‌های اطلاعات دو طرف را در همان قالب معمول staff می‌بیند. ردیف صف اشتراک‌ها و فیلترهای آن نیز از مشخصات عادی تیکت استفاده می‌کنند. اطلاعات مشتری و تیکت محدود نیستند؛ محدودیت فقط روی محتوای پیام‌های اشتراک‌گذاشته‌نشده و پیوست‌های آن‌هاست. جست‌وجوی متن، فقط پیام‌های اشتراکی مجاز را بررسی می‌کند. پیوست پیام از مسیر مخصوص همان اشتراک دریافت می‌شود؛ مسیر عمومی پیوست همچنان نیازمند دسترسی کل مکاتبات است. اگر کارشناس مجوز مستقلی برای کل تیکت داشته باشد، اشتراک یک پیام آن را محدود نمی‌کند. لغو اشتراک نیز مجوز مستقل را حذف نمی‌کند. حذف پیام یا لغو اشتراک، دسترسی بعدی را می‌بندد. polling محدود فقط از پیام‌ها و اشتراک‌های مجاز نسخه می‌سازد و هنگام لغو، نمای پیام‌ها را جایگزین می‌کند. فایل دانلودشده قابل پس‌گرفتن نیست؛ لینک امضاشده Nginx مطابق مهلت موجود تحویل فایل اعتبار دارد. ## قابلیت‌ها و رابط تمام کارشناسان دارای حساب و پروفایل فعال، بدون محدودیت نقش یا permission اشتراک/انتقال، می‌توانند روی تیکت‌های دارای دسترسی کامل، اشتراک پیام و کل تیکت، انتقال، تغییر وضعیت و اولویت انجام دهند. دسترسی محدود به یک پیام، مجوز عملیات روی کل پرونده ایجاد نمی‌کند. مجوز حذف دائمی، پاسخ، یادداشت، ارسال گروهی و دسترسی به مخاطبان مطابق سیاست‌های قبلی باقی می‌ماند. کنترل پیام فقط آیکون اشتراک است؛ گیرندگان، وضعیت مشاهده، لغو و سوابق در جزئیات جمع‌شونده همان پیام قرار دارند. دریافت‌کننده کنار پیام نام فرستنده اشتراک و زمان آن را ظریف می‌بیند؛ توضیح اختیاری با آیکون کوچک باز می‌شود. ## شمارنده و وضعیت مشاهده نشان نارنجی منوی «اشتراک‌ها» تعداد اشتراک‌های فعال خوانده‌نشده تیکت و پیام را نمایش می‌دهد. ورود به فهرست یا هدایت لینک قدیمی، مشاهده محسوب نمی‌شود. برای پیام، اسکریپت اختصاصی staff فقط شناسه پیام‌های داخل محدوده قابل مشاهده گفتگو را با POST و CSRF ارسال می‌کند؛ سرور دوباره مجوز را بررسی می‌کند. تأیید پیام دیگر یا شناسه نامعتبر، شمارنده را تغییر نمی‌دهد. پیام قدیمی تا هنگام نمایش در صفحه خوانده‌نشده می‌ماند. اعلان شمارنده در صفحات staff نیز دوره‌ای تازه می‌شود. اولین مشاهده پیام یک رویداد پایدار ایجاد می‌کند؛ تأییدهای دوره‌ای رویداد یا شمارنده مشاهده تکراری نمی‌سازند. مشاهده به معنای نمایش است، نه بررسی یا اقدام کارشناس. مشاهده کل تیکت، مانند قبل با بازشدن صفحه ثبت می‌شود. اعطای مجدد پس از لغو، سابقه مستقل دارد. ## دامنه و بررسی قالب‌های مشتری، `_messages.html`، کد ورود، مسیرهای عمومی پیوست و رفتار مشتری در JavaScript گفتگو تغییر نکرده‌اند. در `base.html` فقط شاخه staff توسعه یافته است. فایل‌های CSS و JavaScript جدید نسخه `static_asset_version` دارند. در JavaScript گفتگو دو شرط مخصوص پاسخ محدود staff، دکمه صفحه‌بندی قدیمی را تازه می‌کنند؛ شاخه مشتری تحت تأثیر نیست. schema شماره 0017 افزایشی است؛ برای این یکپارچه‌سازی migration تازه‌ای لازم نیست. تست‌های `test_staff_sharing.py`، `test_staff_inline_sharing.py` و `test_staff_shared_queue.py` جداسازی داده، شمارنده، لغو، پیوست و نقش‌ها را بررسی می‌کنند. سناریوی مرورگر در `tests/e2e/test_staff_sharing_e2e.py` دسکتاپ و موبایل را پوشش می‌دهد. مجموعه‌های pytest را به‌دلیل دیتابیس آزمایشی مشترک، هم‌زمان اجرا نکنید. از `.venv/Scripts/python.exe` در WSL استفاده کنید. صفحه staff به migrationهای `notifications.0015`، `notifications.0016` و `core.0008` نیز وابسته است؛ migration تیکت به‌تنهایی جدول اعلان‌ها را ایجاد نمی‌کند.