====== Концептуальное техническое задание ====== Мобильное приложение "Фестивали скалолазания" предназначено для регистрации участников на фестивали и самостоятельного ввода результатов. Должно работать на платформах Android и iOS. Связь с бэкэндом - через https-сервисы. Часть функционала (ввод результатов) должна быть доступна оффлайн. ===== Разделы ===== * Авторизация * Фестивали * Участники * Ввод результатов * Аренда снаряжения * Запись на трансфер ===== Авторизация ===== Пользователь при первом запуске приложения авторизуется, указывая свою электронную почту. Приложение отправляет введенную почту в бэкэнд и получает ответ - существует такой пользователь или нет. Если не существует (ранее он не был зарегистрирован) - ему отображается введенный адрес (для проверки правильности) и предлагается получить письмо для подтверждения регистрации; либо скорректировать почту. Если пользователь подтверждает отправку письма - приложение передает в бэкэнд команду на отправку письма с одноразовым кодом. На следующем шаге пользователь вводит полученный в почту код в приложение. Приложение отправляет код в бэкэнд и получает ответ - верный код или нет. Если верный - авторизация пройдена, приложение получает с бэкэнда токен авторизации (строка) и сохраняет его для последующих запросов. Если код неверен - пользователю предлагается ввести код заново либо запросить повторную отправку письма. Во всех последующих запросах приложение отправляет в бэкэнд токен авторизации. Если на запрос бэкэнд отвечает ошибкой авторизации, приложение начинает авторизацию заново. ===== Фестивали ===== При входе в раздел приложение получает с сервера актуальный список фестивалей: * наименование; * даты проведения; * дата начала (для сортировки списка). Пользователь может выбрать один фестиваль в качестве текущего. При выборе фестиваля приложение получает с сервера детальную информацию по нему: * краткое описание; * список зачетов; * список классов; * список пакетов; * список вопросов анкеты; * список вариантов скидки. ===== Участники ===== При открытии списка участников приложение получает с сервера актуальный список участников текущего фестиваля, заявленных в текущем аккаунте: - фамилия, имя, отчество; - дата рождения; - регион (список запрашивается с сервера); - зачет; - класс; - пакет; - вариант скидки; - выбранные сеты для участия (до 5); - статус оплаты взноса; - статус допуска участника. В списке участников данного пользователя отображаются: - фамилия и имя; - статус оплаты; - статус допуска. ==== Добавление нового участника ==== === Первая часть формы === Пользователь указывает: - фамилию; - имя; - отчество (или устанавливает флажок "отчество отсутствует"); - пол; - дату рождения; - регион; - (опционально) город (если указано в реквизитах фестиваля); - (опционально) телефон (если указано в реквизитах фестиваля); - (опционально) дополнительный вопрос (ответ - один из вариантов по списку). Все поля обязательны для заполнения. После полного ввода данные отправляются на сервер. На основе полученных данных сервер возвращает: - сообщение об ошибке, если для пользователя не удалось определить зачет (например, участник не подходит по возрастным ограничениям); в таком случае сообщение выводится пользователю, он должен что-то изменить в данных для повторной отправки; - определенный для участника зачет и (опционально) класс, а также (опционально) вариант скидки; в этом случае пользователю отображается вторая часть формы регистрации. === Вторая часть формы === Пользователю отображается вторая часть формы регистрации: - пакет (выбор из списка); - (опционально) промокод (если указано в реквизитах фестиваля); если пользователь вводит промокод и нажимает кнопку ''Проверить'', промокод отправляется на сервер для проверки; сервер возвращает: - отказ, если промокод не принят; пользователю отображается сообщение, он может скорректировать ошибочный код и отправить заново; - вариант скидки и размер взноса с учетом скидки, если промокод принят. - от 0 до 5 полей выбора сета (указано в реквизитах фестиваля); для заполнения поля пользователю отображается список сетов (название и количество свободных мест), получаемый с сервера перед выбором; пользователь может выбрать только сет с наличием свободных мест; - от 0 до N вопросов анкеты к фестивалю (вопрос может быть обязательный; варианты ответа: строка, одно значение из списка, несколько значений из списка); - (опционально) поле для создания семьи; - (опционально) поле для присоединения к ранее созданной семье по паролю; - (опционально) поле для создания клуба; - (опционально) поле для присоединения к ранее созданному клубу по паролю; - флажок согласия с офертой организатора (с отображением гиперссылки на документ); - (опционально) флажок согласия на обработку ПДн (с отображением гиперссылки на документ). Если после определения зачета пользователь меняет дату рождения, то процедура определения зачета запускается заново. Если была определена скидка, то пользователь не может редактировать ФИО и дату рождения. При изменении пакета расчет стоимости запускается заново. В зависимости от реквизитов фестиваля перед оплатой может быть обязательным выбор хотя бы одного сета. После заполнения всех обязательных полей и флажков согласия пользователю становится доступна кнопка отправки участника на регистрацию. Данные отправляются на сервер, сервер возвращает: - отказ с сообщением об ошибке, если участника сохранить не удалось; - обновленный список участников данного пользователя, если регистрация удачна. Если регистрация удачна и есть сумма к оплате (исключения: пакет с нулевой стоимостью или определилась 100% скидка), пользователю отображается предложение перейти к оплате. При его согласии приложение запрашивает на сервере ссылку на платежную форму для данного участника и открывает ее в браузере. ==== Редактирование участника ==== Пользователь может скорректировать данные ранее заявленного участника: - если участник оплачен: выбранные сеты (из актуального списка со свободными местами), кроме сетов, время начала которых уже прошло; - если не оплачен: - выбранные сеты (из актуального списка со свободными местами); - дату рождения (с повторным определением зачета); - ФИО (если не определена скидка); - (опционально) промокод (с пересчетом суммы); - независимо от оплаты: - регион; - (опционально) город; - (опционально) телефон. При сохранении участника данные отправляются на сервере, сервер возвращает: - отказ со сообщением об ошибке; в этом случае пользователь может продолжить редактирование; - успех; если есть сумма к оплате, пользователю предлагается перейти к оплате. ===== Ввод результатов ===== Этот раздел должен работать при отсутствии Интернета (оффлайн). Для обеспечения этого при каждом открытии приложения (а также при смене текущего фестиваля) оно: - проверяет наличие Интернета, при его отсутствии выводит предупреждение о работе оффлайн (дальнейшие действия пропускаются); - обновляет с сервера список участников текущего фестиваля данного пользователя; - обновляет с сервера список трасс для каждого участника. При открытии раздела отображается ранее загруженный список трасс, доступный текущему участнику. Если текущий участник не выбран - пользователь выбирает его из списка своих допущенных участников. Список трасс - с иерархическими папками (до 3 уровней вложенности), по каждой трассе отображается: - название; - тип (трудность, боулдеринг, мультипитч); - категория; - статус прохождения текущим участником. При выборе трассы открывается ее карточка для внесения результата: - (информационно) название; - (информационно) тип; - (информационно) категория; - статус прохождения - варианты выбора в зависимости от реквизитов трассы: нет/TOP; нет/зона/TOP; нет/зона/TOP/Flash; - (для типа "мультипитч") флажок "лез вторым"; - (для типов "трудность" и "мультипитч") флажок "ИТО/был срыв". Пользователь может внести/изменить результат и нажать ''Сохранить''. Если Интернет не доступен - данные сохраняются в приложении и запоминается, что для текущего участника есть неотправленные результаты. Если Интернет доступен, данные о трассе сразу отправляются на сервер. Сервер возвращает: - успех; - сообщение об ошибке; сообщение отображается пользователю, для данного участника поднимается признак наличия неотправленных результатов. Если для какого-либо из участников данного пользователя есть неотправленные результаты, в списке трасс отображается кнопка ''Отправить результаты''. При ее нажатии, если доступен Интернет, на сервер отправляются все трассы каждого участника, для которого есть неотправленные результаты. После удачно отправки признаки неотправленных результатов сбрасываются, при неудачной пользователю отображается сообщение об ошибке, которую вернул сервер. ===== Аренда снаряжения ===== В процессе обсуждения. Есть список доступных для проката экземпляров снаряжения (например, веревка №1, веревка №2, веревка №3, комплект оттяжек красный, комплект оттяжек зеленый, болдер-мат №1, болдер-мат №2...) и дни фестиваля (например, 10, 11, 12, 13, 14, 15 июня). Для каждого экземпляра снаряжения на сервере есть информация о брони (экземпляр снаряжения; дата). Пользователь в приложении может из списка свободного снаряжения выбрать нужные ему экземпляры и нужные даты, в которые эти конкретные экземпляры не заняты. Выбрал набор экземпляров и даты - информация отправляется на сервер. Если сервер подтверждает, что эти экземпляры в эти даны свободны, пользователь переадресуется на форму оплаты ===== Трансфер ===== В процессе обсуждения. Есть список рейсов автобусов (дата, время, направление, количество мест). Пользователь может выбрать рейс и указать участника. Если свободные места есть - данные о рейсе и участнике отправляются на сервер. Север возвращает: - успех; - отказ и сообщение об ошибке, которое необходимо показать пользователю. Оплата не требуется. Необходима возможность отказаться от поездки не позднее, чем за 3 часа до рейса.