Главная / Журнал изменений
Журнал изменений
Хронология релизов Bowl.kz: новые модули, изменения логики и исправления.
v2.36.0
Текущая 21.09.2026
Мобильная адаптация: порядок блоков, iOS автозум на полях ввода, удобство работы с таблицами
- Правки в общем файле стилей (app.css) + один файл сайдбара админки (_sidebar.php, используется на всех 69 страницах админки) — эффект сразу на всех страницах, без риска для остальной логики. (1) iOS Safari зумил всю страницу при тапе на любое поле ввода с font-size меньше 16px — на мобильном теперь все поля минимум 16px, автозум пропадает. (2) Первая колонка широких таблиц (счёт по играм, гандикап и т.п.) теперь "прилипает" при горизонтальном скролле, чтобы не терять из виду, чей это результат. (3) Числовые поля ввода в таблицах увеличены для удобства попадания пальцем. (4) Порядок блоков на мобильном: сайдбар админки/личного кабинета раньше шёл ПЕРВЫМ и его приходилось пролистывать целиком (20-30 пунктов меню), чтобы добраться до самой формы/таблицы — теперь контент показывается первым, а меню админки сворачивается за кнопку "☰ Меню раздела" под ним.
v2.35.0
09.09.2026
Дизайн-аудит: отклик на нажатие, уважение к reduced-motion, типографика
- Правки только в общем файле стилей (app.css), без изменений в HTML/PHP — эффект сразу на всех страницах сайта. (1) Добавлена визуальная реакция на сам факт нажатия (:active) у кнопок, ссылок меню и кеглей — раньше была только реакция на :hover, которая почти не работает на тачскрине, кнопки казались "мёртвыми" при тапе. (2) Добавлена поддержка prefers-reduced-motion — крутящаяся точка LIVE и все переходы теперь отключаются для тех, кто попросил у ОС меньше движения. (3) Крупным заголовкам (18px+) задан более плотный межстрочный интервал и лёгкий отрицательный трекинг, мелким подписям (9-11px) — чуть более свободный трекинг для читаемости — раньше все размеры шрифта наследовали один и тот же line-height вне зависимости от кегля.
v2.34.1
05.09.2026
Исправлен женский гандикап +8 — не применялся при исправлении пола игрока задним числом
- Найден скрытый баг в формуле "сохранить ручной гандикап, если он отличается от авто-значения": по факту она математически ВСЕГДА равнялась ранее введённому значению и не выполняла свою заявленную функцию — авто-гандикап по факту никогда не подставлялся заново при пересохранении, что было особенно заметно, если игрока сначала создали как гостя без пола (кнопка "+ Новый — вписать ФИО"), а пол поправили уже потом в его карточке: гандикап так и оставался 0. Исправлено во всех форматах лиг (одиночный, группы А/Б). Дополнительно добавлен авто-гандикап и для КОМАНДНОГО формата — раньше там он был полностью ручным и не учитывал пол игрока вообще. Существующие туры с неверным гандикапом нужно один раз пересохранить (открыть тур → «Сохранить тур») — тогда значения пересчитаются.
v2.34.0
05.09.2026
Исправлена критическая ошибка 500 при сохранении тура лиги (дубль игрока)
- Причина: при сохранении тура один и тот же игрок иногда оказывался в форме дважды (например, уже был подтянут автоматически из заявок личного кабинета, и тот же игрок ещё раз добавлен вручную через "+ Добавить участника") — вторая запись падала с ошибкой БД "Duplicate entry" (уникальный ключ league_id+player_id+tour), и сайт отдавал HTTP 500. Хуже того: удаление старых данных тура и повторная вставка не были одной транзакцией — при сбое вставки старые результаты уже стирались, а новые сохранялись частично, то есть тур мог потерять данные. Теперь: (1) повторяющийся игрок автоматически отбрасывается перед сохранением, с предупреждением админу в сообщении об успехе; (2) вся операция (удаление + вставка) — одна транзакция, при любой ошибке всё откатывается назад и старые данные тура остаются нетронутыми, вместо фатальной страницы 500.
v2.33.2
01.09.2026
Исправлена ошибка "Отсутствует поле location" в структурированных данных турниров
- Google Search Console помечал страницы турниров как критическую ошибку в разметке "Мероприятия" из-за отсутствия поля location. Причина: у турниров с незаполненным полем "Город" блок location в JSON-LD полностью пропадал из разметки (вместо пустого значения). Теперь location всегда присутствует (с запасным значением на уровне страны, если город не указан). Поле "Город" в форме турнира также сделано обязательным, чтобы это не повторялось для новых турниров.
v2.33.1
28.08.2026
Восстановлена функциональность, случайно откаченная в предыдущем релизе
- В fix229 форма ручного добавления участника, поле "Взнос" и редактор сетки турнира (добавленные ранее в fix226) были случайно откачены назад из-за рассинхронизации рабочих файлов. Всё восстановлено и объединено с новой функцией удаления участника из fix229 — теперь работает вместе в одном пакете.
v2.33.0
28.08.2026
Возможность полностью удалить участника из турнира
- "Отклонить" заявку раньше только меняло статус на "Отклонена", но запись оставалась в списке участников навсегда — не было способа реально убрать игрока (например, если добавили не того вручную или образовался дубликат). Добавлена кнопка "🗑 Удалить" в разделе «Заявки» турнира — полностью удаляет запись из списка участников (необратимо, есть подтверждение). После удаления игрок снова появляется в выпадающем списке для ручного добавления.
v2.32.2
26.08.2026
Исправлен формат номера версии в журнале изменений
- В двух предыдущих релизах в поле версии по ошибке попал внутренний номер пакета доставки (fix226/fix227) вместо номера версии сайта — из-за этого футер и страница /changelog показывали "vfix227". Записи исправлены на корректный формат (v2.32.0, v2.32.1). Впредь номер версии в журнале изменений всегда будет в формате vX.Y.Z, а внутренний номер фикса доставки — только для нашей внутренней нумерации пакетов, наружу не показывается.
v2.32.1
25.08.2026
Исправлен расчёт средних/лучших результатов на главной странице
- "Средний" (общий и по полу) теперь считается ТОЛЬКО по квалификации турнира (без плей-офф) — чтобы не смешивать разные форматы финалов (сетка на вылет, лесенка, раунд-робин и т.п.) в одну цифру. "Лучший результат"/колонка "Игра" теперь считается по ВСЕМУ турниру (квалификация + плей-офф) — раньше игры, забитые в плей-офф, не попадали в этот показатель, из-за чего у призёров в таблице "Подиум" могла быть указана игра выше заявленного "рекорда турнира". Также в таблице "Подиум" колонка "Avg" теперь считается той же логикой, что и заголовочный показатель (3 лучших блока квалификации, если у турнира есть блоки) — раньше два числа для одного и того же игрока могли не совпадать. Добавлены подписи/тултипы, поясняющие пользователям происхождение цифр.
v2.32.0
25.08.2026
Взнос за участие, ручное добавление участников и админ-редактор сетки турнира
- Добавлено поле "Взнос" в форму турнира и на публичную страницу (блок «Информация»). В разделе «Заявки» турнира теперь можно вручную добавить участника (для случаев, когда игрок не смог зарегистрироваться сам) — сразу со статусом «Подтверждена». Добавлена новая страница «Сетка» в админке турнира: показывает Отбор/Четвертьфинал/Полуфинал/Матч за 3-е место/Финал по стадиям, позволяет вручную создавать и удалять матчи в каждой стадии, а также запускать автогенерацию сетки и сборку следующего раунда — как и раньше.
v2.31.2
22.08.2026
Официальный рейтинг: переимпорт с исправлениями + исключены нерезиденты + честная нумерация
- Прошлый ручной перенос данных содержал пропуски (например, у Сазонова Юрия не хватало результата КБТ1-2025). Данные перепроверены построчно по чистой выгрузке таблицы и занесены заново (старые записи по этим 7 турнирам удаляются перед повторной вставкой — можно перезапускать сколько угодно раз безопасно). Из официального рейтинга исключены нерезиденты РК (Санкт-Петербург, Ташкент, Москва и т.п. — список можно расширить). Убрана путаница с "задвоенными" номерами мест при фильтре "Все" — места у мужчин и женщин считаются по Положению отдельно, поэтому при показе обоих полов вместе теперь простой порядковый номер строки, а настоящее место в рейтинге видно только при выборе конкретного пола.
v2.31.1
22.08.2026
Официальный рейтинг: исправлен парный зачёт, импортирована история 2024-2025
- recalcFederationRating() ошибочно суммировала ВСЕ результаты игрока подряд, включая "Парный зачёт" — по Положению пары/тройки/команды считаются ОТДЕЛЬНЫМ рейтингом, не суммируются с личным. Теперь берутся только турниры формата singles. Импортированы 7 турниров за 2024-2025 год (КБТ4-2024, 25 ЧРК, КБТ1-2025, 26 КРК, КБТ3-2025, КБТ4-2025, 26 ЧРК) с полными результатами из эталонной таблицы Федерации — раньше на сайте были только 4 турнира 2026 года, из-за чего у игроков с историей 2024-2025 просто неоткуда было взять полные "6 лучших из 11". После импорта — полный пересчёт официального рейтинга и мест для всех.
v2.30.1
22.08.2026
Главный судья: прямое поле в форме турнира вместо отдельного действия
- Причина бага "выбрал судью, сохранил — при повторном открытии пусто": назначение судьи было отдельной формой с собственной кнопкой "Добавить" (route /admin/tournaments/{id}/referees), никак не связанной с основной кнопкой "Сохранить" турнира — путаница была неизбежна. Теперь "Главный судья" — прямое поле выбора игрока в основной форме турнира, сохраняется вместе со всеми остальными полями по кнопке "Сохранить". "Спорные ситуации" на публичной странице теперь берётся именно из этого поля напрямую (с запасным вариантом на старый механизм для уже существующих турниров). Старая секция "Судьи турнира" переименована в "Дополнительные судьи" (зам. главного судьи и т.п.) и убрала опцию "Главный судья" из списка ролей, чтобы не дублировать.
v2.29.1
22.08.2026
Хотфикс: /ratings падал с 500 после прошлого обновления
- В подзапросе для подсчёта общего числа игроков во вкладке "По среднему счёту" HAVING ссылался на games_count, который в этом конкретном подзапросе не был выбран/назван (SQL-ошибка "Unknown column"). Добавлен COUNT(sg.id) AS games_count в подзапрос.
v2.29.0
22.08.2026
Исправлена главная страница рейтинга /ratings: настоящий рейтинг по среднему + чистка пустых мест
- По умолчанию /ratings показывал "Любительский (Bowl.kz)" — на деле это матчевый рейтинг (только победы 1×1 в сетках турниров), никак не связанный со средним счётом. Хуже того, recalcRatingRanks() присваивала место КАЖДОМУ активному игроку, включая тех, у кого 0 побед и 0 поражений (тестовые/неактивные аккаунты наравне с реальными игроками без личных матчей 1×1). Добавлена новая вкладка "🎳 По среднему счёту" (реальный средний по неофициальным играм, от 3 игр) — теперь она первая и открывается по умолчанию. Вкладка "Матчевый" переименована честно, получила предупреждение о том, что она не отражает уровень игры, и больше не показывает аккаунты без единого засчитанного матча — как в самой выдаче, так и на уровне recalcRatingRanks() (им присваивается NULL, а не произвольное место). Разовый скрипт clean_empty_rating_ranks.php чистит уже накопившиеся "пустые" места сразу.
v2.28.0
22.08.2026
История рейтингов встроена в профиль игрока (вкладка "Рейтинг")
- Убрана отдельная страница /players/{slug}/rating-history — история начисления теперь прямо в существующих вкладках профиля (Сессии/Достижения/Турниры/История + новая "Рейтинг"), без перехода на отдельную страницу. Вкладка объясняет все ТРИ независимые системы рейтинга на сайте: 1) матчевый (badge "Рейтинг #N" в шапке — очки за победы 1×1 в личных матчах турнирной сетки, список последних матчей со ссылкой на турнир), 2) официальный (сумма очков за 6 лучших из последних 11 турниров КНФБ, список турниров с пометкой "учтено"/"не вошло"), 3) неофициальный (средний по лиге/тренировкам, последние 60 игр со ссылкой на конкретный тур лиги). Верхний badge и оба блока средних теперь кликабельны и ведут на эту вкладку.
v2.27.0
22.08.2026
История начисления рейтинга — клик на любой рейтинг в профиле
- Новая страница /players/{slug}/rating-history — оба блока рейтинга на профиле игрока (официальный и неофициальный) теперь кликабельны. Официальный: список всех турниров за последние 11, вошедших в зачёт (6 лучших по очкам, ×1.5 за комплексный турнир выделены зелёным) — с прямой ссылкой на страницу каждого турнира. Неофициальный: список последних 60 засчитанных игр (лига/тренировка/товарищеская) с датой и счётом — с прямой ссылкой на конкретный тур лиги, если игра оттуда.
v2.26.1
22.08.2026
Ограничение по городу распространено на команды и КНФБ-разделы
- Ограничение по городу (см. предыдущий фикс) теперь также действует на: команды (/admin/teams — редактирование, сохранение, список показывает только команды своего города, массовая деактивация по паттерну не затрагивает чужие города), региональные отделения КНФБ (редактирование/сохранение/удаление конкретного отделения — своего города), члены федерации, привязанные к региональному отделению (национальный состав без привязки к региону не ограничивается — он не привязан к городу в принципе). Как и раньше, admin не ограничен никогда, пустое ограничение = полный доступ по роли.
v2.25.4
21.08.2026
Разобрана путаница рейтингов: официальный vs неофициальный, теперь везде явно
- Найдена корневая причина непонятных цифр на странице турнира: колонки "Avg" и "Рейтинг" в списке участников показывали ОБЩИЙ средний по всем играм сайта (avg_score) и МЕСТО ПО КОЛИЧЕСТВУ ПОБЕД В ЛИЧНЫХ МАТЧАХ турнирной сетки (rating_points/rating_rank) — метрику, вообще не связанную со средним результатом или официальным статусом игрока, из-за чего у игроков с меньшим средним могло быть "лучше" место. Для официального турнира КНФБ это в принципе не та цифра. Заменено на официальный рейтинг Федерации (federation_rating/federation_rank — сумма очков за 6 лучших из последних 11 турниров, отдельно у мужчин и женщин, ежегодно обнуляемая система по Положению КНФБ). На профиле игрока в обоих блоках (официальный/неофициальный) добавлено явное место в соответствующем рейтинге — раньше показывались только средний/лучшая игра/число игр, без номера места.
v2.25.3
21.08.2026
Загрузка документа турнира: проверка названия шла после загрузки файла
- Если поле "Название" оставалось пустым при добавлении документа турнира, файл всё равно успевал загрузиться и физически сохраниться на сервере — но запись о нём в базу так и не создавалась, потому что код прерывался на проверке названия ПОСЛЕ загрузки файла. Файл, который уже некуда было привязать, оставался бесхозным на диске. Проверка названия перенесена в начало — теперь если название не указано, файл вообще не трогается, ошибка ясна сразу.
v2.25.2
21.08.2026
Место в рейтинге не пересчитывалось для игроков без турнирных матчей
- recalcRatingRanks() вызывалась только после засчитанного матча турнирной сетки (победа/поражение 1×1) — игроки, играющие только лигу/тренировки (сколько бы игр ни было), никогда не попадали в пересчёт и оставались с rating_rank = NULL навсегда. Теперь пересчёт запускается и после модерации любой игровой сессии. Разовый скрипт fix_rating_ranks_now.php пересчитывает всех прямо сейчас, не дожидаясь следующей модерации.
v2.25.0
20.08.2026
Турниры: судьи, организаторы, характеристики зала, документы прямо в форме
- Форма создания/редактирования турнира дополнена: организатор и соорганизатор (выбор из игроков с рабочей ссылкой на профиль, либо просто текстом), характеристики боулинг-центра (дорожки, покрытие, пиндеки, пинсеттеры, кегли, счётная система) и обслуживания (машина для намазки, кондиционер, очиститель, программа масла). При редактировании (после создания) — управление судьями турнира (выбор из игроков + роль: Главный судья / Зам. главного судьи / Судья) и документами (загрузка PDF регламента или внешняя ссылка). Всё показывается в блоке "Информация" на публичной странице турнира, включая "Спорные ситуации: Гл. судья турнира [ссылка на профиль]" — определяется автоматически по судье с ролью "Главный судья". Довозаполнены данные турнира "Чемпионат города Астана" по регламенту.
v2.24.0
20.08.2026
Профиль: турниры из импортированных результатов + ближайшие турниры на главной
- Раздел "Турниры" на профиле игрока смотрел только в tournament_players (формальная заявка на сайте) — турниры, данные которых заливались разовыми импорт-скриптами (например XXVII Кубок РК), не создавали такую запись и потому не появлялись в профиле, хотя игрок реально участвовал. Теперь список объединяет все источники участия: заявку, квалификацию, раунд робин и официальные результаты. На главной странице в блоке "Ближайшие матчи" добавлены ближайшие турниры (регистрация открыта или анонс, дата в будущем) — раньше блок показывал только отдельные матчи внутри уже сформированной сетки, из-за чего новый турнир без сетки был не виден на главной вообще.
v2.23.0
20.08.2026
Подтверждение заявок на турнир, документы турнира, фикс блока команд у синглс
- Найден и исправлен баг: блок "Командные результаты" показывался на страницах ЛЮБОГО формата турнира без бракета/плей-офф (в том числе синглс), потому что был веткой "иначе" условия про наличие сетки, а не проверкой формата — теперь синглс без сетки показывает нейтральное "сетка появится после квалификации". Заявки на турнир больше не засчитываются автоматически — статус "На рассмотрении" по умолчанию, новая страница /admin/tournaments/{id}/applications с подтверждением/отклонением каждой заявки (с необязательной заметкой, например про оплату взноса) — то, что нужно при ручной проверке платежей. Добавлены документы турнира (полный регламент, доп. файлы) — загрузка PDF или внешняя ссылка, показываются на публичной странице турнира и управляются с той же страницы заявок.
v2.22.0
20.08.2026
Ограничение регистрации на турнир + создан Чемпионат города Астана
- Новая возможность для турниров: ограничить регистрацию только действующими членами Федерации (взнос оплачен) и/или только определённым городом — настраивается галочкой и полем в форме турнира, игрок видит понятное объяснение вместо тихого отказа при попытке подать заявку. Создан турнир "Чемпионат города Астана" (29-30 августа 2026, PINGWIN PREMIUM) по регламенту — синглс с разделением по полу, формат "степледдер" (для справки, финальная стадия в 3 этапа вносится вручную — автоматического движка именно под такую сетку в системе нет), ограничение регистрации на членов Федерации Астаны. Опубликована новость с анонсом.
v2.20.1
17.08.2026
Победители тура: команды вместо личных результатов в командном формате
- Блок "Туры" на странице лиги и "Таблица лиги" на главной странице показывали топ-3 победителей всегда как плоский список ИНДИВИДУАЛЬНЫХ игроков, даже если тур проводился в командном формате — не было отдельной ветки для named-групп (Команда 1, Команда 2 и т.п.), только А/Б и общий плоский список. Теперь: тур определяется как командный, если его группы не А/Б и не единая ALL (одиночный), считается сумма КОМАНДЫ и показываются топ-3 команды с полным составом участников — в обоих местах.
v2.20.0
17.08.2026
Время жизни слайдов/баннеров, бейдж модерации сессий, цвета сертификатов
- Слайды на главной и странице календаря, а также рекламные баннеры теперь можно снабдить датой "висит до" — после неё сами перестают показываться, без ручного выключения. Пусто = как раньше, бессрочно. Бейдж уведомлений в сайдбаре теперь показывает количество сессий, ожидающих модерации на /admin/sessions (счётчик уже был живым запросом по статусу pending — просто не был подключён к системе бейджей, поэтому не показывался). Просмотр сертификатов уже был доступен по клику на название в списке — уточняю на будущее, если нужно что-то другое. Добавлена возможность менять цвета оформления диплома/сертификата/благодарственного письма (акцентный + цвет рамки) через /admin/settings/certificates — применяется сразу ко всем, включая уже выданные документы.
v2.19.4
17.08.2026
Публичная страница тура: чистые и зачётные итог/средний видны всем
- На публичной странице тура (/league/{slug}?tour=N) колонка "Итого" раньше молча показывала уже зачётный результат (с гандикапом), а чистого нигде не было видно вообще. Теперь явно две пары колонок: "Итого"/"Ср." — чистый результат без гандикапа, "Зачёт"/"Ср.З" — с учётом гандикапа (выделены синим). Данные уже выбирались запросом, правка только вёрстки — доступно сразу всем посетителям, без входа в систему.
v2.19.3
17.08.2026
Командный формат: показ чистого и зачётного (с гандикапом) итога/среднего
- Таблица команд в туре теперь показывает 4 колонки вместо 2: "Итого (чист.)" и "Ср. (чист.)" — без гандикапа, "Зачёт" и "Ср.З" — с учётом гандикапа. Раньше видно было только чистые цифры, хотя реальный зачёт (используемый и в сумме команды, и в рейтинге туров) считался с гандикапом "под капотом" без визуального подтверждения. Пересчитывается вживую при вводе игр/гандикапа, как уже работало в групповом формате.
v2.19.1
15.08.2026
Статусы тура лиги на главной по фиксированному расписанию
- Ссылки на последний тур лиги в блоке "Ближайшие матчи" теперь показывают статус по фиксированному расписанию (воскресенье 9:30-12:00): "Регистрация открыта" — до 18:00 накануне; "Регистрация завершена" + таймер обратного отсчёта до 9:30 — с 18:00 накануне до старта; "Идёт сейчас" — с 9:30 до 12:00; "Завершён" — после 12:00. Также исправлен текст-заглушку "Нет ближайших матчей" — теперь показывается только когда нет ни туров лиги, ни матчей турниров одновременно (раньше показывался даже при наличии тура лиги выше).
v2.19.0
15.08.2026
Главная: ссылка на последний тур лиги в блоке "Ближайшие матчи"
- В блок "Ближайшие матчи" на главной странице добавлены быстрые ссылки на последний тур каждой активной лиги (до 3 лиг), выделены цветом сверху списка — с названием лиги, номером тура и датой. Позволяет сразу перейти на актуальный тур с главной страницы, не заходя в раздел "Лиги".
v2.18.2
15.08.2026
SEO: расширенные данные (Article/SportsEvent), alt-теги, noindex на служебных страницах
- Добавлена структурированная разметка NewsArticle на страницах новостей и SportsEvent (с датами, местом проведения, статусом) на страницах турниров — оба типа поддерживаются Google для расширенных результатов поиска. Заполнены пустые alt-атрибуты у изображений на главной странице (иконки блока "О нас", фото игрока недели/месяца) — влияет на доступность и поиск по картинкам. Страницы входа/регистрации/восстановления пароля получили meta robots noindex — раньше полагались только на Disallow в robots.txt, что не гарантирует непоказ уже проиндексированной ранее страницы; noindex — более сильный сигнал.
v2.18.0
15.08.2026
SEO: структурированные данные, заголовки, ключевые слова, sitemap
- Добавлены JSON-LD структурированные данные сайта (SportsOrganization + WebSite с поиском) — помогает Google/Yandex понять тему сайта и показывать расширенные результаты. На главной странице впервые появился <h1> (его не было вообще) с ключевыми словами В sitemap.xml добавлены /knfb, /battles и страницы региональных отделений (раньше отсутствовали). В /admin/settings — новый блок "Подтверждение сайта в поисковиках": поля для кода Google Search Console и Яндекс.Вебмастера (без них сайт не может быть официально подтверждён владельцем в этих сервисах — это первый шаг, который нужно сделать вручную на самих сервисах, поля просто принимают код подтверждения).
v2.17.6
15.08.2026
Диагностика пропавших участников + живой поиск на /players
- Автоформирование команд: список выбранных ID теперь дедуплицируется (array_unique) — защита от задвоенной галочки на одном игроке. Если отмеченный ID не находится в базе вообще, в сообщение выводится явное предупреждение с конкретными ID, чтобы не терять человека молча. Если общее число участников не делится ровно на размер команды — теперь честно объясняется в сообщении, что одна команда получит на игрока больше/меньше (это математически неизбежно с 43 участниками при размере команды 3, не ошибка балансировки). На /players поиск по имени теперь живой — форма отправляется автоматически через 500мс после остановки печати, без нажатия кнопки "Найти".
v2.17.5
14.08.2026
Автоформирование команд: предотметка уже добавленных игроков
- Игроки, которые уже сейчас есть в командах тура, при открытии страницы автоматически отмечаются галочками в списке выбора — видно сразу, кто попал в состав, легко сравнить со своим списком и найти пропущенного. "Пересобрать команды" без единой правки теперь пересобирает ровно из текущего состава, а не улетает в резервный сценарий (записавшиеся на тур / весь состав лиги).
v2.17.4
14.08.2026
Автоформирование команд: честная балансировка змейкой, естественная сортировка, кнопка пересборки
- Алгоритм балансировки полностью переписан: раньше игроки без истории в этой лиге ВСЕ попадали в одну группу "новичков" — при большом числе новых игроков реального баланса не получалось (сильные могли оказаться в одной команде). Теперь у каждого игрока считается непрерывный "силовой балл" (средний в этой лиге, а если истории нет — общий рейтинг игрока) и раздача идёт классической "змейкой" (1,2,3...N,N...3,2,1) — сильные и слабые физически не могут скопиться в одной команде. "Осиротевшая" команда из 1 игрока (остаток от деления) больше не возникает — все распределяются по существующим командам. Сортировка команд исправлена на естественную (1,2,3...10, не строковую 1,10,11...2,3) — и в админке, и на публичной странице лиги до появления результатов. Добавлена колонка "Справ. ср." в каждой команде — показывает балл и источник (лига/общий рейтинг) для прозрачности решения. Кнопка формирования теперь доступна всегда (не только при пустых командах) — "🔄 Пересобрать команды" полностью заменяет текущий состав новым распределением, пока в туре нет результатов.
v2.17.4
14.08.2026
Автоформирование команд — отправка через AJAX (надёжно), История изменений — видно данные снимков
- Форма "Сформировать команды" переведена на явную отправку через fetch() вместо стандартной отправки браузером — полностью исключает любую путаницу с тем, какая форма на странице реально отправляется, независимо от структуры HTML. Кнопка "До/После — показать данные" на каждом снимке в "Истории изменений" — раскрывает таблицу со всеми игроками/счётом/командой на тот момент, чтобы можно было визуально сравнить состояния перед восстановлением.
v2.17.3
14.08.2026
Критический фикс: форма автоформирования команд была вложена в форму сохранения тура
- Форма "Сформировать команды" была вложена внутрь основной формы "Сохранить тур" — вложенные <form> в HTML не поддерживаются браузерами, из-за чего клик по "Сформировать команды" на самом деле отправлял ВНЕШНЮЮ форму (сохранение тура целиком), а не свою — отсюда сообщение "Тур сохранён — участников: 1" вместо ожидаемого результата и слетевшие галочки выбора игроков. Форма автоформирования вынесена в отдельный блок вне основной формы, видимость синхронизируется с выбором формата тура через JS (без переноса элементов в DOM).
v2.17.2
13.08.2026
Автоформирование команд: фильтр по городу
- В список выбора игроков для автоформирования команд добавлен выпадающий фильтр по городу (players.city) — работает вместе с поиском по имени. Рядом с именем каждого игрока в списке теперь виден его город.
v2.17.1
13.08.2026
Автоформирование команд: ручной выбор состава галочками
- Заявки с сайта не всегда поступают надёжно, поэтому в карточку "Автоматически сформировать команды" добавлен список всех активных игроков с чекбоксами, поиском по имени и кнопками "Выбрать всех (видимых)"/"Снять все". Если отметить хотя бы одного игрока — используется ТОЛЬКО ручной выбор. Если не отмечать никого — работает как раньше: сначала записавшиеся на тур, если пусто — весь активный состав лиги.
v2.17.0
13.08.2026
Автоформирование сбалансированных команд
- Новая кнопка "🎲 Автоматически сформировать команды" на странице тура (формат "Командный", показывается только пока в туре нет результатов). Берёт записавшихся на тур (или весь активный состав лиги, если записей нет), делит на группы А/Б по среднему ИМЕННО в этой лиге (без истории — считается новичком, группа Б), перемешивает каждую группу и распределяет по командам заданного размера (по умолчанию 3) пропорциональным чередованием — сильные и слабые игроки равномерно размазаны по всем командам. Составы сразу видны в форме админки и на публичной странице лиги — до начала игры. Данные сохраняются как обычные строки league_standings (без очков), поэтому дальнейший ввод результатов и авто-подсчёт топ-3 команд (fix174) работают без изменений.
v2.16.0
13.08.2026
Командный формат: подсчёт по команде и топ-3, убрана отдельная ссылка на КНФБ в футере
- Убрана отдельная ссылка "Официальный сайт КНФБ" из нижнего меню (осталась только /knfb — ссылка на официальный сайт есть на самой странице). Командный формат лиги (например, "трио" — команды по 3 игрока): раньше система показывала только индивидуальные результаты игроков внутри именованных команд, БЕЗ подсчёта суммы команды и БЕЗ ранжирования команд между собой — "Достижения" по ошибке пытались определить топ-3 среди игроков ВНУТРИ одной команды. Исправлено: на публичной странице лиги — блок "Топ-3 команды тура" с суммой очков, таблички команд отсортированы по месту с медалью и суммой в заголовке; в "Достижениях" места 1-3 теперь присваиваются ВСЕМ игрокам команд, занявших призовые места, по сумме зачётных итогов всей тройки. Поддержаны и 4 игры, и 3 игры + финальная (просто не заполняй игру 4 у тех, кто не играл финал — сумма команды учтёт только реально сыгранные игры).
v2.15.0
13.08.2026
Защита утверждённых результатов + история изменений с откатом, масляные профили
- Добавлены 10 масляных профилей (КРК-38, ENVOY HOUSE, LOGIC-1/2, NAVIGATOR-11, OPEN PLAY, PB3 PLASTIC, WHITE-1, BEATEN-2, KPK-43) — базовые поля, детали дозаполняются через /admin/oils. Защита данных: редактировать уже НЕ последний тур лиги теперь может только администратор (content_manager/referee — только текущий/новый тур). Аналогично для турниров — если турнир завершён и результаты по зачёту уже внесены, менять их может только admin. Перед КАЖДЫМ сохранением тура/результатов турнира автоматически сохраняется снимок предыдущего состояния (data_snapshots) — новая страница "История изменений" (кнопка на странице тура) показывает все снимки с датой/автором и кнопкой "Восстановить" (только admin), сам откат тоже создаёт снимок — можно вернуть обратно.
v2.13.0
11.08.2026
Хронология команд + достижения/рекомендации/сравнение туров в кабинете
- Раздел "Команды" на профиле игрока проверял только is_active записи ИГРОКА в команде, не саму команду — разовые турнирные команды (КБТ и т.п.), деактивированные целиком через /admin/teams, всё равно показывались как "текущие". Переписан: явный "Текущий статус" (в команде / не в команде) + полная хронология с датами вступления/выхода для каждой команды. Также обнаружено и докручено: система достижений (player_milestones) была подключена лишь частично — функции существовали, но нигде не вызывались и не отображались в личном кабинете. Теперь при сохранении тура лиги реально фиксируются: личный рекорд игры, личный рекорд среднего, круглые цифры туров, места 1-3 (с защитой от дублей при пересохранении). В личном кабинете — блоки "Достижения", "Тур к туру" (сравнение зачётного среднего последних двух туров лиги) и "Рекомендации" (сравнение среднего за 5 игр с обычным результатом).
v2.12.0
11.08.2026
Уведомления, фото, статус онлайн, матрица доступов, удаление туров, /rules и /knfb ссылки
- Бейдж "новые пользователи" больше не залипает — сбрасывается по факту захода на /admin/users, а не считает скользящее окно 7 дней. "Руководитель" переименован в "Председатель" на страницах КНФБ. Исправлен показ фото вместо инициалов на обзоре админки, в списке игроков и списке пользователей (запросы не подтягивали photo). Добавлен статус "В сети/Не в сети" (last_active_at, обновляется не чаще раза в 2 минуты) — на профиле игрока и в списке пользователей. Матрица доступов: исправлен реальный баг (/admin/settings был по ошибке привязан к той же галочке, что "Баннеры" — слишком широкий доступ к чувствительным настройкам), добавлены отсутствовавшие /admin/certificates и /admin/intercity (были на 403 для всех, кроме админа). Добавлена массовая деактивация разовых команд на /admin/teams. Добавлена кнопка удаления тура целиком на /admin/leagues/{id}/tours (с защитой: тур с уже введёнными результатами может удалить только admin) + предупреждение о возможном дубле при создании тура на дату, где уже есть другой тур. Футер и страница /knfb теперь ссылаются на официальный сайт bowlingfederation.kz. Страница /rules получила блок-разграничение: практические правила Bowl.kz vs официальные регламенты КНФБ, со ссылками на /knfb и официальный сайт.
v2.11.0
11.08.2026
КНФБ: структура админки, документы, логотип, автозаполнение по городу
- Довершён fix168 (статус "Член Федерации" на профиле игрока) — helpers.php, роуты и вьюшка профиля пропатчены. Все разделы КНФБ в админке сведены в один пункт меню "КНФБ" (было раскидано по "Соревнования" и "Сайт"). Добавлен раздел "Документы КНФБ" (устав/правила/программы развития/положения) — PDF-файл на сайт или внешняя ссылка на источник. Добавлен логотип КНФБ (/admin/settings/knfb), показывается в шапке /knfb. Новая кнопка "Заполнить составом из игроков города" на странице регионального отделения — берёт активных игроков по полю city в профиле и по факту участия в турнирах этого города, без дублей.
v2.10.2
11.08.2026
Статус "Член Федерации" на профиле игрока — по членству и оплате взноса
- Добавлена таблица federation_dues (ежегодный взнос по игроку/году). Новая функция isFederationMemberActive($playerId) — true только если игрок есть в federation_members (категория "player", активен) И у него есть отметка об оплате взноса за ТЕКУЩИЙ год. Новый контроллер Admin/FederationDuesController — отметить/снять оплату взноса за год. См. FIX_INSTRUCTIONS.md — 4 небольшие ручные правки в существующих файлах (routes.php, PlayerController.php, профиль игрока, форма редактирования члена Федерации), которые нужно внести вручную, так как рабочее окружение потеряло локальную копию этих файлов для точечной автоправки.
v2.10.1
11.08.2026
Неофициальный рейтинг на /players засчитывал плей-офф турниров
- Официальный/неофициальный рейтинг на /players разделялся фильтром session_type = tournament / != tournament — но плей-офф-сессии (fix150, восстановление сетки КБТ III) сохраняются с session_type = playoff, отдельно от квалификации. Игроки, у которых были только квалификация (tournament, корректно исключена) и плей-офф (playoff, не был исключён), попадали в "Неофициальный рейтинг" — хотя все их игры были частью официального турнира. Исправлено в 5 местах PlayerController.php: официальный рейтинг и профильная статистика теперь считают tournament И playoff как единое "официальное", неофициальный — явно исключает оба.
v2.10.0
11.08.2026
КНФБ: контент, выбор игрока из списка, региональные отделения
- Форма добавления участника /admin/federation/create теперь предлагает выбрать игрока из выпадающего списка (с автозаполнением имени) вместо ручного ввода ID — ссылка на профиль формируется сама. Добавлен блок "О Федерации" (текст + миссия), редактируется в /admin/settings/knfb. Новая сущность "Региональные отделения" (Алматы, Астана, Атырау и т.п.) — своя страница /knfb/{город} с руководителем (из профилей игроков) и составом, полный CRUD в /admin/regional-federations. Главная страница /knfb теперь показывает блок "О Федерации", список региональных отделений со ссылками, и национальное руководство/состав отдельно.
v2.8.0
09.08.2026
Роли и матрица доступов пересобраны — реально работающая система
- Разделы /admin/news, /admin/slider, /admin/partners и /referee жили на отдельных захардкоженных middleware (ContentManagerMiddleware/RefereeMiddleware), которые проверяли роль напрямую и матрицу доступов фактически игнорировали для любых ролей, кроме content_manager/referee — поэтому новые роли вроде "Сотрудник Федерации" не получали доступ, даже если галочка была включена. Все админ-разделы переведены на единый AccessMatrixMiddleware. Добавлена возможность создавать новые роли прямо на странице /admin/access-matrix (техническое имя + название) — сразу появляются колонкой в матрице и в списке ролей на /admin/users, без правки кода. Встроенные роли (content_manager/referee/federation_staff) переименовать/удалить нельзя, свои — можно, если на них никто не назначен. Добавлен разовый скрипт-предохранитель для переноса уже сохранённых прав content_manager/referee в новую систему без потери доступа.
v2.7.4
09.08.2026
Дата тура при массовом добавлении участников — по расписанию, не "сегодня"
- Кнопка "+ Добавить всех участников лиги" (bulkAdd) записывала tour_date как date('Y-m-d') — дату нажатия кнопки, а не дату самой игры. Если организатор готовил список заранее (за несколько дней до воскресенья), дата тура замораживалась на дне подготовки и оставалась неверной при всех последующих сохранениях, так как форма подставляет уже сохранённую дату. Теперь используется nextTourFromSchedule() по расписанию лиги — та же логика, что уже применяется при самостоятельной записи игрока на тур.
v2.7.3
09.08.2026
Переписан расчёт очков для группового формата — убрана хрупкая многоступенчатая передача данных
- Очки за места в группе (для форматов СинглСпорт/Бекер/Микс) считались через промежуточную отсортированную копию массива ($sorted) и отдельный проход для переноса значений обратно — это давало 0 очков всем участникам тура при выявленной проблеме. Переписано: гандикап и очки теперь считаются в одном проходе, с прямой записью по индексу в исходный массив ($parsed[$grp][$idx][...] = ...) без промежуточных копий и foreach-by-reference — структурно устраняет весь класс ошибок с потерей привязки данных между проходами.
v2.7.2
09.08.2026
Гандикап: убрана новичковая/спортивная логика, остался только женский +8
- Новичковый (+15 на первые 4 тура) и спортивный (по формуле от среднего) гандикап работали непоследовательно в зависимости от истории туров игрока — по прямому запросу убраны полностью. Теперь calculateSinglesHandicap() начисляет только фиксированный женский гандикап (+8 по умолчанию, настраивается в лиге), одинаково для всех вне зависимости от стажа. Также при этой правке найдена и устранена критическая находка: в файле helpers.php осталась "осиротевшая" строка кода после удаления старой логики, которая грозила полностью оборвать выполнение файла на каждом запросе — исправлено до деплоя.
v2.7.1
09.08.2026
Критический фикс: авто-запись на тур не проставляла формат
- При автосоздании строки тура через "Участвовать" (v2.7.0) поле format оставалось NULL. Форма ввода тура определяет формат по последней сохранённой строке этого тура — при NULL она по умолчанию показывала "Одиночный", из-за чего для лиг с другим форматом (Астана — СинглСпорт) авто-гандикап молча не срабатывал ни при каком редактировании данных игрока. Теперь новая строка получает format последнего реально использованного тура этой лиги. Добавлен разовый скрипт backfill_league_standings_format.php для исправления уже созданных с этим багом строк (например, тур 4).
v2.7.0
04.08.2026
Автосоздание туров, Битва Городов в Турнирах, страница КНФБ, новая роль
- Запись на тур ("Участвовать") теперь сразу создаёт реальную строку в league_standings, а не только заявку — тур появляется сам, без ручного создания администратором. Битва Городов перенесена из отдельного пункта меню в раздел "Турниры" (бейдж на карточках + прямая ссылка на /battles). Добавлен переключатель "Медиа на главной" в /admin/slider — временно скрывает блок без удаления слайдов. Новости: правый блок рядом с главной новостью теперь показывает 6 последних новостей с превью (раньше дублировал единственную главную). Новая роль "Сотрудник Федерации" — подключена к существующей матрице прав (/admin/access-matrix), можно дать доступ к разделам Турниры/Новости без доступа к Лигам. Новая страница /knfb (ссылка в футере) — сотрудники, организаторы и члены Федерации, управляется через /admin/federation.
v2.6.0
04.08.2026
Сертификаты, дипломы, благодарственные письма
- Новая система наград: /admin/certificates — выдача сертификата/диплома/благодарственного письма вручную любому игроку, и авто-выдача дипломов I/II/III степени по местам 1-3 турнира одной кнопкой (без дублей при повторном нажатии). Оформление (логотип, до 2 подписей с ФИО/должностью/картинкой, до 4 спонсорских логотипов) настраивается в /admin/settings/certificates — пока используются заглушки, можно заменить в любой момент без переделки кода. Сертификат — печатная HTML-страница (A4 альбомная, декоративная рамка) на /certificate/{id}, доступна владельцу и админам, кнопка "Скачать/Печать" вызывает системный диалог печати браузера. В личном кабинете — новый раздел "Мои награды" со списком всех полученных сертификатов.
v2.5.0
03.08.2026
Новости: привязка к лиге/туру + свободная категория
- В форму новости добавлена привязка к лиге и (необязательно) конкретному туру — на странице новости появляется кнопка "Участвовать" со ссылкой прямо на этот тур, аналогично уже существующей привязке к турниру. Категория новости больше не ограничена жёстким списком — теперь это поле со свободным вводом и подсказкой (datalist) из уже использованных категорий, можно выбрать существующую или сразу вписать новую.
v2.4.11
02.08.2026
Подиум турнира на главной — учитывает и плей-офф, не только квалификацию
- Виджет "Подиум (единый зачёт)" на главной странице считал Avg/Игра только по квалификационным сессиям (session_type=tournament) — если призёр вошёл в турнир не через квалификацию (например, по wildcard от региона) и играл только в плей-офф, у него показывался прочерк вместо реального результата. Теперь этот конкретный виджет смотрит и на квалификацию, и на плей-офф. Остальные виджеты (лучший общий средний по турниру, лучшая игра турнира) намеренно не тронуты — там речь именно про квалификацию.
v2.4.9
02.08.2026
Таблица ввода тура: снят потолок ширины страницы, шире Игрок/Игра
- Причина того, что колонки продолжали сжиматься при добавлении новых (Зачёт, Ср.З) — вся страница была ограничена max-width:1100px. Увеличено до 1650px. Дополнительно расширены колонки "Игрок" (200px -> 230px, фамилия с именем теперь помещаются) и "Игра 1-4" (70px -> 76px). Ни один столбец не убирался — все (включая Штраф) остались на месте, просто теперь помещаются.
v2.4.8
02.08.2026
Новая колонка "Ср.З" — средний с учётом гандикапа
- "Ср." всегда показывал чистый (scratch) средний, без гандикапа — это осознанно, т.к. спортивный гандикап сам считается от чистого среднего. Но для наглядности добавлена соседняя колонка "Ср.З" — средний с учётом гандикапа (Зачёт / кол-во игр), обновляется вживую при вводе очков, как и остальные расчётные колонки.
v2.4.6
02.08.2026
Критический фикс: сортировка тура в админке не учитывала гандикап
- Таблица ввода тура в админке сортировалась по чистому счёту (Итого без гандикапа), а не по зачётному результату (счёт + гандикап) — из-за этого визуальный порядок строк в группах с гандикапом (женщины, новички) не совпадал с реальными зачётными местами на публичной странице и в очках. Организатор мог вручную определять призёров по неверному порядку. Исправлено: сортировка теперь идёт по зачётному результату, как и везде на сайте. Также добавлена колонка "Зачёт" в таблицу ввода тура — показывает итоговый результат с учётом гандикапа прямо рядом с чистым счётом, обновляется вживую при вводе очков.
v2.4.5
01.08.2026
Список участников тура не сворачивается, пока нет результатов
- Список игроков на странице тура сворачивался до топ-3 всегда, даже если тур ещё не игрался (все "топ-3" получались случайно по порядку добавления, при total=0 у всех). Теперь список сворачивается до топ-3 только если в туре реально ЕСТЬ хоть один результат — для ещё не сыгранного тура (например, только что созданного со списком записавшихся) весь список виден сразу, без кнопки "Развернуть".
v2.4.3
31.07.2026
Формат "группы": авто-очки по местам, скрыты Пара/Очки, шире Г
- Для формата тура "группы" (Бекер/СинглСпорт/Микс/легаси А-Б) авто-движок регламента теперь считает не только гандикап, но и очки — по месту внутри группы (1е/2е/3е/4-5е/участие), той же логикой, что и для singles-лиг. Раньше очки для этого формата всё ещё считались по старой системе "победа-ничья-поражение" через номер пары. Столбцы "Пара" и "Очки" скрыты в форме ввода тура при включённом авто-регламенте (use_auto_regulation=1) — они не нужны, когда всё считается автоматически; остаются видимыми только если авто-режим выключен в настройках лиги. Также расширена колонка "Г" (было слишком узко для трёхзначных чисел вроде 23).
v2.4.2
31.07.2026
Сетка турнира скрыта без данных + список участников из квалификации
- Раздел "Сетка турнира" (Четвертьфинал/Полуфинал/Финал) больше не показывается вечным "ожидается" для турниров формата квал -> раунд робин без отдельного плей-офф — вкладка и блок появляются только если реально есть сыгранные матчи или лесенка отсева. Также добавлен запасной источник списка участников: если явок через личный кабинет (tournament_players) нет, список берётся прямо из данных квалификации (game_sessions) или квалификации парного зачёта (tournament_doubles_qualification) — участники теперь видны на странице турнира, даже если весь турнир был внесён протоколом задним числом.
v2.4.1
31.07.2026
Публичное отображение квалификации, Раунд Робина и парной квалификации
- Квалификация XXVII Кубка РК теперь отображается на странице турнира через уже существующий механизм game_sessions/session_games — тот же рендерер, что и для других официальных турниров сайта. Добавлена новая вкладка "Раунд Робин" (топ-8 муж/жен, счёт по играм + бонусы win/tie/200+/250+) и вкладка "Квалификация (пары)" на странице турнира парного зачёта — счёт общий на пару. Новая таблица tournament_doubles_qualification.
v2.4.0
31.07.2026
XXVII Кубок РК — Астана 2026: полные результаты турнира
- Добавлены таблицы tournament_qualification и tournament_round_robin для хранения игра-за-игрой результатов официальных турниров формата "квалификация -> раунд робин". Импортированы полные данные XXVII Кубка РК: квалификация (34 муж / 16 жен, до 12 игр), Раунд Робин (топ-8 муж/жен с бонусами win/tie/200+/250+), подиум турнира (места 1-3 = итог Раунд Робина). Парный зачёт вынесен отдельным турниром (как принято для КБТ) со своим официальным рейтингом и подиумом — места 1-4 по сетке финалов, 5+ по квалификации.
v2.3.9
30.07.2026
Туры и результаты — снова по формату проведения, не жёстко А/Б
- Три связанных исправления. 1) Страница лиги без ?tour= в URL показывала пустой недавно созданный тур вместо последнего реально сыгранного — теперь ищется последний тур, где хоть у одного участника есть счёт, а не просто тур с максимальным номером. 2) Таблица "Туры" на странице лиги вернулась к одной колонке "Победители", но теперь адаптивной: показывает Группу А/Б, если тур реально в этом формате, и общий топ-3, если тур командный/одиночный/смешанный — раньше жёстко ждала только A/Б и показывала прочерки для остальных форматов. 3) Виджет "Таблица лиги" на главной переделан: вместо снимка одного последнего тура показывает последние 3 РЕАЛЬНО сыгранных тура с победителями, тем же адаптивным форматом.
v2.3.8
30.07.2026
Виджет лиги на главной пропадал после командного тура
- После фикса в v2.3.6 (виджет "Таблица лиги" на главной стал показывать конкретный последний тур вместо суммы за сезон) обнаружился краевой случай: если последний сыгранный тур был в формате "Командный" (там group_type хранит название команды, а не A/Б), виджет с жёстко зашитыми подписями "Группа А"/"Группа Б" не находил подходящих строк и показывал пустое состояние, будто результатов ещё не было вовсе. Теперь для этого виджета ищется последний тур именно в формате групп А/Б — командные туры пропускаются при выборе, какой тур показать (сами по себе они никуда не делись, видны на странице лиги как обычно).
v2.3.7
30.07.2026
Инструкции по ролям, метка «Текущая» в changelog, вёрстка /rules
- Страница /help теперь показывает только разделы, относящиеся к роли текущего пользователя: Игрок видит только "Игрок", Контент-менеджер — "Игрок"+"Контент-менеджер", Судья — "Игрок"+"Судья", Администратор — всё. Гости и обычные игроки видят только общий раздел "Игрок". Исправлена метка "Текущая" на /changelog — она читала отдельную настройку site_version, которая не обновлялась вместе с записями changelog (тот же баг, что чинили в footer в v2.3.0, только для этой страницы отдельно) — теперь оба места используют одну и ту же функцию currentSiteVersion() и всегда совпадают. Выровнена шапка страницы /rules — использовала узкий container-sm вместо обычного container, из-за чего отличалась по ширине от остальных страниц сайта.
v2.3.6
30.07.2026
Виджет лиги на главной — результаты именно последнего тура, не сезона
- Блок "Таблица лиги" на главной странице был подписан датой последнего тура, но фактически показывал накопительную таблицу за весь сезон (сумму очков и игр по всем турам) — из-за этого имена и цифры не совпадали с тем, что реально было сыграно в этот день. Теперь блок показывает результаты именно того тура, что указан в подписи. Также на странице лиги таблица "Туры" переверстана: колонка "Тур" сужена, "Дата"/"Участ." прижаты вправо, а колонка "Победители" (раньше — 6 имён вперемешку) разделена на две отдельные колонки "Группа А" и "Группа Б" по 3 места в каждой.
v2.3.5
30.07.2026
Авто-гандикап для групп А/Б, авто-подтягивание записавшихся, честные дорожки
- Авто-расчёт гандикапа (жен. +8, новичок +15, спортивный по формуле) теперь работает не только для лиг формата singles, но и для формата "группы" (Бекер/СинглСпорт/Микс) — включая Воскресную лигу Астаны — при включённом use_auto_regulation (по умолчанию включено). Группа А/Б и очки по-прежнему назначаются организатором вручную. Новый тур без сохранённых участников теперь автоматически подтягивает всех, кто записался через личный кабинет (league_tour_signups), сразу в группу Б. Добавлена функция "Сформировать дорожки" — случайное распределение участников по дорожкам (3 или 4 человека), учитывающее всю историю прошлых туров лиги и минимизирующее повторные пересечения одних и тех же людей. Также исправлен баг: медали/подсветка топ-3 больше не показываются для тура, в котором ещё не сыграно ни одной игры.
v2.3.4
30.07.2026
Формат лиги «Пары» переименован в «СинглСпорт»
- Формат лиги, ранее подписанный "Пары" (код значения в базе не менялся, только отображаемое название), теперь называется "СинглСпорт" — в форме лиги, в списке лиг админки и в выборе формата тура. Для туров этого формата убран столбец "Пара" (номер пары для автоматического подсчёта победа/ничья/поражение) — очки теперь вписываются вручную в столбец "Очки". Форматы Бекер и Микс продолжают использовать парный автоподсчёт как раньше.
v2.3.3
30.07.2026
Только одна главная новость в слайдере
- Раньше несколько новостей одновременно могли иметь флаг "Главная новость", и все они показывались в слайдере на /news. Теперь при отметке новости как главной все остальные автоматически снимаются с этого статуса (последняя отмеченная — приоритетна), плюс публичный запрос ограничен LIMIT 1 как доп. страховка. Существующие данные нормализованы миграцией 059 — оставлена только самая свежая по дате публикации.
v2.3.2
30.07.2026
Ссылка на WhatsApp-группу лиги + единый размер обложек на /league
- В форму лиги добавлено поле "Ссылка на WhatsApp-группу" — кнопка со стандартной иконкой WhatsApp появляется на карточке лиги в списке /league и на странице самой лиги рядом с блоком "О лиге". Также исправлена разница в высоте обложек лиг на /league: раньше высота картинки зависела от длины текста в соседней колонке (растягивалась на 100% высоты строки грид-сетки), теперь у всех карточек фиксированная высота 220px.
v2.3.1
29.07.2026
Публичные страницы Битвы Городов + вкладка Годового Рейтинга
- Добавлены публичные страницы /battles (список) и /battles/{slug} (командный зачёт городов и личный зачёт Межгорода) для турнира «Битва Городов». В раздел /ratings добавлена третья вкладка «Годовой (Битва Городов)» — рейтинг игроков по накопленным очкам Годового Личного Рейтинга (player_yearly_points) за выбранный год. Ссылка на Битву Городов добавлена в главное меню сайта и в сайдбар админки.
v2.3.0
29.07.2026
Битва Городов: авто-сборные, круговые матчи, Годовой Личный Рейтинг
- Добавлен движок ежемесячного межгородского турнира «Битва Городов», построенный поверх существующих turnирных/матчевых сущностей (без новых таблиц под сборные): /admin/intercity — авто-отбор ТОП-N игроков каждого города по месячным очкам лиги (настраивается в форме лиги), авто-генерация круговых матчей city_league между городами (судейский ввод — тот же готовый экран /referee, что и раньше), подведение итогов с определением Города-победителя месяца и начислением очков Годового Личного Рейтинга (1 место +20, 2 место +15, 3 место +10, участие +5) в новую таблицу player_yearly_points. HDC участников (жен./новичок/спортивный) применяется к результатам матчей Битвы через уже существующий движок регламента.
v2.2.0
28.07.2026
Авто-регламент Воскресного Тура: HDC, группы А/Б, места-очки, High Game
- Городские Воскресные Туры (формат «Одиночный») теперь считаются автоматически по официальному регламенту: женский HDC +8, новичковый HDC +15 (первые 4 тура), спортивный HDC (200-Avg)×0.6 с потолком +30 после 4 туров, авто-разделение на группы А/Б по среднему с HDC (порог 150), очки по местам в группе (12/8/5/3/1) и бонус High Game +2 за лучшую игру дня отдельно у мужчин и женщин. Добавлен диагностический и ретроактивный пересчётный скрипт для приведения уже сыгранных туров в соответствие новому регламенту.
v2.1.0
26.07.2026
Стабилизация и доработки интерфейса
- Единый визуальный стиль шапки и подвала сайта на всех страницах.
- Страницы игроков, команд, турниров и лиг дополнены разделами топ-результатов со ссылками на матчи.
- Исправлены расхождения в отображении статуса live для многодневных турниров.
v2.0.0
25.07.2026
Приоритетная регистрация и казахская локализация
- Ранний доступ к регистрации на турнир для PRO/VIP-игроков.
- Основа казахской версии интерфейса (включается в настройках администратора).
- Экспорт полной истории игр в CSV.
v1.8.0
24.07.2026
Тарифы и AI-помощник
- Публичная страница тарифов с полным списком функций каждого плана.
- Персональный AI-помощник (PRO/VIP) — анализ истории игр и рекомендации на основе реальной статистики.
- Заявки на смену тарифа и ручное управление тарифом из админ-панели.
v1.7.0
23.07.2026
Командные турниры
- Отдельный формат для командных соревнований (Round Robin + плей-офф) с турнирной таблицей, составами и итоговыми местами команд.
- Команды теперь делятся по контексту создания — лига, турнир или независимая команда.
v1.6.0
21.07.2026
Гибкий формат квалификации
- Поддержка турниров с несколькими квалификационными блоками в течение нескольких дней — игрок может сыграть любое число блоков, в зачёт идут лучшие.
- Раздельный (по полу) и общий (смешанный) зачёт настраивается при создании турнира.
v1.5.0
19.07.2026
Фотогалереи и календарь
- Слайдер фотографий турнира и фотографии победителей.
- Отдельная страница «Календарь» с расписанием сезона и обратным отсчётом до ближайшего турнира.
v1.4.0
16.07.2026
Система команд
- Создание команд, заявки на вступление, капитанство.
- Публичный профиль команды с составом и статистикой.
v1.3.0
14.07.2026
Главная страница и рейтинги
- Обновлённая главная страница: живая трансляция турниров, таблицы лиг по городам, топ игроков недели/месяца.
- Раздельный рейтинг: официальный (по турнирам) и общий любительский.
v1.2.0
10.07.2026
Турнирная сетка и live-режим
- Автоматическая генерация турнирной сетки (плей-офф на вылет) после завершения квалификации.
- Публичная страница судейства матча в реальном времени.
- Автоматический перевод статуса турниров и матчей по расписанию.
v1.1.0
05.07.2026
Система лиг
- Многогородская лига (Алматы, Атырау и др.) с настройкой формата тура, масляного паттерна и гандикапа по городам.
- Самостоятельная регистрация в лигу и на парные форматы из личного кабинета.
v1.0.0
01.07.2026
Запуск платформы
- Личный кабинет игрока, каталог турниров и лиг, рейтинговая система.
- Административная панель для управления контентом и соревнованиями.