شتاب — سایت آگهی (PHP خام + MySQL)
==================================

نیازمندی‌ها: cPanel، PHP 8.1 یا 8.2 (7.4 به بالا هم کار می‌کند)، MySQL/MariaDB، افزونه‌های cURL، GD (ترجیحاً با WebP)، OpenSSL، mbstring.
(در پنل ادمین > تنظیمات پایین صفحه وضعیت افزونه‌ها نمایش داده می‌شود.)

نصب (گام‌به‌گام)
----------------
1) در cPanel > MySQL Databases یک دیتابیس و یک کاربر بسازید و کاربر را با همه‌ی دسترسی‌ها به دیتابیس وصل کنید.
2) در phpMyAdmin دیتابیس را انتخاب و فایل install.sql را Import کنید (جدول‌ها، تعرفه، کشور ایران + ۳۱ استان و مرکزشان و چند دسته‌ی نمونه ساخته می‌شود).
   ⚠ اگر نسخه‌ی قبلی را قبلاً نصب کرده‌اید: ساختار دیتابیس عوض شده؛ همه‌ی جدول‌های قبلی را در phpMyAdmin حذف (Select all ← Drop) و دوباره Import کنید (آگهی‌های آزمایشی پاک می‌شوند).
3) فایل inc/config.php را باز کنید و این‌ها را تنظیم کنید:
      BASE_URL   → آدرس سایت بدون اسلش آخر (فعلاً دامنه‌ی موقت؛ بعداً https://shetabe.ir)
      DB_NAME / DB_USER / DB_PASS
      CRON_KEY   → یک رشته‌ی تصادفی طولانی
      (کلید پیامک، شماره‌ی خط و کد دو پترن از قبل گذاشته شده است)
4) کل محتوای پوشه را در public_html (یا زیرپوشه‌ی دامنه) آپلود و Extract کنید.
5) دسترسی نوشتن: پوشه‌های uploads/ads ، uploads/permits ، uploads/receipts و logs باید قابل نوشتن باشند (معمولاً 755 کافی است؛ اگر آپلود عکس خطا داد 775).
6) فونت اختیاری: راهنما در assets/fonts/README.txt
7) کران‌جاب (cPanel > Cron Jobs) — هر ساعت یک‌بار:
      0 * * * *   /usr/local/bin/php /home/USERNAME/public_html/cron/run.php
   (مسیر php را در cPanel ببینید؛ یا: wget -q -O /dev/null "https://DOMAIN/cron/run.php?key=CRON_KEY")
   وظیفه‌ها: پیامک انقضا (همان روز انقضا) ، نردبان اتوماتیک (از ساعت ۹ صبح هر روز) ، پاک‌سازی.
8) ورود مدیریت: https://DOMAIN/admin/  نام‌کاربری admin و رمز admin123 (بلافاصله از بخش «مدیران» عوض کنید؛ چند مدیر هم می‌توانید بسازید).
9) تست‌ها (به‌ترتیب):
      • ادمین > تنظیمات > «آزمایش پیامک»
      • ثبت‌نام کاربر → ورود با کد ۷ رقمی
      • ثبت آگهی رایگان → ارسال مجوز → تأیید در ادمین → دیدن آگهی در صفحه‌ی اول
      • پرداخت با کارت‌به‌کارت و تأیید در ادمین > پرداخت‌ها
      • دانلود فاکتور PDF (اولین بار ظاهر فارسی PDF را حتماً بررسی کنید)
      • پرداخت آنلاین با مبلغ کم (بخش «درگاه» پایین را ببینید)

انتقال به shetabe.ir
--------------------
• فقط BASE_URL در inc/config.php را عوض کنید (sitemap، لینک پیامک و فاکتور از همین ساخته می‌شوند).
• ترمینال سداد معمولاً برای دامنه‌ی مشخصی ثبت می‌شود؛ تا زمانی که روی دامنه‌ی دیگری هستید ممکن است بانک پرداخت آنلاین را رد کند. اگر لازم شد از بانک/PSP بخواهید دامنه (و در صورت نیاز IP هاست) را اضافه کنند. تا آن موقع کارت‌به‌کارت کار می‌کند.
• SSL (https) برای درگاه و کوکی‌ها لازم است.
• بعد از انتقال، در Google Search Console آدرس https://shetabe.ir/sitemap.xml را ثبت کنید.

ساختار صفحات
------------
index.php صفحه‌ی اول و جستجو | ad.php صفحه‌ی آگهی (/ad/کد-عنوان) | post.php ثبت آگهی | invoice.php فاکتور و پرداخت
panel/ پنل کاربر | admin/ پنل ادمین | cron/run.php کران‌جاب | sitemap.xml و robots.txt خودکار (پویا)
content/header.html ، footer.html ، rules.html: متن‌هایی که با ویرایش این فایل‌ها روی هاست در سایت نمایش داده می‌شوند (HTML آزاد؛ خالی = نمایش داده نمی‌شود)
assets/img/logo-text.svg (لوگوی متنی هدر) | logo.jpg (لوگوی گرد: ورود/ثبت‌نام/فاکتور) | stamp.jpg (مهر/امضا) | favicon.ico و icon-*.png

فایل مخفی ثبت آگهی بدون پرداخت
------------------------------
x-add-7f3k9q.php (نامش را عوض کنید؛ ترجیحاً غیرقابل‌حدس). هیچ لینکی از سایت به آن نیست و در robots.txt هم ذکر نشده (تا آدرسش لو نرود)؛
با noindex محافظت شده است. ورود با نام‌کاربری/رمز ادمین. آگهی را برای موبایل مالک می‌سازد (اگر کاربر نبود، می‌سازد و رمز را پیامک می‌کند)
و با وضعیت «نیاز به پرداخت» به همراه فاکتور یکساله در پنل کاربر نمایش می‌دهد. اگر نام فایل را عوض کردید، HIDDEN_ADD_FILE در config.php فقط یادداشت است.

قوانین و رفتارهای پیاده‌سازی‌شده (خلاصه)
----------------------------------------
• ثبت‌نام: کد ۷ رقمی پیامکی = رمز دائمی. ورود با موبایل+رمز. «فراموشی رمز» کد ۷ رقمی جدید می‌فرستد و رمز قبلی باطل می‌شود. محدودیت تعداد تلاش و پیامک اعمال شده است.
• آگهی جدید و هر ویرایشی → «نیاز به تایید»؛ تا تأیید ادمین نمایش داده نمی‌شود. مجوز اجباری نیست (۸۰٪ آگهی‌ها مجوز نمی‌خواهند)؛ ادمین دستی «درخواست مجوز» می‌زند.
• یک‌ماه رایگان فقط هنگام ثبت آگهی (یک‌بار برای هر آگهی)؛ پس از آن فقط بسته‌ی یکساله پولی. تعداد آگهی هر کاربر محدود نیست.
• شروع اعتبار (۳۰ یا ۳۶۵ روز) و خدمات جانبی از لحظه‌ی «انتشار/تأیید» محاسبه می‌شود (نه از لحظه‌ی ثبت).
• مدت خدمات (قابل ویرایش در ادمین > تعرفه): ویژه/رنگی/فوری ۳۰ روز؛ نردبان اتوماتیک ۳۶۵ روز؛ بقیه بدون انقضای جدا.
• ویژه: همیشه بالای نتایج. رنگی: زمینه‌ی زرد کارت. فوری: برچسب قرمز «فوری». لینک‌ها: هر خط یک لینک خارجی با nofollow.
• آگهی منقضی حذف نمی‌شود: هشدار قرمز + ستاره‌دار شدن شماره‌ی تماس؛ ویرایش/نردبان غیرفعال؛ فقط مجوز، تمدید یکساله، فاکتور، پرداخت و حذف فعال می‌ماند.
• عکس‌ها: اصل ذخیره نمی‌شود؛ فقط دو نسخه (حداکثر ۶۰۰ پیکسل عرض و ۲۰۰×۲۰۰) با فرمت WebP (در نبود WebP روی هاست، JPEG).
  تصویر مجوز/فیش در پوشه‌ی محافظت‌شده (فقط مالک و ادمین) و تا ۱۴۰۰ پیکسل.
• تعرفه‌ها به «تومان» ذخیره می‌شوند؛ روی فاکتور PDF و درگاه ×۱۰ به ریال می‌روند.
• رنگ نویسنده در ادمین: سبز = ثبت از پنل کاربر ، قرمز = ثبت از صفحه‌ی اول (یا فایل مخفی).
• سئو: عنوان/توضیح متا، canonical، OpenGraph، اسکیمای Product/Offer و BreadcrumbList، sitemap.xml (فهرست + بخش‌های ۲۰۰۰تایی با lastmod دقیق که با نردبان به‌روز می‌شود)، robots.txt، لینک کوتاه /?p=کد با ریدایرکت ۳۰۱.
  نکته: گوگل از سال ۲۰۲۳ سرویس «ping» نقشه‌ی سایت را برچسب خارج‌شده کرده است؛ برای همین فقط sitemap + robots + Search Console استفاده می‌شود.
• امنیت: رمزها هش‌شده، CSRF روی همه‌ی فرم‌ها، پرس‌وجوهای آماده (Prepared)، محدودیت تلاش ورود، بررسی نوع و محتوای تصاویر، جلوگیری از اجرای PHP در پوشه‌ی آپلود، دسترسی ممنوع به inc/ lib/ logs/ و فایل‌های خصوصی.

درگاه پرداخت (سداد)
-------------------
مقادیر پذیرنده/ترمینال/کلید از ادمین > تنظیمات قابل تغییرند (کلید ماسک‌شده نمایش داده می‌شود). جریان: درخواست توکن → انتقال به بانک → بازگشت به pay_verify.php → تأیید (Verify) → اعمال خدمات.
مبلغ از دیتابیس خوانده می‌شود، تأیید دوباره‌ی یک تراکنش اثر دوباره ندارد و پاسخ خام بانک در جدول pay_attempts ذخیره می‌شود.
این بخش را نمی‌توان بدون ارتباط واقعی با بانک تست کرد؛ اولین تست را با مبلغ کم انجام دهید.

فرض‌هایی که من گذاشته‌ام (اگر خلافش را می‌خواهید بگویید)
------------------------------------------------------
• مقادیر اولیه‌ی تعرفه همان نمونه‌های ویدیو است (یکساله ۲۰۰ تومان، بقیه ۱۰ تومان) — از ادمین > تعرفه عوض کنید.
• «لینک‌ها»: هر خط لینک یک واحد (حداکثر ۱۰). «تصاویر»: از تصویر دوم به بعد هر عدد طبق تعرفه. «اتصال دامنه»، «تبلیغ در سایت‌های دیگر» و «تقویت سئو» فقط ثبت می‌شوند و در ادمین دیده می‌شوند (اتصال واقعی دامنه ساخته نشده).
• پیامک تمدید دستی از ادمین > تمدید: حداکثر ۵۰ کاربر تصادفی دارای آگهی منقضی (کسی که در ۷ روز اخیر پیامک گرفته تکرار نمی‌شود).
• «آگهی‌های بدون بازدید» = بیش از یک سال از ثبت و بازدید کمتر از ۱۰۰ (قابل تغییر در همان صفحه) با حذف گروهی.
• پس از ثبت‌نام، شماره‌ی تماس آگهی به‌طور پیش‌فرض همان موبایل کاربر است و قابل تغییر است.


تغییرات نسخه ۲ (طبق درخواست‌های اخیر)
-------------------------------------
وضعیت آگهی (فقط یکی): نیاز به تایید | نیاز به تمدید | نیاز به مجوز | نیاز به پرداخت | فعال | غیرفعال | حذف
• فرمول‌های خودکار (فقط در رویدادها): آگهی جدید ← نیاز به تایید (اگر هزینه دارد ← نیاز به پرداخت) | پرداخت تأیید شد ← نیاز به تایید | ویرایش کاربر ← نیاز به تایید |
  ادمین «درخواست مجوز» ← نیاز به مجوز (در سایت نمایش داده نمی‌شود) و با ارسال مجوز کاربر ← نیاز به تایید | پایان تاریخ انقضا (کران ساعتی) ← نیاز به تمدید | تمدید پرداخت‌شده ← فعال.
• انتقال دستی ادمین: در لیست آگهی‌ها ستون «انتقال دستی» (و در صفحه‌ی ویرایش آگهی) هر آگهی را به هر وضعیتی می‌برد. آگهیِ دستی «فعال»‌شده با گذشتن انقضا
  خودکار به «نیاز به تمدید» برنمی‌گردد و پیامک انقضا هم نمی‌گیرد؛ با تمدید پرداخت‌شده یا انتقال دوباره‌ی ادمین، فرمول‌ها دوباره عمل می‌کنند.
• پیش‌فرض‌ها: پنل ادمین روی «نیاز به تایید» ؛ پنل کاربر روی «فعال» (گزینه‌ی «همه» در پنل کاربر حذف شد).
• ثبت‌نام فقط با موبایل (کد ۷ رقمی = رمز). نام و نام خانوادگی، نام تجاری، استان و شهر، ایمیل، ۴ تلفن، تا ۵ لینک و تیک قوانین در فرم ثبت آگهی هستند.
• تماس ۱ = موبایل ورود (غیرقابل تغییر) با تیک «نمایش در آگهی»؛ همکاران تیک را برمی‌دارند و شماره‌ی مشتری را در تماس ۲ تا ۴ می‌نویسند (حداقل یک شماره باید نمایش داده شود).
• خدمات وابسته به فیلد (تصاویر اضافه، لینک‌ها، دامنه) از روی خود فیلدها خودکار محاسبه می‌شوند و با خالی کردن فیلد حذف می‌شوند؛ بقیه‌ی خدمات را کاربر خودش انتخاب می‌کند.
• نوع پرداخت هنگام ثبت آگهی: آنلاین | کارت به کارت | بعداً پرداخت می‌کنم (در پنل > پرداخت‌ها). در خود صفحه‌ی فاکتور فقط آنلاین و کارت به کارت است و بخش پرداخت بالای فاکتور قرار دارد.
• مجوز: بخش بسته‌ی «کسب‌وکار من نیاز به مجوز دارد» (با تیک باز می‌شود) با متن راهنما؛ متن را در inc/layout.php (تابع permit_box_html) می‌توانید عوض کنید.
• جستجوی دسته‌بندی در فرم آگهی (با تایپ یک کلمه، مسیر کامل دسته پیشنهاد می‌شود).
• مکان‌ها: کشور ← استان ← شهر (الفبایی). مدیریت: ادمین > مکان‌ها ؛ ورود گروهی: ادمین > ورود از فایل (CSV با ستون‌های id,parent_id,name). همان ابزار برای دسته‌بندی هم هست؛ دستور SQL گرفتن CSV از سایت قدیمی در همان صفحه نوشته شده.
• کد آگهی از ۱,۰۰۰,۰۰۰ شروع می‌شود. آدرس آگهی: https://دامنه/ad/کد/عنوان  (لینک کوتاه: /?p=کد). اگر روی هاست rewrite کار نکرد، در inc/config.php مقدار PRETTY_URLS را false کنید (آدرس ad.php?code=... می‌شود).
• نشست کاربر ۱ سال و با هر بازدید تمدید می‌شود (پوشه‌ی logs/sessions باید قابل نوشتن باشد).
• فاکتور: خریدار = نام و تلفن آگهی‌دهنده (نه حساب ورودی)؛ در ادمین > پرداخت‌ها عنوان آگهی لینک مستقیم به همان آگهی است؛ فقط کارت‌به‌کارت‌ها نیاز به تأیید دارند، آنلاین‌ها خودکار تأیید می‌شوند.
• ادمین > تیکت: حذف پیام و حذف کل تیکت. ادمین > تمدید: پیامک ۵۰ کاربر تصادفی (تکرار نمی‌شود تا ۹۰ روز). ادمین > آگهی‌ها: جستجو در متن آگهی (عنوان، توضیحات، کلمات کلیدی ...)، کد و شماره‌های تماس.
• لوگو: SVG لوگوی متنی داخل هدر؛ لوگوی گرد در ورود/ثبت‌نام/فاکتور؛ فاو‌ایکون از لوگوی گرد.
