diff --git a/src/Shared/Landing/LandingRegistry.php b/src/Shared/Landing/LandingRegistry.php index 64e6fde7..bb73c1ae 100644 --- a/src/Shared/Landing/LandingRegistry.php +++ b/src/Shared/Landing/LandingRegistry.php @@ -17,6 +17,14 @@ final class LandingRegistry public const FREE = 'نرم-افزار-رایگان-مدیریت-کلینیک'; public const OFFICE = 'نرم-افزار-مدیریت-مطب'; public const CRM = 'crm-کلینیک'; + public const CLINIC = 'نرم-افزار-مدیریت-کلینیک'; + public const BOOKING = 'نوبت-دهی-آنلاین'; + public const WEB_BASED = 'نرم-افزار-مطب-تحت-وب'; + public const DOWNLOAD = 'دانلود-نرم-افزار-مطب'; + public const PRICING = 'قیمت-نرم-افزار-مطب'; + public const COMPARISON = 'بهترین-نرم-افزار-مطب'; + public const ACCOUNTING = 'نرم-افزار-حسابداری-کلینیک'; + public const PSYCHOLOGY = 'نرم-افزار-مطب-روانشناسی'; /** @var array|null ساخت تنبل؛ هر درخواست حداکثر یک بار می‌سازدش. */ private ?array $pages = null; @@ -57,7 +65,7 @@ final class LandingRegistry ['q' => 'مصرف مواد را باید دستی ثبت کنم؟', 'a' => 'پرسنل هنگام ثبت انجام جلسه، کالای مصرف‌شده را انتخاب می‌کند و همان‌جا از انبار کم می‌شود.'], ['q' => 'برای شروع باید هزینه بدهم؟', 'a' => 'خیر. پلن رایگان برای شروع کافی است و بعداً هر وقت لازم شد ارتقا می‌دهی.'], ], - related: [self::POLYCLINIC, self::CRM, self::FREE], + related: [self::CLINIC, self::BOOKING, self::FREE], ), new LandingPage( slug: self::DENTAL, @@ -80,7 +88,7 @@ final class LandingRegistry ['q' => 'چند پزشک در یک کلینیک چطور مدیریت می‌شوند؟', 'a' => 'هر پزشک برنامهٔ هفتگی و سرویس‌های خودش را دارد ولی بیمار و پرونده و صندوق مشترک کلینیک است.'], ['q' => 'نصب لازم دارد؟', 'a' => 'خیر. کلینیک پرو تحت وب است و از مرورگر هر دستگاهی باز می‌شود.'], ], - related: [self::POLYCLINIC, self::OFFICE, self::FREE], + related: [self::CLINIC, self::OFFICE, self::PRICING], ), new LandingPage( slug: self::PHYSIOTHERAPY, @@ -103,7 +111,7 @@ final class LandingRegistry ['q' => 'می‌توانم چند تخت را با هم مدیریت کنم؟', 'a' => 'بله. هر تخت یک منبع است و چند تخت هم‌کار را می‌توان در یک استخر گذاشت.'], ['q' => 'پرسنل به اطلاعات مالی دسترسی دارند؟', 'a' => 'خیر. پنل پرسنل فقط جلسات خودش را نشان می‌دهد.'], ], - related: [self::POLYCLINIC, self::BEAUTY, self::FREE], + related: [self::CLINIC, self::BOOKING, self::ACCOUNTING], ), new LandingPage( slug: self::POLYCLINIC, @@ -126,7 +134,7 @@ final class LandingRegistry ['q' => 'تداخل اتاق و دستگاه چطور کنترل می‌شود؟', 'a' => 'با تعریف منبع. نوبت علاوه بر وقت پزشک، وقت منبع را هم اشغال می‌کند.'], ['q' => 'گزارش مالی تفکیک‌شده دارد؟', 'a' => 'بله، فهرست پرداخت‌ها با وضعیت تسویه و خلاصهٔ مجموع، پرداخت‌شده و تسویه‌نشده.'], ], - related: [self::DENTAL, self::PHYSIOTHERAPY, self::CRM], + related: [self::CLINIC, self::ACCOUNTING, self::DENTAL], ), new LandingPage( slug: self::FREE, @@ -149,7 +157,7 @@ final class LandingRegistry ['q' => 'بعداً می‌توانم ارتقا بدهم؟', 'a' => 'بله، هر زمان و بدون از دست رفتن داده.'], ['q' => 'برای شروع چه چیزی لازم است؟', 'a' => 'فقط یک شمارهٔ موبایل. ثبت‌نام چند دقیقه طول می‌کشد.'], ], - related: [self::OFFICE, self::BEAUTY, self::POLYCLINIC], + related: [self::DOWNLOAD, self::PRICING, self::OFFICE], ), new LandingPage( slug: self::OFFICE, @@ -172,7 +180,191 @@ final class LandingRegistry ['q' => 'اگر بعداً کلینیک بزنم چه می‌شود؟', 'a' => 'همان حساب می‌تواند هم مطب شخصی داشته باشد هم کلینیک، و بین دو محیط جابه‌جا می‌شوی.'], ['q' => 'هزینهٔ شروع چقدر است؟', 'a' => 'صفر. با پلن رایگان شروع کن و بعداً تصمیم بگیر.'], ], - related: [self::FREE, self::CRM, self::POLYCLINIC], + related: [self::BOOKING, self::WEB_BASED, self::COMPARISON], + ), + new LandingPage( + slug: self::CLINIC, + metaTitle: 'نرم‌افزار مدیریت کلینیک | کلینیک پرو', + metaDescription: 'نرم‌افزار مدیریت کلینیک چندپزشکه: نوبت‌دهی هر پزشک، پروندهٔ مشترک بیمار، صندوق و تسویهٔ سهم پزشکان، بیمه و مطالبات. تحت وب، بدون نصب، شروع رایگان.', + keywords: 'نرم افزار مدیریت کلینیک, نرم افزار کلینیک, سیستم مدیریت کلینیک, نرم افزار کلینیک چند پزشکه, مدیریت درمانگاه, نوبت دهی کلینیک', + h1: 'نرم‌افزار مدیریت کلینیک', + lead: 'کلینیک یعنی چند پزشک، چند منشی و یک صندوق. کلینیک پرو هر پزشک را با برنامهٔ خودش نگه می‌دارد، پروندهٔ بیمار را بین آن‌ها مشترک می‌کند، و در پایان ماه می‌گوید سهم هرکس چقدر است.', + features: [ + ['title' => 'هر پزشک، برنامهٔ خودش', 'body' => 'ساعت کاری، مدت ویزیت و تعطیلی هر پزشک جداست؛ ولی همه در یک تقویم کلینیک دیده می‌شوند و تداخل اتاق و دستگاه سرِ رزرو کشف می‌شود.'], + ['title' => 'پروندهٔ مشترک بیمار', 'body' => 'بیماری که امروز نزد یک پزشک و ماه بعد نزد پزشک دیگری می‌رود، یک پرونده دارد نه دو تا — با شمارهٔ پرونده‌ای که خود سیستم می‌دهد.'], + ['title' => 'صندوق و تسویهٔ سهم پزشک', 'body' => 'دریافت‌ها زیر یک صندوق جمع می‌شوند و سهم هر پزشک بر پایهٔ همان خدماتی که انجام داده حساب می‌شود.'], + ['title' => 'بیمه و مطالبات', 'body' => 'قرارداد هر بیمه با درصد پوشش هر نوع خدمت ثبت می‌شود؛ سهم بیمه از فاکتور کسر و مطالبه‌اش برای پیگیری ساخته می‌شود.'], + ['title' => 'منشی با دسترسی محدود', 'body' => 'برای هر منشی مشخص می‌کنی کدام پزشک و کدام کار مجاز است؛ بقیه برایش وجود ندارد.'], + ['title' => 'گزارش مدیریتی', 'body' => 'درآمد، تعداد مراجعه، نوبت‌های لغوشده و مانده‌حساب بیماران، به تفکیک پزشک.'], + ], + faq: [ + ['q' => 'چند پزشک می‌توانند در یک کلینیک باشند؟', 'a' => 'محدودیت از پلن اشتراک می‌آید نه از ساختار؛ کلینیک از ابتدا چندپزشکه طراحی شده است.'], + ['q' => 'پزشکی که مطب شخصی هم دارد چه می‌شود؟', 'a' => 'همان حساب هر دو محیط را دارد و بین «مطب شخصی» و «کلینیک» جابه‌جا می‌شود؛ داده‌ها با هم قاطی نمی‌شوند.'], + ['q' => 'تنظیمات بیمه برای هر پزشک جداست؟', 'a' => 'بله. قرارداد بیمه و قیمت ویزیت می‌تواند برای هر پزشک متفاوت باشد و اگر تعیین نشود، تنظیم کلینیک اعمال می‌شود.'], + ['q' => 'برای مهاجرت از سیستم فعلی باید چه کنم؟', 'a' => 'با پلن رایگان شروع کن و بیماران را به‌مرور وارد کن؛ نیازی به توقف کار کلینیک نیست.'], + ], + related: [self::POLYCLINIC, self::ACCOUNTING, self::OFFICE], + ), + new LandingPage( + slug: self::BOOKING, + metaTitle: 'نوبت‌دهی آنلاین مطب و کلینیک | کلینیک پرو', + metaDescription: 'سامانهٔ نوبت‌دهی آنلاین برای مطب و کلینیک: رزرو اینترنتی بیمار، تقویم پزشک، جلوگیری از تداخل، یادآوری پیامکی و بیعانه. بدون نصب، شروع رایگان.', + keywords: 'نوبت دهی آنلاین, نوبت دهی اینترنتی, سامانه نوبت دهی مطب, رزرو نوبت پزشک, نوبت دهی کلینیک, یادآوری پیامکی نوبت', + h1: 'نوبت‌دهی آنلاین مطب و کلینیک', + lead: 'تلفنی که مدام زنگ می‌خورد و دفتری که خط می‌خورد، ظرفیت مطب را پایین می‌آورد. با نوبت‌دهی آنلاین، بیمار خودش وقت خالی را می‌بیند و می‌گیرد — و تقویم پزشک همان لحظه به‌روز می‌شود.', + features: [ + ['title' => 'رزرو مستقیم بیمار', 'body' => 'بیمار از صفحهٔ پزشک وقت خالی را می‌بیند و رزرو می‌کند؛ نوبت بلافاصله روی تقویم پنل می‌نشیند.'], + ['title' => 'بدون تداخل', 'body' => 'یک بازه فقط یک بار قابل رزرو است؛ رزروهای موقتِ نیمه‌تمام هم بعد از مهلت آزاد می‌شوند تا صندلی بی‌دلیل قفل نماند.'], + ['title' => 'مدت بر اساس خدمت', 'body' => 'ویزیت ساده و خدمتی که یک ساعت طول می‌کشد یک اندازه جا نمی‌گیرند؛ طول نوبت از خودِ خدمت می‌آید.'], + ['title' => 'بیعانه', 'body' => 'برای کاهش نیامدن، می‌توانی رزرو را مشروط به پرداخت بیعانه کنی.'], + ['title' => 'یادآوری پیامکی', 'body' => 'پیامک یادآوری پیش از نوبت، خودکار ارسال می‌شود.'], + ['title' => 'لغو و جابه‌جایی', 'body' => 'لغو و جابه‌جایی با ثبت دلیل انجام می‌شود و بازهٔ آزادشده فوراً به بقیه پیشنهاد می‌شود.'], + ], + faq: [ + ['q' => 'بیمار برای گرفتن نوبت باید نرم‌افزار نصب کند؟', 'a' => 'خیر. از مرورگر موبایل یا کامپیوتر نوبت می‌گیرد.'], + ['q' => 'می‌توانم نوبت‌دهی اینترنتی را برای بعضی خدمات ببندم؟', 'a' => 'بله. خدمتی که نباید آنلاین رزرو شود، از حالت قابل‌رزرو خارج می‌شود و فقط سرِ پذیرش ثبت می‌شود.'], + ['q' => 'نوبت‌های تلفنی چه می‌شوند؟', 'a' => 'منشی همان‌ها را در پنل ثبت می‌کند و روی همان تقویم می‌نشینند؛ دو دفتر جدا وجود ندارد.'], + ['q' => 'اگر بیمار نیامد چه؟', 'a' => 'نوبت را «غیبت» ثبت می‌کنی؛ در گزارش‌ها دیده می‌شود و اگر دوره‌ای باشد، جلسه آزاد می‌شود.'], + ], + related: [self::OFFICE, self::CLINIC, self::CRM], + ), + new LandingPage( + slug: self::WEB_BASED, + metaTitle: 'نرم‌افزار مطب تحت وب و ابری بدون نصب | کلینیک پرو', + metaDescription: 'نرم‌افزار مطب تحت وب: بدون نصب و بدون سرور، با پشتیبان‌گیری خودکار، به‌روزرسانی بی‌وقفه و دسترسی از موبایل و کامپیوتر. شروع رایگان.', + keywords: 'نرم افزار مطب تحت وب, نرم افزار مطب ابری, نرم افزار مطب بدون نصب, نرم افزار کلینیک تحت وب, نرم افزار پزشکی آنلاین', + h1: 'نرم‌افزار مطب تحت وب، بدون نصب', + lead: 'نرم‌افزار نصبی یعنی یک کامپیوتر که همه‌چیز روی آن است: اگر خراب شود، بکاپ نگرفته باشی یا منشی از خانه لازمش داشته باشد، کار می‌خوابد. کلینیک پرو در مرورگر باز می‌شود و همین مسئله را حذف می‌کند.', + features: [ + ['title' => 'بدون نصب و بدون سرور', 'body' => 'نه ویندوز خاصی لازم است نه پایگاه‌داده‌ای که کسی باید نگهش دارد. با آدرس سایت وارد می‌شوی.'], + ['title' => 'پشتیبان‌گیری خودکار', 'body' => 'داده روی سرور نگهداری و پشتیبان‌گیری می‌شود؛ خرابی کامپیوتر مطب یعنی خرید یک کامپیوتر، نه از دست رفتن پرونده‌ها.'], + ['title' => 'به‌روزرسانی بی‌وقفه', 'body' => 'نسخهٔ جدید بدون نصب و بدون تعطیلی مطب می‌آید؛ همه همیشه روی یک نسخه‌اند.'], + ['title' => 'دسترسی از موبایل', 'body' => 'پزشک از گوشی برنامهٔ فردا را می‌بیند و منشی از خانه نوبت ثبت می‌کند.'], + ['title' => 'چند کاربر همزمان', 'body' => 'پزشک، منشی و صندوق هم‌زمان کار می‌کنند بی‌آنکه کسی منتظر آزادشدن فایل بماند.'], + ['title' => 'دسترسی کنترل‌شده', 'body' => 'هر نقش فقط همان چیزی را می‌بیند که مجازش کرده‌ای؛ روی نسخهٔ نصبیِ مشترک این تفکیک عملاً وجود ندارد.'], + ], + faq: [ + ['q' => 'اگر اینترنت قطع شود چه می‌شود؟', 'a' => 'برای کار به اینترنت نیاز است. در عوض دادهٔ مطب به یک کامپیوتر گره نخورده و از هر دستگاه دیگری در دسترس است.'], + ['q' => 'داده‌های ما کجا نگهداری می‌شود؟', 'a' => 'روی سرور کلینیک پرو، جدا برای هر محیط کاری، با پشتیبان‌گیری منظم.'], + ['q' => 'می‌توانم خروجی داده بگیرم؟', 'a' => 'بله، فهرست‌های اصلی پنل خروجی دارند.'], + ['q' => 'تفاوتش با نسخهٔ نصبی چیست؟', 'a' => 'نسخهٔ نصبی به یک دستگاه و یک نسخه گره خورده است؛ اینجا نصب، به‌روزرسانی و پشتیبان‌گیری از دوش مطب برداشته می‌شود.'], + ], + related: [self::DOWNLOAD, self::OFFICE, self::FREE], + ), + new LandingPage( + slug: self::DOWNLOAD, + metaTitle: 'دانلود نرم‌افزار مطب | نسخهٔ آنلاین کلینیک پرو', + metaDescription: 'به‌جای دانلود و نصب نرم‌افزار مطب، کلینیک پرو را در مرورگر باز کنید: بدون فایل نصب، بدون قفل سخت‌افزاری، با شروع رایگان و راه‌اندازی چنددقیقه‌ای.', + keywords: 'دانلود نرم افزار مطب, دانلود نرم افزار کلینیک, نرم افزار مطب رایگان, دمو نرم افزار مطب, نسخه آزمایشی نرم افزار مطب', + h1: 'دانلود نرم‌افزار مطب — یا اصلاً بدون دانلود', + lead: 'بیشتر کسانی که دنبال دانلود نرم‌افزار مطب‌اند، یک چیز می‌خواهند: بدون هزینه و بدون دردسر امتحانش کنند. کلینیک پرو همان را می‌دهد، فقط بدون فایل نصب: حساب می‌سازی و چند دقیقه بعد اولین نوبت را ثبت می‌کنی.', + features: [ + ['title' => 'بدون فایل نصب', 'body' => 'چیزی دانلود نمی‌کنی و نگران سازگاری با ویندوزت نیستی؛ در مرورگر باز می‌شود.'], + ['title' => 'بدون قفل سخت‌افزاری', 'body' => 'قفل USB و انتقالش بین کامپیوترها در کار نیست.'], + ['title' => 'شروع رایگان', 'body' => 'پلن رایگان برای امتحان‌کردن کافی است؛ لازم نیست اول پول بدهی تا ببینی به کارت می‌آید یا نه.'], + ['title' => 'راه‌اندازی چنددقیقه‌ای', 'body' => 'برنامهٔ کاری و خدمات را وارد می‌کنی و همان روز نوبت می‌گیری.'], + ['title' => 'همه‌جا در دسترس', 'body' => 'همان داده روی کامپیوتر مطب، لپ‌تاپ خانه و موبایل.'], + ['title' => 'به‌روزرسانی خودکار', 'body' => 'نسخهٔ جدید را نصب نمی‌کنی؛ خودش آمده است.'], + ], + faq: [ + ['q' => 'واقعاً نسخهٔ نصبی ندارید؟', 'a' => 'خیر. کلینیک پرو تحت وب است و همین باعث می‌شود پشتیبان‌گیری و به‌روزرسانی به عهدهٔ مطب نباشد.'], + ['q' => 'رایگان است؟', 'a' => 'پلن رایگان دارد. برای امکانات بیشتر پلن‌های پولی هست، ولی شروع هزینه‌ای ندارد.'], + ['q' => 'داده‌ای که وارد می‌کنم بعداً می‌ماند؟', 'a' => 'بله. همان حساب ادامه پیدا می‌کند و چیزی دوباره وارد نمی‌شود.'], + ['q' => 'برای کار کردن باید همیشه آنلاین باشم؟', 'a' => 'بله، مثل هر سامانهٔ تحت وب. در عوض داده به یک کامپیوتر خاص وابسته نیست.'], + ], + related: [self::WEB_BASED, self::FREE, self::PRICING], + ), + new LandingPage( + slug: self::PRICING, + metaTitle: 'قیمت نرم‌افزار مطب و کلینیک | کلینیک پرو', + metaDescription: 'قیمت نرم‌افزار مطب و کلینیک پرو: پلن رایگان برای شروع و پلن‌های اشتراکی برای مطب و کلینیک چندپزشکه، بدون هزینهٔ نصب و بدون قرارداد سالانهٔ اجباری.', + keywords: 'قیمت نرم افزار مطب, قیمت نرم افزار کلینیک, هزینه نرم افزار مطب, تعرفه نرم افزار پزشکی, اشتراک نرم افزار مطب', + h1: 'قیمت نرم‌افزار مطب و کلینیک', + lead: 'نرم‌افزار نصبی معمولاً یک مبلغ سنگین اولیه دارد، به‌علاوهٔ هزینهٔ نصب، شبکه و پشتیبانی سالانه. اینجا مدل ساده است: رایگان شروع می‌کنی و فقط وقتی پلن بالاتر می‌گیری که واقعاً به آن رسیده باشی.', + features: [ + ['title' => 'پلن رایگان', 'body' => 'برای مطب تازه‌راه‌افتاده یا امتحان‌کردن سامانه؛ بدون محدودیت زمانی.'], + ['title' => 'پلن‌های اشتراکی', 'body' => 'با بالا رفتن تعداد منشی، پزشک و امکانات موردنیاز، پلن بالاتر می‌گیری. پرداخت دوره‌ای است، نه خرید یک‌جای گران.'], + ['title' => 'بدون هزینهٔ نصب', 'body' => 'نه نصب و راه‌اندازی می‌خواهد نه سرور و شبکهٔ داخلی؛ این هزینه‌ها اصلاً ایجاد نمی‌شوند.'], + ['title' => 'بدون قفل سخت‌افزاری', 'body' => 'قفل گم‌شده یا خراب، هزینهٔ پنهانِ آشنای نسخه‌های نصبی است. اینجا وجود ندارد.'], + ['title' => 'هزینهٔ پیامک جدا و شفاف', 'body' => 'یادآوری پیامکی از کیف پول پیامک کم می‌شود و هر زمان بخواهی شارژ می‌کنی؛ چیزی از قبل تحمیل نمی‌شود.'], + ['title' => 'تغییر پلن هر زمان', 'body' => 'ارتقا یا تنزل پلن به تصمیم خودت است و داده‌ها سرِ جایشان می‌مانند.'], + ], + faq: [ + ['q' => 'پلن رایگان محدودیت زمانی دارد؟', 'a' => 'خیر. محدودیتش در امکانات و تعداد کاربر است، نه در مدت.'], + ['q' => 'قیمت دقیق پلن‌ها را کجا ببینم؟', 'a' => 'داخل پنل، بخش اشتراک، پلن‌های فعال با قیمت روز نمایش داده می‌شوند.'], + ['q' => 'هزینهٔ آموزش و راه‌اندازی چقدر است؟', 'a' => 'سامانه برای استفادهٔ مستقیم طراحی شده و راه‌اندازی هزینهٔ جداگانه‌ای ندارد.'], + ['q' => 'اگر اشتراک تمام شود داده‌ها پاک می‌شوند؟', 'a' => 'خیر. دسترسی به امکانات پلن محدود می‌شود، ولی پرونده‌ها می‌مانند.'], + ], + related: [self::FREE, self::DOWNLOAD, self::COMPARISON], + ), + new LandingPage( + slug: self::COMPARISON, + metaTitle: 'بهترین نرم‌افزار مطب را چطور انتخاب کنیم؟ | کلینیک پرو', + metaDescription: 'راهنمای انتخاب بهترین نرم‌افزار مطب: چه معیارهایی واقعاً مهم‌اند، تفاوت نسخهٔ نصبی و تحت وب، و چطور پیش از خرید سامانه را با دادهٔ واقعی مطب امتحان کنید.', + keywords: 'بهترین نرم افزار مطب, بهترین نرم افزار مدیریت کلینیک, مقایسه نرم افزار مطب, انتخاب نرم افزار پزشکی, معرفی نرم افزار مطب', + h1: 'بهترین نرم‌افزار مطب را چطور انتخاب کنیم؟', + lead: '«بهترین» بستگی دارد به اینکه مطب تو چه شکلی کار می‌کند. این فهرست، معیارهایی است که بعد از خرید تازه اهمیتشان معلوم می‌شود — بهتر است پیش از خرید بررسی‌شان کنی.', + features: [ + ['title' => 'با دادهٔ واقعی امتحان کن', 'body' => 'دموی ویدیویی چیزی را ثابت نمی‌کند. یک هفته نوبت واقعی ثبت کن و ببین سرِ شلوغی چه می‌شود.'], + ['title' => 'نصبی یا تحت وب', 'body' => 'نسخهٔ نصبی به یک کامپیوتر گره می‌خورد و پشتیبان‌گیری و به‌روزرسانی به عهدهٔ توست؛ تحت وب این‌ها را برمی‌دارد ولی به اینترنت وابسته است.'], + ['title' => 'دسترسی منشی', 'body' => 'اینکه بتوانی دقیقاً تعیین کنی منشی چه ببیند و چه نبیند، تفاوت جدی سامانه‌هاست.'], + ['title' => 'بیمه و مطالبات', 'body' => 'اگر با بیمه کار می‌کنی، ببین سهم بیمه از فاکتور کسر می‌شود و مطالبه‌اش قابل پیگیری است یا باید بیرون سیستم حساب کنی.'], + ['title' => 'دوره‌های چندجلسه‌ای', 'body' => 'برای کلینیک زیبایی و فیزیوتراپی، مدیریت دوره از مدیریت تک‌ویزیت مهم‌تر است.'], + ['title' => 'هزینهٔ واقعی', 'body' => 'قیمت اولیه همهٔ ماجرا نیست: نصب، شبکه، پشتیبانی سالانه و قفل سخت‌افزاری را هم حساب کن.'], + ], + faq: [ + ['q' => 'کلینیک پرو برای چه کسی مناسب‌تر است؟', 'a' => 'برای مطب و کلینیکی که کارش را در مرورگر می‌خواهد، چند کاربر دارد و با بیمه و دوره‌های درمانی سر و کار دارد.'], + ['q' => 'برای چه کسی مناسب نیست؟', 'a' => 'برای جایی که اینترنت پایدار ندارد، یا سامانهٔ بیمارستانی کامل با بخش بستری می‌خواهد.'], + ['q' => 'مهاجرت از نرم‌افزار فعلی سخت است؟', 'a' => 'می‌توانی موازی شروع کنی: نوبت‌های جدید را اینجا ثبت کن و پرونده‌های قدیمی را به‌مرور وارد کن.'], + ['q' => 'چطور مطمئن شوم مناسب است؟', 'a' => 'با پلن رایگان شروع کن؛ پیش از هر پرداختی جواب را می‌گیری.'], + ], + related: [self::PRICING, self::WEB_BASED, self::CLINIC], + ), + new LandingPage( + slug: self::ACCOUNTING, + metaTitle: 'نرم‌افزار حسابداری کلینیک و مطب | کلینیک پرو', + metaDescription: 'حسابداری کلینیک و مطب: صندوق روزانه، فاکتور و پرداخت جزئی، سهم پزشک، بدهی بیماران، سهم بیمه و مطالبات — همه روی همان پرونده‌ای که نوبت در آن ثبت شده.', + keywords: 'نرم افزار حسابداری کلینیک, حسابداری مطب, نرم افزار مالی پزشکی, سهم پزشک, صندوق کلینیک, مطالبات بیمه', + h1: 'حسابداری کلینیک و مطب', + lead: 'وقتی حساب‌وکتاب در دفتر و اکسل جدا می‌ماند، آخر ماه هیچ‌کس مطمئن نیست عدد درست است. اینجا هر دریافت به همان مراجعه‌ای وصل است که ثبتش کرده‌ای، پس گزارش از خودِ کار درمی‌آید نه از بازنویسی دستی.', + features: [ + ['title' => 'صندوق و پرداخت جزئی', 'body' => 'نقدی، کارت‌خوان و کارت‌به‌کارت؛ پرداخت جزئی و مانده‌حساب بیمار روی همان مراجعه ثبت می‌شود.'], + ['title' => 'فاکتور خودکار', 'body' => 'فاکتور از ویزیت و خدمات همان مراجعه ساخته می‌شود؛ نه فرم جدا، نه ورود دوباره.'], + ['title' => 'سهم بیمه', 'body' => 'با قرارداد بیمه و درصد پوشش هر نوع خدمت، سهم بیمه از فاکتور کسر می‌شود و آنچه می‌ماند سهم بیمار است.'], + ['title' => 'مطالبات بیمه', 'body' => 'برای سهم بیمه مطالبه ساخته می‌شود تا وضعیت ارسال و تسویه‌اش پیگیری شود.'], + ['title' => 'سهم پزشک', 'body' => 'سهم هر پزشک از خدمات انجام‌شده حساب می‌شود؛ تسویهٔ آخر ماه دیگر بحث ندارد.'], + ['title' => 'بدهکاران', 'body' => 'فهرست بیماران بدهکار با فیلتر مانده‌حساب، به‌جای گشتن در دفتر.'], + ], + faq: [ + ['q' => 'جایگزین نرم‌افزار حسابداری رسمی است؟', 'a' => 'خیر. حساب‌وکتاب عملیاتی کلینیک — دریافت‌ها، سهم بیمه، سهم پزشک و بدهی بیماران — را می‌دهد، نه دفاتر قانونی و اظهارنامه.'], + ['q' => 'تخفیف چطور ثبت می‌شود؟', 'a' => 'تخفیف دستی یا قانون تخفیف روی فاکتور اعمال و در گزارش‌ها جدا دیده می‌شود.'], + ['q' => 'اگر بیمه بعداً مبلغ کمتری تأیید کند؟', 'a' => 'مبلغ تأییدشده و پرداخت‌شدهٔ هر مطالبه جدا ثبت می‌شود، پس اختلاف پنهان نمی‌ماند.'], + ['q' => 'خروجی مالی می‌دهد؟', 'a' => 'گزارش‌های درآمد و فهرست‌های مالی در پنل قابل مشاهده و خروجی‌گیری‌اند.'], + ], + related: [self::CLINIC, self::POLYCLINIC, self::PRICING], + ), + new LandingPage( + slug: self::PSYCHOLOGY, + metaTitle: 'نرم‌افزار مطب روانشناسی و مرکز مشاوره | کلینیک پرو', + metaDescription: 'نرم‌افزار مطب روانشناسی و مرکز مشاوره: نوبت‌دهی جلسات، پروندهٔ محرمانهٔ مراجع، مدیریت جلسات دوره‌ای، صندوق و یادآوری پیامکی. تحت وب، شروع رایگان.', + keywords: 'نرم افزار مطب روانشناسی, نرم افزار مرکز مشاوره, نوبت دهی روانشناس, پرونده مراجع, مدیریت جلسات مشاوره', + h1: 'نرم‌افزار مطب روانشناسی و مرکز مشاوره', + lead: 'کار مشاوره جلسه‌ای است، نه ویزیت تک‌باره: همان مراجع هفتهٔ بعد هم می‌آید و باید معلوم باشد جلسهٔ چندم است و چقدر تسویه کرده. کلینیک پرو همین را نگه می‌دارد.', + features: [ + ['title' => 'جلسات پیاپی', 'body' => 'برای بسته‌های چندجلسه‌ای پروتکل تعریف می‌کنی؛ جلسات ساخته می‌شوند و پیشرفت هر مراجع معلوم است.'], + ['title' => 'پروندهٔ مراجع', 'body' => 'یادداشت هر جلسه، ضمیمه‌ها و سابقهٔ پرداخت زیر یک پرونده جمع می‌شود.'], + ['title' => 'دسترسی محدود منشی', 'body' => 'منشی می‌تواند نوبت بدهد و دریافت ثبت کند بدون آنکه یادداشت‌های جلسه را ببیند.'], + ['title' => 'تقویم چند مشاور', 'body' => 'مرکز مشاوره با چند روان‌شناس، هر کدام برنامهٔ خودش را دارد و اتاق‌ها تداخل نمی‌گیرند.'], + ['title' => 'یادآوری جلسه', 'body' => 'پیامک یادآوری، نیامدنِ جلسه‌ای را که هفته‌ها قبل رزرو شده کم می‌کند.'], + ['title' => 'صندوق و بدهی', 'body' => 'پرداخت جلسه‌به‌جلسه یا بسته‌ای، با مانده‌حساب مشخص.'], + ], + faq: [ + ['q' => 'یادداشت‌های جلسه محرمانه می‌ماند؟', 'a' => 'دسترسی هر نقش را خودت تعیین می‌کنی؛ می‌توانی ثبت نوبت و دریافت را به منشی بدهی و یادداشت‌ها را نه.'], + ['q' => 'برای مرکز چندمشاوره‌ای هم کار می‌کند؟', 'a' => 'بله. محیط کلینیک برای همین است: چند مشاور، تقویم جدا، صندوق مشترک.'], + ['q' => 'بسته‌های چندجلسه‌ای چطور مدیریت می‌شوند؟', 'a' => 'با همان سازوکار دورهٔ درمان: جلسات از ابتدا ساخته می‌شوند و هر بار جلسهٔ بعدی زمان می‌گیرد.'], + ['q' => 'جلسهٔ آنلاین را هم می‌شود ثبت کرد؟', 'a' => 'نوبت و پرداختش مثل جلسهٔ حضوری ثبت می‌شود؛ برگزاری تماس تصویری بیرون از سامانه است.'], + ], + related: [self::OFFICE, self::BOOKING, self::CRM], ), new LandingPage( slug: self::CRM, @@ -195,7 +387,7 @@ final class LandingRegistry ['q' => 'می‌توانم بیماران را دسته‌بندی کنم؟', 'a' => 'بله، با برچسب‌ها؛ و بعد بر اساس همان‌ها فیلتر و پیگیری کنی.'], ['q' => 'گزارش بازگشت مراجع دارد؟', 'a' => 'سابقهٔ مراجعهٔ هر بیمار و فهرست دوره‌های ناتمام، همان چیزی است که برای پیگیری بازگشت لازم داری.'], ], - related: [self::OFFICE, self::POLYCLINIC, self::BEAUTY], + related: [self::BOOKING, self::CLINIC, self::PSYCHOLOGY], ), ]; diff --git a/tests/Shared/LandingPageTest.php b/tests/Shared/LandingPageTest.php index 5dee75df..d87eb615 100644 --- a/tests/Shared/LandingPageTest.php +++ b/tests/Shared/LandingPageTest.php @@ -84,7 +84,9 @@ class LandingPageTest extends WebTestCase $xml = $this->html('/sitemap.xml'); $doc = new \SimpleXMLElement($xml); - self::assertCount(8, $doc->url, 'sitemap باید خانه و هفت لندینگ را داشته باشد'); + // خانه + هر صفحهٔ فرود. عدد از خودِ رجیستری می‌آید تا افزودن خوشهٔ کلیدواژهٔ + // تازه این تست را نشکند، ولی جاافتادن یک صفحه از sitemap هنوز قرمز شود. + self::assertCount(1 + count($this->registry->all()), $doc->url); foreach (array_keys($this->registry->all()) as $slug) { self::assertStringContainsString(rawurlencode($slug), $xml, "«{$slug}» در sitemap نیست"); diff --git a/tests/Shared/LandingRegistryTest.php b/tests/Shared/LandingRegistryTest.php index e9add881..6466db50 100644 --- a/tests/Shared/LandingRegistryTest.php +++ b/tests/Shared/LandingRegistryTest.php @@ -7,7 +7,7 @@ use App\Shared\Landing\LandingRegistry; use PHPUnit\Framework\TestCase; /** - * قواعدی که اگر بشکنند، هفت صفحهٔ فرود به‌جای کمک به رتبه، به هم آسیب می‌زنند: + * قواعدی که اگر بشکنند، صفحه‌های فرود به‌جای کمک به رتبه، به هم آسیب می‌زنند: * عنوان یا h1 تکراری یعنی محتوای تکراری، و توضیحات بیرون از بازهٔ استاندارد در * نتایج جستجو بریده می‌شود. */ @@ -24,9 +24,15 @@ class LandingRegistryTest extends TestCase { $slugs = array_keys($this->registry->all()); - self::assertCount(7, $slugs); - self::assertContains(LandingRegistry::BEAUTY, $slugs); - self::assertContains(LandingRegistry::CRM, $slugs); + // تعداد صفحه‌ها با هر خوشهٔ کلیدواژهٔ تازه بالا می‌رود، پس عدد ثابت اینجا فقط + // یک تستِ شکننده می‌سازد. آنچه باید ثابت بماند این است که هر ثابتِ کلاس + // واقعاً صفحه‌ای دارد — ثابتی که ساخته نشده باشد، لینک داخلیِ ۴۰۴ می‌سازد. + $constants = (new \ReflectionClass(LandingRegistry::class))->getConstants(); + + self::assertSame(count($constants), count($slugs)); + foreach ($constants as $name => $slug) { + self::assertContains($slug, $slugs, "ثابت {$name} صفحه‌ای ندارد"); + } } public function testUnknownSlugReturnsNull(): void @@ -47,8 +53,12 @@ class LandingRegistryTest extends TestCase $titles = array_map(static fn (LandingPage $p): string => $p->metaTitle, $this->registry->all()); $h1s = array_map(static fn (LandingPage $p): string => $p->h1, $this->registry->all()); - self::assertCount(7, array_unique($titles), 'عنوان تکراری یعنی محتوای تکراری'); - self::assertCount(7, array_unique($h1s), 'h1 تکراری یعنی محتوای تکراری'); + $descriptions = array_map(static fn (LandingPage $p): string => $p->metaDescription, $this->registry->all()); + + self::assertCount(count($titles), array_unique($titles), 'عنوان تکراری یعنی محتوای تکراری'); + self::assertCount(count($h1s), array_unique($h1s), 'h1 تکراری یعنی محتوای تکراری'); + // توضیحات تکراری همان پیام را می‌دهد: دو صفحه که یک چیز را می‌گویند. + self::assertCount(count($descriptions), array_unique($descriptions), 'توضیحات تکراری یعنی محتوای تکراری'); } /** توضیحات کوتاه‌تر از ۱۲۰ فرصت را هدر می‌دهد و بلندتر از ۱۷۰ در نتایج بریده می‌شود. */