# تسک ۱۲: تکمیل منشی — محدودیت پنل + UI Permissions

## توضیح

Entity `DoctorSecretary` و API کامل موجود است (`src/Secretary/`). این تسک فقط دو چیز اضافه می‌کند:

1. Backend: بررسی سقف تعداد منشی بر اساس پنل اشتراکی
2. Frontend: Modal با checkbox matrix برای ویرایش permissions

**هیچ endpoint جدیدی ایجاد نمی‌شود.**

## فایل‌های موجود که تغییر می‌کنند

| فایل                                               | تغییر                                                              |
| -------------------------------------------------- | ------------------------------------------------------------------ |
| `src/Secretary/Controller/SecretaryController.php` | inject `SubscriptionService`، اضافه کردن limit check در `create()` |
| `assets/admin/pages/SecretariesPage.tsx`           | Modal ویرایش با checkbox matrix برای permissions                   |

## API موجود (بدون تغییر)

| متد    | مسیر                               | توضیح                                           |
| ------ | ---------------------------------- | ----------------------------------------------- |
| GET    | `/api/v1/secretaries/{doctorUuid}` | لیست منشی ها                                    |
| POST   | `/api/v1/secretary`                | ایجاد منشی ← **اینجا limit check اضافه می‌شود** |
| PATCH  | `/api/v1/secretary/{uuid}`         | ویرایش ← **permissions هم قابل ویرایش می‌شود**  |
| DELETE | `/api/v1/secretary/{uuid}`         | غیرفعال‌سازی (soft delete)                      |

## پیش‌نیازها

- تسک ۱۴ (Secretary — موجود در کد)
- **تسک ۱۱** (Subscription — `SubscriptionService` باید موجود باشد)

## زمان تخمینی

۴ تا ۵ ساعت

## تغییر Backend — SecretaryController::create()

### وضعیت فعلی (قبل):

```php
public function create(Request $request): JsonResponse
{
    // validate fields
    // create DoctorSecretary
    // persist
    return $this->success($secretary->toArray());
}
```

### وضعیت جدید (بعد):

```php
public function create(Request $request): JsonResponse
{
    // 1. پیدا کردن دکتر از doctorUuid در body
    $doctor = $this->doctorRepo->findByUuid($request->get('doctor_uuid'));

    // 2. بررسی سقف پنل
    $entityType = 'doctor';
    $entityId   = $doctor->getId();
    $limit   = $this->subscriptionService->getSecretaryLimit($entityType, $entityId);
    $current = $this->secretaryRepo->countActive($doctor->getId());
    if ($current >= $limit) {
        return $this->error(
            ErrorCodes::ERR_SECRETARY_LIMIT_REACHED,
            'سقف تعداد منشی پنل اشتراکی شما رسیده است',
            Response::HTTP_FORBIDDEN
        );
    }

    // 3. ادامه ایجاد منشی ...
}
```

### خطای جدید که باید در ErrorCodes.php اضافه شود:

```php
// src/Shared/Constant/ErrorCodes.php
const ERR_SECRETARY_LIMIT_REACHED = 'ERR_SECRETARY_LIMIT_REACHED';
// messages: 'سقف تعداد منشی پنل اشتراکی شما رسیده است'
```

## تغییر Frontend — SecretariesPage.tsx

### ساختار DEFAULT_PERMISSIONS (از DoctorSecretary::DEFAULT_PERMISSIONS):

```php
[
    'version'   => 1,
    'resources' => [
        'appointments' => ['view' => true,  'create' => true,  'cancel' => false, 'update_status' => true],
        'addresses'    => ['view' => true,  'create' => false, 'update' => false, 'delete' => false],
        'clinic_info'  => ['view' => true,  'update' => false],
        'insurances'   => ['view' => true,  'create' => false, 'update' => false, 'delete' => false],
    ],
]
```

### نمونه UI Permissions checkbox matrix در Modal:

```
┌─────────────────────────────────────────────────────┐
│  دسترسی‌های منشی                                    │
├──────────────┬───────┬────────┬────────┬────────────┤
│ بخش          │ مشاهده│ ایجاد  │ ویرایش │ حذف/لغو   │
├──────────────┼───────┼────────┼────────┼────────────┤
│ نوبت‌ها      │  ☑    │  ☑    │  ☑    │  ☐         │
│ آدرس‌ها      │  ☑    │  ☐    │  ☐    │  ☐         │
│ اطلاعات کلینیک│ ☑    │  -    │  ☐    │  -         │
│ بیمه‌ها      │  ☑    │  ☐    │  ☐    │  ☐         │
└──────────────┴───────┴────────┴────────┴────────────┘
```

### PATCH /api/v1/secretary/{uuid} با permissions:

```json
{
    "permissions": {
        "version": 1,
        "resources": {
            "appointments": {
                "view": true,
                "create": true,
                "cancel": true,
                "update_status": true
            },
            "addresses": {
                "view": true,
                "create": false,
                "update": false,
                "delete": false
            }
        }
    }
}
```

## کدهای خطای جدید

| کد                            | پیام فارسی                               |
| ----------------------------- | ---------------------------------------- |
| `ERR_SECRETARY_LIMIT_REACHED` | سقف تعداد منشی پنل اشتراکی شما رسیده است |

## Response خطا (403)

```json
{
    "success": false,
    "errors": [
        {
            "code": "ERR_SECRETARY_LIMIT_REACHED",
            "message": "سقف تعداد منشی پنل اشتراکی شما رسیده است. برای افزودن منشی بیشتر پنل را ارتقاء دهید."
        }
    ]
}
```
