Разработка и поддержка фитнес-сервиса iFitnessPro на Webasyst
О проекте
Развитие сервиса профессионального фитнес-сопровождения iFitnessPro
iFitnessPro.ru — проект профессионального фитнес-сопровождения из Балашихи. В личном кабинете пользователь работает со своей программой: открывает упражнения и видео техники выполнения, задаёт рабочие значения, оценивает нагрузку и просматривает историю занятий.
Команда Quadro Design занималась разработкой, доработкой и технической поддержкой функций сервиса на Webasyst Shop-Script. Проект объединял тренировочный модуль, платные подписки, управление доступом, календарь, статистику и партнёрскую программу.
- Проект
- iFitnessPro.ru
- Тематика
- Профессиональное фитнес-сопровождение и персональные тренировочные программы.
- Город проекта
- Балашиха.
- Платформа
- Webasyst Shop-Script с индивидуальными доработками плагинов и личного кабинета.
- Направления работ
- Программирование, техническая поддержка, доработка интерфейса, подписки и платежи, расчётные сценарии, статистика и партнёрские заявки.
Работы развивались поэтапно: от административных шаблонов и ручного назначения подписки до оплаты, конвертации оставшегося срока, уведомлений и дополнительных сценариев личного кабинета. Ниже описаны требования проекта, выполненные доработки и результаты проверки, зафиксированные в рабочем документе.
Задачи проекта
- Организовать управление тренировочными программами FullBody, Split AB и Split ABC в административной части.
- Связать доступные программы и действия пользователя с уровнем и сроком подписки.
- Добавить в личный кабинет тренировку, календарь, карточки упражнений и архив выполненных занятий.
- Сохранять индивидуальные веса, повторения, подходы и оценки пользователя.
- Обеспечить расчёт следующих тренировок по заданным заказчиком правилам.
- Доработать выбор числовых значений и карт весов под оборудование пользователя.
- Поддержать оплату, бесплатный месяц, продление и переход между тарифами.
- Добавить уведомления о подписке и смене тренировочного этапа.
- Расширить партнёрскую программу копированием ссылок и оформлением заявок на выплату бонусов.
- Проверять изменения в административной части, на компьютерах и смартфонах.
Подписки и разграничение доступа
Уровни подписки и доступные программы
В тренировочном модуле были предусмотрены три активных уровня подписки: «Новичок», «Профи» и «Тренер». Отдельное состояние — неактивная подписка.
| Состояние подписки | Доступные виды тренировок | Правила доступа |
|---|---|---|
| Неактивна | FullBody | Сохранённые данные видны, редактирование, оценки и перерасчёт заблокированы. |
| Новичок | FullBody, Split AB | Доступны действия активной подписки и выбор разрешённой программы. |
| Профи | FullBody, Split AB, Split ABC | Доступны все три вида тренировок. |
| Тренер | FullBody, Split AB, Split ABC | Доступны все три вида тренировок в рамках предусмотренного уровня. |
- Недоступные по уровню подписки программы скрываются из списка выбора.
- Пользователь меняет вид тренировки через «Мой профиль» в пределах разрешённых вариантов.
- Администратор меняет вид тренировки через карточку покупателя.
- Ручное назначение уровня подписки и даты окончания доступно администратору.
- После подключения оплаты приобретённый уровень активируется по подтверждённому платежу.
- По окончании срока подписка становится неактивной.
Уровень «Тренер» в этом кейсе относится к подписке и её возможностям. Административная работа с клиентами описана отдельно: просмотр и редактирование тренировок, статистики, уровня доступа и срока действия.
Первоначальная модель подписок как товаров
Начальная спецификация предусматривала пять товаров-подписок с разной ценой и набором функций. Для управления скрытым контентом и действиями планировалось использовать до десяти идентификаторов доступа.
| Условный товар из ТЗ | Пример набора функций |
|---|---|
| А | Ф1, Ф2, Ф3 |
| Б | Ф1, Ф2, Ф3, Ф4, Ф5, Ф6 |
| В | Ф1, Ф2, Ф3, Ф4, Ф5, Ф6, Ф7 |
| Г | Ф5, Ф6, Ф7, Ф8, Ф9 |
| Д | Ф1, Ф9, Ф10 |
Идентификаторы должны были управлять видимостью текста и изображений, запуском скриптов, выполнением команд и арифметических действий. Для первых сценариев доступа в ТЗ отдельно описывались следующие группы:
| Идентификатор | Аудитория и доступ |
|---|---|
| Ф0 | Все посетители сайта. |
| Ф1 | Зарегистрированные пользователи без активной подписки: личный кабинет и его базовое содержимое. |
| Ф2 | Зарегистрированные пользователи с активной подпиской на товар А: дополнительное содержимое и функции А. |
| Ф3 | Зарегистрированные пользователи с активной подпиской на товар Б: дополнительное содержимое и функции А и Б. |
Срок, стоимость и скидки
- Продолжительность подписки выбирается целым количеством месяцев: от 1 до максимума K, заданного в карточке товара.
- В качестве примера максимального срока в ТЗ использовались 12 месяцев.
- Цена указывается за один месяц, итоговая сумма зависит от выбранного количества месяцев.
- Предусматривалась настраиваемая скидка N% при достижении установленного условия по сроку M.
- В примере скидки использовались 20%, то есть коэффициент 0,8, при оплате более 12 месяцев.
Максимум K и порог скидки M описывались как настройки товара. Примеры «максимум 12 месяцев» и «скидка при сроке более 12 месяцев» относятся к иллюстрациям настроек и требуют согласованной конфигурации.
Бесплатный месяц
При регистрации нового пользователя реализована автоматическая подписка «Новичок» на один календарный месяц от даты регистрации. В настройках плагина предусмотрено включение и отключение бесплатного месяца.
После окончания пробного периода действуют общие правила неактивной подписки. В профиле показывается состояние подписки, а в тренировочном разделе — предложение её продлить.
Оплата, продление и переход между тарифами
Регистрация и оформление подписки
Исходный сценарий оплаты предусматривал авторизацию до перехода к платежу: незарегистрированный пользователь проходит регистрацию или вход, авторизованный сразу продолжает оформление.
При проверке обсуждалось автоматическое создание аккаунта во время оформления заказа и доступ в личный кабинет. Заказчик настаивал на понятном процессе регистрации с однократным подтверждением электронной почты. В рабочем документе этот вопрос закрыт сообщением заказчика о корректной работе после настройки.
Отдельно проверялось назначение бесплатной подписки при регистрации через страницу оформления заказа. Разработчик привёл успешный тест; отдельная итоговая отметка заказчика по этому маршруту в документе отсутствует.
Подтверждённый платёж и обновление подписки
- Оплаченный уровень и срок активируются после получения подтверждения от банка.
- После успешной оплаты уровень подписки меняется на приобретённый пользователем.
- Продолжительность определяется количеством оплаченных календарных месяцев.
- При продлении активной подписки месяцы добавляются к существующей дате окончания.
В ТЗ приведены два примера календарного расчёта:
- Оплата девяти месяцев 12 марта 2022 года — окончание подписки 12 декабря 2022 года.
- При действующей подписке до 20 марта 2022 года покупка ещё четырёх месяцев — продление до 20 июля 2022 года.
Конвертация неиспользованного остатка
Разработан калькулятор перехода на другой уровень подписки. Оставшийся срок предыдущего тарифа переводится в денежный эквивалент, затем — в дополнительный срок нового тарифа.
Важное условие первоначального ТЗ: при расчёте остатка учитывать фактически оплаченную стоимость прежней подписки. Текущая цена товара может отличаться из-за изменения тарифа, скидки или специальной цены покупки.
Демонстрационный расчёт из проектного документа:
- У подписки «Новичок» осталось 30 дней; использованная в примере месячная стоимость — 990 рублей.
- Стоимость дня для этого примера: 990 / 30 = 33 рубля.
- Неиспользованный остаток: 30 × 33 = 990 рублей.
- При переходе на «Профи» с примерной месячной стоимостью 4 990 рублей остаток соответствует приблизительно шести дням нового тарифа.
- На макете перехода на тариф стоимостью 9 990 рублей тот же остаток отображался как приблизительно три дополнительных дня.
На странице подписок показывались текущая подписка, оставшиеся дни и информация о конвертации при покупке другого уровня. Указанные суммы и деление на 30 дней — исторические примеры калькулятора из ТЗ; календарное продление описывалось отдельно.
Страница подписок в приложении «Магазин»
Для работы с классами Shop-Script страницу подписок перенесли из приложения «Сайт» в приложение «Магазин». В документе зафиксирована страница /subscription/ с динамической информацией о подписке и конвертации.
При переносе учитывалась работа языкового модуля: вручную заданный префикс /ru мог конфликтовать с автоматически добавляемым языковым префиксом. В ранних задачах и уведомлениях также использовался маршрут /ru/subscription/.
Возврат после оплаты
При возвращении от банка пользователь мог видеть устаревшее состояние заказа: статус «Новый» и кнопку оплаты. Причина — задержка между возвратом пользователя и получением банковского ответа сайтом.
Для этого сценария сделана отдельная страница /payment-success/ с сообщением «Заказ успешно оплачен» и ссылкой на «Мои заказы». В документе также указан маршрут ошибки оплаты /failure/.
На предыдущем этапе обсуждались возврат непосредственно в карточку заказа /my/order/…/ и переход со страницы /success/, для которой использовался редирект на /my/orders/. Последующее подтверждённое решение для банковской задержки — отдельная страница успешной оплаты.
Заказ с нулевой суммой после применения бонусов
Если подписка полностью оплачивается бонусами и денежная сумма к оплате равна нулю, заказ автоматически переводится в состояние «Выполнен», а срок подписки обновляется. Этот сценарий отмечен как выполненный.
Такой заказ должен завершаться без попытки провести через банк платёж на нулевую сумму.
Письма и статусы заказов
В ходе проверки обнаружены два письма после подтверждения заказа: об оформлении и о переводе в статус «Новый». Заказчик запросил одно письмо об оформлении без дополнительного уведомления о статусе «Новый».
Отдельная задача об автоматическом переводе обычного оплаченного заказа сразу в «Выполнен» и отключении дополнительного письма о статусе была отменена: заказчик решил её через настройки административной части. Автоматическое завершение заказа, полностью оплаченного бонусами, описано как самостоятельная выполненная доработка.
Личный кабинет и календарь тренировок
Разделы кабинета и данные профиля
В интерфейсе проекта использовались разделы «Тренировка», «Мой профиль», «Статистика» и «Партнёрская программа».
Профиль включал имя, электронную почту, пол, дату рождения, рост, вес, уровень подготовки и ежедневную активность. Дополнительно отображались подписка, дата её окончания и выбранный вид тренировок.
- При активной подписке показываются её уровень и дата окончания.
- При неактивной подписке выводятся соответствующее состояние и ссылка на оформление.
- Выбор программы ограничивается доступными по подписке вариантами.
- Начальная программа после регистрации — FullBody.
На первом этапе раздел «Мои заказы» временно скрывался. При развитии платных подписок страницы заказов использовались в сценариях оформления и возврата после оплаты.
Календарь на семь ближайших дней
Для тренировочного раздела предусмотрен календарь со всеми днями недели и отображением ближайших семи дней.
- Красным обозначается день запланированной тренировки.
- Белым обозначается день без тренировки.
- Зелёным обозначается день выполненной тренировки.
- При выборе тренировочной даты показывается соответствующий вариант А, В или С.
- При выборе свободной даты выводится сообщение об отсутствии тренировки.
- Календарь активного тренировочного сценария должен учитывать смену даты и перенос дней.
В начальной схеме планирования использовалось чередование занятий через день. Первая тренировка А привязывалась к текущей дате сервера, следующая В — к дате через два дня. Для Split ABC в последовательность добавлялась тренировка С.
По умолчанию требовалось показывать тренировку с ближайшей датой. Позднее заказчик уточнил приоритет незавершённого занятия: оно должно переноситься на следующие даты без изменения состава и уже выставленных оценок, пока пользователь его не завершит.
Карточка упражнения
- Нажатие на упражнение в общей таблице открывает его подробный экран.
- В верхней части размещается видео техники выполнения.
- Ниже показываются название и ссылка на описание техники.
- По каждому подходу выводятся рабочий вес и количество повторений.
- В первоначальной спецификации предусматривалось от одного до девяти подходов.
- Кнопка выполнения упражнения открывает выбор оценки.
- После сохранения оценки пользователь возвращается к общей тренировке.
- Нажатие на существующую оценку позволяет оценить упражнение повторно.
Первоначальные макеты использовали цветовое разделение: название и техника — синий блок, значения подходов — белые поля, действия выполнения и завершения — зелёные кнопки, строки упражнений в общей таблице — жёлтые поля.
Отсутствующий вес и нулевой вес
Для упражнений без значения веса столбец «Вес» должен скрываться. Это отдельный случай, например разминка. Значение 0 сохраняется и показывается: оно может обозначать пустой гриф, платформу без дополнительного отягощения или упражнение без добавленного веса.
Поведение при неактивной подписке
Тренировочная таблица сохраняется и остаётся видимой. Редактирование чисел, выбор оценок, активные ссылки и расчёт следующей тренировки блокируются.
В исходном ТЗ отдельно зафиксировано сохранение всех значений, включая даты, на последнюю дату активной подписки. Если подписка никогда не активировалась, используются данные на дату регистрации.
Вместо завершения тренировки предусмотрена красная кнопка «Подписка неактивна! Продлить подписку?» с переходом к оформлению подписки.
Управление тренировками в административной части
Шаблоны FullBody, Split AB и Split ABC
В разделе «Магазин → Настройки» предусматривалась вкладка «Тренировки», расположенная между настройками режима работы и типов товаров. Внутри — отдельные вкладки FullBody, Split AB и Split ABC.
Каждая программа содержит шаблоны тренировок А и В; Split ABC дополнительно содержит тренировку С.
- Значения ячеек административного шаблона доступны для редактирования и сохранения в базе данных.
- Дата в шаблоне показывается как текущая; отдельная история изменения шаблона не требовалась.
- Каждое упражнение хранится под уникальным идентификатором
IDupr. - При вводе существующего идентификатора подставляются ранее сохранённые данные упражнения.
- При вводе нового идентификатора создаётся новая запись.
- Описание упражнения представляет собой редактируемый HTML-блок с названием, видео и ссылкой на технику выполнения.
- Отдельно хранятся веса, повторения и данные подходов.
- Исходная графа оценки остаётся пустой до действий пользователя.
- Нумерация внутри тренировки начинается с 1, не включает разминку и не является частью описания упражнения.
Формирование персональной программы
Персональная таблица пользователя создаётся из актуального административного шаблона после регистрации или изменения вида тренировки.
Важное правило: последующее изменение общего шаблона не должно автоматически перезаписывать существующую персональную тренировку. Состав и параметры запоминаются на момент генерации; повторное формирование происходит при перевыборе программы.
Редактирование непосредственно назначенной клиенту тренировки — отдельный административный сценарий. В нём изменяются данные конкретного пользователя.
Работа с клиентом
- В карточку покупателя добавляются вид тренировки, уровень подписки и дата окончания.
- В списке покупателей предусмотрены сведения о типе подписки и сроке её действия.
- Через карточку клиента предусмотрены просмотр и редактирование тренировки и статистики.
- Для назначенной тренировки добавлены задачи по изменению весов и повторений, добавлению и удалению подходов, замене упражнения.
- Доработка добавления подходов и замены упражнений отмечена как готовая; после этого заказчик запросил пояснение по использованию этих действий.
- Для отключения подписки требовалось заменить пустой вариант выбора понятным состоянием «Неактивна».
При работе с административной частью учитывались различия старого и нового интерфейсов Webasyst. В проектной переписке согласовано использование старого интерфейса, для которого выполнялись изменения.
Краткая запись нагрузки в списке упражнений
Для общей таблицы согласован компактный формат «количество подходов × вес первого подхода × повторения первого подхода», например 4 × 10 × 10.
Подробные значения каждого подхода остаются внутри упражнения. В документе эта доработка отмечена как готовая, но затем зафиксировано повторное замечание: после административного изменения продолжали отображаться несколько строк вместо одной.
Структура и примеры исходных тренировочных шаблонов
В макетах ТЗ FullBody содержит по девять основных упражнений в тренировках А и В. Split AB содержит семь упражнений в А и девять в В. Для Split ABC используются эти варианты А и В и дополнительная тренировка С из семи упражнений.
Все варианты начинаются с разминки. В образцах указана беговая дорожка на 10 минут: 3 минуты — 5 км/ч, 3 минуты — 7 км/ч, 3 минуты — 9 км/ч, 1 минута — 6 км/ч.
Ниже сохранены демонстрационные значения из исходных макетов. Запись «вес/повторения» относится к отдельному подходу; точка с запятой разделяет подходы. Единственный показатель оставлен в том виде, в котором он указан в макете.
FullBody — тренировка А
| Упражнение | Пример значений подходов |
|---|---|
| Разгибания ног в тренажере | 8; 8 |
| Гиперэкстензия | 0/15; 0/15 |
| Подъем на носки с гантелями | 10/15; 10/15 |
| Сведение рук в тренажере «пек-дек» | 27/10; 27/10 |
| Тяга на горизонтальном блоке | 30/10; 30/10 |
| Жим гантелей сидя | 6/10; 6/10 |
| Подъем гантелей на бицепсы | 8/10; 9/10 |
| Жим гантелей из-за головы | 6/10; 6/10 |
| Подъем ног на брусьях с поворотом | 10; 10 |
FullBody — тренировка В
| Упражнение | Пример значений подходов |
|---|---|
| Жим ногами платформы | 10/10; 10/10 |
| Сгибание ног в тренажере | 27/10; 27/10 |
| Подъем на носки в тренажере | 10/10; 10/10 |
| Разведение гантелей лежа | 6/10; 6/10 |
| Тяга штанги в наклоне | 10/10; 10/10 |
| Подъем гантелей через стороны | 5/10; 5/10 |
| Сгибание рук в тренажере | 8/10; 8/10 |
| Разгибание рук в кроссовере | 18/10; 18/10 |
| Скручивания с поворотом | 15; 15 |
Split AB и Split ABC — тренировка А
| Упражнение | Пример значений подходов |
|---|---|
| Приседания со штангой | 6/10; 6/10; 6/10 |
| Румынская тяга | 12/10; 12/10; 12/10 |
| Подъем на носки с гантелями | 15/20; 15/20; 15/20 |
| Армейский жим | 2/10; 2/10; 2/10 |
| Сгибание ног в тренажере | 27/10; 27/10; 27/10 |
| Разгибания ног в тренажере | 47/9; 47/9; 47/9 |
| Подъем штанги к подбородку | 5/11; 5/11; 5/11 |
В демонстрационном макете Split AB оценки этих упражнений составляли соответственно 8, 7, 7, 8, 8, 9 и 8. В исходной административной модели новые оценки должны оставаться пустыми до действий пользователя.
Split AB и Split ABC — тренировка В
| Упражнение | Пример значений подходов |
|---|---|
| Жим штанги лежа на наклонной скамье | 6/10; 6/10 |
| Подтягивания в гравитроне узким хватом | 35/12; 35/12 |
| Отжимания в гравитроне | 35/12; 35/12 |
| Тяга на горизонтальном блоке | 50/10; 50/10 |
| Подъем ног на перекладине с поворотом | 11; 11 |
| Подъем плеч, «шраги» | 16/10; 16/10 |
| Сгибание рук со штангой | 7/10; 7/10; 7/10 |
| Разгибание рук в кроссовере | 25/10; 25/10; 25/10 |
| Подъем корпуса на римской скамье | 20; 20; 20 |
Split ABC — тренировка С
| Упражнение | Пример значений подходов |
|---|---|
| Жим ногами платформы | 10/10; 10/10 |
| Сгибание ног в тренажере | 27/10; 27/10 |
| Подъем на носки в тренажере | 10/10; 10/10 |
| Разведение гантелей лежа | 6/10; 6/10 |
| Тяга штанги в наклоне | 10/10; 10/10 |
| Подъем гантелей через стороны | 5/10; 5/10 |
| Сгибание рук в тренажере | 8/10; 8/10 |
Карты весов и выбор числовых значений
Справочник карт
Для оборудования с разными наборами отягощений предусмотрен отдельный справочник карт весов. В административной части запрошен четвёртый раздел после FullBody, Split AB и Split ABC — «Карты весов».
- Каждая карта имеет идентификатор и список допустимых значений.
- Списки можно добавлять, редактировать и сохранять в базе данных.
- В поле упражнения хранится идентификатор карты, а не полный перечень весов.
- Для одного упражнения могут использоваться разные комбинации под оборудование разных залов.
- В обсуждении предполагалось примерно три-четыре комбинации на упражнение.
Выбор значения в два действия
Доработан сценарий «нажать на число → прокрутить список → выбрать значение». После выбора число сохраняется в соответствующей ячейке, а окно закрывается.
- На компьютере список прокручивается колесом мыши.
- На смартфоне используется прокрутка пальцем.
- Выбранное значение выделяется зелёным.
- Активное значение располагается в середине контейнера.
- Контейнер позиционируется относительно редактируемой ячейки.
Выбор чисел и центрирование активного значения отмечены в документе как выполненные.
Смена карты под оборудование пользователя
Если нужного веса нет в закреплённой карте, пользователь может переключиться на другую. Выбранный идентификатор сохраняется для этого упражнения у этого пользователя и используется при следующих открытиях.
Переключение должно быть циклическим. Для пяти карт и начальной карты №3 в ТЗ приведены последовательности:
- Влево: 3 → 2 → 1 → 5 → 4 → 3.
- Вправо: 3 → 4 → 5 → 1 → 2 → 3.
- Количество карт может увеличиваться.
В отдельной спецификации повторения выбираются из карты №5 — ряда от 1 до 50, без стрелок переключения карты. В другой редакции задачи для подходов указан служебный список №0 с тем же диапазоном 1–50. Эти записи относятся к разным формулировкам задания; первоначальный предел количества подходов в карточке упражнения составлял девять.
Дробные значения и ближайший доступный вес
В административной таблице добавлена возможность вводить дробные веса, например 27,2 и 3,75. Эта доработка отмечена как готовая.
Для следующей тренировки требуется выбирать ближайшее значение из назначенной карты, а не округлять расчёт до целого числа. Эта задача также отмечена как выполненная.
Пример из документа: при карте 5, 10, 15, 20, 25, 30… рассчитанное значение 22 заменяется на 20, а 23 — на 25.
Доступность переключения карт
В проверке обсуждались стрелки выбора в настольном Chrome, мобильном Chrome, Firefox, Opera и Яндекс Браузере. Разработчик объяснил отсутствие стрелок действовавшим ограничением после первой завершённой тренировки.
В более позднем задании смена карты и замена упражнения связывались с активной подпиской и тренировочным днём. Согласование этих правил и итоговая проверка доступности в перечисленных браузерах относятся к контрольным сценариям документа.
Оценки нагрузки и расчёт следующей тренировки
Оценка упражнения и общей тренировки
Для каждого упражнения предусмотрена оценка от 3 до 10. После выполнения всех упражнений пользователь отдельно оценивает тренировку в целом.
| Балл | Оценка упражнения в ТЗ | Описание общей нагрузки на макете |
|---|---|---|
| 3 | Нагрузка не ощущается. | Нагрузка совсем незаметна. |
| 4 | Очень лёгкая нагрузка. | Было очень легко. |
| 5 | Могу сделать ещё столько же. | Было легко. |
| 6 | Могу сделать больше. | Было не особо трудно, обычная нагрузка. |
| 7 | Могу сделать ещё 3–4 раза. | Нормально, нагрузка ощущалась хорошо. |
| 8 | Пару раз ещё могу сделать. | Было трудно, нагрузка приличная. |
| 9 | Могу сделать ещё разок. | Очень тяжело, но организм выдержал нагрузку. |
| 10 | Не могу больше. | Ноги не держат, в глазах темнеет, шум в ушах. |
Таблица описывает подписи исходного интерфейса проекта. Оценка упражнения сохраняется в базе пользователя и отображается в общей таблице. Финальная оценка сохраняется за датой тренировки.
Отдельная оценка готовности после разминки
Для разминки добавлен отдельный список «Готовность к тренировке». Он использует записи type = 3 из таблицы shop_ifitness_ocenki. Остальные упражнения используют список type = 1.
- В задаче указаны разминки
upr000,upr100,upr101и аналогичные упражнения. - Признаком служит первая строка тренировки или отсутствие карты весов:
veskart = null. - Оценка готовности выставляется для каждой новой тренировки и даты, включая варианты А, В и С.
- Сохранение и дальнейшее использование значения работают по общему механизму оценок.
- Для оформления длинных подписей добавлен отдельный CSS-класс
type-3.
Доработка списка готовности и отдельного оформления проверена заказчиком и подтверждена как корректная.
Завершение и архивирование
- Пользователь оценивает все упражнения текущей тренировки в любом порядке.
- Нажимает «Завершить тренировку».
- Выбирает итоговую оценку от 3 до 10.
- Система сохраняет дату, идентификаторы упражнений, подходы, веса и повторения каждого подхода, оценки упражнений и общую оценку.
- Кнопка становится неактивной и получает текст «Тренировка завершена».
- День занятия отмечается зелёным.
- Подготавливаются данные следующей тренировки соответствующего варианта.
Если хотя бы одно упражнение не оценено, должно появляться сообщение «Не все упражнения выполнены». В дополнительном замечании запрошено перемещение к этому сообщению в самое начало страницы.
Расчётный блок по первоначальной спецификации
Расчётные правила задавались заказчиком. В первоначальном ТЗ зафиксированы следующие формулы:
Д2 = Д1 + 2
В2 = В1 + Вдоб
Вдоб = 1,1 × В1 × (0,93 + (10 − Оупр) / 100)
П2 = П1 + Пдоб
Пдоб = В1 × П1 / В2
- Д1 — текущая дата сервера; Д2 — дата следующей тренировки по указанной в ТЗ формуле.
- В1 — текущий вес; В2 — следующий вес; Вдоб — расчётная добавка.
- Оупр — оценка упражнения пользователем.
- П1 — повторения завершённой тренировки; П2 — следующие повторения; Пдоб — расчётная добавка.
После перерасчёта оценки новой тренировки очищаются для следующего заполнения. По первоначальной схеме завершение А пересчитывает А, сохраняя данные В; завершение В аналогично пересчитывает В. Для Split ABC учитывается дополнительный вариант С.
В дальнейшем расчётный сценарий уточнялся задачами по использованию фактических оценок, выбору ближайшего веса из карты, периодизации и сохранению незавершённых занятий. Приведённые формулы относятся к первоначальной спецификации проекта.
Исправление использования оценок
При проверке обнаружено, что расчёт использовал оценку 3 независимо от реально сохранённого значения. Исправление отмечено как выполненное: при наличии записи истории используется её поле grade, при отсутствии записи остаётся резервное значение 3.
Также отдельно отмечено исправление отображения оценки 10 в статистике.
Периодизация каждой десятой тренировки
Заказчик добавил требование учитывать номер тренировки в цикле и снижать нагрузку каждой десятой тренировки приблизительно на 40–50%.
В обсуждении приведён пример: при cicle_num >= 10 используется коэффициент ves_low = 0.6, счётчик возвращается к 1; в остальных случаях коэффициент равен 1. В документе заказчик сообщил, что самостоятельно нашёл решение для этого сценария.
Тестирование расчётов
Для повторного тестирования добавлена кнопка очистки пользовательской тренировки, статистики и оценок. Она позволяла повторять сценарий завершения и перерасчёта без ожидания следующего тренировочного дня.
Статистика и история тренировок
В разделе «Статистика» предусмотрена таблица архивных данных выполненных тренировок. Базовое отображение сохранённой истории отмечено как выполненное.
Архив содержит даты занятий, состав упражнений, значения каждого подхода, индивидуальные оценки и итоговое утомление. Доступ к просмотру данных клиента также предусматривался в административной части.
Все занятия и фильтры А, В, С
- При открытии раздела все вкладки вариантов А, В и С серые и неактивные.
- Таблица показывает все прошедшие тренировки и даты.
- Первая дата активна и выделена зелёным.
- Список упражнений слева соответствует тренировке на активную дату.
- При выборе другой даты список упражнений меняется на состав, сохранённый для этой даты.
- Выбор А, В или С оставляет только даты соответствующего варианта.
- Если прежняя активная дата относится к другому варианту, активируется первая дата выбранного варианта.
- Выбранная вкладка становится зелёной, остальные остаются видимыми и серыми.
- Повторное нажатие на выбранную вкладку снимает фильтр и возвращает все даты.
- Одновременно допускается один активный вариант или отсутствие активного фильтра.
- Вариант В или С скрывается, если у пользователя нет завершённых тренировок этого варианта.
Разное количество упражнений
При различающемся составе тренировок таблица должна сохранять порядок строк и корректное выравнивание. Строка «Оценка утомления» всегда располагается внизу, незаполненные строки остаются над ней.
Это важно, например, для Split AB, где в исходных шаблонах тренировка А содержит семь основных упражнений, а В — девять.
Длинная история и горизонтальная прокрутка
Для большого количества занятий предусмотрена горизонтальная прокрутка. Первый столбец с названиями упражнений должен оставаться зафиксированным.
В дополнительной проверке отмечено, что последняя тренировка скрывалась за границей экрана. Итоговая отметка о закрытии этого замечания в документе отсутствует.
История при смене FullBody и Split
При переключении с FullBody на Split AB заказчик сообщил об исчезновении прежних занятий из представления. Разработчик пояснил, что записи сохранялись, но отображались с фильтром по виду программы: при возврате к FullBody прежняя история появлялась снова.
Пожизненное сохранение истории аккаунта зафиксировано как требование. Единый просмотр истории FullBody, Split AB и Split ABC обсуждался отдельно от фильтров вариантов А, В и С.
Замена упражнений и обновление техники выполнения
Ротация внутри одной мышечной группы
В отдельной спецификации предусмотрены кнопки выбора альтернативного упражнения внутри одной группы мышц.
Состав группы задаётся вручную в серверном файле. В документе приведён пример массива идентификаторов:
in_array($upr_group, ['upr041', 'upr042', 'upr043', 'upr044', 'upr045'], false)
- Каждое упражнение относится к своей группе.
- Если в группе только одно упражнение, кнопки ротации не показываются.
- При замене сохраняются новое название, описание техники и видео.
- Подставляются веса и повторения нового упражнения из административной части.
- Меняется назначенная карта весов.
- Количество подходов остаётся прежним.
- Выбор сохраняется в текущей тренировке и используется далее до следующей замены пользователем.
- Замена доступна при активной подписке и в тренировочный день.
Синхронизация данных при административной замене
В проверке отмечено, что после замены через административную часть у пользователя менялось только название, а прежние описание, видео и карта весов сохранялись. Требование — обновлять весь связанный набор данных упражнения.
Для разминки после замены должны оставаться только повторения: поля веса не добавляются.
Обновление файлов с прежним именем
При замене файла описания или видео через административную часть пользователь должен видеть новое содержимое, даже если имя файла осталось прежним. Обновление связано с корректной заменой ресурса и проверкой кеширования.
В этой группе задач присутствуют промежуточные отметки, но отдельное итоговое подтверждение полной ротации и синхронизации всех связанных данных в документе не зафиксировано.
Уведомления о подписке и тренировочном этапе
Уведомления добавлялись в раздел «Тренировка» при выборе нетренировочных дат. Их условия и дальнейшие действия зависели от срока подписки и состояния тренировочного цикла.
За семь дней до окончания подписки
Выводится сообщение «Ваша подписка заканчивается [дата]. Продлить подписку?». Блок работает как кнопка перехода к подпискам.
- Дата показывается в формате дд.мм.
- После окончания подписки предварительное предупреждение скрывается.
- В проверке исправлен первоначальный формат мм.дд.
После окончания подписки
Показывается сообщение «Подписка неактивна. Оформить подписку?» с переходом на страницу оформления. При активной подписке это уведомление не отображается.
Завершение подготовительного этапа
В исходной настройке уведомление запускается при cicle_num > 700. Пользователь видит предложение начать следующий этап.
- Первое сообщение: «Вы завершили подготовительный этап. Начать следующий этап?».
- После нажатия показывается информация о развивающем этапе и выборе между текущим FullBody и переходом на Split AB.
- Кнопка «Оставить» сохраняет выбранный вид тренировки.
- Кнопка «Перейти» меняет вид на Split AB и сохраняет в контакте сброшенное значение
cicle_num = null. - После любого выбора выводится сообщение: «Вы перешли на следующий этап. Изменить вид тренировки можно в любой момент в Вашем профиле».
Сохранение сообщения после обновления страницы
Первоначально последнее сообщение исчезало после обновления экрана. Для его сохранения использована cookie cicle_changed со сроком 24 часа:
time() + 24 * 3600
Срок показа можно изменить в обработчике смены цикла. В обсуждении также рассматривалось более длительное отображение сообщения по результатам дальнейшего тестирования.
Блок уведомлений, формат даты и сохранение сообщения проверены заказчиком; в документе подтверждено, что сценарий работает корректно.
Сообщение о выполненном занятии
Отдельно исправлено отображение сообщения о завершённом сегодняшнем занятии: при переключении на другую дату оно не должно оставаться на экране.
Партнёрская программа и заявки на выплату бонусов
Реферальная ссылка и график начислений
Работы выполнялись с установленным плагином реферальной программы. В личном кабинете предусмотрена основная реферальная ссылка с параметром promo_id.
При нажатии на ссылку запрошена кнопка «Копировать». Она копирует адрес в буфер компьютера или смартфона, чтобы пользователь мог вставить его в сообщение, документ или публикацию.
Также восстановлена работа графика поступления начислений в клиентском разделе. Исправление графика подтверждено заказчиком.
Форма «Вывести средства»
В партнёрском разделе добавлена задача по кнопке «Вывести средства», открывающей всплывающее окно оформления заявки.
Форма содержит:
- сумму к выводу;
- наименование получателя;
- номер телефона;
- номер счёта получателя;
- БИК банка получателя.
На макете номер телефона и банковский счёт представлены как альтернативные способы указания реквизитов. В окне предусмотрены действия «Сохранить» и «Отменить».
Сохранение реквизитов
- При открытии формы сумма по умолчанию равна текущему бонусному балансу.
- Пользователь может изменить сумму заявки.
- Остальные поля заполняются ранее сохранёнными реквизитами.
- После сохранения реквизиты закрепляются за этим пользователем.
- При следующем открытии формы сумма снова берётся из текущего баланса, а не из предыдущей заявки.
- Сумма оформленной заявки сохраняется для административного просмотра и письма.
- Для суммы используется текстовый ввод без неудобного перебора значений стрелками.
Проверка доступного баланса
Если бонусный баланс равен нулю или запрошенная сумма превышает доступный остаток, должно появляться сообщение:
У вас недостаточно бонусных баллов, чтобы продолжить это действие.
Недопустимая заявка не должна сохраняться и отправляться по электронной почте.
Проверка включала последовательный ввод больших и меньших сумм, повторную попытку без перезагрузки и повторение после обновления страницы.
Заказчик выявил и исправил причину некорректного сравнения: баланс с пробелом между разрядами разбирался только до первого пробела. После корректной обработки такого числа работа проверки подтверждена.
Реквизиты в административной части
На странице клиента в разделе «Магазин → Покупатели → Рефералы» предусмотрена кнопка «Реквизиты получателя». Она открывает сохранённые пользователем данные для обработки заявки.
Письмо о заявке
После сохранения заявки отправляется письмо на основной адрес магазина, заданный в общих настройках. Тема письма — «Выплата бонусов».
Состав письма:
- сообщение об оформлении выплаты бонусов;
- электронная почта клиента;
- сумма выплаты;
- получатель;
- номер телефона;
- номер счёта;
- БИК банка.
Описанный процесс передаёт заявку и реквизиты для административной обработки выплаты.
Проверки, исправления и уточнения в ходе сопровождения
Исправления с подтверждением в документе
| Сценарий | Результат проверки |
|---|---|
| Кнопка «Назад» на смартфоне и в браузере | Возврат с экрана упражнения к тренировке восстановлен; заказчик подтвердил корректную работу. |
| График реферальных начислений | Работа клиентского графика восстановлена и подтверждена. |
| Разминка после перехода с FullBody на Split AB | Причиной бесконечной загрузки было отсутствие подхода. В административной таблице добавлен один подход, после чего данные отображались корректно. |
| Истечение подписки | Исправлено состояние, при котором истёкшая подписка оставалась активной. |
| Оценка 10 в статистике | Исправление отмечено как выполненное. |
| Оценка для расчёта следующей тренировки | Исправлено использование постоянного значения 3 вместо оценки из истории. |
| Дробные веса | Ввод дробных значений в административной части отмечен как выполненный. |
| Выбор чисел и ближайшего веса | Сценарий выбора, центрирование значения и подбор по карте отмечены как выполненные. |
| Готовность к тренировке | Отдельный список type = 3 и оформление проверены и приняты заказчиком. |
| Бесплатный календарный месяц | Автоматическое назначение подписки «Новичок» отмечено как готовое. |
| Уведомления | Условия показа, формат даты и сохранение сообщения на 24 часа подтверждены заказчиком. |
| Сообщение о завершённой тренировке на другой дате | Исправление отмечено как выполненное. |
| Возврат после банковской оплаты | Сделана отдельная страница успешной оплаты. |
| Полная оплата подписки бонусами | Реализованы автоматическое завершение заказа с нулевой денежной суммой и обновление срока подписки. |
| Окно смены пароля при редактировании профиля | Заказчик установил причину: автозаполнение в браузере. |
| Сравнение суммы заявки с бонусным балансом | Заказчик исправил разбор форматированного числа и подтвердил корректную работу. |
Дополнительные контрольные сценарии
В рабочем документе для следующих замечаний отсутствует отдельная итоговая отметка о закрытии либо после отметки о готовности приведён повторный вопрос:
- Перенос незавершённой тренировки. Состав занятия и частично выставленные оценки должны сохраняться после смены даты до окончательного завершения.
- Завершение после административной замены упражнения. Проверялся случай, когда дата становилась зелёной, но кнопка оставалась активной и следующая тренировка не рассчитывалась. При изменении только весов, повторений и подходов этот сбой не наблюдался.
- Полная синхронизация замены упражнения. Название, описание, видео, параметры и карта весов должны обновляться совместно; число подходов сохраняется.
- Обновление одноимённых файлов. После замены описания или видео должно отображаться новое содержимое.
- Дата окончания подписки. В административном поле с форматом Birthday валидатор не принимал годы позднее 2022. Требовалась корректная работа даты подписки.
- Краткая запись нагрузки. После административного изменения должна оставаться одна строка по согласованному формату вместо нескольких строк подходов.
- Добавление и удаление подходов. После отметки о готовности заказчик запросил инструкцию по этим действиям и замене упражнения у конкретного клиента.
- Якорь ошибки завершения. Сообщение о неоценённых упражнениях должно быть доступно в самом начале страницы.
- Фильтры статистики. Все варианты должны сохраняться в панели при выборе одного; без фильтра должны отображаться все даты.
- Разное количество упражнений. Требовалось проверить выравнивание архивных колонок и постоянное нижнее положение оценки утомления.
- Последняя колонка истории. При горизонтальной прокрутке последняя тренировка должна полностью попадать в видимую область.
- История разных программ. Сохранение записей и единое отображение FullBody, Split AB и Split ABC рассматривались как отдельные вопросы.
- Правила доступа к смене карт. Обсуждались первоначальное ограничение после первой завершённой тренировки и последующее условие активной подписки и тренировочного дня.
- Служебные списки значений. В разных задачах указаны карта №5 для повторений, карта №0 для подходов и первоначальный максимум девять подходов.
- Регистрация через оформление заказа. Отдельно проверялось назначение пробной подписки на этом маршруте.
- Письмо о создании заказа. Запрошено устранение второго письма о статусе «Новый».
Эти пункты описывают состояние проектной переписки и требования проверок на соответствующем этапе работ.
Техническая организация и сопровождаемость
Платформа и мультиязычность
В первоначальных технических заданиях среда обозначена как Webasyst Shop-Script со сборкой 2.4.1.636. Это историческое обозначение из документа проекта.
Требования к реализации включали соблюдение мультиязычности: использование словарных идентификаторов вместо жёстко заданных текстов и добавление новых строк в словарь платформы.
Также запрашивались указание изменённых файлов и их расположения, комментарии к новым переменным, функциям и модулям. Для административных изменений учитывался согласованный интерфейс Webasyst.
Файлы, указанные в проектном документе
| Файл | Связанный сценарий |
|---|---|
/wa-apps/shop/plugins/subscription/lib/classes/shopSubscriptionConvertor.class.php |
Калькулятор конвертации оставшегося срока при смене подписки. |
/wa-apps/shop/lib/classes/shopPayment.class.php |
Маршрут возврата после оплаты. |
/wa-apps/shop/plugins/ifitness/lib/classes/shopIfitnessNotifications.class.php |
Условия и настройки показа уведомлений. |
/wa-apps/shop/plugins/ifitness/lib/actions/frontend/shopIfitnessPluginFrontendChangecicle.controller.php |
Смена тренировочного этапа, сохранение состояния и срок cookie сообщения. |
/wa-apps/shop/plugins/ifitness/templates/actions/frontend/FrontendTraining.html |
Интерфейс тренировки, вывод уведомлений, позиционирование выбора значений и оформление стрелок. |
shopIfitnessPluginFrontendSaveocenka.controller.php |
Сохранение оценок и использование оценки из истории в расчёте. |
/wa-apps/shop/plugins/referrals/templates/report.html |
Клиентский отчёт и график реферальных начислений. |
Данные тренировочного модуля
shop_ifitness_ocenki— справочник оценок, включая отдельный тип готовности.shop_ifitness_history— история пользователя, связанная с проверками завершения и расчёта.shop_ifitness_user_temp— пользовательские данные, участвовавшие в тестовом сбросе.shop_ifitness_user_training— пользовательская тренировочная программа.
При обсуждении повторного тестирования указывался сброс данных выбранного пользователя по user_id. Позднее для очистки тренировки, статистики и оценок добавлена административная кнопка.
Подтверждённые результаты работ
Проект iFitnessPro объединил на Webasyst Shop-Script тренировочный модуль, подписки, персональные данные занятий и партнёрские сценарии. Сопровождение включало развитие функций и последовательную проверку поведения при оплате, смене программы, редактировании упражнений и завершении тренировок.
В рабочем документе подтверждены следующие результаты:
- Автоматическая пробная подписка «Новичок» на календарный месяц и возможность управлять её включением.
- Исправление перехода подписки в неактивное состояние после окончания срока.
- Калькулятор переноса остатка при смене уровня подписки.
- Отдельная страница успешной оплаты и корректное завершение заказа, полностью оплаченного бонусами.
- Выбор числовых значений, центрирование активного значения, дробные веса и подбор ближайшего веса по карте.
- Отдельная оценка готовности к тренировке и исправление использования фактической оценки в расчёте.
- Базовый архив выполненных тренировок и инструменты повторного тестирования.
- Уведомления о сроке подписки и переходе между этапами с сохранением сообщения после обновления страницы.
- Восстановление возврата с упражнения и графика партнёрских начислений.
- Совместная проверка заявок на выплату бонусов, сохранения реквизитов и сравнения суммы с доступным балансом.
Опыт проекта охватывает разработку личных кабинетов с индивидуальными данными, настройку подписной модели, интеграцию расчётных правил заказчика и сопровождение нестандартных сценариев Shop-Script.
Нужны подписки, личный кабинет или индивидуальные функции на Webasyst? Подробнее об услугах — в разделе программирования и доработки сайтов. Другие проекты представлены в портфолио доработок.
