Commit Graph

5844 Commits

Author SHA1 Message Date
Egor
23b64ffb2a Revert "Revert "Frekassa"" 2026-01-06 22:43:01 +03:00
Egor
9868c5de0f Merge pull request #2237 from BEDOLAGA-DEV/revert-2236-dev5
Revert "Frekassa"
2026-01-06 22:40:45 +03:00
Egor
aeaaa54920 Revert "Frekassa" 2026-01-06 22:40:35 +03:00
Egor
fb25032284 Merge pull request #2236 from BEDOLAGA-DEV/dev5
Frekassa
2026-01-06 21:43:35 +03:00
Egor
3e0661da39 Update index.html 2026-01-06 21:02:20 +03:00
Egor
7ab9fe9ad2 Update .env.example 2026-01-06 21:01:56 +03:00
Egor
7c846c2f83 Update miniapp.py 2026-01-06 21:01:20 +03:00
Egor
163f55ec14 Update config.py 2026-01-06 21:00:04 +03:00
Egor
2c8e67ac82 Implement Freekassa webhook handler
Added support for Freekassa webhook handling and logging.
2026-01-06 20:59:38 +03:00
Egor
e9ce583eb2 Add files via upload 2026-01-06 20:59:02 +03:00
Egor
416908aea4 Add files via upload 2026-01-06 20:58:36 +03:00
Egor
6223a5d63a Update bot_configuration.py 2026-01-06 20:57:55 +03:00
Egor
53a10c0640 Add files via upload 2026-01-06 20:56:44 +03:00
Egor
7c2408209d Add files via upload 2026-01-06 20:54:46 +03:00
Egor
9fbc3a8312 Add FreekassaPayment model for payment processing 2026-01-06 20:54:18 +03:00
Egor
dff08cbad2 Add create_freekassa_payments_table function 2026-01-06 20:53:55 +03:00
Egor
a2379b9be1 Delete FreekassaPayment model and related code
Removed FreekassaPayment class and its related fields.
2026-01-06 20:53:32 +03:00
Egor
12dc9ccbaa Update models.py 2026-01-06 20:51:46 +03:00
gy9vin
8342e8fe35 Ручной запуск мониторинга трафика
Ручная проверка в админке (monitoring.py):
  - Новая кнопка "📊 Проверка трафика" в меню мониторинга
  - Проверяет всех юзеров с активной подпиской
  - Показывает результат: сколько проверено, сколько превышений
  - Отправляет уведомления админам при превышении
2026-01-04 21:21:05 +03:00
Mikhail
03d30dd5c0 Merge branch 'BEDOLAGA-DEV:main' into main 2026-01-04 21:15:40 +03:00
gy9vin
27512825ae Улучшение системы мониторинга трафика
Изменения в traffic_monitoring_service.py:

  1. Добавлен импорт get_db — для получения сессии БД внутри цикла
  2. Добавлен set_bot() — для установки бота
  3. Изменён start_monitoring() — не требует db и bot как параметры
  4. Добавлен кэш уведомлений — защита от спама (1 уведомление в 24ч на юзера)
  5. Добавлена очистка кэша — удаляет записи старше 48ч

  Изменения в main.py:

  1. Импорт traffic_monitoring_scheduler
  2. Переменная traffic_monitoring_task
  3. set_bot() при старте
  4. Stage "Мониторинг трафика" с логированием интервала и порога
  5. Секция "Активные фоновые сервисы" — добавлен статус
  6. Перезапуск при ошибке в основном цикле
  7. Остановка в блоке finally

  ---
  Как включить

  В .env на сервере:

  TRAFFIC_MONITORING_ENABLED=true
  TRAFFIC_THRESHOLD_GB_PER_DAY=10.0
  TRAFFIC_MONITORING_INTERVAL_HOURS=1
  SUSPICIOUS_NOTIFICATIONS_TOPIC_ID=14

  После перезагрузки бота увидишь в логах:

  📊 Мониторинг трафика
     ├ Интервал проверки: 1 ч
     ├ Порог трафика: 10.0 ГБ/сутки
     └  Мониторинг трафика запущен
2026-01-04 21:15:29 +03:00
Egor
4b74ae12ad Merge pull request #2233 from BEDOLAGA-DEV/main
w
2026-01-04 17:24:01 +03:00
PEDZEO
258a4a5cb4 Merge pull request #2230 from BEDOLAGA-DEV/buttons
Buttons
2026-01-03 14:41:17 +03:00
Egor
2cd2147464 Merge pull request #2231 from Gy9vin/main
Фиксы
2026-01-02 19:26:52 +03:00
Mikhail
c5efc7ce06 Merge branch 'BEDOLAGA-DEV:main' into main 2026-01-02 19:25:34 +03:00
gy9vin
9cd5d8e0b9 Фикс промокодов 2026-01-02 19:23:52 +03:00
Egor
31d538fbcf Merge pull request #2229 from Gy9vin/main
Фиксы
2026-01-02 19:01:26 +03:00
gy9vin
2156f630dc Добавлена опция "только для первой покупки" в промокоды
- models.py: добавлено поле first_purchase_only в PromoCode
- universal_migration.py: миграция для добавления колонки first_purchase_only
- promocodes.py: добавлен хендлер toggle_promocode_first_purchase, отображение статуса в управлении промокодом
- promocode.py: обработка ошибки "not
2026-01-02 16:40:04 +03:00
gy9vin
917ca69b1d фикс 2026-01-02 16:20:42 +03:00
gy9vin
d524088bb8 Обязательная подписка на канал Доработка 2026-01-02 16:14:40 +03:00
PEDZEO
9bd1944ba3 fix platega inv 2026-01-02 12:16:36 +03:00
PEDZEO
c41979bda6 fix 2026-01-02 00:48:08 +03:00
PEDZEO
0813d585d2 docs: add cabinet settings to .env.example
Add configuration options for personal cabinet:
- CABINET_ENABLED, JWT settings, CORS origins
- Email verification settings
- SMTP configuration for email sending

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 00:23:05 +03:00
PEDZEO
3f74005068 feat: add cabinet columns migration
Add automatic migration for cabinet (personal account) columns:
- email, email_verified, email_verified_at
- password_hash, email_verification_token/expires
- password_reset_token/expires, cabinet_last_login

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 23:58:47 +03:00
PEDZEO
6b69ec750e feat: add cabinet (personal account) backend API
- Add JWT authentication for cabinet users
- Add Telegram WebApp authentication
- Add subscription management endpoints
- Add balance and transactions endpoints
- Add referral system endpoints
- Add tickets support for cabinet
- Add webhooks and websocket for real-time updates
- Add email verification service

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 23:20:20 +03:00
gy9vin
5a5a18d80d Фикс промокодов
Пагинация списка промокодов:
     - promocodes.py: добавлен хендлер show_promocodes_list_page
     - Зарегистрирован для admin_promo_list_page_*
2026-01-01 22:59:12 +03:00
gy9vin
4bebff5c4a fix(auto-activation): исправлен парсинг AVAILABLE_SUBSCRIPTION_PERIODS
Ошибка: код итерировал по строке "14,30,60,90,180,360" посимвольно,
  что приводило к ValueError: invalid literal for int() with base 10: ','

  Заменено на settings.get_available_subscription_periods() который
  корректно парсит строку в список [14, 30, 60, 90, 180, 360].
2026-01-01 22:55:01 +03:00
Mikhail
e2ae7dd34d Merge branch 'BEDOLAGA-DEV:main' into main 2026-01-01 22:48:27 +03:00
gy9vin
e15728e369 Fix простой покупки 2026-01-01 22:47:40 +03:00
Egor
ecaf270e04 Merge pull request #2228 from yazhog/main
Новые коды НДС для Юкассы
2025-12-31 14:07:48 +04:00
Egor
08e864e5ea Merge pull request #2227 from Gy9vin/main
Фиксы по старому функционалу)
2025-12-31 14:06:16 +04:00
yazhog
97655b8616 Merge pull request #47 from yazhog/codex/add-new-yookassa_vat_code-to-api
Add YooKassa VAT codes 7–12 to settings and document them in .env.example
2025-12-31 12:01:35 +03:00
yazhog
800d589afa Document YooKassa VAT codes in env example 2025-12-31 12:00:48 +03:00
gy9vin
ff51a984ef fix Параметризация callback_data в get_back_keyboard + поддержка модема в уведомлениях
1. app/keyboards/inline.py
  - Добавлен параметр callback_data: str = "back_to_menu" в get_back_keyboard()
  - Позволяет использовать кнопку "Назад" с разными callback'ами

2. app/services/admin_notification_service.py
  - Добавлен тип "modem" в update_types с заголовком "📡 ИЗМЕНЕНИЕ МОД
2025-12-31 10:16:14 +03:00
gy9vin
a4072237cc fix(nalogo): защита от дублирования чеков + очередь ручной проверки
ПРОБЛЕМА:
  При таймауте после успешной авторизации чек мог быть создан на сервере
  nalog.ru, но ответ не возвращался. Бот добавлял чек в очередь повторной
  отправки → создавался дубликат.

  РЕШЕНИЕ:
  1. Разделена обработка ошибок на два этапа:
     - Аутентификация не прошла → чек точно не создан → в очередь
     - Таймаут при создании → чек МОГ быть создан → НЕ в очередь

  2. Новая очередь `nalogo:pending_verification` для чеков требующих
     ручной проверки (когда таймаут после успешной авторизации)

  3. Кнопка в админке: Мониторинг → Статистика → "⚠️ Проверить (N)"
     - Показывает список чеков с суммой, датой, payment_id
     - " Создан" — чек найден в налоговой, убираем из очереди
     - "🔄 Отправить" — чек НЕ найден, отправляем повторно
     - "🗑 Очистить всё" — после полной сверки с lknpd.nalog.ru

  4. Таймаут увеличен с 10 до 30 секунд (NALOGO_TIMEOUT)

  5. Атомарная защита от race condition через cache.setnx()

  Изменённые файлы:
  - app/utils/cache.py — добавлен метод setnx()
  - app/services/nalogo_service.py — разделение ошибок, pending_verification
  - app/services/nalogo_queue_service.py — статус pending в get_status()
  - app/handlers/admin/monitoring.py — UI для ручной проверки
2025-12-31 01:25:47 +03:00
gy9vin
ac83273a22 Фиксы 2025-12-31 00:07:33 +03:00
gy9vin
073d96fb27 fix Новый фильтр "Готовы к продлению"
1. Добавлен .unique() — предотвращает дубликаты при JOIN с подписками
  2. Лимит 20 → 10 — соответствует хендлеру и другим фильтрам
2025-12-30 23:16:42 +03:00
gy9vin
8e6082ce15 fix Черный список, мониторинг суточно графика по регламенту
Исправленные файлы:

  1. app/services/traffic_monitoring_service.py — удалены неиспользуемые импорты Decimal, aiohttp
  2. app/services/blacklist_service.py — удалён неиспользуемый импорт re
  3. app/database/crud/user.py:998 — создана отсутствующая функция get_users_with_active_subscriptions:
  async def get_users_with_active_subscriptions(db: AsyncSession) -> List[User]:
  3. Функция:
    - Возвращает пользователей с активными подписками
    - Фильтрует по remnawave_uuid IS NOT NULL (нужен для API Remnawave)
    - Проверяет end_date > now и status == ACTIVE
2025-12-30 23:11:54 +03:00
gy9vin
08692145d2 fix Массовая синхронизация пользователей с Remnawave
app/database/crud/subscription.py:

  Добавлен await db.flush() в create_subscription_no_commit для консистентности с create_user_no_commit:

  db.add(subscription)

  # Выполняем flush, чтобы получить присвоенный первичный ключ
  await db.flush()

  # Не коммитим сразу, оставляем для пакетной обработки
2025-12-30 23:03:34 +03:00
gy9vin
56cc8bacf2 fix Простая покупка подписки
1. app/database/crud/subscription.py

  Объединены функции create_pending_subscription и create_pending_trial_subscription:
  - Добавлен параметр is_trial: bool = False в create_pending_subscription
  - create_pending_trial_subscription теперь просто вызывает create_pending_subscription(is_trial=True)
  - Сокращено ~75 строк дублированного кода

  Удалён лишний импорт:
  # Было внутри activate_pending_subscription:
  from sqlalchemy import and_  # Удалено — уже импортирован на уровне модуля

  2. app/handlers/subscription/purchase.py

  Устранено дублирование функций:
  - Удалены определения _calculate_simple_subscription_price() и _get_simple_subscription_payment_keyboard() (~75 строк)
  - Добавлен импорт из app.handlers.simple_subscription

  from app.handlers.simple_subscription import (
      _calculate_simple_subscription_price,
      _get_simple_subscription_payment_keyboard,
  )

  Итого сокращено: ~150 строк дублированного кода
2025-12-30 22:56:24 +03:00