=================================================================
پلتفرم فروشگاه‌ساز چندمستأجری (Multi-Tenant Shop Platform)
=================================================================

این پروژه، نسخه‌ی چندفروشگاهی (Multi-Tenant) نصاب فروشگاه اینترنتی
است. با یک نصب، مدیر پلتفرم می‌تواند به تعداد نامحدود فروشگاه بسازد
که هرکدام آدرس اختصاصی خودشان را به‌صورت ساب‌دامین دارند، مثلاً:

    https://username1.mydomain.ir
    https://username2.mydomain.ir
    https://username3.mydomain.ir

همه‌ی فروشگاه‌ها از یک نصب و یک پایگاه داده مشترک استفاده می‌کنند؛
نیازی به نصب جداگانه یا کپی کردن کد برای هر فروشگاه نیست.

-----------------------------------------------------------------
۱) نصب روی هاست
-----------------------------------------------------------------
۰. پیش از هر چیز، در بخش DNS دامنه (یا در cPanel) یک رکورد وایلدکارد
   بسازید تا همه‌ی زیردامنه‌ها به همین هاست اشاره کنند:

       *.mydomain.ir   ->   Wildcard Subdomain در cPanel که به همین
                             پوشه (public_html) اشاره می‌کند.

   اگر می‌خواهید فروشگاه‌ها روی HTTPS هم در دسترس باشند (که توصیه
   می‌شود)، به یک گواهی SSL وایلدکارد (*.mydomain.ir) نیاز دارید؛
   در بیشتر هاست‌های cPanel این گواهی از طریق AutoSSL یا Let's Encrypt
   (با DNS validation) به‌صورت رایگان قابل صدور است.

۱. تمام فایل‌ها را در ریشه‌ی دامنه (public_html) آپلود کنید.
۲. مطمئن شوید ماژول mod_rewrite در سرور فعال است (اکثر هاست‌های
   اشتراکی/cPanel این ماژول را به‌صورت پیش‌فرض فعال دارند).
۳. به آدرس زیر بروید و مراحل نصب را طی کنید:

       https://mydomain.ir/install/

   در این مرحله موارد زیر را وارد می‌کنید:
     - اطلاعات اتصال به پایگاه داده MySQL
     - آدرس کامل دامنه اصلی، بدون هیچ ساب‌دامینی (site_url)
       مثال درست:   https://mydomain.ir
       مثال نادرست: https://www.mydomain.ir یا https://user1.mydomain.ir
     - حساب «مدیر پلتفرم» (سوپر ادمین کل سیستم)
     - در صورت تمایل، چند فروشگاه نمونه (مثلاً username1, username2,
       username3) که به‌صورت خودکار همراه با یک حساب مدیر برای هرکدام
       ساخته می‌شوند و بلافاصله روی username1.mydomain.ir و... در
       دسترس خواهند بود.

۴. پس از پایان نصب، به دلایل امنیتی پوشه‌ی install/ را حذف یا
   تغییرنام دهید (یا حداقل فایل install/index.php را پاک کنید).

-----------------------------------------------------------------
۲) آدرس‌های مهم
-----------------------------------------------------------------
  فروشگاه هر مستأجر:        {نامک فروشگاه}.mydomain.ir
  ورود مشتری:                {نامک فروشگاه}.mydomain.ir/login.php
  ثبت‌نام مشتری:              {نامک فروشگاه}.mydomain.ir/register.php
  حساب کاربری مشتری:          {نامک فروشگاه}.mydomain.ir/account.php   (شامل تغییر رمز عبور)
  ورود مدیر فروشگاه:          {نامک فروشگاه}.mydomain.ir/admin/login.php
  تنظیمات فروشگاه (شامل تغییر رمز عبور مدیر فروشگاه):
                              {نامک فروشگاه}.mydomain.ir/admin/settings.php
  اتصال دامنه شخصی فروشگاه:   {نامک فروشگاه}.mydomain.ir/admin/custom_domain.php

  ورود مدیر پلتفرم (سوپر ادمین):   https://mydomain.ir/platform/login.php
  داشبورد پلتفرم:                  https://mydomain.ir/platform/index.php
  لیست و مدیریت فروشگاه‌ها:        https://mydomain.ir/platform/stores.php
  ساخت فروشگاه جدید:               https://mydomain.ir/platform/store_form.php
  مشاهده/مدیریت محصولات یک فروشگاه: https://mydomain.ir/platform/store_products.php?id=...
  تغییر رمز عبور مدیر پلتفرم:      https://mydomain.ir/platform/password.php
  قالب صفحه نخست پلتفرم:            https://mydomain.ir/platform/settings.php
  مدیریت IPهای مسدود:               https://mydomain.ir/platform/blocked_ips.php

  صفحه نخست پلتفرم (بدون نامک فروشگاه، فقط دامنه اصلی): https://mydomain.ir/
  ثبت‌نام عمومی فروشگاه جدید:            https://mydomain.ir/platform/register.php
  ورود سریع به یک فروشگاه با آدرس آن:     https://mydomain.ir/goto_store.php?slug={نامک}

  نکته: پنل «مدیر پلتفرم» (/platform) همیشه روی دامنه‌ی اصلی
  (mydomain.ir) است، نه روی ساب‌دامین هیچ فروشگاهی؛ و نامک هیچ
  فروشگاهی نمی‌تواند یکی از نام‌های رزروشده (مثل platform، admin،
  www، mail، cpanel و...) باشد.

-----------------------------------------------------------------
۳) امکانات پنل مدیریت پلتفرم (/platform)
-----------------------------------------------------------------
  - مشاهده‌ی آمار کلی پلتفرم (تعداد فروشگاه‌ها، سفارش‌ها، مشتریان و...)
  - افزودن فروشگاه جدید با یک کلیک (همراه با ساخت خودکار حساب مدیر
    آن فروشگاه)
  - ویرایش اطلاعات هر فروشگاه (نام، نامک آدرس، مالک، قالب، واحد پول)
  - فعال / غیرفعال کردن هر فروشگاه؛ فروشگاه غیرفعال، هم برای مشتریان
    و هم برای مدیر همان فروشگاه غیرقابل‌دسترس می‌شود (پیام مناسب
    نمایش داده می‌شود) تا زمانی که دوباره فعال شود.
  - مشاهده و مدیریت محصولات هر فروشگاه (فعال/غیرفعال یا حذف محصول)
    مستقیماً از پنل پلتفرم، بدون نیاز به ورود به پنل خود فروشگاه.
  - حذف کامل یک فروشگاه (همراه با تمام محصولات، سفارش‌ها و مشتریانش)
  - تغییر رمز عبور حساب مدیر پلتفرم
  - فعال‌سازی نهایی «دامنه شخصی» فروشگاه‌ها پس از تأیید DNS (بخش بعد)

-----------------------------------------------------------------
۳.۱) اتصال دامنه شخصی هر فروشگاه (Custom Domain) — جدید
-----------------------------------------------------------------
هر فروشگاه علاوه بر آدرس استاندارد خودش (مثلاً username1.mydomain.ir)
می‌تواند یک دامنه‌ی شخصی (مثلاً mostari-domain.ir) هم متصل کند تا
صاحب فروشگاه بتواند همان آدرس دلخواه خودش را در اختیار مشتریان و
دوستانش بگذارد، بدون این‌که آدرس استاندارد از کار بیفتد.

روند کار (چون این نسخه روی هاست اشتراکی cPanel معمولی اجرا می‌شود و
دسترسی WHM/روت برای افزودن خودکار دامنه به سرور وجود ندارد، بخشی از
این مراحل باید توسط مدیر پلتفرم به‌صورت دستی در cPanel انجام شود):

  ۱. صاحب فروشگاه از پنل خودش، مسیر «دامنه شخصی» (admin/custom_domain.php)
     دامنه‌ی موردنظرش را وارد و ذخیره می‌کند.
  ۲. همان صفحه یک راهنما نشان می‌دهد: باید یک رکورد A برای آن دامنه، به
     IP همین سرور اشاره کند (IP به‌صورت خودکار در همان صفحه نمایش
     داده می‌شود).
  ۳. صاحب فروشگاه پس از تنظیم DNS، دکمه «بررسی DNS» را می‌زند. سیستم با
     استفاده از dns_get_record بررسی می‌کند که آیا رکورد A واقعاً به
     IP سرور اشاره دارد یا نه. در صورت موفقیت:
       - custom_domain_verified = 1 می‌شود
       - یک پیام تلگرامی خودکار برای مدیر پلتفرم ارسال می‌شود
  ۴. مدیر پلتفرم (شما) باید یک‌بار برای این دامنه، به‌صورت دستی وارد
     cPanel شوید و از بخش Domains گزینه «Create A New Domain» (Addon
     Domain) را با همان نام دامنه بزنید، و مسیر ریشه (Document Root)
     آن را به همان پوشه‌ی public_html اصلیِ همین پروژه تنظیم کنید (نه
     یک زیرپوشه‌ی جدید). اگر می‌خواهید HTTPS هم روی این دامنه کار کند،
     باید برای همان دامنه هم یک گواهی SSL جداگانه (مثلاً از طریق
     AutoSSL) صادر شود.
  ۵. پس از انجام مرحله‌ی ۴، از پنل پلتفرم وارد صفحه‌ی ویرایش همان
     فروشگاه شوید (platform/store_form.php) و تیک «فعال‌سازی دامنه
     شخصی» را بزنید و فرم را ذخیره کنید. از این لحظه، دامنه‌ی شخصی
     فروشگاه به‌طور کامل فعال است و همه‌ی لینک‌های داخلی، فید محصولات،
     RSS و سایت‌مپ آن فروشگاه هم به‌جای ساب‌دامین، از همین دامنه شخصی
     استفاده می‌کنند.

نکات فنی:
  - جدول stores سه ستون جدید دارد: custom_domain، custom_domain_verified،
    custom_domain_active. این نسخه برای نصب تازه آماده شده و
    install/schema.sql از قبل شامل این ستون‌هاست؛ کار اضافه‌ای لازم نیست.
  - فعال‌شدن نهایی دامنه (custom_domain_active) فقط به دست مدیر پلتفرم
    ممکن است، نه صاحب فروشگاه؛ به همین دلیل تا وقتی مراحل هاستینگ واقعاً
    انجام نشده، دامنه هیچ اثری در دسترسی عمومی ندارد.
  - اگر بعداً به دسترسی WHM/روت روی این هاست دسترسی پیدا کردید، مرحله‌ی
    ۴ (افزودن Addon Domain) قابل خودکارسازی از طریق WHM API است؛ در
    نسخه فعلی (فقط cPanel معمولی) این مرحله دستی باقی مانده است.

-----------------------------------------------------------------
۴) صفحه نخست پلتفرم و قالب‌های آن (جدید)
-----------------------------------------------------------------
صفحه نخست دامنه اصلی (وقتی هیچ نامک فروشگاهی در آدرس نباشد) اکنون
دارای ۵ قالب آماده و زیبا است که از پنل مدیریت پلتفرم قابل انتخاب‌اند:

    /platform/settings.php   ->  انتخاب قالب صفحه نخست

قالب‌های موجود: «مینیمال بنفش»، «تجاری آبی»، «گرم نارنجی»،
«تیره مدرن» و «سبز طبیعی». هر قالب شامل موارد زیر است:

  - لینک «ورود به فروشگاه» (کادر ورود آدرس فروشگاه که کاربر را به
    فروشگاه خودش هدایت می‌کند)
  - لینک «ثبت فروشگاه جدید» (فرم ثبت‌نام عمومی فروشگاه)
  - بخش «۱۵ فروشگاه به‌روزشده اخیر»
  - بخش «۱۵ فروشگاه تازه ثبت‌نام‌شده»
  - بخش «محصولات تازه و به‌روزشده‌ی فروشگاه‌ها»

قالب‌های صفحه نخست در پوشه‌ی platform/themes/ptheme1 تا ptheme5
قرار دارند و کاملاً مستقل از قالب‌های داخل هر فروشگاه (themes/) هستند.

-----------------------------------------------------------------
۵) ثبت‌نام عمومی فروشگاه و محدودیت یک فروشگاه به ازای هر نفر (جدید)
-----------------------------------------------------------------
آدرس فرم ثبت‌نام عمومی: /platform/register.php

هرکسی می‌تواند از این صفحه، بدون نیاز به مدیر پلتفرم، فروشگاه خودش
را بسازد (آدرس فروشگاه، نام فروشگاه، اطلاعات مالک و حساب مدیر
فروشگاه را وارد می‌کند).

طبق درخواست، محدودیت زیر اعمال شده است:
  - هر آدرس اینترنتی (IP) فقط اجازه‌ی ثبت یک فروشگاه را دارد.
  - اگر همان IP دوباره تلاش کند فروشگاه دیگری ثبت کند، آن فروشگاه
    ساخته نمی‌شود و IP او به‌صورت خودکار در لیست IPهای مسدود پلتفرم
    قرار می‌گیرد.
  - IPهای مسدود، حتی امکان مشاهده‌ی فرم ثبت‌نام را هم ندارند.

مدیریت این محدودیت از پنل پلتفرم:

    /platform/blocked_ips.php

در این صفحه می‌توانید:
  - لیست کامل IPهای مسدود را ببینید (همراه با دلیل مسدودی و فروشگاه
    مرتبط در صورت وجود)
  - یک IP را دستی مسدود کنید
  - یک IP را از حالت مسدودی خارج کنید (رفع مسدودی)

-----------------------------------------------------------------
۶) سیستم معرف، تلگرام، تماس با مدیریت و IPهای مزاحم (جدید)
-----------------------------------------------------------------
فرم‌های ثبت‌نام فروشگاه (/platform/register.php) و ثبت‌نام مشتری
(register.php هر فروشگاه) اکنون شامل: نام و نام خانوادگی، شماره تلفن
همراه، ایمیل، آدرس، کد ملی، نام معرف و ایمیل معرف هستند.

  - معرفِ فروشگاه باید از قبل مالکِ یک فروشگاه دیگر در همین پلتفرم
    باشد (تطبیق دقیق نام + ایمیل).
  - معرفِ مشتری باید از قبل مشتری همان فروشگاه باشد.
  - اگر معرف خالی یا اشتباه وارد شود، ثبت‌نام رد می‌شود.
  - الزامی بودن معرف از پنل مدیریت (پلتفرم: /platform/settings.php،
    فروشگاه: admin/settings.php) قابل فعال/غیرفعال کردن است.

محدودیت یک ثبت‌نام به ازای هر IP:
  - هر IP فقط یک‌بار مجاز به ثبت فروشگاه در کل پلتفرم است.
  - هر IP فقط یک‌بار مجاز به ثبت‌نام مشتری در هر فروشگاه است.
  - تلاش دوم به‌طور خودکار آن IP را به مدت ۴۸ ساعت مسدود می‌کند.
  - مدیریت پلتفرم (/platform/blocked_ips.php) و مدیریت هر فروشگاه
    (admin/blocked_ips.php) می‌توانند این IPها را ببینند، دستی مسدود
    کنند یا مسدودی را زودتر رفع کنند.

فعال/غیرفعال کردن ثبت‌نام:
  - پلتفرم می‌تواند ثبت‌نام فروشگاه جدید را کلاً ببندد
    (/platform/settings.php).
  - هر فروشگاه می‌تواند ثبت‌نام مشتری جدید را کلاً ببندد
    (admin/settings.php).

کانال‌های تلگرام (سه دسته، تعداد نامحدود کانال در هر دسته):
  پلتفرم: /platform/telegram_channels.php   فروشگاه: admin/telegram_channels.php
    ۱) ثبت‌نام: با هر ثبت‌نام فروشگاه/مشتری جدید پیام می‌رود.
    ۲) عکس و متن: ابزار ارسال دستی (/platform یا admin/send_media.php)
       و برای فروشگاه، هنگام ثبت/ویرایش محصول هم خودکار ارسال می‌شود.
    ۳) تماس با مدیریت: با هر پیام فرم تماس، پیام می‌رود.

فرم تماس با مدیریت:
  - در صفحه نخست پلتفرم (هر ۵ قالب) و در فوتر هر فروشگاه
    (contact.php) موجود است.
  - پیام‌ها همزمان در دیتابیس ذخیره، به کانال‌های تلگرام مربوطه
    ارسال، و در پنل مدیریت (platform/contact_messages.php و
    admin/contact_messages.php) قابل مشاهده و حذف هستند.

ایجاد مستقیم مشتری توسط مدیر فروشگاه: admin/customer_form.php

-----------------------------------------------------------------
۷) نکات فنی مهم (پایه)
-----------------------------------------------------------------
  - همه‌ی فروشگاه‌ها روی یک پایگاه داده مشترک کار می‌کنند؛ جداکننده‌ی
    داده‌های هر فروشگاه، ستون store_id در جداول است.
  - آدرس‌دهی هر فروشگاه از طریق ساب‌دامین آن (هدر Host) در
    includes/functions.php تشخیص داده می‌شود؛ فایل .htaccess ریشه فقط
    درخواست‌ها را به فایل‌های واقعی PHP می‌رساند. نیازی به تغییر کد یا
    ساخت ساب‌دامین دستی در cPanel برای هر فروشگاه جدید نیست — چون
    یک ساب‌دامین وایلدکارد (*.mydomain.ir) از قبل همه را پوشش می‌دهد،
    فقط کافی است از پنل پلتفرم یک فروشگاه جدید بسازید.
  - نشست‌های (Session) مشتری و مدیر هر فروشگاه کاملاً مجزا از سایر
    فروشگاه‌ها هستند، حتی اگر همه روی یک مرورگر و یک دامنه باز شوند.
  - تصاویر آپلودی (uploads/) بین فروشگاه‌ها مشترک ذخیره می‌شوند ولی
    نام فایل‌ها به‌صورت یکتا تولید می‌شوند، بنابراین تداخلی رخ نمی‌دهد.
  - نامک فروشگاه هم‌زمان نام ساب‌دامین آن هم هست؛ اگرچه زیرخط (_) در
    نامک هنوز فنی مجاز است و در اغلب مرورگرها/سرورها کار می‌کند، طبق
    استاندارد نام‌گذاری دامنه (RFC 1123) بهتر است فقط از حروف، عدد و
    خط تیره (-) برای نامک‌های جدید استفاده شود تا از هرگونه ناسازگاری
    احتمالی با ابزارهای شخص ثالث (مثلاً برخی گواهی‌های SSL یا CDNها)
    جلوگیری شود.

-----------------------------------------------------------------
۸) به‌روزرسانی‌های تکمیلی (جدید)
-----------------------------------------------------------------
- نام پلتفرم (نمایش‌داده‌شده در صفحه نخست) و مدت مسدودسازی IP و
  مدت آزمایشی رایگان و پیام پایان آزمایشی، همگی از
  /platform/settings.php قابل ویرایش هستند.
- در صفحه نخست پلتفرم، لینک ورود مدیر حذف شد و به‌جای آن لینک/فرم
  «تماس با مدیریت پلتفرم» (دارای کپچا) در بالای صفحه قرار گرفت.
- شرایط و ضوابط: هم برای پلتفرم (/platform/terms.php، ویرایش از
  /platform/settings.php) و هم برای هر فروشگاه (terms.php، ویرایش از
  admin/settings.php).
- پیام از فروشگاه به پلتفرم: admin/message_platform.php برای ارسال؛
  /platform/store_messages.php برای مشاهده و حذف.
- همه پیام‌های تماس (پلتفرم، فروشگاه، فروشگاه‌به‌پلتفرم) اکنون لینک
  «مشاهده» دارند که پیام کامل را در یک صفحه جدا نشان می‌دهد.
- دو صفحه خبری پلتفرم: /platform/news.php (عمومی) و
  /platform/admins.php (ویژه مدیران فروشگاه‌ها)؛ از
  /platform/send_media.php هم‌زمان به تلگرام و این صفحات ارسال می‌شود.
- ارسال عکس/متن در پنل هر فروشگاه (admin/send_media.php) هم‌زمان به
  تلگرام و صفحه اصلی همان فروشگاه می‌رود؛ ثبت/ویرایش محصول هم به‌طور
  خودکار در صفحه اصلی فروشگاه و کانال تلگرام «عکس و متن» منعکس می‌شود.
- دوره آزمایشی رایگان فروشگاه: هر فروشگاه تازه‌ثبت‌شده فقط به مدت
  معین (پیش‌فرض ۱ ساعت، قابل تغییر در /platform/settings.php) فعال
  است؛ پس از آن به‌طور خودکار غیرفعال می‌شود و پیام تعریف‌شده توسط
  مدیر پلتفرم را نشان می‌دهد (نه مدیر و نه مشتری امکان ورود ندارند).
  از /platform/store_form.php می‌توان یک فروشگاه را «دائمی» (معاف از
  انقضا) کرد یا دوره آزمایشی آن را تمدید کرد.
- فایل‌های feed.php، rss.php، sitemap.xml و robots.txt برای کل
  پلتفرم (در ریشه) و هر فروشگاه (در آدرس همان فروشگاه) در دسترس‌اند.
- هنگام تمدید دوره فعالیت یک فروشگاه از /platform/store_form.php،
  می‌توان مدت زمان فعالیت جدید را دقیقاً بر حسب روز وارد کرد؛ در
  صورت خالی گذاشتن، از تنظیمات پیش‌فرض مدت آزمایشی پلتفرم استفاده
  می‌شود.
- در /platform/settings.php یک کلید برای فعال/غیرفعال کردن کلی
  استفاده از تلگرام در همه‌ی فروشگاه‌ها وجود دارد؛ در صورت غیرفعال
  بودن، هیچ پیام تلگرامی از هیچ فروشگاهی (ثبت‌نام مشتری، عکس و متن،
  تماس با مدیریت) ارسال نمی‌شود، ولی کانال‌های تلگرام خودِ پلتفرم
  همچنان کار می‌کنند.

-----------------------------------------------------------------
۹) پرداخت کارت‌به‌کارت مشتریان
-----------------------------------------------------------------
- مشتری در تسویه‌حساب می‌تواند «کارت به کارت» را انتخاب کند؛ شماره
  کارت فروشگاه (قابل تنظیم در admin/settings.php) نمایش داده می‌شود.
- مشتری از پنل کاربری خود (account.php) می‌تواند تصویر رسید پرداخت
  را برای همان سفارش ارسال کند (receipt_upload.php).
- مدیر فروشگاه از admin/receipts.php همه‌ی رسیدهای ارسالی مشتریان
  را می‌بیند و می‌تواند تأیید/رد/حذف کند.

-----------------------------------------------------------------
۱۰) پلن‌های اشتراک و تمدید دوره فعالیت فروشگاه
-----------------------------------------------------------------
- مدیریت پلتفرم از /platform/settings.php شماره کارت پلتفرم و قیمت
  چهار پلن (یک‌ماهه، سه‌ماهه، شش‌ماهه، یک‌ساله) را تعیین می‌کند.
- داشبورد پلتفرم (/platform/index.php) این قیمت‌ها را به‌صورت خلاصه
  نمایش می‌دهد، و همچنین جدولی از «مدت زمان انتخابی» هر فروشگاه به
  همراه لینک مشاهده‌ی رسید پرداخت آن‌ها را نشان می‌دهد.
- مدیر هر فروشگاه از admin/renew_subscription.php یکی از پلن‌ها را
  انتخاب، مبلغ را کارت‌به‌کارت واریز و رسید را ارسال می‌کند.
- مدیریت پلتفرم از /platform/subscription_requests.php درخواست‌ها
  را بررسی و تأیید/رد می‌کند؛ با تأیید، دوره فعالیت فروشگاه به‌اندازه‌ی
  مدت پلن (روی باقیمانده‌ی دوره‌ی فعلی، در صورت وجود) تمدید می‌شود.

-----------------------------------------------------------------
۱۱) کارت‌های بانکی چندگانه (به‌روزرسانی)
-----------------------------------------------------------------
- به‌جای یک شماره کارت ثابت، اکنون هر فروشگاه می‌تواند تعداد
  نامحدود کارت بانکی (شماره کارت + نام دارنده کارت + نام بانک) از
  admin/cards.php تعریف کند. همه‌ی این کارت‌ها در تسویه‌حساب مشتری
  نمایش داده می‌شوند.
- مدیریت پلتفرم هم از /platform/cards.php تعداد نامحدود کارت برای
  دریافت وجه اشتراک فروشگاه‌ها تعریف می‌کند.
- سقف تعداد کارت مجاز برای هر فروشگاه از /platform/settings.php
  تعیین می‌شود (عدد صفر = نامحدود). کارت‌های خودِ پلتفرم هیچ سقفی
  ندارند.

-----------------------------------------------------------------
۱۲) هزینه حمل و روش‌های ارسال
-----------------------------------------------------------------
- مدیریت پلتفرم از /platform/shipping_methods.php یک فهرست الگوی
  روش‌های ارسال (نام + هزینه پیش‌فرض) تعریف و فعال/غیرفعال می‌کند؛
  این الگوها هنگام افزودن روش ارسال جدید به مدیران فروشگاه‌ها
  پیشنهاد داده می‌شوند.
- هر فروشگاه از admin/shipping_methods.php روش‌های ارسال خودش
  (نام + هزینه) را ثبت، ویرایش، حذف و فعال/غیرفعال می‌کند.
- مشتری در تسویه‌حساب یکی از روش‌های ارسال فعالِ فروشگاه را انتخاب
  می‌کند؛ هزینه آن به‌طور خودکار به مبلغ نهایی سفارش اضافه می‌شود و
  در جزئیات سفارش (هم برای مشتری، هم برای مدیر فروشگاه) نمایش
  داده می‌شود.

-----------------------------------------------------------------
۱۳) پیش‌نیازهای سرور
-----------------------------------------------------------------
  - PHP نسخه ۷٫۴ به بالا (پیشنهادی: ۸٫۱ به بالا)
  - افزونه‌های PDO MySQL، GD، mbstring
  - پایگاه داده MySQL/MariaDB
  - ماژول mod_rewrite در Apache (برای آدرس‌دهی فروشگاه‌ها)
  - ماژول mod_headers در Apache (برای هدرهای امنیتی؛ اختیاری ولی
    توصیه‌شده — اکثر هاست‌های cPanel این ماژول را از قبل فعال دارند)

اگر بعد از نصب با خطای اتصال به دیتابیس مواجه شدید، فایل
includes/config.php را بررسی و اطلاعات آن را با اطلاعات واقعی
دیتابیس خود تطبیق دهید.

نکته: نشست‌های PHP (Session) در پوشه‌ی includes/sessions/ (داخل خودِ
پروژه) ذخیره می‌شوند، نه در مسیر پیش‌فرض سیستم. این کار عمداً انجام
شده چون در برخی هاست‌های اشتراکی، مسیر پیش‌فرض سشن به‌خاطر تنظیمات
open_basedir قابل‌نوشتن نیست و باعث بروز خطاهایی مثل «کد امنیتی
صحیح نیست» می‌شود (چون سشن اصلاً بین دو درخواست ذخیره نمی‌ماند).
اگر بعد از نصب باز هم چنین خطایی دیدید، مطمئن شوید پوشه‌ی
includes/sessions/ توسط هاست شما قابل‌نوشتن است (معمولاً مجوز ۷۵۵
کافی است).

-----------------------------------------------------------------
۱۴) تدابیر امنیتی این نسخه
-----------------------------------------------------------------
این نسخه با هدف مقاوم‌سازی در برابر تلاش مشتری‌ها یا صاحبان فروشگاه
برای وارد کردن کد مخرب یا نفوذ به برنامه، شامل تدابیر زیر است:

  - آپلود امنِ تصویر: هر آپلود (محصول، دسته‌بندی، بنر، لوگو، رسید
    پرداخت) علاوه بر بررسی پسوند نام فایل، محتوای واقعی فایل را هم
    با getimagesize() بررسی می‌کند تا فایل‌های غیرتصویری (مثل اسکریپت
    با پسوند جعلی .jpg) رد شوند. نام فایل ذخیره‌شده همیشه کاملاً
    تصادفی و توسط خود سرور تولید می‌شود، نه از روی نام فایل کاربر.
  - پوشه uploads/ یک .htaccess اختصاصی دارد که اجرای هرگونه اسکریپت
    (php و مشابه آن) را در این پوشه کاملاً مسدود می‌کند؛ حتی اگر یک
    فایل مخرب به هر دلیلی در این پوشه ذخیره شود، سرور آن را اجرا
    نخواهد کرد.
  - محافظت CSRF: تمام فرم‌ها (پنل مشتری، پنل فروشگاه، پنل پلتفرم) و
    تمام لینک‌های حساس (حذف، تغییر وضعیت، تأیید/رد) یک توکن یکتا و
    مخصوص هر نشست کاربر دارند؛ درخواست‌های بدون این توکن رد می‌شوند.
  - محدودیت تلاش ورود (Brute-force): بعد از چند تلاش ناموفق پیاپی
    برای ورود (مشتری، مدیر فروشگاه، یا مدیر پلتفرم) از یک IP، آن IP
    برای مدتی موقت از ورود بیشتر منع می‌شود.
  - جلوگیری از Session Fixation: بعد از هر ورود موفق، شناسه نشست
    (Session ID) دوباره تولید می‌شود.
  - جلوگیری از Open Redirect: پارامترهای ریدایرکت (مثلاً بعد از
    ورود) فقط در صورتی پذیرفته می‌شوند که یک مسیر داخلی امن باشند؛
    ریدایرکت به یک دامنه خارجی همیشه نادیده گرفته می‌شود.
  - همه‌ی کوئری‌های دیتابیس با Prepared Statement نوشته شده‌اند (ضد
    SQL Injection) و تمام خروجی‌های متنی قبل از نمایش escape می‌شوند
    (ضد XSS).
  - هر عملیات در پنل مدیر فروشگاه یا پنل پلتفرم، محدود به همان
    فروشگاه/دسترسی مربوطه است (ضد دسترسی غیرمجاز به داده فروشگاه‌های
    دیگر با دستکاری شناسه در آدرس).
  - رمزهای عبور با password_hash() (bcrypt) ذخیره می‌شوند، نه به‌صورت
    متنی یا با الگوریتم‌های ضعیف مثل md5.
  - هدرهای امنیتی HTTP (X-Frame-Options، X-Content-Type-Options،
    Referrer-Policy، Permissions-Policy) روی همه‌ی پاسخ‌های سایت
    فعال هستند.

نکته: هیچ سیستمی را نمی‌توان «۱۰۰٪ غیرقابل‌نفوذ» دانست. توصیه می‌شود
PHP، MySQL و افزونه‌های سرور را همیشه به‌روز نگه دارید، از رمز عبور
قوی برای پنل مدیر پلتفرم استفاده کنید، و به‌طور دوره‌ای از دیتابیس
و فایل‌های uploads/ نسخه پشتیبان تهیه کنید.
