diff --git a/handlers/initiative_group.py b/handlers/initiative_group.py
index 8c9ec56..91c46ae 100644
--- a/handlers/initiative_group.py
+++ b/handlers/initiative_group.py
@@ -29,20 +29,32 @@ async def cb_ig_menu(callback: CallbackQuery):
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder
from utils.ui_styles import get_colored_header, get_level_badge
-
+ from config import ADMIN_USER_ID
+
await callback.answer()
-
+
user_id = callback.from_user.id
async with AsyncSessionLocal() as session:
ig_service = InitiativeGroupService(session)
is_member = await ig_service.is_member(user_id)
- if is_member:
- header = get_colored_header('ИНИЦИАТИВНАЯ ГРУППА', 'ig')
+ # Админы и суперадмин всегда имеют доступ
+ is_admin = user_id == ADMIN_USER_ID
+
+ if is_member or is_admin:
+ header = get_colored_header('ИНИЦИАТИВНАЯ ГРУППА', 'ig' if is_member else 'admin')
text = f'{header}\n\n'
- text += f'{get_level_badge("ig")}\n\n'
- text += 'Вы — участник инициативной группы!\n\n'
+ text += f'{get_level_badge("admin" if is_admin else "ig")}\n\n'
+
+ if is_admin and not is_member:
+ text += '🟡 Вы — администратор!\n\n'
+ text += 'У вас есть полный доступ к функциям ИГ.\n'
+ text += 'Для вступления в ИГ используйте:\n'
+ text += '/ig_add 197957361 admin\n\n'
+ else:
+ text += 'Вы — участник инициативной группы!\n\n'
+
text += 'Ваши возможности:\n'
text += '• 📊 Статистика активности\n'
text += '• 📋 Список участников\n'
@@ -66,7 +78,7 @@ async def cb_ig_menu(callback: CallbackQuery):
builder.row(
InlineKeyboardButton(text='🔙 Назад', callback_data='main_menu'),
)
-
+
await callback.message.answer(
text,
reply_markup=builder.as_markup(),
diff --git a/handlers/users.py b/handlers/users.py
index a784467..6206fad 100644
--- a/handlers/users.py
+++ b/handlers/users.py
@@ -509,24 +509,31 @@ async def cb_phones_police(callback: CallbackQuery):
async def cb_masters(callback: CallbackQuery):
"""Мастера"""
await callback.answer()
-
+
async with AsyncSessionLocal() as session:
stmt = select(Service).where(Service.category.in_(['masters', 'plumber', 'electrician'])).order_by(Service.name)
result = await session.execute(stmt)
services = list(result.scalars().all())
-
- text = '👷 Проверенные мастера\n\n'
- text += format_phone_list([
- {
- 'name': s.name,
- 'phone': s.phone,
- 'description': s.description,
- 'category': s.category,
- 'rating': s.rating
- }
- for s in services
- ])
-
+
+ if not services:
+ text = '👷 Проверенные мастера\n\n'
+ text += '⏳ Список мастеров заполняется...\n\n'
+ text += 'Скоро здесь появятся контакты проверенных сантехников, электриков и других мастеров.\n\n'
+ text += '💡 Хотите предложить мастера?\n'
+ text += 'Напишите администратору чата!'
+ else:
+ text = '👷 Проверенные мастера\n\n'
+ text += format_phone_list([
+ {
+ 'name': s.name,
+ 'phone': s.phone,
+ 'description': s.description,
+ 'category': s.category,
+ 'rating': s.rating
+ }
+ for s in services
+ ])
+
await callback.message.answer(text, parse_mode='HTML')
diff --git a/test_bot_comprehensive.py b/test_bot_comprehensive.py
new file mode 100644
index 0000000..59b4901
--- /dev/null
+++ b/test_bot_comprehensive.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python3
+"""
+Комплексное тестирование бота
+Проверяет все кнопки для всех уровней доступа
+"""
+import asyncio
+from sqlalchemy import select, func
+from database.db import AsyncSessionLocal
+from database.models import User, Service, InitiativeGroup
+from config import ADMIN_USER_ID
+
+async def test_all():
+ print("=" * 60)
+ print("🧪 КОМПЛЕКСНОЕ ТЕСТИРОВАНИЕ БОТА")
+ print("=" * 60)
+
+ async with AsyncSessionLocal() as session:
+ # Статистика
+ total = (await session.execute(select(func.count(User.user_id)))).scalar()
+ verified = (await session.execute(select(func.count(User.user_id)).where(User.verified == True))).scalar()
+ unverified = total - verified
+
+ # ИГ
+ ig_stmt = select(func.count(InitiativeGroup.id)).where(InitiativeGroup.is_active == True)
+ ig_count = (await session.execute(ig_stmt)).scalar()
+
+ # Админы
+ admin_count = (await session.execute(select(func.count(User.user_id)).where(User.is_admin == True))).scalar()
+
+ print(f"\n📊 СТАТИСТИКА:")
+ print(f" Всего пользователей: {total}")
+ print(f" ✅ Верифицированы: {verified}")
+ print(f" ⏳ Не верифицированы: {unverified}")
+ print(f" 🔵 ИГ: {ig_count}")
+ print(f" 🟡 Админы: {admin_count}")
+ print(f" 🟣 Суперадмин: {ADMIN_USER_ID}")
+
+ # Проверка суперадмина
+ superadmin = await session.get(User, ADMIN_USER_ID)
+ print(f"\n👤 СУПЕРАДМИН:")
+ if superadmin:
+ print(f" Имя: {superadmin.first_name}")
+ print(f" Квартира: {superadmin.apartment or '—'}")
+ print(f" Верификация: {'✅' if superadmin.verified else '❌'}")
+ print(f" Админ: {'✅' if superadmin.is_admin else '❌'}")
+
+ # Проверка ИГ
+ ig_member = await session.get(InitiativeGroup, ADMIN_USER_ID)
+ print(f" ИГ: {'✅' if ig_member and ig_member.is_active else '❌'}")
+ else:
+ print(f" ❌ НЕ НАЙДЕН В БАЗЕ!")
+
+ # Проверка мастеров
+ masters = await session.execute(
+ select(Service).where(Service.category.in_(['masters', 'plumber', 'electrician']))
+ )
+ masters_count = len(list(masters.scalars().all()))
+ print(f"\n👷 МАСТЕРА:")
+ print(f" В базе: {masters_count}")
+ if masters_count == 0:
+ print(f" ⚠️ НУЖНО ЗАПОЛНИТЬ!")
+
+ # Проверка телефонов
+ phones = await session.execute(
+ select(Service).where(Service.category == 'emergency')
+ )
+ phones_count = len(list(phones.scalars().all()))
+ print(f"\n📞 ЭКСТРЕННЫЕ:")
+ print(f" В базе: {phones_count}")
+ if phones_count == 0:
+ print(f" ⚠️ НУЖНО ЗАПОЛНИТЬ!")
+
+ print("\n" + "=" * 60)
+ print("✅ ТЕСТИРОВАНИЕ ЗАВЕРШЕНО")
+ print("=" * 60)
+
+if __name__ == '__main__':
+ asyncio.run(test_all())