🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8060771913, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=23
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 23 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8060771913, plan_id=1
🔎 [is_plan_full] plan 1 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8060771913, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=23
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 23 جزو [1, 5, 10, 15, 20, 25] نبود).
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=0 total=0 page=1
[INFO] no active orders found -> show main menu
[ERROR] Excel build error: No module named 'openpyxl.packaging.extended'
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5305828563, plan_id=3
🔎 [is_plan_full] plan 3 → False
🔎 [is_plan_full] plan 3 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=23
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 23 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=818270415, plan_id=8
🔎 [is_plan_full] plan 8 → False
🔎 [is_plan_full] plan 8 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=23
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-15 03:30:01.066051
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=781724552, plan_id=6
🔎 [is_plan_full] plan 6 → False
🔎 [is_plan_full] plan 6 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=24
[prompt_receipt] callback from user=781724552, order_id=1
[receive_receipt] triggered for user=781724552 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 428
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=1 total=1 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=1 total=1 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=1 total=1 page=1
[INFO] edited message with user list
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=781724552, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=24
[prompt_receipt] callback from user=781724552, order_id=2
[receive_receipt] triggered for user=781724552 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 452
[receive_receipt] done, state cleared after receipt submission
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 14, in <module>
    from services.scheduler.tasks import (
  File "/home/musighsv/public_html/Music-Bot2/services/scheduler/tasks.py", line 2, in <module>
    from database.queries import (
  File "/home/musighsv/public_html/Music-Bot2/database/queries.py", line 4, in <module>
    from sqlalchemy import or_
ModuleNotFoundError: No module named 'sqlalchemy'
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=1275368699, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=25
[discount-check] ⛔️ بدون تخفیف (روز 25 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=1275368699, order_id=3
[receive_receipt] triggered for user=1275368699 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 501
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=3 total=3 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=2 total=2 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=2 total=2 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=2 total=2 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=3 total=3 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=240648261, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=25
[discount-check] ⛔️ بدون تخفیف (روز 25 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=240648261, order_id=4
[receive_receipt] triggered for user=240648261 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 548
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=4 total=4 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=4 total=4 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-17 03:30:01.094342
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=1838308137, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=26
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 26 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=1838308137, order_id=5
[receive_receipt] triggered for user=1838308137 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 582
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=5 total=5 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=5 total=5 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-18 03:30:00.978205
✅ CRON Done → sent=0, failed=0
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=7146274503, plan_id=9
🔎 [is_plan_full] plan 9 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-19 03:30:03.573729
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5272694027, plan_id=1
🔎 [is_plan_full] plan 1 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5272694027, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=28
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 28 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=28
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 28 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=28
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 28 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-20 03:30:00.979901
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
[prompt_receipt] callback from user=5272694027, order_id=6
[receive_receipt] triggered for user=5272694027 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 691
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=6 total=6 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=29
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 29 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=223610799, plan_id=3
🔎 [is_plan_full] plan 3 → False
🔎 [is_plan_full] plan 3 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=29
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 29 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=223610799, order_id=7
[receive_receipt] triggered for user=223610799 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 752
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=7 total=7 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=7 total=7 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-21 03:30:01.134175
✅ CRON Done → sent=0, failed=0
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=7 total=7 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7914142871, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=30
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 30 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=7914142871, order_id=8
[receive_receipt] triggered for user=7914142871 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 785
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7676763896, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=30
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 30 جزو [1, 5, 10, 15, 20, 25] نبود).
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=8 total=8 page=1
[INFO] edited message with user list
[prompt_receipt] callback from user=7676763896, order_id=9
[receive_receipt] triggered for user=7676763896 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 797
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=9 total=9 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=9 total=9 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=6391376488, plan_id=7
🔎 [is_plan_full] plan 7 → False
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=6391376488, plan_id=6
🔎 [is_plan_full] plan 6 → False
🔎 [is_plan_full] plan 6 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=30
[prompt_receipt] callback from user=6391376488, order_id=10
[prompt_receipt] callback from user=6391376488, order_id=10
[receive_receipt] triggered for user=6391376488 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 846
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=10 page=1
[INFO] edited message with user list
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8098998282, plan_id=8
🔎 [is_plan_full] plan 8 → False
🔎 [is_plan_full] plan 8 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=30
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=10 page=1
[INFO] edited message with user list
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
Traceback (most recent call last):
  File "/home/musighsv/public_html/Music-Bot2/main.py", line 38, in <module>
    from bot.handlers.admin import router as admin_router
  File "/home/musighsv/public_html/Music-Bot2/bot/handlers/admin.py", line 3688, in <module>
    from database.queries import replace_active_links_pattern
ImportError: cannot import name 'replace_active_links_pattern' from 'database.queries' (/home/musighsv/public_html/Music-Bot2/database/queries.py)
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-22 03:30:00.839012
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=711165300, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=31
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 31 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=711165300, order_id=11
[receive_receipt] triggered for user=711165300 content_types=['message_id', 'date', 'chat', 'from_user', 'forward_origin', 'photo', 'forward_date', 'forward_from']
[receive_receipt] successfully removed reply_markup from invoice msg 887
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=11 page=1
[INFO] edited message with user list
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=223610799, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=31
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 31 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=223610799, order_id=12
[receive_receipt] triggered for user=223610799 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 910
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=12 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-23 03:30:00.024418
✅ CRON Done → sent=0, failed=0
👉 prompt_terms: user=8731819030, plan_id=1
🔎 [is_plan_full] plan 1 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8731819030, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=1
[discount-check] ⛔️ بدون تخفیف (روز 1 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=8731819030, order_id=13
[receive_receipt] triggered for user=8731819030 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 930
[receive_receipt] done, state cleared after receipt submission
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-24 03:30:00.046595
✅ CRON Done → sent=0, failed=0
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=2
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 2 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=6863360669, order_id=14
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 954
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=14 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-25 03:30:00.053631
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=168880456, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=3
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=168880456, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=3
[prompt_receipt] callback from user=168880456, order_id=16
[receive_receipt] triggered for user=168880456 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 986
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=478239884, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=3
[prompt_receipt] callback from user=478239884, order_id=17
[receive_receipt] triggered for user=478239884 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1013
[receive_receipt] done, state cleared after receipt submission
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-26 03:30:01.091157
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5775329920, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=4
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 4 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=5775329920, order_id=18
[receive_receipt] triggered for user=5775329920 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1037
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=17 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-27 03:30:00.951066
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8315479551, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[prompt_receipt] callback from user=8315479551, order_id=19
[receive_receipt] triggered for user=8315479551 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1080
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=349533236, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=349533236, order_id=20
[receive_receipt] triggered for user=349533236 content_types=['message_id', 'date', 'chat', 'from_user', 'text']
[receive_receipt] successfully removed reply_markup from invoice msg 1102
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5775329920, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=5775329920, order_id=21
[receive_receipt] triggered for user=5775329920 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1116
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=20 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=6863360669, order_id=22
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1144
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=21 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5464680989, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[prompt_receipt] callback from user=5464680989, order_id=23
[receive_receipt] triggered for user=5464680989 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1187
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=667355285, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=667355285, order_id=24
[cancel_upload_receipt] user=667355285 cancel upload
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=667355285, order_id=24
[prompt_receipt] callback from user=6863360669, order_id=25
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1221
[receive_receipt] done, state cleared after receipt submission
[receive_receipt] triggered for user=667355285 content_types=['message_id', 'date', 'chat', 'from_user', 'media_group_id', 'photo']
[receive_receipt] triggered for user=667355285 content_types=['message_id', 'date', 'chat', 'from_user', 'media_group_id', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1217
[receive_receipt] failed to remove markup from invoice msg: Telegram server says - Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
[receive_receipt] done, state cleared after receipt submission
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=23 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=23 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=23 page=1
[INFO] edited message with user list
[prompt_receipt] callback from user=667355285, order_id=24
[receive_receipt] triggered for user=667355285 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1257
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=24 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=3
🔎 [is_plan_full] plan 3 → False
🔎 [is_plan_full] plan 3 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=5
[discount-check] ⛔️ بدون تخفیف (روز 5 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=6863360669, order_id=27
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1308
[receive_receipt] done, state cleared after receipt submission
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-28 03:30:00.649738
✅ CRON Done → sent=0, failed=0
👉 prompt_terms: user=5775329920, plan_id=2
🔎 [is_plan_full] plan 2 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5775329920, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=6
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 6 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5775329920, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=6
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 6 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=5775329920, order_id=28
[receive_receipt] triggered for user=5775329920 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1331
[receive_receipt] done, state cleared after receipt submission
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-29 03:30:00.968360
✅ CRON Done → sent=0, failed=0
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=26 page=1
[INFO] edited message with user list
👉 prompt_terms: user=6391376488, plan_id=6
🔎 [is_plan_full] plan 6 → False
🔎 [is_plan_full] plan 6 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=7
[prompt_receipt] callback from user=6391376488, order_id=29
[prompt_receipt] callback from user=6391376488, order_id=29
[receive_receipt] triggered for user=6391376488 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] failed to update renew_order_id: Unconsumed column names: is_expired
[receive_receipt] successfully removed reply_markup from invoice msg 1364
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=26 page=1
[INFO] edited message with user list
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5861134571, plan_id=9
🔎 [is_plan_full] plan 9 → False
🔎 [is_plan_full] plan 9 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=7
[prompt_receipt] callback from user=5861134571, order_id=30
[receive_receipt] triggered for user=5861134571 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1397
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-30 03:30:00.107420
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=344135646, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=8
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 8 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=344135646, order_id=31
[receive_receipt] triggered for user=344135646 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1431
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=28 page=1
[INFO] edited message with user list
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=8
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 8 جزو [1, 5, 10, 15, 20, 25] نبود).
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=452395102, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=8
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 8 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=452395102, order_id=32
[receive_receipt] triggered for user=452395102 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1485
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5660189545, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=8
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8098998282, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=8
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8098998282, plan_id=3
🔎 [is_plan_full] plan 3 → False
[prompt_receipt] callback from user=5660189545, order_id=33
[receive_receipt] triggered for user=5660189545 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1512
[receive_receipt] done, state cleared after receipt submission
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-08-31 03:30:01.088464
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5825101062, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=9
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 9 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=5825101062, order_id=34
[receive_receipt] triggered for user=5825101062 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1541
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=31 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-01 03:30:00.937938
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=1516425830, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=10
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=168880456, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=10
[prompt_receipt] callback from user=168880456, order_id=36
[receive_receipt] triggered for user=168880456 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1583
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=32 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=31 page=1
[INFO] edited message with user list
🧹 پاک‌سازی خودکار: تعداد 1 اشتراک منقضی‌شده و لینک‌های آن‌ها حذف شدند.
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-02 03:30:01.094703
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=883344033, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=11
[prompt_receipt] callback from user=883344033, order_id=37
[receive_receipt] triggered for user=883344033 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1617
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=400049420, plan_id=7
🔎 [is_plan_full] plan 7 → False
🔎 [is_plan_full] plan 7 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=11
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-03 03:30:01.098303
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=400049420, plan_id=7
🔎 [is_plan_full] plan 7 → False
🔎 [is_plan_full] plan 7 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 12 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=6863360669, order_id=39
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1655
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=33 page=1
[INFO] edited message with user list
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=93936041, plan_id=5
🔎 [is_plan_full] plan 5 → False
🔎 [is_plan_full] plan 5 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
[prompt_receipt] callback from user=93936041, order_id=40
[receive_receipt] triggered for user=93936041 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1684
[receive_receipt] done, state cleared after receipt submission
👉 prompt_terms: user=6391376488, plan_id=6
🔎 [is_plan_full] plan 6 → False
🔎 [is_plan_full] plan 6 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
[prompt_receipt] callback from user=6391376488, order_id=41
[receive_receipt] triggered for user=6391376488 content_types=['message_id', 'date', 'chat', 'from_user', 'text', 'entities', 'link_preview_options']
[receive_receipt] failed to update renew_order_id: Unconsumed column names: is_expired
[receive_receipt] successfully removed reply_markup from invoice msg 1693
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=34 page=1
[INFO] edited message with user list
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5861134571, plan_id=9
🔎 [is_plan_full] plan 9 → False
🔎 [is_plan_full] plan 9 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
[prompt_receipt] callback from user=5861134571, order_id=42
[receive_receipt] triggered for user=5861134571 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1728
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
🧹 پاک‌سازی خودکار: تعداد 1 اشتراک منقضی‌شده و لینک‌های آن‌ها حذف شدند.
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8098998282, plan_id=13
🔎 [is_plan_full] plan 13 → False
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8098998282, plan_id=9
🔎 [is_plan_full] plan 9 → False
🔎 [is_plan_full] plan 9 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=12
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-04 03:30:01.063987
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8080784983, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=13
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 13 جزو [1, 5, 10, 15, 20, 25] نبود).
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=240648261, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=13
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 13 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=240648261, order_id=44
[receive_receipt] triggered for user=240648261 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1814
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=35 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7676763896, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=13
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 13 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=7676763896, order_id=45
[receive_receipt] triggered for user=7676763896 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1859
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=36 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=13
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 13 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=6863360669, order_id=46
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1882
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=37 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-05 03:30:00.970641
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8938963559, plan_id=2
🔎 [is_plan_full] plan 2 → False
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7676763896, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=14
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 14 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=7676763896, order_id=47
[receive_receipt] triggered for user=7676763896 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1949
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=38 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=117125306, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=14
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 14 جزو [1, 5, 10, 15, 20, 25] نبود).
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-06 03:30:01.119389
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8731819030, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[discount-check] ⛔️ بدون تخفیف (روز 15 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=8731819030, order_id=49
[prompt_receipt] callback from user=8731819030, order_id=49
[receive_receipt] triggered for user=8731819030 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1983
[receive_receipt] done, state cleared after receipt submission
[prompt_receipt] callback from user=8731819030, order_id=49
[receive_receipt] triggered for user=8731819030 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 1992
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=39 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=117125306, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[discount-check] ⛔️ بدون تخفیف (روز 15 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=117125306, order_id=50
[receive_receipt] triggered for user=117125306 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2019
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=40 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7034383044, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[discount-check] ⛔️ بدون تخفیف (روز 15 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=7034383044, order_id=51
[receive_receipt] triggered for user=7034383044 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2046
[receive_receipt] done, state cleared after receipt submission
👉 prompt_terms: user=478239884, plan_id=5
🔎 [is_plan_full] plan 5 → False
👉 prompt_terms: user=478239884, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[prompt_receipt] callback from user=478239884, order_id=52
[receive_receipt] triggered for user=478239884 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] failed to update renew_order_id: Unconsumed column names: is_expired
[receive_receipt] successfully removed reply_markup from invoice msg 2065
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=40 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=41 page=1
[INFO] edited message with user list
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=41 page=1
[INFO] edited message with user list
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
👉 Category selected: 2
🔎 [is_category_full] category 1 → 3 plans available
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(1) = False
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=8938963559, plan_id=11
🔎 [is_plan_full] plan 11 → False
🔎 [is_plan_full] plan 11 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[prompt_receipt] callback from user=8938963559, order_id=53
[receive_receipt] triggered for user=8938963559 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2116
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8731819030, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=15
[discount-check] ⛔️ بدون تخفیف (روز 15 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=8731819030, order_id=54
[receive_receipt] triggered for user=8731819030 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2143
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=43 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-07 03:30:00.039277
✅ CRON Done → sent=0, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7034383044, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=16
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 16 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=7034383044, order_id=55
[receive_receipt] triggered for user=7034383044 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2174
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=5775329920, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=16
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 16 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=5775329920, order_id=56
[receive_receipt] triggered for user=5775329920 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2197
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=45 page=1
[INFO] edited message with user list
ERROR:sqlalchemy.pool.impl.NullPool:The garbage collector is trying to clean up non-checked-in connection <AdaptedConnection <Connection(Thread-1560, started daemon 140094828693248)>>, which will be dropped, as it cannot be safely terminated.  Please ensure that SQLAlchemy pooled connections are returned to the pool explicitly, either by calling ``close()`` or by using appropriate context managers to manage their lifecycle.
sys:1: SAWarning: The garbage collector is trying to clean up non-checked-in connection <AdaptedConnection <Connection(Thread-1560, started daemon 140094828693248)>>, which will be dropped, as it cannot be safely terminated.  Please ensure that SQLAlchemy pooled connections are returned to the pool explicitly, either by calling ``close()`` or by using appropriate context managers to manage their lifecycle.
ERROR:sqlalchemy.pool.impl.NullPool:The garbage collector is trying to clean up non-checked-in connection <AdaptedConnection <Connection(Thread-1564, started daemon 140094837085952)>>, which will be dropped, as it cannot be safely terminated.  Please ensure that SQLAlchemy pooled connections are returned to the pool explicitly, either by calling ``close()`` or by using appropriate context managers to manage their lifecycle.
sys:1: SAWarning: The garbage collector is trying to clean up non-checked-in connection <AdaptedConnection <Connection(Thread-1564, started daemon 140094837085952)>>, which will be dropped, as it cannot be safely terminated.  Please ensure that SQLAlchemy pooled connections are returned to the pool explicitly, either by calling ``close()`` or by using appropriate context managers to manage their lifecycle.
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=240648261, plan_id=2
🔎 [is_plan_full] plan 2 → False
🔎 [is_plan_full] plan 2 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=16
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 16 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=240648261, order_id=57
[receive_receipt] triggered for user=240648261 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2227
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=46 page=1
[INFO] edited message with user list
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-08 03:30:00.037090
✅ CRON Done → sent=0, failed=0
[prompt_receipt] callback from user=400049420, order_id=38
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=400049420, plan_id=7
🔎 [is_plan_full] plan 7 → False
🔎 [is_plan_full] plan 7 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=17
[prompt_receipt] callback from user=400049420, order_id=58
[receive_receipt] triggered for user=400049420 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2260
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 4
🔎 [is_category_full] category 4 → 5 plans available
🔍 is_category_full(4) = False
✅ Plans found for category 4: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 3
🔎 [is_category_full] category 3 → 5 plans available
🔍 is_category_full(3) = False
✅ Plans found for category 3: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5861134571, plan_id=9
🔎 [is_plan_full] plan 9 → False
🔎 [is_plan_full] plan 9 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=17
[prompt_receipt] callback from user=5861134571, order_id=59
[receive_receipt] triggered for user=5861134571 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2282
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=48 page=1
[INFO] edited message with user list
🧹 پاک‌سازی خودکار: تعداد 1 اشتراک منقضی‌شده و لینک‌های آن‌ها حذف شدند.
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-09 03:30:00.043869
✅ CRON Done → sent=0, failed=0
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=1333944594, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=18
[prompt_receipt] callback from user=1333944594, order_id=60
[receive_receipt] triggered for user=1333944594 content_types=['message_id', 'date', 'chat', 'from_user', 'document']
[receive_receipt] invalid content (not photo/text)
[receive_receipt] triggered for user=1333944594 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2313
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8731819030, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=18
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 18 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=8731819030, order_id=61
[receive_receipt] triggered for user=8731819030 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2339
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=49 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-10 03:30:00.037085
✅ CRON Done → sent=4, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=1028775319, plan_id=1
🔎 [is_plan_full] plan 1 → False
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=8711394571, plan_id=1
🔎 [is_plan_full] plan 1 → False
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6669519884, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=19
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 19 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=6669519884, order_id=62
[receive_receipt] triggered for user=6669519884 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2382
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=50 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-11 03:30:00.062368
✅ CRON Done → sent=5, failed=0
🚀 Starting bot...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

🟢 زمان‌بند کرون‌جاب‌ها و پاک‌سازی دیتابیس فعال شد.
🧹 Running weekly cleanup task...
🧹 Running weekly cleanup task...
✅ Cleanup finished. No files removed.

ℹ️ هیچ وبهوکی تنظیم نشده است.
🤖 Polling mode فعال شد...
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 prompt_terms: user=5035198899, plan_id=4
🔎 [is_plan_full] plan 4 → False
🔎 [is_plan_full] plan 4 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=20
[prompt_receipt] callback from user=5035198899, order_id=63
[receive_receipt] triggered for user=5035198899 content_types=['message_id', 'date', 'chat', 'from_user', 'text']
[receive_receipt] successfully removed reply_markup from invoice msg 2424
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=20
[discount-check] ⛔️ بدون تخفیف (روز 20 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=6863360669, order_id=64
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2446
[receive_receipt] done, state cleared after receipt submission
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=836289824, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=20
[discount-check] ⛔️ بدون تخفیف (روز 20 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=836289824, order_id=65
[receive_receipt] triggered for user=836289824 content_types=['message_id', 'date', 'chat', 'from_user', 'photo', 'caption', 'caption_entities']
[receive_receipt] successfully removed reply_markup from invoice msg 2461
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=53 page=1
[INFO] edited message with user list
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=6863360669, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=20
[discount-check] ⛔️ بدون تخفیف (روز 20 جزو [1, 5, 10, 15, 20, 25] بود).
[prompt_receipt] callback from user=6863360669, order_id=66
[receive_receipt] triggered for user=6863360669 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2495
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=54 page=1
[INFO] edited message with user list
⏰ [CRON] اجرای خودکار اطلاع‌رسانی تمدید در 2026-09-12 03:30:00.046267
✅ CRON Done → sent=5, failed=0
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
👉 prompt_terms: user=7676763896, plan_id=1
🔎 [is_plan_full] plan 1 → False
🔎 [is_plan_full] plan 1 → False
[discount-check] تاریخ شمسی خرید واقعی:  → روز=21
[discount-check] ✅ تخفیف ۱۰٪ اعمال شد (روز 21 جزو [1, 5, 10, 15, 20, 25] نبود).
[prompt_receipt] callback from user=7676763896, order_id=67
[receive_receipt] triggered for user=7676763896 content_types=['message_id', 'date', 'chat', 'from_user', 'photo']
[receive_receipt] successfully removed reply_markup from invoice msg 2525
[receive_receipt] done, state cleared after receipt submission
[INFO] admin_list_active_users called; data=admin:list_users from=8060771913
[INFO] fetched orders_count=10 total=55 page=1
[INFO] edited message with user list
👉 Category selected: 2
🔎 [is_category_full] category 2 → 5 plans available
🔍 is_category_full(2) = False
✅ Plans found for category 2: 5
✅ Keyboard buttons generated: 6
👉 Category selected: 1
🔎 [is_category_full] category 1 → 3 plans available
🔍 is_category_full(1) = False
✅ Plans found for category 1: 3
✅ Keyboard buttons generated: 4
