# قرارداد فاز اجرایی اول بیوتی پل

این نسخه یک برنامه PHP 8.4 / Laravel 13 با رندر Blade است. نمونه HTML پیوست به عنوان مرجع بصری نگهداری می‌شود؛ پنل عملیاتی از پایگاه داده می‌خواند. PostgreSQL برای محیط عملیاتی و SQLite برای تست محلی انتخاب شده‌اند.

## فرض‌های اجرایی
- هر سالن Tenant مستقل است. tenant_id از عضویت مجاز و مسیر پنل یا از دامنه تأییدشده استخراج می‌شود؛ ورودی فرم قادر به تعیین مالک رکورد نیست.
- سه پلن پایه، رشد و حرفه‌ای در seed ساخته می‌شود. قیمت‌ها قابل ویرایش و به ریال ذخیره می‌شوند. انتخاب پلن توسط کاربر، درخواست اشتراک در انتظار پرداخت ایجاد می‌کند و بدون پرداخت، قابلیت‌ها را فعال نمی‌کند. مدیر کل می‌تواند با ثبت مرجع پرداخت دستی اشتراک را تأیید کند. اتصال درگاه بانکی مستقل، فاز بعد است.
- هر سالن یک تنظیم مستقل IPPanel دارد؛ تنظیم مرکزی صرفاً برای عملیات مرکزی/OTP است. در فقدان تنظیم سالن، پیام مشتری از حساب مرکزی ارسال نمی‌شود. توکن‌ها رمزنگاری می‌شوند.
- نگاشت دامنه پس از TXT مالکیت و DNS مقصد انجام می‌شود؛ فعال‌سازی HTTPS مرحله جداگانه مدیر زیرساخت است. بدون TLS تأییدشده دامنه در مسیریابی عمومی پذیرفته نمی‌شود.
- برنامه اندروید نخست پوسته WebView امن برای سایت واکنش‌گرای سالن است؛ اپلیکیشن native کامل و قابلیت آفلاین رزرو نیست. هر سالن شناسه بسته ثابت، کلید امضای ثابت، نسخه افزایشی و برند مستقل دارد. APK و AAB release در worker اختصاصی ساخته می‌شوند؛ تأیید مارکت تضمین نیست.
- زمان ذخیره UTC و نمایش Asia/Tehran/شمسی است. رابط و دارایی‌های مرورگر تماما محلی‌اند. تماس سرور با IPPanel و دریافت وابستگی‌ها هنگام build، CDN رابط محسوب نمی‌شود.

## قلمروها و مجوز
مدیر کل: سالن، پلن، تأیید اشتراک، پیامک مرکزی، تأیید TLS و مدیریت همکار مرکزی. کارکنان مرکزی دسترسی به داده مشتری سالن را به صورت ضمنی ندارند.
مالک سالن: تمام مجوزهای همان سالن. کارمند: فقط مجوزهای صریح عضویت. مشتری: پروفایل و رزرو خودش در سالن؛ فاقد دسترسی پنل مدیریت.
مجوزها: customers.view/manage، services.view/manage، staff.view/manage، bookings.view/manage، crm.view/manage، settings.manage، subscriptions.view، domains.manage، sms.manage، app.manage، cms.manage، finance.view.

## ساختار داده
User → Membership → Tenant → Subscription → Plan
Tenant → Customer → Appointment ← Service / Staff
Customer → LoyaltyEntry / CustomerNote / CrmTask
Appointment → SmsMessage (نسخه رزرو + زمان ارسال)
Tenant → Domain / SmsAccount / AppBranding → AppBuild
Tenant → Page / Product / Order / Invoice (توسعه مرحله بعد)
SmsAccount مرکزی با scope_key=platform؛ هر سالن با scope_key=tenant:{id}. ledger امتیاز و کلید اثر یکتا، مستقل از ledger مالی آینده است.

## قراردادهای HTTP
تمام عملیات نوشتن POST/PATCH با session و CSRF؛ پنل /panel/{tenant}؛ مدیریت /admin؛ سایت سالن /s/{slug} یا دامنه تأییدشده. پاسخ API در /panel/{tenant}/api/v1 برای داشبورد، مشتریان، نوبت‌ها، امتیاز و ساخت‌ها JSON است و همان middleware مجوز پنل را دارد. ورود کاربر سالن از مسیر مرکزی انجام می‌شود؛ cookie میان دامنه‌ها به اشتراک گذاشته نمی‌شود.

## معیارهای تحویل
تست جداسازی tenant و مجوز، هم‌پوشانی رزرو، ledger امتیاز یک‌باره و جلوگیری از مانده منفی، لغو یادآوری قدیمی، انتخاب حساب پیامک مستقل، تأیید مالکیت دامنه و پلن، اعتبارسنجی برند/شناسه APK، ممنوعیت دانلود ساخت سالن دیگر، رندر Blade و ثبت فرم‌ها. تست زنده پیامک فقط با حساب واقعی و رضایت ارسال؛ خروجی APK فقط با SDK/Gradle/JDK و کلید امضا معتبر.
