INOSTUDIO

Как подружить международный обучающий портал с тайм-зонами. История проекта WES

WES – международный онлайн-сервис для изучения английского с носителями языка. Данный сервис позволяет пользователям выбрать удобный формат обучения, предлагая четыре типа пакетов занятий:

  • пробный – доступен всем новым партнерам в течение двух недель с момента регистрации с целью оценки удобства сервиса;
  • оценочный – предполагает разовое индивидуальное занятие для оценки знаний студента. Включает в себя: оценочный тест, эссе и онлайн-урок с учителем;
  • индивидуальный – подразумевает занятия преподавателя со студентом в формате «один на один»;
  • групповой – представляет собой занятия для группы студентов от двух до шести человек.

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

Гибкая система переносов занятий

В системе предусмотрено несколько ролей с доступом к соответствующей функциональности сервиса. Так, перенос занятия могут запросить партнер, учитель или студент. В зависимости от типа пакета система предоставляет возможность соответствующим ролям подать заявку на перенос одного или серии занятий на более удобное для инициатора время.

После инициации запроса на перенос система:

1. фиксирует данную заявку;

2. устанавливает статус одного или серии занятий в состояние «ожидание переноса»;

3. оповещает всех оппонентов о появлении заявки на перенос посредством системы нотификаций, а также дублирует данную информацию письмом.

Итак, процесс согласования переноса запущен.

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

Если с переносом одного занятия все более-менее понятно и просто, то что стоит за переносом серии занятий, и что такое, в принципе, серия занятий?

Серия занятий в системе – это уроки, принадлежащие одному пакету, при этом время проведения уроков регулярно относительно дня недели. Допустим, есть пакет занятий, и в нем есть регулярные уроки по средам в 14:30 продолжительностью 1 час. Длительность самого пакета занятий – 3 недели. Инициатор отправил запрос на перенос серии занятий с 14:30 среды на 10:00 понедельника.

В случае заблаговременного переноса и при условии, что оппоненты вовремя отреагировали на запрос, все занятия из серии переносятся с одного дня недели/времени на другой день недели/время. Если же перенос не был утвержден вовремя, то ближайший к текущим дате/времени урок необходимо «отрывать» от серии занятий и работать с ним отдельно. Для остальных уроков из серии занятий запрос продолжает существовать в системе и ждать реакции оппонентов.

Когда такая ситуация возникает? Практика показала, что сторона-оппонент не всегда своевременно реагирует на уведомления системы. Бывали ситуации, когда оппонент замечал уведомление в момент старта занятия по новому времени. Либо заинтересованные стороны не смогли вовремя согласовать новые дату/время, а занятие уже должно было начаться по старому времени. В таких ситуациях занятие может быть «потеряно» без возможности переноса на другие дату/время, удовлетворяющие все заинтересованные стороны.

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

Перечень правил:

1. Перенос занятия в прошлое невозможен.

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

3. Перенос занятия ограничен действующим контрактом учителя. То есть, если у учителя контракт завершится через три недели, то занятие в будущее можно перенести в пределах этих трех недель.

4. Нельзя инициировать запрос на перенос:

– если до начала занятия осталось менее 10 минут;

– если занятие уже началось.

5. Если занятие переносят в будущее по отношению к запланированному времени урока и заявку на перенос не утвердили, то:

– за час до прежнего времени проведения занятия система информирует заинтересованные стороны о приближении начала занятия и побуждает пользователей либо завершить перенос, либо отменить его и провести занятие по ранее запланированному времени;

– за 10 минут до нового времени проведения занятия система автоматически отклоняет перенос с соответствующим оповещением всех заинтересованных сторон. Занятие остается в состоянии «ожидание переноса».

6. Если занятие переносят в прошлое по отношению к запланированному времени урока, но все еще в будущее по отношению к текущему времени, и заявку на перенос не утвердили, то:

– за 10 минут до нового времени проведения занятия система автоматически отклоняет перенос с соответствующим оповещением всех заинтересованных сторон. Занятие остается в состоянии «ожидание переноса»;

– за 10 минут до запланированного времени проведения занятия система снова информирует пользователей о незавершении переноса и необходимости перенести занятие на другое время.

В случае переноса серии занятий и при выполнении условий, описанных в пунктах 5 и 6 выше, соответствующее занятие «отрывается» от серии и обрабатывается отдельно.

Для реализации вышеописанных правил была использована state-машина. С помощью нее были описаны все необходимые состояния объекта «урок», а также правила перехода объекта «урок» из одного состояния в другое.

Сложности, с которыми столкнулись

Бывают ситуации, когда проект и реализованную в нем функциональность приходится «допиливать» за другой командой разработки, и, в данном случае, проект WES не был исключением.

После того как проект попал к нам, мы сразу договорились с клиентом, что будем подключать QA-инженеров. Нас обеспечили не совсем актуальной документацией по бизнес-логике сервиса, но это была наша отправная точка по погружению в детали проекта с последующим выяснением нюансов реализации. Документации по коду не было.

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

Как и любое другое web-приложение данный онлайн-сервис состоит из frontend- и backend-частей. Если на backend все более-менее понятно: преобразовал время в UTC и с ним работаешь, то на frontend это же время необходимо показывать и обрабатывать в часовом поясе пользователя. Таким образом, время с backend необходимо конвертировать в текущий часовой пояс пользователя и обратно, или в часовой пояс другого пользователя и обратно.

Реализовать это можно несколькими способами:

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

2. использовать готовые решения по работе с часовыми поясами.

Анализируя проблему, мы выяснили, что вся работа с конвертацией времени в часовой пояс пользователя была реализована первым способом. Текущий подход был громоздким и сложным в плане поддержки и развития. Малейшее изменение в коде приводило к появлению новых багов. Используя данный способ конвертации очень легко можно было запутаться: что необходимо сделать с разницей между часовыми поясами в разных комбинациях – прибавить, отнять или оставить неизменной.

В результате было принято решение внедрить JS-библиотеку для работы со временем moment.js. Данная библиотека позволила конвертировать время из одного часового пояса в другой, используя названия часовых поясов. Также библиотека предоставила удобные инструменты форматирования даты и времени при выводе ее конечному пользователю.

Например, приведение времени к часовому поясу пользователя выглядит так:

moment().tz(UserStore.me$.current().timezone)

Для сравнения времени не обязательно приводить их к одному часовому поясу, данная библиотека делает это за вас:

if(momentDate.isBefore(moment().tz(UserStore.me$.current().timezone))) { ... }

Форматирование даты и времени стало более удобным:

moment().format('MMMM Do YYYY, h:mm:ss a'); // February 13th 2020, 1:47:28 pm moment().format('dddd'); // Thursday moment().format("MMM Do YY"); // Feb 13th 20 moment().format('YYYY [escaped] YYYY'); // 2020 escaped 2020 moment().format();

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

Что в итоге?

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

Авторы статьи: Людмила Сапрыкина, руководитель отдела тестирования и Дмитрий Василевский, разработчик компании INOSTUDIO.

{ "author_name": "INOSTUDIO", "author_type": "editor", "tags": ["\u0441\u0435\u0440\u0432\u0438\u0441\u044b","\u043f\u043e\u0440\u0442\u0430\u043b\u044b","wes"], "comments": 0, "likes": 11, "favorites": 6, "is_advertisement": false, "subsite_label": "inostudio", "id": 140121, "is_wide": true, "is_ugc": false, "date": "Wed, 08 Jul 2020 11:01:05 +0300", "is_special": false }
0
0 комментариев
Популярные
По порядку
Читать все 0 комментариев
Как пережить хейт и 1800 дизлайков, перестроить бизнес-процессы и стать лучше: кейс XYZ School

Рассказываю, как конфликт со студентами помог нам увидеть новые точки роста.

Как с помощью карты Censydiam создать позиционирование бренда

Бренд-стратег Nimax Оля Якушенко рассказывает о том, как использовать фреймворк при построения брендинговых и маркетинговых стратегий компании.

Карта Censydiam
С книжной полки на рынок мобильных приложений. История Laoshi.io

Продолжение истории компании Лаоши. С 2011 года мы занимаемся преподаванием китайского языка. За это время делали сеть школ китайского языка и онлайн-школу, создавали платформу для изучения китайского онлайн, издавали учебник и прописи. Сейчас разрабатываем мобильное приложение для англоязычного рынка.

Приложение для изучение китайских слов и иероглифов Laoshi.io
Бизнес-филантропия и благотворительность. Почему это не затраты, а вложения? Рассказываем на примере CloudPayments

Социальная ответственность составляет важную часть ДНК компании CloudPayments. Делимся инсайтами, почему мы поддерживаем НКО, создаем благотворительные проекты и как транслируем принципы филантропии внутри команды.

Вопросы налогообложения при инвестировании. Что важно учитывать?

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

Участвуйте в IPO Softline Group!

С 18 октября открыта книга заявок на участие в IPO глобальной IT-корпорации Softline Group.

Онлайн-кинотеатр IVI начал съёмки самого правдивого сериала про современный российский наркобизнес
Spotify разрешил всем авторам загружать видеоподкасты Статьи редакции

Сервис запустил функцию в июле 2020 года, но она была доступна ограниченному числу авторов.

Теория поколений: есть ли ей место в дизайне?

На vc.ru десятки статей о том, как брендам коммуницировать с поколениями X, Y и Z. Логомашина разбирается, стоит ли делить людей на бумеров и зумеров в дизайне.

Что владельцам бизнеса и маркетологам нужно знать про Linkedin в 2021 году

LinkedIn был основан в 2002 году, а в 2016 году компания была приобретена корпорацией Microsoft. На данный момент LinkedIn занимает лидирующую позицию в нише профессиональных социальных сетей, объединяя более 774 миллионов профессионалов, 57M+ компаний и 120 000 учебных заведений в более чем 200 странах.

«В магазин должны идти не за пивом, а к тебе»: предприниматель открывает пивные магазины для других Статьи редакции

Давид Аракелян начал с торговли в ларьках в 90-е, работал в игорном бизнесе, строил маршруты для вывоза мусора и торговал пивом. Сейчас он открывает для других несколько пивных магазинов в месяц и берёт за каждый 150 тысяч рублей.

Ассортимент одного из магазинов
null