Home / Forum / Предложения / Я возвращаюсь к командам согласно второму акту.

Я возвращаюсь к командам согласно второму акту.

Привет, я открываю новую дискуссию по этой теме по двум причинам: предыдущая становилась слишком длинной, и в случае нескольких страниц форум вместо того, чтобы разместить вас на последней странице для добавления сообщения, помещает вас на первую страницу, а вам приходится вручную переходить к последней, чтобы написать новое сообщение. Кроме того, по какой-то причине теперь каждый раз, когда я достигаю последней страницы, меня снова просят войти, чтобы писать, и после входа меня перенаправляют на главную! Хорошо, пришло время начать новый поток.

Я хотел бы поделиться новым списком замечаний, которые возникли из-за некоторых трудностей во время регистрации в нашем последнем турнире; когда у вас будет время, посмотрите, и при необходимости я могу подробнее объяснить причины отдельных запросов:


- «Добавить несопоставленного игрока» должно позволять регистрацию только по фамилии, без имени.

- «Добавить несопоставленного игрока», когда вводятся какие‑то символы и появляются игроки, удовлетворяющие фильтру, добавить к представленной информации год рождения (поле «B-Year»).

- Рейтинг по умолчанию для игрока, которого нет в списках FIDE, должен быть 1399.

- При раскрытии команды разрешить добавление игрока, отсутствующего в списках FIDE, через фамилию, и при желании имя и Elo. Кроме того, позволить добавить игрока из списка несопоставленных. Следовательно, должно быть пять вариантов: от игроков пользователя (как сейчас), от FIDE (как сейчас), по ID FIDE (как сейчас), из списка несопоставленных и только с фамилией, именем и Elo. «Добавить игрока» из списка или из несопоставленных должен позволять фильтр для поиска. Нужно оценить, будет ли добавленный на лету игрок по фамилии попадать в список игроков пользователя; обычно я бы сказал да.

- При создании «Новой команды из выбранных» фокус сразу должен перейти к полю имени, чтобы можно было немедленно начать печатать. Это золотое правило должно применяться повсеместно: не заставлять оператора щёлкать мышью в поле для начала ввода.

- Иногда FIDE не отделяет фамилию от имени запятой, и поэтому при добавлении игрока из FIDE с такими характеристиками, хотя он найден, дальнейший процесс невозможен из‑за отсутствия имени. Это явно неприемлемо. Можно решить «угадав», какое слово является именем, но это может быть сложно. По моему мнению лучше всего (как указано в первом пункте) принимать регистрацию только с фамилией.

- Новый упоминание об импорте файла для регистраций. Мы уже говорили об этом, но по‑моему нужно позволить массовую регистрацию, хотя бы для несопоставленных игроков. Поэтому добавление из списка несопоставленных должно принимать список игроков из текстового файла или даже просто из поля, куда можно вставить перечень. Формат пока решать, но мне кажется достаточно формата «Фамилия,Имя,Elo», по одной строке. Или, в качестве альтернативы, строка может также содержать ID FIDE (не думаю, что существуют фамилии, состоящие только из цифр). После массовой регистрации должен быть сформирован отчёт о количестве вставленных строк и фактическом количестве зарегистрированных игроков, выделяя строки, которые не удалось обработать по любой причине (например, недействительный ID FIDE или ошибка парсинга). Остаётся решить, может ли фамилия, присутствующая в списках FIDE, быть захвачена самим списком, но это может стать сложным (омонимии, иногда с одинаковой фамилией и именем, а также другие непредвиденные ситуации). Лучше держать всё простым: добавлять только фамилию. При отсутствии имени принимать без него, а при отсутствии Elo устанавливать 1399. Таким образом строки «Паппино,,1756», «Паппино,Паулино» или «Паппино» все считаются валидными.


Слушай, можем ли мы рассмотреть проблему двойного Bye и невозможности сгенерировать раунд после оттока полностью заполненной команды, которые были поняты и решены для будущего? Я уверяю тебя, это была действительно неприятная ситуация… когда помимо турнира есть призы, люди не очень понимают! :)


Привет и спасибо как всегда,

Клаудио.

Показать оригинал (IT)

привет @Claudio

спасибо, как всегда, за подробную обратную связь и за время, которое вы уделяете работе ChessPairings на практике. Ваши сообщения после реального турнира важнее тысячи тестов.

Пойду по пунктам, начиная с вашего финального вопроса, который самый важный.

О БАГАХ В АВТОМАТИЧЕСКОМ ТУРНИРЕ (двойной bye и блокировка после отставки команды)

Скажу вам правду: я думаю, что да, но не могу гарантировать 100 %.

Вот что произошло за кулисами:

1) Двойной bye: исправлено в v4.7.2. Причина была в TRF, который мы отправляли движку bbpPairings — мы объявляли bye как «ничья с виртуальным» вместо «bye назначенный системой», и поэтому движок не знал, что команда уже получила bye. Теперь используем правильный маркер (PAB) и bbp6 автоматически соблюдает правило FIDE «нет двойного bye».

2) Генерация раунда заблокирована после отставки команды: исправлено в v4.7.6. Когда команда отступала посреди турнира, сгенерированный TRF содержал ссылки на эту команду (потому что другие команды её встречали), но не включал строку заголовка, поэтому bbp6 падал с «Invalid line». Теперь отставшие команды включаются в TRF со флагом XXZ, который исключает их из паринга, но сохраняет целостность истории.

3) Стресс‑симулятор (v4.7.7): мы добавили автоматический тест, который запускает 12 полных сценариев (включая отставку команды и двойной bye) перед каждой новой версией. Если один из двух багов снова появится, мы заметим это до деплоя, а не во время вашего турнира.

Однако спокойную подтверждение сможем дать только после того, как несколько ваших реальных турниров пройдут без происшествий в этих ситуациях.

Независимо от того, насколько точны тесты, реальность всегда более креативна.

Мне очень жаль плохой опыт; понимаю, что с призами на кону нет места для терпения.


═══════════════════════════════════════════════════════════

О ВАШИХ 7 ЗАПРОСАХ — доступны в v4.8.0 (релиз сегодня)

═══════════════════════════════════════════════════════════


Реализовано 3 из 7 запросов. Вот детали:


═══ ПРИМЕНЕННЫЕ ═══


✓ B-Year в результатах «Добавить нечетного игрока» Теперь поиск FIDE также показывает год рождения, как в панели нечетных, так и при поиске внутри команд. Это очень помогает в случаях омонимии.

✓ «Добавить игрока» в расширении команды — 5 режимов. Я полностью переписал эту секцию. Сейчас вы видите горизонтальный переключатель с пятью вариантами:

1) Из моего списка (с живым фильтром)

2) Поиск FIDE (с B-Year в результатах)

3) FIDE ID (textarea bulk, как раньше)

4) Нечетные — выбор из списка нечетных этого турнира с фильтром

5) Ручной — Фамилия + Имя + Elo по желанию, с чекбоксом «добавлять также в мой список игроков» включённым по умолчанию

Каждый раз при смене режима автоматически фокус переходит на первое поле (ваш «золотой закон»). Больше не нужно обязательного клика для начала ввода.

Игрок, добавленный в режиме «Ручной», попадает в ваш список (если чекбокс активен). Если в списке уже есть игрок с такой же фамилией+именем, используется существующий вместо создания дубликата.

✓ Bulk‑импорт нечетных

В панели нечетных появился новый кнопка «Импортировать список». Открывается textarea, куда можно вставить одного игрока на строку в формате:

Фамилия,Имя[,Elo|FIDE_ID]


Примеры валидные:

Rossi,Mario,1750 → Elo 1750
Verdi,Giovanni,12345678 → поиск FIDE (ID 8 цифр или больше)
Bianchi,M → Elo 0, имя только первая буква
Neri,Anna → Elo 0


Правило: третье поле, если числовое от 0 до 3500, читается как Elo; если >3500 — как FIDE ID (и в этом случае фамилия/имя/рейтинг берутся из архива FIDE, игнорируя введённые данные).

После завершения появляется отчёт: прочитанные строки, зарегистрированные игроки, отбрасываемые строки с причинами.

Я предпочёл оставить только вставку, без загрузки файлов, по соображениям безопасности.


═══ НЕ ПРИМЕНЕННЫЕ ═══


✗ Регистрация нечетного только с фамилией (без имени)

Я предпочитаю требовать хотя бы первую букву имени. Только фамилия может привести к слишком разрозненным и неоднозначным данным (особенно при омонимии). Валидация принимает «Rossi M.» или «Rossi Mario», но не «Rossi» в одиночку.

По той же причине я не реализую исправление для FIDE‑игроков без запятой между фамилией и именем — это редкие случаи, а попытка «угадывать» разделение привнесёт больше ошибок, чем пользы.

В таких случаях советую добавить игрока вручную с Фамилией + первой буквой имени.

✗ Default Elo 1399 для игроков без рейтинга

Значение 1399 специфично для Итальянской федерации, тогда как ChessPairings многоязычный и используется за пределами Италии. По умолчанию ставится 0. Если для ваших турниров важен 1399, вы можете

явно ввести его вручную (даже в bulk).

✗ Загрузка файла для импорта нечетных

Только вставка в textarea, по соображениям безопасности приложения.


Если попробуете новые функции, дайте знать, как идут дела — особенно если найдёте неудобный workflow или что‑то нуждающееся в доработке.

Ах, и на форуме: отмечаю проблему с последней страницей, которая возвращает домой после входа. Я разберусь отдельно.

Хороших турниров!

Stefano


Изменено 05/05/2026 08:16

Привет, я написал тебе обычный скучный разбор с всякими статистиками по таблицам ФИДЕ, но когда нажал «Опубликовать ответ», он сказал, что надо войти в систему и всё потеряно! По какой-то причине форум иногда теряет доступ и требует повторного входа. Я расстроен тем, что всё потерял (написал много) и не следовал своему правилу всегда копировать содержимое сообщения перед публикацией :( Терпение, когда снова завоюю доверие к миру, попробую ещё раз.


Привет,

Клаудио.

Привет, @Claudio

В эти дни проходит ещё пять командных турниров, и я не получил уведомлений (но пять – это мало, и возможно, что они были)

Привет @stefanoloberti,

мы снова в деле, теперь у нас будет три командных турнира (на этот раз команды из трёх игроков), которые будут частью одной комбинации. На данный момент я не вижу возможности даже управлять самими комбинациями, с общими таблицами результатов разных турниров; возможно, об этом поговорим позже. Пока будем рассматривать их как три отдельных турнира; но уже сейчас было бы полезно иметь возможность дублировать турнир или хотя бы экспортировать список участников, который (за исключением редких случаев) будет одинаковым для трёх турниров… иначе нам придётся вручную создавать каждый отдельный турнир и заново регистрировать всех игроков из первого. Это тоже станет темой для дальнейшего обсуждения.


Как обычно, я подношу к тебе несколько предварительных замечаний и запросов уточнений, спасибо как всегда.


- В настройках турнира, после открытия регистраций, нельзя ни увидеть, ни изменить правила спарринга. Если я не ошибаюсь, ты включал эту возможность в конце турнира, но думаю, что её должно быть можно менять в любой момент, особенно до начала турнира.

- Ошибка: в «Списке игроков» (тех из твоего клуба, если так понимать), если выбрать всех и попытаться удалить их, система правильно сообщает, что хочет удалить их (указывая общее число), но затем удаляет только одного!

- Как можно загрузить объявление о турнире, чтобы его могли посмотреть до регистрации?

- Может быть, я не вижу этого, но как некто без прав администратора может увидеть список участников? Должна быть публичная ссылка на турнир, где можно просмотреть его характеристики, увидеть зарегистрированных, скачать/просмотреть объявление и использовать ссылку для регистрации. Я просто не вижу чего-то, или это не предусмотрено?


Привет,

Клаудио.

Привет, @LTB сегодня я буду в пути в Базель для Bundesturnier.


В поезде я внимательно изучу запросы, хотя считаю, что перед добавлением новых функций стоит провести стресс‑тест, чтобы убедиться, что продакшн не выдаёт ошибок и исключений, иначе мы оставим организаторов с горячей картошкой из чего‑то сломанного.


Небольшой комментарий к объявлению: это нельзя загрузить (как любой другой файл), но есть поле «заметки», где вы можете написать информацию внутри, и то, что получится – страница вроде этой: https://my.chesspairings.org/pubblico/torneo.php?id=1381&token=10705c963d87ab2fac5f0dd8e104769b35dc66197c083d3606ec16cfe6561c56&tab=bando

Изменено 13/05/2026 07:32

Привет, Стэфано,

Проблема в том: как зрители могут просматривать эту информацию во время регистрации? Если перейти по публичной ссылке для открытой регистрации, виден только кнопка Standings, лаконичный «Standings not available yet» и ничего больше (например https://my.chesspairings.org/pubblico/torneo_squadre.php?id=208&token=5f5b5aa47b850102f0424a8bad91d113bad9d40eff9fc4c3fb31bd8177241113)... вкладка «Regulation/Bando» отсутствует. Решение кажется «простой»: нужно включить вкладки «Participants» и «Regulations» даже в фазе регистрации, иначе, повторяю, как игроки могут увидеть эту информацию? Ситуация настолько критична, что я действительно подозреваю, что потерял что-то :)


Удачи в Базеле!


Привет,

Клаудио.

Привет @LTB действительно в разделе командных турниров это не реализовано. Я сейчас займусь этим

Привет @LTB


Пошагово, начиная с лучшей новости: все четыре сообщения, которые вы подняли, подтверждены в коде и исправлены в v4.8.9 (онлайн уже сегодня).


═══════════════════════════════════════════════════════════

ВАШИ 4 ОТЧЕТА — исправлены в v4.8.9

═══════════════════════════════════════════════════════════


✓ Невидимые/недоступные для изменения спарринги во время регистрации


Подтверждено: карточка «Настроить спарринги» была спрятана внутри вкладки Таблица, которая скрыта до тех пор, пока турнир находится в фазе регистрации (таблицы ещё нет). В итоге не было способа попасть туда.


Я переместил её во вкладку Настройки, внизу. Теперь она всегда доступна и редактируема в любом состоянии турнира — регистрация, в процессе, завершённый. Тот же drag&drop, те же пресеты.


✓ Ошибка «удалить всех игроков клуба», которая удаляла только одного


Реальная ошибка и довольно глупая, как раз после понимания: страница содержала два вложенных HTML‑формы (один для массового удаления, другой внутри каждой строки таблицы для одиночного удаления). Браузеры автоматически закрывают внешний форму, когда встречают внутреннюю — поэтому в POST попадает только первая чекбокс. Сообщение «вы хотите удалить N» было корректным, потому что подсчитывалось на стороне JavaScript, но сервер получал 1. Исправлено.


✓ Загрузка объявления турнира


Технически поле уже существовало (textarea «Заметки» в настройках), но с таким общим названием никто не мог догадаться, что это публичное объявление. Я переименовал поле в «Объявление / Заметки турнира», добавил поясняющий placeholder (дата, место, призы, правила, контакты…) и строку ниже: «Будет отображено как вкладка Объявление на публичной странице турнира.»


✓ Публичный вид во время регистрации — самая большая проблема


Вы были правы в целом: публичная страница командного турнира до начала регистрации показывала только вкладку Таблица с «Статистика недоступна» и ничего больше. Нет зарегистрированных команд, нет объявления, нет ссылки на регистрацию. Вы не пропустили ничего — это было именно так.


Теперь публичная страница командного турнира имеет:


- Вкладка «Команды» (всегда видима, с счётчиком) → список зарегистрированных команд, каждая раскрывается для просмотра состава игрока за игроком (титул, фамилия+имя, рейтинг, FIDE ID, возможные резервные игроки внизу). Во время регистрации это вкладка по умолчанию.


- Вкладка «Объявление» → видна, когда вы заполнили заметки турнира.


- Зелёная CTA «Зарегистрировать свою команду» в заголовке, когда онлайн‑регистрация открыта. С счётчиком «N / максимум зарегистрированных команд», если установлен предел.


- Вкладки «Таблица» / «Сочетания» → появляются, когда турнир начинается (тур > 0).


- Ясный статус‑бадж в заголовке: зелёный «Регистрация», анимация LIVE во время турнира, серый «Завершён» после окончания.



═══════════════════════════════════════════════════════════

ДУБЛИРОВАНИЕ КОМАНДНОГО ТУРНИРА═══════════════════════════════════════════════════════════


Вы сказали «это тоже обсудим позже», но поскольку для одиночных турниров дублирование уже было, применение той же схемы к командным турнирам заняло всего один день. Так что это внутри.


Как работает:


В списке ваших командных турниров появляется новая иконка (перекрытая листовка, голубой) справа от каждого турнира. Клик → модальное окно с предзаполнённым именем «X (копия)» → подтверждение → вы сразу переходите к новому турниру.


Что копируется:

• Полные настройки (тип, раунды, доски, интервал, начальный цвет, движок и т.д.)

• Конфигурация спаррингов (чтобы не делать их каждый раз)

• Все активные команды (название, аббревиатура, капитан, email капитана, номер команды для ранжирования, средний рейтинг)

• Полный состав игроков каждой команды, с порядком досок и флагом стартовый/резервный


Что НЕ копируется (намеренно):

• Результаты, сочетания, формирование раундов — новый турнир начинается «с нуля»

• Отозванные команды

• Индивидуальные участники, которые ещё ждут назначения

• Публичные токены и короткие коды → они генерируются заново, так что ссылки копии отличаются от оригинала.


Новый турнир создаётся в состоянии «регистрация», раунд 0, текущая дата. Оттуда вы можете изменить его как обычно (конечное имя, даты, небольшие отличия в составах).


Для вашего комплекса из 3 турниров: создайте первый как обычно, дублируйте дважды, и за 30 секунд у вас будет готово 3 турнира с теми же игроками. Ожидаемая экономия: полчаса на каждый турнир, который пришлось бы заново регистрировать вручную.



Как обычно, когда попробуете новшества, дайте знать как идут дела — даже «окей работает» ценен, потому что подтверждает, что исправление держится в реальной работе, а не только в моих тестах. Я попытался управлять этим потоком (не другие аспекты командного турнира) и ошибок не нашёл.


Удачного турнира (на турниры, точнее!),


Stefano


Великолепно, мне кажется всё продумано, спасибо! Я сомневаюсь в желании не копировать несопоставленных игроков при дублировании турнира, но это тоже может быть оправдано... я бы их тоже склонировал, возможно это будет удобно для создания снимка турнира (snapshot) перед формированием команд.

Наконец, было бы удобно, если бы возможная ссылка в разделе Примечания/Регламент/Баннер была кликабельной, чтобы при вставке ссылки на свой баннер (или на что угодно другое) пользователь мог перейти по ней, просто кликнув. Сейчас всё находится в простом тексте.


Привет,

Клаудио.

Привет @LTB простой текст (т.е. без HTML) безопаснее для предотвращения внедрения вредоносных ссылок, которые могут вызвать предупреждения на домене.


Есть почти тысяча пользователей и каждый день генерируются 1000 паров, безопасность очень важна.

@LTB я исправил ошибку выхода из форума

Отлично! Но путь к успеху усеян трудностями и раздражающими пользователями! Вот ещё один набор размышлений, полученных во время тестов, чтобы избежать необходимости вручную делать раунды в следующих турнирах :) Среди замечаний некоторые касаются эстетики, другие – спорные, но самое важное — это возможность изменять настройки турнира в любой момент:


Регистрация:

- Публичная страница турнира должна позволять раскрывать все команды или сворачивать их, так же как вы сделали для страницы администратора.


Раунды:

- Отображение раундов «плохое», нужно попытаться сделать поля выровненными. «Расширенный вид» в порядке, но «Компактный вид» имеет все результаты невыравнённые. Даже «Печать раунда» должна иметь колонку «РЕЗУЛЬТАТ» центрированную относительно страницы. Также публичная страница парингов полностью не выровнена.

- По моему мнению, при нажатии «Запустить турнир» должно автоматически генерироваться первый раунд; кнопка «Генерировать раунд» кажется избыточной. Если возражение в том, что так можно сделать ручной раунд, эта возможность всё равно присутствует после генерации раунда, не нужно просить пользователя генерировать раунд.

- Управление составами нуждается в уточнении… оно очень эффективно при регистрации (достаточно переместить игроков мышью), но во время турнира неясно. Рассмотрим практический случай: я ошибаюсь и запускаю турнир с неверным составом. Я делаю первый раунд, а при вводе результатов понимаю, что один из составов неправильный, но к счастью есть кнопка «Управлять составом» :) Тогда я меняю его (а уже здесь изменение менее эффективно: меня вынуждают временно поставить пустую шахматную доску и сыграть в игру с тремя картами для корректировки финального состава). Я нажимаю «Подтвердить состав», и всё устраняется. Ввожу свои результаты (здесь тоже неясен смысл кнопки «Сохранить результаты», кажется избыточной…). Генерирую новый раунд, и он снова предлагает исходный состав. Это может быть допустимо, но как я могу окончательно изменить состав до конца турнира? Тогда я перехожу в «Составы» и там могу изменить состав (с ещё одной иной системой, которая позволяет дважды установить одного игрока, но затем не позволяет завершить «Сохранить состав», нужно унифицировать метод изменения состава). Я возвращаюсь к «Парингам», но изменение отсутствует, и мне пришлось бы снова менять его там (потому что если я удалю и пересоздам раунд, то изменение сделанное в «Составах» теряется. Еще хуже: вернувшись к первому раунду, меняю состав для раунда 1, генерирую раунд 2, и он снова предлагает исходный состав, которого уже нет нигде! В общем, по моему мнению, нужно иметь возможность временно изменить состав во время ввода результатов (унифицируя способ изменения), и это хорошо, но также должно позволять мне стабильно менять состав для последующих раундов. Я помню, что в последнем турнире именно так произошло: команда была введена с неверным составом, и каждый раз вручную нужно было помнить о смене состава перед вводом результатов.

- Мы уже видели это в индивидуальных турнирах, но в командных нет возможности изменить турнир во время раундов (например количество раундов или методы спарринга). Это особенно критично, потому что если вы запускаете турнир с количеством раундов, превышающим число игроков, вы не можете выйти: даже позволяя это, вы достигаете точки, где застреваете с сообщением «Ошибка движка парирования: Ошибка при парировании /tmp/....trf. Нет допустимых пар... и т.д.» Сообщение об ошибке движка парирования во время турнира *не должно* происходить, его нужно предотвратить! И в этом случае у вас даже нет способа выйти из него! Настройки турнира всегда должны быть доступны от начала до конца.


Завершение турнира:

- Финальная таблица включает как для команд, так и для досок, но экспорт (PDF, CSV и т.д.) содержит только таблицу по командам, а таблица по доскам отсутствует. Либо добавить её в очередь после таблицы по командам, либо нужна отдельная кнопка для экспорта. Кроме того таблица по доскам не использует никаких Tie Break, их тоже нужно предусмотреть.


Привет,

Клаудио.

привет @LTB

обычная батарея надёжных отзывов, всегда с преимуществом того, что ты приходишь из турнира, а не из лабораторного теста — спасибо.

Версия v5.4.0 доступна сегодня и содержит пять из шести пунктов, которые вы подняли. Шестой (запуск, который также генерирует раунд 1) я оставил вне списка по собственному выбору.


Пошагово следую структуре ответа.

═══════════════════════════════════════════════════════════

ЗАПИСИ — раскрыть/свернуть публичную страницу

═══════════════════════════════════════════════════════════

✓ Сделано.

На публичной странице командного турнира, над списком команд, теперь есть две кнопки «Раскрыть все» / «Свернуть все», идентичные тем, что в админке. Индивидуальные треугольники на

каждой команды продолжают работать независимо, так что вы можете открыть только интересующие вас команды или сразу раскрыть всё.

═══════════════════════════════════════════════════════════

РАУНДЫ — выравнивание

═══════════════════════════════════════════════════════════

✓ Выполнено во всех трёх направлениях, которые вы указали.

  1. Компактный вид пар (админ) — проблема была в том, что строка заголовка карточки работала как свободное «flex» пространство: если название команды было длиннее другого, счёт справа смещался на несколько пикселей. Я преобразовал его в сетку с фиксированным столбцом счёта и табличными цифрами (так что «1.5 - 0.5» и «2 - 0» занимают одинаковую ширину). Теперь результаты выравниваются даже при вертикальной прокрутке.
  2. Печать раунда — столбец РЕЗУЛЬТАТ был шириной 55 px, слишком мал для «½-½». Увеличил до 78 px, установил фиксированное расположение таблицы и вертикальное выравнивание по центру. Строка теперь «дышит» и симметрична относительно страницы.
  3. Публичная страница пар — сетка была жёсткой и при длинных названиях нарушала выравнивание. Переписал с именованными столбцами и minmax(0, 1fr) для имён, tabular-nums для рейтинга и результата.


Во время работы я обнаружил ещё одну ошибку, которую вы не упоминали, но которая проявлялась: в TXT‑экспорте таблицы команд строка «LTBagna Càuda» была смещена на один символ относительно остальных. Причина: буква «à» занимает 2 байта UTF‑8, а PHP считала байты вместо символов при паддинге столбца. Заменил sprintf на mb_str_pad. Строка теперь ровная.

═══════════════════════════════════════════════════════════

РАУНДЫ — управление составами

═══════════════════════════════════════════════════════════

✓ Сделано главное. Я не объединил три UI в один компонент (это было бы слишком навязчиво сейчас), но решил функциональную проблему, которую вы описываете.

Случай, который вы рассказывали — «команда стартует с неверным составом, каждый раунд я должен вручную поправлять» — теперь обрабатывается так:

  1. В каждом из трёх пунктов, где сейчас можно изменить состав (drag‑drop при регистрации, вкладка Составы, «Управление составом» во время раунда), добавлена чекбокс под составом: «☐ Применить также как предустановленный состав для следующих раундов». Если оставить пустым, изменение действует только на текущий раунд (текущая логика, полезна, если сегодня я держу X в запасе из‑за простуды). Если поставить галочку, изменение становится и НОВЫМ предустановленным составом: список обновляется (scacchiera_default обновлён) и все будущие раунды стартуют от него вместо исходного порядка.
  2. Серверная валидация anti‑дублирования теперь во всех потоках. Ранее вкладка «Составы» позволяла поставить одного игрока на две доски, а затем при сохранении выдавалась неясная ошибка. Теперь в трёх потоках (установитьСостав, обновитьСоставПоУмолчанию, регенерироватьPartiteMatch) отклоняется с чётким сообщением: «Тот же игрок назначён на две доски (1 и 2). Исправьте состав перед сохранением».


Иными словами: во время турнира, если в раунде 2 вы заметите, что состав команды неверен, установите чекбокс один раз, а с раундами 3‑4‑5 будет использоваться исправленный вариант. Больше не нужно «помнить каждый раунд». В графическом объединении трёх UI под одним компонентом drag‑drop я вернусь позже, но сейчас версия уже хватает.

Кнопка «Сохранить результаты», которая казалась вам избыточной: лейбл не оптимален, оставил так, потому что кнопка делает окончательный коммит результатов, которые до этого момента находятся в autosave (история обновляется только при клике). Полезно понять.ciao @LTB

solita batteria di feedback solida, sempre con il vantaggio di venire dalla sala torneo e non da un test in laboratorio — grazie.

Привет, Стефано,

Вау! Так много направлений за такое короткое время... поздравляю!

Есть ещё небольшие графические недочёты, но мы их устраним после того, как решим важные вопросы! :)


Небольшое «похоже на забытое» замечание: я всё ещё получаю ошибку Pair Engine Error, если меняю количество раундов в турнире во время его проведения... он принимает чрезмерное число, а когда не может сгенерировать раунд появляется сообщение об ошибке. Но он позволяет мне создать ручной раунд без ошибок (и это нормально, оставим так, если это не вызывает дополнительных проблем).


По моему мнению, тебе стоит дать возможность открыть завершённый турнир заново; сейчас кажется, что такой возможности нет. Давай рассмотрим практический случай: я добавляю последний раунд, завершаю турнир и публикую таблицу; появляется участник, который утверждает, что его результат последнего раунда неверен! Что делать?


Я также заметил, что могу удалить команду, но не могу добавить новую в уже начатый турнир. Если к нам приходит поздний игрок, которого я хочу включить с второго раунда, как мне поступить?


В остальном всё отлично! Теперь, чтобы управлять нашей комбинацией, я создал небольшое веб‑приложение, куда могу загружать экспортированные таблицы «TXT (Report)» (они полезны как золото), анализировать их и формировать комбинированную таблицу различных турниров, учитывая количество раундов в каждом туре. Если ты заинтересован увидеть его сейчас, я разместил на своём веб‑пространстве; могу отправить тебе URL приватно. Сейчас он рассчитывает только таблицы команд, но после того как ты добавил экспорт шахматных результатов, я тоже их включаю (надеюсь, скоро не изменишь мне макет...). Может быть, однажды ты сможешь реализовать концепцию комбинации.


Спасибо ещё раз и пока.

Клаудио.

Ciao @LTB


grazie per la risposta e per essere tornato sui punti aperti con la solita precisione. Vado per i tre temi che hai sollevato, più una nota a piè di pagina sulla combinata.


═══════════════════════════════════════════════════════════

PAIRING ENGINE ERROR — chiuso davvero, stavolta (spero)

═══════════════════════════════════════════════════════════


✓ Fatto. Avevi ragione: nonostante il fix v5.4.0 lo prendevi ancora. Ho fatto autopsia e trovato due falle che si erano insinuate:


(1) Il salvataggio impostazioni accettava qualsiasi `num_turni` nel range 1-30 senza controllare il massimo teorico Swiss per le squadre attive. Quindi se mettevi "20 turni" con 6 squadre il salvataggio passava liscio e ti ritrovavi nel dead-end quando il motore arrivava al limite.


(2) Il fallback che intercettava l'errore tecnico per riformularlo user-friendly matchava solo la stringa "no valid pairings". Se bbp6 restituiva "Pairing engine error" alla lettera (o "Cannot pair", o altre formulazioni interne), il messaggio criptico passava intatto.


La cosa interessante della tua osservazione è la frase "ma mi lascia generare un turno manuale senza fiatare, e va bene, lasciamolo". Te l'ho presa come specifica esplicita: il punto NON è impedirti di salvare num_turni alti — quello ti taglierebbe via la valvola di sfogo del pairing manuale. Il punto è non farti finire davanti a un errore criptico.


Quindi ho strutturato il fix in tre livelli:


• Salvataggio impostazioni: se metti `num_turni > max_teorico` con torneo in corso, il salvataggio passa, ma compare un warning giallo: "Attenzione: con 6 squadre attive il pairing automatico copre al massimo 5 turni. I turni eccedenti andranno generati manualmente." Lo vedi e sai cosa aspettarti.


• Pairing automatico (Genera turno): blocca con un messaggio che esplicita la via d'uscita — "Pairing automatico esaurito per 6 squadre attive (massimo teorico 5 turni). Usa 'Pairing manuale' per generare turni aggiuntivi, oppure riduci num_turni a 5 e concludi il torneo." Niente più dead-end senza istruzioni operative.


• Pairing manuale: nessun blocco, mai. Esattamente come chiedevi.


Inoltre, indipendentemente dai tre livelli sopra, ho allargato il catch sull'errore del motore in modo che intercetti anche "Pairing engine error" alla lettera e qualsiasi altra formulazione tecnica generica. Se per qualunque motivo bbp6 fallisce per altre cause (per esempio vincoli di colore irrisolvibili al turno 3 con max teorico 5), invece di propagarti la stringa cruda vedi: "Il motore di pairing non è riuscito a generare il turno (...). Possibili cause: troppi turni per le squadre attive, vincoli di colore irrisolvibili. Puoi usare 'Pairing manuale' oppure ridurre num_turni e concludere."


In due parole: "Pairing engine error" e amici non dovrebbero mai più raggiungere l'arbitro in sala. Mai più davvero, stavolta.


═══════════════════════════════════════════════════════════

RIAPRI TORNEO CONCLUSO — fatto

═══════════════════════════════════════════════════════════


✓ Fatto. Il tuo caso pratico è perfetto come specifica: arbitro conclude il torneo, pubblica la classifica, salta fuori un risultato dell'ultimo turno sbagliato. Adesso c'è una via legittima.


Nel torneo a squadre concluso, accanto allo step finale del torneo trovi un bottone giallo "Riapri Torneo" con conferma esplicita. Lo vedi e sai cosa aspettarti.


In due parole: "Pairing engine error" e amici non dovrebbero mai più raggiungere l'arbitro in sala. Mai più davvero, stavolta.


Привет @LTB


Спасибо за ответ и за то, что вернулся к открытым вопросам с привычной точностью. Перейду к трём темам, которые вы подняли, плюс примечание внизу о комбинированном турнире.


═══════════════════════════════════════════════════════════

Ошибка парировочного движка — действительно закрыт, надеюсь теперь (снова)

═══════════════════════════════════════════════════════════


✓ Сделано. Вы были правы: несмотря на исправление v5.4.0 вы всё ещё получали ошибку. Я провёл анатомию и обнаружил две утечки, которые проникли:


(1) Сохранение настроек принимало любое `num_turni` в диапазоне 1-30 без проверки максимального теоретического Swiss для активных команд. Поэтому если вы ставили «20 туров» с 6 командами, сохранение прошло гладко и вы оказались в тупике, когда движок достиг предела.


(2) Фолбэк, который перехватывал техническую ошибку для её преобразования в пользовательский формат, совпадал только со строкой «no valid pairings». Если bbp6 возвращал «Pairing engine error» буквально (или «Cannot pair», или другие внутренние формулировки), криптическое сообщение проходило незамеченным.


Интересная часть вашего наблюдения — фраза «но он позволяет мне сгенерировать тур вручную без предупреждений, и это нормально, оставим так» . Я принял её как явное требование: цель НЕ – запретить вам сохранять высокие num_turni — это бы лишило вас возможности ручного парирования. Цель – не допустить появления криптической ошибки.


Таким образом я структурировал исправление в три уровня:


✓ Сделано. Вы правы: несмотря на v5.4.0 вы всё ещё получали ошибку. Я провёл анатомию и обнаружил две утечки, которые проникли:

Изменено 17/05/2026 10:43

Привет, Стефано,

я попробовал изменения. Возможность повторно открыть турнир работает, и я уверяю тебя, что это незаменимый механизм сохранения!

- Ошибка Pair Engine: подтверждаю, что сообщения теперь выглядят как захваченные и перекомпилированные... возможно можно сказать, что время, за которое появляется длинное и сложное сообщение, почти не позволяет его прочитать; такое сообщение (которое, вероятно, вызывает панику) должно запрашивать подтверждение для продолжения. Однако есть странность: в турнире из 6 команд по три участника каждая, даже если программа принимает количество раундов больше пяти, кажется, невозможно пройти дальше третьего раунда (а не пятого, как бы логика). Проверьте, действительно ли это баг bbp6, или есть другая причина? Если я удалю все раунды (операция немного длительная при большом количестве раундов) и изменю формат турнира с Swiss на Round Robin (хотя программа принимает некорректное число раундов... в случае round robin нужно «привязать» количество раундов к n‑1. Кроме того, программа тихо меняет количество раундов на n‑1 сразу после запуска турнира, даже если вы задали другое число), турнир корректно завершается с 5 раундами. Извиняюсь за чрезмерное использование скобок для описания ситуаций, но пишу во время тестирования.

- Регистрация поздних заявок: понимаю последствия. Хитрость Place Holder действительно не простая, и её следует заранее предусматривать :) Посмотрим, сможет ли PoC подтвердить ввод новой команды в любой момент...


Совет: в «Печать раунда», который обычно использует судья для печати и размещения раундов, добавьте в правый верхний угол QR‑код, указывающий на публичную страницу турнира, чтобы тот, кто захочет, мог сфотографировать его и посмотреть раунды на своём телефоне, включая последующие...


Привет,

Клаудио.

привет @LTB

во-первых важное: я обнаружил и исправил блокировку в твоем 6‑командном Swiss. Перейдём на v5.5.1, объясню ниже. На остальные пункты отвечу по порядку.


═══════════════════════════════════════════════════════════

БЛОКИРУЮЩАЯ ОШИБКА — 6 КОМАНД НЕ ПОДВАЛИВАЕТ НА ТУРН 3 (FIX v5.5.1)

═══════════════════════════════════════════════════════════

✓ Сделано. И ты был прав насчёт подозрения «bbp6 капризничает»: виновник действительно bbp6, но из‑за неверной информации, которую мы ему передавали.

Корень проблемы: в TRF, который отправляем в движок, есть запись (XXR), указывающая сколько туров будет турнира. Если ты ставишь num_turns=7 при 6 командах, мы пишем «XXR 7». bbp6 делает lookahead: видит, что максимальное теоретическое число туров для Swiss с 6 командами равно N‑1 = 5, считает, что после тура 3 остаётся только 2 тура, которые можно сопоставить с заявленными 4, и отклоняет пары уже с тура 4 «no valid pairings». Это не каприз, а именно FIDE‑совместимость: движок не хочет начинать турнир, который знает, что не сможет завершить.

Решение: в TRF мы ограничиваем XXR до max_theoretical (5 в твоём случае) ПЕРЕД тем, как отправлять его в bbp6. num_turns, который ты установил в турнире, остаётся неизменным в базе данных — значит лишние туры можно всегда генерировать вручную, именно так задумано v5.5.0. Просто bbp6 видит только то, что может завершить автоматически.

Практическое следствие для тебя: твой 6‑командный Swiss теперь проходит до тура 5 без сбоев, независимо от того, какой num_turns ты установил (5, 6, 10, 30 — всё равно). Туров 6+ можно продолжать генерировать вручную, если они нужны.

Автоматические тесты, написанные для защиты: 4 сценария (парный максимум, нечётный максимум с отозванной командой, no‑cap когда num_turns уже в диапазоне), все проходят.

═══════════════════════════════════════════════════════════

ROUND ROBIN — тихий num_turns (отложенный, не блокирующий)

═══════════════════════════════════════════════════════════

Ты прав: в Round Robin значение num_turns фактически не используется (алгоритм Бергера всегда ставит N‑1 при чётном N, N при нечётном). Но сегодня поле является свободным вводом, и это сбивает с толку.

Поставлю это в список для следующего патча (v5.5.2 или v5.6): когда type_tournament='round_robin', поле num_turns становится отключённым/серым и автоматически обновляется до N‑1 (или N с BYE) сразу после изменения количества команд, с небольшим всплывающим подсказкой, объясняющей почему.

Не включил в v5.5.1, потому что это косметика UX, а исправление выше было срочным: лучше не замедлять.

═══════════════════════════════════════════════════════════

ENGINE ERROR — сообщение исчезает слишком быстро

═══════════════════════════════════════════════════════════

Понял. Сейчас это жёлто‑красный всплывающий элемент, который самоуничтожается, но если судья в зале и вокруг него десять игроков спрашивают «когда стартуем?», он не видит.

В v5.5.2 (или v5.6) превратим его в модальное окно с явным подтверждением «Понял» для ошибок движка pairing. Остальные информационные всплывающие останутся как есть — я не хочу загромождать UX рутинными вещами, но ошибка движка должна быть настойчивой.

═══════════════════════════════════════════════════════════

QR CODE В ПЕЧАТЬ ТУРА — уже есть!

═══════════════════════════════════════════════════════════

Хорошая новость: QR‑код в «Печать тура» уже работает некоторое время, как для индивидуальных турниров, так и для командных. Он находится в правом верхнем углу печати A4. Указывает напрямую на публичную страницу турнира, где игроки видят пары и таблицу в реальном времени.

Причина, почему ты, возможно, не видел его: он появляется ТОЛЬКО если у турнира включена публичная видимость (и сгенерирован token_pubblico). Если в настройках турнира оставить «приватный», QR не печатается (бывало бы бесполезно, страница была бы недоступна).

Итак:

  1. Перейти в Настройки турнира
  2. Видимость → «Публичный»
  3. Сохранить
  4. Повторная печать тура → QR‑код появится в правом верхнем углу


Если же ты имел в виду QR на листе регистрации или таблице, дай знать, и я добавлю его там.

═══════════════════════════════════════════════════════════

ПОДТЕЖДЕНИЕ РАССТУПЛЕННЫХ — PoC в работе

═══════════════════════════════════════════════════════════

Подтверждаю, что PoC, о котором я рассказывал в v5.5.0, даёт положительные сигналы (Z и SHORT работают оба с bbp6). Я добавлю это в v5.6, когда полностью интегрирую в форму «Добавить команду к текущему турниру». Ты прав, placeholder — это просто временное решение; реальность такова, что до v5.6 это единственный надёжный путь, и прошу прощения.

═══════════════════════════════════════════════════════════


В итоге:

• v5.5.1 (сегодня): исправление ошибки 6 команд, то есть блокирующий пункт

• v5.5.2/v5.6 (в ближайшее время): RR greyout, модальное подтверждение ошибок движка

• v5.6: регистрация задержанных после PoC проверено


Когда найдёшь минуту, попробуй снова свой 6‑командный Swiss с любым num_turns: он должен проходить до тура 5 без «Pairing engine error» и без остановки на туре 3. Дай знать, как прошло.


Привет, Стефано,

Я рад, что мы нашли эту «баг» в питании bbp6, это было довольно обманчиво! И я увидел, что вы уже установили 5.6.3. Я попробовал, но Генератор Турнира падает с тем же сообщением (на этот раз модальное окно). Я также попытался удалить турнир (третий) и создать его заново, но он всё равно останавливается на третьем туре и не генерирует четвертый. Затем я попробовал удалить все турниры, чтобы пройти через «Запустить Турнир», и это работало до пятого. На этом этапе я подозреваю, что изменение вступает в силу только если турнир был запущен новой версией, иначе XXR уже был отправлен.

Да, количество туров Round Robin не срочно, можно подождать.

Но QR‑код я совсем не вижу :) Конечно, я имею в виду «Печать тура» админа, потому что это то, что судья печатает и прикрепляет в зале. Чтобы прояснить, как пример, эта ссылка: https://my.chesspairings.org/stampa_abbinamenti_squadre.php?id=225&turno=1. А в публичном разделе действительно есть QR‑код, который указывает на Telegram («Следите за этим турниром в Telegram»), но выделенный блок всё равно пустой (например, https://my.chesspairings.org/pubblico/torneo_squadre.php?id=225&token=1cc53800c380a43d37ab097d5509b97ace5f78718b7e09f3a725f8ddcd0fdeb8). Но если я уже нахожусь на публичной странице, мне не нужен QR‑код для публичной страницы, он нужен тем, кто видит тур, распечатанный админом. И если я зайду в настройки турнира, я не вижу флага «Видимость → Публичный», вижу только «Онлайн‑регистрация команды» и «Онлайн‑регистрация индивидуальных». То же самое при создании турнира. Кроме того, как вы говорили, нужен QR‑код также в таблице (который указывает на публичную таблицу), а также для удобства, чтобы дать большую видимость вашей программе. Поэтому я немного запутался. Но я нашёл флаг в индивидуальных турнирах, возможно, вы не распространили его на команды?!

Я тоже смущён возможностью добавить задерживающихся... я понял, что с 5.6 будет такая возможность, я вижу 5.6.3 онлайн, но не вижу «Добавить команду в текущий турнир»… возможно, я неправильно понял.


Привет,

Клаудио.


Изменено 18/05/2026 21:38

ciao @LTB

ho chiuso tutti i tre punti che mi avevi segnalato dopo la v5.6.3. Te li riepilogo per ordine. Sono già tutti in produzione (v5.6.9 al footer).

═══════════════════════════════════════════════════════════

ISCRIZIONE RITARDATARI SQUADRE — v5.6.4

═══════════════════════════════════════════════════════════


✓ Fatto. Replicato il pattern dei tornei individuali (esisteva già in mig 051) anche per le squadre.

Come si attiva: in Impostazioni torneo trovi un nuovo flag "Consenti iscrizione tardiva" (visibile solo per Swiss, l'RR per definizione ha calendario fisso). Quando è attivo e il torneo è in corso, nella scheda Squadre compare una card arancio "Aggiungi squadra a torneo in corso". La squadra entra dal turno successivo a 0 punti e con numero_squadra MAX+1 (non rinumero il seeding originale, mantengo la storia TRF di bbp6 coerente).


Il PoC (Proof of Concept) che ti raccontavo nella v5.5.0 mi aveva confermato che bbp6 accetta "0000 - Z" per i turni passati (zero-point bye, FIDE C.04.2 Art. 2.4) — quindi questo è il formato in produzione adesso, no placeholder fragili.

Sul cap XXR mi hai fatto pensare a un dettaglio importante: se aggiungi una squadra il max_teorico cresce (es. da 6 squadre a 7, max passa da 5 a 7). Però se questa squadra poi si ritira torni a 6 squadre — e nella v5.5.1 il cap si ricalcolava a max(N-1)=5, abbassando di nuovo il limite e potenzialmente rompendo pairing già prodotti col cap 7. Soluzione adottata (chiamiamola "opzione 3"): salvo il max_teorico AL MOMENTO DELL'AVVIO in una colonna `xxr_baseline`. Il cap effettivo nel TRF è ora `MAX(xxr_baseline, max_teorico_attuale)`. Late entry alza il cap, ritiri non lo abbassano sotto il baseline.

Test: ho aggiunto 12 nuovi test automatici al test runner squadre (PARTE C + PARTE D) — 31 verdi su 31. Il C10 in particolare conferma che bbp6 genera correttamente un turno 3 a 5 squadre quando il baseline è ancora 3 (chiamata reale al motore, non solo precheck logico).

══════════════════════════════════════════════════════════

QR CODE — VISIBILITÀ PUBBLICA E STAMPA CLASSIFICA (v5.6.5)

═══════════════════════════════════════════════════════════

Sul punto del QR Code nella vista pubblica hai centrato un buco: il flag "Visibilità privato/pubblico" esisteva sui tornei individuali ma non sulle squadre — io le avevo lasciate "sempre tecnicamente pubbliche" via token_pubblico autogenerato, scelta che era funzionale al sistema follower Telegram ma incoerente come UX. Adesso anche le squadre hanno il toggle, con un'unica differenza rispetto agli individuali: default 'pubblico' (sui nuovi e sui legacy via backfill) — così non rompo i follower esistenti. Quando lo metti privato la pagina pubblica dà 404, niente QR nelle stampe e i broadcast Telegram si auto-sospendono.

Stampa classifica: nuova pagina `stampa_classifica_squadre.php` (analoga a stampa_abbinamenti_squadre) con QR in alto a destra che porta alla classifica pubblica live. Ne ho fatto una anche per gli individuali. Le trovi col link "Stampa classifica" accanto al menu Esporta, nella scheda Classifica. A4 portrait, auto-stampa.

═══════════════════════════════════════════════════════════

QR TELEGRAM BIANCO NELLA VISTA PUBBLICA (v5.6.6 → v5.6.9)

═══════════════════════════════════════════════════════════

Questo punto è stato il più rognoso. La libreria QR che usavamo (davidshimjs/qrcodejs, una versione del 2013) ha smesso di funzionare su Chrome 148+: errore `f.getPatternPosition is not a function` riproducibile su qualsiasi testo, qualsiasi correctLevel. Identico in modalità incognito e con la lib inline o esterna — niente a che vedere con cache o estensioni. Probabilmente un'ottimizzazione JIT del browser che non digerisce la minificazione vecchia.

Soluzione: ho sostituito con `qrcode-generator` di Kazuhiko Arase (la lib autoritativa da cui qrcodejs aveva forkato), versione corrente, output SVG inline scalabile. Helper unico `renderQR(elemento, testo, sizePx)` su tutte le 10 pagine del progetto che generavano QR (le 4 stampe + le 2 pagine pubbliche + iscrizione + profilo + dashboard utente + marathon).

Risultato: i QR ora funzionano dappertutto, su tutti i browser. Test sul tuo Chrome dovrebbero passare al primo tentativo.

═══════════════════════════════════════════════════════════

TORNEI XXR GIÀ "ROTTI" — BACKFILL + DIAGNOSTICA (v5.6.7)

══════════════════════════════════════════════════════════

Sul punto che mi avevi sollevato dei tornei in corso che avevano già XXR storica gonfia: ho fatto due cose.

  1. (1) Backfill (migrazione 074): ho scritto retroattivamente `xxr_baseline` su 22 tornei legacy Swiss in_corso/concluso con baseline NULL. Il valore calcolato è identico al cap che si applicherebbe ora — quindi nessun comportamento attuale cambia, ma i tornei legacy diventano robusti contro ritiri futuri e protetti dall'opzione 3 esattamente come quelli creati in v5.6.4+.
  2. (2) Diagnostica salute torneo: in cima alla pagina del torneo Swiss in corso, se `num_turni > max_teorico_effettivo`, compare un banner giallo permanente che dice quante squadre attive ci sono, qual è il massimo Swiss raggiungibile, e suggerisce di ridurre num_turni o usare pairing manuale per gli eccedenti. Prima questo warning si vedeva SOLO dopo aver tentato un'azione (salva o genera turno); ora è visibile a colpo d'occhio appena apri il torneo. Resta poi il warning specifico in `aggiorna()` e il blocco preventivo in `generaTurno()` per dare il messaggio giusto al momento giusto.

═══════════════════════════════════════════════════════════

EXTRA — ZONA PERICOLOSA PER IL BOTTONE ELIMINA

════════════════

12»
Войти чтобы участвовать в обсуждении
Этот сайт использует технические и аналитические файлы cookie для улучшения работы.